Skip to content
CAI
Software that uses CAICheck a score

SortableJS/Sortable

38.9

Weak · 25 September 2026

16.8k

lines of production code

JavaScript

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

Features

Add OnSpill plugins for handling dropped items outside valid targets

The OnSpill plugin has been introduced, providing two new behaviors for items dropped outside of a valid sortable target. The RevertOnSpill plugin allows a dragged item to return to its original position when spilled, while the RemoveOnSpill plugin removes the item from the DOM entirely. These plugins can be mounted individually or together via the default export.

plugins/OnSpill · high confidence

Add interactive sorting and theming assets to the demo

The st directory now includes the necessary assets to run the Sortable.js demos. This adds st/app.js, which configures various sorting behaviors (simple lists, shared groups, cloning, handles, filters, and threshold-based swapping), along with st/theme.css for the demo's visual style. It also adds st/prettify/prettify.css and st/prettify/run\_prettify.js to enable syntax highlighting for code blocks, and st/saucelabs.svg as a badge image.

st · high confidence

Added AutoScroll plugin for automatic page scrolling during drag operations

The AutoScroll plugin has been introduced to enable automatic scrolling of the page or container elements while dragging items. This feature allows users to drag items into areas that are not currently visible on the screen. The plugin supports configuration via options such as \scroll\ (to enable/disable), \forceAutoScrollFallback\ (to force the plugin's scrolling behavior even when native browser scrolling is available), \scrollSensitivity\, \scrollSpeed\, and \bubbleScroll\. It automatically handles fallback scenarios for browsers like Safari, Internet Explorer, and Edge, as well as mobile devices.

plugins/AutoScroll · high confidence

Added IFrame playground for drag-and-drop testing

A new IFrame playground has been added to the st/iframe directory, providing a dedicated environment for testing drag-and-drop functionality across document boundaries. The setup includes a main page that loads an IFrame containing a separate HTML document, allowing users to verify that Sortable.js correctly handles interactions within nested documents.

st/iframe · medium confidence

Automated build and testing scripts for Sortable.js

Added new scripts to automate the build and testing processes for the Sortable.js library. This includes configuration files for generating ES modules, UMD bundles, and minified versions, as well as scripts for running compatibility and headless browser tests using TestCafe.

scripts · high confidence

Introduce MultiDrag plugin for multi-item selection and dragging

Adds the MultiDrag plugin, enabling users to select and drag multiple sortable items simultaneously. The plugin provides configuration options such as \multiDragKey\ to specify a modifier key for selection, \selectedClass\ for styling, and \avoidImplicitDeselect\ to control deselection behavior. It also exposes \onSelect\ and \onDeselect\ events, along with utility functions for programmatic selection and deselection.

plugins/MultiDrag · high confidence

Introduce Swap plugin for swapping sortable items

Users can now enable swap mode to swap items instead of sorting them. This is achieved by setting the \swap\ option to \true\ and optionally defining a \swapClass\ for visual feedback. The plugin provides a \swapItem\ event property to identify the element that was swapped with the dragged item.

plugins/Swap · high confidence

Major refactoring and feature expansion of the Sortable library

The Sortable library has been significantly refactored and expanded, introducing a plugin architecture that supports features like MultiDrag, Swap, and AutoScroll. The update includes new options such as \delayOnTouchOnly\, \touchStartThreshold\, and \invertedSwapThreshold\, alongside improved support for shadow DOM, CSS transforms, and various frontend frameworks including Angular, React, and Vue. The build system was also migrated from Grunt to Babel and Gulp, and the library now exports modular ES modules for better tree-shaking.

(repo-wide) · high confidence

New entry points for SortableJS plugins

Three new entry files are introduced to provide different levels of plugin inclusion for SortableJS. entry-core.js exports the core Sortable class along with all available plugins (AutoScroll, OnSpill, Swap, MultiDrag) as named exports. entry-defaults.js mounts AutoScroll, RemoveOnSpill, and RevertOnSpill by default. entry-complete.js mounts Swap and MultiDrag on top of the defaults. This allows users to import only the plugins they need or use a pre-configured bundle.

entry · high confidence

Architecture

Refactor Sortable.js into modular components

The core Sortable.js implementation has been refactored into separate modules for better maintainability and tree-shaking. The main Sortable logic is now split into dedicated files: AnimationStateManager (src/Animation.js) handles all animation state and transition logic; BrowserInfo (src/BrowserInfo.js) centralizes browser detection; EventDispatcher (src/EventDispatcher.js) manages event creation and dispatching; and PluginManager (src/PluginManager.js) handles plugin lifecycle and event propagation. This modular structure allows individual components to be imported or excluded, reducing bundle size for users who do not need all features.

src · high confidence

Behavioural changes

Updated Sortable.js to version 1.15.7

The modular distribution files for Sortable.js (sortable.complete.esm.js, sortable.core.esm.js, and sortable.esm.js) have been updated to version 1.15.7. This update includes the latest changes from the Sortable library, ensuring that users of these modular builds receive the most recent bug fixes and improvements provided by the upstream library.

modular · high confidence

Test coverage

Added end-to-end tests for Sortable.js

Added new test files to verify the behavior of the Sortable.js library, including tests for sorting, grouping, nested lists, and filter/handle configurations.

tests · high confidence

Dependencies

Upgrade SortableJS to v1.15.7

The project has been renamed to 'sortablejs' and updated to version 1.15.7. This update includes a comprehensive set of dev dependencies, notably upgrading to Babel 7.x for modern JavaScript compilation, integrating Rollup for module bundling, and adding TestCafe for end-to-end testing. The package configuration now exposes ES modules and a minified build, reflecting a shift in the build tooling and development workflow.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 34 → 39 (+5.1)
  • Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 22 → 21 (-0.7)
  • Architecture 92 (new)
  • Maturity 59 → 52 (-7.2)
  • Readiness 29 → 49 (+20.4)
  • Security 75 → 71 (-3.9)
  • Accessibility 53 (new)

Resolved (142)

  • (anonymous) (cognitive 16) (Sortable.js)
  • (anonymous) (cognitive 16) (modular/sortable.complete.esm.js)
  • (anonymous) (cognitive 16) (modular/sortable.core.esm.js)
  • (anonymous) (cognitive 16) (modular/sortable.esm.js)
  • (anonymous) (cognitive 16) (src/Sortable.js)
  • (anonymous) (cognitive 46) (Sortable.js)
  • (anonymous) (cognitive 46) (modular/sortable.complete.esm.js)
  • (anonymous) (cognitive 46) (modular/sortable.core.esm.js)
  • (anonymous) (cognitive 46) (modular/sortable.esm.js)
  • (anonymous) (cognitive 46) (plugins/AutoScroll/AutoScroll.js)
  • (anonymous) (cyclomatic 16) (Sortable.js)
  • (anonymous) (cyclomatic 16) (modular/sortable.complete.esm.js)
  • (anonymous) (cyclomatic 16) (modular/sortable.core.esm.js)
  • (anonymous) (cyclomatic 16) (modular/sortable.esm.js)
  • (anonymous) (cyclomatic 16) (src/Sortable.js)
  • (anonymous) (cyclomatic 35) (Sortable.js)
  • (anonymous) (cyclomatic 35) (modular/sortable.complete.esm.js)
  • (anonymous) (cyclomatic 35) (modular/sortable.core.esm.js)
  • (anonymous) (cyclomatic 35) (modular/sortable.esm.js)
  • (anonymous) (cyclomatic 35) (plugins/AutoScroll/AutoScroll.js)
  • …and 122 more

New (190)

  • (anonymous) (cognitive 60) (modular/sortable.complete.esm.js)
  • (anonymous) (cognitive 60) (modular/sortable.core.esm.js)
  • (anonymous) (cognitive 60) (modular/sortable.esm.js)
  • (anonymous) (cognitive 60) (plugins/AutoScroll/AutoScroll.js)
  • (anonymous) (cyclomatic 41) (modular/sortable.complete.esm.js)
  • (anonymous) (cyclomatic 41) (modular/sortable.core.esm.js)
  • (anonymous) (cyclomatic 41) (modular/sortable.esm.js)
  • (anonymous) (cyclomatic 41) (plugins/AutoScroll/AutoScroll.js)
  • (anonymous)::MultiDragPlugin::dragOverCompleted (cognitive 22) (Sortable.js)
  • (anonymous)::MultiDragPlugin::drop (cognitive 48) (Sortable.js)
  • (anonymous)::MultiDragPlugin::drop (cyclomatic 27) (Sortable.js)
  • (anonymous)::Sortable (cognitive 21) (Sortable.js)
  • (anonymous)::Sortable (cyclomatic 22) (Sortable.js)
  • (anonymous)::_appendGhost (cognitive 21) (Sortable.js)
  • (anonymous)::_detectDirection (cognitive 25) (Sortable.js)
  • (anonymous)::_detectDirection (cyclomatic 27) (Sortable.js)
  • (anonymous)::_emulateDragOver (cognitive 25) (Sortable.js)
  • (anonymous)::_getSwapDirection (cognitive 42) (Sortable.js)
  • (anonymous)::_getSwapDirection (cyclomatic 21) (Sortable.js)
  • (anonymous)::_onDragOver (cognitive 129) (Sortable.js)
  • …and 170 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

SortableJS/Sortable was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 25 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 48b626bbc61afbb0f179730c1dd3cca3dcc8b788 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-dd72cc24c749.