reveal.js is a web-based presentation framework for creating interactive HTML slide decks. It provides core presentation functionality including slide navigation, fragments, themes, transitions, and multimedia support through a modular architecture. The system consists of a core Reveal.js class that manages presentation state, specialized controllers for features like keyboard input, fragments, and slide content, and a plugin system for extending functionality (e.g., markdown, math, notes, zoom). The framework is distributed as an npm package with UMD, ESM, and TypeScript definitions, and includes a React wrapper for component-based usage. The architecture follows a modular controller pattern where each presentation aspect (keyboard, fragments, progress, etc.) is handled by a dedicated controller class with bind/unbind lifecycle methods. Plugins register initialization and destruction methods through a centralized plugin manager. The React wrapper encapsulates reveal.js functionality into reusable components (Deck, Slide, Stack, Fragment) with a useReveal hook for API access. Build processes use Vite and TypeScript for modern bundling, with separate configurations for core, plugins, and themes. The codebase demonstrates strong engineering practices: clear separation of concerns, isolated utility modules (color conversion, device detection), comprehensive TypeScript definitions, and extensive test coverage. Recent commits indicate active maintenance, and the project maintains compatibility with modern web standards while avoiding legacy dependencies. The plugin system and utility modules exhibit high reusability potential for extraction into other projects.
impress.js is a client-side JavaScript presentation framework that leverages CSS3 3D transforms and transitions to create dynamic, Prezi-like slideshows. The core library manages step navigation, camera positioning, and event handling, exposing a simple API (`impress().init()`, `next()`, `prev()`, `goto()`). It features a plugin system where each plugin is a separate file under `src/plugins/`, communicating via events. Plugins add functionality such as autoplay, markdown rendering, speaker console, touch/swipe navigation, and relative positioning. The build process (`build.js`) concatenates the core and all plugins into a single distributable file (`js/impress.js`) and minifies it with Terser. The repository includes multiple example presentations demonstrating various features, a QUnit test suite, and CI configuration. There are no runtime dependencies; the library is designed to work in modern browsers with CSS 3D support. The codebase is well-structured with clear separation of concerns, though some tooling (jshint, jscs, ESLint 6) and a Node requirement of >=7.6 indicate moderate technical drift.