FN-7633: pin equal explicit heights for Priority, Execution-mode, and Oversight controls

Align the Priority chip, Execution-mode toggle, and Oversight dropdown trigger to the exact same box height in the task detail metadata cluster, closing a gap where a shared min-height floor still let controls diverge.

- Add explicit `height: var(--detail-priority-control-min-height)` to `.detail-priority-chip`, `.detail-execution-mode-toggle`, and `.detail-oversight-menu-trigger` alongside the existing `min-height`, so none can outgrow or undershoot the others regardless of flex stretch/content differences
- Keep `min-height` as a safety-net floor for edge cases like font scaling
- Add regression test asserting all three controls share the same fixed height token on desktop and mobile, and that the Oversight popover itself remains unaffected
- Add changeset documenting the fix as a patch-level bug fix

Files changed:
 .../fn-7633-priority-execution-oversight-height.md |  7 ++++
 .../dashboard/app/components/TaskDetailModal.css   | 44 ++++++++++++++++---
 ...etailModal.responsive-and-dependencies.test.tsx | 49 ++++++++++++++++++++++
 3 files changed, 95 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-7633

Fusion-Task-Lineage: 7a89743e-117f-4032-9614-a9a15f2a9b08

Co-authored-by: Fusion (runfusion.ai) <noreply@runfusion.ai>
This commit is contained in:
gsxdsm
2026-07-07 08:43:10 -07:00
parent d54ab80395
commit 413ef1dfa2
3 changed files with 95 additions and 5 deletions

View File

@@ -0,0 +1,7 @@
---
"@runfusion/fusion": patch
---
summary: Align Priority and Execution-mode control heights with the Oversight dropdown in task detail.
category: fix
dev: `.detail-priority-chip`, `.detail-execution-mode-toggle`, and `.detail-oversight-menu-trigger` in TaskDetailModal.css now all pin an explicit `height` (not just `min-height`) from the shared `--detail-priority-control-min-height` token, so none can outgrow or undershoot the others regardless of flex stretch behavior; extends the FN-7585/FN-7618 shared-token pattern.

View File

@@ -393,6 +393,21 @@ The task-detail modal metadata must keep priority, execution mode, provenance, P
.detail-priority-chip {
gap: var(--space-xs);
/*
FNXC:TaskDetail 2026-07-07-15:40:
FN-7633 — Priority, Execution-mode, and the Oversight trigger must all
resolve the exact SAME box height, not merely the same floor. FN-7618 gave
the Oversight trigger `align-self: stretch` inside its own `inline-flex`
wrapper, so it fills the cluster row height, while this control (and
Execution-mode) were only floored via `min-height` and could resolve
shorter once their content/line-height differed from the trigger's. Pin an
explicit `height` (not just `min-height`) from the SAME
`--detail-priority-control-min-height` token used everywhere else in this
cluster so no control can outgrow or undershoot the others regardless of
flex stretch behavior. `min-height` stays as a floor for any context where
content needs more room (e.g. unexpected font scaling).
*/
height: var(--detail-priority-control-min-height);
min-height: var(--detail-priority-control-min-height);
padding-block: var(--space-xs);
box-sizing: border-box;
@@ -498,6 +513,15 @@ uppercases its content; this only removes a duplicated, drift-prone override.
display: inline-flex;
align-items: center;
gap: var(--space-xs);
/*
FNXC:TaskDetail 2026-07-07-15:40:
FN-7633 — same shared-height fix as `.detail-priority-chip` above: pin an
explicit `height` (not just `min-height`) from the shared
`--detail-priority-control-min-height` token so this control cannot resolve
shorter than the Oversight trigger, which FN-7618 made stretch to the
cluster row height via its wrapper's `align-self: stretch`.
*/
height: var(--detail-priority-control-min-height);
min-height: var(--detail-priority-control-min-height);
padding-block: var(--space-xs);
box-sizing: border-box;
@@ -711,7 +735,6 @@ affect its size or anchoring — only the trigger's box height changes.
display: inline-flex;
align-items: center;
gap: var(--space-xs);
min-height: var(--detail-priority-control-min-height);
padding-block: var(--space-xs);
box-sizing: border-box;
/*
@@ -727,11 +750,22 @@ affect its size or anchoring — only the trigger's box height changes.
FNXC:TaskDetail 2026-07-05-14:00:
FN-7618 — `align-self: stretch` makes the trigger fill the height of its
`.detail-oversight-menu-dropdown` wrapper (now `inline-flex`/`align-items:
stretch`), which itself stretches to the shared cluster row height. The
`min-height` token above remains as the floor for any context where the
wrapper isn't stretched (e.g. isolated rendering), so the trigger never
drops below Priority/Execution-mode's height either way.
stretch`), which itself stretches to the shared cluster row height. Kept
below as a harmless safety net (a no-op once `height` is explicit) for any
context where the wrapper isn't stretched.
FNXC:TaskDetail 2026-07-07-15:40:
FN-7633 — relying on `align-self: stretch` alone made this trigger resolve
a TALLER box than Priority/Execution-mode, which only had `min-height` as a
floor (not a fixed height), so the three controls no longer read as one
uniform row. Pin the SAME explicit `height` (not just `min-height`) from
the shared `--detail-priority-control-min-height` token used by
`.detail-priority-chip` and `.detail-execution-mode-toggle` above, so all
three controls resolve identical box heights regardless of flex
stretch/content differences. `min-height` stays as the floor.
*/
height: var(--detail-priority-control-min-height);
min-height: var(--detail-priority-control-min-height);
align-self: stretch;
border-width: var(--btn-border-width);
border-color: var(--border);

View File

@@ -304,6 +304,55 @@ describe("TaskDetailModal", () => {
expect(mobileBlock).not.toMatch(/\.detail-oversight-menu-trigger\s*\{[^}]*align-self:\s*(?:auto|center|flex-start|flex-end);/);
});
it("resolves the same fixed box height for Priority, Execution-mode, and the Oversight trigger, not just a shared floor (FN-7633)", () => {
const css = readDashboardStylesSource();
const mobileBlock = getCssAtRuleBlockContaining(css, "@media (max-width: 768px)", ".detail-meta-inline-controls");
const priorityChipBlock = getExactCssRuleBlock(css, ".detail-priority-chip");
const executionToggleBlock = getExactCssRuleBlock(css, ".detail-execution-mode-toggle");
const oversightTriggerBlock = getExactCssRuleBlock(css, ".detail-oversight-menu-trigger");
const oversightMenuBlock = getExactCssRuleBlock(css, ".detail-oversight-menu");
// FN-7618 gave the Oversight trigger `align-self: stretch` so it fills
// its wrapper's stretched row height, while Priority and Execution-mode
// were only floored via `min-height` — a floor is not a guarantee of
// equality, so on desktop the trigger could resolve taller than its
// siblings whenever their content/line-height differed. Assert all
// three now pin an explicit, EQUAL `height` (not merely `min-height`)
// from the SAME shared token, so none can outgrow or undershoot the
// others regardless of flex stretch/content differences.
for (const block of [priorityChipBlock, executionToggleBlock, oversightTriggerBlock]) {
expect(block).toContain("height: var(--detail-priority-control-min-height);");
expect(block).toContain("min-height: var(--detail-priority-control-min-height);");
expect(block).toContain("box-sizing: border-box;");
}
// Guard against a future regression reintroducing a second, independent
// literal height source (e.g. a hardcoded px height) instead of reusing
// the shared token.
expect(css).not.toMatch(/\.detail-priority-chip\s*\{[^}]*height:\s*\d+px/);
expect(css).not.toMatch(/\.detail-execution-mode-toggle\s*\{[^}]*height:\s*\d+px/);
expect(css).not.toMatch(/\.detail-oversight-menu-trigger\s*\{[^}]*height:\s*\d+px/);
// The fixed height must hold at non-mobile widths (the reported
// symptom) — the base (non-media-scoped) rules above already assert
// this since `getExactCssRuleBlock` matches the top-level selector, not
// one nested in a media query.
// No `@media (max-width: 768px)` override redefines any of the three
// selectors with a diverging `height`, so the mobile wrap fallback
// keeps all three controls the same height too.
for (const selector of [".detail-priority-chip", ".detail-execution-mode-toggle", ".detail-oversight-menu-trigger"]) {
const mobileSelectorBlock = getExactCssRuleBlock(mobileBlock, selector);
expect(mobileSelectorBlock).toBe("");
}
// The popover itself must remain untouched by the height fix — still
// absolutely positioned, no explicit height forcing it to stretch.
expect(oversightMenuBlock).toContain("position: absolute;");
expect(oversightMenuBlock).not.toMatch(/^\s*height:/m);
});
it("renders the Priority dropdown chip like the Oversight dropdown chip, on every surface (FN-7597)", () => {
const css = readDashboardStylesSource();