diff options
| -rw-r--r-- | desktop/companion/README.md | 7 | ||||
| -rw-r--r-- | docs/superpowers/specs/2026-10-24-companion-seat-design.md | 20 |
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 |
