Skip to content

Island to another screen, B.O.T.S's face by default, agent swap from the deck - #51

Merged
ChrisPlayer merged 7 commits into
mainfrom
feat/r18
Oct 19, 2026
Merged

ChrisPlayer merged 7 commits into
mainfrom
feat/r18

Conversation

@ChrisPlayer

Copy link
Copy Markdown
Contributor

Three changes, on top of v0.1.17.

The island goes to another screen again

Since v0.1.17 a drag of the pill kept the island on its own screen.

  • While the button is down, the shell's watch loop checks every 40 ms which screen the cursor is on (island::follow_span, screen_at). When it changes, the window spans that screen's work area instead (one screen at a time, never across two scales) and tells the page (companion://span).
  • The six targets show on the screen under the pointer. On release the island lands at that screen's nearest place; the screen is saved only when it changed (landPatch).
  • A drag that loses its release (focus lost, Alt+Tab, pointercancel, lost pointer capture) puts the island back where it was. A move with no button down counts as the missed release. As a last resort, a window still spanned 3 s after the button came up goes back to the island's place and lets clicks through again (companion://span-lost).

B.O.T.S's face by default

  • An agent with no face chosen wore a jelly robot drawn from its id. It now wears B.O.T.S's box face (CLASSIC_ROBOT). A chosen face is kept.
  • The robot picker has a "B.O.T.S" button beside Shuffle, highlighted when it is the current face.

The deck's top-left character swaps agents

  • A click goes to the next agent and cycles back to the first: the face slides out, the next slides in (transform and opacity, none with reduced motion), and its name shows for 1.6 s.
  • The Chat switches to that agent (assistant.pick), saved for the next launch.
  • The lead wears the mascot; another agent wears its own face. With no agent row set up, the Chat's default agent wears the mascot, so the pill and the deck match.
  • With one agent, a click pokes it as before. Press and drag still sets it loose on the desktop.
  • Moved out of DeckBar.svelte into deck/DeckAgent.svelte.

Repository

The repository moved to Skollheim/bots: the release targets, the manifest's homepage, the README and Cargo.toml point there. The app identifier stays com.beboite.bots, so settings are kept.

Checks

  • bun run check: 0 errors, 0 warnings.
  • vitest: 75 files, 544 tests.
  • cargo test: 90 tests, 4 new on screen_at (side by side with negative x, stacked, scales 1, 1.25 and 1.5, a gap between screens).
  • Not tried on real screens: the cross-screen drag needs two monitors.

…ost its release

Since v0.1.17 the carried island's window spanned only its own screen, so it
could no longer be taken to another one. The pointer watch now takes the span
to the screen under the pointer (island::follow_span, screen_at) and tells the
page (companion://span); the island lands on that screen's nearest place, and
the screen is saved with the place (landPatch). The island stays held where
it was taken, measured in the window as it is now.

A drag that loses its release (window blur, pointer cancel or capture lost, a
move with no button down) puts the island back or lands it, and the shell gives
up a span whose button has been up for 3 s (companion://span-lost), so the
window never stays spanned taking every click.
@ChrisPlayer
ChrisPlayer merged commit 742abe5 into main Oct 19, 2026
3 checks passed
@ChrisPlayer
ChrisPlayer deleted the feat/r18 branch October 19, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant