@profpowell/vb-project-planning 0.2.0 → 0.2.1
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/dist/vb-project-planning.css +14 -1
- package/dist/vb-project-planning.js +144 -20
- package/dist/vb-project-planning.min.css +1 -1
- package/dist/vb-project-planning.min.js +91 -91
- package/package.json +1 -1
- package/src/web-components/iron-triangle/_capacity.js +1 -1
- package/src/web-components/iron-triangle/_triangle-geometry.js +1 -1
- package/src/web-components/iron-triangle/api.json +2 -2
- package/src/web-components/iron-triangle/logic.js +47 -9
- package/src/web-components/iron-triangle/styles.css +22 -1
- package/src/web-components/quality-target/api.json +2 -3
- package/src/web-components/quality-target/logic.js +85 -13
- package/src/web-components/requirement-card/api.json +1 -1
- package/src/web-components/requirement-card/logic.js +26 -2
- package/src/web-components/requirement-card/static.html +1 -1
|
@@ -1343,10 +1343,20 @@ iron-triangle > .iron-triangle-status .iron-triangle-readout {
|
|
|
1343
1343
|
}
|
|
1344
1344
|
iron-triangle > .iron-triangle-status .iron-triangle-mode {
|
|
1345
1345
|
font-size: inherit;
|
|
1346
|
+
font-weight: var(--font-weight-normal, 400);
|
|
1347
|
+
padding-block: 0;
|
|
1348
|
+
padding-inline: var(--size-xs, 0.5rem);
|
|
1349
|
+
border-color: transparent;
|
|
1350
|
+
color: var(--color-text-muted);
|
|
1351
|
+
}
|
|
1352
|
+
iron-triangle > .iron-triangle-status .iron-triangle-mode:hover {
|
|
1353
|
+
color: var(--color-text);
|
|
1346
1354
|
}
|
|
1347
1355
|
iron-triangle > .iron-triangle-status .iron-triangle-mode[aria-pressed=true] {
|
|
1348
|
-
border-color: var(--color-interactive);
|
|
1349
1356
|
color: var(--color-interactive);
|
|
1357
|
+
text-decoration: underline;
|
|
1358
|
+
text-decoration-thickness: var(--border-width-medium, 2px);
|
|
1359
|
+
text-underline-offset: 0.25em;
|
|
1350
1360
|
}
|
|
1351
1361
|
iron-triangle > .iron-triangle-status .iron-triangle-warning {
|
|
1352
1362
|
margin: 0;
|
|
@@ -1378,6 +1388,9 @@ iron-triangle[locked] {
|
|
|
1378
1388
|
opacity: 0.85;
|
|
1379
1389
|
pointer-events: none;
|
|
1380
1390
|
}
|
|
1391
|
+
iron-triangle[locked]:not([disabled]) svg .center[data-target=quality] {
|
|
1392
|
+
pointer-events: auto;
|
|
1393
|
+
}
|
|
1381
1394
|
iron-triangle > dialog.iron-triangle-dialog {
|
|
1382
1395
|
inline-size: min(28rem, 92vw);
|
|
1383
1396
|
border: var(--border-width-thin, 1px) solid var(--color-border);
|
|
@@ -9350,7 +9350,7 @@ function buildTriangleSvg({
|
|
|
9350
9350
|
center.setAttribute("role", "button");
|
|
9351
9351
|
center.setAttribute(
|
|
9352
9352
|
"aria-label",
|
|
9353
|
-
`Quality \u2014 ${formatQualitySummary(qualitySummary)}. Activate to open the
|
|
9353
|
+
`Quality \u2014 ${formatQualitySummary(qualitySummary)}. Activate to open the quality decision.`
|
|
9354
9354
|
);
|
|
9355
9355
|
const backdrop = document.createElementNS(SVG_NS, "circle");
|
|
9356
9356
|
backdrop.setAttribute("class", "capacity-backdrop");
|
|
@@ -9587,7 +9587,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9587
9587
|
}
|
|
9588
9588
|
/** Imperatively open a vertex editor. */
|
|
9589
9589
|
openEditor(axis) {
|
|
9590
|
-
if (!SECTIONS.includes(axis)) return;
|
|
9590
|
+
if (!SECTIONS.includes(axis) || this.#inert) return;
|
|
9591
9591
|
const dialog = this.#ensureDialog(axis);
|
|
9592
9592
|
if (typeof dialog.showModal === "function") dialog.showModal();
|
|
9593
9593
|
else dialog.setAttribute("open", "");
|
|
@@ -9653,7 +9653,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9653
9653
|
const center = event.target.closest?.('.center[data-target="quality"]');
|
|
9654
9654
|
if (center && this.contains(center)) {
|
|
9655
9655
|
event.preventDefault();
|
|
9656
|
-
this.#fireQualityOpen();
|
|
9656
|
+
if (!this.hasAttribute("disabled")) this.#fireQualityOpen();
|
|
9657
9657
|
}
|
|
9658
9658
|
}
|
|
9659
9659
|
#onKeydown(event) {
|
|
@@ -9667,7 +9667,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9667
9667
|
const center = event.target.closest?.('.center[data-target="quality"]');
|
|
9668
9668
|
if (center && this.contains(center)) {
|
|
9669
9669
|
event.preventDefault();
|
|
9670
|
-
this.#fireQualityOpen();
|
|
9670
|
+
if (!this.hasAttribute("disabled")) this.#fireQualityOpen();
|
|
9671
9671
|
}
|
|
9672
9672
|
}
|
|
9673
9673
|
#fireQualityOpen() {
|
|
@@ -9723,6 +9723,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9723
9723
|
dialog.close("save");
|
|
9724
9724
|
this.#recompute({ source: "dialog", field: axis });
|
|
9725
9725
|
});
|
|
9726
|
+
this.#syncDisabledLocked();
|
|
9726
9727
|
return dialog;
|
|
9727
9728
|
}
|
|
9728
9729
|
#captureDialog(axis, form) {
|
|
@@ -9803,6 +9804,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9803
9804
|
const existing = this.querySelector(":scope > svg");
|
|
9804
9805
|
if (existing) existing.replaceWith(svg);
|
|
9805
9806
|
else this.prepend(svg);
|
|
9807
|
+
this.#syncHitTargetsInert();
|
|
9806
9808
|
this.dataset.capacityPoints = String(this.#value.capacityPoints);
|
|
9807
9809
|
this.dataset.capacitySource = this.#value.capacitySource;
|
|
9808
9810
|
}
|
|
@@ -9824,12 +9826,40 @@ var IronTriangle = class extends VBElement {
|
|
|
9824
9826
|
} catch {
|
|
9825
9827
|
}
|
|
9826
9828
|
}
|
|
9829
|
+
get #inert() {
|
|
9830
|
+
return this.hasAttribute("disabled") || this.hasAttribute("locked");
|
|
9831
|
+
}
|
|
9832
|
+
/**
|
|
9833
|
+
* disabled / locked: no editing path stays open. styles.css already sets
|
|
9834
|
+
* pointer-events: none; this closes the keyboard and programmatic paths
|
|
9835
|
+
* (vertex targets leave the tab order, openEditor() is a no-op) and
|
|
9836
|
+
* disables the mode switch and every dialog control, including dialogs
|
|
9837
|
+
* built later.
|
|
9838
|
+
*
|
|
9839
|
+
* The centre Quality target is navigation, not editing, so under `locked`
|
|
9840
|
+
* it stays focusable and clickable (styles.css re-enables its pointer).
|
|
9841
|
+
* Under `disabled` it goes inert too: browsers suppress mouse events
|
|
9842
|
+
* inside a disabled form-associated element, so keeping only its
|
|
9843
|
+
* keyboard path alive would be inconsistent.
|
|
9844
|
+
*/
|
|
9827
9845
|
#syncDisabledLocked() {
|
|
9828
|
-
const off = this
|
|
9846
|
+
const off = this.#inert;
|
|
9829
9847
|
if (this.#modeButton) this.#modeButton.disabled = off;
|
|
9830
9848
|
for (const dialog of Object.values(this.#dialogs)) {
|
|
9831
9849
|
for (const el of dialog.querySelectorAll("input, select, textarea, button")) el.disabled = off;
|
|
9832
9850
|
}
|
|
9851
|
+
this.#syncHitTargetsInert();
|
|
9852
|
+
}
|
|
9853
|
+
/** Hit targets follow disabled / locked across re-renders. */
|
|
9854
|
+
#syncHitTargetsInert() {
|
|
9855
|
+
const editingOff = this.#inert;
|
|
9856
|
+
const navOff = this.hasAttribute("disabled");
|
|
9857
|
+
for (const target of this.querySelectorAll(':scope > svg [role="button"][tabindex]')) {
|
|
9858
|
+
const off = target.matches('.center[data-target="quality"]') ? navOff : editingOff;
|
|
9859
|
+
target.setAttribute("tabindex", off ? "-1" : "0");
|
|
9860
|
+
if (off) target.setAttribute("aria-disabled", "true");
|
|
9861
|
+
else target.removeAttribute("aria-disabled");
|
|
9862
|
+
}
|
|
9833
9863
|
}
|
|
9834
9864
|
// ── Internal: status strip (a11y hooks) ──────────────────────────
|
|
9835
9865
|
/**
|
|
@@ -9846,7 +9876,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9846
9876
|
readout.setAttribute("aria-atomic", "true");
|
|
9847
9877
|
const button = document.createElement("button");
|
|
9848
9878
|
button.type = "button";
|
|
9849
|
-
button.className = "iron-triangle-mode";
|
|
9879
|
+
button.className = "iron-triangle-mode ghost";
|
|
9850
9880
|
button.setAttribute("aria-pressed", "false");
|
|
9851
9881
|
button.textContent = "Manual capacity";
|
|
9852
9882
|
button.addEventListener("click", () => this.#openCapacityDialog());
|
|
@@ -9876,10 +9906,9 @@ var IronTriangle = class extends VBElement {
|
|
|
9876
9906
|
if (this.#readout.textContent !== text) this.#readout.textContent = text;
|
|
9877
9907
|
if (this.#modeButton) {
|
|
9878
9908
|
this.#modeButton.setAttribute("aria-pressed", manual ? "true" : "false");
|
|
9879
|
-
|
|
9880
|
-
|
|
9881
|
-
|
|
9882
|
-
);
|
|
9909
|
+
const label = manual && capacityPoints > 0 ? `Manual capacity: ${capacityPoints} pts` : "Manual capacity";
|
|
9910
|
+
if (this.#modeButton.textContent !== label) this.#modeButton.textContent = label;
|
|
9911
|
+
this.#modeButton.setAttribute("aria-label", manual ? `${label}. Activate to edit or return to the formula.` : `${label}. Activate to override the formula with a fixed number.`);
|
|
9883
9912
|
}
|
|
9884
9913
|
if (this.#deadlineWarning) {
|
|
9885
9914
|
this.#deadlineWarning.textContent = overDeadline ? `Deadline has passed (${deadline})` : "";
|
|
@@ -9961,6 +9990,7 @@ var IronTriangle = class extends VBElement {
|
|
|
9961
9990
|
dialog.close("save");
|
|
9962
9991
|
if (Number.isFinite(n) && n > 0) this.setManual(n);
|
|
9963
9992
|
});
|
|
9993
|
+
this.#syncDisabledLocked();
|
|
9964
9994
|
return dialog;
|
|
9965
9995
|
}
|
|
9966
9996
|
// ── Internal: revise() field accessors ───────────────────────────
|
|
@@ -10576,6 +10606,7 @@ function anchorFor(p) {
|
|
|
10576
10606
|
}
|
|
10577
10607
|
|
|
10578
10608
|
// src/web-components/quality-target/logic.js
|
|
10609
|
+
var instanceCount = 0;
|
|
10579
10610
|
var QualityTarget = class extends VBElement {
|
|
10580
10611
|
static formAssociated = true;
|
|
10581
10612
|
static get observedAttributes() {
|
|
@@ -10584,7 +10615,6 @@ var QualityTarget = class extends VBElement {
|
|
|
10584
10615
|
"data-capacity-points",
|
|
10585
10616
|
"data-cost-weights",
|
|
10586
10617
|
"data-radius",
|
|
10587
|
-
"data-show-envelope",
|
|
10588
10618
|
"data-min-rationale",
|
|
10589
10619
|
"data-max-rationale",
|
|
10590
10620
|
"data-min-overrun-rationale",
|
|
@@ -10615,6 +10645,9 @@ var QualityTarget = class extends VBElement {
|
|
|
10615
10645
|
#dialogs = {};
|
|
10616
10646
|
/** @type {HTMLElement | null} */
|
|
10617
10647
|
#footer = null;
|
|
10648
|
+
/** Per-instance prefix so generated label/control ids never collide
|
|
10649
|
+
* when a page holds more than one target. */
|
|
10650
|
+
#uid = `quality-target-${++instanceCount}`;
|
|
10618
10651
|
constructor() {
|
|
10619
10652
|
super();
|
|
10620
10653
|
this.#internals = this.attachInternals();
|
|
@@ -10625,6 +10658,7 @@ var QualityTarget = class extends VBElement {
|
|
|
10625
10658
|
this.#bindToTriangle();
|
|
10626
10659
|
this.#renderViz();
|
|
10627
10660
|
this.#ensureFooter();
|
|
10661
|
+
this.#publishFormValue();
|
|
10628
10662
|
this.listen(this, "click", (e) => this.#onClick(e));
|
|
10629
10663
|
this.listen(this, "keydown", (e) => this.#onKeydown(e));
|
|
10630
10664
|
this.listen(this, "input", (e) => this.#onFooterInput(e));
|
|
@@ -10643,8 +10677,11 @@ var QualityTarget = class extends VBElement {
|
|
|
10643
10677
|
} else if (name === "data-cost-weights") {
|
|
10644
10678
|
this.#refreshCostWeights();
|
|
10645
10679
|
this.#renderViz();
|
|
10646
|
-
} else if (name === "data-radius"
|
|
10680
|
+
} else if (name === "data-radius") {
|
|
10647
10681
|
this.#renderViz();
|
|
10682
|
+
} else if (name === "data-min-overrun-rationale" || name === "data-max-overrun-rationale") {
|
|
10683
|
+
this.#updateFooter();
|
|
10684
|
+
this.#publishFormValue();
|
|
10648
10685
|
} else if (name === "disabled" || name === "locked") {
|
|
10649
10686
|
this.#syncDisabledLocked();
|
|
10650
10687
|
}
|
|
@@ -10716,7 +10753,7 @@ var QualityTarget = class extends VBElement {
|
|
|
10716
10753
|
}
|
|
10717
10754
|
/** Imperatively open one axis's editor. */
|
|
10718
10755
|
openEditor(ility) {
|
|
10719
|
-
if (!this.#ilities.includes(ility)) return;
|
|
10756
|
+
if (!this.#ilities.includes(ility) || this.#inert) return;
|
|
10720
10757
|
const dialog = this.#ensureDialog(ility);
|
|
10721
10758
|
if (typeof dialog.showModal === "function") dialog.showModal();
|
|
10722
10759
|
else dialog.setAttribute("open", "");
|
|
@@ -10794,10 +10831,10 @@ var QualityTarget = class extends VBElement {
|
|
|
10794
10831
|
form.append(fs);
|
|
10795
10832
|
const ff = document.createElement("form-field");
|
|
10796
10833
|
const rl = document.createElement("label");
|
|
10797
|
-
rl.setAttribute("for",
|
|
10834
|
+
rl.setAttribute("for", `${this.#uid}-${ility}-rationale`);
|
|
10798
10835
|
rl.textContent = "Rationale (required when Critical)";
|
|
10799
10836
|
const ta = document.createElement("textarea");
|
|
10800
|
-
ta.id =
|
|
10837
|
+
ta.id = `${this.#uid}-${ility}-rationale`;
|
|
10801
10838
|
ta.name = "rationale";
|
|
10802
10839
|
ta.rows = 3;
|
|
10803
10840
|
ta.minLength = this.#minRationale();
|
|
@@ -10851,6 +10888,7 @@ var QualityTarget = class extends VBElement {
|
|
|
10851
10888
|
this.#publish("dialog", ility);
|
|
10852
10889
|
});
|
|
10853
10890
|
this.#syncDialogFromState(ility);
|
|
10891
|
+
this.#syncDisabledLocked();
|
|
10854
10892
|
return dialog;
|
|
10855
10893
|
}
|
|
10856
10894
|
#syncDialogFromState(ility) {
|
|
@@ -10893,8 +10931,8 @@ var QualityTarget = class extends VBElement {
|
|
|
10893
10931
|
<strong>Over budget \u2014 explain why.</strong>
|
|
10894
10932
|
<small data-overrun-prompt></small>
|
|
10895
10933
|
<form-field>
|
|
10896
|
-
<label for="
|
|
10897
|
-
<textarea id="
|
|
10934
|
+
<label for="${this.#uid}-overrun">Overrun rationale (\u2265 ${this.#minOverrunRationale()} chars)</label>
|
|
10935
|
+
<textarea id="${this.#uid}-overrun" name="overrunRationale"
|
|
10898
10936
|
minlength="${this.#minOverrunRationale()}"
|
|
10899
10937
|
maxlength="${this.#maxOverrunRationale()}"
|
|
10900
10938
|
rows="3"></textarea>
|
|
@@ -10908,6 +10946,7 @@ var QualityTarget = class extends VBElement {
|
|
|
10908
10946
|
footer.append(errors);
|
|
10909
10947
|
this.append(footer);
|
|
10910
10948
|
this.#footer = footer;
|
|
10949
|
+
this.#syncDisabledLocked();
|
|
10911
10950
|
}
|
|
10912
10951
|
#updateFooter() {
|
|
10913
10952
|
if (!this.#footer) return;
|
|
@@ -10921,8 +10960,20 @@ var QualityTarget = class extends VBElement {
|
|
|
10921
10960
|
if (overrun) {
|
|
10922
10961
|
overrun.hidden = !isOver;
|
|
10923
10962
|
const prompt = overrun.querySelector("[data-overrun-prompt]");
|
|
10924
|
-
if (prompt
|
|
10925
|
-
|
|
10963
|
+
if (prompt) {
|
|
10964
|
+
const over = sum - cap;
|
|
10965
|
+
prompt.textContent = isOver ? `You're over budget by ${over} ${over === 1 ? "point" : "points"} (${sum}/${cap}).` : "";
|
|
10966
|
+
}
|
|
10967
|
+
const min = this.#minOverrunRationale();
|
|
10968
|
+
const label = overrun.querySelector("label");
|
|
10969
|
+
if (label) label.textContent = `Overrun rationale (\u2265 ${min} chars)`;
|
|
10970
|
+
const ta = (
|
|
10971
|
+
/** @type {HTMLTextAreaElement | null} */
|
|
10972
|
+
overrun.querySelector("textarea")
|
|
10973
|
+
);
|
|
10974
|
+
if (ta) {
|
|
10975
|
+
ta.minLength = min;
|
|
10976
|
+
ta.maxLength = this.#maxOverrunRationale();
|
|
10926
10977
|
}
|
|
10927
10978
|
}
|
|
10928
10979
|
}
|
|
@@ -11005,6 +11056,7 @@ var QualityTarget = class extends VBElement {
|
|
|
11005
11056
|
const existing = this.querySelector(":scope > svg");
|
|
11006
11057
|
if (existing) existing.replaceWith(svg);
|
|
11007
11058
|
else this.prepend(svg);
|
|
11059
|
+
this.#syncAxesInert();
|
|
11008
11060
|
}
|
|
11009
11061
|
#publish(source, field) {
|
|
11010
11062
|
this.#renderViz();
|
|
@@ -11031,14 +11083,67 @@ var QualityTarget = class extends VBElement {
|
|
|
11031
11083
|
this.#internals.setFormValue(JSON.stringify(this.value));
|
|
11032
11084
|
} catch {
|
|
11033
11085
|
}
|
|
11086
|
+
this.#syncValidity();
|
|
11087
|
+
}
|
|
11088
|
+
/**
|
|
11089
|
+
* Mirror validateVector() into ElementInternals so a parent <form>'s
|
|
11090
|
+
* checkValidity() / submit is blocked too, not just this element's own
|
|
11091
|
+
* checkValidity() method. The overrun textarea anchors the message when
|
|
11092
|
+
* the overrun rationale is the problem.
|
|
11093
|
+
*/
|
|
11094
|
+
#syncValidity() {
|
|
11095
|
+
if (typeof this.#internals.setValidity !== "function") return;
|
|
11096
|
+
const { valid, errors } = validateVector({
|
|
11097
|
+
vector: this.#vector,
|
|
11098
|
+
rationales: this.#rationales,
|
|
11099
|
+
costWeights: this.#costWeights,
|
|
11100
|
+
capacityPoints: this.#resolveCapacity(),
|
|
11101
|
+
overrunRationale: this.#overrunRationale,
|
|
11102
|
+
minRationale: this.#minRationale(),
|
|
11103
|
+
minOverrunRationale: this.#minOverrunRationale()
|
|
11104
|
+
});
|
|
11105
|
+
if (valid) {
|
|
11106
|
+
this.#internals.setValidity({});
|
|
11107
|
+
return;
|
|
11108
|
+
}
|
|
11109
|
+
const overrunTa = (
|
|
11110
|
+
/** @type {HTMLElement | null} */
|
|
11111
|
+
this.overBudget ? this.querySelector("[data-quality-overrun] textarea") : null
|
|
11112
|
+
);
|
|
11113
|
+
try {
|
|
11114
|
+
this.#internals.setValidity({ customError: true }, errors.join(" "), overrunTa ?? void 0);
|
|
11115
|
+
} catch {
|
|
11116
|
+
this.#internals.setValidity({ customError: true }, errors.join(" "));
|
|
11117
|
+
}
|
|
11118
|
+
}
|
|
11119
|
+
get #inert() {
|
|
11120
|
+
return this.hasAttribute("disabled") || this.hasAttribute("locked");
|
|
11034
11121
|
}
|
|
11122
|
+
/**
|
|
11123
|
+
* disabled / locked: no editing path stays open. styles.css already sets
|
|
11124
|
+
* pointer-events: none; this closes the keyboard and programmatic paths
|
|
11125
|
+
* (axes leave the tab order, openEditor() is a no-op) and disables every
|
|
11126
|
+
* dialog and footer control, including dialogs built later.
|
|
11127
|
+
*/
|
|
11035
11128
|
#syncDisabledLocked() {
|
|
11036
|
-
const off = this
|
|
11129
|
+
const off = this.#inert;
|
|
11037
11130
|
for (const dialog of Object.values(this.#dialogs)) {
|
|
11038
11131
|
for (const el of dialog.querySelectorAll("input, textarea, select, button")) {
|
|
11039
11132
|
el.disabled = off;
|
|
11040
11133
|
}
|
|
11041
11134
|
}
|
|
11135
|
+
for (const el of this.#footer?.querySelectorAll("textarea") ?? []) {
|
|
11136
|
+
el.disabled = off;
|
|
11137
|
+
}
|
|
11138
|
+
this.#syncAxesInert();
|
|
11139
|
+
}
|
|
11140
|
+
#syncAxesInert() {
|
|
11141
|
+
const off = this.#inert;
|
|
11142
|
+
for (const axis of this.querySelectorAll(":scope > svg .axis[data-ility]")) {
|
|
11143
|
+
axis.setAttribute("tabindex", off ? "-1" : "0");
|
|
11144
|
+
if (off) axis.setAttribute("aria-disabled", "true");
|
|
11145
|
+
else axis.removeAttribute("aria-disabled");
|
|
11146
|
+
}
|
|
11042
11147
|
}
|
|
11043
11148
|
// ── Internal: config readers ──────────────────────────────────────
|
|
11044
11149
|
#minRationale() {
|
|
@@ -11193,6 +11298,8 @@ var TEMPLATE = `
|
|
|
11193
11298
|
</article>
|
|
11194
11299
|
`;
|
|
11195
11300
|
var RequirementCard = class extends VBElement {
|
|
11301
|
+
/** True when this element added role="button" itself (so it may remove it). */
|
|
11302
|
+
#ownsRole = false;
|
|
11196
11303
|
static get observedAttributes() {
|
|
11197
11304
|
return ["data-priority", "data-conflict", "tabindex"];
|
|
11198
11305
|
}
|
|
@@ -11215,6 +11322,15 @@ var RequirementCard = class extends VBElement {
|
|
|
11215
11322
|
this.#syncDefaultPill();
|
|
11216
11323
|
this.#syncInteractive();
|
|
11217
11324
|
this.listen(this, "click", (e) => this.#onActivate(e));
|
|
11325
|
+
const wrapper = this.closest("a[href], button");
|
|
11326
|
+
if (wrapper) {
|
|
11327
|
+
this.listen(wrapper, "click", (e) => {
|
|
11328
|
+
if (!this.contains(
|
|
11329
|
+
/** @type {Node} */
|
|
11330
|
+
e.target
|
|
11331
|
+
)) this.#onActivate(e);
|
|
11332
|
+
});
|
|
11333
|
+
}
|
|
11218
11334
|
this.listen(this, "keydown", (e) => {
|
|
11219
11335
|
const ke = (
|
|
11220
11336
|
/** @type {KeyboardEvent} */
|
|
@@ -11274,6 +11390,14 @@ var RequirementCard = class extends VBElement {
|
|
|
11274
11390
|
}
|
|
11275
11391
|
#syncInteractive() {
|
|
11276
11392
|
this.setState("interactive", !!this.#interactive);
|
|
11393
|
+
const needsRole = this.hasAttribute("tabindex") && !this.closest("a[href], button");
|
|
11394
|
+
if (needsRole && !this.hasAttribute("role")) {
|
|
11395
|
+
this.setAttribute("role", "button");
|
|
11396
|
+
this.#ownsRole = true;
|
|
11397
|
+
} else if (!needsRole && this.#ownsRole) {
|
|
11398
|
+
this.removeAttribute("role");
|
|
11399
|
+
this.#ownsRole = false;
|
|
11400
|
+
}
|
|
11277
11401
|
}
|
|
11278
11402
|
#onActivate(event) {
|
|
11279
11403
|
if (!this.#interactive) return;
|
|
@@ -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>.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}
|
|
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;font-weight:var(--font-weight-normal, 400);padding-block:0;padding-inline:var(--size-xs, .5rem);border-color:transparent;color:var(--color-text-muted)}iron-triangle>.iron-triangle-status .iron-triangle-mode:hover{color:var(--color-text)}iron-triangle>.iron-triangle-status .iron-triangle-mode[aria-pressed=true]{color:var(--color-interactive);text-decoration:underline;text-decoration-thickness:var(--border-width-medium, 2px);text-underline-offset:.25em}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[locked]:not([disabled]) svg .center[data-target=quality]{pointer-events:auto}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}
|