hakimel/reveal.js
The HTML Presentation Framework
📋 Changes
- Upgrade to Vite 8 and TS 6
- Blacklist `previewIframe` in postMessage API #3887
- Fix exception in media control removal during PDF exports #3888
- Full Changelog: https://github.com/hakimel/reveal.js/compare/6.0.0...6.0.1
✨ New Package: @revealjs/react
- ```jsx
- import { Deck, Slide, Fragment } from '@revealjs/react';
- <Deck>
- <Slide>
- <h1>Hello World</h1>
- <Fragment asChild>
- <h2>Appears on click</h2>
- </Fragment>
- + 4 more
💥 Breaking Changes
- See the full [upgrade guide](https://revealjs.com/upgrading/) for step-by-step instructions. The short version:
- Plugin paths have moved —if your presentation HTML loads plugins directly from the file system or via CDN, update your paths from `plugin/<name>/plugin.js` to `dist/plugin/<name>.js` (e.g. `plugin/notes/notes.js` → `dist/plugin/notes.js`, `plugin/highlight/monokai.css` → `dist/plugin/highlight/monokai.css`)
- ES module paths renamed — `.esm.js` files are now `.mjs` (e.g. `dist/reveal.esm.js` → `dist/reveal.mjs`). If you import via bare module specifiers this doesn't affect you.
- CSS paths changed — if you install via npm, the `dist/` prefix has been dropped from the public package API (e.g. `reveal.js/dist/reveal.css` → `reveal.js/reveal.css`).
- TypeScript — reveal.js now ships with types included. If you were previously using `@types/reveal.js` you can remove it and migrate. Note that the type names are slightly different, more info in the [upgrade guide](https://revealjs.com/upgrading/).
📋 Changes
- Switch from gulp to [Vite](https://vite.dev/) for building and running reveal.js (@hakimel)
- Add official React wrapper for reveal.js — [@revealjs/react](react/README.md) (@hakimel)
- TypeScript types are now published as part of the package, based on the great work over at [@types/reveal](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/reveal.js)
- Dark mode and llms.txt support for [revealjs.com](https://revealjs.com).
- Add `controls: 'speaker'` config option to show controls only in speaker view (@hakimel in #3853)
- Videos blocked from autoplaying with audio will now play muted with an unmute button, replacing the previous browser-dependent blocked state (@hakimel)
- MathJax 4 support in the math plugin (@Khlick in #3811)
- Accessibility improvements: `alt` tags on images and videos are now announced by screen readers, and slide content is better punctuated for screen reader text (@hakimel in #3757, #3772)
- + 9 more
🐛 Fixes
- Fix videos not autoplaying when navigating with control arrows on Android (@hakimel)
- Fix initial video autoplay not working on Android (@hakimel)
- Fix multiple videos started simultaneously sometimes failing to render in Mobile Safari (@hakimel)
- Fix overview mode missing slide thumbnails in adjacent stacks with more than 10 vertical slides (closes #3754) (@hakimel)
- Fix missing font in dracula theme (fixes #3781) (@hakimel)
- Fix SCSS deprecation warnings by refactoring all themes to latest Sass syntax (@hakimel)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.2.1...6.0.0
🐛 Lightbox bug fixes and improvements
- Prevent reveal.js keyboard shortcuts while lightbox is open (@tobi-or-not-tobi in https://github.com/hakimel/reveal.js/pull/3767)
- Opening iframe lightboxes via `[data-preview-link]` now works all element types, not just `<a>` (@hakimel)
- Lightbox state is now persisted/restored when calling `Reveal.getState` and `Reveal.setState` (@hakimel)
- Lightbox now syncs between speaker view and main window (@hakimel)
- Fix pause overlay/lightbox layering conflict (@tobi-or-not-tobi in https://github.com/hakimel/reveal.js/pull/3768)
- Added lightbox example to demo.html
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.2.0...5.2.1
✨ New Feature: Lightbox
- ```html
- <!-- Click to show "A.png" in an overlay -->
- <img src="A.png" data-preview-image>
- <!-- Click show "B.png" in an overlay -->
- <img src="A.png" data-preview-image="B.png">
- <!-- Click to show "C.mp4" in an overlay and scale it to "cover" -->
- <img src="A.png" data-preview-video="C.mp4" data-preview-fit="cover">
- <!-- Works with any element type -->
- + 5 more
📋 Changes
- Upgrade to gulp 5.0.
- Add `controls: "speaker-only"` config option for only showing controls in speaker view (@gpotter2 in https://github.com/hakimel/reveal.js/pull/3716)
- Extend search API to include `closeSearch` and `toggleSearch` (@lechten in https://github.com/hakimel/reveal.js/pull/3685)
- Automatic source code spellcheck via GitHub action (@yarikoptic in https://github.com/hakimel/reveal.js/pull/3602)
- Math plugin now ignores `code` tags by default (@hakimel in 0d02d8a303a39b02c919d86c94ec477d1e1b107d)
- Muted background videos now autoplay in the speaker view.
- Prevent `initialize` from being called twice (@hakimel in 16ac4b00671a8ac6433091118c4ebd9b00255545)
- Auto-animate no longer skips matching fragments on adjacent slides (@hakimel in 6dea2a50941bf3be6824b3eadc5cb17feb87eb5b)
🐛 Bug fixes
- Fix reveal.js not covering full viewport height in iOS by switching to `100dvh` (@hakimel in 6cebb771eec18e244a23719f94baf0e70242abe7)
- Fix background video restarting when switching fragments from notes view (https://github.com/hakimel/reveal.js/issues/3633)
- Fix gulp package not working in gulp 5 (@dennybiasiolli in https://github.com/hakimel/reveal.js/pull/3701)
- Fix last slide not triggering `slidechange` event in scroll view (@hakimel in fe4a6e82b01df923085fa867656cf11180490465)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.1.0...5.2.0
📋 Changes
- Add the `enter-fullscreen` class to any element in your presentation to turn it into fullscreen trigger (@hakimel)
- Video backgrounds now continue to play seamlessly across multiple slides (@hakimel)
- https://github.com/hakimel/reveal.js/assets/629429/d1bcbced-5ede-4e2d-83fb-d3f3804eb674
🐛 Fixes
- MathJax3 plugin now works with in non-singleton reveal.js instances (@jokester in https://github.com/hakimel/reveal.js/pull/3595)
- Changing slides via swipe gestures now works when swiping on videos—unless their controls are visible (@hakimel)
- Fix exception when destroying uninitialized reveal.js instance (@hakimel in #3593)
- Fix videos restarting each time a fragment is shown (@hakimel in #2882)
- Fix broken backwards navigation in RTL mode (@hakimel)
- Fix error when the notes plugin receives a non-string message (@NatKarmios in https://github.com/hakimel/reveal.js/pull/3588)
- Fix question mark shortcut on non-English keyboard layouts (@lechten in https://github.com/hakimel/reveal.js/pull/3603)
- Fix `r-stack` overflow behavior in Chromium browsers (@alifeee in https://github.com/hakimel/reveal.js/pull/3598)
- + 1 more
📋 Changes
- Keyboard navigation support in scroll view (@hakimel in #3515)
- Add F1 shortcut for showing help overlay (@gchriz in #3570)
🐛 Fixes
- Fix postMessage XSS exploit (@hakimel in 3dade6117628beb7706b4abdc61c268ce281abbc)
- Fix stack backgrounds not working in scroll view (@bouzidanas in #3568)
- Fix `fragmentshown` and `fragmenthidden` not firing in scroll view (@bouzidanas, @ hakimel in #3580)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.0.4...5.0.5
🐛 Fixes
- Missing slide backgrounds in mobile scroll view (#3554)
📋 Changes
- Search plugin now supports searching for diacritics and searches full phrases (@t-fritsch in #3532)
- Jump-to-slide now adapts to the configured slide number format (@hakimel in #3501)
- Slide background XSS prevention (@EastSun5566 in https://github.com/hakimel/reveal.js/pull/3548)
🐛 Fixes
- Fix speaker notes not appearing in PDF exports (@hakimel in #3535)
- Fix exception when stepping backwards through code highlights (@hakimel in #3524)
- Fix exception when navigating decks in mobile browsers (@hakimel in #3539)
- Fix pause/help overlay position in scroll view (@hakimel in #3542)
- Fix mobile scroll view navigation when fragments began at a index higher than 1 (@hakimel #3540)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.0.2...5.0.3
📋 Changes
- Upgrade dependencies (@Mister-Hope in https://github.com/hakimel/reveal.js/pull/3505)
- Make Markdown plugin callable without a reveal deck instance (@hakimel in https://github.com/hakimel/reveal.js/issues/3517)
- Fix exception in speaker view (@hakimel #2512)
- Fix issue where a future vertical slide background sometimes flashed into view prematurely (@hakimel in https://github.com/hakimel/reveal.js/issues/3520)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/5.0.0...5.0.2
📦 Scroll view
- reveal.js 5.0 comes with a groundbreaking new feature; scroll view! (https://github.com/hakimel/reveal.js/pull/3482)
- Slide decks are a great format for giving presentations, but scrollable web pages are easier for viewers to read on their own.
- The scroll view gives you the best of both worlds—without any extra effort. Present in the format best suited for presenting, share in the format best suited for consumption.
- Here's what it looks in action:
- https://github.com/hakimel/reveal.js/assets/629429/bd0e35ed-a859-4703-84ed-aac87702a6b6
- Want to try it out yourself? Check out the announcement deck I put together for slides.com 👉 <https://slides.com/news/scroll-mode/scroll>
📦 How to use it
- The scroll view is enabled by initializing reveal.js with `view: "scroll"` or by appending `?view=scroll` to a deck URL.
- ```js
- Reveal.initialize({ view: 'scroll' });
- ```
- It's possible to fine tune this view through multiple new config options. Full documentation available at <https://revealjs.com/scroll-view>.
💥 Breaking change
- ```js
- Reveal.initialize({ scrollActivationWidth: null })
- ```
📋 Changes
- The PDF print view can now be activated via config `Reveal.initialize({ view: 'print' })` (@hakimel in #3482)
- The new URL query for activating the print view is `?view=print`. It used to be `?print-pdf`, which is still supported for backwards compatibility. (@hakimel in #3482)
🐛 Fixes
- Notes from `data-notes` were not working on the slide-level (@skyboyer in https://github.com/hakimel/reveal.js/pull/3477)
- Add 'wheel' event listener, remove deprecated `mousewheel` & 'DOMMouseScroll` (@quochuy in https://github.com/hakimel/reveal.js/pull/3489)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/4.6.0...5.0.0
📋 Changes
- Add support for line number offsets in Markdown code blocks. [Read the docs](https://revealjs.com/markdown/#line-number-offset) (@flowolf #3409)
- Significantly speed up livereload (@t-fritsch #3446)
- Add support for links to the id of an element nested inside slide (@t-fritsch #3444)
- Adds ability to override Markdown plugin default options (@t-fritsch #3443)
- Allow theme subfolders (@t-fritsch #3442)
- Refactored Markdown plugin to use let/const and strict equality (@grgprarup #3454)
🐛 Fixes
- Auto-slide duration falls back on global setting `autoSlide` instead of using first fragment auto-slide (@hakimel)
- When a fragment sets `data-autoslide`, all fragments of the same index will now use the same auto-slide timing (@hakimel)
- Fix code block auto-animate bug that caused unmatched lines to appear without fading in (@hakimel)
- Fix livereload when using root CLI param (@t-fritsch #3441)
- Fix scss watch tasks broken on syntax error (@t-fritsch #3445)
- Fix typos in variable names (@individual-it #3453)
- Fix code blocks font when printing pdf (@t-fritsch #3457)
- Fix dracula's theme list-style on sub-items (@gildasio #3450)
- + 2 more
📋 Changes
- Add support for jump-to-slide! 🚀 Press the G key and type a slide number or title. [Read the docs](https://revealjs.com/jump-to-slide/) (@hakimel)
- Add `dracula` theme (@iiska #3324)
- Add two new high contrast themes: `black-contrast` and `white-contrast` (@peter-kehl @hakimel #3367)
- Add default lang attribute to index.html (@sojinsamuel)
- It's now easier to define custom fragment styles via a new `.custom` class and reduced specificity. [Read the docs](https://revealjs.com/fragments/#custom-fragments) (@hakimel)
- Live reload now works with `.html`/`.md` files in subfolders (@lolmaus #3305)
🐛 Fixes
- Update dependencies and fix all npm audit warnings (@hakimel)
- Fix issue with special characters in slide background image URLs (@Martinomagnifico #3315)
- Fix an issue where leading whitespace was sometimes incorrectly stripped from Markdown (@jerrykan #3358)
- Fix spacing between slides in overview mode when `disableLayout: true` (@Proliecan #3291)
- The reveal.js print styles will no longer apply to content outside of reveal.js (@hakimel #3348)
- Improve selection color contrast for black theme (@hakimel)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/4.4.0...4.5.0
📋 Changes
- Gradient slide backgrounds, [read the docs](https://revealjs.com/backgrounds/#gradient-backgrounds) 🌈 (@gcmznt in #2510)
- If multiple separate notes are provided for the same slide they will now all show in the speaker view (@lechten in #3010)
- Updated browser targets from `> 0.5%, IE 11, not dead` to `> 2%, not dead`
- Stop using `zoom` for presentation scaling. Zoom produced sharper upsizing than CSS transforms but it's a non-standard CSS property with a few too many quirks. e281b3234e7991283ce4dcca705dd9a6a9ebe5d2
🐛 Fixes
- Fix issue where speaker view wasn't syncing (@hakimel #3285)
- Fix incorrect slide numbers when exporting vertical slides to PDF (@chivongv in 3182)
- Fix inconsistent fragment visibility in looped presentations (@hakimel in #3123)
- Fix bug where `r-fit-text` caused text to truncate in PDF exports (@hakimel in #3120)
- Fix bug where auto-animate could interfere with inherited line-height (@hakimel)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/4.3.1...4.4.0
📋 What's Changed
- Fix bug that prevented speaker view from working from `file://` protocol (@hakimel #3158)
- Fix console errors attempting to parse postMessage events from sources other than reveal.js (@hakimel)
- Fix issue with providing your own config for MathJax3 plugin (@eric-wieser in https://github.com/hakimel/reveal.js/pull/3157)
- Fix ZIP package gulp task (@dennybiasiolli in https://github.com/hakimel/reveal.js/pull/3156)
- Replace deprecated String.prototype.substr() (@CommanderRoot in https://github.com/hakimel/reveal.js/pull/3165)
- Full Changelog: https://github.com/hakimel/reveal.js/compare/4.3.0...4.3.1
📋 Changes
- It's now possible to destroy/uninitialize a reveal.js presentation. This will remove all event listeners and roll back all changes made to the DOM. It will also unregister all plugins and destroy them if they expose a destroy method. (#1145 / @hakimel)
- ```js
- Reveal.destroy();
- ```
- You can now provide an absolute URL to the presentation that should be loaded in the speaker view. This is useful if you have a presentation integrated as part of a web page but still want the speaker view to work.
- ```js
- Reveal.initialize({ url: 'https://example.com/my-reveal-presentation' })
- ```
- + 1 more
🐛 Fixes
- Fix the speaker view no longer goes out of sync with your presentation after live-reloading (#2822 / @hakimel).
- Fix XSS vulnerability in speaker view (#3137 / @r0hanSH)
- Fix issues with scaling embedded presentations when entering fullscreen mode in Safari (#3080 / @Martinomagnifico)
🐛 Fixes
- Fix an issue where some slides disappeared (fully or partially) after slide transitions in Chrome (9e583b8df4edecb94cb89f012ae5c80014a859ee @hakimel)
- Fix an issue that caused double-navigations and impacted presentation performance (@hakimel #3079)
- Fix `--host` not working in `npm start -- --host=0.0.0.0` (@cashcat #3075)
- Fix incorrect sizing of auto-sized text in PDF exports (https://github.com/hakimel/reveal.js/issues/2865#issuecomment-970258829 @hakimel)
- Fix background video playback issue in some browsers by inferring MIME type from file extension (#3078 @vanch3d)
📋 Changes
- The math plugin now supports three typesetting libraries: KaTeX, MathJax 2 and MathJax 3. We continue to use MathJax 2 as our default so this is fully backwards compatible. Learn how to choose between typesetters and how to configure them in the docs at <https://revealjs.com/math#typesetting-libraries> (@burgerga in #2559).
- New event: `beforeslidechange` (#3003). This makes it possible to conditionally prevent navigations:
- ```js
- // This prevents all slide changes
- Reveal.addEventListener( 'beforeslidechange', e => e.preventDefault() );
- ```
- New keyboard shortcut for skipping fragments while navigating: alt + ←/↑/→/↓.
- New API option for skipping fragments in directional navigation `Reveal.right({ skipFragments: true })`.
- + 12 more
🐛 Fixes
- The last slide keyboard shortcut now works for looped presentations (#3007).
- Markdown code blocks can be turned into fragments (@nicojs in #2982).
- Unit tests can now run in Windows (@Vandivier in #3027).
- Restored support for base64 background images, broken since 4.1.1 (#2978).
- Fixes an issue that prevented presentations from looping when `navigationMode` was set to `linear`.
- Internal links leading to a slide with video/audio element will now correctly start media playback. This issue only affected mobile browsers.
📋 Changes
- Adds support for `data-auto-animate-restart` and `data-auto-animate-id`. These properties give you finer control over which slides that should auto-animate between each other (@coffeenotfound in #2896).
- Theme properties are now available as CSS variables, making them easy to override. [Full list of variables](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/exposer.scss) (#2740 + #2968).
- Here's an example you can drop into your presentation's HTML:
- ```html
- <style type="text/css">
- :root {
- --r-background-color: indigo;
- --r-main-color: #f5f5f5;
- + 4 more
🐛 Fixes
- Markdown enabled speaker notes (`<aside class="notes" data-markdown>`) are no longer visible on-slide.
📋 Changes
- Adds support for Node.js 16.
- `data-background-image` now accepts multiple images (#2940).
- New Markdown config option `animateLists` — automatically turns all lists into stepped fragments (#2956).
- Reduce the tab size in code blocks from 8 to 2.
- More accurate calculation of which slide to jump to when clicking on the progress bar (#2836).
- Optimize DOM interactions and reduce forced layouts when exporting to PDF (#2843).
🐛 Fixes
- Video/audio inside of a fragment now stop playing when the fragment is hidden.
- Markdown is now split into individual slides by the default separator (`---`) as advertised.
- The `r-fit-text` layout helper now sizes text correctly in PDF exports.
- Fixes an issue where some slide-specific transitions were incorrectly overridden by the global transition setting.
- The `has-dark-background` helper class now works when using named colors for `data-background-color ` (#2933).
📋 Changes
- New: Add `data-visibility="hidden"` to a slide to hide it from view. [Docs & examples](https://revealjs.com/slide-visibility)
- New: Add the `r-fit-text` class to make a text node grow to be as large as possible without overflowing the slide. [Docs & examples](https://revealjs.com/layout/#fit-text)
- The configured slide width/height is now exposed as CSS variables (`--slide-width`/`--slide-height`).
- The shuffle config option now shuffles vertical slides as well.
- All themes now invert the text color based on the current slide background color.
- Include /css and /js in npm package.
🐛 Fixes
- Don't append #/ to the URL on first slide.
- Don't fill the progress bar when there's only one slide in a deck
- Correct slide count when using data-visibility="uncounted" (#2675)
📋 Changes
- Enables caching for JavaScript builds, making subsequent builds ~50% faster.
- In auto-sliding presentations, the `data-autoslide` attribute now takes precedence over automatic detection of `<video>` durations.
- Remove overzealous reset styles when printing to PDF.
- `Reveal.configure` and `Reveal.isReady` are now available in the pre-initialized reveal.js API, to match v3.x behavior.
- Switches to serving demo presentation assets from a CDN.
🐛 Bug fixes
- Fixes polyfills and adds IE 11 support.
- Fixes the progress bar direction in right-to-left mode.
🐛 Bug fixes
- Fixed issues when printing speaker notes to PDF (#2671 by @s-l-lee)
- Fixed incorrect auto-animations when there are multiple auto-animated presentations on the same page
📦 Highlights
- New website, docs and logo! https://revealjs.com/ 🚀
- [Auto-Animate](https://revealjs.com/auto-animate/) lets you create complex animations by automatically transitioning between matched elements across slides. [Duration, delay and easing](https://revealjs.com/auto-animate/#animation-settings) can be set on a per-slide or per-element basis.
- We now support [multiple presentations](https://revealjs.com/initialization/#multiple-presentations) on the same page.
- This also introduces a new [embedded](https://revealjs.com/presentation-size/#embedded) config option, which allows presentations to reside within a portion of a page. Previously reveal.js always covered 100% of the page width and height.
- The new `keyboardCondition: 'focused'` config option lets presentations capture keyboard events only when they're focused by the viewer.
- The reveal.js core and built-in plugins have been rewritten as ES modules. This makes the project easier to maintain and makes reveal.js itself easier to include in a bundle. Two bundles are provided:
- dist/reveal.js uses UMD and has broad cross browser support (ES5).
- dist/reveal.esm.js is an ES module. [More info](https://revealjs.com/initialization/#es-module)
- + 1 more
📋 Changes
- The `Reveal.initialize` method now returns a promise that resolves once reveal.js is ready and all plugins have finished initializing.
- Switches build systems from to gulp, using rollup for bundling.
- Moves all compiled CSS (reveal.css, reset.css and themes) from css/ to dist/. See [Upgrade Instructions](https://revealjs.com/upgrading/).
- Moves all print CSS into reveal.js. The old [script-based print styles](https://github.com/hakimel/reveal.js/blob/00b0ace3863952ce95df4430d203686fd27bfc20/index.html#L16-L23) can be removed. by @quilicicf
- Adds a new `slidetransitionend` event.
- Adds a new [r-stack](https://revealjs.com/layout/#stack) layout helper for placing elements on top of each other.
- Adds support for `data-visibility="uncounted"` to exclude slides from the progress bar and slide number count. #2543 by @lassepe
- Adds `Reveal.getComputedSlideSize` API method.
- + 3 more
📦 Plugins
- New syntax for [registering plugins](https://revealjs.com/plugins/).
- All built-in plugins—such as markdown and highlight—are now available as ES modules. [More info](https://revealjs.com/plugins/)
- Notes: No longer depends on resolving an external notes.html file to work. Everything is baked into the plugin JS.
- Highlight: Upgraded to highlight.js 10.0.1.
- Highlight: Moved highlight themes from lib/css/monokai.css to plugin/highlight/monokai.css.
- Highlight: 'highlight.js' library is now installed from npm instead of being saved in the repo.
- Markdown: Support for [line numbers and highlights](https://revealjs.com/markdown/#syntax-highlighting) in syntax highlighted code.
- Markdown: Support for boolean data- attributes. by @Bagira80
- + 3 more
🐛 Bug fixes
- Fixes a bug that prevented links from working in exported PDFs. #2628 by @telliott22
- Fixes a bug where `navigationMode: 'linear'` incorrectly hid valid vertical directions. #2582 by @earboxer
- Fixes an issue that caused reveal.js to incorrectly block keyboard events when an element with `contentedtable=false` was focused. #2650
Fixes a security vulnerability in the postMessage API. The follow methods are now blacklisted and can not be called via the postMessage API: `registerPlugin`, `registerKeyboardShortcut`, `addKeyBinding`, `addEventListener`.
This version contains no changes. It was only released to bump the published version on npm. 3.9.0 was published to npm with local edits 🤦♂️
📋 Changes
- Adds [step-by-step code highlights](https://github.com/hakimel/reveal.js/blob/master/README.md#step-by-step-highlights)! Step through multiple line highlights on the same code block.
- Adds [postMessage callbacks](https://github.com/hakimel/reveal.js#postmessage-callbacks). Makes it possible to use the postMessage API to invoke reveal.js methods with return values.
- The pacing timer functionality now accepts a total time for the whole presentation. Timing was previously worked out on a per-slide level. (#2400 by longtime reveal.js contributor @fghaas!)
- Background iframes no longer preload by default. They load when you arrive at the given slide. This unifies the behavior of in-slide and background iframes. [Learn how to turn on preloading](https://github.com/hakimel/reveal.js#lazy-loading-iframes).
- The slide number format specified through `slideNumber` is now honored in PDF exports. (#2337 by @dougalsutherland)
- Adds `data-fragment=<index>` to any slide <section>with fragments in it. This lets you target specific fragment states with CSS like `section[data-fragment="2"] { ... }`.
- Adds `Reveal.getHorizontalSlides()` and `Reveal. getVerticalSlides()` for getting all horizontal/vertical slides in a deck.
- Adds `Reveal.hasHorizontalSlides()` and `Reveal. hasVerticalSlides()` for checking whether or not a deck contains any horizontal or vertical slides.
- + 11 more
📋 Changes
- The cursor is now automatically hidden after five seconds of inactivity. The timeout can be adjusted with `hideCursorTime: <milliseconds>`, or you can disable the feature entirely with `hideInactiveCursor: false`.
- Presentations can be zoomed on touch devices using the standard pinch-to-zoom gestures.
- New `navigationMode: <default/linear/grid>` config option. Set to "grid" to navigate across adjacent vertical stacks. [Learn more in the docs](https://github.com/hakimel/reveal.js/blob/master/README.md#navigation-mode). (#2307)
- New `hash: <boolean>` config option. When set to true, reveal.js will reflect the current slide in the address bar without pushing each slide change to the browser history. (#2286 by @asottile)
- New `preloadIframes` config option for flagging if iframes should be preloaded or not. Can be set per-frame using the `data-preload` attribute. [More info](https://github.com/hakimel/reveal.js/blob/master/README.md#lazy-loading-iframes). (#2354 by @maxrothman)
- A `resize` event is now dispatched anytime the presentation scale changes. (#2300 by @mw75)
- The "Resume" button in the pause overlay is hidden if `controls` are set to false. (#2215 by @anderslemke)
- New keyboard shortcut: CMD/CTRL + left or right arrow to go to first or last slide.
- + 22 more
📋 Changes
- [Key Binding API](https://github.com/hakimel/reveal.js#custom-key-bindings) (#1885 by @ denehyg)
- Adds `pdfSeparateFragments` option for exporting fragments on separate PDF pages (@koehlma)
- Adds `fragmentInURL` option for including fragments in the URL (@dougalsutherland)
- Adds `hashOneBasedIndex` option for switching slide URLs from 0 to 1-based index (@sean-parent)
- Adds `data-background-opacity` attribute for fading out background media
- Adds a "Resume presentation" button to the pause overlay
- Adds two new fragment styles
- `semi-fade-out`: starts fully visible and fades out to 50% opacity
- + 11 more
📋 Changes
- New project domain: [revealjs.com](http://revealjs.com).
- New presentation control arrows:
- Redesigned for improved aesthetics and clarity.
- Arrows bounce to attract attention until the viewer first navigates. The downwards arrow bounces the first time you arrive at a vertical stack too, making vertical slides harder to miss. This can be turned off by setting the `controlsTutorial` config option to false.
- Arrows automatically change color to contrast the slide background. [Step left/right here to test.](https://revealjs.com/#/10)
- Initialize reveal.js with `controlsLayout: "edges"` to have the controls appear along the edges of the screen instead of the bottom right corner. [Try it out](http://revealjs.com/?controlsLayout=edges).
- New mobile-friendly layout for presentations shared with visible speaker notes.
- The `showNotes` config option no longer shows the notes UI if there are no notes.
- + 11 more
📋 Changes
- Add `display` config option to control the display mode slide section elements. (#1324 by @mojavelinux)
- Add `Reveal.toggleHelp()`for toggling the help overlay. (#1816 by @frazer)
- Slide fragments can now hold their own speaker notes. (#1636 by @traff)
- The speaker view can now provide pacing advice. This makes it easy to detect if you're running out of time, or going too quickly. (#1564 by @aspiers, [more info](https://github.com/hakimel/reveal.js#speaker-notes-clock-and-timers))
- Switch to a `<textarea data-template></textarea>` wrapper for Markdown to avoid HTML parsing issues. (#1780 by @ccqgithub)
- Background videos now autoplay in iOS. (#1851 by @astone123)
- Background iframes are now interactive when there is no content in the slide or `data-background-interactive` is present on the slide element.
- Shift `dependencies` to `devDependencies` (#1764 by @demoneaux)
- + 3 more
