Repository navigation
v1.0.0: Pick it up. Put it anywhere.
Changelog
v1.0.0
Stable release. Carries the full feature set, the model helper APIs,
the docs.rs example cleanup, and the public repository metadata.
- Universal touch. Every interaction pattern now works with fingers and pens in every browser, not just the ones whose native HTML5 drag happens to support touch.
BoardItemandSelectableDraggablewrapPointerDraggable, so board cards and multi-select boxes respond to touch, pen, mouse and keyboard out of the box.SortableListandSortableGridrun a pointer-event gesture path alongside the native one, driven by the same gesture state machine asPointerDraggableand hit-tested against per-row rects measured at drag start (stable pre-displacement slots, so the preview never oscillates).- New
SortableListproptouch_handle: confines touch drags to a leading grip ([data-sort-handle]) so rows inside scrollable lists keep finger-scrolling. Default remains whole-row, which setstouch-action: noneon rows. - New pure function
sortable::pointer_target(the hit-test plus midpoint hysteresis logic), unit tested. - New model helpers
core::apply_clone_or_moveandcore::apply_list_clone_or_move: apply move-vs-copy drops toHashMap<ZoneId, Vec<T>>zone models or two plainVec<T>lists, with key-based source removal and a clone hook for assigning fresh ids on copy. TreeNodeTargetregisters itself in the zone registry: tree rows are now reachable by touch hit-testing and keyboard navigation. Keyboard drops land withIntointent. Newlabelprop feeds screen-reader announcements. Touch hovers show the same livedata-intentbands as mouse hovers.- Pointer paths listen to
lostpointercaptureas a cancel signal, so a drag aborts cleanly if the browser revokes capture mid-gesture. - Fixed
sortable::displacementleaving a phantom gap: the source row
now translates toward its landing slot while neighbors make room —
previously the shifted neighbors overlapped the source (which still
occupies its slot during a native drag), leaving a gap at the target.
Offsets now conserve slot occupancy (they sum to zero). - Showcase rework: drops are visibly stateful everywhere (crates land in
bays and can be dragged onward, keyboard moves render, the tree really
restructures, received links and loaded boxes stay visible), the
FLIP-plus-displacement double animation is gone, and the layout gains a
white workbench surface so the taupe reads as the floor around it. - Formal gesture state machine (
core::machine): the pointer drag
lifecycle (Idle → Pressed → Dragging, threshold promotion, tap vs drop,
foreign-pointer rejection, cancellation) is now a pure, exhaustively
testedtransitionfunction.PointerDraggabledrives it; you can too,
for custom pointer interactions. - Nested keyboard traversal:
DropZones nested inside other
DropZones discover their parents automatically (via context — zero
configuration). Keyboard drags follow the WAI-ARIA tree convention:
Up/Down cycle siblings at the current level, Right descends into a
zone's children, Left ascends — falling back to plain next/previous in
flat apps. Announcements gain nesting context ("Over Column 2, inside
Board A."). Registry API:ZoneRecord::parent,parent_of,
children_of,step_sibling,first_child. - Live drop preview in
SortableList: rows translate out of the way so
a gap opens where the drop would land, with midpoint hysteresis to keep
the gap from oscillating. On by default;live_preview: falserestores
the highlight-only behavior. Pure math exposed assortable::displacement. - Forgiving touch drops:
PointerDraggablenow re-measures zone rects
on a missed drop (stale after mid-drag scroll/resize) and retries with a
closest-center fallback (ZoneRegistry::hit_test_closest,
ZoneRegistry::measure_all). - Composable drag modifiers (
core::modifiers):LockAxis,Snap,
KeepInside, chained withapply_modifiers— the generalized form of
canvas snapping, usable in custom interactions. a11y::ReorderButtons: headless move-up/move-down buttons emitting
the sameSortEventas dragging — reordering with no drag gesture at
all, the most robust accessibility fallback.dragout—ExternalDragSource/OutboundContent: drag text, links and
HTML out of your app into other tabs and applications.grid—SortableGrid: 2D tile reorder (insert-and-reflow) or swap
(dashboard) over CSS grid, pluscell_of/index_ofcoordinate helpers.multiselect—use_selection,SelectableDraggable,SelectionCount:
select several items (click / Ctrl+click) and drag them as one
Vec<K>payload.animate(experimental) —FlipItem: FLIP glide transitions on
reorder, driven by an epoch counter.- Modifier-key drop effects: Ctrl/Cmd forces Copy, Alt forces Link
(file-manager convention), reflected indropEffectfeedback and
DropOutcome::effect. Pure helper:effective_effect. - Keyboard zone navigation is now spatial (top-to-bottom,
left-to-right by measured rects) instead of registration order. - Nested drag scopes:
Draggable,SortableListandSortableGrid
stop propagation on drag start/drop, so sortables inside sortables
(and boards inside boards) each own their gestures. DropZonelabels re-sync when the prop changes across renders.sortable:ReorderMode(Insert/Swap) andapply_swap.- Ported to Dioxus
0.8.0-alpha.0(also compiles on 0.7.9). - State moved from
Signal<DragState<T>>toStore<DragState<T>>for
per-field reactivity: readingdnd.over()in render no longer reruns on
pointer moves;enter/leave/update_pointerwrite through field lenses. - Zone registry (
use_zone_registry): everyDropZoneregisters id, label,
drop callback, acceptance filter and mounted element. - Keyboard accessibility built into
Draggable(Space/Enter pick up and
drop, arrows choose a zone, Escape cancels) witha11y::LiveRegion
screen-reader announcements. - Touch/pen support:
pointer::PointerDraggable(native HTML5 path for
mouse, pointer-event hit-testing for touch). autoscroll::AutoScroll: edge-scrolling containers during drags, pure
MountedData(no JS eval).Core(DndProvider,Draggable,
DropZone,DragOverlay, store-context payload transport),files,
sortable,board,tree,canvas,externalmodules; optional
serdefeature for typedDataTransferinterop.