diff --git a/src/ci_orchestrator/web/static/app.css b/src/ci_orchestrator/web/static/app.css index edee0d1..d08f995 100644 --- a/src/ci_orchestrator/web/static/app.css +++ b/src/ci_orchestrator/web/static/app.css @@ -268,11 +268,14 @@ dd code, dd .mono { overflow-wrap: anywhere; } .maintenance-op-info { flex: 1 1 320px; min-width: 0; } .maintenance-op h3 { font-size: 0.95rem; margin: 0 0 0.15rem; } .maintenance-op .field-hint { margin: 0; } -.maintenance-op form { flex: none; } -/* The max-age control sits on its own row above the action buttons, so it - * reads as a general max-age parameter of the operation (not part of a - * button). */ -.op-field { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem; } +/* The form inherits the global block-``form`` flex row, so its max-age field + * and its button row are laid out as siblings on one line (wrapping only when + * the card is narrow). Both the global ``margin-top`` and any bottom margin on + * the field must be zeroed here: flex centring uses each item's *margin* box, + * so a 0.5rem bottom margin on the field lifts the number input (and its + * stepper arrows) half that above the buttons' centre line. */ +.maintenance-op form { flex: none; margin-top: 0; } +.op-field { display: flex; align-items: center; gap: 0.5rem; } .op-field label { font-size: 0.85rem; color: var(--text-dim); white-space: nowrap; } .op-field input { width: 6rem; } /* A row of buttons (e.g. Purge / Empty all) that wraps on narrow cards. */