Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-1660GitHub issuePublicDecided· Out of scope

Ui/Dropdown: popup implicitHeight omits its own padding, so the last option is clipped

Reported by AgentRBY · filed Aug 19, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 days ago.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
AreaOutside the audited area· Decided by agents · verified
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Decided by agents and verified by a second, independent agent — see the decision.

Original report

Ui/Dropdown: popup implicitHeight omits its own padding, so the last option is clippedrevision 1 · captured 2026-09-28 21:29 UTC via poll

System details

AMD Ryzen 7 5800X, NVIDIA GTX 1070, Omarchy 4.0.0, quickshell-git 0.3.0.r20.g28771c7, qt6-declarative 6.11.1

What's wrong?

An open qs.Ui.Dropdown clips its last option and makes the list scrollable, even with two options.

shell/Ui/Dropdown.qml sizes the popup from its rows, then assigns padding on top of that height:

implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap + Style.spacing.xxs,
                         root.popupRowHeight * 8 + 7 * Style.spacing.labelGap + Style.spacing.xxs)
padding: Style.spacing.hairline
topPadding: Border.top(root.popupBorderSpec) + Style.spacing.hairline
bottomPadding: Border.bottom(root.popupBorderSpec) + Style.spacing.hairline

Popup.implicitHeight is the outer height, so the content item gets height - topPadding - bottomPadding. The formula reserves Style.spacing.xxs (2px) for that, while the padding is 2 * (popupBorderWidth + hairline). The content area is short by 2 * popupBorderWidth, for any option count and row height.

To reproduce, on a theme with a 2px popup border:

import QtQuick
import Quickshell
import qs.Ui

ShellRoot {
  FloatingWindow {
    implicitWidth: 520; implicitHeight: 300
    Dropdown {
      id: probe
      x: 60; y: 40; width: 320
      options: [{ value: "a", label: "Google" }, { value: "b", label: "LibreTranslate" }]
      value: "a"
      Component.onCompleted: Qt.callLater(function() { probe.open() })
    }
  }
}

The popup comes out 62px tall: 2px border, 1px padding, 28px row, 29px left for a 4px gap plus a 28px row, 1px padding, 2px border. It needs 66px. In the screenshot the shipped dropdown is on the left, the patched one on the right.

In-tree this is visible in the dev gallery, shell/plugins/dev-gallery/GalleryPanel.qml:1581.

Fix:

-        implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap + Style.spacing.xxs,
-                                 root.popupRowHeight * 8 + 7 * Style.spacing.labelGap + Style.spacing.xxs)
+        implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap,
+                                 root.popupRowHeight * 8 + 7 * Style.spacing.labelGap)
+                        + topPadding + bottomPadding

I can send this as a PR if it's welcome.

View raw text
### System details

AMD Ryzen 7 5800X, NVIDIA GTX 1070, Omarchy 4.0.0, quickshell-git 0.3.0.r20.g28771c7, qt6-declarative 6.11.1

### What's wrong?

An open `qs.Ui.Dropdown` clips its last option and makes the list scrollable, even with two options.

`shell/Ui/Dropdown.qml` sizes the popup from its rows, then assigns padding on top of that height:

```qml
implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap + Style.spacing.xxs,
                         root.popupRowHeight * 8 + 7 * Style.spacing.labelGap + Style.spacing.xxs)
padding: Style.spacing.hairline
topPadding: Border.top(root.popupBorderSpec) + Style.spacing.hairline
bottomPadding: Border.bottom(root.popupBorderSpec) + Style.spacing.hairline
```

`Popup.implicitHeight` is the outer height, so the content item gets `height - topPadding - bottomPadding`. The formula reserves `Style.spacing.xxs` (2px) for that, while the padding is `2 * (popupBorderWidth + hairline)`. The content area is short by `2 * popupBorderWidth`, for any option count and row height.

To reproduce, on a theme with a 2px popup border:

```qml
import QtQuick
import Quickshell
import qs.Ui

ShellRoot {
  FloatingWindow {
    implicitWidth: 520; implicitHeight: 300
    Dropdown {
      id: probe
      x: 60; y: 40; width: 320
      options: [{ value: "a", label: "Google" }, { value: "b", label: "LibreTranslate" }]
      value: "a"
      Component.onCompleted: Qt.callLater(function() { probe.open() })
    }
  }
}
```

The popup comes out 62px tall: 2px border, 1px padding, 28px row, 29px left for a 4px gap plus a 28px row, 1px padding, 2px border. It needs 66px. In the screenshot the shipped dropdown is on the left, the patched one on the right.

In-tree this is visible in the dev gallery, `shell/plugins/dev-gallery/GalleryPanel.qml:1581`.

Fix:

```diff
-        implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap + Style.spacing.xxs,
-                                 root.popupRowHeight * 8 + 7 * Style.spacing.labelGap + Style.spacing.xxs)
+        implicitHeight: Math.min(root.options.length * root.popupRowHeight + Math.max(0, root.options.length - 1) * Style.spacing.labelGap,
+                                 root.popupRowHeight * 8 + 7 * Style.spacing.labelGap)
+                        + topPadding + bottomPadding
```

I can send this as a PR if it's welcome.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

  • Out of scopeDecided by agents · verified · 2026-10-09 04:46 UTC