Bladeren bron

prettier config, format files

Hakim El Hattab 6 maanden geleden
bovenliggende
commit
faf8fb9c58

+ 5 - 2
.prettierignore

@@ -1,3 +1,6 @@
-**/*
+**/*.html
+
 js/**/*.js
-plugin/**/*.js
+plugin/**/*.js
+test/**/*.md
+examples/**/*.md

+ 1 - 1
.prettierrc

@@ -1,5 +1,5 @@
 {
-	"useTabs": false,
+	"useTabs": true,
 	"tabWidth": 2,
 	"trailingComma": "es5",
 	"printWidth": 100,

+ 3 - 1
README.md

@@ -18,13 +18,15 @@ Want to create reveal.js presentation in a graphical editor? Try <https://slides
 ---
 
 ### Getting started
+
 - 🚀 [Install reveal.js](https://revealjs.com/installation)
 - 👀 [View the demo presentation](https://revealjs.com/demo)
 - 📖 [Read the documentation](https://revealjs.com/markup/)
 - 🖌 [Try the visual editor for reveal.js at Slides.com](https://slides.com/)
 - 🎬 [Watch the reveal.js video course (paid)](https://revealjs.com/course)
 
---- 
+---
+
 <div align="center">
   MIT licensed | Copyright © 2011-2024 Hakim El Hattab, https://hakim.se
 </div>

+ 29 - 10
css/layout.scss

@@ -38,7 +38,8 @@
 .reveal .r-hstack {
 	display: flex;
 
-	img, video {
+	img,
+	video {
 		min-width: 0;
 		min-height: 0;
 		object-fit: contain;
@@ -58,13 +59,31 @@
 }
 
 // Naming based on tailwindcss
-.reveal .items-stretch { align-items: stretch; }
-.reveal .items-start { align-items: flex-start; }
-.reveal .items-center { align-items: center; }
-.reveal .items-end { align-items: flex-end; }
+.reveal .items-stretch {
+	align-items: stretch;
+}
+.reveal .items-start {
+	align-items: flex-start;
+}
+.reveal .items-center {
+	align-items: center;
+}
+.reveal .items-end {
+	align-items: flex-end;
+}
 
-.reveal .justify-between { justify-content: space-between; }
-.reveal .justify-around { justify-content: space-around; }
-.reveal .justify-start { justify-content: flex-start; }
-.reveal .justify-center { justify-content: center; }
-.reveal .justify-end { justify-content: flex-end; }
+.reveal .justify-between {
+	justify-content: space-between;
+}
+.reveal .justify-around {
+	justify-content: space-around;
+}
+.reveal .justify-start {
+	justify-content: flex-start;
+}
+.reveal .justify-center {
+	justify-content: center;
+}
+.reveal .justify-end {
+	justify-content: flex-end;
+}

+ 36 - 13
css/print/paper.scss

@@ -1,4 +1,3 @@
-
 @media print {
 	html:not(.print-pdf) {
 		overflow: visible;
@@ -24,25 +23,46 @@
 			display: none !important;
 		}
 
-		p, td, li {
-			font-size: 20pt!important;
+		p,
+		td,
+		li {
+			font-size: 20pt !important;
 			color: #000;
 		}
 
-		h1,h2,h3,h4,h5,h6 {
-			color: #000!important;
+		h1,
+		h2,
+		h3,
+		h4,
+		h5,
+		h6 {
+			color: #000 !important;
 			height: auto;
 			line-height: normal;
 			text-align: left;
 			letter-spacing: normal;
 		}
 
-		h1 { font-size: 28pt !important; }
-		h2 { font-size: 24pt !important; }
-		h3 { font-size: 22pt !important; }
-		h4 { font-size: 22pt !important; font-variant: small-caps; }
-		h5 { font-size: 21pt !important; }
-		h6 { font-size: 20pt !important; font-style: italic; }
+		h1 {
+			font-size: 28pt !important;
+		}
+		h2 {
+			font-size: 24pt !important;
+		}
+		h3 {
+			font-size: 22pt !important;
+		}
+		h4 {
+			font-size: 22pt !important;
+			font-variant: small-caps;
+		}
+		h5 {
+			font-size: 21pt !important;
+		}
+		h6 {
+			font-size: 20pt !important;
+			font-style: italic;
+		}
 
 		a:link,
 		a:visited {
@@ -51,7 +71,10 @@
 			text-decoration: underline;
 		}
 
-		ul, ol, div, p {
+		ul,
+		ol,
+		div,
+		p {
 			visibility: visible;
 			position: static;
 			width: auto;
@@ -137,7 +160,7 @@
 		section img {
 			display: block;
 			margin: 15px 0px;
-			background: rgba(255,255,255,1);
+			background: rgba(255, 255, 255, 1);
 			border: 1px solid #666;
 			box-shadow: none;
 		}

+ 1 - 1
css/print/pdf.scss

@@ -135,7 +135,7 @@ html.reveal-print {
 	}
 
 	/* Layout option which makes notes appear on a separate page */
-	.reveal .speaker-notes-pdf[data-layout="separate-page"] {
+	.reveal .speaker-notes-pdf[data-layout='separate-page'] {
 		position: relative;
 		color: inherit;
 		background-color: transparent;

+ 3 - 2
css/reset.css

@@ -3,6 +3,7 @@
    License: none (public domain)
 */
 
+/* prettier-ignore */
 html, body, div, span, applet, object, iframe,
 h1, h2, h3, h4, h5, h6, p, blockquote, pre,
 a, abbr, acronym, address, big, cite, code,
@@ -23,8 +24,8 @@ time, mark, audio, video {
   font: inherit;
   vertical-align: baseline;
 }
-/* HTML5 display-role reset for older browsers */
+/* prettier-ignore */
 article, aside, details, figcaption, figure,
 footer, header, hgroup, main, menu, nav, section {
   display: block;
-}
+}

File diff suppressed because it is too large
+ 388 - 307
css/reveal.scss


+ 8 - 8
css/theme/README.md

@@ -4,17 +4,17 @@ Themes are written using Sass to keep things modular and reduce the need for rep
 
 ## Creating a Theme
 
-To create your own theme, start by duplicating a ```.scss``` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled from Sass to CSS (see the [gulpfile](https://github.com/hakimel/reveal.js/blob/master/gulpfile.js)) when you run `npm run build:styles`.
+To create your own theme, start by duplicating a `.scss` file in [/css/theme/source](https://github.com/hakimel/reveal.js/blob/master/css/theme/source). It will be automatically compiled from Sass to CSS (see the [gulpfile](https://github.com/hakimel/reveal.js/blob/master/gulpfile.js)) when you run `npm run build:styles`.
 
 Each theme file follows the same structure:
 
-1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**
-Shared utility functions.
+1. **Include [/css/theme/template/mixins.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/mixins.scss)**  
+   Shared utility functions.
 
-2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**
-Declares a set of custom CSS variables that the template file (step 4) expects. Each of these variables can be overridden to customize the theme.
+2. **Include [/css/theme/template/settings.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/settings.scss)**  
+   Declares a set of custom CSS variables that the template file (step 4) expects. Each of these variables can be overridden to customize the theme.
 
-3. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**
-The template theme file which will generate final CSS output based on the currently defined variables.
+3. **Include [/css/theme/template/theme.scss](https://github.com/hakimel/reveal.js/blob/master/css/theme/template/theme.scss)**  
+   The template theme file which will generate final CSS output based on the currently defined variables.
 
-4. **Optionally add custom fonts and/or additional styles**
+4. **Optionally add custom fonts and/or additional styles**

+ 39 - 33
css/theme/beige.scss

@@ -4,49 +4,55 @@
  * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
  */
 
-
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #8b743d;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #f7f3de,
-		$background: radial-gradient( rgba(255,255,255,1), rgba(247,242,211,1) ),
-
-    $main-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $main-font-size: 42px,
-    $main-color: #333,
-
-    $heading-color: #333,
-    $heading-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $heading-font-weight: 600,
-
-    $heading1-text-shadow: #{0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15)},
-
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
-
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
-
-    $selection-color: #333,
-    $selection-background-color: color.scale( $active-color, $lightness: 35% ),
-
-		$overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+@use 'template/settings' with (
+	$background-color: #f7f3de,
+	$background: radial-gradient(rgba(255, 255, 255, 1), rgba(247, 242, 211, 1)),
+	$main-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$main-font-size: 42px,
+	$main-color: #333,
+
+	$heading-color: #333,
+	$heading-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$heading-font-weight: 600,
+
+	$heading1-text-shadow: #{0 1px 0 #ccc,
+	0 2px 0 #c9c9c9,
+	0 3px 0 #bbb,
+	0 4px 0 #b9b9b9,
+	0 5px 0 #aaa,
+	0 6px 1px rgba(0, 0, 0, 0.1),
+	0 0 5px rgba(0, 0, 0, 0.1),
+	0 1px 3px rgba(0, 0, 0, 0.3),
+	0 3px 5px rgba(0, 0, 0, 0.2),
+	0 5px 10px rgba(0, 0, 0, 0.25),
+	0 20px 20px rgba(0, 0, 0, 0.15)},
+
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
+
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-color: #333,
+	$selection-background-color: color.scale($active-color, $lightness: 35%),
+	$overlay-element-bg-color: '0 0 0',
+	$overlay-element-fg-color: '240 240 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/league-gothic/league-gothic.css");
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic");
+@import url('./fonts/league-gothic/league-gothic.css');
+@import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic');
 
 // Change text colors against light slide backgrounds
 @include mixins.dark-bg-text-color(#fff);

+ 24 - 25
css/theme/black-contrast.scss

@@ -8,40 +8,39 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #42affa;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #000,
-
-    $main-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $main-font-size: 42px,
-    $main-color: #fff,
-
-    $heading-color: #fff,
-    $heading-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $heading-font-weight: 600,
-
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
-
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 15% ),
-
-    $selection-color: #fff,
-    $selection-background-color: color.scale( $active-color, $lightness: -35% )
+@use 'template/settings' with (
+	$background-color: #000,
+
+	$main-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$main-font-size: 42px,
+	$main-color: #fff,
+
+	$heading-color: #fff,
+	$heading-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$heading-font-weight: 600,
+
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
+
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 15%),
+	$selection-color: #fff,
+	$selection-background-color: color.scale($active-color, $lightness: -35%)
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text colors against light slide backgrounds
 @include mixins.light-bg-text-color(#000);

+ 24 - 25
css/theme/black.scss

@@ -5,40 +5,39 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #42affa;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #191919,
-
-    $main-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $main-font-size: 42px,
-    $main-color: #fff,
-
-    $heading-color: #fff,
-    $heading-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $heading-font-weight: 600,
-
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
-
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 15% ),
-
-    $selection-color: #fff,
-    $selection-background-color: color.scale( $active-color, $lightness: -35% )
+@use 'template/settings' with (
+	$background-color: #191919,
+
+	$main-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$main-font-size: 42px,
+	$main-color: #fff,
+
+	$heading-color: #fff,
+	$heading-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$heading-font-weight: 600,
+
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
+
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 15%),
+	$selection-color: #fff,
+	$selection-background-color: color.scale($active-color, $lightness: -35%)
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text colors against light slide backgrounds
 @include mixins.light-bg-text-color(#222);

+ 43 - 34
css/theme/blood.scss

@@ -11,54 +11,63 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $coal: #222;
 $active-color: #a23;
 $code-background-color: #23241f;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: $coal,
-
-    $main-font: #{Ubuntu, 'sans-serif'},
-    $main-color: #eee,
-
-    $heading-font: #{Ubuntu, 'sans-serif'},
-    $heading-text-shadow: 2px 2px 2px $coal,
-
-    $heading1-text-shadow: #{0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15)},
-
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
-
-    $selection-background-color: $active-color,
-    $selection-color: #fff
+@use 'template/variables' with (
+	$background-color: $coal,
+
+	$main-font: 'Ubuntu, sans-serif',
+	$main-color: #eee,
+
+	$heading-font: 'Ubuntu, sans-serif',
+	$heading-text-shadow: 2px 2px 2px $coal,
+
+	$heading1-text-shadow: #{0 1px 0 #ccc,
+	0 2px 0 #c9c9c9,
+	0 3px 0 #bbb,
+	0 4px 0 #b9b9b9,
+	0 5px 0 #aaa,
+	0 6px 1px rgba(0, 0, 0, 0.1),
+	0 0 5px rgba(0, 0, 0, 0.1),
+	0 1px 3px rgba(0, 0, 0, 0.3),
+	0 3px 5px rgba(0, 0, 0, 0.2),
+	0 5px 10px rgba(0, 0, 0, 0.25),
+	0 20px 20px rgba(0, 0, 0, 0.15)},
+
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-background-color: $active-color,
+	$selection-color: #fff
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Fonts
-@import url("https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic");
+@import url('https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic');
 
 // Invert text color when the background is light
 @include mixins.light-bg-text-color(#222);
 
 .reveal p {
-  font-weight: 300;
-  text-shadow: 1px 1px $coal;
+	font-weight: 300;
+	text-shadow: 1px 1px $coal;
 }
 
 section.has-light-background {
-  p,
-  h1,
-  h2,
-  h3,
-  h4 {
-    text-shadow: none;
-  }
+	p,
+	h1,
+	h2,
+	h3,
+	h4 {
+		text-shadow: none;
+	}
 }
 
 .reveal h1,
@@ -67,15 +76,15 @@ section.has-light-background {
 .reveal h4,
 .reveal h5,
 .reveal h6 {
-  font-weight: 700;
+	font-weight: 700;
 }
 
 .reveal p code {
-    background-color: $code-background-color;
-    display: inline-block;
-    border-radius: 7px;
+	background-color: $code-background-color;
+	display: inline-block;
+	border-radius: 7px;
 }
 
 .reveal small code {
-  vertical-align: baseline;
+	vertical-align: baseline;
 }

+ 45 - 62
css/theme/dracula.scss

@@ -4,85 +4,65 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 // Include theme-specific fonts
-@import url(./fonts/league-gothic/league-gothic.css);
-@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
-
-$systemFontsSansSerif: -apple-system,
-					   BlinkMacSystemFont,
-					   avenir next,
-					   avenir,
-					   segoe ui,
-					   helvetica neue,
-					   helvetica,
-					   Cantarell,
-					   Ubuntu,
-					   roboto,
-					   noto,
-					   arial,
-					   sans-serif;
-$systemFontsMono: Menlo,
-				  Consolas,
-				  Monaco,
-				  Liberation Mono,
-				  Lucida Console,
-				  monospace;
-
-$background: #282A36;
-$foreground: #F8F8F2;
-$selection: #44475A;
-$comment: #6272A4;
-$red: #FF5555;
-$orange: #FFB86C;
-$yellow: #F1FA8C;
-$green: #50FA7B;
-$purple: #BD93F9;
-$cyan: #8BE9FD;
-$pink: #FF79C6;
+$systemFontsSansSerif: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui,
+	helvetica neue, helvetica, Cantarell, Ubuntu, roboto, noto, arial, sans-serif;
+$systemFontsMono: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
+
+$background: #282a36;
+$foreground: #f8f8f2;
+$selection: #44475a;
+$comment: #6272a4;
+$red: #ff5555;
+$orange: #ffb86c;
+$yellow: #f1fa8c;
+$green: #50fa7b;
+$purple: #bd93f9;
+$cyan: #8be9fd;
+$pink: #ff79c6;
 
 $mainFont: $systemFontsSansSerif;
-$codeFont: "Fira Code", $systemFontsMono;
+$codeFont: 'Fira Code', $systemFontsMono;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #191919,
+@use 'template/settings' with (
+	$background-color: #191919,
 
-    $main-font: $mainFont,
-    $main-font-size: 42px,
-    $main-color: $foreground,
+	$main-font: $mainFont,
+	$main-font-size: 42px,
+	$main-color: $foreground,
 
-		$code-font: $codeFont,
+	$code-font: $codeFont,
 
-    $heading-color: $purple,
-    $heading-font: $mainFont,
-    $heading-font-weight: 600,
-		$heading-text-transform: none,
+	$heading-color: $purple,
+	$heading-font: $mainFont,
+	$heading-font-weight: 600,
+	$heading-text-transform: none,
 
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
 
-    $link-color: $pink,
-    $link-color-hover: $cyan,
+	$link-color: $pink,
+	$link-color-hover: $cyan,
 
-    $selection-color: #fff,
-    $selection-background-color: $selection
+	$selection-color: #fff,
+	$selection-background-color: $selection
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text colors against light slide backgrounds
 @include mixins.light-bg-text-color($background);
 
-
 // Define additional color effects based on Dracula spec
 // https://spec.draculatheme.com/
 :root {
@@ -97,20 +77,23 @@ $codeFont: "Fira Code", $systemFontsMono;
  * https://draculatheme.com/contribute
  */
 .reveal {
-	strong, b {
+	strong,
+	b {
 		color: var(--r-bold-color);
 	}
-	em, i, blockquote {
+	em,
+	i,
+	blockquote {
 		color: var(--r-italic-color);
 	}
 	code {
 		color: var(--r-inline-code-color);
 	}
 	// Dracula colored list bullets and numbers
-	ul, ol {
+	ul,
+	ol {
 		li::marker {
 			color: var(--r-list-bullet-color);
 		}
 	}
 }
-

+ 21 - 13
css/theme/league.scss

@@ -7,25 +7,33 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
-
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-		$background: radial-gradient( rgba(85,90,95,1), rgba(28,30,32,1) ),
-    $background-color: rgba(28,30,32,1),
-
-		$heading-text-shadow: #{0px 0px 6px rgba(0,0,0,0.2)},
-		$heading1-text-shadow: #{0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b9, 0 5px 0 #aaa, 0 6px 1px rgba(0,0,0,.1), 0 0 5px rgba(0,0,0,.1), 0 1px 3px rgba(0,0,0,.3), 0 3px 5px rgba(0,0,0,.2), 0 5px 10px rgba(0,0,0,.25), 0 20px 20px rgba(0,0,0,.15)},
+@use 'template/settings' with (
+	$background: radial-gradient(rgba(85, 90, 95, 1), rgba(28, 30, 32, 1)),
+	$background-color: rgba(28, 30, 32, 1),
+	$heading-text-shadow: #{0px 0px 6px rgba(0, 0, 0, 0.2)},
+	$heading1-text-shadow: #{0 1px 0 #ccc,
+	0 2px 0 #c9c9c9,
+	0 3px 0 #bbb,
+	0 4px 0 #b9b9b9,
+	0 5px 0 #aaa,
+	0 6px 1px rgba(0, 0, 0, 0.1),
+	0 0 5px rgba(0, 0, 0, 0.1),
+	0 1px 3px rgba(0, 0, 0, 0.3),
+	0 3px 5px rgba(0, 0, 0, 0.2),
+	0 5px 10px rgba(0, 0, 0, 0.25),
+	0 20px 20px rgba(0, 0, 0, 0.15)}
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/league-gothic/league-gothic.css");
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic");
+@import url('./fonts/league-gothic/league-gothic.css');
+@import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic');
 
 // Change text colors against light slide backgrounds
-@include mixins.light-bg-text-color(#222);
+@include mixins.light-bg-text-color(#222);

+ 29 - 30
css/theme/moon.scss

@@ -4,50 +4,49 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 // Solarized colors by Ethan Schoonover
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;;
+$base03: #002b36;
+$base02: #073642;
+$base01: #586e75;
+$base00: #657b83;
+$base0: #839496;
+$base1: #93a1a1;
+$base2: #eee8d5;
+$base3: #fdf6e3;
+$yellow: #b58900;
+$orange: #cb4b16;
+$red: #dc322f;
+$magenta: #d33682;
+$violet: #6c71c4;
+$blue: #268bd2;
+$cyan: #2aa198;
+$green: #859900;
 
 $active-color: $blue;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: $base03,
+@use 'template/settings' with (
+	$background-color: $base03,
 
-    $main-color: $base1,
-    $heading-color: $base2,
+	$main-color: $base1,
+	$heading-color: $base2,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
-
-    $selection-color: #fff,
-    $selection-background-color: $magenta
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-color: #fff,
+	$selection-background-color: $magenta
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
 // Include theme-specific fonts
-@import url("./fonts/league-gothic/league-gothic.css");
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic");
+@import url('./fonts/league-gothic/league-gothic.css');
+@import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic');
 
 // Change text colors against light slide backgrounds
 @include mixins.light-bg-text-color(#222);

+ 17 - 18
css/theme/night.scss

@@ -5,36 +5,35 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #e7ad52;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #111,
+@use 'template/settings' with (
+	$background-color: #111,
 
-    $main-font: #{'Open Sans', sans-serif},
-    $main-color: #fff,
+	$main-font: "'Open Sans', sans-serif",
+	$main-color: #fff,
 
-    $heading-color: #fff,
-    $heading-font: #{'Montserrat', Impact, sans-serif},
-    $heading-text-transform: none,
-    $heading-letter-spacing: -0.03em,
+	$heading-color: #fff,
+	$heading-font: "'Montserrat', Impact, sans-serif",
+	$heading-text-transform: none,
+	$heading-letter-spacing: -0.03em,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
-
-    $selection-color: #111,
-    $selection-background-color: $active-color
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-color: #111,
+	$selection-background-color: $active-color
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("https://fonts.googleapis.com/css?family=Montserrat:700");
-@import url("https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic");
+@import url('https://fonts.googleapis.com/css?family=Montserrat:700');
+@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic');
 
 // Change text colors against light slide backgrounds
 @include mixins.light-bg-text-color(#222);

+ 21 - 22
css/theme/serif.scss

@@ -6,43 +6,42 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
-$active-color: #51483D;
+$active-color: #51483d;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #F0F1EB,
+@use 'template/settings' with (
+	$background-color: #f0f1eb,
 
-    $main-font: #{'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif},
-    $main-font-size: 42px,
-    $main-color: #000,
+	$main-font: "'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif",
+	$main-font-size: 42px,
+	$main-color: #000,
 
-    $heading-color: #383D3D,
-    $heading-font: #{'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif},
-    $heading-font-weight: 600,
-    $heading-text-transform: none,
+	$heading-color: #383d3d,
+	$heading-font: "'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif",
+	$heading-font-weight: 600,
+	$heading-text-transform: none,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 25% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 25%),
+	$selection-color: #fff,
+	$selection-background-color: $active-color,
 
-    $selection-color: #fff,
-    $selection-background-color: $active-color,
-
-    $overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+	$overlay-element-bg-color: '0 0 0',
+	$overlay-element-fg-color: '240 240 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text colors against light slide backgrounds
 @include mixins.dark-bg-text-color(#fff);
 
 .reveal a {
-  line-height: 1.3em;
+	line-height: 1.3em;
 }

+ 23 - 24
css/theme/simple.scss

@@ -7,43 +7,42 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
-$active-color: #00008B;
+$active-color: #00008b;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #fff,
+@use 'template/settings' with (
+	$background-color: #fff,
 
-    $main-color: #000,
-    $main-font: #{'Lato', sans-serif},
+	$main-color: #000,
+	$main-font: "'Lato', sans-serif",
 
-    $heading-color: #000,
-    $heading-font: #{'News Cycle', Impact, sans-serif},
-    $heading-font-weight: 600,
+	$heading-color: #000,
+	$heading-font: "'News Cycle', Impact, sans-serif",
+	$heading-font-weight: 600,
 
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-color: #fff,
+	$selection-background-color: $active-color,
 
-    $selection-color: #fff,
-    $selection-background-color: $active-color,
-
-    $overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+	$overlay-element-bg-color: '0, 0, 0',
+	$overlay-element-fg-color: '240, 240, 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("https://fonts.googleapis.com/css?family=News+Cycle:400,700");
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic");
+@import url('https://fonts.googleapis.com/css?family=News+Cycle:400,700');
+@import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic');
 
 // Change text when the background is inverted
 @include mixins.dark-bg-text-color(#fff);

+ 19 - 20
css/theme/sky.scss

@@ -5,39 +5,38 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #2a76dd;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-		$background: radial-gradient( #f7fbfc, #add9e4 ),
-    $background-color: #f7fbfc,
+@use 'template/settings' with (
+	$background: radial-gradient(#f7fbfc, #add9e4),
+	$background-color: #f7fbfc,
 
-    $main-color: #333,
-    $main-font: #{'Open Sans', sans-serif},
+	$main-color: #333,
+	$main-font: "'Open Sans', sans-serif",
 
-    $heading-color: #333,
-    $heading-font: #{'Quicksand', sans-serif},
-		$heading-letter-spacing: -0.05em,
+	$heading-color: #333,
+	$heading-font: "'Quicksand', sans-serif",
+	$heading-letter-spacing: -0.05em,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 15% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 15%),
+	$selection-color: #fff,
+	$selection-background-color: $active-color,
 
-    $selection-color: #fff,
-    $selection-background-color: $active-color,
-
-    $overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+	$overlay-element-bg-color: '0 0 0',
+	$overlay-element-fg-color: '240 240 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic");
-@import url("https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");
+@import url('https://fonts.googleapis.com/css?family=Quicksand:400,700,400italic,700italic');
+@import url('https://fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700');
 
 // Change text when the background is inverted
 @include mixins.dark-bg-text-color(#fff);

+ 31 - 32
css/theme/solarized.scss

@@ -4,52 +4,51 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 // Solarized colors by Ethan Schoonover
-$base03:    #002b36;
-$base02:    #073642;
-$base01:    #586e75;
-$base00:    #657b83;
-$base0:     #839496;
-$base1:     #93a1a1;
-$base2:     #eee8d5;
-$base3:     #fdf6e3;
-$yellow:    #b58900;
-$orange:    #cb4b16;
-$red:       #dc322f;
-$magenta:   #d33682;
-$violet:    #6c71c4;
-$blue:      #268bd2;
-$cyan:      #2aa198;
-$green:     #859900;
+$base03: #002b36;
+$base02: #073642;
+$base01: #586e75;
+$base00: #657b83;
+$base0: #839496;
+$base1: #93a1a1;
+$base2: #eee8d5;
+$base3: #fdf6e3;
+$yellow: #b58900;
+$orange: #cb4b16;
+$red: #dc322f;
+$magenta: #d33682;
+$violet: #6c71c4;
+$blue: #268bd2;
+$cyan: #2aa198;
+$green: #859900;
 
 $active-color: $blue;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: $base3,
+@use 'template/settings' with (
+	$background-color: $base3,
 
-    $main-color: $base00,
-    $heading-color: $base01,
+	$main-color: $base00,
+	$heading-color: $base01,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 20% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 20%),
+	$selection-color: #fff,
+	$selection-background-color: $magenta,
 
-    $selection-color: #fff,
-    $selection-background-color: $magenta,
-
-    $overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+	$overlay-element-bg-color: '0 0 0',
+	$overlay-element-fg-color: '240 240 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/league-gothic/league-gothic.css");
-@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic");
+@import url('./fonts/league-gothic/league-gothic.css');
+@import url('https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic');
 
 // Change text when the background is inverted
 @include mixins.dark-bg-text-color(#fff);

+ 17 - 5
css/theme/template/mixins.scss

@@ -1,15 +1,27 @@
-@mixin light-bg-text-color( $color ) {
+@mixin light-bg-text-color($color) {
 	section.has-light-background {
-		&, h1, h2, h3, h4, h5, h6 {
+		&,
+		h1,
+		h2,
+		h3,
+		h4,
+		h5,
+		h6 {
 			color: $color;
 		}
 	}
 }
 
-@mixin dark-bg-text-color( $color ) {
+@mixin dark-bg-text-color($color) {
 	section.has-dark-background {
-		&, h1, h2, h3, h4, h5, h6 {
+		&,
+		h1,
+		h2,
+		h3,
+		h4,
+		h5,
+		h6 {
 			color: $color;
 		}
 	}
-}
+}

+ 46 - 46
css/theme/template/settings.scss

@@ -32,12 +32,12 @@ $heading1-text-shadow: none !default;
 $heading1-size: 3.77em !default;
 $heading2-size: 2.11em !default;
 $heading3-size: 1.55em !default;
-$heading4-size: 1.00em !default;
+$heading4-size: 1em !default;
 
 $code-font: monospace !default;
 
 // Links and actions
-$link-color: #13DAEC !default;
+$link-color: #13daec !default;
 $link-color-dark: color.scale($link-color, $lightness: -15%) !default;
 $link-color-hover: color.scale($link-color, $lightness: 20%) !default;
 
@@ -52,47 +52,47 @@ $overlay-element-fg-color: 0, 0, 0 !default;
 
 // Expose all variables to the DOM
 :root {
-  // Background of the presentation
-  --r-background: #{$background};
-  --r-background-color: #{$background-color};
-
-  // Primary/body text
-  --r-main-font: #{$main-font};
-  --r-main-font-size: #{$main-font-size};
-  --r-main-color: #{$main-color};
-
-  // Vertical spacing between blocks of text
-  --r-block-margin: #{$block-margin};
-
-  // Headings
-  --r-heading-margin: #{$heading-margin};
-  --r-heading-font: #{$heading-font};
-  --r-heading-color: #{$heading-color};
-  --r-heading-line-height: #{$heading-line-height};
-  --r-heading-letter-spacing: #{$heading-letter-spacing};
-  --r-heading-text-transform: #{$heading-text-transform};
-  --r-heading-text-shadow: #{$heading-text-shadow};
-  --r-heading-font-weight: #{$heading-font-weight};
-  --r-heading1-text-shadow: #{$heading1-text-shadow};
-
-  --r-heading1-size: #{$heading1-size};
-  --r-heading2-size: #{$heading2-size};
-  --r-heading3-size: #{$heading3-size};
-  --r-heading4-size: #{$heading4-size};
-
-  --r-code-font: #{$code-font};
-
-  // Links and actions
-  --r-link-color: #{$link-color};
-  --r-link-color-dark: #{$link-color-dark};
-  --r-link-color-hover: #{$link-color-hover};
-
-  // Text selection
-  --r-selection-background-color: #{$selection-background-color};
-  --r-selection-color: #{$selection-color};
-
-  // Colors used for UI elements that are overlaid on top of
-  // the presentation
-  --r-overlay-element-bg-color: #{$overlay-element-bg-color};
-  --r-overlay-element-fg-color: #{$overlay-element-fg-color};
-}
+	// Background of the presentation
+	--r-background: #{$background};
+	--r-background-color: #{$background-color};
+
+	// Primary/body text
+	--r-main-font: #{$main-font};
+	--r-main-font-size: #{$main-font-size};
+	--r-main-color: #{$main-color};
+
+	// Vertical spacing between blocks of text
+	--r-block-margin: #{$block-margin};
+
+	// Headings
+	--r-heading-margin: #{$heading-margin};
+	--r-heading-font: #{$heading-font};
+	--r-heading-color: #{$heading-color};
+	--r-heading-line-height: #{$heading-line-height};
+	--r-heading-letter-spacing: #{$heading-letter-spacing};
+	--r-heading-text-transform: #{$heading-text-transform};
+	--r-heading-text-shadow: #{$heading-text-shadow};
+	--r-heading-font-weight: #{$heading-font-weight};
+	--r-heading1-text-shadow: #{$heading1-text-shadow};
+
+	--r-heading1-size: #{$heading1-size};
+	--r-heading2-size: #{$heading2-size};
+	--r-heading3-size: #{$heading3-size};
+	--r-heading4-size: #{$heading4-size};
+
+	--r-code-font: #{$code-font};
+
+	// Links and actions
+	--r-link-color: #{$link-color};
+	--r-link-color-dark: #{$link-color-dark};
+	--r-link-color-hover: #{$link-color-hover};
+
+	// Text selection
+	--r-selection-background-color: #{$selection-background-color};
+	--r-selection-color: #{$selection-color};
+
+	// Colors used for UI elements that are overlaid on top of
+	// the presentation
+	--r-overlay-element-bg-color: #{$overlay-element-bg-color};
+	--r-overlay-element-fg-color: #{$overlay-element-fg-color};
+}

+ 35 - 32
css/theme/template/theme.scss

@@ -29,7 +29,7 @@
 }
 
 .reveal .slides section,
-.reveal .slides section>section {
+.reveal .slides section > section {
 	line-height: 1.3;
 	font-weight: inherit;
 }
@@ -58,16 +58,23 @@
 	word-wrap: break-word;
 }
 
-.reveal h1 {font-size: var(--r-heading1-size); }
-.reveal h2 {font-size: var(--r-heading2-size); }
-.reveal h3 {font-size: var(--r-heading3-size); }
-.reveal h4 {font-size: var(--r-heading4-size); }
+.reveal h1 {
+	font-size: var(--r-heading1-size);
+}
+.reveal h2 {
+	font-size: var(--r-heading2-size);
+}
+.reveal h3 {
+	font-size: var(--r-heading3-size);
+}
+.reveal h4 {
+	font-size: var(--r-heading4-size);
+}
 
 .reveal h1 {
 	text-shadow: var(--r-heading1-text-shadow);
 }
 
-
 /*********************************************
  * OTHER
  *********************************************/
@@ -153,12 +160,12 @@
 
 	font-style: italic;
 	background: rgba(255, 255, 255, 0.05);
-	box-shadow: 0px 0px 2px rgba(0,0,0,0.2);
+	box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.2);
+}
+.reveal blockquote p:first-child,
+.reveal blockquote p:last-child {
+	display: inline-block;
 }
-	.reveal blockquote p:first-child,
-	.reveal blockquote p:last-child {
-		display: inline-block;
-	}
 
 .reveal q {
 	font-style: italic;
@@ -219,13 +226,13 @@
 	border-bottom: 1px solid;
 }
 
-.reveal table th[align="center"],
-.reveal table td[align="center"] {
+.reveal table th[align='center'],
+.reveal table td[align='center'] {
 	text-align: center;
 }
 
-.reveal table th[align="right"],
-.reveal table td[align="right"] {
+.reveal table th[align='right'],
+.reveal table td[align='right'] {
 	text-align: right;
 }
 
@@ -258,7 +265,6 @@
 	margin: var(--r-block-margin) 0;
 }
 
-
 /*********************************************
  * LINKS
  *********************************************/
@@ -266,21 +272,20 @@
 .reveal a {
 	color: var(--r-link-color);
 	text-decoration: none;
-	transition: color .15s ease;
+	transition: color 0.15s ease;
+}
+.reveal a:hover {
+	color: var(--r-link-color-hover);
+	text-shadow: none;
+	border: none;
 }
-	.reveal a:hover {
-		color: var(--r-link-color-hover);
-		text-shadow: none;
-		border: none;
-	}
 
 .reveal .roll span:after {
 	color: #fff;
+	// background: darken( var(--r-link-color), 15% );
 	background: var(--r-link-color-dark);
-
 }
 
-
 /*********************************************
  * Frame helper
  *********************************************/
@@ -291,7 +296,7 @@
 }
 
 .reveal a .r-frame {
-	transition: all .15s linear;
+	transition: all 0.15s linear;
 }
 
 .reveal a:hover .r-frame {
@@ -299,7 +304,6 @@
 	box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
 }
 
-
 /*********************************************
  * NAVIGATION CONTROLS
  *********************************************/
@@ -308,21 +312,20 @@
 	color: var(--r-link-color);
 }
 
-
 /*********************************************
  * PROGRESS BAR
  *********************************************/
 
 .reveal .progress {
-	background: rgba(0,0,0,0.2);
+	background: rgba(0, 0, 0, 0.2);
 	color: var(--r-link-color);
 }
 
 /*********************************************
  * PRINT BACKGROUND
  *********************************************/
- @media print {
-    .backgrounds {
-        background-color: var(--r-background-color);
-    }
+@media print {
+	.backgrounds {
+		background-color: var(--r-background-color);
+	}
 }

+ 22 - 23
css/theme/white-contrast.scss

@@ -8,43 +8,42 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #2a76dd;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #fff,
+@use 'template/settings' with (
+	$background-color: #fff,
 
-    $main-font: "'Source Sans Pro', Helvetica, sans-serif",
-    $main-font-size: 42px,
-    $main-color: #000,
+	$main-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$main-font-size: 42px,
+	$main-color: #000,
 
-    $heading-color: #000,
-    $heading-font: "'Source Sans Pro', Helvetica, sans-serif",
-    $heading-font-weight: 600,
+	$heading-color: #000,
+	$heading-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$heading-font-weight: 600,
 
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 15% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 15%),
+	$selection-color: #fff,
+	$selection-background-color: $active-color,
 
-    $selection-color: #fff,
-    $selection-background-color: $active-color,
-
-    $overlay-element-bg-color: "0, 0, 0",
-    $overlay-element-fg-color: "240, 240, 240"
+	$overlay-element-bg-color: '0, 0, 0',
+	$overlay-element-fg-color: '240, 240, 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text when the background is inverted
 @include mixins.dark-bg-text-color(#fff);

+ 22 - 23
css/theme/white.scss

@@ -5,43 +5,42 @@
  */
 
 // Load utils
-@use "sass:color";
-@use "template/mixins" as mixins;
+@use 'sass:color';
+@use 'template/mixins' as mixins;
 
 $active-color: #2a76dd;
 
 // Inject theme variables (with some overrides)
-@use "template/settings" with (
-    $background-color: #fff,
+@use 'template/settings' with (
+	$background-color: #fff,
 
-    $main-color: #222,
-    $main-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $main-font-size: 42px,
+	$main-color: #222,
+	$main-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$main-font-size: 42px,
 
-    $heading-color: #222,
-    $heading-font: #{'Source Sans Pro', Helvetica, sans-serif},
-    $heading-font-weight: 600,
+	$heading-color: #222,
+	$heading-font: "'Source Sans Pro', Helvetica, sans-serif",
+	$heading-font-weight: 600,
 
-    $heading1-size: 2.5em,
-    $heading2-size: 1.6em,
-    $heading3-size: 1.3em,
-    $heading4-size: 1.0em,
+	$heading1-size: 2.5em,
+	$heading2-size: 1.6em,
+	$heading3-size: 1.3em,
+	$heading4-size: 1em,
 
-    $link-color: $active-color,
-    $link-color-hover: color.scale( $active-color, $lightness: 15% ),
+	$link-color: $active-color,
+	$link-color-hover: color.scale($active-color, $lightness: 15%),
+	$selection-color: #fff,
+	$selection-background-color: $active-color,
 
-    $selection-color: #fff,
-    $selection-background-color: $active-color,
-
-    $overlay-element-bg-color: #{0, 0, 0},
-    $overlay-element-fg-color: #{240, 240, 240}
+	$overlay-element-bg-color: '0 0 0',
+	$overlay-element-fg-color: '240 240 240'
 );
 
 // Inject the theme template
-@use "template/theme";
+@use 'template/theme';
 
 // Include theme-specific fonts
-@import url("./fonts/source-sans-pro/source-sans-pro.css");
+@import url('./fonts/source-sans-pro/source-sans-pro.css');
 
 // Change text when the background is inverted
 @include mixins.dark-bg-text-color(#fff);

+ 734 - 734
js/config.ts

@@ -1,743 +1,743 @@
 interface Config {
-	/**
-	 * The "normal" size of the presentation, aspect ratio will be preserved
-	 * when the presentation is scaled to fit different resolutions
-	 *
-	 * @defaultValue 960
-	 */
-	width?: number | string;
-
-	/**
-	 * The "normal" size of the presentation, aspect ratio will be preserved
-	 * when the presentation is scaled to fit different resolutions
-	 *
-	 * @defaultValue 700
-	 */
-	height?: number | string;
-
-	/**
-	 * Factor of the display size that should remain empty around the content
-	 *
-	 * @defaultValue 0.04
-	 */
-	margin?: number;
-
-	/**
-	 * Bounds for smallest/largest possible scale to apply to content
-	 *
-	 * @defaultValue 0.2
-	 */
-	minScale?: number;
-
-	/**
-	 *
-	 * @defaultValue 2.0
-	 */
-	maxScale?: number;
-
-	/**
-	 * Display presentation control arrows
-	 * - true: Display controls on all screens
-	 * - false: Hide controls on all screens
-	 * - "speaker-only": Only display controls in the speaker view
-	 *
-	 * @defaultValue true
-	 */
-	controls?: boolean | 'speaker-only';
-
-	/**
-	 * Help the user learn the controls by providing hints, for example by
-	 * bouncing the down arrow when they first encounter a vertical slide
-	 *
-	 * @defaultValue true
-	 */
-	controlsTutorial?: boolean;
-
-	/**
-	 * Determines where controls appear, "edges" or "bottom-right"
-	 *
-	 * @defaultValue 'bottom-right'
-	 */
-	controlsLayout?: 'edges' | 'bottom-right';
-
-	/**
-	 * Visibility rule for backwards navigation arrows; "faded", "hidden"
-	 * or "visible"
-	 *
-	 * @defaultValue 'faded'
-	 */
-	controlsBackArrows?: 'faded' | 'hidden' | 'visible';
-
-	/**
-	 * Display a presentation progress bar
-	 *
-	 * @defaultValue true
-	 */
-	progress?: boolean;
-
-	/**
-	 * Display the page number of the current slide
-	 * - true:    Show slide number
-	 * - false:   Hide slide number
-	 *
-	 * Can optionally be set as a string that specifies the number formatting:
-	 * - "h.v":	  Horizontal . vertical slide number (default)
-	 * - "h/v":	  Horizontal / vertical slide number
-	 * - "c":	  Flattened slide number
-	 * - "c/t":	  Flattened slide number / total slides
-	 *
-	 * Alternatively, you can provide a function that returns the slide
-	 * number for the current slide. The function should take in a slide
-	 * object and return an array with one string [slideNumber] or
-	 * three strings [n1,delimiter,n2]. See #formatSlideNumber().
-	 *
-	 * @defaultValue false
-	 */
-	slideNumber?:
-		| boolean
-		| 'h.v'
-		| 'h/v'
-		| 'c'
-		| 'c/t'
-		| ((slide: any) => string | [string, string, string]);
-
-	/**
-	 * Can be used to limit the contexts in which the slide number appears
-	 * - "all":      Always show the slide number
-	 * - "print":    Only when printing to PDF
-	 * - "speaker":  Only in the speaker view
-	 *
-	 * @defaultValue 'all'
-	 */
-	showSlideNumber?: 'all' | 'print' | 'speaker';
-
-	/**
-	 * Use 1 based indexing for # links to match slide number (default is zero
-	 * based)
-	 *
-	 * @defaultValue false
-	 */
-	hashOneBasedIndex?: boolean;
-
-	/**
-	 * Add the current slide number to the URL hash so that reloading the
-	 * page/copying the URL will return you to the same slide
-	 *
-	 * @defaultValue false
-	 */
-	hash?: boolean;
-
-	/**
-	 * Flags if we should monitor the hash and change slides accordingly
-	 *
-	 * @defaultValue true
-	 */
-	respondToHashChanges?: boolean;
-
-	/**
-	 * Enable support for jump-to-slide navigation shortcuts
-	 *
-	 * @defaultValue true
-	 */
-	jumpToSlide?: boolean;
-
-	/**
-	 * Push each slide change to the browser history. Implies `hash: true`
-	 *
-	 * @defaultValue false
-	 */
-	history?: boolean;
-
-	/**
-	 * Enable keyboard shortcuts for navigation
-	 *
-	 * @defaultValue true
-	 */
-	keyboard?: boolean;
-
-	/**
-	 * Optional function that blocks keyboard events when returning false
-	 *
-	 * If you set this to 'focused', we will only capture keyboard events
-	 * for embedded decks when they are in focus
-	 *
-	 * @defaultValue null
-	 */
-	keyboardCondition?: null | 'focused' | ((event: KeyboardEvent) => boolean);
-
-	/**
-	 * Disables the default reveal.js slide layout (scaling and centering)
-	 * so that you can use custom CSS layout
-	 *
-	 * @defaultValue false
-	 */
-	disableLayout?: boolean;
-
-	/**
-	 * Enable the slide overview mode
-	 *
-	 * @defaultValue true
-	 */
-	overview?: boolean;
-
-	/**
-	 * Vertical centering of slides
-	 *
-	 * @defaultValue true
-	 */
-	center?: boolean;
-
-	/**
-	 * Enables touch navigation on devices with touch input
-	 *
-	 * @defaultValue true
-	 */
-	touch?: boolean;
-
-	/**
-	 * Loop the presentation
-	 *
-	 * @defaultValue false
-	 */
-	loop?: boolean;
-
-	/**
-	 * Change the presentation direction to be RTL
-	 *
-	 * @defaultValue false
-	 */
-	rtl?: boolean;
-
-	/**
-	 * Changes the behavior of our navigation directions.
-	 *
-	 * "default"
-	 * Left/right arrow keys step between horizontal slides, up/down
-	 * arrow keys step between vertical slides. Space key steps through
-	 * all slides (both horizontal and vertical).
-	 *
-	 * "linear"
-	 * Removes the up/down arrows. Left/right arrows step through all
-	 * slides (both horizontal and vertical).
-	 *
-	 * "grid"
-	 * When this is enabled, stepping left/right from a vertical stack
-	 * to an adjacent vertical stack will land you at the same vertical
-	 * index.
-	 *
-	 * Consider a deck with six slides ordered in two vertical stacks:
-	 * 1.1    2.1
-	 * 1.2    2.2
-	 * 1.3    2.3
-	 *
-	 * If you're on slide 1.3 and navigate right, you will normally move
-	 * from 1.3 -> 2.1. If "grid" is used, the same navigation takes you
-	 * from 1.3 -> 2.3.
-	 *
-	 * @defaultValue 'default'
-	 */
-	navigationMode?: 'default' | 'linear' | 'grid';
-
-	/**
-	 * Randomizes the order of slides each time the presentation loads
-	 *
-	 * @defaultValue false
-	 */
-	shuffle?: boolean;
-
-	/**
-	 * Turns fragments on and off globally
-	 *
-	 * @defaultValue true
-	 */
-	fragments?: boolean;
-
-	/**
-	 * Flags whether to include the current fragment in the URL,
-	 * so that reloading brings you to the same fragment position
-	 *
-	 * @defaultValue true
-	 */
-	fragmentInURL?: boolean;
-
-	/**
-	 * Flags if the presentation is running in an embedded mode,
-	 * i.e. contained within a limited portion of the screen
-	 *
-	 * @defaultValue false
-	 */
-	embedded?: boolean;
-
-	/**
-	 * Flags if we should show a help overlay when the question-mark
-	 * key is pressed
-	 *
-	 * @defaultValue true
-	 */
-	help?: boolean;
-
-	/**
-	 * Flags if it should be possible to pause the presentation (blackout)
-	 *
-	 * @defaultValue true
-	 */
-	pause?: boolean;
-
-	/**
-	 * Flags if speaker notes should be visible to all viewers
-	 *
-	 * @defaultValue false
-	 */
-	showNotes?: boolean;
-
-	/**
-	 * Flags if slides with data-visibility="hidden" should be kept visible
-	 *
-	 * @defaultValue false
-	 */
-	showHiddenSlides?: boolean;
-
-	/**
-	 * Global override for autoplaying embedded media (video/audio/iframe)
-	 * - null:   Media will only autoplay if data-autoplay is present
-	 * - true:   All media will autoplay, regardless of individual setting
-	 * - false:  No media will autoplay, regardless of individual setting
-	 *
-	 * @defaultValue null
-	 */
-	autoPlayMedia?: null | boolean;
-
-	/**
-	 * Global override for preloading lazy-loaded iframes
-	 * - null:   Iframes with data-src AND data-preload will be loaded when within
-	 *           the viewDistance, iframes with only data-src will be loaded when visible
-	 * - true:   All iframes with data-src will be loaded when within the viewDistance
-	 * - false:  All iframes with data-src will be loaded only when visible
-	 *
-	 * @defaultValue null
-	 */
-	preloadIframes?: null | boolean;
-
-	/**
-	 * Can be used to globally disable auto-animation
-	 *
-	 * @defaultValue true
-	 */
-	autoAnimate?: boolean;
-
-	/**
-	 * Optionally provide a custom element matcher that will be
-	 * used to dictate which elements we can animate between.
-	 *
-	 * @defaultValue null
-	 */
-	autoAnimateMatcher?: null | Function;
-
-	/**
-	 * Default settings for our auto-animate transitions, can be
-	 * overridden per-slide or per-element via data arguments
-	 *
-	 * @defaultValue 'ease'
-	 */
-	autoAnimateEasing?: 'ease' | string;
-
-	/**
-	 * Number of seconds to animate each element.
-	 *
-	 * @defaultValue 1.0
-	 */
-	autoAnimateDuration?: number;
-
-	/**
-	 * Should unmatched elements be faded in?
-	 *
-	 * @defaultValue true
-	 */
-	autoAnimateUnmatched?: boolean;
-
-	/**
-	 * CSS properties that can be auto-animated. Position & scale
-	 * is matched separately so there's no need to include styles
-	 * like top/right/bottom/left, width/height or margin.
-	 *
-	 * @defaultValue ['opacity', 'color', 'background-color', 'padding', 'font-size', 'line-height', 'letter-spacing', 'border-width', 'border-color', 'border-radius', 'outline', 'outline-offset']
-	 */
-	autoAnimateStyles?: string[];
-
-	/**
-	 * Controls automatic progression to the next slide
-	 * - 0:      Auto-sliding only happens if the data-autoslide HTML attribute
-	 *           is present on the current slide or fragment
-	 * - 1+:     All slides will progress automatically at the given interval
-	 * - false:  No auto-sliding, even if data-autoslide is present
-	 *
-	 * @defaultValue 0
-	 */
-	autoSlide?: number | false;
-
-	/**
-	 * Stop auto-sliding after user input
-	 *
-	 * @defaultValue true
-	 */
-	autoSlideStoppable?: boolean;
-
-	/**
-	 * Use this method for navigation when auto-sliding (defaults to navigateNext)
-	 *
-	 * @defaultValue null
-	 */
-	autoSlideMethod?: null | Function;
-
-	/**
-	 * Specify the average time in seconds that you think you will spend
-	 * presenting each slide. This is used to show a pacing timer in the
-	 * speaker view
-	 *
-	 * @defaultValue null
-	 */
-	defaultTiming?: null;
-
-	/**
-	 * Enable slide navigation via mouse wheel
-	 *
-	 * @defaultValue false
-	 */
-	mouseWheel?: boolean;
-
-	/**
-	 * Opens links in an iframe preview overlay
-	 * Add `data-preview-link` and `data-preview-link="false"` to customize each link
-	 * individually
-	 *
-	 * @defaultValue false
-	 */
-	previewLinks?: boolean;
-
-	/**
-	 * Exposes the reveal.js API through window.postMessage
-	 *
-	 * @defaultValue true
-	 */
-	postMessage?: boolean;
-
-	/**
-	 * Dispatches all reveal.js events to the parent window through postMessage
-	 *
-	 * @defaultValue false
-	 */
-	postMessageEvents?: boolean;
-
-	/**
-	 * Focuses body when page changes visibility to ensure keyboard shortcuts work
-	 *
-	 * @defaultValue true
-	 */
-	focusBodyOnPageVisibilityChange?: boolean;
-
-	/**
-	 * Transition style
-	 *
-	 * @defaultValue 'slide'
-	 */
-	transition?: 'none' | 'fade' | 'slide' | 'convex' | 'concave' | 'zoom';
-
-	/**
-	 * Transition speed
-	 *
-	 * @defaultValue 'default'
-	 */
-	transitionSpeed?: 'default' | 'fast' | 'slow';
-
-	/**
-	 * Transition style for full page slide backgrounds
-	 *
-	 * @defaultValue 'fade'
-	 */
-	backgroundTransition?: 'fade' | 'none' | 'slide' | 'convex' | 'concave' | 'zoom';
-
-	/**
-	 * Parallax background image
-	 *
-	 * @defaultValue ''
-	 */
-	parallaxBackgroundImage?: null | string; // CSS syntax, e.g. "a.jpg"
-
-	/**
-	 * Parallax background size
-	 *
-	 * @defaultValue ''
-	 */
-	parallaxBackgroundSize?: null | string; // CSS syntax, e.g. "3000px 2000px"
-
-	/**
-	 * Parallax background repeat
-	 *
-	 * @defaultValue ''
-	 */
-	parallaxBackgroundRepeat?: null | string; // repeat/repeat-x/repeat-y/no-repeat/initial/inherit
-
-	/**
-	 * Parallax background position
-	 *
-	 * @defaultValue ''
-	 */
-	parallaxBackgroundPosition?: null | string; // CSS syntax, e.g. "top left"
-
-	/**
-	 * Amount of pixels to move the parallax background per slide step
-	 *
-	 * @defaultValue null
-	 */
-	parallaxBackgroundHorizontal?: null | number;
-	/**
-	 *
-	 * @defaultValue null
-	 */
-	parallaxBackgroundVertical?: null | number;
-
-	/**
-	 * Can be used to initialize reveal.js in one of the following views:
-	 * - print:   Render the presentation so that it can be printed to PDF
-	 * - scroll:  Show the presentation as a tall scrollable page with scroll
-	 *            triggered animations
-	 *
-	 * @defaultValue null
-	 */
-	view?: null | 'print' | 'scroll';
-
-	/**
-	 * Adjusts the height of each slide in the scroll view.
-	 * - full:       Each slide is as tall as the viewport
-	 * - compact:    Slides are as small as possible, allowing multiple slides
-	 *               to be visible in parallel on tall devices
-	 *
-	 * @defaultValue 'full'
-	 */
-	scrollLayout?: 'full' | 'compact';
-
-	/**
-	 * Control how scroll snapping works in the scroll view.
-	 * - false:   	No snapping, scrolling is continuous
-	 * - proximity:  Snap when close to a slide
-	 * - mandatory:  Always snap to the closest slide
-	 *
-	 * Only applies to presentations in scroll view.
-	 *
-	 * @defaultValue 'mandatory'
-	 */
-	scrollSnap?: false | 'proximity' | 'mandatory';
-
-	/**
-	 * Enables and configures the scroll view progress bar.
-	 * - 'auto':    Show the scrollbar while scrolling, hide while idle
-	 * - true:      Always show the scrollbar
-	 * - false:     Never show the scrollbar
-	 *
-	 * @defaultValue 'auto'
-	 */
-	scrollProgress?: 'auto' | boolean;
-
-	/**
-	 * Automatically activate the scroll view when we the viewport falls
-	 * below the given width.
-	 *
-	 * @defaultValue 435
-	 */
-	scrollActivationWidth?: number;
-
-	/**
-	 * The maximum number of pages a single slide can expand onto when printing
-	 * to PDF, unlimited by default
-	 *
-	 * @defaultValue Number.POSITIVE_INFINITY
-	 */
-	pdfMaxPagesPerSlide?: number;
-
-	/**
-	 * Prints each fragment on a separate slide
-	 *
-	 * @defaultValue true
-	 */
-	pdfSeparateFragments?: boolean;
-
-	/**
-	 * Offset used to reduce the height of content within exported PDF pages.
-	 * This exists to account for environment differences based on how you
-	 * print to PDF. CLI printing options, like phantomjs and wkpdf, can end
-	 * on precisely the total height of the document whereas in-browser
-	 * printing has to end one pixel before.
-	 *
-	 * @defaultValue -1
-	 */
-	pdfPageHeightOffset?: number;
-
-	/**
-	 * Number of slides away from the current that are visible
-	 *
-	 * @defaultValue 3
-	 */
-	viewDistance?: number;
-
-	/**
-	 * Number of slides away from the current that are visible on mobile
-	 * devices. It is advisable to set this to a lower number than
-	 * viewDistance in order to save resources.
-	 *
-	 * @defaultValue 2
-	 */
-	mobileViewDistance?: number;
-
-	/**
-	 * The display mode that will be used to show slides
-	 *
-	 * @defaultValue 'block'
-	 */
-	display?: string;
-
-	/**
-	 * Hide cursor if inactive
-	 *
-	 * @defaultValue true
-	 */
-	hideInactiveCursor?: boolean;
-
-	/**
-	 * Time before the cursor is hidden (in ms)
-	 *
-	 * @defaultValue 5000
-	 */
-	hideCursorTime?: number;
-
-	/**
-	 * Should we automatically sort and set indices for fragments
-	 * at each sync? (See Reveal.sync)
-	 *
-	 * @defaultValue true
-	 */
-	sortFragmentsOnSync?: boolean;
-
-	/**
-	 * Script dependencies to load
-	 *
-	 * @defaultValue []
-	 */
-	dependencies?: any[];
-
-	/**
-	 * Plugin objects to register and use for this presentation
-	 *
-	 * @defaultValue []
-	 */
-	plugins?: any[];
-};
+  /**
+   * The "normal" size of the presentation, aspect ratio will be preserved
+   * when the presentation is scaled to fit different resolutions
+   *
+   * @defaultValue 960
+   */
+  width?: number | string;
+
+  /**
+   * The "normal" size of the presentation, aspect ratio will be preserved
+   * when the presentation is scaled to fit different resolutions
+   *
+   * @defaultValue 700
+   */
+  height?: number | string;
+
+  /**
+   * Factor of the display size that should remain empty around the content
+   *
+   * @defaultValue 0.04
+   */
+  margin?: number;
+
+  /**
+   * Bounds for smallest/largest possible scale to apply to content
+   *
+   * @defaultValue 0.2
+   */
+  minScale?: number;
+
+  /**
+   *
+   * @defaultValue 2.0
+   */
+  maxScale?: number;
+
+  /**
+   * Display presentation control arrows
+	 * - true: Display controls in all views
+	 * - false: Hide controls in all views
+	 * - 'speaker-only': Display controls only in the speaker view
+   *
+   * @defaultValue true
+   */
+  controls?: boolean | 'speaker-only';
+
+  /**
+   * Help the user learn the controls by providing hints, for example by
+   * bouncing the down arrow when they first encounter a vertical slide
+   *
+   * @defaultValue true
+   */
+  controlsTutorial?: boolean;
+
+  /**
+   * Determines where controls appear, "edges" or "bottom-right"
+   *
+   * @defaultValue 'bottom-right'
+   */
+  controlsLayout?: 'edges' | 'bottom-right';
+
+  /**
+   * Visibility rule for backwards navigation arrows; "faded", "hidden"
+   * or "visible"
+   *
+   * @defaultValue 'faded'
+   */
+  controlsBackArrows?: 'faded' | 'hidden' | 'visible';
+
+  /**
+   * Display a presentation progress bar
+   *
+   * @defaultValue true
+   */
+  progress?: boolean;
+
+  /**
+   * Display the page number of the current slide
+   * - true:    Show slide number
+   * - false:   Hide slide number
+   *
+   * Can optionally be set as a string that specifies the number formatting:
+   * - "h.v":	  Horizontal . vertical slide number (default)
+   * - "h/v":	  Horizontal / vertical slide number
+   * - "c":	  Flattened slide number
+   * - "c/t":	  Flattened slide number / total slides
+   *
+   * Alternatively, you can provide a function that returns the slide
+   * number for the current slide. The function should take in a slide
+   * object and return an array with one string [slideNumber] or
+   * three strings [n1,delimiter,n2]. See #formatSlideNumber().
+   *
+   * @defaultValue false
+   */
+  slideNumber?:
+    | boolean
+    | 'h.v'
+    | 'h/v'
+    | 'c'
+    | 'c/t'
+    | ((slide: any) => string | [string, string, string]);
+
+  /**
+   * Can be used to limit the contexts in which the slide number appears
+   * - "all":      Always show the slide number
+   * - "print":    Only when printing to PDF
+   * - "speaker":  Only in the speaker view
+   *
+   * @defaultValue 'all'
+   */
+  showSlideNumber?: 'all' | 'print' | 'speaker';
+
+  /**
+   * Use 1 based indexing for # links to match slide number (default is zero
+   * based)
+   *
+   * @defaultValue false
+   */
+  hashOneBasedIndex?: boolean;
+
+  /**
+   * Add the current slide number to the URL hash so that reloading the
+   * page/copying the URL will return you to the same slide
+   *
+   * @defaultValue false
+   */
+  hash?: boolean;
+
+  /**
+   * Flags if we should monitor the hash and change slides accordingly
+   *
+   * @defaultValue true
+   */
+  respondToHashChanges?: boolean;
+
+  /**
+   * Enable support for jump-to-slide navigation shortcuts
+   *
+   * @defaultValue true
+   */
+  jumpToSlide?: boolean;
+
+  /**
+   * Push each slide change to the browser history. Implies `hash: true`
+   *
+   * @defaultValue false
+   */
+  history?: boolean;
+
+  /**
+   * Enable keyboard shortcuts for navigation
+   *
+   * @defaultValue true
+   */
+  keyboard?: boolean;
+
+  /**
+   * Optional function that blocks keyboard events when returning false
+   *
+   * If you set this to 'focused', we will only capture keyboard events
+   * for embedded decks when they are in focus
+   *
+   * @defaultValue null
+   */
+  keyboardCondition?: null | 'focused' | ((event: KeyboardEvent) => boolean);
+
+  /**
+   * Disables the default reveal.js slide layout (scaling and centering)
+   * so that you can use custom CSS layout
+   *
+   * @defaultValue false
+   */
+  disableLayout?: boolean;
+
+  /**
+   * Enable the slide overview mode
+   *
+   * @defaultValue true
+   */
+  overview?: boolean;
+
+  /**
+   * Vertical centering of slides
+   *
+   * @defaultValue true
+   */
+  center?: boolean;
+
+  /**
+   * Enables touch navigation on devices with touch input
+   *
+   * @defaultValue true
+   */
+  touch?: boolean;
+
+  /**
+   * Loop the presentation
+   *
+   * @defaultValue false
+   */
+  loop?: boolean;
+
+  /**
+   * Change the presentation direction to be RTL
+   *
+   * @defaultValue false
+   */
+  rtl?: boolean;
+
+  /**
+   * Changes the behavior of our navigation directions.
+   *
+   * "default"
+   * Left/right arrow keys step between horizontal slides, up/down
+   * arrow keys step between vertical slides. Space key steps through
+   * all slides (both horizontal and vertical).
+   *
+   * "linear"
+   * Removes the up/down arrows. Left/right arrows step through all
+   * slides (both horizontal and vertical).
+   *
+   * "grid"
+   * When this is enabled, stepping left/right from a vertical stack
+   * to an adjacent vertical stack will land you at the same vertical
+   * index.
+   *
+   * Consider a deck with six slides ordered in two vertical stacks:
+   * 1.1    2.1
+   * 1.2    2.2
+   * 1.3    2.3
+   *
+   * If you're on slide 1.3 and navigate right, you will normally move
+   * from 1.3 -> 2.1. If "grid" is used, the same navigation takes you
+   * from 1.3 -> 2.3.
+   *
+   * @defaultValue 'default'
+   */
+  navigationMode?: 'default' | 'linear' | 'grid';
+
+  /**
+   * Randomizes the order of slides each time the presentation loads
+   *
+   * @defaultValue false
+   */
+  shuffle?: boolean;
+
+  /**
+   * Turns fragments on and off globally
+   *
+   * @defaultValue true
+   */
+  fragments?: boolean;
+
+  /**
+   * Flags whether to include the current fragment in the URL,
+   * so that reloading brings you to the same fragment position
+   *
+   * @defaultValue true
+   */
+  fragmentInURL?: boolean;
+
+  /**
+   * Flags if the presentation is running in an embedded mode,
+   * i.e. contained within a limited portion of the screen
+   *
+   * @defaultValue false
+   */
+  embedded?: boolean;
+
+  /**
+   * Flags if we should show a help overlay when the question-mark
+   * key is pressed
+   *
+   * @defaultValue true
+   */
+  help?: boolean;
+
+  /**
+   * Flags if it should be possible to pause the presentation (blackout)
+   *
+   * @defaultValue true
+   */
+  pause?: boolean;
+
+  /**
+   * Flags if speaker notes should be visible to all viewers
+   *
+   * @defaultValue false
+   */
+  showNotes?: boolean;
+
+  /**
+   * Flags if slides with data-visibility="hidden" should be kept visible
+   *
+   * @defaultValue false
+   */
+  showHiddenSlides?: boolean;
+
+  /**
+   * Global override for autoplaying embedded media (video/audio/iframe)
+   * - null:   Media will only autoplay if data-autoplay is present
+   * - true:   All media will autoplay, regardless of individual setting
+   * - false:  No media will autoplay, regardless of individual setting
+   *
+   * @defaultValue null
+   */
+  autoPlayMedia?: null | boolean;
+
+  /**
+   * Global override for preloading lazy-loaded iframes
+   * - null:   Iframes with data-src AND data-preload will be loaded when within
+   *           the viewDistance, iframes with only data-src will be loaded when visible
+   * - true:   All iframes with data-src will be loaded when within the viewDistance
+   * - false:  All iframes with data-src will be loaded only when visible
+   *
+   * @defaultValue null
+   */
+  preloadIframes?: null | boolean;
+
+  /**
+   * Can be used to globally disable auto-animation
+   *
+   * @defaultValue true
+   */
+  autoAnimate?: boolean;
+
+  /**
+   * Optionally provide a custom element matcher that will be
+   * used to dictate which elements we can animate between.
+   *
+   * @defaultValue null
+   */
+  autoAnimateMatcher?: null | Function;
+
+  /**
+   * Default settings for our auto-animate transitions, can be
+   * overridden per-slide or per-element via data arguments
+   *
+   * @defaultValue 'ease'
+   */
+  autoAnimateEasing?: 'ease' | string;
+
+  /**
+   * Number of seconds to animate each element.
+   *
+   * @defaultValue 1.0
+   */
+  autoAnimateDuration?: number;
+
+  /**
+   * Should unmatched elements be faded in?
+   *
+   * @defaultValue true
+   */
+  autoAnimateUnmatched?: boolean;
+
+  /**
+   * CSS properties that can be auto-animated. Position & scale
+   * is matched separately so there's no need to include styles
+   * like top/right/bottom/left, width/height or margin.
+   *
+   * @defaultValue ['opacity', 'color', 'background-color', 'padding', 'font-size', 'line-height', 'letter-spacing', 'border-width', 'border-color', 'border-radius', 'outline', 'outline-offset']
+   */
+  autoAnimateStyles?: string[];
+
+  /**
+   * Controls automatic progression to the next slide
+   * - 0:      Auto-sliding only happens if the data-autoslide HTML attribute
+   *           is present on the current slide or fragment
+   * - 1+:     All slides will progress automatically at the given interval
+   * - false:  No auto-sliding, even if data-autoslide is present
+   *
+   * @defaultValue 0
+   */
+  autoSlide?: number | false;
+
+  /**
+   * Stop auto-sliding after user input
+   *
+   * @defaultValue true
+   */
+  autoSlideStoppable?: boolean;
+
+  /**
+   * Use this method for navigation when auto-sliding (defaults to navigateNext)
+   *
+   * @defaultValue null
+   */
+  autoSlideMethod?: null | Function;
+
+  /**
+   * Specify the average time in seconds that you think you will spend
+   * presenting each slide. This is used to show a pacing timer in the
+   * speaker view
+   *
+   * @defaultValue null
+   */
+  defaultTiming?: null;
+
+  /**
+   * Enable slide navigation via mouse wheel
+   *
+   * @defaultValue false
+   */
+  mouseWheel?: boolean;
+
+  /**
+   * Opens links in an iframe preview overlay
+   * Add `data-preview-link` and `data-preview-link="false"` to customize each link
+   * individually
+   *
+   * @defaultValue false
+   */
+  previewLinks?: boolean;
+
+  /**
+   * Exposes the reveal.js API through window.postMessage
+   *
+   * @defaultValue true
+   */
+  postMessage?: boolean;
+
+  /**
+   * Dispatches all reveal.js events to the parent window through postMessage
+   *
+   * @defaultValue false
+   */
+  postMessageEvents?: boolean;
+
+  /**
+   * Focuses body when page changes visibility to ensure keyboard shortcuts work
+   *
+   * @defaultValue true
+   */
+  focusBodyOnPageVisibilityChange?: boolean;
+
+  /**
+   * Transition style
+   *
+   * @defaultValue 'slide'
+   */
+  transition?: 'none' | 'fade' | 'slide' | 'convex' | 'concave' | 'zoom';
+
+  /**
+   * Transition speed
+   *
+   * @defaultValue 'default'
+   */
+  transitionSpeed?: 'default' | 'fast' | 'slow';
+
+  /**
+   * Transition style for full page slide backgrounds
+   *
+   * @defaultValue 'fade'
+   */
+  backgroundTransition?: 'fade' | 'none' | 'slide' | 'convex' | 'concave' | 'zoom';
+
+  /**
+   * Parallax background image
+   *
+   * @defaultValue ''
+   */
+  parallaxBackgroundImage?: null | string; // CSS syntax, e.g. "a.jpg"
+
+  /**
+   * Parallax background size
+   *
+   * @defaultValue ''
+   */
+  parallaxBackgroundSize?: null | string; // CSS syntax, e.g. "3000px 2000px"
+
+  /**
+   * Parallax background repeat
+   *
+   * @defaultValue ''
+   */
+  parallaxBackgroundRepeat?: null | string; // repeat/repeat-x/repeat-y/no-repeat/initial/inherit
+
+  /**
+   * Parallax background position
+   *
+   * @defaultValue ''
+   */
+  parallaxBackgroundPosition?: null | string; // CSS syntax, e.g. "top left"
+
+  /**
+   * Amount of pixels to move the parallax background per slide step
+   *
+   * @defaultValue null
+   */
+  parallaxBackgroundHorizontal?: null | number;
+  /**
+   *
+   * @defaultValue null
+   */
+  parallaxBackgroundVertical?: null | number;
+
+  /**
+   * Can be used to initialize reveal.js in one of the following views:
+   * - print:   Render the presentation so that it can be printed to PDF
+   * - scroll:  Show the presentation as a tall scrollable page with scroll
+   *            triggered animations
+   *
+   * @defaultValue null
+   */
+  view?: null | 'print' | 'scroll';
+
+  /**
+   * Adjusts the height of each slide in the scroll view.
+   * - full:       Each slide is as tall as the viewport
+   * - compact:    Slides are as small as possible, allowing multiple slides
+   *               to be visible in parallel on tall devices
+   *
+   * @defaultValue 'full'
+   */
+  scrollLayout?: 'full' | 'compact';
+
+  /**
+   * Control how scroll snapping works in the scroll view.
+   * - false:   	No snapping, scrolling is continuous
+   * - proximity:  Snap when close to a slide
+   * - mandatory:  Always snap to the closest slide
+   *
+   * Only applies to presentations in scroll view.
+   *
+   * @defaultValue 'mandatory'
+   */
+  scrollSnap?: false | 'proximity' | 'mandatory';
+
+  /**
+   * Enables and configures the scroll view progress bar.
+   * - 'auto':    Show the scrollbar while scrolling, hide while idle
+   * - true:      Always show the scrollbar
+   * - false:     Never show the scrollbar
+   *
+   * @defaultValue 'auto'
+   */
+  scrollProgress?: 'auto' | boolean;
+
+  /**
+   * Automatically activate the scroll view when we the viewport falls
+   * below the given width.
+   *
+   * @defaultValue 435
+   */
+  scrollActivationWidth?: number;
+
+  /**
+   * The maximum number of pages a single slide can expand onto when printing
+   * to PDF, unlimited by default
+   *
+   * @defaultValue Number.POSITIVE_INFINITY
+   */
+  pdfMaxPagesPerSlide?: number;
+
+  /**
+   * Prints each fragment on a separate slide
+   *
+   * @defaultValue true
+   */
+  pdfSeparateFragments?: boolean;
+
+  /**
+   * Offset used to reduce the height of content within exported PDF pages.
+   * This exists to account for environment differences based on how you
+   * print to PDF. CLI printing options, like phantomjs and wkpdf, can end
+   * on precisely the total height of the document whereas in-browser
+   * printing has to end one pixel before.
+   *
+   * @defaultValue -1
+   */
+  pdfPageHeightOffset?: number;
+
+  /**
+   * Number of slides away from the current that are visible
+   *
+   * @defaultValue 3
+   */
+  viewDistance?: number;
+
+  /**
+   * Number of slides away from the current that are visible on mobile
+   * devices. It is advisable to set this to a lower number than
+   * viewDistance in order to save resources.
+   *
+   * @defaultValue 2
+   */
+  mobileViewDistance?: number;
+
+  /**
+   * The display mode that will be used to show slides
+   *
+   * @defaultValue 'block'
+   */
+  display?: string;
+
+  /**
+   * Hide cursor if inactive
+   *
+   * @defaultValue true
+   */
+  hideInactiveCursor?: boolean;
+
+  /**
+   * Time before the cursor is hidden (in ms)
+   *
+   * @defaultValue 5000
+   */
+  hideCursorTime?: number;
+
+  /**
+   * Should we automatically sort and set indices for fragments
+   * at each sync? (See Reveal.sync)
+   *
+   * @defaultValue true
+   */
+  sortFragmentsOnSync?: boolean;
+
+  /**
+   * Script dependencies to load
+   *
+   * @defaultValue []
+   */
+  dependencies?: any[];
+
+  /**
+   * Plugin objects to register and use for this presentation
+   *
+   * @defaultValue []
+   */
+  plugins?: any[];
+}
 
 /**
  * The default reveal.js config object.
  */
 const defaultConfig: Config = {
-	width: 960,
-	height: 700,
-	margin: 0.04,
-	minScale: 0.2,
-	maxScale: 2.0,
-
-	controls: true,
-	controlsTutorial: true,
-	controlsLayout: 'bottom-right',
-	controlsBackArrows: 'faded',
-	progress: true,
-
-	slideNumber: false,
-	showSlideNumber: 'all',
-	hashOneBasedIndex: false,
-	hash: false,
-	respondToHashChanges: true,
-	jumpToSlide: true,
-	history: false,
-	keyboard: true,
-	keyboardCondition: null,
-	disableLayout: false,
-	overview: true,
-	center: true,
-	touch: true,
-	loop: false,
-	rtl: false,
-	navigationMode: 'default',
-	shuffle: false,
-	fragments: true,
-	fragmentInURL: true,
-	embedded: false,
-	help: true,
-	pause: true,
-	showNotes: false,
-	showHiddenSlides: false,
-	autoPlayMedia: null,
-	preloadIframes: null,
-	mouseWheel: false,
-	previewLinks: false,
-	viewDistance: 3,
-	mobileViewDistance: 2,
-	display: 'block',
-	hideInactiveCursor: true,
-	hideCursorTime: 5000,
-	sortFragmentsOnSync: true,
-
-	autoAnimate: true,
-	autoAnimateMatcher: null,
-	autoAnimateEasing: 'ease',
-	autoAnimateDuration: 1.0,
-	autoAnimateUnmatched: true,
-
-	autoAnimateStyles: [
-		'opacity',
-		'color',
-		'background-color',
-		'padding',
-		'font-size',
-		'line-height',
-		'letter-spacing',
-		'border-width',
-		'border-color',
-		'border-radius',
-		'outline',
-		'outline-offset',
-	],
-
-	autoSlide: 0,
-	autoSlideStoppable: true,
-	autoSlideMethod: null,
-	defaultTiming: null,
-
-	postMessage: true,
-	postMessageEvents: false,
-
-	focusBodyOnPageVisibilityChange: true,
-
-	transition: 'slide',
-	transitionSpeed: 'default',
-	backgroundTransition: 'fade',
-
-	parallaxBackgroundImage: '',
-	parallaxBackgroundSize: '',
-	parallaxBackgroundRepeat: '',
-	parallaxBackgroundPosition: '',
-	parallaxBackgroundHorizontal: null,
-	parallaxBackgroundVertical: null,
-
-	view: null,
-
-	scrollLayout: 'full',
-	scrollSnap: 'mandatory',
-	scrollProgress: 'auto',
-	scrollActivationWidth: 435,
-
-	pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
-	pdfSeparateFragments: true,
-	pdfPageHeightOffset: -1,
-
-	dependencies: [],
-	plugins: [],
+  width: 960,
+  height: 700,
+  margin: 0.04,
+  minScale: 0.2,
+  maxScale: 2.0,
+
+  controls: true,
+  controlsTutorial: true,
+  controlsLayout: 'bottom-right',
+  controlsBackArrows: 'faded',
+  progress: true,
+
+  slideNumber: false,
+  showSlideNumber: 'all',
+  hashOneBasedIndex: false,
+  hash: false,
+  respondToHashChanges: true,
+  jumpToSlide: true,
+  history: false,
+  keyboard: true,
+  keyboardCondition: null,
+  disableLayout: false,
+  overview: true,
+  center: true,
+  touch: true,
+  loop: false,
+  rtl: false,
+  navigationMode: 'default',
+  shuffle: false,
+  fragments: true,
+  fragmentInURL: true,
+  embedded: false,
+  help: true,
+  pause: true,
+  showNotes: false,
+  showHiddenSlides: false,
+  autoPlayMedia: null,
+  preloadIframes: null,
+  mouseWheel: false,
+  previewLinks: false,
+  viewDistance: 3,
+  mobileViewDistance: 2,
+  display: 'block',
+  hideInactiveCursor: true,
+  hideCursorTime: 5000,
+  sortFragmentsOnSync: true,
+
+  autoAnimate: true,
+  autoAnimateMatcher: null,
+  autoAnimateEasing: 'ease',
+  autoAnimateDuration: 1.0,
+  autoAnimateUnmatched: true,
+
+  autoAnimateStyles: [
+    'opacity',
+    'color',
+    'background-color',
+    'padding',
+    'font-size',
+    'line-height',
+    'letter-spacing',
+    'border-width',
+    'border-color',
+    'border-radius',
+    'outline',
+    'outline-offset',
+  ],
+
+  autoSlide: 0,
+  autoSlideStoppable: true,
+  autoSlideMethod: null,
+  defaultTiming: null,
+
+  postMessage: true,
+  postMessageEvents: false,
+
+  focusBodyOnPageVisibilityChange: true,
+
+  transition: 'slide',
+  transitionSpeed: 'default',
+  backgroundTransition: 'fade',
+
+  parallaxBackgroundImage: '',
+  parallaxBackgroundSize: '',
+  parallaxBackgroundRepeat: '',
+  parallaxBackgroundPosition: '',
+  parallaxBackgroundHorizontal: null,
+  parallaxBackgroundVertical: null,
+
+  view: null,
+
+  scrollLayout: 'full',
+  scrollSnap: 'mandatory',
+  scrollProgress: 'auto',
+  scrollActivationWidth: 435,
+
+  pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
+  pdfSeparateFragments: true,
+  pdfPageHeightOffset: -1,
+
+  dependencies: [],
+  plugins: [],
 };
 
 export type { Config };

+ 12 - 12
js/index.ts

@@ -14,8 +14,8 @@ import Deck, { VERSION } from './reveal.js';
  * });
  */
 let Reveal: {
-	initialize: (options?: Config) => Promise<void>;
-	[key: string]: any;
+  initialize: (options?: Config) => Promise<void>;
+  [key: string]: any;
 } = Deck;
 
 /**
@@ -35,13 +35,13 @@ type RevealApiFunction = (...args: any[]) => any;
 let enqueuedAPICalls: RevealApiFunction[] = [];
 
 Reveal.initialize = (options?: Config) => {
-	// Create our singleton reveal.js instance
-	Object.assign(Reveal, new Deck(document.querySelector('.reveal'), options));
+  // Create our singleton reveal.js instance
+  Object.assign(Reveal, new Deck(document.querySelector('.reveal'), options));
 
-	// Invoke any enqueued API calls
-	enqueuedAPICalls.map((method) => method(Reveal));
+  // Invoke any enqueued API calls
+  enqueuedAPICalls.map((method) => method(Reveal));
 
-	return Reveal.initialize();
+  return Reveal.initialize();
 };
 
 /**
@@ -51,11 +51,11 @@ Reveal.initialize = (options?: Config) => {
  * of them when Reveal.initialize is called.
  */
 ['configure', 'on', 'off', 'addEventListener', 'removeEventListener', 'registerPlugin'].forEach(
-	(method) => {
-		Reveal[method] = (...args: any) => {
-			enqueuedAPICalls.push((deck) => deck[method].call(null, ...args));
-		};
-	}
+  (method) => {
+    Reveal[method] = (...args: any) => {
+      enqueuedAPICalls.push((deck) => deck[method].call(null, ...args));
+    };
+  }
 );
 
 Reveal.isReady = () => false;

+ 126 - 126
package.json

@@ -1,128 +1,128 @@
 {
-  "name": "reveal.js",
-  "version": "5.2.1",
-  "description": "The HTML Presentation Framework",
-  "homepage": "https://revealjs.com",
-  "subdomain": "revealjs",
-  "license": "MIT",
-  "main": "dist/reveal.js",
-  "module": "dist/reveal.mjs",
-  "types": "dist/reveal.d.ts",
-  "type": "module",
-  "exports": {
-    ".": {
-      "import": "./dist/reveal.mjs",
-      "require": "./dist/reveal.js",
-      "default": "./dist/reveal.js"
-    },
-    "./reveal.css": "./dist/reveal.css",
-    "./reset.css": "./dist/reset.css",
-    "./theme/*": "./dist/theme/*",
-    "./plugin/highlight": {
-      "import": "./dist/plugin/highlight.mjs",
-      "require": "./dist/plugin/highlight.js",
-      "default": "./dist/plugin/highlight.js"
-    },
-    "./plugin/markdown": {
-      "import": "./dist/plugin/markdown.mjs",
-      "require": "./dist/plugin/markdown.js",
-      "default": "./dist/plugin/markdown.js"
-    },
-    "./plugin/math": {
-      "import": "./dist/plugin/math.mjs",
-      "require": "./dist/plugin/math.js",
-      "default": "./dist/plugin/math.js"
-    },
-    "./plugin/notes": {
-      "import": "./dist/plugin/notes.mjs",
-      "require": "./dist/plugin/notes.js",
-      "default": "./dist/plugin/notes.js"
-    },
-    "./plugin/search": {
-      "import": "./dist/plugin/search.mjs",
-      "require": "./dist/plugin/search.js",
-      "default": "./dist/plugin/search.js"
-    },
-    "./plugin/zoom": {
-      "import": "./dist/plugin/zoom.mjs",
-      "require": "./dist/plugin/zoom.js",
-      "default": "./dist/plugin/zoom.js"
-    }
-  },
-  "scripts": {
-    "dev": "npm run start",
-    "start": "vite --port 8000",
-    "build:core": "tsc && vite build && vite build -c vite.config.styles.ts",
-    "build:styles": "vite build -c vite.config.styles.ts",
-    "build": "tsc && vite build && vite build -c vite.config.styles.ts && vite build -c plugin/highlight/vite.config.ts && vite build -c plugin/markdown/vite.config.ts && vite build -c plugin/math/vite.config.ts && vite build -c plugin/notes/vite.config.ts && vite build -c plugin/search/vite.config.ts && vite build -c plugin/zoom/vite.config.ts",
-    "test": "node test.js"
-  },
-  "author": {
-    "name": "Hakim El Hattab",
-    "email": "hakim.elhattab@gmail.com",
-    "web": "https://hakim.se"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hakimel/reveal.js.git"
-  },
-  "engines": {
-    "node": ">=18.0.0"
-  },
-  "keywords": [
-    "reveal",
-    "slides",
-    "presentation"
-  ],
-  "devDependencies": {
-    "fitty": "^2.4.2",
-    "glob": "^10.3.10",
-    "highlight.js": "^11.10.0",
-    "marked": "^4.3.0",
-    "node-qunit-puppeteer": "^2.2.0",
-    "qunit": "^2.22.0",
-    "sass": "^1.80.2",
-    "typescript": "^5.2.2",
-    "vite": "^5.4.9",
-    "vite-plugin-dts": "^4.2.4"
-  },
-  "browserslist": "> 2%, not dead",
-  "eslintConfig": {
-    "env": {
-      "browser": true,
-      "es6": true
-    },
-    "parser": "@babel/eslint-parser",
-    "parserOptions": {
-      "sourceType": "module",
-      "allowImportExportEverywhere": true,
-      "requireConfigFile": false
-    },
-    "globals": {
-      "module": false,
-      "console": false,
-      "unescape": false,
-      "define": false,
-      "exports": false
-    },
-    "rules": {
-      "curly": 0,
-      "eqeqeq": 2,
-      "wrap-iife": [
-        2,
-        "any"
-      ],
-      "no-use-before-define": [
-        2,
-        {
-          "functions": false
-        }
-      ],
-      "new-cap": 2,
-      "no-caller": 2,
-      "dot-notation": 0,
-      "no-eq-null": 2,
-      "no-unused-expressions": 0
-    }
-  }
+	"name": "reveal.js",
+	"version": "5.0.5",
+	"description": "The HTML Presentation Framework",
+	"homepage": "https://revealjs.com",
+	"subdomain": "revealjs",
+	"license": "MIT",
+	"main": "dist/reveal.js",
+	"module": "dist/reveal.mjs",
+	"types": "dist/reveal.d.ts",
+	"type": "module",
+	"exports": {
+		".": {
+			"import": "./dist/reveal.mjs",
+			"require": "./dist/reveal.js",
+			"default": "./dist/reveal.js"
+		},
+		"./reveal.css": "./dist/reveal.css",
+		"./reset.css": "./dist/reset.css",
+		"./theme/*": "./dist/theme/*",
+		"./plugin/highlight": {
+			"import": "./dist/plugin/highlight.mjs",
+			"require": "./dist/plugin/highlight.js",
+			"default": "./dist/plugin/highlight.js"
+		},
+		"./plugin/markdown": {
+			"import": "./dist/plugin/markdown.mjs",
+			"require": "./dist/plugin/markdown.js",
+			"default": "./dist/plugin/markdown.js"
+		},
+		"./plugin/math": {
+			"import": "./dist/plugin/math.mjs",
+			"require": "./dist/plugin/math.js",
+			"default": "./dist/plugin/math.js"
+		},
+		"./plugin/notes": {
+			"import": "./dist/plugin/notes.mjs",
+			"require": "./dist/plugin/notes.js",
+			"default": "./dist/plugin/notes.js"
+		},
+		"./plugin/search": {
+			"import": "./dist/plugin/search.mjs",
+			"require": "./dist/plugin/search.js",
+			"default": "./dist/plugin/search.js"
+		},
+		"./plugin/zoom": {
+			"import": "./dist/plugin/zoom.mjs",
+			"require": "./dist/plugin/zoom.js",
+			"default": "./dist/plugin/zoom.js"
+		}
+	},
+	"scripts": {
+		"dev": "npm run start",
+		"start": "vite --port 8000",
+		"build:core": "tsc && vite build && vite build -c vite.config.styles.ts",
+		"build:styles": "vite build -c vite.config.styles.ts",
+		"build": "tsc && vite build && vite build -c vite.config.styles.ts && vite build -c plugin/highlight/vite.config.ts && vite build -c plugin/markdown/vite.config.ts && vite build -c plugin/math/vite.config.ts && vite build -c plugin/notes/vite.config.ts && vite build -c plugin/search/vite.config.ts && vite build -c plugin/zoom/vite.config.ts",
+		"test": "node test.js"
+	},
+	"author": {
+		"name": "Hakim El Hattab",
+		"email": "hakim.elhattab@gmail.com",
+		"web": "https://hakim.se"
+	},
+	"repository": {
+		"type": "git",
+		"url": "git://github.com/hakimel/reveal.js.git"
+	},
+	"engines": {
+		"node": ">=18.0.0"
+	},
+	"keywords": [
+		"reveal",
+		"slides",
+		"presentation"
+	],
+	"devDependencies": {
+		"fitty": "^2.4.2",
+		"glob": "^10.3.10",
+		"highlight.js": "^11.10.0",
+		"marked": "^4.3.0",
+		"node-qunit-puppeteer": "^2.2.0",
+		"qunit": "^2.22.0",
+		"sass": "^1.80.2",
+		"typescript": "^5.2.2",
+		"vite": "^5.4.9",
+		"vite-plugin-dts": "^4.2.4"
+	},
+	"browserslist": "> 2%, not dead",
+	"eslintConfig": {
+		"env": {
+			"browser": true,
+			"es6": true
+		},
+		"parser": "@babel/eslint-parser",
+		"parserOptions": {
+			"sourceType": "module",
+			"allowImportExportEverywhere": true,
+			"requireConfigFile": false
+		},
+		"globals": {
+			"module": false,
+			"console": false,
+			"unescape": false,
+			"define": false,
+			"exports": false
+		},
+		"rules": {
+			"curly": 0,
+			"eqeqeq": 2,
+			"wrap-iife": [
+				2,
+				"any"
+			],
+			"no-use-before-define": [
+				2,
+				{
+					"functions": false
+				}
+			],
+			"new-cap": 2,
+			"no-caller": 2,
+			"dot-notation": 0,
+			"no-eq-null": 2,
+			"no-unused-expressions": 0
+		}
+	}
 }

+ 4 - 4
plugin/markdown/vite.config.ts

@@ -1,5 +1,5 @@
 import { resolve } from 'path';
-import { defineConfig } from 'vite'
+import { defineConfig } from 'vite';
 import { appendExtension } from '../../vite.config.ts';
 
 // Once Vite supports multiple entries for plugins, this build can
@@ -15,8 +15,8 @@ export default defineConfig({
         'plugin/markdown': resolve(__dirname, 'index.js'),
       },
       name: 'RevealMarkdown',
-      fileName: appendExtension
-    }
+      fileName: appendExtension,
+    },
   },
   plugins: [],
-})
+});

+ 4 - 4
plugin/math/vite.config.ts

@@ -1,5 +1,5 @@
 import { resolve } from 'path';
-import { defineConfig } from 'vite'
+import { defineConfig } from 'vite';
 import { appendExtension } from '../../vite.config.ts';
 
 // Once Vite supports multiple entries for plugins, this build can
@@ -15,8 +15,8 @@ export default defineConfig({
         'plugin/math': resolve(__dirname, 'index.js'),
       },
       name: 'RevealMath',
-      fileName: appendExtension
-    }
+      fileName: appendExtension,
+    },
   },
   plugins: [],
-})
+});

+ 0 - 1
public/plugin/highlight/zenburn.css

@@ -70,7 +70,6 @@ based on dark.css by Ivan Sagalaev
   color: #7f9f7f;
 }
 
-
 .hljs-emphasis {
   font-style: italic;
 }

+ 54 - 54
test.js

@@ -13,70 +13,70 @@ const combinedResults = { passed: 0, failed: 0, total: 0, runtime: 0 };
 
 // Create and start Vite server
 const startServer = async () => {
-  const server = await createServer({
-    root: __dirname,
-    server: {
-      port: 8009,
-    },
-  });
-  await server.listen();
-  return server;
+	const server = await createServer({
+		root: __dirname,
+		server: {
+			port: 8009,
+		},
+	});
+	await server.listen();
+	return server;
 };
 
 // Run tests
 const runTests = async (server) => {
-  await Promise.all(
-    testFiles.map(async (file) => {
-      const qunitArgs = {
-        targetUrl: `http://localhost:8009/${file}`,
-        timeout: 30000,
-        redirectConsole: false,
-        puppeteerArgs: ['--allow-file-access-from-files'],
-      };
+	await Promise.all(
+		testFiles.map(async (file) => {
+			const qunitArgs = {
+				targetUrl: `http://localhost:8009/${file}`,
+				timeout: 30000,
+				redirectConsole: false,
+				puppeteerArgs: ['--allow-file-access-from-files'],
+			};
 
-      try {
-        const result = await runQunitPuppeteer(qunitArgs);
-        combinedResults.passed += result.stats.passed;
-        combinedResults.failed += result.stats.failed;
-        combinedResults.total += result.stats.total;
-        combinedResults.runtime += result.stats.runtime;
+			try {
+				const result = await runQunitPuppeteer(qunitArgs);
+				combinedResults.passed += result.stats.passed;
+				combinedResults.failed += result.stats.failed;
+				combinedResults.total += result.stats.total;
+				combinedResults.runtime += result.stats.runtime;
 
-        if (result.stats.failed > 0) {
-          console.log(
-            `${'!'} ${file} [${result.stats.passed}/${result.stats.total}] in ${
-              result.stats.runtime
-            }ms`.red
-          );
-          printFailedTests(result, console);
-        } else {
-          console.log(
-            `${'✔'} ${file} [${result.stats.passed}/${result.stats.total}] in ${
-              result.stats.runtime
-            }ms`.green
-          );
-        }
-      } catch (error) {
-        console.error(`Error running tests for ${file}:`, error);
-      }
-    })
-  );
+				if (result.stats.failed > 0) {
+					console.log(
+						`${'!'} ${file} [${result.stats.passed}/${result.stats.total}] in ${
+							result.stats.runtime
+						}ms`.red
+					);
+					printFailedTests(result, console);
+				} else {
+					console.log(
+						`${'✔'} ${file} [${result.stats.passed}/${result.stats.total}] in ${
+							result.stats.runtime
+						}ms`.green
+					);
+				}
+			} catch (error) {
+				console.error(`Error running tests for ${file}:`, error);
+			}
+		})
+	);
 
-  console.log(
-    `\n${combinedResults.passed}/${combinedResults.total} tests passed, ${combinedResults.failed} failed, ${combinedResults.runtime}ms runtime`
-  );
+	console.log(
+		`\n${combinedResults.passed}/${combinedResults.total} tests passed, ${combinedResults.failed} failed, ${combinedResults.runtime}ms runtime`
+	);
 
-  // Exit with status code 1 if any tests failed, otherwise exit with 0
-  process.exit(combinedResults.failed > 0 ? 1 : 0);
+	// Exit with status code 1 if any tests failed, otherwise exit with 0
+	process.exit(combinedResults.failed > 0 ? 1 : 0);
 };
 
 // Main execution
 (async () => {
-  try {
-    const server = await startServer();
-    await runTests(server);
-    await server.close();
-  } catch (error) {
-    console.error('An error occurred:', error);
-    process.exit(1);
-  }
+	try {
+		const server = await startServer();
+		await runTests(server);
+		await server.close();
+	} catch (error) {
+		console.error('An error occurred:', error);
+		process.exit(1);
+	}
 })();

+ 21 - 21
tsconfig.json

@@ -1,25 +1,25 @@
 {
-  "compilerOptions": {
-    "target": "ES2020",
-    "useDefineForClassFields": true,
-    "lib": ["ES2020", "DOM", "DOM.Iterable"],
-    "module": "ESNext",
-    "skipLibCheck": true,
+	"compilerOptions": {
+		"target": "ES2020",
+		"useDefineForClassFields": true,
+		"lib": ["ES2020", "DOM", "DOM.Iterable"],
+		"module": "ESNext",
+		"skipLibCheck": true,
 
-    /* Bundler mode */
-    "moduleResolution": "bundler",
-    "allowImportingTsExtensions": true,
-    "resolveJsonModule": true,
-    "isolatedModules": true,
-    "noEmit": true,
-    "jsx": "react-jsx",
+		/* Bundler mode */
+		"moduleResolution": "bundler",
+		"allowImportingTsExtensions": true,
+		"resolveJsonModule": true,
+		"isolatedModules": true,
+		"noEmit": true,
+		"jsx": "react-jsx",
 
-    /* Linting */
-    "strict": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "noFallthroughCasesInSwitch": true
-  },
-  "include": ["js"],
-  "references": [{ "path": "./tsconfig.node.json" }]
+		/* Linting */
+		"strict": true,
+		"noUnusedLocals": true,
+		"noUnusedParameters": true,
+		"noFallthroughCasesInSwitch": true
+	},
+	"include": ["js"],
+	"references": [{ "path": "./tsconfig.node.json" }]
 }

+ 9 - 9
tsconfig.node.json

@@ -1,11 +1,11 @@
 {
-  "compilerOptions": {
-    "composite": true,
-    "skipLibCheck": true,
-    "module": "ESNext",
-    "moduleResolution": "bundler",
-    "allowSyntheticDefaultImports": true,
-    "strict": true
-  },
-  "include": ["vite.config.ts"]
+	"compilerOptions": {
+		"composite": true,
+		"skipLibCheck": true,
+		"module": "ESNext",
+		"moduleResolution": "bundler",
+		"allowSyntheticDefaultImports": true,
+		"strict": true
+	},
+	"include": ["vite.config.ts"]
 }

+ 25 - 25
vite.config.styles.ts

@@ -4,34 +4,34 @@ import fs from 'fs';
 
 // List all theme files in the css/theme directory
 const themeFiles = fs
-  .readdirSync(resolve(__dirname, 'css/theme'))
-  .filter((file) => file.endsWith('.scss'));
+	.readdirSync(resolve(__dirname, 'css/theme'))
+	.filter((file) => file.endsWith('.scss'));
 const themeEntries = themeFiles.reduce((acc, file) => {
-  acc[`theme/${file.replace('.scss', '')}`] = resolve(__dirname, `css/theme/${file}`);
-  return acc;
+	acc[`theme/${file.replace('.scss', '')}`] = resolve(__dirname, `css/theme/${file}`);
+	return acc;
 }, {});
 
 export default defineConfig({
-  root: './',
-  css: {
-    preprocessorOptions: {
-      scss: {
-        api: 'modern-compiler'
-      }
-    }
-  },
-  build: {
-    emptyOutDir: false,
-    cssCodeSplit: true,
-    lib: {
-      formats: ['es'],
-      entry: {
-        reveal: resolve(__dirname, 'css/reveal.scss'),
-        reset: resolve(__dirname, 'css/reset.css'),
+	root: './',
+	css: {
+		preprocessorOptions: {
+			scss: {
+				api: 'modern-compiler',
+			},
+		},
+	},
+	build: {
+		emptyOutDir: false,
+		cssCodeSplit: true,
+		lib: {
+			formats: ['es'],
+			entry: {
+				reveal: resolve(__dirname, 'css/reveal.scss'),
+				reset: resolve(__dirname, 'css/reset.css'),
 
-        ...themeEntries,
-      },
-    },
-  },
-  plugins: [],
+				...themeEntries,
+			},
+		},
+	},
+	plugins: [],
 });

+ 36 - 36
vite.config.ts

@@ -4,43 +4,43 @@ import { defineConfig } from 'vite';
 import dts from 'vite-plugin-dts';
 
 export const appendExtension = (format: ModuleFormat, name: String): string => {
-  if (format === 'es') {
-    return `${name}.mjs`;
-  } else {
-    return `${name}.js`;
-  }
+	if (format === 'es') {
+		return `${name}.mjs`;
+	} else {
+		return `${name}.js`;
+	}
 };
 
 export default defineConfig({
-  build: {
-    emptyOutDir: true,
-    lib: {
-      formats: ['es', 'umd'],
-      entry: resolve(__dirname, 'js/index.ts'),
-      name: 'Reveal',
-      fileName: (format, entryName) => {
-        return appendExtension(format, 'reveal');
-      },
-    },
-    rollupOptions: {
-      output: {
-        assetFileNames: 'reveal.[ext]',
-      },
-    },
-  },
-  resolve: {
-    alias: {
-      // Matches the exported paths in package.json
-      'reveal.js/plugin': './plugin',
-      'reveal.js': '/js',
-    },
-  },
-  plugins: [dts({ insertTypesEntry: true, rollupTypes: true })],
-  css: {
-    preprocessorOptions: {
-      scss: {
-        api: 'modern-compiler'
-      }
-    }
-  },
+	build: {
+		emptyOutDir: true,
+		lib: {
+			formats: ['es', 'umd'],
+			entry: resolve(__dirname, 'js/index.ts'),
+			name: 'Reveal',
+			fileName: (format, entryName) => {
+				return appendExtension(format, 'reveal');
+			},
+		},
+		rollupOptions: {
+			output: {
+				assetFileNames: 'reveal.[ext]',
+			},
+		},
+	},
+	resolve: {
+		alias: {
+			// Matches the exported paths in package.json
+			'reveal.js/plugin': './plugin',
+			'reveal.js': '/js',
+		},
+	},
+	plugins: [dts({ insertTypesEntry: true, rollupTypes: true })],
+	css: {
+		preprocessorOptions: {
+			scss: {
+				api: 'modern-compiler',
+			},
+		},
+	},
 });

Some files were not shown because too many files changed in this diff