Commit Graph
4523 Commits
Author SHA1 Message Date
Claude 2fca3fd18d Merge main into Pallet-placement
Resolved conflicts:
- app/update/mod.rs: keep the dock's dock_open_at_default for the XREF
  manager; take main's stable xref row identity (row_index(&id)).
- app/view/mod.rs: keep the edge layout from app::dock; drop main's copy
  of the old edge-stack code (main only reformatted it there).
- ui/window/layers.rs: keep main's new visible_indices next to the
  branch's view_panel.
Files the branch only reformatted take main's version. Adds the Lao
(lo-LA) translations for the new dock texts.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-11 18:44:00 +00:00
Claude bf1c4ddc74 style: apply cargo fmt across workspace (as on main)
Formats the branch the way main's 9cf9ff2 did, so merging main only
conflicts where the code itself differs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-11 18:29:37 +00:00
github-actions[bot] cff240ef71 Release v2026.41 v2026.41 2026-10-11 17:33:07 +00:00
Hakan SevenandClaude Opus 5.5 6cde0e02d8 Cargo: kernel 71770e1, graph f4fdb80
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 13:12:04 +03:00
Hakan SevenandClaude Opus 5.5 e08aa68bb7 Cargo: kernel 0b023a8, graph 1bb8b06
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 12:26:26 +03:00
Hakan SevenandClaude Opus 5.5 ae7fe3d4aa Cargo: kernel 5c9ca9a, graph 20f493c
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 11:30:42 +03:00
Hakan SevenandClaude Opus 5.5 51eda9ff85 Cargo: kernel 24fb370, graph fcc70b0
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 10:23:24 +03:00
Hakan SevenandClaude Opus 5.5 003bc39886 Cargo: kernel 1d81f9e, graph d6964e3
Kernel: fillets and chamfers along plane-cylinder rulings; blend
booleans refused when they change the solid by more than their tool.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 06:52:24 +03:00
Hakan SevenandClaude Opus 5.5 4b6ced9b8c Cargo: kernel 35fb24d, graph cb18f6e
Kernel: spline normals and tangents kept while a body is meshed —
solid display of spline-heavy drawings up to 2.7 times faster.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 05:56:26 +03:00
Hakan SevenandClaude Opus 5.5 ad9403e03d Cargo: kernel 69ffca4, graph e988ea3
Kernel: spline surface search grid kept, ray/control-net box test,
sampled proximity-mesh deviation — booleans on spline solids several
times faster.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 05:24:33 +03:00
Karim Jerbi 9cf9ff2c5c style: apply cargo fmt across workspace 2026-10-11 03:14:29 +01:00
Hakan SevenandClaude Opus 5.5 85710e5454 Cargo: kernel c65a1f0, graph 3b9426a
Kernel: shell for solids run straight between two caps (plates with
holes, walls bent round arcs).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 04:26:07 +03:00
Karim Jerbi 2824b2943f fix(styles): reload Table/MLine buffers on structural ops, validate cell text style
style_new/copy/delete funneled through a load_style_bufs no-op for Table/MLine, leaving stale editor buffers pointed at the fresh style; both arms now route to the existing loaders. Table cell text-style typos persisted as dangling names; unknown names are now rejected with command-line feedback, keeping the buffer text for correction. Silent numeric parse-drops deliberately untouched (codebase-wide keep-old-valid norm). Tests: table_new_reloads_cell_buffers plus table_cell_unknown_text_style_is_rejected incl. retention assert (RED each verified by temporary revert). Full suite: 2048 passed / 0 failed / 25 ignored, zero warnings.
2026-10-11 02:17:18 +01:00
Karim Jerbi 2c2bb9bba5 ci: run tests on Linux, Windows and macOS; add non-blocking lint job
Tests previously ran on Ubuntu only, so Windows- and macOS-specific breakage went unseen. Add a 3-OS test matrix and a separate lint job for rustfmt and clippy. Lint is continue-on-error because the tree is not yet fmt-clean or clippy-clean.

Also add BEDIT characterization tests that pin current session, undo and refusal behavior ahead of the editor refactor. Locked tests guard behavior that must survive; documenting tests record questionable behavior expected to change.
2026-10-11 02:17:18 +01:00
Karim Jerbi 8dca7fbaed refactor(ribbon): single dock predicate, drop dead layer_names mirror
The edge-stack closure duplicated dock_panel_visible arm-for-arm; it now delegates (tab is provably the active tab at that site). Ribbon.layer_names was written but never read outside one test; deleted, test reads via layer_infos. Faces and combo-refresh sub-items investigated and dropped (already unified upstream; no live stale path). Tests: dock visibility parity pins incl. Start-tab. Full suite: 2046 passed / 0 failed / 25 ignored, zero warnings.
2026-10-11 02:17:18 +01:00
Karim Jerbi 6fa11887c7 fix(xref): carry stable row identity in row messages
XrefManagerSelect/RightClick/RowOp/PathPick/FindReplace carried positional display indices that rescans could retarget. New XrefRowId{key,saved_path} (the identity refresh uses) in all 5 variants, resolved via row_index at dispatch with graceful no-op; panel selection stays index-based. display.index remains for view-time styling/lookup only. Tests: xref_rowop_unknown_id_is_noop (RED first); existing dialog/simulator/click tests migrated to ids. Full suite: 2044 passed / 0 failed / 25 ignored.
2026-10-11 02:17:18 +01:00
Karim Jerbi 7bbc5b0319 fix(ui): explain silent anno-scale toggles, theme xref empty state
AnnoObjectScaleToggle had three silent no-op paths (no target, locked layer, unknown scale); each now pushes command-line info mirroring the open-path guards. Xref empty-state hardcoded grey now uses muted_style. DD_BOUNDS eviction and attr-clamp changes investigated and deliberately dropped (no reachable defect in either). Tests: anno_scale_toggle_tests cover all three paths (RED: silence). Full suite: 2032 passed / 0 failed / 25 ignored, zero warnings.
2026-10-11 02:17:18 +01:00
Karim Jerbi 15cfabdb0f fix(layer-state): share linetype list via Arc instead of cloning per row
editor_layer_row and view_editor took Vec<String>, cloning N strings per row per frame (times two build-closure runs). Both take Arc<[String]> now; a plain borrow cannot cross the twice-run closure (E0373), hence the Arc. Cow empty-filter short-circuit for both search queries. Test: view_editor_accepts_shared_linetypes (RED first). Full suite: 2029 passed / 0 failed / 25 ignored, zero warnings.
2026-10-11 02:17:18 +01:00
Hakan SevenandClaude Opus 5.5 9f9c621871 Cargo: kernel b8b5b9e, graph f9f7e27
Kernel: fillets and chamfers round plane-cylinder/cone circles (hole and
boss rims, countersinks), shell for any planar solid, NURBS projection
onto the right pass of a looping curve, straight rational profile
pieces, slice section precision.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 04:15:33 +03:00
Hakan SevenandClaude Opus 5.5 68646f5616 Cargo: kernel 8dafa23, graph eb7afee
Kernel: closed-curve seam projection, offset push by slicing, exact
planar spline pcurves, imprint perf (no hairline ping-pong, box-culled
periodic containment).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 00:54:21 +03:00
Karim Jerbi 6c3cfb55b5 fix(layers): VP glyph and filter-aware shift ranges
VP-freeze columns used the global-freeze glyph; shift-ranges swept filtered-out rows into bulk ops. Glyph swapped to layer_vp_freeze (ribbon precedent); new visible_indices helper shared by the view loop and the shift arm. Test: shift_select_skips_filtered_out_rows (RED: hidden row in range). Full suite: 2028 passed / 0 failed / 25 ignored.
2026-10-10 20:41:28 +01:00
Hakan SevenandClaude Opus 5.5 ea7e79bfab Cargo: kernel edef407, graph 96359a4
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 21:26:03 +03:00
Hakan SevenandClaude Opus 5.5 309810803e Cargo: kernel af749de, graph 39ef337; region area by chain shares
A region's loop area sums its pieces with Curve::chain_area, the
composable share: enclosed_area closes an open polyline by its chord.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 20:31:56 +03:00
Hakan SevenandClaude Opus 5.5 689cd71d9e Cargo: kernel b234308, graph 3baa891
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 19:21:19 +03:00
Karim Jerbi b66f890546 fix(statusbar): scale pill number, label and badge follow one viewport
The pill number used the first-content fallback while the label and sync badge used explicit-only resolution, showing e.g. a 1:50 number beside a 1:1 label with no badge. Label and badge now resolve through target_viewport_handle like the number; render-path handle fn, set-paths and Model branches untouched. Tests: scale_pill_sources_agree_without_targeted_viewport (RED: live probe Some(0.02)/1:1/None) plus Model-unchanged pin. Full suite: 2027 passed / 0 failed / 25 ignored.
2026-10-10 16:14:22 +01:00
Karim Jerbi d1da26feb6 fix(properties): scope asym-scale opt-out per tab
props_asym_scale was app-global keyed by raw handle values, but fresh documents restart numbering at seed 1, leaking one tab's unchecked Uniform box into another tab reusing the value. The set moves to DocumentTab; all uses tab-scoped. Also removes a dead destructure left in overlay.rs. Test: asym_scale_opt_out_does_not_leak_across_tabs with handle-reuse premise assert (RED first). Full suite: 2025 passed / 0 failed / 25 ignored, zero warnings.
2026-10-10 16:14:22 +01:00
Hakan SevenandClaude Opus 5.5 6ad3183b3d Cargo: kernel 0e87fac, graph 5c02e2b
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 16:49:24 +03:00
Hakan SevenandClaude Opus 5.5 48ecaa0ee2 Cargo: kernel b6f85b4, graph e008a24
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 16:37:02 +03:00
Claude cc17d10ca9 Dock: drop dead pallet-width setters, split on_dock, share span maths
- Only docked pallets have a width divider, so the Width drag and
  WidthReset no longer carry a branch for an undocked pallet; remove the
  then unused DockState::set_width / reset_width. Per-pallet widths are
  still read (older configs, floating size). Tests now size groups.
- on_dock hands hover messages to dock_hover and the release to
  dock_drag_release.
- dock_slot_spans and dock_landing share dock_open_spans.

No behaviour change.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 12:34:02 +00:00
Hakan SevenandClaude Opus 5.5 bdc3d8d7c7 Cargo: kernel 71f46ff, graph ffbf3ca
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 15:19:15 +03:00
Claude 02404301a5 Dock: review cleanups - hover pending enum, FloatFrame, comment fixes
- dock_hover_pending is an Option<HoverPending> (Reveal / Hide) instead
  of a nested Option.
- dock_float_frame returns a FloatFrame with width() and bar_x(), so the
  floating menu no longer repeats the frame-width formula.
- Put dock_reveal's doc comment back on dock_reveal, and the group-move
  comment back above the match it describes.

No behaviour change.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 11:55:23 +00:00
Claude 2135dd499a Dock: floating windows hold one pallet again
Remove floating groups: a floating window is a single pallet once more,
and the Pallets submenu is gone from its title-bar menu. Kept: the menu
opens at the pointer with Allow docking, Dock left and Dock right;
close / pin show only while the bar is hovered; content is clipped to
its frame. A config saved by the floating-group build still loads, its
windows floating their first pallet. Drops the unused Pallets string.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 11:32:51 +00:00
Claude 75fb9e32dd Dock: floating menu at the pointer, hover-only bar buttons, Allow docking, clip pallets
- The floating title bar's right-click menu opens where the pointer is,
  flipped to stay on screen; the Pallets submenu sits beside it.
- Close and pin on a floating title bar only show while it is hovered,
  as on docked title bars.
- New Allow docking check in that menu: off, dragging the window (or a
  pallet out of it) only floats it, never docks it on an edge.
- Floating windows and stacked pallets clip their content, so a pallet
  sized below its content no longer draws outside its frame.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 11:18:42 +00:00
Claude f19948bc07 Dock: floating groups, floating title bar menu, translations
- A docked group floats as one window: drag its edge band over the
  drawing or double-click the band. Floating windows hold a stack of
  pallets with splitters; the vertical title bar shows each pallet's
  icon (press one to drag that pallet out). Dragging the bar moves the
  whole window; dropping it on an edge docks or joins it as a group.
- Right-click a floating title bar: Pallets submenu (add or hide
  pallets in the window), Dock left, Dock right.
- Close on a floating bar closes every pallet in the window; its pin
  sets auto-hide for the whole window.
- Older configs with single floating pallets still load.
- Translate the new dock texts (Auto-hide, Dock left/right, New group,
  Pallets, Browser, Node Graph) in all 21 languages.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 10:40:55 +00:00
Claude 4e210f65b5 Dock: LAYERS opens its pallet like Insert Block, Layer Manager layout fixes, 150 ms auto-hide hover delay
- LAYERS ribbon button runs a command that opens the Layer Manager pallet;
  the ribbon no longer keeps it highlighted.
- Layer Manager: search box stays right-aligned, the column header fills
  the row, no stray contour lines when the pallet is taller than its rows.
- Auto-hidden edges don't show the shown-group accent bar.
- Auto-hide reveal and hide wait 150 ms of rest, so passing over the
  strip doesn't flash groups open.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-10 10:22:47 +00:00
Hakan SevenandClaude Opus 5.5 4708283382 Cargo: kernel 7ae9c6c, graph 8296ebf
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 09:55:58 +03:00
Karim Jerbi 0c9cc839fe fix(overlay): guard draw_axes against behind-eye projection
draw_axes projected with raw project_point3, so a behind-camera axis endpoint wrapped to a finite mirrored point (proven: clip.w=-100 projected to screen centre). Extracted shared project_point with the eye-plane guard (grid_segments delegates verbatim) and axes now skip when an end is unprojectable plus clip_seg. Legacy canvas offset preserved pixel-identically; remaining raw project_point3 sites elsewhere are out of scope. Tests: project_point_rejects_behind_eye plus axes_segments geometry pins. Full suite: 2024 passed / 0 failed / 25 ignored.
2026-10-10 07:23:35 +01:00
Hakan SevenandClaude Opus 5.5 4ae2722aad Cargo: kernel 749ed0b, graph 33637fc
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 08:24:58 +03:00
Hakan SevenandClaude Opus 5.5 3d488c1dcd Cargo: kernel 01562a8, graph 4b7cde5
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 04:18:29 +03:00
Hakan SevenandClaude Opus 5.5 fbf2694d56 Cargo: kernel 8dbcaa7, graph 65880eb
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-10 01:12:34 +03:00
Claude b12a29b233 Dock: review fixes - hover, preview width, stale indexes, config healing
Fixes:
- Hover state no longer drops when the pointer moves up from one strip
  icon, group grip or title bar to the one above: iced handles the
  element above first, so the old element's "left" (None) cleared the
  hover just set. Leave messages now carry the element and only clear
  their own hover.
- The drop preview used the pallets' own widths; it now uses the
  group's width, matching where the pallet lands.
- Group indexes from messages (group grab, splitter) are looked up
  safely, so a message from before a layout change no longer panics.
- Floating placements read from the config are healed (finite, positive,
  at least the minimum size), like the group weights already were.
- The shown group's edge bar is centred in its row: a stack takes its
  height from its first layer, and the icon column was shorter than the
  row. The "Drag to move group" tooltip is removed.

Simplifications (no behaviour change):
- dock_open_at_default / dock_unpeek replace seven copies of "dock on
  the right if unplaced, then reveal" and four of "stop peeking".
- The drop target takes the grab offset as a parameter, so a drag
  update stores its state once.
- dock_set_open, ensure_settings, the shown-index bookkeeping after a
  group is removed and the on-screen width clamp each lose duplication.
- VBarLabel drops options its single caller never varied.
- The drop preview's landing computation is one helper.

Naming and consistency: pallet names in the + menu, the drag ghost and
the floating title bar go through t!(); StripHit::Tab becomes
StripHit::Join; stale comments updated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 20:53:42 +00:00
Claude 7448472291 Dock: move app-side dock code into app::dock, trim tests, drop icon tooltip
- The dock's state handling and drawing move out of update/dialog.rs and
  view/mod.rs into src/app/dock/ (update.rs, view.rs, tests.rs). The
  overlay view_main stacked over the workspace (floating pallets, + menu,
  drag preview, pointer capture) becomes one `dock_overlay` call. Code is
  moved, not changed.
- Strip icons no longer show the pallet name on hover.
- Tests trimmed where they overlapped: the top / bottom half drops are
  one test, the two hover tests are one, and the in-group icon reorder,
  raise-float, empty floating title bar and slot-span tests are dropped
  (each is covered by another test).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 20:25:34 +00:00
Karim Jerbi 6d6a8b1439 fix(layers): key rename and picker state by name, not row
LayerPanel.editing and color_picker_row were positional indices, so a sort/sync/filter between start and commit retargeted renames and swatches. Both are Option<String> now; commit resolves fresh with graceful no-op on deleted layers. Existing rename tests migrated. Tests: layer_rename_commit_follows_name_across_resort (RED first) plus deleted/empty no-op and picker-resort pins. Full suite: 2019 passed / 0 failed / 25 ignored.
2026-10-09 21:22:47 +01:00
Claude 4db24b3bbd Dock: simplify drag, peek, width and open/close state
No intended behaviour change except the fixes noted below.

- One drag state: a single `DockDrag` (move pallet / group, width,
  splitter, floating size, Layer Manager column) replaces nine fields
  (dragging, dragging group, resizing, split, float resizing, origin,
  target, grab offset, layer column flag) that had to be kept in sync.
- `dock_expanded` becomes `dock_peek` with one meaning: a pallet revealed
  although it auto-hides. `dock_reveal(id)` shows a pallet's group and
  peeks it; commands that open a pallet now use it, so opening a pallet
  also switches its edge to that pallet's group.
- Each group stores its own width (falling back to its widest pallet's
  width until first sized), instead of every pallet's width being kept in
  sync. Pallet widths now only size floating pallets and new groups.
- One `dock_set_open(id, open)` holds every pallet's open and close path.
- Leftovers removed: the tab-group config format that never reached main,
  the multi-tab drag ghost header, the separate icon-hover message.

Fixes:
- Hovering a strip icon reveals an auto-hiding edge again (the icons had
  lost the hover message in the option B strip). Covered by a test that
  moves the pointer over the icon in the real view.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 20:15:09 +00:00
Hakan SevenandClaude Opus 5.5 2d3077e29d Cargo: kernel 305a89e, graph 46ce9cc
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 23:12:38 +03:00
Claude 6c00b8bc91 Dock: fix double-click on title bars, centre the strip bar, close + menu
- Double-clicking a docked or floating title bar did nothing. iced keeps
  a widget's state (including the first click of a double-click) only
  while the widget tree keeps its shape, and pressing a title bar starts
  a possible drag that wrapped the workspace in an extra pointer-capture
  layer, rebuilding the title bar and forgetting the first click. The
  workspace is now always inside the same stack and mouse area; the
  capture handlers are only attached while dragging. A test drives the
  real view through iced's UserInterface (keeping its cache between
  events, as the runtime does) and fails without this fix.
- The shown group's edge bar was shorter than its row (the tooltip
  around the edge band sized it to its content), so it looked off
  centre. Band and bar now have explicit heights.
- Picking a pallet in the + menu closes the menu.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 20:03:15 +00:00
Claude 96b4479f58 Dock: option B icon strip with an edge-band group grip
The icon strip follows the agreed "option B" concept:

- Flat 40 px strip; groups are rows of their pallets' icons separated by
  hairline dividers, with no grip lines. The + button is a small round
  button under the last group.
- The shown group is marked by a blue bar on its window-side edge and
  brighter icons. That 8 px edge band is the group grip: hovering it
  widens and lights the bar, tints the row, shows a grab cursor and a
  "Drag to move group" tooltip; dragging it moves the whole group.
- Icons still drag single pallets: within their group or into another
  group (between its icons), or onto a divider to start a new group.
  Hovering an icon gives it a soft background and shows its name.
- Drop feedback: a short accent line with end caps between icons means
  "join this group here" (the target group's bar lights up); a
  full-width line on a divider with a "+ New group" badge means "new
  group here". The dragged icon (or whole group) fades in place and a
  ghost follows the pointer.
- The zone around a divider (a few px into the icons on either side)
  starts a new group; the lower half of a group's last icon still joins
  that group at the end.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 19:46:27 +00:00
Karim Jerbi a3742e5668 fix(styles): follow text rename into dimstyle dimtxsty
rename_style_storage and rename_symbol rewrote entities and table rows but left dimtxsty stale, so the next Apply resolved a NULL handle. The follow now lives in both shared functions; the plugin workaround is removed as redundant. Tests: text_rename_follows_dimtxsty drives the manager path (RED first); pre-existing plugin rename test stays green via the shared path. Full suite: 2015 passed / 0 failed / 25 ignored.
2026-10-09 20:44:53 +01:00
Claude 77ddc59df3 Dock: fix crash dragging a pallet that is alone in its group
Dragging a pallet over its own group (e.g. the block palette, alone on
the right edge) targeted joining that group. Joining first detached the
pallet, which removed the now-empty group, then indexed it: an
out-of-bounds panic, hit already by the live drop preview. A pallet alone
in the group it would join now just stays put.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_013RyGiMXcsf9HTKfqDxaQGt
2026-10-09 19:29:37 +00:00
Hakan SevenandClaude Opus 5.5 713930de82 Cargo: kernel 65d5b8d, graph 64ad77b
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-09 22:13:14 +03:00