This is the master tracking issue for shipping Resortable as a stable, production-ready 2.0.0 release. Each task below links to a discrete sub-issue.
Current snapshot (2026-06-04)
Metric
Status
Branch / version
main @ 2.0.0-alpha.1 (package.json)
Git tags
v1.0.0 (synthetic anchor for semantic-release), v2.0.0-alpha.1 (historical)
Next semantic-release version
2.0.0 (verified via --dry-run)
Lint / type-check / build
β
passing
Unit tests
β
241 passing, 2 skipped
E2E tests (chromium)
β
154 passing, 42 skipped
Bundle (ESM gz)
21.99 kB (budget 50 kB β
)
TypeDoc site
β
live at https://jjeff.github.io/resortable/api/
Examples demo
β
live at https://jjeff.github.io/resortable/demo/
LICENSE / NOTICE / SECURITY / CONTRIBUTING
β
in place
dependency-review CI
β
enabled
WCAG 2.1 AA axe gate
β
chromium passes; mobile/cross-engine deferred
Published to npm
β β gated on user storing NPM_TOKEN + flipping npmPublish: true
Release gates
Feature parity (vs Sortable.js v1.x)
Parity: Implement HTML5 fallback drag systemΒ #29 β HTML5 fallback drag system (forceFallback, fallbackClass, fallbackOnBody, fallbackTolerance, fallbackOffset) β PRs feat: wire forceFallback + fallbackClass into pointer drag pipeline (#29)Β #53 , feat: wire fallbackOnBody + fallbackOffset into ghost positioning (#29)Β #54 , feat: wire fallbackTolerance pre-commit threshold (#29)Β #55 , feat: complete HTML5 fallback drag system (#29 β final)Β #56
Parity: Add 'ignore' option (legacy default 'a, img')Β #30 β ignore option (legacy default 'a, img') β PR feat: add 'ignore' option for click-through on links/images (#30)Β #82
Parity: Wire up declared-but-unused options (dragoverBubble, removeCloneOnHide, emptyInsertThreshold, dropBubble)Β #31 β Wire declared-but-unused options (dragoverBubble, removeCloneOnHide, emptyInsertThreshold, dropBubble) β PR fix: recognize empty containers as drop targets in pointer drag (#32)Β #50
Bug: Empty containers not recognized as drop zonesΒ #32 β Bug: empty containers not recognized as drop zones β PR ci: enforce bundle-size budget via size-limit (#39)Β #49
Wire onMove(event, originalEvent) with native event objectΒ #33 β Wire onMove(event, originalEvent) with native event β PRs feat: wire onMove with native event + cancellation (#33)Β #59 , feat: extend onMove to cross-zone branches (#60)Β #61
Reconcile core multi-drag with MultiDragPluginΒ #34 β Reconcile core multi-drag with MultiDragPlugin β PR refactor: reconcile multi-drag β keep as core, remove MultiDragPlugin shim (#34)Β #91 (BREAKING: shim removed; use core multiDrag: true)
Bug: Single-select mode doesn't deselect prior item when Space-selecting anotherΒ #46 β Single-select mode deselect bug β PR fix: deselect prior item in single-select mode (#46)Β #58
Quality & test coverage
Accessibility
Documentation
Documentation: API reference, migration guide, examples, plugin guideΒ #41 β API reference, migration guide, examples, plugin guide β PRs docs: migration guide from Sortable.js v1 (#66)Β #67 , docs: curated examples site (#65)Β #68 , docs: README rewrite + CDN snippets (#64)Β #69 , docs: lift plugin guide + fix TypeDoc warnings + docs landing (#63)Β #70 , feat: bundle examples + demo as gh-pages live site (#71)Β #72 (all 5 sub-issues delivered; gh-pages live)
Release engineering
Release engineering: npm publish, provenance, CDN, dry-run, securityΒ #42 β npm publish, provenance, CDN, dry-run, security β partially complete :
Hygiene: Pre-release cleanup (TODOs, stubs, types, Sortable.utils parity)Β #43 β Pre-release cleanup (TODOs, stubs, public types, Sortable.utils parity) β PR chore: pre-release cleanup β TODOs, stubs, Sortable.utils parity (#43)Β #93 (0 TODOs in src/, +4 utils: off/closest/toggleClass/clone, +16 tests, 2 dead types removed)
Out of scope for 2.0.0
Framework wrappers (React / Vue / Angular) ship as separate packages post-2.0 .
How to use this issue
This is the master tracking issue for shipping Resortable as a stable, production-ready 2.0.0 release. Each task below links to a discrete sub-issue.
Current snapshot (2026-06-04)
main@2.0.0-alpha.1(package.json)v1.0.0(synthetic anchor for semantic-release),v2.0.0-alpha.1(historical)2.0.0(verified via--dry-run)NPM_TOKEN+ flippingnpmPublish: trueRelease gates
Feature parity (vs Sortable.js v1.x)
forceFallback,fallbackClass,fallbackOnBody,fallbackTolerance,fallbackOffset) β PRs feat: wire forceFallback + fallbackClass into pointer drag pipeline (#29)Β #53, feat: wire fallbackOnBody + fallbackOffset into ghost positioning (#29)Β #54, feat: wire fallbackTolerance pre-commit threshold (#29)Β #55, feat: complete HTML5 fallback drag system (#29 β final)Β #56ignoreoption (legacy default'a, img') β PR feat: add 'ignore' option for click-through on links/images (#30)Β #82dragoverBubble,removeCloneOnHide,emptyInsertThreshold,dropBubble) β PR fix: recognize empty containers as drop targets in pointer drag (#32)Β #50onMove(event, originalEvent)with native event β PRs feat: wire onMove with native event + cancellation (#33)Β #59, feat: extend onMove to cross-zone branches (#60)Β #61MultiDragPluginβ PR refactor: reconcile multi-drag β keep as core, remove MultiDragPlugin shim (#34)Β #91 (BREAKING: shim removed; use coremultiDrag: true)Quality & test coverage
waitForAnimationsAbortError flake β fix shipped in helpers; soak validated by 30+ subsequent clean PRsnavigator.maxTouchPointscheck)ghost-elements:153cross-list drag flake β PR test: skip Mobile Safari dragAndDrop flakes (#62)Β #81 (project-scoped skip)Accessibility
Documentation
Release engineering
2.0.0next)package.jsonexports (sortable.esm.js) (chore: fix dist ESM filename + add SECURITY.md / CONTRIBUTING.mdΒ #90)NPM_TOKENsecret (Settings β Secrets and variables β Actions)npmPublish: falseβtruein.releaserc.jsondevelopbranch (per.releaserc.jsonbranch config)Sortable.utilsparity) β PR chore: pre-release cleanup β TODOs, stubs, Sortable.utils parity (#43)Β #93 (0 TODOs in src/, +4 utils: off/closest/toggleClass/clone, +16 tests, 2 dead types removed)Out of scope for 2.0.0
Framework wrappers (React / Vue / Angular) ship as separate packages post-2.0.
How to use this issue
release-blockerlabel; downgrade requires maintainer approval.#42(user action) and the seven#73-79follow-ups (deferred).