Multi-select, select joined walls and fences, pond with swimming fish
Deploy web Studio / deploy (push) Successful in 1m27s

Selection: S.sel stays the object picked last; S.selIds holds everything
selected.
- In the object list, Ctrl+click adds or removes an object and
  Shift+click selects a range.
- On the map, Ctrl/Shift+click toggles an object and Shift+drag draws a
  box that selects what lies wholly inside it (locked and hidden objects
  are left out).
- Ctrl+A selects everything that is not locked; Esc selects nothing.
- Clicking a wall or fence a second time selects every piece of the same
  type joined to it; another click goes back to that one piece.
- Dragging one selected object moves them all, together with the windows
  and doors on them, as one undo step. Arrow keys, R (turns the group
  about its middle), Ctrl+D, Delete, Lock and Hide all work on the whole
  selection.
- When all selected objects share a type, the property form edits them
  all; fields where they differ show "mixed".
- The agent's system prompt lists the selected objects.

The viewer outlines several objects with selectObj([ids]) and passes the
click event to onPick. A batch op now answers `ids`, one per operation,
so the copies from a group duplicate get selected.

Pond (Nature): natural, round or square, with a stone or grass edge,
fish, lily pads, spreading ripples and reed clumps. The fish come from a
new Swim primitive (script: s.swim). One matrix maps the object's frame
to the screen. Each fish turns round its ellipse with a CSS rotation,
so off-screen pausing and reduced motion apply as for the other
animations. The house demo gets a koi pond in the back garden.

Tests: ponds in every shape and rotation have the right number of fish,
no NaN and no depth-sort cycles, and stay inside their rectangle.
check_studio covers list and map multi-select, a group drag undone in
one step, joined-fence selection, a mixed-value form applied to all, box
select, delete and undo, Ctrl+A, Esc, and a new pond's fish.
This commit is contained in:
grabowski committed 2026-10-24 18:36:39 +07:00
1 parent e4017ce2a8
commit 19f4c83ae8
21 files changed
+759 -59

No files matched your search

+37
View File
@@ -251,6 +251,17 @@ lshade = "#d9c9a0"
roofr = "#8a4a3a"
cobble = "#6c675f"
capst = "#8c877e"
pondw = "#24607a"
ponddp = "#1a4c63"
pondbank = "#4a3f2f"
lily = "#3f7a3a"
lilyf = "#e7a1c0"
reed = "#4f6e30"
cattail = "#5a3e2a"
koi = "#e8742a"
koiw = "#e9e4da"
koig = "#d9a63a"
ripple = "#8cc3d8"
[palette.light]
sky1 = "#a9d4fb"
@@ -497,6 +508,17 @@ lshade = "#f2e6c8"
roofr = "#b8613f"
cobble = "#aaa195"
capst = "#d8d2c6"
pondw = "#5aa7c4"
ponddp = "#4791b0"
pondbank = "#8d7a5c"
lily = "#6fae5a"
lilyf = "#f4b6d2"
reed = "#5e8a3a"
cattail = "#7a5536"
koi = "#f08a3c"
koiw = "#fbf8f2"
koig = "#efc35a"
ripple = "#d6f1fa"
[materials]
warn = "#e0412f"
@@ -723,6 +745,13 @@ lshade = "lshade"
roofr = "roofr"
cobble = "cobble"
capst = "capst"
pondw = "pondw"
ponddp = "ponddp"
pondbank = "pondbank"
lily = "lily"
lilyf = "lilyf"
reed = "reed"
cattail = "cattail"
doorw = "furnw"
doorg = "door"
f-oak = "oak"
@@ -748,6 +777,14 @@ f-conc = "conc"
".iso-svg .iso-glassw" = "--b: var(--iso-glassw); fill-opacity: var(--iso-glasswo)"
".iso-svg path.iso-glassw.iso-t" = "fill-opacity: .5"
".iso-svg .iso-win" = "fill: var(--iso-win); stroke: none"
".iso-svg .iso-school" = "pointer-events: none"
".iso-svg .iso-swimbox" = "fill: none; stroke: none"
".iso-svg .iso-fish" = "stroke: none; fill-opacity: .92"
".iso-svg .iso-koi" = "fill: var(--iso-koi)"
".iso-svg .iso-koiw" = "fill: var(--iso-koiw)"
".iso-svg .iso-koig" = "fill: var(--iso-koig)"
".iso-svg .iso-ripple" = "fill: none; stroke: var(--iso-ripple); stroke-width: .5"
".iso-svg path.iso-reed, .iso-svg path.iso-cattail" = "stroke: none"
".iso-svg .iso-win.iso-lit" = "fill: var(--iso-winlit)"
".iso-svg .iso-glass" = "fill: var(--iso-glass); fill-opacity: var(--iso-glasso); stroke: none"
".iso-svg .iso-door" = "fill: var(--iso-door); stroke: none"