aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--desktop/companion/README.md7
-rw-r--r--docs/superpowers/specs/2026-10-24-companion-seat-design.md20
2 files changed, 18 insertions, 9 deletions
diff --git a/desktop/companion/README.md b/desktop/companion/README.md
index 4fbe887..2bd6c4e 100644
--- a/desktop/companion/README.md
+++ b/desktop/companion/README.md
@@ -60,6 +60,13 @@ frame falls back to its outfit's `base`.
stacks a later surface above an earlier one on a layer, and 0.56.2 has
no layer rule to order them (no `order` key in the binary; an unknown
key raises no config error).
+- The assistant's tall card (a chat, or its history, picker or models
+ panel) seats her on its top edge, right of centre, through the monitor
+ hop. `Assistant.qml` gives `tall` and `cardTop`; seated she ignores
+ balloons and shows `Mood.seatFrame` of her frame, the `sit-*` set. The
+ bar and the file card leave her in the corner: standing frames face
+ out, not down at the text. Typing and BackSpace still reach her under
+ the canvas's exclusive keyboard (checked on socket2).
- The program in front of her is Hyprland's `activewindow` event,
`class,title`. It also fires on every title change, so she reacts
only when the class changes, a third of the time, under the 30 s line
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