03 — Drag-and-Drop Technology & Form-Builder UX (Web + React Native)
Research date: 2026-08-15. Version numbers, dates and licenses below were verified against the npm registry (npm view), the GitHub API, and the primary docs cited in Sources. Where a fact could not be verified from a primary source it is marked (unverified).
Summary
@dnd-kit/react0.5.0 (MIT, published 2026-06-11) is now the maintained line of dnd-kit; the legacy@dnd-kit/core6.3.1 has had no release since 2024-12-05 and its docs are filed under/legacy. The new docs call it "production ready", but it is still 0.x semver, has a rollingbetadist-tag (0.5.1-beta-20260713), and a Nov-2025 roadmap question about core-vs-react stability is unanswered by the maintainer. Treat it as "stable enough, pin exactly, wrap behind an adapter." [1][2][3][4]- The new dnd-kit merges Mouse/Touch into one PointerSensor (touch default = 250 ms delay / 5 px tolerance; mouse = 200 ms delay or 5 px distance), keeps a KeyboardSensor (Space/Enter pick-up, arrows move 10 px, Escape cancel, Space/Enter/Tab drop), and ships an Accessibility plugin with
role="button",aria-roledescription="draggable", live-region announcements and customizable screen-reader instructions — all localizable, which matters for Arabic. [5][6][7] - Atlassian pragmatic-drag-and-drop 3.0.0 (Apache-2.0, published 2026-08-14) is tiny (~4.7 kB core), framework-agnostic and virtualization-friendly, but is built on native HTML5 DnD; touch behaviour is unreliable per community reports (drops fail, long press-and-hold, no tunable delay), and its accessibility stance is "don't do keyboard drag — add an action menu (Move up/down/to top) + live-region announcements". [8][9][10][11]
- react-dnd 16.0.1 was last published 2022-04-19; last commit 2025-07-06; 475 open issues; no built-in keyboard/screen-reader path. Do not adopt for new work. @hello-pangea/dnd 18.0.1 (Feb 2025; React 18/19) is a healthy react-beautiful-dnd fork but is lists only — no grids, no independent nested lists. react-aria-components 1.20.0 offers the most complete a11y DnD (mouse, touch long-press, keyboard, screen-reader "virtual drag") but only for its own collections (ListBox/GridList/Tree/Table). [12][13][14][15]
- Raw HTML5 DnD is a trap for a builder: no reliable touch start,
dataTransfer.getData()returns null indragover(Chrome/Safari), drag image fixed at dragstart, no scrolling while dragging in some engines, browser-specific ghost rendering. Use it only for cross-window/file drops. [16] - WCAG 2.2 SC 2.5.7 Dragging Movements (Level AA) requires every drag operation to be achievable with a single pointer without dragging (e.g. select item → click "Move up/down"/"Move to…"). Keyboard support (SC 2.1.1) does not satisfy it on its own. This drives the builder design more than any DnD library choice. [17]
- React Native:
react-native-gesture-handler3.2.1 (RNGH 3.0 released 2026-05-28, hook-based API, New Architecture only) andreact-native-reanimated4.5.3 (New Architecture only, needsreact-native-worklets, peer RN 0.83–0.86); Reanimated 3.x still supports the old architecture but is "no longer actively maintained". Any RN drag/drop in Rasd Forms should assume New Architecture. [18][19][20] - RN sortable options:
react-native-sortables1.10.0 (grid/flex, RNGH 2/3 + Reanimated 3/4, both architectures, active, 970★, MIT),react-native-drax1.1.0 (v1 rewrite on Reanimated 4 + RNGH 3, arbitrary drop zones, cross-list experimental, web supported),react-native-reorderable-list0.18.1 (FlatList-based, 0.x API), and the well-knownreact-native-draggable-flatlist4.0.3 (May 2025, 229 open issues, no New-Arch statement). [21][22][23][24] - Builder UX consensus (SurveyJS Creator v3.0.0 — 2026-08-11; Form.io
@formio/js5.5.1; KoboToolbox; Formbricks): three-pane palette / canvas / property inspector, tabbed Designer–Logic–JSON–Preview–Translations, per-component "Edit JSON", conditions-and-actions logic editor with AND/OR groups + fallback, code fallback (XLSForm/JSON) for power users, question library, and undo/redo. Formbricks (12.8k★) is built on@dnd-kit/core6.3.1 + immer; Form.io usesdragula3.7.3; Kobo'skpistill usesreact-dnd16 + jQuery UI; SurveyJS has its own DnD core and a transaction-basedUndoRedoManager. [25][26][27][28][29][30] - Undo/redo: immer 11.1.16
produceWithPatches→[next, patches, inversePatches](RFC-6902-style{op,path[],value}) is the cheapest correct primitive;zundo2.3.0 (<700 B, zustand) for temporal stores; Yjs 13.6.32Y.UndoManager(500 mscaptureTimeout,trackedOrigins) if/when collaborative editing (Yjs +y-indexeddb9.0.12 + Hocuspocus 4.6.0/y-websocket3.1.0) is added. [31][32][33]
1. Web drag-and-drop libraries
1.1 dnd-kit: legacy @dnd-kit/core v6 vs new @dnd-kit/react
| Fact | @dnd-kit/core (legacy) | @dnd-kit/react (new) |
|---|---|---|
| Latest / date | 6.3.1 / 2024-12-05; @dnd-kit/sortable 10.0.0 / 2024-12-04 | 0.5.0 / 2026-06-11; beta tag 0.5.1-beta-20260713; peers React 18/19 |
| Packages | core, sortable, modifiers, utilities, accessibility | @dnd-kit/react on top of @dnd-kit/dom, @dnd-kit/abstract, @dnd-kit/state, plus @dnd-kit/helpers (array move), @dnd-kit/collision; sibling adapters @dnd-kit/vue, /svelte, /solid |
| Provider | DndContext + useSensors | DragDropProvider (sensors, plugins, modifiers props; manager passed to handlers) |
| Events | onDragStart/Over/End/Cancel with active/over | onDragStart, onDragOver, onDragEnd with event.operation.source/target and event.canceled |
| Sensors | Pointer, Mouse, Touch, Keyboard | PointerSensor (mouse+touch+pen), KeyboardSensor, DragSensor (native HTML5, for external drops) |
| Sortable | SortableContext + strategy (rectSorting, verticalList, horizontalList, rectSwapping) | useSortable({id, index, group, type, accept, handle, transition, collisionDetector}); no SortableContext, strategy inferred; optimistic sorting auto-reverted on cancel; collisionPriority for empty containers |
| Feedback | DragOverlay component | Feedback plugin (feedback option), plus DragOverlay still available |
Plugins in @dnd-kit/dom | — | accessibility, cursor, feedback, scrolling (auto-scroll), selection, stylesheet |
| Repo | 17.5k★, MIT, last push 2026-07-13, 124 open issues | same repo (master now contains only the new packages) |
Sources: [1][2][3][4][5][6][7].
Key API details verified from source (packages/dom/src/core):
- Default keyboard bindings:
start: ['Space','Enter'],cancel: ['Escape'],end: ['Space','Enter','Tab'], arrows move byoffset: 10px (legacy default was 25 px). [6] - Default touch activation:
Delay({value: 250, tolerance: 5}); text-input targets getDelay 200/0; mouse getsDelay 200/10orDistance 5; dragging from an explicit handle activates immediately.preventActivationavoids starting drags from nested interactive elements (buttons/inputs) — important in a builder where question cards contain inputs. [7] - Accessibility defaults:
role: 'button',roleDescription: 'draggable',tabIndex: 0; screen-reader instructions anddragstart/dragover/dragendannouncements are plain functions you can replace (e.g. Arabic strings, position-based wording). [5][6] - Migration guide states legacy Mouse/Touch sensors are merged,
SortableContextandCSS.Transform.toString()are gone, and modifiers move to@dnd-kit/dom(RestrictToElement,RestrictToWindow, axis,SnapModifier). It contains no explicit statement on legacy maintenance; the frozen release history speaks for itself. [4] - Multiple-container guide: cross-list moves happen in
onDragOverusingmove()from@dnd-kit/helpers; store a snapshot inonDragStartand restore ifevent.canceled. [7] - Legacy virtualization guidance: with react-window/react-virtualized use
verticalListSortingStrategyorhorizontalListSortingStrategy(the defaultrectSortingStrategydoes not support virtualization); nestedSortableContexts need uniqueids. [34]
Risk read-out: the discussion "Clarification on roadmap: @dnd-kit/react vs @dnd-kit/core" (opened 2025-11-26) has no maintainer answer as of 2026-08-15 [3]; the repo shows a lot of automated "claude/…" fix branches and steady 0.x releases (0.5.0 in June 2026 with sortable disabled: {draggable, droppable} and sensor deep-equal fixes) [2]. Adopt, pin, and isolate.
1.2 Atlassian pragmatic-drag-and-drop (PDND)
@atlaskit/pragmatic-drag-and-drop3.0.0, published 2026-08-14 (Apache-2.0). Changelog: 3.0.0 = new direct export paths with deprecated shims (…/adapter/monitor-for-external,…/utils/reorder); 2.0.0 (2026-06-16) dropped TS4 types (TS5 minimum); 1.8.0 (2026-04-17) moved on-top rendering to the Popover API top layer. Companion packages:-hitbox2.0.1,-auto-scroll3.0.1,-live-region2.0.0,-react-drop-indicator,-flourish,-react-accessibility. [8][9]- Design: thin wrapper over native HTML5 DnD; ~4.7 kB core, headless, framework-agnostic, "virtualization ready", one-way mirror of Atlassian's monorepo (no external PRs; 12.7k★, 103 open issues). [8]
- Accessibility guidance (official): arrow-key drag "does not translate well"; instead give each draggable a single "More" (…) menu with move outcomes ("Move to top", "Move to Section B…"), name actions fully for AT ("Move task 'clean dishes' to top of backlog"), announce results with
announce()from the live-region package, and manage focus after remounts. It does not cite WCAG numbers and does not address touch. [10] - Touch: GitHub discussion #93 reports drops failing ~90% of the time on touch and an over-long press-and-hold with no tunable delay; a Sept-2025 follow-up echoes it; no maintainer response. Native HTML5 DnD on iOS/Android does exist via long-press, but the reports conflict with the README's "full iOS/Android support" claim — treat touch as unverified/weak for a tablet builder. [11]
1.3 react-dnd, hello-pangea/dnd, react-aria
- react-dnd 16.0.1 (MIT): last npm publish 2022-04-19; last commit 2025-07-06 ("fix ESM import"); 475 open issues; peers include
@types/node. Keyboard/screen-reader support only via third-partydiscord/react-dnd-accessible-backend. KoboToolboxkpistill depends on it (react-dnd ^16.0.1,react-dnd-html5-backend, alongsidejquery-ui ^1.14.2for the legacy Backbone formbuilder). [12][29] - @hello-pangea/dnd 18.0.1 (Apache-2.0, 2025-02-09; peers React 18/19; repo pushed 2026-08-14, 4.0k★): mouse/touch/keyboard, screen-reader announcements, auto-scroll, multi-list, "combine", multi-drag, virtual lists (claims 10 000+ items at 60 fps). Limitations: grid layouts not supported, no independent nested lists across levels — a poor fit for section→question→repeat-group trees. [13]
- react-aria-components 1.20.0 (Apache-2.0, 2026-07-31):
useDragAndDropfor ListBox/GridList/Tree/Table; mouse, touch (long-press), keyboard (Enter to lift, Tab cycles targets, arrows choose position, Enter drops, Escape cancels), and screen-reader virtual drag with announcements; drop positionsroot/on/before/after;onReorder,onMove(across levels),onInsert; drop operationsmove/copy/link/cancel;renderDragPreview,renderDropIndicator. Keyboard/SR paths are "implemented from scratch" and thus only work inside the browser window. Excellent for an outline tree panel; not a general canvas DnD engine. [14][15]
1.4 Native HTML5 DnD pitfalls (why every builder wraps or avoids it)
Verified from a practitioner write-up and consistent with PDND's own workarounds: no touch initiation in desktop browsers, dataTransfer.getData() unreadable during dragover (Chrome/Safari) forcing shadow state, drag image only settable at dragstart and rendered differently per browser (Chrome ignores border-radius, Firefox translucent), removing the dragged node cancels the drag, no page scroll while dragging in some engines, only four cursor variants via dropEffect, Safari needs dataTransfer.items set synchronously. Legit use: dropping files/text from other windows. [16]
1.5 Touch vs pointer, keyboard, screen readers, WCAG 2.2
- SC 2.5.7 Dragging Movements (AA): "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging, unless dragging is essential…" Sufficient technique G219; examples: select then click up/down buttons, context menu "Move to…", or type a position number. Independent of SC 2.1.1 (keyboard). [17]
- Practical pattern used by Atlassian, React Aria and dnd-kit alike: (a) drag handle + activation delay on touch so scrolling still works, (b) keyboard lift/move/drop, (c) an action menu offering the same outcomes, (d) polite live-region announcements using position language ("moved to position 3 of 8 in Section Household"), (e) focus restored to the moved item. [5][10][15][17]
- RTL nuance: keyboard "left/right" for indent/outdent must flip in Arabic UI; dnd-kit lets you rebind
left/rightcodes per sensor instance. [6]
2. React Native drag-and-drop
| Library | Latest (date) | Requires | Architecture | Notes |
|---|---|---|---|---|
react-native-gesture-handler | 3.2.1 (2026-08-14); legacy tag 2.32.0 | RN * | New Arch only (3.x) | 3.0 released 2026-05-28: hook-based gestures (onActivate/onDeactivate), React-Compiler-compatible, SharedValues in gesture config, new Touchable; RectButton/BorderlessButton deprecated. [18][19] |
react-native-reanimated | 4.5.3 (2026-07-22); reanimated-3 tag 3.19.5 | RN 0.83–0.86, react-native-worklets 0.10–0.11 | New Arch only (4.x); 3.x old arch, "no longer actively maintained" | Docs' compat table lists 4.6.x as latest while npm latest is 4.5.3 (4.6.0 is nightly) — minor conflict. Web: worklets run on the JS thread, "efficiency… might be lower". [20][35] |
react-native-sortables | 1.10.0 (2026-07-23), 970★, MIT | RNGH ≥2 (v3 recommended on iOS New Arch), Reanimated ≥3 | Old + New | Sortable.Grid, Sortable.Flex, Sortable.Layer/Handle/Touchable/Pressable; auto-scroll, layout animations, haptics, insertion/swap strategies; multi-container and web not documented. [21] |
react-native-drax | 1.1.0 (2026-03-23), 705★, MIT | React ≥18, RN ≥0.68, Reanimated ^4, RNGH ≥2 (3 recommended) | New Arch (Fabric) | v1.0 full rewrite: DraxProvider/DraxView/DraxList/DraxScrollView/DraxHandle; arbitrary drop zones, payload filtering, 3 collision algorithms, cross-container reorder (experimental), reduced-motion respected, web supported. [22] |
react-native-reorderable-list | 0.18.1 (2026-07-12), 320★, MIT | RNGH ≥2.12, Reanimated ≥3.12 | — | FlatList-based, nested lists, drop indicators, auto-scroll; "0.x may introduce breaking changes". [23] |
react-native-draggable-flatlist | 4.0.3 (2025-05-06), 2.2k★, MIT | RNGH ≥2, Reanimated ≥2.8 | not stated | NestableScrollContainer/NestableDraggableFlatList, decorators; last push 2026-01-21, 229 open issues; community moving to alternatives. [24] |
react-native-web | 0.21.2 (2026-06-02) | — | — | DOM-based; @dnd-kit/react/PDND can be used in RN-web builds only via DOM refs — feasible but not documented by either project (inference). |
Take-aways: (1) the RN ecosystem has consolidated on RNGH 3 + Reanimated 4, both New-Architecture-only; (2) no RN library provides keyboard/screen-reader drag — the action-menu pattern is mandatory on native; (3) react-native-sortables is the best-maintained pure-reorder option, react-native-drax the only maintained arbitrary drop-zone framework; (4) low-end Android: keep drag as progressive enhancement, use FlashList/LegendList with DraxList if lists exceed ~100 rows.
3. Nested droppables, tree DnD and 200+ items
- Data model: flatten the tree (pages → sections → questions → repeat groups) into an ordered array with
depthandparentId; render one virtualized sortable list; compute the projected depth from horizontal pointer offset (the classic dnd-kit "sortable tree" approach). The newuseSortablegroup/type/acceptfields express legal parents (e.g. arepeat_groupacceptsquestionandgroup, but notpage). Legacy needs nestedSortableContexts with unique ids or one flat context. [7][34] - Collision detection: with nested drop targets, prefer pointer-within/closest-edge over closest-center; new dnd-kit exposes
collisionPriority(setLowon containers so items win). PDND uses-hitbox(attachClosestEdge,attachInstructionfor trees). [7][8] - Performance at 200+ items: virtualize with
@tanstack/react-virtual3.14.9 orreact-window2.3.0; legacy dnd-kit needsverticalListSortingStrategyfor virtual lists; hello-pangea and PDND both advertise virtualization; keep the property inspector outside the DnD provider so drag frames only re-render cards; memoize cards on(id, index, isDragging); collapse sections by default above a threshold; keyboard/menu moves are O(1) re-renders and are the fast path on low-end devices. [13][34][36]
4. Builder UX — what the incumbents actually do
| Capability | SurveyJS Creator 3.0 | Form.io builder | KoboToolbox Formbuilder | Formbricks | Google Forms / Typeform |
|---|---|---|---|---|---|
| Layout | Toolbox (palette) + design surface + Property Grid; Page Navigator | Sidebar groups (basic/advanced/layout/data/premium) + canvas + edit modal | "+" under each question → type picker; right-side settings; question library | Card list, per-block panels | Single-column card canvas (GF); one-question-per-screen with logic map (TF) (unverified) |
| Tabs | Designer, Preview/Test, Themes, Logic, JSON Editor (ace-builds peer dep), Translations; UI Preset Editor | Modal tabs Display / Data / Validation / API / Conditional / Logic / Layout; per-component "Edit JSON" | Question Options / Skip Logic / Validation; XLSForm code fallback | Conditional Logic on block | — |
| Logic UI | Logic tab (rule list) | Conditional tab (simple) + Logic tab (triggers/actions) | Skip-logic builder ("Add a condition") or XLSForm expression | conditions (element/variable/hiddenField, ops equals/contains/isGreaterThan/isSubmitted), nested AND/OR connectors, actions jumpToBlock/jumpToEnding (+ require/calculate), ordered rules with fallback | GF: per-option "go to section"; TF: rules + logic map (unverified) |
| Undo/redo | Yes — UndoRedoManager with startTransaction/tryMergeTransaction | events addComponent/removeComponent/updateComponent | not documented; asterisk = unsaved | immer-based state | GF: Ctrl+Z (unverified) |
| DnD engine | own dragdrop-survey-elements core | dragula 3.7.3 | react-dnd 16 + jQuery UI | @dnd-kit/core 6.3.1 + @dnd-kit/sortable 10 + @dnd-kit/modifiers 9 | — |
| Mobile builder | "responsive… mobile to desktop" (marketing) | no | no | no | GF app: yes |
| License | per-developer commercial (renderer MIT) | MIT | AGPL | AGPL/EE (repo license "Other") | SaaS |
Sources: [25][26][27][28][29][30]. Additional Kobo details: multi-select questions with Ctrl/Cmd-click then "Create group with selected questions"; cascading selects imported by pasting a spreadsheet table; save-to-library for reuse; deploy step separate from save. [28]
Design patterns worth copying:
- Three-pane + tabs (SurveyJS): Designer / Logic / JSON / Preview / Translations. Translations as a first-class tab is essential for Arabic/English/French humanitarian forms.
- Per-component JSON escape hatch (Form.io "Edit JSON") and a whole-form JSON tab with schema validation, keeping GUI and JSON in sync — mirrors Kobo's GUI ↔ XLSForm dual mode that field teams already know.
- Conditions-and-actions logic editor (Formbricks/Kobo) with nested AND/OR, ordered rules, explicit fallback, and "test every branch" via preview.
- Question library / templates (Kobo) — humanitarian orgs reuse standard modules (household roster, WASH, protection).
- Transaction-based undo (SurveyJS): batch multi-property edits into one undo step; merge consecutive keystrokes into a single entry.
4.1 Undo/redo, versioning/diff
- Command pattern implemented with immer patches:
enablePatches(),produceWithPatches(state, recipe)→[next, patches, inversePatches];applyPatchesto redo/undo; patches are{op: 'add'|'replace'|'remove', path: (string|number)[], value}(RFC 6902-inspired, array paths). Immer guarantees correctness, not minimality — compress before storing. immer 11.1.16 (2026-08-05). [31] zundo2.3.0 (2024-11-17) addstemporalundo/redo to zustand stores in <700 B;history-adapterpairs immer with Redux/Zustand. [32]- The same patch stream doubles as version diff (store patch batches per save, render a change log "Q12 label changed; Q7 moved from Section 2 to 3") and as a transport for later sync.
4.2 Collaborative editing (CRDT with Yjs)
- Yjs 13.6.32 (2026-08-04): model the form definition as
Y.Map/Y.Array(orY.Textfor long labels),y-indexeddb9.0.12 (last publish 2023-11-02, still widely used) for offline persistence,y-websocket3.1.0 or Hocuspocus 4.6.0 for relay; awareness protocol for presence;Y.UndoManager({captureTimeout: 500, trackedOrigins})gives per-user undo that ignores remote edits. Liveblocks 3.24.0 is the hosted alternative. [33] - Cost: dual state (JSON ⇄ Yjs types), ordering semantics for arrays under concurrent moves, and server infra — likely a Pro-tier feature, not MVP.
4.3 Keyboard shortcuts & mobile-builder feasibility
- Common shortcut set (from the products above, exact bindings vary): Ctrl/Cmd+Z / Shift+Z undo-redo, Ctrl/Cmd+D duplicate, Delete/Backspace remove, Alt/Option+↑↓ move, Enter to add next question, Esc to deselect; command palette (Ctrl/Cmd+K) is now expected. Google Forms' exact list could not be fetched (support page 404) (unverified).
- Mobile builder: SurveyJS claims a responsive builder; Kobo/Form.io are desktop-only. Given dnd-kit's 250 ms touch delay and WCAG 2.5.7, a phone builder should be list-first with action menus and a bottom-sheet inspector, drag as optional enhancement with a visible handle. On RN,
react-native-sortables(grid/flex) orreact-native-draxcover reorder; nested tree editing on a phone is better done with "Move into…" pickers than free drag.
5. Comparison table — web DnD engines for the Rasd Forms builder
| Criterion | @dnd-kit/react 0.5 | @dnd-kit/core 6.3 | PDND 3.0 | hello-pangea 18 | react-aria 1.20 | react-dnd 16 |
|---|---|---|---|---|---|---|
| Maintenance (2026) | active (Jun/Jul 2026) | frozen since Dec 2024 | active (Aug 2026), no PRs | active | active (Adobe) | stale (2022 publish) |
| Touch | PointerSensor, delay/tolerance | TouchSensor | native long-press, reported unreliable | yes | long-press | TouchBackend |
| Keyboard drag | yes (rebindable) | yes | no (menu pattern) | yes | yes | no |
| Screen reader | live region + instructions | same | live-region pkg | yes | yes (virtual drag) | no |
| Nested/tree | group/type/accept, collisionPriority | nested contexts | hitbox tree instructions | no | Tree component | manual |
| Virtualization | inferred (DOM-based) | list strategies | yes | yes | yes | manual |
| Size (approx.) | small (multi-pkg) | ~10 kB core | ~4.7 kB core | larger (redux) | large (collections) | medium |
| Fit for Rasd | primary | fallback | secondary (external drops) | no | outline tree only | no |
Implications & recommendations for Rasd Forms
- Adopt
@dnd-kit/react(pin0.5.xexactly) behind an internal@rasd/dnd-adapterinterface (useDraggableItem,useDropTarget,useSortableItem,DndRoot). Keep the adapter thin enough that a switch to legacy core 6.3.1 or PDND is a one-package change; re-evaluate when dnd-kit ships 1.0. [1][2][3][4] - Design for WCAG 2.2 SC 2.5.7 first, drag second: every question/section card gets a "⋯" action menu with Move up / Move down / Move to top / Move to bottom / Move into… / Indent / Outdent / Duplicate / Delete, plus keyboard bindings, plus dnd-kit's KeyboardSensor. Ship this in the core (free) tier — it is also the entire reorder UX for phones and RN. [10][17]
- Localize the a11y layer: override dnd-kit
screenReaderInstructionsandannouncementswith Arabic/English/French strings using position-based wording; flipleft/rightkey bindings for indent/outdent underdir="rtl". [5][6] - Tree model + flat virtualized list: store the definition as a tree, edit it as a flattened array with depth projection; enforce parent rules via
type/accept(page ⊃ section ⊃ question|repeat_group ⊃ question); cap depth (suggest 4) to keep XLSForm/ODK-style exports sane; virtualize with@tanstack/react-virtualwhen items > ~60; keep the inspector outside the DnD provider. [7][34][36] - Touch tuning: keep dnd-kit defaults (250 ms/5 px on touch), always render a visible drag handle, set
touch-action: noneonly on the handle so the canvas still scrolls; auto-scroll via thescrollingplugin. Verify on a low-end Android device (2 GB RAM class) before GA. [7] - React Native strategy: target New Architecture (RN ≥ 0.83, RNGH 3.x, Reanimated 4.x +
react-native-worklets); declare them as peer deps with explicit ranges; usereact-native-sortablesfor in-section reorder andreact-native-draxonly if cross-zone drag is required; do not support Reanimated 3/old-arch in the builder (renderer can stay dependency-free). [18][19][20][21][22] - Undo/redo via immer patches (command pattern): every builder mutation is a named command producing
[patches, inversePatches]; coalesce keystrokes within ~500 ms (SurveyJStryMergeTransaction, YjscaptureTimeout); persist the last N patch batches to IndexedDB/SQLite for crash recovery; exposehistoryin the JSON code view as a change log. [30][31][33] - Versioning/diff: derive form-version diffs from stored patch batches (RFC-6902-like) and render "what changed since deployed v3" — a feature Kobo lacks and field M&E teams ask for; keep patch paths keyed by stable question ids, not indices. [31]
- Builder shell: three-pane (collapsible palette / canvas / inspector) with tabs Designer, Logic, Translations, JSON, Preview; Preview offers device frame + RTL toggle + offline simulation; per-component "Edit JSON" (Form.io) and whole-form JSON with schema validation. [25][26]
- Logic editor: conditions-and-actions rules with nested AND/OR groups, ordered evaluation and explicit fallback (Formbricks), applicable to questions and groups (Kobo), with an expression-code mode for XLSForm-literate users; visual "logic map" can be a later Pro feature. [27][28]
- Question/section library as a first-class palette group (Kobo pattern) — humanitarian standard modules; store as JSON fragments that drop into the tree.
- Collaboration: not MVP. If added (Pro tier), mirror the definition into Yjs types, use
y-indexeddb+ Hocuspocus,Y.UndoManagerwithtrackedOriginsper user; until then use optimistic locking with version numbers on save. [33] - Avoid: raw HTML5 DnD for the canvas, react-dnd, hello-pangea (no nesting/grids). Consider react-aria's
useDragAndDroponly for a dedicated outline-tree panel if you already adopt react-aria-components. [12][13][15][16] - Bundle discipline for low-end Android: dnd-kit and the builder must be code-split from the runtime renderer (field devices load only the renderer); measure
@dnd-kit/react+dom+helpersgzip size in CI and fail above a budget (suggest 25 kB).
Sources
All accessed 2026-08-15.
- npm registry
@dnd-kit/react(0.5.0, MIT, published 2026-06-11; beta 0.5.1-beta-20260713) and@dnd-kit/core(6.3.1, 2024-12-05) — https://www.npmjs.com/package/@dnd-kit/react , https://www.npmjs.com/package/@dnd-kit/core (verified vianpm view) - GitHub releases clauderic/dnd-kit —
@dnd-kit/react@0.5.0,@dnd-kit/helpers@0.5.0(2026-06-11) — https://github.com/clauderic/dnd-kit/releases - Discussion #1842 "Clarification on roadmap: @dnd-kit/react vs @dnd-kit/core" (2025-11-26, unanswered) — https://github.com/clauderic/dnd-kit/discussions/1842
- dnd-kit docs — React quickstart & migration guide — https://dndkit.com/react/quickstart , https://dndkit.com/react/guides/migration
- dnd-kit legacy Accessibility guide — https://dndkit.com/legacy/guides/accessibility/
- dnd-kit source:
packages/dom/src/core/sensors/keyboard/KeyboardSensor.ts,plugins/accessibility/defaults.ts,sensors/drag/DragSensor.ts— https://github.com/clauderic/dnd-kit/tree/master/packages/dom/src/core - dnd-kit docs —
useDraggable,useSortable, multiple sortable lists; sourcesensors/pointer/PointerSensor.ts— https://dndkit.com/react/hooks/use-draggable , https://dndkit.com/react/hooks/use-sortable , https://dndkit.com/react/guides/multiple-sortable-lists - atlassian/pragmatic-drag-and-drop README — https://github.com/atlassian/pragmatic-drag-and-drop
@atlaskit/pragmatic-drag-and-dropCHANGELOG (3.0.0 2026-08-14, 2.0.0 2026-06-16, 1.8.0 2026-04-17) — https://github.com/atlassian/pragmatic-drag-and-drop/blob/main/packages/core/CHANGELOG.md- Atlassian Design — Pragmatic drag and drop accessibility guidelines — https://atlassian.design/components/pragmatic-drag-and-drop/accessibility-guidelines
- Discussion #93 "Mobile/Touch Support?" — https://github.com/atlassian/pragmatic-drag-and-drop/discussions/93
- react-dnd repo (last commit 2025-07-06; 475 open issues) and npm 16.0.1 (2022-04-19) — https://github.com/react-dnd/react-dnd
- hello-pangea/dnd README (18.0.1) — https://github.com/hello-pangea/dnd
- npm
react-aria-components1.20.0 (2026-07-31) — https://www.npmjs.com/package/react-aria-components - React Aria — Drag and Drop — https://react-aria.adobe.com/dnd
- "HTML5 Drag & Drop — Not the API You're Looking For" (sam.today) — https://www.sam.today/blog/html5-dnd-the-api-that-is-gaslighting-you
- W3C — Understanding SC 2.5.7 Dragging Movements (WCAG 2.2, Level AA) — https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html
- Software Mansion blog — "Introducing Gesture Handler 3.0" (2026-05-28) — https://swmansion.com/blog/introducing-gesture-handler-3-0-hook-based-api-deeper-reanimated-integration-more-9185b0c8e305/
- GitHub release react-native-gesture-handler v3.0.0 — https://github.com/software-mansion/react-native-gesture-handler/releases/tag/v3.0.0
- Reanimated docs — Compatibility — https://docs.swmansion.com/react-native-reanimated/docs/guides/compatibility/
- MatiPl01/react-native-sortables (1.10.0) and docs — https://github.com/MatiPl01/react-native-sortables , https://react-native-sortables-docs.vercel.app/
- nuclearpasta/react-native-drax (1.1.0) — https://github.com/nuclearpasta/react-native-drax
- omahili/react-native-reorderable-list (0.18.1) — https://github.com/omahili/react-native-reorderable-list
- computerjazz/react-native-draggable-flatlist (4.0.3) — https://github.com/computerjazz/react-native-draggable-flatlist
- SurveyJS Survey Creator overview;
survey-creator-core3.0.0 published 2026-08-11 — https://surveyjs.io/survey-creator/documentation/overview - Form.io Form Builder developer guide;
@formio/js5.5.1 depends ondragula ^3.7.3— https://help.form.io/dev/form-development/form-builder - Formbricks — Conditional Logic docs; repo
apps/web/package.json(@dnd-kit/core6.3.1,immer11.1.8) — https://mintlify.wiki/formbricks/formbricks/surveys/features/conditional-logic , https://github.com/formbricks/formbricks - KoboToolbox — Formbuilder walkthrough & skip logic — https://support.kobotoolbox.org/formbuilder.html , https://support.kobotoolbox.org/skip_logic.html
- kobotoolbox/kpi
package.json(react-dnd ^16.0.1,jquery-ui ^1.14.2,immer ^10.1.1) — https://github.com/kobotoolbox/kpi/blob/main/package.json - surveyjs/survey-creator source
plugins/undo-redo/undo-redo-manager.ts— https://github.com/surveyjs/survey-creator/tree/master/packages/survey-creator-core/src/plugins/undo-redo - Immer docs — Patches — https://immerjs.github.io/immer/patches
- charkour/zundo (2.3.0) — https://github.com/charkour/zundo
- Yjs docs — Y.UndoManager; npm yjs 13.6.32, y-indexeddb 9.0.12, y-websocket 3.1.0, @hocuspocus/server 4.6.0 — https://docs.yjs.dev/api/undo-manager
- dnd-kit legacy — SortableContext (strategies, virtualization) — https://dndkit.com/legacy/presets/sortable/sortable-context/
- Reanimated docs — Web support — https://docs.swmansion.com/react-native-reanimated/docs/guides/web-support/
- npm
@tanstack/react-virtual3.14.9,react-window2.3.0 — https://www.npmjs.com/package/@tanstack/react-virtual , https://www.npmjs.com/package/react-window