aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/superpowers/specs/2026-09-12-window-switcher-design.md39
1 files changed, 32 insertions, 7 deletions
diff --git a/docs/superpowers/specs/2026-09-12-window-switcher-design.md b/docs/superpowers/specs/2026-09-12-window-switcher-design.md
index ce95f3e..0fabe2f 100644
--- a/docs/superpowers/specs/2026-09-12-window-switcher-design.md
+++ b/docs/superpowers/specs/2026-09-12-window-switcher-design.md
@@ -35,11 +35,32 @@ Per card, top to bottom:
- The window title, left aligned, elided at the card width.
- The workspace, centered, in brackets and in the accent colour.
-Cards are a fixed size and the grid wraps, centered. A preview is 21:9, so a
-card readable at arm's length is around 380px wide and DP-1 at 2560px fits six
-per row. Six or fewer windows therefore render as the single row this started
-as; more wrap rather than shrinking, so a large window count degrades by
-growing downwards instead of becoming unreadable.
+## Card size and the grid
+
+Previews are not one shape. DP-1 is landscape and its windows are 2556x1034,
+near 21:9. DP-3 has `transform=1`, so it is rotated and its windows are
+1076x1916, portrait 9:16. A fullscreen app is portrait there too. That is a
+4.4x span of aspect ratio inside one grid, so a card cannot take its shape from
+its preview.
+
+Instead the card is a fixed 16:10 box and the preview is fitted inside it,
+preserving aspect. A landscape preview letterboxes slightly, a portrait one
+pillarboxes to roughly a third of the box width, and the empty space reads as
+framing given the box has a background. 16:10 is the compromise: less extreme
+than either input, so neither orientation is punished. The alternative, sizing
+each card to its own preview, was rejected because ragged rows would break the
+alignment of the three text lines under each card, which is what makes a grid
+scannable.
+
+The grid centres, and its column count is the window count capped at six. One
+window sits dead centre, two straddle the middle, three centre on the middle
+one. Seven wraps to a centred 4 and 3.
+
+Cards grow to fill the row they are in, up to a ceiling of 640px wide. So a
+lone window gets a 640px card, where a DP-1 preview renders 640x259 and a DP-3
+one 226x400: bigger, but still a preview rather than something pretending to be
+the window. Six windows give cards around 380px. The ceiling is what stops a
+single preview from becoming a full-screen mirror.
The name is redundant with the icon and usually with the title too. It is kept
deliberately: it is short and stable, so the eye has something to land on when
@@ -125,6 +146,9 @@ Against Hyprland 0.56.2 and quickshell 0.3.1, in a scratch config:
`window-close` and for app icons.
- `DesktopEntries.byId` returns null for bare app ids such as `firefox`. The
app id itself resolves as an icon name, so lookup falls back to it.
+- DP-3 reports `transform=1`, and the window on it measures 1076x1916 against
+ 2556x1034 on DP-1. Both orientations are live at once, which is what the
+ fitted card box exists for.
## Theme
@@ -142,8 +166,9 @@ which is fine.
window when another is fullscreen on the same workspace. Whether plain
`focuswindow` still needs it is unknown; it goes back in only if a fullscreen
window is actually observed staying on top.
-- **Multi-monitor overlays.** DP-1 only. DP-3's windows appear as cards, the
- overlay just does not paint there.
+- **Multi-monitor overlays.** The overlay paints on DP-1 only. DP-3's windows
+ still appear as cards, and being portrait they are the reason the card box is
+ a fitted 16:10 rather than the shape of a preview.
- **Hold-and-release ALT + TAB.** Considered and rejected: it depends on the
switcher seeing the ALT release, and a missed release leaves a stuck
full-screen overlay.