aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/specs/2026-10-24-companion-seat-design.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/superpowers/specs/2026-10-24-companion-seat-design.md')
-rw-r--r--docs/superpowers/specs/2026-10-24-companion-seat-design.md20
1 files changed, 11 insertions, 9 deletions
diff --git a/docs/superpowers/specs/2026-10-24-companion-seat-design.md b/docs/superpowers/specs/2026-10-24-companion-seat-design.md
index b858e5a..3e7fb0f 100644
--- a/docs/superpowers/specs/2026-10-24-companion-seat-design.md
+++ b/docs/superpowers/specs/2026-10-24-companion-seat-design.md
@@ -1,6 +1,6 @@
# Companion seat: design
-Date: 2026-10-24. Status: designed, not implemented.
+Date: 2026-10-24. Status: implemented; the sitting art is generated by the user.
## Goal
@@ -14,6 +14,10 @@ short card would need its own art to read anything below her feet.
## Verified before designing
+- **Hyprland's typing binds fire under the canvas.** With the canvas open
+ and holding the keyboard `Exclusive`, socket2 carried
+ `custom>>keystone-typing` and `custom>>keystone-delete` for every burst
+ typed into it, so the companion needs no input of the canvas's own.
- **The tall card has a fixed top.** `Card.tall` is `mode === "chat" ||
panel`, and while tall its height is `fullHeight`, set by the window to
70% of the screen height. The card is centred, so its top is
@@ -41,9 +45,11 @@ card.
The companion's `seated` is `asst.open && asst.tall`. Seated, her window
is on `asst.screenObj` and its margins put her seat's bottom 35 px below
-the card's top, with her centre 60 px right of the screen's centre: the
-window stays anchored right and bottom, `margins.bottom = screenH - cardTop
-- 35`, `margins.right = screenW / 2 - 60 - seatWidth / 2`. Not seated, the
+the card's top, with her right edge 90 px right of the screen's centre:
+the window stays anchored right and bottom, `margins.bottom = screenH -
+cardTop - 35`, `margins.right = screenW / 2 - 90`. Her right edge rather
+than her centre, because frames differ in width and the window would move
+with every frame. Both numbers were checked by eye. Not seated, the
margins are today's 24 and 16.
`seated` changing runs the monitor hop's path: she drops out, the window
@@ -82,11 +88,7 @@ ungenerated set shows.
### Inputs
Typing and BackSpace keep arriving as `keystone-typing` and
-`keystone-delete` from Hyprland. The canvas holds the keyboard
-`Exclusive`; Hyprland binds should still fire, since the compositor
-matches binds before delivering keys. Checked first, by typing into the
-canvas with `qs log` open. If they do not fire, the card's input
-`onTextChanged` sets `typingAt`, and a shorter text sets the mock.
+`keystone-delete` from Hyprland, which fire under the canvas (see above).
## Check