@profpowell/vb-project-planning 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -5
- package/dist/vb-project-planning.css +48 -5
- package/dist/vb-project-planning.js +165 -12
- package/dist/vb-project-planning.min.css +1 -1
- package/dist/vb-project-planning.min.js +44 -44
- package/package.json +5 -4
- package/src/web-components/iron-triangle/api.json +1 -1
- package/src/web-components/iron-triangle/logic.js +157 -0
- package/src/web-components/iron-triangle/styles.css +60 -3
- package/src/web-components/product-roadmap/logic.js +25 -13
- package/src/web-components/requirement-card/logic.js +1 -1
- package/src/web-components/user-persona/logic.js +1 -1
- package/src/web-components/user-story/logic.js +2 -1
package/README.md
CHANGED
|
@@ -35,7 +35,7 @@ Project- and UX-planning Web Components for the research, planning, and delivery
|
|
|
35
35
|
npm install @profpowell/vb-project-planning
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Or load from a CDN
|
|
38
|
+
Or load from a CDN:
|
|
39
39
|
|
|
40
40
|
```html
|
|
41
41
|
<script type="module" src="https://unpkg.com/@profpowell/vb-project-planning/dist/vb-project-planning.min.js"></script>
|
|
@@ -62,9 +62,12 @@ import '@profpowell/vb-project-planning/kanban-board';
|
|
|
62
62
|
<user-persona name="Fred" role="Engineer">…</user-persona>
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
##
|
|
65
|
+
## Runtime peers: `<drag-surface>` and `<data-table>`
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
Two Vanilla Breeze core elements are used as runtime peers. Load VB on the page (the full bundle, or the per-component files under `dist/cdn/components/`) and they light up; without them the components still render, only the composed behaviour is unavailable.
|
|
68
|
+
|
|
69
|
+
- `<drag-surface>` — the drag-to-reorder components (`kanban-board`, `quadrant-grid`, `impact-effort`, `story-map`). Without it, drag-reordering is off.
|
|
70
|
+
- `<data-table>` — `risk-register` and `traceability-matrix` compose it for the severity rollup, heatmap, and sortable headers. Without it, the plain table renders but those features are inert.
|
|
68
71
|
|
|
69
72
|
## Design-token contract
|
|
70
73
|
|
|
@@ -74,7 +77,7 @@ These components are **token-driven**: they read Vanilla Breeze CSS custom prope
|
|
|
74
77
|
<link rel="stylesheet" href="https://unpkg.com/vanilla-breeze/dist/cdn/vanilla-breeze.css">
|
|
75
78
|
```
|
|
76
79
|
|
|
77
|
-
`vanilla-breeze` is declared as an **optional peer dependency**: required if you want VB to supply tokens/themes and the `<drag-surface>`
|
|
80
|
+
`vanilla-breeze` is declared as an **optional peer dependency**: required if you want VB to supply tokens/themes and the `<drag-surface>` / `<data-table>` peers (most consumers do).
|
|
78
81
|
|
|
79
82
|
## Relationship to Vanilla Breeze
|
|
80
83
|
|
|
@@ -84,9 +87,28 @@ This package was decomposed out of `vanilla-breeze` core so that framework stays
|
|
|
84
87
|
|
|
85
88
|
```bash
|
|
86
89
|
npm run build # bundle dist/ (esm + minified, js + css) via esbuild
|
|
90
|
+
npm test # Playwright component specs (serves the built docs/ on :4331)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`dist/` is committed: it is what the npm tarball ships and what the docs site vendors. CI fails if `src/` changes without a rebuilt `dist/`.
|
|
94
|
+
|
|
95
|
+
The docs site lives in `site/` (CookSSG, styled by Vanilla Breeze) and depends on `vanilla-breeze` for tokens/themes and the `<drag-surface>` / `<data-table>` peers. It imports this package's `dist/` directly.
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
cd site && npm ci && npm run dev # local preview
|
|
99
|
+
cd site && npm run build && node scripts/publish-docs.js /vb-project-planning # regenerate docs/
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
GitHub Pages serves the committed `docs/` folder. The **Publish docs** workflow regenerates and commits it automatically when `site/` or `dist/` change on `main`.
|
|
103
|
+
|
|
104
|
+
### Releasing
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm version minor # bumps package.json and tags vX.Y.Z
|
|
108
|
+
git push --follow-tags
|
|
87
109
|
```
|
|
88
110
|
|
|
89
|
-
|
|
111
|
+
The **Release** workflow builds, runs the tests, publishes to npm with provenance, and creates a GitHub release from the matching `CHANGELOG.md` section. CI publishing needs an `NPM_TOKEN` repository secret. Without one, publish from a logged-in terminal first (`npm publish --access public`) and then push the tag; the workflow sees the version is already on the registry, skips the publish, and still creates the GitHub release.
|
|
90
112
|
|
|
91
113
|
## License
|
|
92
114
|
|
|
@@ -1321,14 +1321,57 @@ iron-triangle svg .center:hover .quality-label,
|
|
|
1321
1321
|
iron-triangle svg .center:focus-visible .quality-label {
|
|
1322
1322
|
fill: var(--color-interactive);
|
|
1323
1323
|
}
|
|
1324
|
+
iron-triangle > .iron-triangle-status {
|
|
1325
|
+
display: flex;
|
|
1326
|
+
flex-wrap: wrap;
|
|
1327
|
+
align-items: center;
|
|
1328
|
+
justify-content: center;
|
|
1329
|
+
gap: var(--size-s, 0.75rem);
|
|
1330
|
+
margin-block-start: var(--size-xs, 0.5rem);
|
|
1331
|
+
font-size: var(--font-size-sm, 0.875rem);
|
|
1332
|
+
}
|
|
1333
|
+
iron-triangle > .iron-triangle-status .iron-triangle-readout {
|
|
1334
|
+
position: absolute;
|
|
1335
|
+
inline-size: 1px;
|
|
1336
|
+
block-size: 1px;
|
|
1337
|
+
margin: -1px;
|
|
1338
|
+
padding: 0;
|
|
1339
|
+
overflow: hidden;
|
|
1340
|
+
clip-path: inset(50%);
|
|
1341
|
+
white-space: nowrap;
|
|
1342
|
+
border: 0;
|
|
1343
|
+
}
|
|
1344
|
+
iron-triangle > .iron-triangle-status .iron-triangle-mode {
|
|
1345
|
+
font-size: inherit;
|
|
1346
|
+
}
|
|
1347
|
+
iron-triangle > .iron-triangle-status .iron-triangle-mode[aria-pressed=true] {
|
|
1348
|
+
border-color: var(--color-interactive);
|
|
1349
|
+
color: var(--color-interactive);
|
|
1350
|
+
}
|
|
1351
|
+
iron-triangle > .iron-triangle-status .iron-triangle-warning {
|
|
1352
|
+
margin: 0;
|
|
1353
|
+
padding: var(--size-2xs, 0.25rem) var(--size-xs, 0.5rem);
|
|
1354
|
+
border-radius: var(--radius-s, 0.25rem);
|
|
1355
|
+
border: var(--border-width-thin, 1px) solid var(--iron-triangle-warning-color, var(--color-warning));
|
|
1356
|
+
color: var(--iron-triangle-warning-color, var(--color-warning));
|
|
1357
|
+
font-weight: var(--font-weight-semibold, 600);
|
|
1358
|
+
}
|
|
1359
|
+
iron-triangle > .iron-triangle-status .iron-triangle-warning::before {
|
|
1360
|
+
content: "\26a0\fe0e ";
|
|
1361
|
+
}
|
|
1362
|
+
iron-triangle > dialog.iron-triangle-dialog [hidden] {
|
|
1363
|
+
display: none;
|
|
1364
|
+
}
|
|
1365
|
+
iron-triangle > dialog.iron-triangle-dialog .iron-triangle-dialog__hint {
|
|
1366
|
+
margin: 0;
|
|
1367
|
+
color: var(--color-text-muted);
|
|
1368
|
+
font-size: var(--font-size-sm, 0.875rem);
|
|
1369
|
+
}
|
|
1324
1370
|
iron-triangle:state(over-deadline) svg .triangle {
|
|
1325
|
-
stroke: var(--color-warning);
|
|
1371
|
+
stroke: var(--iron-triangle-warning-color, var(--color-warning));
|
|
1326
1372
|
}
|
|
1327
1373
|
iron-triangle:state(unbudgeted) svg .capacity {
|
|
1328
|
-
fill: var(--color-warning);
|
|
1329
|
-
}
|
|
1330
|
-
iron-triangle:state(manual) svg .quality-label::after {
|
|
1331
|
-
content: " (manual)";
|
|
1374
|
+
fill: var(--iron-triangle-warning-color, var(--color-warning));
|
|
1332
1375
|
}
|
|
1333
1376
|
iron-triangle[disabled],
|
|
1334
1377
|
iron-triangle[locked] {
|
|
@@ -527,7 +527,7 @@ var UserPersona = class extends HTMLElement {
|
|
|
527
527
|
/** @type {any} */
|
|
528
528
|
root.querySelectorAll ? root : document
|
|
529
529
|
);
|
|
530
|
-
return Array.from(scope.querySelectorAll(`user-story[persona-id="${cssEscape(this.id)}"]`));
|
|
530
|
+
return Array.from(scope.querySelectorAll(`user-story[persona-id="${cssEscape(this.id)}"]:not([data-detail-clone])`));
|
|
531
531
|
}
|
|
532
532
|
#cacheSlotValues() {
|
|
533
533
|
for (const child of [...this.children]) {
|
|
@@ -1362,7 +1362,7 @@ var UserStory = class _UserStory extends HTMLElement {
|
|
|
1362
1362
|
}
|
|
1363
1363
|
connectedCallback() {
|
|
1364
1364
|
this.#cacheSlotValues();
|
|
1365
|
-
if (this.storyId && !this.id) this.id = this.storyId;
|
|
1365
|
+
if (this.storyId && !this.id && !this.hasAttribute("data-detail-clone")) this.id = this.storyId;
|
|
1366
1366
|
if (this.hasAttribute("src")) {
|
|
1367
1367
|
this._loadSrc(this.getAttribute("src"));
|
|
1368
1368
|
}
|
|
@@ -1545,6 +1545,7 @@ var UserStory = class _UserStory extends HTMLElement {
|
|
|
1545
1545
|
const hasSlottedContent = [...this.children].some((c) => c.getAttribute("slot") && c.tagName !== "DIALOG");
|
|
1546
1546
|
full.setAttribute("detail", hasSlottedContent ? "full" : "compact");
|
|
1547
1547
|
full.removeAttribute("id");
|
|
1548
|
+
full.setAttribute("data-detail-clone", "");
|
|
1548
1549
|
for (const child of [...this.children]) {
|
|
1549
1550
|
if (child.tagName === "DIALOG") continue;
|
|
1550
1551
|
full.appendChild(child.cloneNode(true));
|
|
@@ -4388,7 +4389,22 @@ registerComponent("burndown-chart", BurndownChart);
|
|
|
4388
4389
|
|
|
4389
4390
|
// src/web-components/product-roadmap/logic.js
|
|
4390
4391
|
var Roadmap = class _Roadmap extends VBElement {
|
|
4392
|
+
static get observedAttributes() {
|
|
4393
|
+
return ["start", "end", "view", "editable", "today-marker"];
|
|
4394
|
+
}
|
|
4391
4395
|
setup() {
|
|
4396
|
+
if (!this.#readConfig()) return false;
|
|
4397
|
+
const lanes = [...this.querySelectorAll(":scope > section[data-lane]")];
|
|
4398
|
+
if (!lanes.length) {
|
|
4399
|
+
console.warn("product-roadmap: no <section data-lane> children found");
|
|
4400
|
+
return false;
|
|
4401
|
+
}
|
|
4402
|
+
this.#sourceLanes = lanes;
|
|
4403
|
+
this.#render();
|
|
4404
|
+
return true;
|
|
4405
|
+
}
|
|
4406
|
+
/** Parse start/end/view/editable from attributes. Returns false when invalid. */
|
|
4407
|
+
#readConfig() {
|
|
4392
4408
|
const startAttr = this.getAttribute("start");
|
|
4393
4409
|
const endAttr = this.getAttribute("end");
|
|
4394
4410
|
if (!startAttr || !endAttr) {
|
|
@@ -4406,17 +4422,12 @@ var Roadmap = class _Roadmap extends VBElement {
|
|
|
4406
4422
|
this.#totalMs = end.getTime() - start.getTime();
|
|
4407
4423
|
this.#view = this.getAttribute("view") === "month" ? "month" : "quarter";
|
|
4408
4424
|
this.#editable = this.hasAttribute("editable");
|
|
4409
|
-
const lanes = [...this.querySelectorAll(":scope > section[data-lane]")];
|
|
4410
|
-
if (!lanes.length) {
|
|
4411
|
-
console.warn("product-roadmap: no <section data-lane> children found");
|
|
4412
|
-
return false;
|
|
4413
|
-
}
|
|
4414
|
-
this.#sourceLanes = lanes;
|
|
4415
|
-
this.#render();
|
|
4416
4425
|
return true;
|
|
4417
4426
|
}
|
|
4418
|
-
attributeChangedCallback() {
|
|
4419
|
-
if (
|
|
4427
|
+
attributeChangedCallback(_name, oldValue, newValue) {
|
|
4428
|
+
if (oldValue === newValue) return;
|
|
4429
|
+
if (!this.isConnected || !this.#sourceLanes.length) return;
|
|
4430
|
+
if (this.#readConfig()) this.#render();
|
|
4420
4431
|
}
|
|
4421
4432
|
#render() {
|
|
4422
4433
|
[...this.children].forEach((c) => {
|
|
@@ -9502,6 +9513,12 @@ var IronTriangle = class extends VBElement {
|
|
|
9502
9513
|
#qualitySummary = "";
|
|
9503
9514
|
/** @type {Record<string, HTMLDialogElement>} */
|
|
9504
9515
|
#dialogs = {};
|
|
9516
|
+
/** @type {HTMLOutputElement | null} */
|
|
9517
|
+
#readout = null;
|
|
9518
|
+
/** @type {HTMLButtonElement | null} */
|
|
9519
|
+
#modeButton = null;
|
|
9520
|
+
/** @type {HTMLElement | null} */
|
|
9521
|
+
#deadlineWarning = null;
|
|
9505
9522
|
constructor() {
|
|
9506
9523
|
super();
|
|
9507
9524
|
this.#internals = this.attachInternals();
|
|
@@ -9510,7 +9527,9 @@ var IronTriangle = class extends VBElement {
|
|
|
9510
9527
|
setup() {
|
|
9511
9528
|
this.#qualitySummary = this.getAttribute("data-quality-summary") || "";
|
|
9512
9529
|
this.#seedDefaults();
|
|
9530
|
+
this.#renderStatus();
|
|
9513
9531
|
this.#renderViz();
|
|
9532
|
+
this.#syncStatus();
|
|
9514
9533
|
this.listen(this, "click", (e) => this.#onClick(e));
|
|
9515
9534
|
this.listen(this, "keydown", (e) => this.#onKeydown(e));
|
|
9516
9535
|
}
|
|
@@ -9765,6 +9784,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9765
9784
|
this.#value.hash = triangleHash(this.#value);
|
|
9766
9785
|
this.#renderViz();
|
|
9767
9786
|
this.#syncStateFlags();
|
|
9787
|
+
this.#syncStatus();
|
|
9768
9788
|
this.#publishFormValue();
|
|
9769
9789
|
this.dispatchEvent(new CustomEvent("iron-triangle:change", {
|
|
9770
9790
|
bubbles: true,
|
|
@@ -9806,10 +9826,143 @@ var IronTriangle = class extends VBElement {
|
|
|
9806
9826
|
}
|
|
9807
9827
|
#syncDisabledLocked() {
|
|
9808
9828
|
const off = this.hasAttribute("disabled") || this.hasAttribute("locked");
|
|
9829
|
+
if (this.#modeButton) this.#modeButton.disabled = off;
|
|
9809
9830
|
for (const dialog of Object.values(this.#dialogs)) {
|
|
9810
9831
|
for (const el of dialog.querySelectorAll("input, select, textarea, button")) el.disabled = off;
|
|
9811
9832
|
}
|
|
9812
9833
|
}
|
|
9834
|
+
// ── Internal: status strip (a11y hooks) ──────────────────────────
|
|
9835
|
+
/**
|
|
9836
|
+
* Builds the status strip once: live readout, mode toggle, deadline
|
|
9837
|
+
* warning. Content is refreshed by #syncStatus() on every recompute.
|
|
9838
|
+
*/
|
|
9839
|
+
#renderStatus() {
|
|
9840
|
+
if (this.querySelector(":scope > .iron-triangle-status")) return;
|
|
9841
|
+
const strip = document.createElement("div");
|
|
9842
|
+
strip.className = "iron-triangle-status";
|
|
9843
|
+
const readout = document.createElement("output");
|
|
9844
|
+
readout.className = "iron-triangle-readout";
|
|
9845
|
+
readout.setAttribute("aria-live", "polite");
|
|
9846
|
+
readout.setAttribute("aria-atomic", "true");
|
|
9847
|
+
const button = document.createElement("button");
|
|
9848
|
+
button.type = "button";
|
|
9849
|
+
button.className = "iron-triangle-mode";
|
|
9850
|
+
button.setAttribute("aria-pressed", "false");
|
|
9851
|
+
button.textContent = "Manual capacity";
|
|
9852
|
+
button.addEventListener("click", () => this.#openCapacityDialog());
|
|
9853
|
+
const warning = document.createElement("p");
|
|
9854
|
+
warning.className = "iron-triangle-warning";
|
|
9855
|
+
warning.setAttribute("data-warning", "over-deadline");
|
|
9856
|
+
warning.hidden = true;
|
|
9857
|
+
strip.append(readout, button, warning);
|
|
9858
|
+
const svg = this.querySelector(":scope > svg");
|
|
9859
|
+
if (svg) svg.after(strip);
|
|
9860
|
+
else this.prepend(strip);
|
|
9861
|
+
this.#readout = readout;
|
|
9862
|
+
this.#modeButton = button;
|
|
9863
|
+
this.#deadlineWarning = warning;
|
|
9864
|
+
this.#syncDisabledLocked();
|
|
9865
|
+
}
|
|
9866
|
+
#syncStatus() {
|
|
9867
|
+
if (!this.#readout) return;
|
|
9868
|
+
const { capacityPoints, capacitySource } = this.#value;
|
|
9869
|
+
const manual = capacitySource === "manual";
|
|
9870
|
+
const deadline = this.#value.time?.deadline;
|
|
9871
|
+
const overDeadline = this.matches(":state(over-deadline)");
|
|
9872
|
+
const parts = [];
|
|
9873
|
+
parts.push(capacityPoints > 0 ? `Capacity: ${capacityPoints} points (${manual ? "manual" : "formula"}).` : "Capacity: not yet budgeted.");
|
|
9874
|
+
if (overDeadline) parts.push(`Deadline has passed (${deadline}).`);
|
|
9875
|
+
const text = parts.join(" ");
|
|
9876
|
+
if (this.#readout.textContent !== text) this.#readout.textContent = text;
|
|
9877
|
+
if (this.#modeButton) {
|
|
9878
|
+
this.#modeButton.setAttribute("aria-pressed", manual ? "true" : "false");
|
|
9879
|
+
this.#modeButton.setAttribute(
|
|
9880
|
+
"aria-label",
|
|
9881
|
+
manual ? `Manual capacity: ${capacityPoints} points. Activate to edit or return to the formula.` : "Manual capacity. Activate to override the formula with a fixed number."
|
|
9882
|
+
);
|
|
9883
|
+
}
|
|
9884
|
+
if (this.#deadlineWarning) {
|
|
9885
|
+
this.#deadlineWarning.textContent = overDeadline ? `Deadline has passed (${deadline})` : "";
|
|
9886
|
+
this.#deadlineWarning.hidden = !overDeadline;
|
|
9887
|
+
}
|
|
9888
|
+
}
|
|
9889
|
+
#openCapacityDialog() {
|
|
9890
|
+
const dialog = this.#ensureCapacityDialog();
|
|
9891
|
+
const input = (
|
|
9892
|
+
/** @type {HTMLInputElement} */
|
|
9893
|
+
dialog.querySelector('[name="capacity.points"]')
|
|
9894
|
+
);
|
|
9895
|
+
input.value = String(this.#value.capacityPoints > 0 ? this.#value.capacityPoints : 1);
|
|
9896
|
+
const useFormula = (
|
|
9897
|
+
/** @type {HTMLButtonElement} */
|
|
9898
|
+
dialog.querySelector('button[value="formula"]')
|
|
9899
|
+
);
|
|
9900
|
+
useFormula.hidden = this.#value.capacitySource !== "manual";
|
|
9901
|
+
if (typeof dialog.showModal === "function") dialog.showModal();
|
|
9902
|
+
else dialog.setAttribute("open", "");
|
|
9903
|
+
}
|
|
9904
|
+
#ensureCapacityDialog() {
|
|
9905
|
+
if (this.#dialogs.capacity) return this.#dialogs.capacity;
|
|
9906
|
+
const dialog = document.createElement("dialog");
|
|
9907
|
+
dialog.className = "iron-triangle-dialog iron-triangle-dialog--capacity";
|
|
9908
|
+
dialog.setAttribute("aria-label", "Capacity \u2014 manual override");
|
|
9909
|
+
const form = document.createElement("form");
|
|
9910
|
+
form.method = "dialog";
|
|
9911
|
+
form.setAttribute("data-layout", "stack");
|
|
9912
|
+
form.setAttribute("data-layout-gap", "m");
|
|
9913
|
+
const heading = document.createElement("h3");
|
|
9914
|
+
heading.textContent = "Manual capacity";
|
|
9915
|
+
form.append(heading);
|
|
9916
|
+
const hint = document.createElement("p");
|
|
9917
|
+
hint.className = "iron-triangle-dialog__hint";
|
|
9918
|
+
hint.textContent = "Fix the capacity to a number the team committed to. The Time / Cost / Scope inputs stay saved but stop driving the readout.";
|
|
9919
|
+
form.append(hint);
|
|
9920
|
+
form.append(buildFormField("capacity", {
|
|
9921
|
+
key: "points",
|
|
9922
|
+
label: "Capacity (points)",
|
|
9923
|
+
type: "number",
|
|
9924
|
+
min: 1,
|
|
9925
|
+
step: 1,
|
|
9926
|
+
width: "6rem"
|
|
9927
|
+
}, this.#value.capacityPoints));
|
|
9928
|
+
const actions = document.createElement("div");
|
|
9929
|
+
actions.setAttribute("data-layout", "cluster");
|
|
9930
|
+
actions.setAttribute("data-layout-gap", "s");
|
|
9931
|
+
actions.setAttribute("data-layout-justify", "end");
|
|
9932
|
+
const useFormula = document.createElement("button");
|
|
9933
|
+
useFormula.type = "button";
|
|
9934
|
+
useFormula.value = "formula";
|
|
9935
|
+
useFormula.textContent = "Use formula";
|
|
9936
|
+
useFormula.addEventListener("click", () => {
|
|
9937
|
+
dialog.close("formula");
|
|
9938
|
+
this.setFormula();
|
|
9939
|
+
});
|
|
9940
|
+
const cancel = document.createElement("button");
|
|
9941
|
+
cancel.type = "button";
|
|
9942
|
+
cancel.value = "cancel";
|
|
9943
|
+
cancel.textContent = "Cancel";
|
|
9944
|
+
cancel.addEventListener("click", () => dialog.close("cancel"));
|
|
9945
|
+
const save = document.createElement("button");
|
|
9946
|
+
save.type = "submit";
|
|
9947
|
+
save.value = "save";
|
|
9948
|
+
save.textContent = "Save";
|
|
9949
|
+
actions.append(useFormula, cancel, save);
|
|
9950
|
+
form.append(actions);
|
|
9951
|
+
dialog.append(form);
|
|
9952
|
+
this.append(dialog);
|
|
9953
|
+
this.#dialogs.capacity = dialog;
|
|
9954
|
+
form.addEventListener("submit", (e) => {
|
|
9955
|
+
e.preventDefault();
|
|
9956
|
+
const input = (
|
|
9957
|
+
/** @type {HTMLInputElement} */
|
|
9958
|
+
form.querySelector('[name="capacity.points"]')
|
|
9959
|
+
);
|
|
9960
|
+
const n = Number(input.value);
|
|
9961
|
+
dialog.close("save");
|
|
9962
|
+
if (Number.isFinite(n) && n > 0) this.setManual(n);
|
|
9963
|
+
});
|
|
9964
|
+
return dialog;
|
|
9965
|
+
}
|
|
9813
9966
|
// ── Internal: revise() field accessors ───────────────────────────
|
|
9814
9967
|
#getField(path) {
|
|
9815
9968
|
if (path === "capacityPoints") return this.#value.capacityPoints;
|
|
@@ -11104,7 +11257,7 @@ var RequirementCard = class extends VBElement {
|
|
|
11104
11257
|
return this.hasAttribute("tabindex") || this.closest("a[href], button");
|
|
11105
11258
|
}
|
|
11106
11259
|
#syncSlot(name, slot) {
|
|
11107
|
-
const hasContent = !!slot && slot.assignedNodes(
|
|
11260
|
+
const hasContent = !!slot && slot.assignedNodes().some(
|
|
11108
11261
|
(n) => n.nodeType === Node.ELEMENT_NODE || n.nodeType === Node.TEXT_NODE && n.textContent.trim().length > 0
|
|
11109
11262
|
);
|
|
11110
11263
|
this.setState(`has-${name}`, hasContent);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
impact-effort{display:block;container-type:inline-size}impact-effort:not(:defined){display:block}.ie-wrapper{display:flex;align-items:stretch}.ie-y-label{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);text-align:center;padding:0 var(--size-xs, 8px);display:flex;align-items:center;justify-content:center;user-select:none}.ie-x-label{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);text-align:center;padding:var(--size-xs, 8px) 0;user-select:none}.ie-grid{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:1px;background:var(--color-border, #e0e0e0);border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden;min-height:24rem;display:grid;flex:1}.ie-quadrant{background:var(--color-surface, #fff);padding:var(--size-m, 16px);display:flex;flex-direction:column;gap:var(--size-xs, 8px)}.ie-quadrant-label{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted, #666);margin-bottom:var(--size-xs, 8px)}.ie-quadrant-desc{font-size:.65rem;font-weight:400;text-transform:none;letter-spacing:normal;color:var(--color-text-muted, #999);display:block}[data-quadrant-zone=quick-wins]{background:color-mix(in oklch,var(--color-success, #22c55e) 6%,var(--color-surface, #fff))}[data-quadrant-zone=big-bets]{background:color-mix(in oklch,var(--color-warning, #f59e0b) 6%,var(--color-surface, #fff))}[data-quadrant-zone=fill-ins]{background:color-mix(in oklch,var(--color-info, #3b82f6) 6%,var(--color-surface, #fff))}[data-quadrant-zone=money-pit]{background:color-mix(in oklch,var(--color-error, #ef4444) 6%,var(--color-surface, #fff))}impact-effort drag-surface{min-block-size:6rem;flex:1}.ie-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;padding:0;margin:-1px}impact-effort[compact] .ie-grid{min-height:16rem}impact-effort[compact] .ie-quadrant{padding:var(--size-xs, 8px);gap:var(--size-2xs, 4px)}impact-effort[compact] .ie-quadrant-label{font-size:.65rem;margin-bottom:var(--size-2xs, 4px)}impact-effort[compact] .ie-quadrant-desc{font-size:.6rem}impact-effort[compact] drag-surface{min-block-size:4rem}impact-effort[compact] .ie-y-label,impact-effort[compact] .ie-x-label{font-size:.6rem}@container (max-width: 30rem){.ie-grid{grid-template-columns:1fr;grid-template-rows:auto}}@media(prefers-reduced-motion:reduce){impact-effort,impact-effort *{transition:none}}@media print{.ie-grid{border:1px solid #ccc;gap:0;min-height:auto}.ie-quadrant{border:.5pt solid #ccc;break-inside:avoid}impact-effort drag-surface{min-block-size:auto}impact-effort [draggable]{cursor:default}}quadrant-grid:not(:defined){display:block}quadrant-grid{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(quadrant-grid){.qg-wrapper{display:grid;grid-template-columns:max-content max-content 1fr;grid-template-rows:max-content 1fr max-content max-content;grid-template-areas:"y-label . ." "y-scale grid grid" ". x-scale x-scale" ". x-label x-label";gap:var(--size-2xs, .25rem);margin:0}.qg-y-label{grid-area:y-label;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);text-align:start;padding-inline-end:var(--size-xs, .5rem)}.qg-x-label{grid-area:x-label;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);text-align:end}.qg-y-scale{grid-area:y-scale;display:flex;flex-direction:column;justify-content:space-between;padding-block:var(--size-2xs, .25rem);font-family:var(--font-mono, ui-monospace, monospace);font-size:var(--font-size-xs, .75rem);color:var(--color-text-muted, #666);text-align:end;padding-inline-end:var(--size-xs, .5rem);min-inline-size:3rem}.qg-x-scale{grid-area:x-scale;display:flex;justify-content:space-between;font-family:var(--font-mono, ui-monospace, monospace);font-size:var(--font-size-xs, .75rem);color:var(--color-text-muted, #666);padding-block-start:var(--size-2xs, .25rem)}.qg-grid{grid-area:grid;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:var(--size-2xs, .25rem);min-block-size:var(--qg-min-size, 24rem);background:var(--color-border, oklch(85% 0 0));padding:1px;border-radius:var(--radius-m, .5rem)}.qg-quadrant{position:relative;background:var(--color-surface, #fff);padding:var(--size-s, .75rem);display:flex;flex-direction:column;gap:var(--size-xs, .5rem);overflow:hidden}.qg-quadrant[data-quadrant-zone="0"]{grid-row:1;grid-column:2;border-radius:0 var(--radius-m, .5rem) 0 0}.qg-quadrant[data-quadrant-zone="1"]{grid-row:1;grid-column:1;border-radius:var(--radius-m, .5rem) 0 0 0}.qg-quadrant[data-quadrant-zone="2"]{grid-row:2;grid-column:1;border-radius:0 0 0 var(--radius-m, .5rem)}.qg-quadrant[data-quadrant-zone="3"]{grid-row:2;grid-column:2;border-radius:0 0 var(--radius-m, .5rem) 0}.qg-quadrant-label{font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin:0}.qg-items{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--size-2xs, .25rem)}.qg-items>li{background:var(--color-surface-raised, oklch(96% 0 0));padding:var(--size-2xs, .25rem) var(--size-xs, .5rem);border-radius:var(--radius-s, .25rem);font-size:var(--font-size-sm, .875rem)}.qg-pinned{position:absolute;inline-size:max-content;max-inline-size:calc(100% - var(--size-xs, .5rem));padding:var(--size-3xs, .125rem) var(--size-xs, .5rem);background:var(--color-accent, oklch(45% .18 260));color:var(--color-text-on-primary, #fff);border-radius:var(--radius-s, .25rem);font-size:var(--font-size-xs, .75rem);inset-inline-start:clamp(var(--qg-pin-half-w, 1.5rem),calc(var(--qg-local-x, .5) * 100%),calc(100% - var(--qg-pin-half-w, 1.5rem)));inset-block-end:clamp(var(--qg-pin-half-h, .75rem),calc(var(--qg-local-y, .5) * 100%),calc(100% - var(--qg-pin-half-h, .75rem)));transform:translate(calc(-50% + var(--qg-fan-x, 0px)),calc(50% + var(--qg-fan-y, 0px)));box-shadow:0 1px 3px #00000026;filter:hue-rotate(var(--qg-pin-hue, 0deg));transition:transform .18s ease,box-shadow .18s ease,z-index 0s}.qg-quadrant:hover .qg-pinned.qg-clustered,.qg-quadrant:focus-within .qg-pinned.qg-clustered{--qg-fan-angle: calc((var(--qg-cluster-i, 0) / var(--qg-cluster-n, 1)) * 360deg);--qg-fan-radius: calc(var(--qg-pin-half-w, 1.5rem) * 1.4);--qg-fan-x: calc(cos(var(--qg-fan-angle)) * var(--qg-fan-radius));--qg-fan-y: calc(sin(var(--qg-fan-angle)) * var(--qg-fan-radius) * -1)}.qg-pinned.qg-clustered:hover,.qg-pinned.qg-clustered:focus-visible{z-index:2;box-shadow:0 4px 12px #00000040}}@media(prefers-reduced-motion:reduce){quadrant-grid *{transition:none!important}}@media print{quadrant-grid .qg-y-label,quadrant-grid .qg-x-label,quadrant-grid .qg-y-scale,quadrant-grid .qg-x-scale{color:#000}}risk-register:not(:defined){display:block}risk-register{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(risk-register){.rr-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}.rr-layout{display:grid;grid-template-columns:1fr;gap:var(--size-l, 1.5rem)}@media(width>=64rem){.rr-layout{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);align-items:start}}}traceability-matrix:not(:defined){display:block}traceability-matrix{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(traceability-matrix){.tm-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}.tm-empty{color:var(--color-text-muted, #666);font-style:italic}td[data-linked]{background:#d7f5d78c;text-align:center;font-weight:600;color:var(--color-accent, oklch(45% .18 260))}td:not([data-linked]){color:var(--color-text-muted, #666);text-align:center}th[scope=row]{text-align:start;font-weight:600;background:var(--color-surface-raised, oklch(96% 0 0));white-space:nowrap}tr[data-state-highlighted]{outline:2px solid var(--color-accent, oklch(45% .18 260));outline-offset:-2px}td[data-state-highlighted],th[data-state-highlighted]{background:#9be39db3}tr[data-orphan] th[scope=row]:after,th[data-orphan]:after{content:" \26a0";color:var(--color-warning, oklch(60% .15 60));font-weight:700}td,th{padding:var(--size-2xs, .25rem) var(--size-s, .75rem);border-block-end:var(--border-width-thin, 1px) solid var(--color-border, oklch(85% 0 0));cursor:default}td[data-linked]{cursor:pointer}}[data-state-highlighted]:not(traceability-matrix *){outline:2px solid var(--color-accent, oklch(45% .18 260));outline-offset:2px;scroll-margin-block:var(--size-l, 1.5rem)}@media print{traceability-matrix td[data-state-highlighted],traceability-matrix tr[data-state-highlighted]{outline:none;background:none}}burndown-chart:not(:defined){display:block}burndown-chart{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(burndown-chart){.bdc-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}chart-wc{display:block;min-block-size:var(--burndown-min-height, 18rem)}.bdc-scope-changes{margin-block-start:var(--size-m, 1rem);padding:var(--size-s, .75rem) var(--size-m, 1rem);background:var(--color-surface-raised, oklch(96% 0 0));border-inline-start:var(--border-width-medium, 3px) solid var(--color-warning, oklch(70% .15 60));border-radius:var(--radius-s, .25rem);font-size:var(--font-size-sm, .875rem)}.bdc-scope-changes h4{margin:0 0 var(--size-2xs, .25rem);font-size:var(--font-size-xs, .75rem);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666)}.bdc-scope-changes ul{margin:0;padding-inline-start:var(--size-m, 1rem)}.bdc-scope-changes li{margin-block:var(--size-3xs, .125rem)}.bdc-scope-changes time{font-family:var(--font-mono, ui-monospace, monospace);color:var(--color-text-muted, #666)}}product-roadmap:not(:defined){display:block}product-roadmap{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}product-roadmap>section[data-lane]{display:none}@scope(product-roadmap){.rm-wrapper{display:grid;grid-template-columns:minmax(8rem,max-content) 1fr;gap:var(--size-2xs, .25rem)}.rm-axis{grid-column:2;position:relative;block-size:var(--size-l, 1.5rem);border-block-end:var(--border-width-thin, 1px) solid var(--color-border, oklch(85% 0 0));margin-block-end:var(--size-2xs, .25rem)}.rm-tick{position:absolute;inset-block:0;inset-inline-start:calc(var(--rm-x) * 100%);inline-size:calc(var(--rm-w) * 100%);border-inline-end:var(--border-width-thin, 1px) dashed var(--color-border, oklch(85% 0 0));padding-inline:var(--size-2xs, .25rem);font-size:var(--font-size-xs, .75rem);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rm-lanes{grid-column:1 / -1;display:grid;grid-template-columns:subgrid;gap:var(--size-2xs, .25rem);position:relative}.rm-lane{display:contents}.rm-lane-label{grid-column:1;font-size:var(--font-size-sm, .875rem);font-weight:600;color:var(--color-text, currentColor);padding:var(--size-xs, .5rem) var(--size-s, .75rem);background:var(--color-surface-raised, oklch(96% 0 0));border-radius:var(--radius-s, .25rem);align-self:stretch;display:flex;align-items:center}.rm-track{grid-column:2;position:relative;min-block-size:var(--size-2xl, 3rem);background:repeating-linear-gradient(to right,var(--color-surface, transparent),var(--color-surface, transparent) calc(var(--rm-tick-w, 25%) - 1px),var(--color-border, oklch(85% 0 0 / .4)) calc(var(--rm-tick-w, 25%) - 1px),var(--color-border, oklch(85% 0 0 / .4)) var(--rm-tick-w, 25%));border-radius:var(--radius-s, .25rem)}.rm-bar{position:absolute;inset-block:var(--size-2xs, .25rem);inset-inline-start:calc(var(--rm-x) * 100%);inline-size:calc(var(--rm-w) * 100%);background:var(--color-accent, oklch(45% .18 260));color:var(--color-text-on-primary, #fff);border-radius:var(--radius-s, .25rem);padding:var(--size-2xs, .25rem) var(--size-s, .75rem);font-size:var(--font-size-sm, .875rem);line-height:1.2;overflow:hidden;box-shadow:0 1px 2px #00000026;cursor:grab;user-select:none;display:flex;align-items:center;gap:var(--size-2xs, .25rem)}.rm-bar:active{cursor:grabbing}.rm-bar-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rm-bar-handle{position:absolute;inset-block:0;inset-inline-end:0;inline-size:var(--size-xs, .5rem);background:#ffffff40;cursor:ew-resize;border-start-end-radius:var(--radius-s, .25rem);border-end-end-radius:var(--radius-s, .25rem)}.rm-bar[data-status=planned]{background:var(--color-info, oklch(60% .12 240))}.rm-bar[data-status=in-progress]{background:var(--color-accent, oklch(50% .16 260))}.rm-bar[data-status=at-risk]{background:var(--color-warning, oklch(65% .16 60));color:var(--color-text, #1a1a1a)}.rm-bar[data-status=shipped]{background:var(--color-success, oklch(55% .14 145))}.rm-bar[data-status=blocked]{background:var(--color-danger, oklch(55% .18 25))}.rm-today{position:absolute;inset-block:0;inset-inline-start:calc(var(--rm-x) * 100%);inline-size:0;border-inline-start:var(--border-width-medium, 2px) solid var(--color-warning, oklch(60% .18 60));pointer-events:none;z-index:2;transform:translate(0)}}product-roadmap:not([editable]) .rm-bar{cursor:default}product-roadmap:not([editable]) .rm-bar-handle{display:none}@media(prefers-reduced-motion:reduce){product-roadmap .rm-bar{transition:none}}kanban-board{display:block;container-type:inline-size}kanban-board:not(:defined){display:block}.kb-columns{display:flex;gap:1px;background:var(--color-border, #e0e0e0);border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden;flex-wrap:wrap}.kb-column{min-inline-size:14rem;flex:1 1 14rem;display:flex;flex-direction:column;background:var(--color-surface, #fff);margin-block:0!important;padding-block-start:0!important;border-block-start:0!important}.kb-column-header{position:sticky;inset-block-start:0;z-index:2;padding:var(--size-s, 12px) var(--size-m, 16px);background:var(--color-surface-raised, #f8f9fa);border-block-end:2px solid var(--color-border, #e0e0e0)}.kb-column-header h3{margin:0;font-size:.875rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text, #1a1a1a);display:flex;align-items:center;gap:.25em}.kb-count{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);background:var(--color-border, #e0e0e0);border-radius:var(--radius-full, 9999px);padding:1px 8px;margin-inline-start:4px}.kb-wip{font-size:.65rem;font-weight:400;color:var(--color-text-muted, #999)}[data-wip-exceeded] .kb-column-header{border-block-end-color:var(--color-error, #ef4444)}[data-wip-exceeded] .kb-count{background:color-mix(in oklch,var(--color-error, #ef4444) 15%,var(--color-surface, #fff));color:var(--color-error, #ef4444)}[data-column-tint=success]{background:color-mix(in oklch,var(--color-success, #22c55e) 6%,var(--color-surface, #fff))}[data-column-tint=warning]{background:color-mix(in oklch,var(--color-warning, #f59e0b) 6%,var(--color-surface, #fff))}[data-column-tint=error]{background:color-mix(in oklch,var(--color-error, #ef4444) 6%,var(--color-surface, #fff))}[data-column-tint=info]{background:color-mix(in oklch,var(--color-info, #3b82f6) 6%,var(--color-surface, #fff))}[data-column-tint=interactive]{background:color-mix(in oklch,var(--color-interactive, #3b82f6) 6%,var(--color-surface, #fff))}kanban-board drag-surface{padding:var(--size-s, 12px);min-block-size:6rem;flex:1}kanban-board .kb-card{background:var(--color-surface, #fff);border:var(--border-width-thin, 1px) solid var(--color-border, #e0e0e0);border-radius:var(--radius-s, .375rem);padding:var(--size-xs, 8px) var(--size-s, 12px);cursor:grab;font-size:var(--font-size-s, .875rem);line-height:1.4}kanban-board .kb-card:active{cursor:grabbing}.kb-empty{color:var(--color-text-muted, #888);font-size:.8rem;font-style:italic;padding:var(--size-s, 12px);margin:0}.kb-title{margin-block-end:var(--size-s, 12px)}.kb-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;padding:0;margin:-1px}kanban-board[compact] .kb-column{min-inline-size:11rem;flex:1 1 11rem}kanban-board[compact] .kb-column-header{padding:var(--size-xs, 8px) var(--size-s, 12px)}kanban-board[compact] .kb-column-header h3{font-size:.75rem}kanban-board[compact] drag-surface{padding:var(--size-xs, 8px);min-block-size:4rem}kanban-board[compact] .kb-count{font-size:.6rem}@container (max-width: 30rem){.kb-columns{flex-direction:column}.kb-column{min-inline-size:unset}}@media(prefers-reduced-motion:reduce){kanban-board,kanban-board *{transition:none}}@media print{.kb-columns{flex-wrap:wrap;border:.5pt solid #ccc;gap:0}.kb-column{border:.5pt solid #ccc;break-inside:avoid}.kb-column-header{position:static}kanban-board drag-surface{min-block-size:auto}kanban-board [draggable]{cursor:default}}story-map{display:block;container-type:inline-size}story-map:not(:defined){display:block}.sm-scroll{overflow-x:auto;overflow-y:visible;-webkit-overflow-scrolling:touch}.sm-columns{display:flex;gap:1px;background:var(--color-border, #e0e0e0);min-inline-size:min-content;border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden}.sm-column{min-inline-size:14rem;max-inline-size:22rem;flex:1 0 14rem;display:flex;flex-direction:column;background:var(--color-surface, #fff)}.sm-activity-header{position:sticky;inset-block-start:0;z-index:2;padding:var(--size-s, 12px) var(--size-m, 16px);background:var(--color-surface-raised, #f8f9fa);border-block-end:2px solid var(--color-border, #e0e0e0)}.sm-activity-header h3{margin:0;font-size:.875rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text, #1a1a1a)}.sm-activity-count{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);background:var(--color-border, #e0e0e0);border-radius:var(--radius-full, 9999px);padding:1px 8px;margin-inline-start:8px}story-map drag-surface{padding:var(--size-s, 12px);min-block-size:8rem;flex:1}story-map drag-surface>*{margin-block-end:var(--size-xs, 8px)}story-map drag-surface>*:last-child{margin-block-end:0}.sm-empty{color:var(--color-text-muted, #888);font-size:.8rem;font-style:italic;padding:var(--size-s, 12px);margin:0}.sm-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}story-map[compact] .sm-column{min-inline-size:11rem;flex:1 0 11rem}story-map[compact] .sm-activity-header{padding:var(--size-xs, 8px) var(--size-s, 12px)}story-map[compact] .sm-activity-header h3{font-size:.75rem}story-map[compact] drag-surface{padding:var(--size-xs, 8px)}@container (max-width: 30rem){.sm-columns{flex-direction:column}.sm-column{max-inline-size:none}}@media(prefers-reduced-motion:reduce){.sm-scroll{scroll-behavior:auto}}@media print{.sm-scroll{overflow:visible}.sm-activity-header{position:static}.sm-columns{flex-wrap:wrap}.sm-column{break-inside:avoid}}gantt-chart{display:block;container-type:inline-size;font-family:var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);line-height:1.5;color:var(--color-text, #1a1a1a)}gantt-chart:not([data-upgraded])>table{width:100%}.gc-title{font-size:var(--font-size-xl, 1.25rem);font-weight:700;margin-block-end:var(--size-s, .75rem)}.gc-container{border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-m, .5rem);overflow:hidden;background:var(--color-surface, #ffffff)}.gc-timeline-header{display:flex;position:relative;border-block-end:1px solid var(--color-border, #e0e0e0);background:var(--color-surface-raised, #f8f9fa);min-height:32px}.gc-timeline-spacer{flex:0 0 var(--gc-task-width, 180px);border-inline-end:1px solid var(--color-border, #e0e0e0)}.gc-timeline-dates{flex:1;position:relative;min-height:32px}.gc-date-label{position:absolute;top:0;bottom:0;display:flex;align-items:center;font-size:11px;font-weight:600;color:var(--color-text-muted, #666666);padding-inline-start:6px;white-space:nowrap;border-inline-start:1px solid var(--color-border, #e0e0e0)}.gc-date-label:first-child{border-inline-start:none}.gc-body{display:flex;min-height:0}.gc-task-list{flex:0 0 var(--gc-task-width, 180px);border-inline-end:1px solid var(--color-border, #e0e0e0);overflow:hidden}.gc-task-row{display:flex;align-items:center;gap:6px;height:var(--gc-row-height, 36px);padding-inline:12px;border-block-end:1px solid color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent);font-size:var(--font-size-sm, .875rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gc-task-row:last-child{border-block-end:none}.gc-task-name{overflow:hidden;text-overflow:ellipsis}.gc-task-dates{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.gc-group-header{display:flex;align-items:center;height:28px;padding-inline:12px;background:var(--color-surface-raised, #f8f9fa);border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-group-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted, #666666)}.gc-group-spacer{height:28px;background:var(--color-surface-raised, #f8f9fa);border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-bars{flex:1;position:relative;min-width:0;overflow-x:auto}.gc-grid-lines{position:absolute;inset:0;pointer-events:none}.gc-grid-line{position:absolute;top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent)}.gc-bar-row{position:relative;height:var(--gc-row-height, 36px);border-block-end:1px solid color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent)}.gc-bar-row:last-child{border-block-end:none}.gc-bar{position:absolute;top:6px;bottom:6px;border-radius:var(--radius-s, 4px);background:var(--gc-bar-color, var(--color-interactive, #0066cc));cursor:pointer;min-width:4px;display:flex;align-items:center;overflow:hidden;transition:filter .15s ease}.gc-bar:hover{filter:brightness(1.1)}.gc-bar:focus-visible{outline:2px solid var(--color-interactive, #0066cc);outline-offset:2px}.gc-bar-fill{height:100%;border-radius:inherit;background:color-mix(in srgb,var(--gc-bar-color, var(--color-interactive, #0066cc)) 65%,white);pointer-events:none}.gc-bar-label{position:absolute;inset:0;display:flex;align-items:center;padding-inline:6px;font-size:11px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.gc-bar[data-status=done]{--gc-bar-color: var(--color-success, #16a34a)}.gc-bar[data-status=blocked]{--gc-bar-color: var(--color-error, #dc2626)}.gc-bar[data-status=not-started]{--gc-bar-color: var(--color-text-muted, #666666);opacity:.6}.gc-milestone{position:absolute;top:50%;width:14px;height:14px;transform:translate(-50%,-50%) rotate(45deg);background:var(--gc-bar-color, var(--color-interactive, #0066cc));border:2px solid var(--color-surface, #ffffff);cursor:pointer}.gc-milestone:focus-visible{outline:2px solid var(--color-interactive, #0066cc);outline-offset:3px}.gc-milestone[data-status=done]{--gc-bar-color: var(--color-success, #16a34a)}.gc-today-line{position:absolute;top:0;bottom:0;width:2px;background:var(--color-error, #dc2626);z-index:5;pointer-events:none}.gc-today-label{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:10px;font-weight:700;color:var(--color-error, #dc2626);white-space:nowrap}.gc-deps{position:absolute;inset:0;pointer-events:none;overflow:visible}.gc-dep-line{fill:none;stroke:var(--color-text-muted, #666666);stroke-width:1.5;marker-end:url(#gc-arrowhead)}.gc-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}gantt-chart[compact]{--gc-row-height: 28px;--gc-task-width: 140px}gantt-chart[compact] .gc-task-row{font-size:12px;padding-inline:8px}gantt-chart[compact] .gc-bar{top:5px;bottom:5px}gantt-chart[compact] .gc-group-header{height:24px}gantt-chart[compact] .gc-group-spacer{height:24px}@container (max-width: 30rem){.gc-body{flex-direction:column}.gc-task-list{flex:none;border-inline-end:none;border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-task-row{height:auto;padding-block:4px}.gc-timeline-spacer{display:none}}@media(prefers-reduced-motion:reduce){.gc-bar{transition:none}}@media print{gantt-chart[data-upgraded] .gc-container,gantt-chart[data-upgraded] .gc-title{display:none}gantt-chart[data-upgraded] .gc-sr-only{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;white-space:normal}}::view-transition-old(*),::view-transition-new(*){animation-duration:.22s;animation-timing-function:ease-out}iron-triangle{display:block;inline-size:100%;max-inline-size:var(--iron-triangle-max, 26rem);margin-inline:auto;container-type:inline-size}iron-triangle>svg{inline-size:100%;block-size:auto;display:block}iron-triangle svg .triangle{fill:var(--iron-triangle-fill, color-mix(in oklab, var(--color-interactive) 8%, transparent));stroke:var(--iron-triangle-stroke, var(--color-interactive));stroke-width:var(--iron-triangle-stroke-width, 1.5);stroke-linejoin:round;pointer-events:none}iron-triangle svg .vertex,iron-triangle svg .center{cursor:pointer;outline:none}iron-triangle svg .vertex .hit,iron-triangle svg .center .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}iron-triangle svg .vertex:hover .hit,iron-triangle svg .vertex:focus-visible .hit,iron-triangle svg .center:hover .hit,iron-triangle svg .center:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1.5;stroke-dasharray:3 3}iron-triangle svg .vertex-name{font-size:.85rem;font-weight:var(--font-weight-semibold, 600);fill:var(--color-text);pointer-events:none}iron-triangle svg .vertex:hover .vertex-name,iron-triangle svg .vertex:focus-visible .vertex-name{fill:var(--color-interactive)}iron-triangle svg .vertex-summary{font-size:.7rem;fill:var(--color-text-muted);font-variant-numeric:tabular-nums;pointer-events:none}iron-triangle svg .capacity-backdrop{fill:var(--color-surface);stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;pointer-events:none}iron-triangle svg .quality-label{font-size:.65rem;font-weight:var(--font-weight-semibold, 600);fill:var(--color-interactive);text-transform:uppercase;letter-spacing:.06em;pointer-events:none}iron-triangle svg .capacity{font-size:var(--iron-triangle-capacity-size, 1.6rem);font-weight:var(--font-weight-bold, 700);fill:var(--color-text);font-variant-numeric:tabular-nums;pointer-events:none}iron-triangle svg .capacity-unit{font-size:.6rem;fill:var(--color-text-muted);pointer-events:none}iron-triangle svg .center .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}iron-triangle svg .center:hover .hit,iron-triangle svg .center:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1.5;stroke-dasharray:3 3}iron-triangle svg .center:hover .quality-label,iron-triangle svg .center:focus-visible .quality-label{fill:var(--color-interactive)}iron-triangle:state(over-deadline) svg .triangle{stroke:var(--color-warning)}iron-triangle:state(unbudgeted) svg .capacity{fill:var(--color-warning)}iron-triangle:state(manual) svg .quality-label:after{content:" (manual)"}iron-triangle[disabled],iron-triangle[locked]{opacity:.85;pointer-events:none}iron-triangle>dialog.iron-triangle-dialog{inline-size:min(28rem,92vw);border:var(--border-width-thin, 1px) solid var(--color-border);border-radius:var(--radius-l, .75rem);padding:var(--size-l, 1.5rem);background:var(--color-surface);color:var(--color-text)}iron-triangle>dialog.iron-triangle-dialog::backdrop{background:oklch(from var(--color-surface) l c h / .5);backdrop-filter:blur(2px)}iron-triangle>dialog.iron-triangle-dialog h3{margin:0 0 var(--size-m) 0;font-size:var(--font-size-l, 1.125rem)}capacity-plan{display:block;inline-size:100%;max-inline-size:var(--capacity-plan-max, 32rem);margin-inline:auto}capacity-plan .capacity-ledger{display:grid;grid-template-columns:minmax(8rem,14rem) 1fr;gap:var(--size-2xs, .25rem) var(--size-m, 1rem);margin:0}capacity-plan .capacity-ledger>div{display:contents}capacity-plan .capacity-ledger dt{font-weight:var(--font-weight-semibold, 600);color:var(--color-text)}capacity-plan .capacity-ledger .num{margin:0;font-variant-numeric:tabular-nums;color:var(--color-text-muted);text-align:end;padding-inline-end:var(--size-s)}capacity-plan .capacity-ledger .bar{margin:0;align-self:center}capacity-plan .bar-track{display:block;inline-size:100%;block-size:.6rem;background:var(--color-surface-raised, color-mix(in oklab, var(--color-surface) 92%, currentColor 8%));border-radius:var(--radius-pill, 999px);overflow:hidden}capacity-plan .bar-fill{display:block;block-size:100%;inline-size:var(--w, 0%);border-radius:inherit;transition:inline-size .2s ease}capacity-plan .bar-capacity{background:color-mix(in oklab,var(--color-text) 25%,transparent)}capacity-plan .bar-quality{background:var(--color-interactive)}capacity-plan .bar-features{background:var(--color-success)}capacity-plan .bar-slack{background:color-mix(in oklab,var(--color-text-muted) 35%,transparent)}capacity-plan [data-row=slack][data-state=over] .num{color:var(--color-error);font-weight:var(--font-weight-semibold, 600)}capacity-plan [data-row=slack][data-state=over] .bar-slack{background:var(--color-error)}capacity-plan:state(overdrawn) .capacity-ledger{outline:2px solid var(--color-error);outline-offset:var(--size-2xs);border-radius:var(--radius-m)}quality-target{display:block;inline-size:100%;max-inline-size:var(--quality-target-max, 36rem);margin-inline:auto;container-type:inline-size}quality-target>svg{inline-size:100%;block-size:auto;display:block}quality-target svg .ring{fill:none;stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;stroke-dasharray:3 3;pointer-events:none}quality-target svg .ring-critical{stroke:color-mix(in oklab,var(--color-error) 60%,transparent)}quality-target svg .ring-important{stroke:color-mix(in oklab,var(--color-warning) 50%,transparent)}quality-target svg .ring-acceptable{stroke:color-mix(in oklab,var(--color-success) 50%,transparent)}quality-target svg .spoke{stroke:var(--color-border, #e5e7eb);stroke-width:.75;stroke-dasharray:1 4;pointer-events:none}quality-target svg .vector{fill:var(--quality-target-vector-fill, color-mix(in oklab, var(--color-interactive) 22%, transparent));stroke:var(--quality-target-vector-stroke, var(--color-interactive));stroke-width:1.5;stroke-linejoin:round;pointer-events:none}quality-target svg .vector-spoke{stroke:var(--quality-target-vector-stroke, var(--color-interactive));stroke-width:2;stroke-linecap:round;pointer-events:none}quality-target svg .axis{cursor:pointer;outline:none}quality-target svg .axis .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}quality-target svg .axis:hover .hit,quality-target svg .axis:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1;stroke-dasharray:2 2}quality-target svg .axis-label{font-size:var(--quality-target-label-size, .625rem);fill:var(--color-text-muted);letter-spacing:.02em;pointer-events:none;font-weight:var(--font-weight-regular, 400)}quality-target svg .axis[data-level] .axis-label{font-weight:var(--font-weight-semibold, 600)}quality-target svg .axis[data-level=critical] .axis-label{fill:var(--color-error, #dc2626)}quality-target svg .axis[data-level=important] .axis-label{fill:var(--color-warning, #b45309)}quality-target svg .axis[data-level=acceptable] .axis-label{fill:var(--color-success, #15803d)}quality-target svg .axis[data-level=not-relevant] .axis-label{fill:var(--color-text-muted, #6b7280);text-decoration:line-through;font-weight:var(--font-weight-regular, 400)}quality-target svg .axis .marker{fill:var(--color-interactive);stroke:var(--color-surface);stroke-width:1;pointer-events:none}quality-target svg .axis[data-level=critical] .marker{fill:var(--color-error, #dc2626)}quality-target svg .axis[data-level=important] .marker{fill:var(--color-warning, #b45309)}quality-target svg .axis[data-level=acceptable] .marker{fill:var(--color-success, #16a34a)}quality-target svg .axis[data-level=not-relevant] .marker{fill:var(--color-text-muted, #6b7280);opacity:.5}quality-target svg .capacity-backdrop{fill:var(--color-surface);stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;pointer-events:none}quality-target svg .capacity-sum{font-size:var(--quality-target-capacity-size, 1.25rem);font-weight:var(--font-weight-bold, 700);fill:var(--color-text);font-variant-numeric:tabular-nums;pointer-events:none}quality-target svg .capacity-denom{font-size:.55rem;fill:var(--color-text-muted);font-variant-numeric:tabular-nums;pointer-events:none}quality-target svg .center[data-over] .capacity-sum{fill:var(--color-error)}quality-target:state(over-budget) svg .vector{stroke:var(--color-warning)}quality-target .quality-footer{margin-block-start:var(--size-m, 1rem)}quality-target [data-quality-overrun]{padding:var(--size-m, 1rem);border:var(--border-width-thin, 1px) solid var(--color-error);border-radius:var(--radius-m);background:var(--color-error-subtle, oklch(95% .05 27));display:grid;gap:var(--size-2xs, .25rem)}quality-target [data-quality-overrun][hidden]{display:none}quality-target [data-quality-errors]{display:none}quality-target:state(missing-rationale) [data-quality-errors]{display:block}quality-target>dialog.quality-dialog{inline-size:min(28rem,92vw);border:var(--border-width-thin, 1px) solid var(--color-border);border-radius:var(--radius-l, .75rem);padding:var(--size-l, 1.5rem);background:var(--color-surface);color:var(--color-text)}quality-target>dialog.quality-dialog::backdrop{background:oklch(from var(--color-surface) l c h / .5);backdrop-filter:blur(2px)}quality-target>dialog.quality-dialog h3{margin:0 0 var(--size-m) 0;font-size:var(--font-size-l, 1.125rem)}quality-target>dialog.quality-dialog fieldset{border:1px solid var(--color-border-muted, var(--color-border))}quality-target[disabled],quality-target[locked]{opacity:.85;pointer-events:none}
|
|
1
|
+
impact-effort{display:block;container-type:inline-size}impact-effort:not(:defined){display:block}.ie-wrapper{display:flex;align-items:stretch}.ie-y-label{writing-mode:vertical-rl;transform:rotate(180deg);font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);text-align:center;padding:0 var(--size-xs, 8px);display:flex;align-items:center;justify-content:center;user-select:none}.ie-x-label{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);text-align:center;padding:var(--size-xs, 8px) 0;user-select:none}.ie-grid{grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:1px;background:var(--color-border, #e0e0e0);border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden;min-height:24rem;display:grid;flex:1}.ie-quadrant{background:var(--color-surface, #fff);padding:var(--size-m, 16px);display:flex;flex-direction:column;gap:var(--size-xs, 8px)}.ie-quadrant-label{font-size:.75rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted, #666);margin-bottom:var(--size-xs, 8px)}.ie-quadrant-desc{font-size:.65rem;font-weight:400;text-transform:none;letter-spacing:normal;color:var(--color-text-muted, #999);display:block}[data-quadrant-zone=quick-wins]{background:color-mix(in oklch,var(--color-success, #22c55e) 6%,var(--color-surface, #fff))}[data-quadrant-zone=big-bets]{background:color-mix(in oklch,var(--color-warning, #f59e0b) 6%,var(--color-surface, #fff))}[data-quadrant-zone=fill-ins]{background:color-mix(in oklch,var(--color-info, #3b82f6) 6%,var(--color-surface, #fff))}[data-quadrant-zone=money-pit]{background:color-mix(in oklch,var(--color-error, #ef4444) 6%,var(--color-surface, #fff))}impact-effort drag-surface{min-block-size:6rem;flex:1}.ie-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;padding:0;margin:-1px}impact-effort[compact] .ie-grid{min-height:16rem}impact-effort[compact] .ie-quadrant{padding:var(--size-xs, 8px);gap:var(--size-2xs, 4px)}impact-effort[compact] .ie-quadrant-label{font-size:.65rem;margin-bottom:var(--size-2xs, 4px)}impact-effort[compact] .ie-quadrant-desc{font-size:.6rem}impact-effort[compact] drag-surface{min-block-size:4rem}impact-effort[compact] .ie-y-label,impact-effort[compact] .ie-x-label{font-size:.6rem}@container (max-width: 30rem){.ie-grid{grid-template-columns:1fr;grid-template-rows:auto}}@media(prefers-reduced-motion:reduce){impact-effort,impact-effort *{transition:none}}@media print{.ie-grid{border:1px solid #ccc;gap:0;min-height:auto}.ie-quadrant{border:.5pt solid #ccc;break-inside:avoid}impact-effort drag-surface{min-block-size:auto}impact-effort [draggable]{cursor:default}}quadrant-grid:not(:defined){display:block}quadrant-grid{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(quadrant-grid){.qg-wrapper{display:grid;grid-template-columns:max-content max-content 1fr;grid-template-rows:max-content 1fr max-content max-content;grid-template-areas:"y-label . ." "y-scale grid grid" ". x-scale x-scale" ". x-label x-label";gap:var(--size-2xs, .25rem);margin:0}.qg-y-label{grid-area:y-label;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);text-align:start;padding-inline-end:var(--size-xs, .5rem)}.qg-x-label{grid-area:x-label;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);text-align:end}.qg-y-scale{grid-area:y-scale;display:flex;flex-direction:column;justify-content:space-between;padding-block:var(--size-2xs, .25rem);font-family:var(--font-mono, ui-monospace, monospace);font-size:var(--font-size-xs, .75rem);color:var(--color-text-muted, #666);text-align:end;padding-inline-end:var(--size-xs, .5rem);min-inline-size:3rem}.qg-x-scale{grid-area:x-scale;display:flex;justify-content:space-between;font-family:var(--font-mono, ui-monospace, monospace);font-size:var(--font-size-xs, .75rem);color:var(--color-text-muted, #666);padding-block-start:var(--size-2xs, .25rem)}.qg-grid{grid-area:grid;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:1fr 1fr;gap:var(--size-2xs, .25rem);min-block-size:var(--qg-min-size, 24rem);background:var(--color-border, oklch(85% 0 0));padding:1px;border-radius:var(--radius-m, .5rem)}.qg-quadrant{position:relative;background:var(--color-surface, #fff);padding:var(--size-s, .75rem);display:flex;flex-direction:column;gap:var(--size-xs, .5rem);overflow:hidden}.qg-quadrant[data-quadrant-zone="0"]{grid-row:1;grid-column:2;border-radius:0 var(--radius-m, .5rem) 0 0}.qg-quadrant[data-quadrant-zone="1"]{grid-row:1;grid-column:1;border-radius:var(--radius-m, .5rem) 0 0 0}.qg-quadrant[data-quadrant-zone="2"]{grid-row:2;grid-column:1;border-radius:0 0 0 var(--radius-m, .5rem)}.qg-quadrant[data-quadrant-zone="3"]{grid-row:2;grid-column:2;border-radius:0 0 var(--radius-m, .5rem) 0}.qg-quadrant-label{font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin:0}.qg-items{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--size-2xs, .25rem)}.qg-items>li{background:var(--color-surface-raised, oklch(96% 0 0));padding:var(--size-2xs, .25rem) var(--size-xs, .5rem);border-radius:var(--radius-s, .25rem);font-size:var(--font-size-sm, .875rem)}.qg-pinned{position:absolute;inline-size:max-content;max-inline-size:calc(100% - var(--size-xs, .5rem));padding:var(--size-3xs, .125rem) var(--size-xs, .5rem);background:var(--color-accent, oklch(45% .18 260));color:var(--color-text-on-primary, #fff);border-radius:var(--radius-s, .25rem);font-size:var(--font-size-xs, .75rem);inset-inline-start:clamp(var(--qg-pin-half-w, 1.5rem),calc(var(--qg-local-x, .5) * 100%),calc(100% - var(--qg-pin-half-w, 1.5rem)));inset-block-end:clamp(var(--qg-pin-half-h, .75rem),calc(var(--qg-local-y, .5) * 100%),calc(100% - var(--qg-pin-half-h, .75rem)));transform:translate(calc(-50% + var(--qg-fan-x, 0px)),calc(50% + var(--qg-fan-y, 0px)));box-shadow:0 1px 3px #00000026;filter:hue-rotate(var(--qg-pin-hue, 0deg));transition:transform .18s ease,box-shadow .18s ease,z-index 0s}.qg-quadrant:hover .qg-pinned.qg-clustered,.qg-quadrant:focus-within .qg-pinned.qg-clustered{--qg-fan-angle: calc((var(--qg-cluster-i, 0) / var(--qg-cluster-n, 1)) * 360deg);--qg-fan-radius: calc(var(--qg-pin-half-w, 1.5rem) * 1.4);--qg-fan-x: calc(cos(var(--qg-fan-angle)) * var(--qg-fan-radius));--qg-fan-y: calc(sin(var(--qg-fan-angle)) * var(--qg-fan-radius) * -1)}.qg-pinned.qg-clustered:hover,.qg-pinned.qg-clustered:focus-visible{z-index:2;box-shadow:0 4px 12px #00000040}}@media(prefers-reduced-motion:reduce){quadrant-grid *{transition:none!important}}@media print{quadrant-grid .qg-y-label,quadrant-grid .qg-x-label,quadrant-grid .qg-y-scale,quadrant-grid .qg-x-scale{color:#000}}risk-register:not(:defined){display:block}risk-register{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(risk-register){.rr-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}.rr-layout{display:grid;grid-template-columns:1fr;gap:var(--size-l, 1.5rem)}@media(width>=64rem){.rr-layout{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);align-items:start}}}traceability-matrix:not(:defined){display:block}traceability-matrix{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(traceability-matrix){.tm-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}.tm-empty{color:var(--color-text-muted, #666);font-style:italic}td[data-linked]{background:#d7f5d78c;text-align:center;font-weight:600;color:var(--color-accent, oklch(45% .18 260))}td:not([data-linked]){color:var(--color-text-muted, #666);text-align:center}th[scope=row]{text-align:start;font-weight:600;background:var(--color-surface-raised, oklch(96% 0 0));white-space:nowrap}tr[data-state-highlighted]{outline:2px solid var(--color-accent, oklch(45% .18 260));outline-offset:-2px}td[data-state-highlighted],th[data-state-highlighted]{background:#9be39db3}tr[data-orphan] th[scope=row]:after,th[data-orphan]:after{content:" \26a0";color:var(--color-warning, oklch(60% .15 60));font-weight:700}td,th{padding:var(--size-2xs, .25rem) var(--size-s, .75rem);border-block-end:var(--border-width-thin, 1px) solid var(--color-border, oklch(85% 0 0));cursor:default}td[data-linked]{cursor:pointer}}[data-state-highlighted]:not(traceability-matrix *){outline:2px solid var(--color-accent, oklch(45% .18 260));outline-offset:2px;scroll-margin-block:var(--size-l, 1.5rem)}@media print{traceability-matrix td[data-state-highlighted],traceability-matrix tr[data-state-highlighted]{outline:none;background:none}}burndown-chart:not(:defined){display:block}burndown-chart{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}@scope(burndown-chart){.bdc-label{display:block;font-size:var(--font-size-xs, .75rem);font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);margin-block-end:var(--size-s, .75rem)}chart-wc{display:block;min-block-size:var(--burndown-min-height, 18rem)}.bdc-scope-changes{margin-block-start:var(--size-m, 1rem);padding:var(--size-s, .75rem) var(--size-m, 1rem);background:var(--color-surface-raised, oklch(96% 0 0));border-inline-start:var(--border-width-medium, 3px) solid var(--color-warning, oklch(70% .15 60));border-radius:var(--radius-s, .25rem);font-size:var(--font-size-sm, .875rem)}.bdc-scope-changes h4{margin:0 0 var(--size-2xs, .25rem);font-size:var(--font-size-xs, .75rem);text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666)}.bdc-scope-changes ul{margin:0;padding-inline-start:var(--size-m, 1rem)}.bdc-scope-changes li{margin-block:var(--size-3xs, .125rem)}.bdc-scope-changes time{font-family:var(--font-mono, ui-monospace, monospace);color:var(--color-text-muted, #666)}}product-roadmap:not(:defined){display:block}product-roadmap{display:block;font-family:var(--font-sans, system-ui);color:var(--color-text, #1a1a1a)}product-roadmap>section[data-lane]{display:none}@scope(product-roadmap){.rm-wrapper{display:grid;grid-template-columns:minmax(8rem,max-content) 1fr;gap:var(--size-2xs, .25rem)}.rm-axis{grid-column:2;position:relative;block-size:var(--size-l, 1.5rem);border-block-end:var(--border-width-thin, 1px) solid var(--color-border, oklch(85% 0 0));margin-block-end:var(--size-2xs, .25rem)}.rm-tick{position:absolute;inset-block:0;inset-inline-start:calc(var(--rm-x) * 100%);inline-size:calc(var(--rm-w) * 100%);border-inline-end:var(--border-width-thin, 1px) dashed var(--color-border, oklch(85% 0 0));padding-inline:var(--size-2xs, .25rem);font-size:var(--font-size-xs, .75rem);font-weight:600;text-transform:uppercase;letter-spacing:.06em;color:var(--color-text-muted, #666);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rm-lanes{grid-column:1 / -1;display:grid;grid-template-columns:subgrid;gap:var(--size-2xs, .25rem);position:relative}.rm-lane{display:contents}.rm-lane-label{grid-column:1;font-size:var(--font-size-sm, .875rem);font-weight:600;color:var(--color-text, currentColor);padding:var(--size-xs, .5rem) var(--size-s, .75rem);background:var(--color-surface-raised, oklch(96% 0 0));border-radius:var(--radius-s, .25rem);align-self:stretch;display:flex;align-items:center}.rm-track{grid-column:2;position:relative;min-block-size:var(--size-2xl, 3rem);background:repeating-linear-gradient(to right,var(--color-surface, transparent),var(--color-surface, transparent) calc(var(--rm-tick-w, 25%) - 1px),var(--color-border, oklch(85% 0 0 / .4)) calc(var(--rm-tick-w, 25%) - 1px),var(--color-border, oklch(85% 0 0 / .4)) var(--rm-tick-w, 25%));border-radius:var(--radius-s, .25rem)}.rm-bar{position:absolute;inset-block:var(--size-2xs, .25rem);inset-inline-start:calc(var(--rm-x) * 100%);inline-size:calc(var(--rm-w) * 100%);background:var(--color-accent, oklch(45% .18 260));color:var(--color-text-on-primary, #fff);border-radius:var(--radius-s, .25rem);padding:var(--size-2xs, .25rem) var(--size-s, .75rem);font-size:var(--font-size-sm, .875rem);line-height:1.2;overflow:hidden;box-shadow:0 1px 2px #00000026;cursor:grab;user-select:none;display:flex;align-items:center;gap:var(--size-2xs, .25rem)}.rm-bar:active{cursor:grabbing}.rm-bar-title{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.rm-bar-handle{position:absolute;inset-block:0;inset-inline-end:0;inline-size:var(--size-xs, .5rem);background:#ffffff40;cursor:ew-resize;border-start-end-radius:var(--radius-s, .25rem);border-end-end-radius:var(--radius-s, .25rem)}.rm-bar[data-status=planned]{background:var(--color-info, oklch(60% .12 240))}.rm-bar[data-status=in-progress]{background:var(--color-accent, oklch(50% .16 260))}.rm-bar[data-status=at-risk]{background:var(--color-warning, oklch(65% .16 60));color:var(--color-text, #1a1a1a)}.rm-bar[data-status=shipped]{background:var(--color-success, oklch(55% .14 145))}.rm-bar[data-status=blocked]{background:var(--color-danger, oklch(55% .18 25))}.rm-today{position:absolute;inset-block:0;inset-inline-start:calc(var(--rm-x) * 100%);inline-size:0;border-inline-start:var(--border-width-medium, 2px) solid var(--color-warning, oklch(60% .18 60));pointer-events:none;z-index:2;transform:translate(0)}}product-roadmap:not([editable]) .rm-bar{cursor:default}product-roadmap:not([editable]) .rm-bar-handle{display:none}@media(prefers-reduced-motion:reduce){product-roadmap .rm-bar{transition:none}}kanban-board{display:block;container-type:inline-size}kanban-board:not(:defined){display:block}.kb-columns{display:flex;gap:1px;background:var(--color-border, #e0e0e0);border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden;flex-wrap:wrap}.kb-column{min-inline-size:14rem;flex:1 1 14rem;display:flex;flex-direction:column;background:var(--color-surface, #fff);margin-block:0!important;padding-block-start:0!important;border-block-start:0!important}.kb-column-header{position:sticky;inset-block-start:0;z-index:2;padding:var(--size-s, 12px) var(--size-m, 16px);background:var(--color-surface-raised, #f8f9fa);border-block-end:2px solid var(--color-border, #e0e0e0)}.kb-column-header h3{margin:0;font-size:.875rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text, #1a1a1a);display:flex;align-items:center;gap:.25em}.kb-count{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);background:var(--color-border, #e0e0e0);border-radius:var(--radius-full, 9999px);padding:1px 8px;margin-inline-start:4px}.kb-wip{font-size:.65rem;font-weight:400;color:var(--color-text-muted, #999)}[data-wip-exceeded] .kb-column-header{border-block-end-color:var(--color-error, #ef4444)}[data-wip-exceeded] .kb-count{background:color-mix(in oklch,var(--color-error, #ef4444) 15%,var(--color-surface, #fff));color:var(--color-error, #ef4444)}[data-column-tint=success]{background:color-mix(in oklch,var(--color-success, #22c55e) 6%,var(--color-surface, #fff))}[data-column-tint=warning]{background:color-mix(in oklch,var(--color-warning, #f59e0b) 6%,var(--color-surface, #fff))}[data-column-tint=error]{background:color-mix(in oklch,var(--color-error, #ef4444) 6%,var(--color-surface, #fff))}[data-column-tint=info]{background:color-mix(in oklch,var(--color-info, #3b82f6) 6%,var(--color-surface, #fff))}[data-column-tint=interactive]{background:color-mix(in oklch,var(--color-interactive, #3b82f6) 6%,var(--color-surface, #fff))}kanban-board drag-surface{padding:var(--size-s, 12px);min-block-size:6rem;flex:1}kanban-board .kb-card{background:var(--color-surface, #fff);border:var(--border-width-thin, 1px) solid var(--color-border, #e0e0e0);border-radius:var(--radius-s, .375rem);padding:var(--size-xs, 8px) var(--size-s, 12px);cursor:grab;font-size:var(--font-size-s, .875rem);line-height:1.4}kanban-board .kb-card:active{cursor:grabbing}.kb-empty{color:var(--color-text-muted, #888);font-size:.8rem;font-style:italic;padding:var(--size-s, 12px);margin:0}.kb-title{margin-block-end:var(--size-s, 12px)}.kb-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;padding:0;margin:-1px}kanban-board[compact] .kb-column{min-inline-size:11rem;flex:1 1 11rem}kanban-board[compact] .kb-column-header{padding:var(--size-xs, 8px) var(--size-s, 12px)}kanban-board[compact] .kb-column-header h3{font-size:.75rem}kanban-board[compact] drag-surface{padding:var(--size-xs, 8px);min-block-size:4rem}kanban-board[compact] .kb-count{font-size:.6rem}@container (max-width: 30rem){.kb-columns{flex-direction:column}.kb-column{min-inline-size:unset}}@media(prefers-reduced-motion:reduce){kanban-board,kanban-board *{transition:none}}@media print{.kb-columns{flex-wrap:wrap;border:.5pt solid #ccc;gap:0}.kb-column{border:.5pt solid #ccc;break-inside:avoid}.kb-column-header{position:static}kanban-board drag-surface{min-block-size:auto}kanban-board [draggable]{cursor:default}}story-map{display:block;container-type:inline-size}story-map:not(:defined){display:block}.sm-scroll{overflow-x:auto;overflow-y:visible;-webkit-overflow-scrolling:touch}.sm-columns{display:flex;gap:1px;background:var(--color-border, #e0e0e0);min-inline-size:min-content;border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-l, .75rem);overflow:hidden}.sm-column{min-inline-size:14rem;max-inline-size:22rem;flex:1 0 14rem;display:flex;flex-direction:column;background:var(--color-surface, #fff)}.sm-activity-header{position:sticky;inset-block-start:0;z-index:2;padding:var(--size-s, 12px) var(--size-m, 16px);background:var(--color-surface-raised, #f8f9fa);border-block-end:2px solid var(--color-border, #e0e0e0)}.sm-activity-header h3{margin:0;font-size:.875rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--color-text, #1a1a1a)}.sm-activity-count{font-size:.7rem;font-weight:600;color:var(--color-text-muted, #666);background:var(--color-border, #e0e0e0);border-radius:var(--radius-full, 9999px);padding:1px 8px;margin-inline-start:8px}story-map drag-surface{padding:var(--size-s, 12px);min-block-size:8rem;flex:1}story-map drag-surface>*{margin-block-end:var(--size-xs, 8px)}story-map drag-surface>*:last-child{margin-block-end:0}.sm-empty{color:var(--color-text-muted, #888);font-size:.8rem;font-style:italic;padding:var(--size-s, 12px);margin:0}.sm-live-region{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}story-map[compact] .sm-column{min-inline-size:11rem;flex:1 0 11rem}story-map[compact] .sm-activity-header{padding:var(--size-xs, 8px) var(--size-s, 12px)}story-map[compact] .sm-activity-header h3{font-size:.75rem}story-map[compact] drag-surface{padding:var(--size-xs, 8px)}@container (max-width: 30rem){.sm-columns{flex-direction:column}.sm-column{max-inline-size:none}}@media(prefers-reduced-motion:reduce){.sm-scroll{scroll-behavior:auto}}@media print{.sm-scroll{overflow:visible}.sm-activity-header{position:static}.sm-columns{flex-wrap:wrap}.sm-column{break-inside:avoid}}gantt-chart{display:block;container-type:inline-size;font-family:var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif);line-height:1.5;color:var(--color-text, #1a1a1a)}gantt-chart:not([data-upgraded])>table{width:100%}.gc-title{font-size:var(--font-size-xl, 1.25rem);font-weight:700;margin-block-end:var(--size-s, .75rem)}.gc-container{border:1px solid var(--color-border, #e0e0e0);border-radius:var(--radius-m, .5rem);overflow:hidden;background:var(--color-surface, #ffffff)}.gc-timeline-header{display:flex;position:relative;border-block-end:1px solid var(--color-border, #e0e0e0);background:var(--color-surface-raised, #f8f9fa);min-height:32px}.gc-timeline-spacer{flex:0 0 var(--gc-task-width, 180px);border-inline-end:1px solid var(--color-border, #e0e0e0)}.gc-timeline-dates{flex:1;position:relative;min-height:32px}.gc-date-label{position:absolute;top:0;bottom:0;display:flex;align-items:center;font-size:11px;font-weight:600;color:var(--color-text-muted, #666666);padding-inline-start:6px;white-space:nowrap;border-inline-start:1px solid var(--color-border, #e0e0e0)}.gc-date-label:first-child{border-inline-start:none}.gc-body{display:flex;min-height:0}.gc-task-list{flex:0 0 var(--gc-task-width, 180px);border-inline-end:1px solid var(--color-border, #e0e0e0);overflow:hidden}.gc-task-row{display:flex;align-items:center;gap:6px;height:var(--gc-row-height, 36px);padding-inline:12px;border-block-end:1px solid color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent);font-size:var(--font-size-sm, .875rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.gc-task-row:last-child{border-block-end:none}.gc-task-name{overflow:hidden;text-overflow:ellipsis}.gc-task-dates{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.gc-group-header{display:flex;align-items:center;height:28px;padding-inline:12px;background:var(--color-surface-raised, #f8f9fa);border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-group-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted, #666666)}.gc-group-spacer{height:28px;background:var(--color-surface-raised, #f8f9fa);border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-bars{flex:1;position:relative;min-width:0;overflow-x:auto}.gc-grid-lines{position:absolute;inset:0;pointer-events:none}.gc-grid-line{position:absolute;top:0;bottom:0;width:1px;background:color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent)}.gc-bar-row{position:relative;height:var(--gc-row-height, 36px);border-block-end:1px solid color-mix(in srgb,var(--color-border, #e0e0e0) 50%,transparent)}.gc-bar-row:last-child{border-block-end:none}.gc-bar{position:absolute;top:6px;bottom:6px;border-radius:var(--radius-s, 4px);background:var(--gc-bar-color, var(--color-interactive, #0066cc));cursor:pointer;min-width:4px;display:flex;align-items:center;overflow:hidden;transition:filter .15s ease}.gc-bar:hover{filter:brightness(1.1)}.gc-bar:focus-visible{outline:2px solid var(--color-interactive, #0066cc);outline-offset:2px}.gc-bar-fill{height:100%;border-radius:inherit;background:color-mix(in srgb,var(--gc-bar-color, var(--color-interactive, #0066cc)) 65%,white);pointer-events:none}.gc-bar-label{position:absolute;inset:0;display:flex;align-items:center;padding-inline:6px;font-size:11px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}.gc-bar[data-status=done]{--gc-bar-color: var(--color-success, #16a34a)}.gc-bar[data-status=blocked]{--gc-bar-color: var(--color-error, #dc2626)}.gc-bar[data-status=not-started]{--gc-bar-color: var(--color-text-muted, #666666);opacity:.6}.gc-milestone{position:absolute;top:50%;width:14px;height:14px;transform:translate(-50%,-50%) rotate(45deg);background:var(--gc-bar-color, var(--color-interactive, #0066cc));border:2px solid var(--color-surface, #ffffff);cursor:pointer}.gc-milestone:focus-visible{outline:2px solid var(--color-interactive, #0066cc);outline-offset:3px}.gc-milestone[data-status=done]{--gc-bar-color: var(--color-success, #16a34a)}.gc-today-line{position:absolute;top:0;bottom:0;width:2px;background:var(--color-error, #dc2626);z-index:5;pointer-events:none}.gc-today-label{position:absolute;top:-22px;left:50%;transform:translate(-50%);font-size:10px;font-weight:700;color:var(--color-error, #dc2626);white-space:nowrap}.gc-deps{position:absolute;inset:0;pointer-events:none;overflow:visible}.gc-dep-line{fill:none;stroke:var(--color-text-muted, #666666);stroke-width:1.5;marker-end:url(#gc-arrowhead)}.gc-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}gantt-chart[compact]{--gc-row-height: 28px;--gc-task-width: 140px}gantt-chart[compact] .gc-task-row{font-size:12px;padding-inline:8px}gantt-chart[compact] .gc-bar{top:5px;bottom:5px}gantt-chart[compact] .gc-group-header{height:24px}gantt-chart[compact] .gc-group-spacer{height:24px}@container (max-width: 30rem){.gc-body{flex-direction:column}.gc-task-list{flex:none;border-inline-end:none;border-block-end:1px solid var(--color-border, #e0e0e0)}.gc-task-row{height:auto;padding-block:4px}.gc-timeline-spacer{display:none}}@media(prefers-reduced-motion:reduce){.gc-bar{transition:none}}@media print{gantt-chart[data-upgraded] .gc-container,gantt-chart[data-upgraded] .gc-title{display:none}gantt-chart[data-upgraded] .gc-sr-only{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto;white-space:normal}}::view-transition-old(*),::view-transition-new(*){animation-duration:.22s;animation-timing-function:ease-out}iron-triangle{display:block;inline-size:100%;max-inline-size:var(--iron-triangle-max, 26rem);margin-inline:auto;container-type:inline-size}iron-triangle>svg{inline-size:100%;block-size:auto;display:block}iron-triangle svg .triangle{fill:var(--iron-triangle-fill, color-mix(in oklab, var(--color-interactive) 8%, transparent));stroke:var(--iron-triangle-stroke, var(--color-interactive));stroke-width:var(--iron-triangle-stroke-width, 1.5);stroke-linejoin:round;pointer-events:none}iron-triangle svg .vertex,iron-triangle svg .center{cursor:pointer;outline:none}iron-triangle svg .vertex .hit,iron-triangle svg .center .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}iron-triangle svg .vertex:hover .hit,iron-triangle svg .vertex:focus-visible .hit,iron-triangle svg .center:hover .hit,iron-triangle svg .center:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1.5;stroke-dasharray:3 3}iron-triangle svg .vertex-name{font-size:.85rem;font-weight:var(--font-weight-semibold, 600);fill:var(--color-text);pointer-events:none}iron-triangle svg .vertex:hover .vertex-name,iron-triangle svg .vertex:focus-visible .vertex-name{fill:var(--color-interactive)}iron-triangle svg .vertex-summary{font-size:.7rem;fill:var(--color-text-muted);font-variant-numeric:tabular-nums;pointer-events:none}iron-triangle svg .capacity-backdrop{fill:var(--color-surface);stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;pointer-events:none}iron-triangle svg .quality-label{font-size:.65rem;font-weight:var(--font-weight-semibold, 600);fill:var(--color-interactive);text-transform:uppercase;letter-spacing:.06em;pointer-events:none}iron-triangle svg .capacity{font-size:var(--iron-triangle-capacity-size, 1.6rem);font-weight:var(--font-weight-bold, 700);fill:var(--color-text);font-variant-numeric:tabular-nums;pointer-events:none}iron-triangle svg .capacity-unit{font-size:.6rem;fill:var(--color-text-muted);pointer-events:none}iron-triangle svg .center .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}iron-triangle svg .center:hover .hit,iron-triangle svg .center:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1.5;stroke-dasharray:3 3}iron-triangle svg .center:hover .quality-label,iron-triangle svg .center:focus-visible .quality-label{fill:var(--color-interactive)}iron-triangle>.iron-triangle-status{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:var(--size-s, .75rem);margin-block-start:var(--size-xs, .5rem);font-size:var(--font-size-sm, .875rem)}iron-triangle>.iron-triangle-status .iron-triangle-readout{position:absolute;inline-size:1px;block-size:1px;margin:-1px;padding:0;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}iron-triangle>.iron-triangle-status .iron-triangle-mode{font-size:inherit}iron-triangle>.iron-triangle-status .iron-triangle-mode[aria-pressed=true]{border-color:var(--color-interactive);color:var(--color-interactive)}iron-triangle>.iron-triangle-status .iron-triangle-warning{margin:0;padding:var(--size-2xs, .25rem) var(--size-xs, .5rem);border-radius:var(--radius-s, .25rem);border:var(--border-width-thin, 1px) solid var(--iron-triangle-warning-color, var(--color-warning));color:var(--iron-triangle-warning-color, var(--color-warning));font-weight:var(--font-weight-semibold, 600)}iron-triangle>.iron-triangle-status .iron-triangle-warning:before{content:"\26a0\fe0e "}iron-triangle>dialog.iron-triangle-dialog [hidden]{display:none}iron-triangle>dialog.iron-triangle-dialog .iron-triangle-dialog__hint{margin:0;color:var(--color-text-muted);font-size:var(--font-size-sm, .875rem)}iron-triangle:state(over-deadline) svg .triangle{stroke:var(--iron-triangle-warning-color, var(--color-warning))}iron-triangle:state(unbudgeted) svg .capacity{fill:var(--iron-triangle-warning-color, var(--color-warning))}iron-triangle[disabled],iron-triangle[locked]{opacity:.85;pointer-events:none}iron-triangle>dialog.iron-triangle-dialog{inline-size:min(28rem,92vw);border:var(--border-width-thin, 1px) solid var(--color-border);border-radius:var(--radius-l, .75rem);padding:var(--size-l, 1.5rem);background:var(--color-surface);color:var(--color-text)}iron-triangle>dialog.iron-triangle-dialog::backdrop{background:oklch(from var(--color-surface) l c h / .5);backdrop-filter:blur(2px)}iron-triangle>dialog.iron-triangle-dialog h3{margin:0 0 var(--size-m) 0;font-size:var(--font-size-l, 1.125rem)}capacity-plan{display:block;inline-size:100%;max-inline-size:var(--capacity-plan-max, 32rem);margin-inline:auto}capacity-plan .capacity-ledger{display:grid;grid-template-columns:minmax(8rem,14rem) 1fr;gap:var(--size-2xs, .25rem) var(--size-m, 1rem);margin:0}capacity-plan .capacity-ledger>div{display:contents}capacity-plan .capacity-ledger dt{font-weight:var(--font-weight-semibold, 600);color:var(--color-text)}capacity-plan .capacity-ledger .num{margin:0;font-variant-numeric:tabular-nums;color:var(--color-text-muted);text-align:end;padding-inline-end:var(--size-s)}capacity-plan .capacity-ledger .bar{margin:0;align-self:center}capacity-plan .bar-track{display:block;inline-size:100%;block-size:.6rem;background:var(--color-surface-raised, color-mix(in oklab, var(--color-surface) 92%, currentColor 8%));border-radius:var(--radius-pill, 999px);overflow:hidden}capacity-plan .bar-fill{display:block;block-size:100%;inline-size:var(--w, 0%);border-radius:inherit;transition:inline-size .2s ease}capacity-plan .bar-capacity{background:color-mix(in oklab,var(--color-text) 25%,transparent)}capacity-plan .bar-quality{background:var(--color-interactive)}capacity-plan .bar-features{background:var(--color-success)}capacity-plan .bar-slack{background:color-mix(in oklab,var(--color-text-muted) 35%,transparent)}capacity-plan [data-row=slack][data-state=over] .num{color:var(--color-error);font-weight:var(--font-weight-semibold, 600)}capacity-plan [data-row=slack][data-state=over] .bar-slack{background:var(--color-error)}capacity-plan:state(overdrawn) .capacity-ledger{outline:2px solid var(--color-error);outline-offset:var(--size-2xs);border-radius:var(--radius-m)}quality-target{display:block;inline-size:100%;max-inline-size:var(--quality-target-max, 36rem);margin-inline:auto;container-type:inline-size}quality-target>svg{inline-size:100%;block-size:auto;display:block}quality-target svg .ring{fill:none;stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;stroke-dasharray:3 3;pointer-events:none}quality-target svg .ring-critical{stroke:color-mix(in oklab,var(--color-error) 60%,transparent)}quality-target svg .ring-important{stroke:color-mix(in oklab,var(--color-warning) 50%,transparent)}quality-target svg .ring-acceptable{stroke:color-mix(in oklab,var(--color-success) 50%,transparent)}quality-target svg .spoke{stroke:var(--color-border, #e5e7eb);stroke-width:.75;stroke-dasharray:1 4;pointer-events:none}quality-target svg .vector{fill:var(--quality-target-vector-fill, color-mix(in oklab, var(--color-interactive) 22%, transparent));stroke:var(--quality-target-vector-stroke, var(--color-interactive));stroke-width:1.5;stroke-linejoin:round;pointer-events:none}quality-target svg .vector-spoke{stroke:var(--quality-target-vector-stroke, var(--color-interactive));stroke-width:2;stroke-linecap:round;pointer-events:none}quality-target svg .axis{cursor:pointer;outline:none}quality-target svg .axis .hit{fill:transparent;stroke:transparent;transition:fill .12s ease,stroke .12s ease}quality-target svg .axis:hover .hit,quality-target svg .axis:focus-visible .hit{fill:color-mix(in oklab,var(--color-interactive) 8%,transparent);stroke:var(--color-interactive);stroke-width:1;stroke-dasharray:2 2}quality-target svg .axis-label{font-size:var(--quality-target-label-size, .625rem);fill:var(--color-text-muted);letter-spacing:.02em;pointer-events:none;font-weight:var(--font-weight-regular, 400)}quality-target svg .axis[data-level] .axis-label{font-weight:var(--font-weight-semibold, 600)}quality-target svg .axis[data-level=critical] .axis-label{fill:var(--color-error, #dc2626)}quality-target svg .axis[data-level=important] .axis-label{fill:var(--color-warning, #b45309)}quality-target svg .axis[data-level=acceptable] .axis-label{fill:var(--color-success, #15803d)}quality-target svg .axis[data-level=not-relevant] .axis-label{fill:var(--color-text-muted, #6b7280);text-decoration:line-through;font-weight:var(--font-weight-regular, 400)}quality-target svg .axis .marker{fill:var(--color-interactive);stroke:var(--color-surface);stroke-width:1;pointer-events:none}quality-target svg .axis[data-level=critical] .marker{fill:var(--color-error, #dc2626)}quality-target svg .axis[data-level=important] .marker{fill:var(--color-warning, #b45309)}quality-target svg .axis[data-level=acceptable] .marker{fill:var(--color-success, #16a34a)}quality-target svg .axis[data-level=not-relevant] .marker{fill:var(--color-text-muted, #6b7280);opacity:.5}quality-target svg .capacity-backdrop{fill:var(--color-surface);stroke:var(--color-border-muted, var(--color-border, #e5e7eb));stroke-width:1;pointer-events:none}quality-target svg .capacity-sum{font-size:var(--quality-target-capacity-size, 1.25rem);font-weight:var(--font-weight-bold, 700);fill:var(--color-text);font-variant-numeric:tabular-nums;pointer-events:none}quality-target svg .capacity-denom{font-size:.55rem;fill:var(--color-text-muted);font-variant-numeric:tabular-nums;pointer-events:none}quality-target svg .center[data-over] .capacity-sum{fill:var(--color-error)}quality-target:state(over-budget) svg .vector{stroke:var(--color-warning)}quality-target .quality-footer{margin-block-start:var(--size-m, 1rem)}quality-target [data-quality-overrun]{padding:var(--size-m, 1rem);border:var(--border-width-thin, 1px) solid var(--color-error);border-radius:var(--radius-m);background:var(--color-error-subtle, oklch(95% .05 27));display:grid;gap:var(--size-2xs, .25rem)}quality-target [data-quality-overrun][hidden]{display:none}quality-target [data-quality-errors]{display:none}quality-target:state(missing-rationale) [data-quality-errors]{display:block}quality-target>dialog.quality-dialog{inline-size:min(28rem,92vw);border:var(--border-width-thin, 1px) solid var(--color-border);border-radius:var(--radius-l, .75rem);padding:var(--size-l, 1.5rem);background:var(--color-surface);color:var(--color-text)}quality-target>dialog.quality-dialog::backdrop{background:oklch(from var(--color-surface) l c h / .5);backdrop-filter:blur(2px)}quality-target>dialog.quality-dialog h3{margin:0 0 var(--size-m) 0;font-size:var(--font-size-l, 1.125rem)}quality-target>dialog.quality-dialog fieldset{border:1px solid var(--color-border-muted, var(--color-border))}quality-target[disabled],quality-target[locked]{opacity:.85;pointer-events:none}
|