diff --git a/.codespellrc b/.codespellrc
new file mode 100644
index 0000000000..fcffc53322
--- /dev/null
+++ b/.codespellrc
@@ -0,0 +1,8 @@
+[codespell]
+# Ref: https://github.com/codespell-project/codespell#using-a-config-file
+skip = .git*,node_modules,package-lock.json,*.css,.codespellrc,react
+check-hidden = true
+# Ignore super long lines -- must be minimized etc, acronyms
+# and some near hit variables
+ignore-regex = ^.{120,}|\b(currentY|FOM)\b
+# ignore-words-list =
diff --git a/CONTRIBUTING.md b/.github/CONTRIBUTING.md
similarity index 65%
rename from CONTRIBUTING.md
rename to .github/CONTRIBUTING.md
index c2091e88fe..bd0fab2901 100644
--- a/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,10 +1,9 @@
## Contributing
+Please keep the [issue tracker](https://github.com/hakimel/reveal.js/issues) limited to **bug reports**.
-Please keep the [issue tracker](http://github.com/hakimel/reveal.js/issues) limited to **bug reports**, **feature requests** and **pull requests**.
-
-### Personal Support
-If you have personal support or setup questions the best place to ask those are [StackOverflow](http://stackoverflow.com/questions/tagged/reveal.js).
+### General Questions and Support
+If you have questions about how to use reveal.js the best place to ask is in the [Discussions](https://github.com/hakimel/reveal.js/discussions). Anything that isn't a bug report should be posted as a dicussion instead.
### Bug Reports
@@ -12,11 +11,10 @@ When reporting a bug make sure to include information about which browser and op
### Pull Requests
+- Should be submitted from a feature/topic branch (not your master)
- Should follow the coding style of the file you work in, most importantly:
- Tabs to indent
- Single-quoted strings
-- Should be made towards the **dev branch**
-- Should be submitted from a feature/topic branch (not your master)
### Plugins
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 0000000000..972831e95a
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1 @@
+github: [hakimel]
diff --git a/.github/workflows/spellcheck.yml b/.github/workflows/spellcheck.yml
new file mode 100644
index 0000000000..822262f6be
--- /dev/null
+++ b/.github/workflows/spellcheck.yml
@@ -0,0 +1,25 @@
+# Codespell configuration is within .codespellrc
+---
+name: Spellcheck
+
+on:
+ push:
+ branches: [master]
+ pull_request:
+ branches: [master]
+
+permissions:
+ contents: read
+
+jobs:
+ codespell:
+ name: Check for spelling errors
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Codespell
+ uses: codespell-project/actions-codespell@v2
+ with:
+ skip: ./.git,./dist,package-lock.json,*.css,.codespellrc,./react/
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000000..46290915f6
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,31 @@
+name: Tests
+
+on:
+ - push
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version:
+ - 20
+ - 22
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v4
+ with:
+ node-version: ${{ matrix.node-version }}
+
+ - run: npm install
+ - run: npm run build --if-present
+ - run: npm test
+ env:
+ CI: true
diff --git a/.gitignore b/.gitignore
index e7b4f216ae..a37bf8fcbf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,5 +9,9 @@ log/*.log
tmp/**
node_modules/
.sass-cache
-css/reveal.min.css
-js/reveal.min.js
\ No newline at end of file
+presentation
+presentation.zip
+dist/reveal.es5.js
+react/dist
+react/demo/dist
+dev.html
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000000..06d0866e31
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,7 @@
+js/**/*.js
+plugin/**/*.js
+**/*.md
+test/**/*.html
+examples/**/*.md
+dist/**/*
+*.html
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 0000000000..f4f82ddb78
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,8 @@
+{
+ "useTabs": true,
+ "tabWidth": 2,
+ "trailingComma": "es5",
+ "printWidth": 100,
+ "singleQuote": true,
+ "bracketSameLine": false
+}
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index ec3b27d5dc..0000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
- - 4
-before_script:
- - npm install -g grunt-cli
-after_script:
- - grunt retire
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index b6ef63be32..0000000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,192 +0,0 @@
-/* global module:false */
-module.exports = function(grunt) {
- var port = grunt.option('port') || 8000;
- var root = grunt.option('root') || '.';
-
- if (!Array.isArray(root)) root = [root];
-
- // Project configuration
- grunt.initConfig({
- pkg: grunt.file.readJSON('package.json'),
- meta: {
- banner:
- '/*!\n' +
- ' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
- ' * http://revealjs.com\n' +
- ' * MIT licensed\n' +
- ' *\n' +
- ' * Copyright (C) 2017 Hakim El Hattab, http://hakim.se\n' +
- ' */'
- },
-
- qunit: {
- files: [ 'test/*.html' ]
- },
-
- uglify: {
- options: {
- banner: '<%= meta.banner %>\n',
- screwIE8: false
- },
- build: {
- src: 'js/reveal.js',
- dest: 'js/reveal.min.js'
- }
- },
-
- sass: {
- core: {
- src: 'css/reveal.scss',
- dest: 'css/reveal.css'
- },
- themes: {
- expand: true,
- cwd: 'css/theme/source',
- src: ['*.sass', '*.scss'],
- dest: 'css/theme',
- ext: '.css'
- }
- },
-
- autoprefixer: {
- core: {
- src: 'css/reveal.css'
- }
- },
-
- cssmin: {
- options: {
- compatibility: 'ie9'
- },
- compress: {
- src: 'css/reveal.css',
- dest: 'css/reveal.min.css'
- }
- },
-
- jshint: {
- options: {
- curly: false,
- eqeqeq: true,
- immed: true,
- esnext: true,
- latedef: 'nofunc',
- newcap: true,
- noarg: true,
- sub: true,
- undef: true,
- eqnull: true,
- browser: true,
- expr: true,
- globals: {
- head: false,
- module: false,
- console: false,
- unescape: false,
- define: false,
- exports: false
- }
- },
- files: [ 'Gruntfile.js', 'js/reveal.js' ]
- },
-
- connect: {
- server: {
- options: {
- port: port,
- base: root,
- livereload: true,
- open: true,
- useAvailablePort: true
- }
- }
- },
-
- zip: {
- bundle: {
- src: [
- 'index.html',
- 'css/**',
- 'js/**',
- 'lib/**',
- 'images/**',
- 'plugin/**',
- '**.md'
- ],
- dest: 'reveal-js-presentation.zip'
- }
- },
-
- watch: {
- js: {
- files: [ 'Gruntfile.js', 'js/reveal.js' ],
- tasks: 'js'
- },
- theme: {
- files: [
- 'css/theme/source/*.sass',
- 'css/theme/source/*.scss',
- 'css/theme/template/*.sass',
- 'css/theme/template/*.scss'
- ],
- tasks: 'css-themes'
- },
- css: {
- files: [ 'css/reveal.scss' ],
- tasks: 'css-core'
- },
- html: {
- files: root.map(path => path + '/*.html')
- },
- markdown: {
- files: root.map(path => path + '/*.md')
- },
- options: {
- livereload: true
- }
- },
-
- retire: {
- js: [ 'js/reveal.js', 'lib/js/*.js', 'plugin/**/*.js' ],
- node: [ '.' ]
- }
-
- });
-
- // Dependencies
- grunt.loadNpmTasks( 'grunt-contrib-connect' );
- grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
- grunt.loadNpmTasks( 'grunt-contrib-jshint' );
- grunt.loadNpmTasks( 'grunt-contrib-qunit' );
- grunt.loadNpmTasks( 'grunt-contrib-uglify' );
- grunt.loadNpmTasks( 'grunt-contrib-watch' );
- grunt.loadNpmTasks( 'grunt-autoprefixer' );
- grunt.loadNpmTasks( 'grunt-retire' );
- grunt.loadNpmTasks( 'grunt-sass' );
- grunt.loadNpmTasks( 'grunt-zip' );
-
- // Default task
- grunt.registerTask( 'default', [ 'css', 'js' ] );
-
- // JS task
- grunt.registerTask( 'js', [ 'jshint', 'uglify', 'qunit' ] );
-
- // Theme CSS
- grunt.registerTask( 'css-themes', [ 'sass:themes' ] );
-
- // Core framework CSS
- grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] );
-
- // All CSS
- grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] );
-
- // Package presentation to archive
- grunt.registerTask( 'package', [ 'default', 'zip' ] );
-
- // Serve presentation locally
- grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
-
- // Run tests
- grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
-
-};
diff --git a/LICENSE b/LICENSE
index c3e6e5fd68..c512bcdc67 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (C) 2017 Hakim El Hattab, http://hakim.se, and reveal.js contributors
+Copyright (C) 2011-2026 Hakim El Hattab, http://hakim.se, and reveal.js contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 857f39cbff..1f0bad7d38 100644
--- a/README.md
+++ b/README.md
@@ -1,1264 +1,32 @@
-# reveal.js [](https://travis-ci.org/hakimel/reveal.js)
+
+
+
+
+
+
+
+