v2.2.0 — Cross-type bridges
Cross-type drops, documented and de-trapped. Providers stay monomorphic - that's the crate's core guarantee - but two things now make living next to a second provider first-class.
Added
ZoneRegistry::contains(id)andZoneRegistry::ascend(current). TheParentZonecontext is shared across payload types, so aDropZone<A>nested inside aDropZone<B>records B's id as its parent - an id that only resolves in B's registry.ascendreturns a zone's parent only when it's registered in the same registry.ParentZoneis exported from the prelude, completing the public kit (use_zone_registry,use_zone_id,ZoneRecord) for building custom zones - including bridge zones registered in two type-worlds at once.- README section Mixing payload types: when one provider with an enum payload is the answer, and when to bridge two providers by registering the same
ZoneId(ids are process-global) in both registries with sharedmounted/rectsignals. Every drop stays typed; no erased channel. - Gallery page Standup: tickets and teammates drag in separate providers; a shared agenda tray built from double registration (in ~40 lines of user-land code) accepts both.
Fixed
- Keyboard navigation could dead-end across type-worlds: ArrowLeft from a zone nested under a foreign-type zone entered the foreign parent's id, which this world's registry can't resolve - announcements degraded to "zone N" and Enter silently did nothing while the payload stayed held. Ascend now skips unresolvable parents (falling back to the previous sibling), and Enter's target resolution skips a hovered id that isn't in the registry (falling back to the first acceptable zone).
- The Playwright web server command used
--interactive false-style flags, which dx 0.7 parses as a subcommand; switched to the=form. - Zero clippy warnings again under Rust 1.96.
Tests
125 passing: 76 unit, 35 runtime, 2 doctests, and 12 Playwright browser regressions - including a new one driving real pointer drags from two payload worlds onto one shared bridge zone.