impress/impress.js
49.2
Weak · 25 September 2026
9k
lines of production code
JavaScript
primary language
4
measurements over time
What this system is
This release introduces a comprehensive plugin ecosystem, adding new capabilities for navigation (goto, bookmark, skip), media handling, and progressive content reveal (substeps). The core library has been updated to version 2.0.0, featuring a refactored architecture with a new utility library for cleaner DOM and event management. Additionally, the project undergoes a significant infrastructure overhaul, including a new build system, expanded documentation, and a complete QUnit test suite for core functionality.
Features
Add 3D cube presentation example
A new demo example named 'cube' has been added to the examples/cube directory. This example showcases a simple 3-dimensional presentation using CSS 3D transforms, featuring a cube-shaped navigation structure with six steps. The addition includes the necessary HTML structure, CSS styles for the 3D layout and typography, and font definitions to support the visual presentation.
examples/cube · high confidence
Add 3D rotation demo presentation
A new demo presentation titled 'A Study in 3D Rotations' has been added to the examples directory. This example demonstrates the use of the \data-rotate-order\ attribute to apply 3D rotations in a specific order ('zyx' instead of the default 'xyz'), allowing for slide positions that are not possible with the default rotation order.
examples/3D-rotations · high confidence
Add 3D-positions example demonstrating relative positioning and rotation
A new example page at examples/3D-positions/index.html has been added to demonstrate the 'relative' positioning mode. This page showcases how to use data-rel-position, data-rel-rotate, and data-rel-reset attributes to easily construct 3D slide layouts, such as nested boxes and circular rings of slides, without manually calculating absolute coordinates for each element.
examples/3D-positions · high confidence
Add Markdown-based presentation example
A new example presentation is added at examples/markdown/index.html, demonstrating how to author impress.js slides using Markdown syntax. The example includes CSS for styling, JavaScript for toggling themes, and references to external libraries (highlight.js, mermaid.js, markdown.js) to convert Markdown to HTML client-side.
examples/markdown · high confidence
Add Mobile plugin for resource optimization
A new Mobile plugin has been added to the project, designed to optimize presentation performance on mobile devices by hiding most slides via CSS. The plugin detects mobile user agents to apply a 'impress-mobile' class to the body, and dynamically manages 'prev' and 'next' CSS classes on adjacent slides, allowing authors to hide non-active slides to save resources.
src/plugins/mobile · high confidence
Add blackout plugin to hide slides
A new 'blackout' plugin has been added to the presentation software. This feature allows users to temporarily hide all slides by pressing the 'B' or '.' keys, effectively blanking the screen. Pressing the same keys again restores the view. The plugin also automatically restores the slides when navigating to a different slide.
src/plugins/blackout · high confidence
Add classic-slides example presentation
A new example presentation named 'classic-slides' has been added to the examples directory, providing a simple, traditional slide-show template for first-time users. The example includes a navigation index entry linking to the new demo, and the presentation itself demonstrates standard slide layouts with relative positioning and rotation effects.
examples/classic-slides · high confidence
Add classic-slides example with custom fonts and styling
A new 'classic-slides' example has been added to the documentation, providing a complete CSS theme for presentations. This includes a main stylesheet (classic-slides.css) that defines the layout, typography, and visual style for slides, along with a separate fonts.css file that embeds the required web fonts (Open Sans, PT Sans, PT Serif, and Cutive Mono) to ensure consistent rendering across different browsers and devices.
examples/classic-slides/css · high confidence
Add default CSS for plugins and demo styling
Two new CSS files, \impress-common.css\ and \impress-demo.css\, are introduced. \impress-common.css\ provides default styles for plugin functionality, including hiding substeps, styling the toolbar, progress bar, and help overlay, and applying a \pointer-events: none\ workaround to ensure 3D elements remain clickable. \impress-demo.css\ supplies the visual styling for the demo presentation, including a browser fallback message and step appearance.
css · high confidence
Add extras plugin for automatic initialization of optional add-ons
A new 'Extras' plugin has been added to automatically discover and initialize optional add-on plugins (such as Mermaid or syntax highlighting libraries) that are loaded into a presentation via script tags. The plugin scans for elements with the 'markdown' class and converts their content to HTML using available markdown parsers (marked or builtin), while also triggering initialization for other loaded extras like Mermaid.
src/plugins/extras · high confidence
Add fullscreen plugin with remote controller support
A new fullscreen plugin has been added, allowing users to enter and exit fullscreen mode by pressing F5 and Escape keys, which are commonly found on presentation remote controllers. This provides an alternative to the browser's native fullscreen (typically F11) and is designed to work alongside the impressConsole plugin.
src/plugins/fullscreen · medium confidence
Add help popup plugin
A new help plugin is introduced, displaying a popup with keyboard shortcuts and help text. Users can trigger the help display by pressing 'H' or '?', or by adding a \<div id="impress-help"\> element to their presentation. The plugin listens for the 'impress:help:add' event to dynamically update the help content.
src/plugins/help · high confidence
Add impressConsole plugin for presenter view
The impressConsole plugin is now available, providing a speaker console window that displays the current slide, a preview of the next slide, and speaker notes. The console supports English and Chinese languages and allows navigation between slides. Users can hide notes from the main presentation by adding a CSS rule to hide elements with the 'notes' class.
src/plugins/impressConsole · high confidence
Add mouse-timeout plugin to hide UI elements during inactivity
A new 'mouse-timeout' plugin has been added to the Impress.js codebase. This plugin monitors mouse activity and, after 3 seconds of inactivity, adds the CSS class \body.impress-mouse-timeout\. This allows users to hide elements like toolbars or the cursor via CSS when the user is inactive, improving the presentation's visual focus. The plugin is located in \src/plugins/mouse-timeout/\.
src/plugins/mouse-timeout · high confidence
Add navigation UI plugin for slide controls
A new navigation-ui plugin is introduced, providing back, forward, and a dropdown list to select specific slides. The plugin integrates with the existing toolbar plugin, making the navigation controls visible when the toolbar is enabled. The dropdown list dynamically updates based on the current steps, using each element's title attribute for the option text, falling back to the element's ID if no title is provided.
src/plugins/navigation-ui · high confidence
Add navigation and resize plugins
Users can now navigate presentations using keyboard shortcuts (arrow keys, space, page up/down, tab) and mouse clicks on step links or step elements, and the presentation automatically rescales when the browser window is resized. This introduces the navigation and resize plugins, which listen for the \impress:init\ event to attach their respective event handlers.
src/plugins/navigation · high confidence
Add progress bar and step counter plugin
A new 'progress' plugin is introduced for impress.js presentations, providing a visual progress bar and a step counter (e.g., '1/5') that update as the user navigates through slides. The plugin listens for 'impress:stepleave' and 'impress:steprefresh' events to calculate and display the current position within the presentation. Usage involves adding specific HTML elements with classes 'impress-progressbar' and 'impress-progress', with styling provided in the plugin's README.
src/plugins/progress · high confidence
Add skip plugin to bypass slides during navigation
A new 'skip' plugin has been added to the presentation framework, allowing users to mark specific slides with the 'skip' CSS class. When navigating with next/prev commands, the plugin automatically skips over these marked slides, moving directly to the next non-skipped step. This enables creators to include hidden or intermediate content that is accessible via direct links but not part of the standard navigation flow.
src/plugins/skip · high confidence
Add swipe and tap navigation for touch devices
Users can now navigate between slides using swipe gestures or by tapping the left and right edges of the screen on touch-enabled devices. This new touch plugin detects left and right swipes to move to the previous or next slide, and also supports tapping the screen edges to trigger slide transitions, providing an alternative to keyboard or mouse-based navigation.
src/plugins/touch · high confidence
Added 2D navigation demo example
A new demo example for 2D navigation has been added to the project. This example demonstrates non-linear presentation navigation using the 'goto' and 'bookmark' plugins, allowing users to jump between specific steps using keyboard shortcuts (e.g., pressing 1-9 or specific letter keys) and navigate freely in two dimensions.
examples/2D-navigation · high confidence
Added goto and stop plugins for non-linear navigation and slide stopping
Users can now use the new 'goto' plugin to define custom navigation paths via data attributes (e.g., data-goto, data-goto-next, data-goto-prev, data-goto-key-list) to jump to specific slides or map keyboard keys to slide transitions. Additionally, the 'stop' plugin allows presenters to prevent automatic progression by adding a 'stop' class to a slide, effectively halting the presentation flow at that point.
src/plugins/goto · high confidence
Added relative positioning plugin for steps
A new 'rel' plugin has been added to the codebase, enabling users to define step coordinates relative to previous steps or specific named steps. This allows for more convenient presentation creation by supporting relative X, Y, and Z attributes, as well as screen-relative units (e.g., '1.5w' for 1.5 times the screen width). The plugin also supports relative rotation and inheritance of previous step values, with a reset mechanism to clear inherited values. This change introduces a new capability for positioning elements relative to other elements in the presentation.
src/plugins/rel · high confidence
Autoplay plugin added
A new Autoplay plugin has been introduced, allowing presentations to automatically advance to the next slide after a specified timeout. Users can configure a global default timeout via the \data-autoplay\ attribute on the root element, and override it per-step. The plugin also integrates with the presentation toolbar, providing a play/pause button to control the automatic progression.
src/plugins/autoplay · high confidence
Introduce the Substep plugin for progressive content reveal
A new 'Substep' plugin is added to allow progressive revelation of content within a single step, similar to PowerPoint animations. The plugin intercepts navigation to reveal or hide elements with the 'substep' class, supporting an optional 'data-substep-order' attribute for custom ordering. It adds 'substep-visible' and 'substep-active' CSS classes to manage visibility and provides custom events for integration.
src/plugins/substep · high confidence
New Bookmark plugin for hotkey-based navigation
A new 'bookmark' plugin has been added to the system, enabling non-linear navigation via hotkeys. Users can assign custom keys (e.g., 1, 2, 3, A, B, C) to specific steps by adding a \data-bookmark-key-list\ attribute to step elements. Pressing these keys will instantly navigate to the corresponding step, with repeated presses cycling through steps assigned to the same key.
src/plugins/bookmark · high confidence
New form plugin for input handling
A new 'form' plugin has been added to handle user interactions with input, textarea, and button elements within presentations. It prevents keyboard shortcuts (like 'P' for the presenter console) from triggering while typing in form fields by stopping event propagation, and automatically blurs active form elements when leaving a step to prevent accidental input. Note that TAB navigation between form elements is currently not supported.
src/plugins/form · high confidence
New markdown slide presentation styles and fonts
Added new CSS styles for markdown-based presentations, including the 'devopsy' theme with dark background and yellow text, the 'effects' theme with color and transform transitions, and the 'markdown-slides' base style. The update also includes font definitions for 'Cutive Mono' and 'Open Sans' to support the presentation templates.
examples/markdown/css · high confidence
New media plugin for automatic playback and state management
A new media plugin has been introduced, enabling automatic playback of audio and video elements when entering a step, with configurable stop or pause behavior when leaving. It also adds CSS classes (e.g., \impress-media-video-playing\) to the body to allow styling changes during media playback, and supports data attributes like \data-media-autoplay\ to control media behavior at the step or root level.
src/plugins/media · high confidence
New utility and garbage-collection libraries for cleaner DOM and event management
The presentation engine now includes a new library framework that allows plugins and core code to manage DOM elements, event listeners, and cleanup callbacks more cleanly. A new \gc\ (garbage collection) library provides utilities like \pushElement\, \pushEventListener\, and \teardown\ to help plugins track and remove their own DOM nodes and listeners when the presentation is torn down. Additionally, a \rotation\ library adds helper functions for vector math and quaternion-based 3D rotation calculations, while the \util\ library now includes \toNumberAdvanced\ to support relative-to-screen-size values (e.g., \5w\) and uses \decodeURIComponent\ for URL hash parsing. These libraries are accessible via the \impress().lib\ API.
src/lib · high confidence
Project infrastructure and documentation overhaul
The project has been restructured with a new build system (build.js) that concatenates core and plugin scripts, and includes a QUnit-based test runner (qunit\_test\_runner.html) and Karma configuration (karma.conf.js) for automated testing. Documentation has been significantly expanded with new GettingStarted.md and DOCUMENTATION.md files, while the README.md was updated with usage instructions, browser support details, and contributor information. Additionally, standard repository configuration files (.eslintrc.js, .gitattributes, .gitignore, .gitmodules, .jscsrc, .jshintrc, .npmignore) and a MIT LICENSE file were added to standardize development practices and clarify licensing.
(repo-wide) · high confidence
impress.js v2.0.0: New plugin and library frameworks
The core library has been updated to version 2.0.0, introducing new extensibility features. Users can now register synchronous preInit and preStepLeave plugins, and add custom libraries to the framework. Additionally, the codebase has been reorganized by moving helper functions from the core to src/lib/util.js.
src · high confidence
Behavioural changes
New toolbar plugin for consolidating GUI widgets
A new 'toolbar' plugin has been added to the project, providing a generic graphical toolbar that allows other plugins to add buttons or widgets to a single, consolidated UI element. Presentation authors can activate the toolbar by adding a specific div, and plugin authors can add widgets to it by triggering custom events (such as 'impress:toolbar:appendChild' or 'impress:toolbar:insertBefore'). This change introduces new behavior for managing the toolbar's state and DOM structure.
src/plugins/toolbar · medium confidence
impress.js updated to version 2.0.0
The bundled JavaScript file js/impress.js has been updated to version 2.0.0. This release includes a refactored core with helper functions for CSS property prefixing, transform generation, and window scaling, alongside updated copyright headers and license information.
js · high confidence
Test coverage
Added QUnit test suite for core Impress.js functionality; Added tests for the rel plugin's relative positioning and rotation features.
Dependencies
Updated development dependencies and lockfile
The project's package-lock.json has been regenerated and now includes a comprehensive list of development dependencies, including eslint, karma, qunit, and puppeteer. This update ensures that the development environment is synchronized with the latest compatible versions of these tools, which are used for linting, testing, and building the project.
(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 40 → 49 (+9.0)
- Rubric changed (rubric-2026.08.15 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 42 → 50 (+7.9)
- Architecture 100 (new)
- Maturity 55 → 50 (-5.5)
- Readiness 32 → 55 (+23.4)
- Security 58 → 67 (+9.1)
- Accessibility 43 (new)
Resolved (96)
- Change coupling: build.js ↔ impress.js (build.js)
- Change coupling: build.js ↔ impress.js (build.js)
- Change coupling: build.js ↔ navigation.js (build.js)
- Change coupling: impress.js ↔ impress.js (js/impress.js)
- Change coupling: impress.js ↔ impressConsole.js (js/impress.js)
- Change coupling: impress.js ↔ karma.conf.js (js/impress.js)
- Change coupling: impress.js ↔ navigation.js (js/impress.js)
- Change coupling: impress.js ↔ navigation.js (src/impress.js)
- Change coupling: impress.js ↔ rel.js (js/impress.js)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Critical CVE: [GHSA redacted] (package-lock.json)
- Dimension evaluation failed
- FileTooLong: js/impress.js (js/impress.js)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- High CVE: [GHSA redacted] (package-lock.json)
- …and 76 more
New (107)
- (anonymous) (cognitive 16) (src/plugins/help/help.js)
- (anonymous) (cognitive 17) (src/plugins/navigation-ui/navigation-ui.js)
- (anonymous) (cognitive 19) (src/plugins/mobile/mobile.js)
- (anonymous) (cognitive 20) (src/plugins/skip/skip.js)
- (anonymous) (cognitive 24) (src/lib/rotation.js)
- (anonymous) (cognitive 24) (src/plugins/autoplay/autoplay.js)
- (anonymous) (cognitive 24) (src/plugins/blackout/blackout.js)
- (anonymous) (cognitive 34) (src/plugins/substep/substep.js)
- (anonymous) (cognitive 37) (src/plugins/navigation/navigation.js)
- (anonymous) (cognitive 38) (src/plugins/media/media.js)
- (anonymous) (cognitive 77) (src/plugins/impressConsole/impressConsole.js)
- (anonymous) (cyclomatic 18) (src/plugins/autoplay/autoplay.js)
- (anonymous) (cyclomatic 19) (src/lib/gc.js)
- (anonymous) (cyclomatic 22) (src/lib/rotation.js)
- (anonymous) (cyclomatic 23) (src/plugins/substep/substep.js)
- (anonymous) (cyclomatic 27) (src/plugins/media/media.js)
- (anonymous) (cyclomatic 38) (src/plugins/navigation/navigation.js)
- (anonymous) (cyclomatic 65) (src/plugins/impressConsole/impressConsole.js)
- (anonymous)::computeRelativePositions (cognitive 35) (src/plugins/rel/rel.js)
- (anonymous)::computeRelativePositions (cyclomatic 27) (src/plugins/rel/rel.js)
- …and 87 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
impress/impress.js 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 b44b9694b41fd2c076c3d1ad7a0c3e0cea9eb262 — 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.