1
0
mirror of https://github.com/hakimel/reveal.js.git synced 2025-09-11 15:10:53 +02:00

Compare commits

...

944 Commits
3.3.0 ... 4.1.0

Author SHA1 Message Date
Hakim El Hattab
0582f57517 add fit-text to demo 2020-10-12 11:51:04 +02:00
Hakim El Hattab
ffadcc8502 v4.1.0 2020-10-12 11:38:26 +02:00
Hakim El Hattab
e09437f4fa escape HTML entities in code parsed from markdown, fixes #2744 2020-09-09 11:42:34 +02:00
Hakim El Hattab
676936e33d revert debug change to index.html 2020-09-09 10:32:20 +02:00
Hakim El Hattab
4d62dcc674 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-09-09 10:26:42 +02:00
Hakim El Hattab
17bfa62579 Merge pull request #2746 from ebriand/patch-1
Fix URL to pdf-export documentation
2020-09-09 10:24:40 +02:00
Hakim El Hattab
5f7c945dee Merge pull request #2752 from michaelmior/css-paths
Start relative paths in CSS with ./
2020-09-09 10:24:04 +02:00
Hakim El Hattab
b13c7b41a0 Merge pull request #2767 from rschmehl/patch-1
Update README.md
2020-09-09 10:21:48 +02:00
Hakim El Hattab
5676ef79d7 Merge pull request #2771 from timgates42/bugfix_typo_transition
docs: Fix simple typo, transiition -> transition
2020-09-09 10:20:40 +02:00
Tim Gates
2c121d22ac docs: Fix simple typo, transiition -> transition
There is a small typo in js/controllers/autoanimate.js.

Should read `transition` rather than `transiition`.
2020-09-08 08:02:34 +10:00
Roland Schmehl
aa62bd424b Update README.md
Fixed broken URL
2020-09-06 12:08:25 +02:00
Hakim El Hattab
faa8b56e2a dependency upgrades 2020-08-19 10:33:36 +02:00
Hakim El Hattab
80d96b4f82 upgrade rollup-plugin-terser to fix npm warning #2751 2020-08-19 10:17:50 +02:00
Michael Mior
a150d0c5dd Start relative paths in CSS with ./ 2020-08-18 12:49:49 -04:00
Hakim El Hattab
3a99a7b70a shuffle now applies to vertical slides as well 2020-08-17 14:42:27 +02:00
Eric Briand
b05e530f21 Fix URL to pdf-export documentation 2020-08-04 10:06:20 +02:00
Hakim El Hattab
2bfe705e6a include /css and /js in npm package #2712 2020-06-30 21:10:09 +02:00
Hakim El Hattab
9ff27cfbc9 bg videos remain muted on mobile, otherwise broken when navigating with swipe gestures 2020-06-16 11:20:15 +02:00
Hakim El Hattab
2fccb77405 add 'playsinline' to all inline videos, dont mute background videos on mobile 2020-06-16 10:27:09 +02:00
Hakim El Hattab
cd2a792416 allow images inside of h/vstacks to be proportionally downsized 2020-06-09 13:31:21 +02:00
Hakim El Hattab
be460814ac correct scope for fit-text selector 2020-06-09 10:32:56 +02:00
Hakim El Hattab
aa6677911c fit-text helper now triggers lazyily when slide enters view distance 2020-06-09 10:28:01 +02:00
Hakim El Hattab
f231c53b9c Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-06-09 09:18:40 +02:00
Hakim El Hattab
15815efe05 npm run build now uses default gulp task 2020-06-09 09:18:27 +02:00
Hakim El Hattab
1b6a3b1e6f add support for auto-sized big text via r-fit-text 2020-06-05 13:17:43 +02:00
Hakim El Hattab
66cbd66fb6 fix slide numbering issue with uncounted horizontal slides (fixes #2675) 2020-06-05 11:47:46 +02:00
Hakim El Hattab
37d8337411 add support for wrapping code in script tempalte to avoid html parser #2684 2020-06-05 10:47:31 +02:00
Hakim El Hattab
6772518c5a Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-06-05 10:21:33 +02:00
Hakim El Hattab
f014952673 update math example to use 4.0 plugin syntax 2020-06-05 10:14:47 +02:00
Hakim El Hattab
166af89353 all themes now have contrasting text colors based on slide bg 2020-06-05 10:03:07 +02:00
Hakim El Hattab
ac79c7cd8b leave the progress bar empty if there's < 2 slides 2020-06-05 09:37:44 +02:00
Hakim El Hattab
d272628f58 add support for data-visibility=hidden 2020-06-02 13:47:34 +02:00
Hakim El Hattab
c91074761a don't write '#/' to url on first slide, remove history api feature detection 2020-06-02 09:08:00 +02:00
Hakim El Hattab
7ebade7248 remove 20px vertical padding on slide sections 2020-06-02 08:46:24 +02:00
Hakim El Hattab
61624aeafb 🤦 2020-06-01 16:07:49 +02:00
Hakim El Hattab
cd5c9c5b9d build js 2020-06-01 16:02:55 +02:00
Hakim El Hattab
942304d862 add --slide-width/height css variables 2020-06-01 16:00:54 +02:00
Hakim El Hattab
bd19860b4d 4.0.2 2020-05-29 12:10:28 +02:00
Hakim El Hattab
5169fb2d00 link logo in demo deck to revealjs.com 2020-05-29 12:07:04 +02:00
Hakim El Hattab
1569a4afba remove overzealous pdf resets 2020-05-29 10:14:31 +02:00
Hakim El Hattab
9f90f32e26 recompile css 2020-05-28 22:28:54 +02:00
Hakim El Hattab
bee213c470 tweaks for pdf print sheet 2020-05-28 22:28:36 +02:00
Hakim El Hattab
0bc614cf3d npmignore gulpfile and contributing.md 2020-05-28 22:28:14 +02:00
Hakim El Hattab
2255c60254 fix progress bar direction in rtl mode 2020-05-27 19:46:49 +02:00
Hakim El Hattab
e4e2bc9562 link logo image to revealjs.com 2020-05-27 15:57:37 +02:00
Hakim El Hattab
e1abd3d5c7 Merge pull request #2679 from conao3/add-link
Add link for README badge
2020-05-27 15:55:52 +02:00
Hakim El Hattab
a65e96fbc6 serve demo assets from cdn, logo on first slide in demo.html 2020-05-27 15:51:05 +02:00
conao3
1728c9793c add link for badge 2020-05-27 22:37:08 +09:00
Hakim El Hattab
eb026f79b4 Reveal.configure() now works pre-initialization 2020-05-27 15:34:12 +02:00
Hakim El Hattab
5e4c5c33a9 export the highlight.js instance 2020-05-27 15:25:26 +02:00
Hakim El Hattab
0c9c9d55f3 add Reveal.isReady to pre-initialized API 2020-05-27 13:15:26 +02:00
Hakim El Hattab
fc62af9d5b rollup cache for all js bunling, improves subsequent build time by 50% 2020-05-27 09:06:31 +02:00
Hakim El Hattab
b1e5db0ec9 data-autoslide attribute takes precedence over video duration 2020-05-26 10:56:02 +02:00
Hakim El Hattab
b7487b8b4f polyfill element.closest for ie11 2020-05-26 10:45:05 +02:00
Hakim El Hattab
e6244a57b5 fix polyfills, add ie11 support 2020-05-26 09:47:01 +02:00
Hakim El Hattab
b074050a6d 4.0.1, remove date from built files 2020-05-25 16:21:41 +02:00
Hakim El Hattab
8680fb3804 Merge pull request #2671 from s-l-lee/fix-notes-printing
Fix slide notes printing
2020-05-21 19:52:48 +02:00
Lee Sheng Long
fc4294365b update dist/reveal bundles 2020-05-22 00:03:14 +10:00
Lee Sheng Long
4e839b3d78 fix slide notes printing 2020-05-21 23:56:23 +10:00
Hakim El Hattab
9f477f7d59 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-05-20 22:08:38 +02:00
Hakim El Hattab
55c7b44006 add slides to readme 2020-05-20 22:08:26 +02:00
Hakim El Hattab
35db006c02 fix overlapping ids when auto-animating multiple presentations in same window 2020-05-20 19:14:45 +02:00
Hakim El Hattab
cd5161ffe9 initial work for hstack and vstack 2020-05-20 14:33:52 +02:00
Hakim El Hattab
f0b67ad6ea 4.0.0 2020-05-20 12:09:03 +02:00
Hakim El Hattab
38eda3aada fix livereload 2020-05-20 12:08:57 +02:00
Hakim El Hattab
df61f9e1fa progress bar width set via scale instead of width for perf 2020-05-20 10:42:55 +02:00
Hakim El Hattab
5e49cbdcf7 link fix 2020-05-19 20:36:05 +02:00
Hakim El Hattab
8b3f57b3d1 Merge pull request #2666 from RealCyGuy/patch-1
fixed links
2020-05-19 20:35:07 +02:00
Cyrus
07db41831f fixed links 2020-05-19 11:31:25 -07:00
Hakim El Hattab
a1f03cb337 Reveal.VERSION is now available prior to initialization #2651 2020-05-19 20:27:45 +02:00
Hakim El Hattab
feb43ffdc9 rollup cache saves 1s per js build 2020-05-19 19:04:46 +02:00
Hakim El Hattab
84b52984cd update dependencies 2020-05-19 18:44:40 +02:00
Hakim El Hattab
4f2293378b reveal.netlify.app -> revealjs.com 2020-05-19 18:27:00 +02:00
Hakim El Hattab
83151f5e67 Merge pull request #2651 from hakimel/dev
reveal.js 4.0.0
2020-05-19 11:11:26 +02:00
Hakim El Hattab
5e5013645d move fonts from lib/fonts to dist/theme/fonts 2020-05-19 11:03:16 +02:00
Hakim El Hattab
0a58c681fe move highlight themes from lib/css/ to plugin/highlight/ 2020-05-19 11:02:59 +02:00
Hakim El Hattab
9d11927066 auto-animate example in demo 2020-05-19 10:22:24 +02:00
Hakim El Hattab
815557c1d8 update all links to docs (will sub out '.netlify.app' once we ship 4.0) 2020-05-18 20:52:51 +02:00
Hakim El Hattab
f618de81de restore support for markdown speaker notes 2020-05-18 20:36:34 +02:00
Hakim El Hattab
13f7e69c9c distribute /plugin 2020-05-18 16:17:51 +02:00
Hakim El Hattab
3d2371f58c bundle html inside of notes.js, no more need for relatively locating external html 2020-05-18 15:59:18 +02:00
Hakim El Hattab
8fc2ec9238 removed phantomjs-based print-pdf plugin 2020-05-18 15:15:46 +02:00
Hakim El Hattab
fb22716ddf move built plugin files from /dist/plugin/ to /plugin/<name>/ 2020-05-18 14:41:56 +02:00
Hakim El Hattab
4e8959508b readme tweaks 2020-05-18 11:54:08 +02:00
Hakim El Hattab
c0c6b0aa6e new copy for readme, clearer get started cta 2020-05-18 11:49:07 +02:00
Hakim El Hattab
1fb1e9b0ab bigger logo 2020-05-14 14:50:31 +02:00
Hakim El Hattab
faa4e38e12 new logo update readme 🥳 2020-05-14 14:50:07 +02:00
Hakim El Hattab
30cd9a8d3b remove default border around images, now available via img.r-frame 2020-05-14 12:39:45 +02:00
Hakim El Hattab
f04a00672c fix and tests for custom key bindings in help overlay 2020-05-12 13:33:19 +02:00
Hakim El Hattab
aafb8769f9 example content error 2020-05-11 11:57:09 +02:00
Hakim El Hattab
aa2a4a0a36 scope selection color to .reveal 2020-05-11 11:28:36 +02:00
Hakim El Hattab
2104dee1c1 fix exception in layout examle 2020-05-11 11:26:17 +02:00
Hakim El Hattab
f84bc7882e simplify stack css 2020-05-11 11:02:54 +02:00
Hakim El Hattab
eeedaa17e1 new 'r-stack' helper class for stacking & centering multiple elements 2020-05-11 10:54:02 +02:00
Hakim El Hattab
1288a3280c fix broken asset urls in examples 2020-05-11 09:56:54 +02:00
Hakim El Hattab
664beff715 add focus controller, manages keyboard focus across multiple embedded decks 2020-05-11 09:15:02 +02:00
Hakim El Hattab
57107ebe4c add #highligh-theme to theme css link 2020-05-08 21:04:19 +02:00
Hakim El Hattab
5c87d9ffe0 Merge branch 'dev' of github.com:hakimel/reveal.js into dev 2020-05-08 20:56:01 +02:00
Hakim El Hattab
ba0b367ed9 remove nuking of hash changes when hash is disabled 2020-05-08 20:53:10 +02:00
Hakim El Hattab
772fa0308d make it possible to disable hash change listener with respondToHashChanges: false 2020-05-08 20:49:06 +02:00
Hakim El Hattab
3a032a836a fix auto-animate bug on centered slides 2020-05-08 20:33:28 +02:00
Hakim El Hattab
ab273a19f2 move dependencies to dev 2020-05-08 20:21:51 +02:00
Hakim El Hattab
a0a1ae193f dont prevent page scrolling when swiping on embedded decks 2020-05-08 20:12:52 +02:00
Hakim El Hattab
bc88109d91 correct documentation url 2020-05-07 11:41:25 +02:00
Hakim El Hattab
2e3b5c88fc move docs to revealjs.com 2020-05-07 11:40:05 +02:00
Hakim El Hattab
cca2a3cdf3 fix print pdf scope exception 2020-05-06 22:04:01 +02:00
Hakim El Hattab
b7f480c908 fix fullscreen for embedded decks 2020-05-05 20:54:40 +02:00
Hakim El Hattab
c4870362d9 slide data-state is now set at the viewport level, add Reveal.getViewportElement() 2020-05-04 14:33:21 +02:00
Hakim El Hattab
9242b25bc9 esm bundle only targets browsers with module support 2020-05-04 11:13:11 +02:00
Hakim El Hattab
2ca01bb4a5 remove source files from npm package 2020-05-04 10:49:14 +02:00
Hakim El Hattab
a7800d07a3 ignore sourcemaps 2020-05-04 10:41:27 +02:00
Hakim El Hattab
cdf09ff7c2 remove sourcemaps 2020-05-04 10:40:55 +02:00
Hakim El Hattab
60cd098c8d .esm suffix for module bundle, marked/highlight.js are installed via npm 2020-05-04 10:39:37 +02:00
Hakim El Hattab
a4cb3307bb fix bug where interactive iframe backgrounds were blocked by future vertical stacks 2020-05-04 09:48:12 +02:00
Hakim El Hattab
619b3a087c plugin consistency 2020-04-29 11:56:43 +02:00
Hakim El Hattab
163db29d43 update minimum node version 2020-04-29 11:56:36 +02:00
Hakim El Hattab
f2fbc59bcc fix auto-animate error and spec 2020-04-29 11:39:45 +02:00
Hakim El Hattab
b84888214b fix auto-animate bug on devices with < 2 devicePixelRatio 2020-04-29 10:00:25 +02:00
Hakim El Hattab
48ebc3b7e0 remove unused dependency, disable inconsistent 'slidetransitionend' test 2020-04-27 11:44:33 +02:00
Hakim El Hattab
0a1bcdf999 move markdown example from /plugins to /examples 2020-04-27 10:45:57 +02:00
Hakim El Hattab
951f5d04c2 add markdown support for code line numbers and line highlights #2371 2020-04-27 10:43:56 +02:00
Hakim El Hattab
a040ba3b41 remove unused code from md plugin 2020-04-27 10:43:29 +02:00
Hakim El Hattab
c7c09644f0 esm readme tweak 2020-04-26 08:34:02 +02:00
Hakim El Hattab
b61a6a6f10 rearrange plugins/dependencies 2020-04-26 08:29:15 +02:00
Hakim El Hattab
58bc732212 merge master 2020-04-23 11:01:40 +02:00
Hakim El Hattab
b92d16f48d make plugins work with multiple presentations on same page 2020-04-23 10:54:48 +02:00
Hakim El Hattab
210fbb7646 plugins can be direct references or factory functions 2020-04-23 09:39:26 +02:00
Hakim El Hattab
c1b2e415db get rid of event listener warning when running tests 2020-04-22 16:07:51 +02:00
Hakim El Hattab
ad113ba69d move notes-server plugin out of reveal.js core 2020-04-22 15:53:31 +02:00
Hakim El Hattab
93cdf8cfcc move multiplex plugin out to reveal/reveal-multiplex repo 2020-04-22 13:22:01 +02:00
Hakim El Hattab
f138f507a0 fix contenteditable check #2650 2020-04-22 11:59:23 +02:00
Hakim El Hattab
d8675a9759 use latest quinit from npm, remove bundled version 2020-04-22 11:37:04 +02:00
Hakim El Hattab
9823be99f4 fragments are now included in URL by default, even on named slides 2020-04-22 11:11:14 +02:00
Hakim El Hattab
d727509dbc viewport tweaks, allow options to be passed when initializing 2020-04-22 08:59:21 +02:00
Hakim El Hattab
faaa791019 backwards compatibility, reveal.js 4.0 can now register ~3.9 plugins 2020-04-21 13:34:40 +02:00
Hakim El Hattab
de50b4153c minor adjustments for example decks 2020-04-21 11:26:02 +02:00
Hakim El Hattab
8c52b32a18 add transitionend event and docs 2020-04-21 10:54:00 +02:00
Hakim El Hattab
91953207a5 simplify plugin controller 2020-04-21 09:50:19 +02:00
Hakim El Hattab
d22c7bfad1 tidying up 2020-04-21 09:36:43 +02:00
Hakim El Hattab
6ff28af1b3 separate public/internal reveal.js apis 2020-04-20 09:16:08 +02:00
Hakim El Hattab
f3f91922db update plugin api in tests 2020-04-17 14:21:20 +02:00
Hakim El Hattab
e58502b3fb tweak plugin initialization to enable multi-instance plugins 2020-04-17 14:10:56 +02:00
Hakim El Hattab
7e72b10fa5 unit tests for plugins in multi-instance reveal.js 2020-04-17 11:03:35 +02:00
Hakim El Hattab
4f6bdf1420 two js bundles; reveal.js (es6) and reveal.es5.js, add source maps 2020-04-17 10:59:55 +02:00
Hakim El Hattab
d9690462e0 add 'plugins' config option, new way of registering es5 plugins 2020-04-17 09:47:03 +02:00
Hakim El Hattab
08f29f08a2 initialize plugins serially 2020-04-16 16:40:46 +02:00
Hakim El Hattab
561c3ff443 update presentation examples move to root @ /examples 2020-04-16 16:04:26 +02:00
Hakim El Hattab
7b151c2320 support including plugins via <script> instead of dependencies 2020-04-16 15:45:25 +02:00
Hakim El Hattab
34458a988a fix code highlighting in markdown decks 2020-04-16 15:27:44 +02:00
Hakim El Hattab
d54353c4e1 switch to rollup for easier build config 2020-04-16 14:51:34 +02:00
Hakim El Hattab
0c8ac8f1ee dont close dev server when tests finish 2020-04-15 11:14:45 +02:00
Hakim El Hattab
0bdc44826d unify all markdown tests into one file 2020-04-15 11:07:20 +02:00
Hakim El Hattab
d03fc04f61 allow reveal.js instances to be created with only options 2020-04-15 10:30:49 +02:00
Hakim El Hattab
a55cd813be convert plugins to ES modules, transpile es5 versions backwards compatibility 2020-04-15 10:23:51 +02:00
Hakim El Hattab
9522357349 changes to plugin api; registerPlugin only accepts plugin instance, instance exposes .id 2020-04-08 13:05:28 +02:00
Hakim El Hattab
2e8619d300 remove unused variable, update multi-instance example in readme 2020-04-08 11:46:46 +02:00
Hakim El Hattab
6030043036 move pointer logic out to own controller 2020-04-07 13:25:46 +02:00
Hakim El Hattab
094acd6a6a tweak initialization docs 2020-04-07 11:40:42 +02:00
Hakim El Hattab
9c21f9b0f0 fix vulnerabilities 2020-04-07 11:35:44 +02:00
Hakim El Hattab
3a2299a622 documentation for multi-instance initialization 2020-04-07 11:35:25 +02:00
Hakim El Hattab
6d65d8a73a syntax error 2020-04-07 10:05:16 +02:00
Hakim El Hattab
d0a1ef24cb avoid running tests twice in ci 2020-04-07 10:00:28 +02:00
Hakim El Hattab
ad55f84b78 increase test timeout 2020-04-07 09:57:28 +02:00
Hakim El Hattab
120673c8fa only test latest node in gh action 2020-04-07 09:52:43 +02:00
Hakim El Hattab
c3319c1407 fix failing test 2020-04-07 09:47:44 +02:00
Hakim El Hattab
1081bbfc03 improvements to legacy API 2020-04-07 09:40:11 +02:00
Hakim El Hattab
855cc82d76 Reveal.add/remveEventListener -> Reveal.on/off 2020-04-07 09:05:56 +02:00
Hakim El Hattab
f24620018f don't style html element if reveal.js is embedded 2020-04-06 14:35:48 +02:00
Hakim El Hattab
3a7f210631 adjust auto-animate test 2020-04-06 14:07:24 +02:00
Hakim El Hattab
ff62b96a5d move body styles to new .reveal-viewport 2020-04-06 13:49:39 +02:00
Hakim El Hattab
f26fc20b55 test and examples for multiple reveal.js instances on one page 2020-04-06 11:22:54 +02:00
Hakim El Hattab
9ebf6249e7 tweaks and comments 2020-04-06 10:39:48 +02:00
Hakim El Hattab
881146500c qunit task rejects on failure 2020-03-31 14:06:38 +02:00
Hakim El Hattab
ca29e3dd29 webpack config + babel-loader 2020-03-31 13:23:51 +02:00
Hakim El Hattab
e4faf54804 move history api feature detection to utils 2020-03-31 13:09:44 +02:00
Hakim El Hattab
dbbd82579e fix unit tests, use qunit-puppeteer for es6 support 2020-03-31 13:06:58 +02:00
Hakim El Hattab
fe75be1cff fix issue where slide transitions were still running for auto-animated slides in Safari 2020-03-30 13:29:52 +02:00
Hakim El Hattab
34ab7ded55 only carry forward fragment visibiltiy if style remains unchanged 2020-03-19 16:27:42 +01:00
Hakim El Hattab
4d1cb43faf auto-animate; carry forward fragment visibility, unmatched elements adhere to duration/delay attributes 2020-03-19 15:18:14 +01:00
Hakim El Hattab
376b8230bb unmatched auto-aniamte elements now adhere to element-level duration/delay attributes 2020-03-17 19:38:26 +01:00
Hakim El Hattab
cf9eb6e103 remove parallax config 2020-03-16 15:34:14 +01:00
Hakim El Hattab
2540712714 switch old toArray helper to Array.from 2020-03-16 15:18:47 +01:00
Hakim El Hattab
6ff4e9306c move progress bar to new module 2020-03-16 14:30:36 +01:00
Hakim El Hattab
c50ec00419 new controls module for navigation arrows 2020-03-16 13:53:23 +01:00
Hakim El Hattab
2a06e0d1e5 create background element from bg controller 2020-03-16 13:10:50 +01:00
Hakim El Hattab
97ee72549b new controller for speaker notes 2020-03-16 11:45:47 +01:00
Hakim El Hattab
2b02f3a1f9 reduce comments related to controller initialization 2020-03-15 20:22:04 +01:00
Hakim El Hattab
f7c29b788e move slide backgrounds to new module 2020-03-14 09:25:48 +01:00
Hakim El Hattab
b42bb586a8 new controller for pdf printing 2020-03-14 08:27:29 +01:00
Hakim El Hattab
d918d750e0 print styles are now built into reveal.css, revamped print styles #2633 2020-03-13 19:53:54 +01:00
Hakim El Hattab
8709a41979 only announce current fragment to screen readers 2020-03-13 08:58:59 +01:00
Hakim El Hattab
92e3a3680c Merge branch 'dev_repackagePrintStyleSheets' of https://github.com/quilicicf/reveal.js into dev 2020-03-12 19:20:15 +01:00
Hakim El Hattab
4f280f77b0 update logic for disabling fragments via config option 2020-03-12 19:11:19 +01:00
Hakim El Hattab
bff9bfb101 add support for automatically scrolling code highlights into view 2020-03-12 17:08:20 +01:00
quilicicf
ffac5fe696 Remove accessible slide status when printing to PDF 2020-03-12 16:14:14 +01:00
quilicicf
6564950c28 Hide the status element off-screen to avoid additional page in PDF print 2020-03-12 13:04:15 +01:00
quilicicf
499dc68536 Package paper and pdf style sheets and apply them conditionally 2020-03-11 13:10:06 +01:00
Hakim El Hattab
5a5a5c9a6c break touch interaction into own module 2020-03-11 08:13:53 +01:00
Hakim El Hattab
e32f38740c move read/write url to location controller 2020-03-10 21:30:39 +01:00
Hakim El Hattab
3683ad255d add slidenumber & location controllers 2020-03-10 21:08:11 +01:00
Hakim El Hattab
ac15678dea refactoring 2020-03-10 20:40:35 +01:00
Hakim El Hattab
3d6212378a new keyboard module 2020-03-10 20:28:56 +01:00
Hakim El Hattab
ddbe06eb7e adjustments to reveal.js initialization flow 2020-03-10 18:37:40 +01:00
Hakim El Hattab
9336fc11ca correction for reveal api 2020-03-10 15:26:40 +01:00
Hakim El Hattab
492fc2bfa0 Merge pull request #2609 from stefnotch/patch-1
Don't include test directory in npm package
2020-03-10 10:42:27 +01:00
Hakim El Hattab
5d179ed4c2 Merge pull request #2631 from christian-classics-ethereal-library/squarePresentationLinear
Navigation Arrows: Fix visibility bug in linear navigation mode
2020-03-10 10:40:18 +01:00
Tim Elliott
00b0ace386 🐛 enabling pointer events on pdf prin slides 2020-03-10 10:30:43 +01:00
Hakim El Hattab
7d4899956b Merge pull request #2628 from telliott22/fix-print-pdf-links
Fixing un-clickable links in print pdf mode
2020-03-10 10:24:06 +01:00
Hakim El Hattab
fa9d8f5e88 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-03-10 10:22:47 +01:00
Hakim El Hattab
9a2160536d tweaks and updated docs for #2627 2020-03-10 10:18:37 +01:00
Hakim El Hattab
98a6d1de6b Merge pull request #2627 from quilicicf/dev_importBundledPlugins
Add bundler-friendly dependency injection
2020-03-10 10:04:26 +01:00
Hakim El Hattab
4ff79dbc9d Merge branch 'dev' into dev_importBundledPlugins 2020-03-10 10:01:14 +01:00
Hakim El Hattab
cce59072dc fix controller api methods 2020-03-09 21:04:31 +01:00
Hakim El Hattab
cd78bbd48d move overview to new module 2020-03-09 20:57:25 +01:00
Hakim El Hattab
75ef44ca69 statusDiv -> statusElement 2020-03-09 18:57:49 +01:00
Hakim El Hattab
8a43753000 move fragments to separate controller 2020-03-09 18:51:07 +01:00
Zach DeCook
0e5a4478d1 * Control Arrows: Fix visibility bug in linear navigation mode 2020-03-09 13:02:03 -04:00
Hakim El Hattab
bdedc56d6f comments 2020-03-09 16:01:50 +01:00
Tim Elliott
bc04b1b2db 🐛 enabling pointer events on pdf prin slides 2020-03-09 13:55:55 +00:00
Hakim El Hattab
d42d88dae4 break autoanimate and loading of slide content into separate controllers 2020-03-09 14:44:57 +01:00
quilicicf
d378ab2e63 Add bundler-friendly dependency injection 2020-03-09 13:28:06 +01:00
Hakim El Hattab
ddd13ee9cf remove code slide from example 2020-03-09 09:40:53 +01:00
Hakim El Hattab
3f95a21009 fix markdown example 2020-03-09 09:33:27 +01:00
Hakim El Hattab
49bb498d9d add color, constant and loader modules 2020-03-07 18:48:39 +01:00
Hakim El Hattab
7f94a79c27 add babel-eslint, link all files 2020-03-07 18:29:00 +01:00
Hakim El Hattab
d4a030f953 move plugin logic to Plugins controller 2020-03-07 18:22:19 +01:00
Hakim El Hattab
0814176f3c refactor unit tests, now consistently initializing reveal.js in the same way 2020-03-07 18:19:08 +01:00
Hakim El Hattab
20b8def298 move script loader to utils 2020-03-07 14:18:03 +01:00
Hakim El Hattab
f968927bff scope all query selection to .reveal 2020-03-07 14:12:28 +01:00
Hakim El Hattab
dd852851ef es6 refactoring 2020-03-07 11:58:18 +01:00
Hakim El Hattab
4cfd254086 move out additional util methods, use shorthands for api 2020-03-07 11:50:58 +01:00
Hakim El Hattab
313ad46e30 move default config to separate module 2020-03-07 11:00:06 +01:00
Hakim El Hattab
bf45578ba1 reveal.js can now be instantiated with new Reveal(<htmlelement>,<options>) 2020-03-07 10:44:02 +01:00
Hakim El Hattab
33a1d8d4ad update assets paths for tests 2020-03-06 20:12:20 +01:00
Hakim El Hattab
064647f644 remove unused polyfill 2020-03-06 20:02:05 +01:00
Hakim El Hattab
608a7577bd 🚨 breaking change; move all compiled assets to /dist 2020-03-06 19:58:40 +01:00
Hakim El Hattab
027dc259da add webpack, move playback to own module 2020-03-06 18:59:09 +01:00
Hakim El Hattab
32bbe63ea6 use object shorthand for api 2020-03-06 17:50:15 +01:00
Hakim El Hattab
a6b7cc4eca continued js code modernization 2020-03-06 17:40:11 +01:00
Hakim El Hattab
6ee1b9f2a2 es6 refactoring, overlay design tweaks 2020-03-06 14:55:09 +01:00
Hakim El Hattab
fba914a0ab remove old flattened presentation fallback, more es6 refactoring 2020-03-06 10:54:07 +01:00
Hakim El Hattab
6ab65d4b8a remove legacy feature detection for <IE11 2020-03-06 10:36:39 +01:00
Hakim El Hattab
d545d79cd7 drop config, had no effect in modern browsers 2020-03-06 10:22:53 +01:00
Hakim El Hattab
556d6ec93d start moving to es6 2020-03-05 20:32:35 +01:00
Hakim El Hattab
4b888d87b7 add support for data-visibility='uncounted' #2543 2020-03-05 14:07:59 +01:00
Hakim El Hattab
5c24818b7e setup babel 2020-03-05 13:49:08 +01:00
Hakim El Hattab
5dfaa32418 remove gruntfile 2020-03-05 11:35:42 +01:00
Hakim El Hattab
fc30870701 build updates, gulp serve accepts root/port 2020-03-05 11:35:20 +01:00
Hakim El Hattab
2184a5058a refactor gulp tasks, update all gulp dependencies #2122 2020-03-03 21:01:43 +01:00
Hakim El Hattab
6fa7700fe5 Merge pull request #2515 from Bagira80/boolean-attributes-from-markdown
Markdown: Boolean (data-)attributes will now be added to elements, too.
2020-03-03 16:00:48 +01:00
Hakim El Hattab
542bcab569 Merge pull request #2336 from lunchboxer/patch-1
Update README.md with strike fragment
2020-03-03 15:53:15 +01:00
Hakim El Hattab
ff2a4192c4 readme correction 2020-03-03 15:33:39 +01:00
Hakim El Hattab
fd975d4087 Merge pull request #2269 from ggodreau/issue_2268
Fixes #2268
2020-03-03 15:32:40 +01:00
Hakim El Hattab
8987f92b44 Merge pull request #2521 from quilicicf/dev_cssCustomProperties
Expose theme variables in CSS custom properties
2020-03-03 15:22:08 +01:00
Hakim El Hattab
cc0a2d0f9a auto-animate docs 2020-03-02 21:12:30 +01:00
Hakim El Hattab
ca5032711c auto-animate docs 2020-03-02 16:11:49 +01:00
Hakim El Hattab
beb2ad6a92 auto-animate docs 2020-03-02 16:10:24 +01:00
Hakim El Hattab
f958820b5b start of auto-aniamte docs 2020-03-02 15:44:13 +01:00
Hakim El Hattab
f023678755 add funding.yml 2020-03-02 14:55:54 +01:00
Hakim El Hattab
41e46659fa remove multiple legacy vendor prefixes 2020-03-02 14:52:57 +01:00
Hakim El Hattab
36f7136d34 remove html shiv 2020-03-01 10:24:02 +01:00
Hakim El Hattab
d0188cb438 add code animation example to demo.html 2020-03-01 10:21:30 +01:00
Hakim El Hattab
e2a2c2c022 refactored and improved auto-animate matcher, supports line-by-line code animations 2020-02-28 16:13:34 +01:00
stefnotch
f97ed2f612 Don't include test directory in npm package 2020-02-27 11:44:58 +01:00
Hakim El Hattab
345ec01f19 only transition properties that have changed 2020-02-27 08:45:19 +01:00
Hakim El Hattab
1649bd0d98 auto-animate bug fixes + support for inheriting options from closest animated parent element 2020-02-24 15:45:44 +01:00
Hakim El Hattab
f33ecadf5d Merge branch 'master' of github.com:hakimel/reveal.js into dev 2020-02-24 11:16:07 +01:00
Hakim El Hattab
a4ba7a899b update CI badge 2020-02-24 11:15:46 +01:00
Hakim El Hattab
d54049445c rename gh action 2020-02-24 11:12:56 +01:00
Hakim El Hattab
a2155e4fde Merge pull request #2574 from christian-classics-ethereal-library/getComputedSlideSize
API: Expose getComputedSlideSize so plugin developers can get width and height.
2020-02-24 09:04:02 +01:00
Hakim El Hattab
633e754fee Merge pull request #2581 from flaviomartins/patch-1
fix typo in configuration example
2020-02-24 09:02:43 +01:00
Hakim El Hattab
f633a18fdf auto-animate tweaks and new config options 2020-02-20 20:15:41 +01:00
Hakim El Hattab
4eca625330 remove need for dedicated data-auto-animate-unmatched attribute 2020-02-18 20:23:37 +01:00
Hakim El Hattab
4ff7fd3a71 switch to bounding rect for auto-animate deltas 2020-02-17 13:14:46 +01:00
Hakim El Hattab
ac59dcb525 additional auto-animate tests 2020-02-17 10:19:47 +01:00
Hakim El Hattab
f263f2819d fix animations intermittently not triggering in firefox 2020-02-17 09:50:01 +01:00
Hakim El Hattab
c38bc2c611 fix issue that caused data-auto-animate to be added to the wrong slides 2020-02-16 19:14:46 +01:00
Hakim El Hattab
d2796f56b8 merge gh actions from master 2020-02-13 10:10:41 +01:00
Hakim El Hattab
b6933b45ad remove travis ci, switched to gh actions 2020-02-13 10:09:01 +01:00
Hakim El Hattab
768335f34b setup gh actions 2020-02-13 10:06:11 +01:00
Hakim El Hattab
dee26303f6 remove needless semicolon 2020-02-13 09:59:28 +01:00
Hakim El Hattab
1de733d21b fix auto-animations in firefox 2020-02-13 09:55:33 +01:00
Hakim El Hattab
1757aacaab auto-animate performance improvements, dont animate unchanged properties 2020-02-13 08:41:20 +01:00
Hakim El Hattab
15e6994569 support for fading in unmatched auto-animate elements 2020-02-12 14:05:23 +01:00
Hakim El Hattab
3cf08624dd simplify auto-animate styles 2020-02-11 19:15:45 +01:00
Hakim El Hattab
84b2fb42c6 demo and auto-animate example updates 2020-02-11 18:37:14 +01:00
Hakim El Hattab
ea295796ea refactoring and fixed auto-animate test exception 2020-02-11 15:31:17 +01:00
Hakim El Hattab
6e4c36b3db more auto-animate tests 2020-02-11 10:52:39 +01:00
Hakim El Hattab
1da222aca6 unit tests for auto-animate 2020-02-11 10:40:17 +01:00
Hakim El Hattab
55aab24a5e allow custom auto-animate matchers to override transition settings 2020-02-11 10:39:59 +01:00
Flavio Martins
8f4927ac27 fix typo in configuration example 2020-02-10 22:24:25 +00:00
Hakim El Hattab
1c62b808ad make it possible to override auto-anim properties per-element 2020-02-09 09:28:34 +01:00
Hakim El Hattab
e45626d6bd add helper class for disabling all slide transitions 2020-02-08 20:41:49 +01:00
Hakim El Hattab
ed4cbdfd03 auto-animate refactoring and optimization 2020-02-08 20:29:43 +01:00
Hakim El Hattab
e9cbfefcce minor simplicifcation for #2579 2020-02-06 15:19:09 +01:00
Hakim El Hattab
be08d52b5b Merge branch 'dev' of github.com:hakimel/reveal.js into dev 2020-02-06 15:09:52 +01:00
Hakim El Hattab
8e3a065596 Merge pull request #2579 from Martinomagnifico/dev
Add RTL support to Controls
2020-02-06 15:09:42 +01:00
Hakim El Hattab
c64206180d auto-animate; don't scale between text blocks 2020-02-06 14:53:45 +01:00
Hakim El Hattab
e5ba80478d fix auto-animatie transform origin + refactoring 2020-02-06 14:30:32 +01:00
Hakim El Hattab
4802a2b7f4 auto-animate applies styles via stylesheet to avoid changing the slide dom 2020-02-05 15:55:16 +01:00
Martino
ccb42c7ca9 Add RTL support to Controls
Add RTL support to Controls
2020-02-05 14:16:15 +01:00
Hakim El Hattab
b6b94739e2 auto-matching for animated media and code html elements 2020-02-03 11:35:44 +01:00
Hakim El Hattab
452f62286b auto-match animatable targets by their contents 2020-02-03 11:13:47 +01:00
Hakim El Hattab
3bfd06c06d additional auto-animation tests, default to 1s 2020-02-02 07:43:15 +01:00
Hakim El Hattab
b6c890b1a7 easing option for auto-animate 2020-02-01 19:11:52 +01:00
Zach DeCook
f0c2d558b7 * API: document getComputedSlideSize 2020-01-31 11:24:23 -05:00
Zach DeCook
479909d5fa * API: Expose getComputedSlideSize for plugin developers 2020-01-31 11:22:08 -05:00
Hakim El Hattab
a3cd500154 auto-animate works on vertically centered decks 2020-01-31 11:51:31 +01:00
Hakim El Hattab
94d98ff7d8 3.9.2 security release 2020-01-31 11:11:23 +01:00
Hakim El Hattab
b6cc6b4916 blacklist some method from the postMessage API to prevent XSS 2020-01-31 10:59:41 +01:00
Hakim El Hattab
8d89db32f6 initial work for auto-animate 2020-01-31 10:46:28 +01:00
Hakim El Hattab
d213fac34c add note about supporting reveal.js via Slides 2020-01-30 10:15:39 +01:00
Hakim El Hattab
0dbdd89713 remove bower.json 2020-01-29 20:29:09 +01:00
Hakim El Hattab
4b7e3e313f 4.0.0-dev 2020-01-29 20:22:42 +01:00
Hakim El Hattab
eaf3988311 3.9.1 because a local edit made it into npm 2020-01-29 15:11:49 +01:00
Hakim El Hattab
003a848790 update to highlight.js 9.18.0 #2562 2020-01-29 14:51:28 +01:00
Hakim El Hattab
33ed32c4f0 add step-by-step highlights to readme 2020-01-29 14:01:51 +01:00
Hakim El Hattab
8a54118f43 npm audit fix 😶 2020-01-27 14:50:54 +01:00
Hakim El Hattab
45f468ccc4 3.9.0 2020-01-27 14:47:17 +01:00
Hakim El Hattab
a59b1415f8 Merge branch 'pdf-slide-numbers' of https://github.com/dougalsutherland/reveal.js into dev 2020-01-27 14:10:15 +01:00
Hakim El Hattab
281b518620 Merge pull request #2499 from jocaml/patch-1
Fix which node version is required
2020-01-27 13:51:38 +01:00
Hakim El Hattab
9693816480 Merge branch 'dev' into patch-1 2020-01-27 13:51:24 +01:00
Hakim El Hattab
731f6819ac Merge pull request #2567 from trevorpower/patch-1
fixed link to gruntfile
2020-01-27 13:46:34 +01:00
Hakim El Hattab
d969ec5f25 2020 2020-01-15 11:39:19 +01:00
Hakim El Hattab
ac50753521 add data-fragment=<index> attribute to slide <sections> 2020-01-15 11:37:37 +01:00
Trevor Power
76a8193fc2 fixed link to gruntfile 2020-01-13 11:57:17 +00:00
Hakim El Hattab
76187bc666 Merge pull request #2474 from coliff/patch-1
HTTPS relevant links on README
2020-01-11 20:51:56 +01:00
Hakim El Hattab
dbf575f8db Merge pull request #2483 from Adri-May/bugfix/spelling
Bug fix: spelling errors
2020-01-11 20:51:01 +01:00
Hakim El Hattab
7a169732de upgrade to node-sass 4.13.0, fix security warnings #2473 2020-01-11 20:30:29 +01:00
Hakim El Hattab
6f9b10b269 switch to fixed unit for fragment animations to make them more consistent 2019-12-19 08:16:42 +01:00
Hakim El Hattab
201e8316a2 Merge pull request #2437 from TehDmitry/dev
Allowing autoplay in data-background-iframe for audio and video elements
2019-12-09 21:09:38 +01:00
Hakim El Hattab
bb8b4d8883 Merge pull request #2454 from ismailarilik/patch-1
Add forgotten element to Table of Contents
2019-12-09 21:06:53 +01:00
Hakim El Hattab
94de806f06 add mobileViewDistance to readme #2513 2019-12-09 21:05:41 +01:00
Hakim El Hattab
1515ddcf87 Merge pull request #2513 from TuurDutoit/feature/mobile-view-distance
Add mobileViewDistance config key
2019-12-09 21:00:58 +01:00
lassepe
773b5115a5 Don't count slides with class .uncounted 2019-12-03 17:37:35 -08:00
quilicicf
e40fb3275d Document theme variable exposition in README theming section 2019-11-12 13:54:12 +01:00
quilicicf
f4d188ec99 Expose theme variables in CSS custom properties 2019-11-12 13:54:12 +01:00
Dougal J. Sutherland
c189a21efd honor slide number config in pdf mode 2019-10-29 12:48:21 -05:00
Dougal J. Sutherland
1cf5ffe029 add a slide argument to locationHash(), getSlidePastCount() 2019-10-29 12:48:21 -05:00
Deniz Bahadir
f6d96fe45d Markdown: Boolean (data-)attributes will now be added to elements, too. 2019-10-23 21:18:14 +02:00
Tuur Dutoit
6ab72eae51 Add mobileViewDistance config key 2019-10-18 13:37:16 +02:00
Hakim El Hattab
f9affb550a fix viewport overflow in iPadOS safari 2019-10-11 09:23:44 +02:00
Hrvoje Bandov
6979383e4b Fix which node version is required
In `package.json` engine is set to `>=9.0.0`.
2019-10-08 09:29:59 +02:00
Adri-May
02a42d1c9e Bug fix: spelling errors 2019-09-18 21:57:24 -04:00
Christian Oliff
a458676614 HTTPS relevant links on README 2019-09-03 10:59:33 +09:00
Hakim El Hattab
474731d829 highlight.js 9.11 -> 9.15 2019-08-22 13:21:12 +02:00
İsmail Arılık
52e57d3677 Add forgotten element to Table of Contents 2019-07-12 14:38:53 +03:00
Hakim El Hattab
073d0e3358 Merge pull request #2392 from DanielNoga/patch-1
update minimal nodejs version in readme
2019-07-08 10:07:53 +02:00
Hakim El Hattab
07c20ef9d9 Merge pull request #2442 from pius/patch-1
Tweak to MathJax example
2019-07-08 10:06:04 +02:00
Hakim El Hattab
d5662a203e Merge branch 'dev' into patch-1 2019-07-08 10:05:40 +02:00
Hakim El Hattab
a6f1511d1a Merge pull request #2453 from Incognitas/fix/node_12_support
Update package.json for node 12 support
2019-07-08 10:02:30 +02:00
Hakim El Hattab
cf027f21c6 Merge pull request #2451 from Jason-Cooke/patch-1
docs: fix typo
2019-07-08 10:01:55 +02:00
Aurelien Normand
585aafed95 Adding missing file to use it properly 2019-07-07 15:30:31 +02:00
Aurélien Normand
0935462706 Update package.json for node 12 support
simple node-sass update which fixes this issue
2019-07-07 11:41:30 +02:00
Jason Cooke
1bacb27072 docs: fix typo 2019-07-05 22:00:10 +12:00
Pius Uzamere
abac58cfc5 Tweak to MathJax example
Added a missing comma and used an actual macro so that the MathJax example runs right out of the box upon a copy/paste.
2019-06-22 15:17:01 -04:00
Hakim El Hattab
bd3758a4df readme tweak 2019-06-10 07:41:07 +02:00
Hakim El Hattab
5fb743e65e rephrased #2378 2019-06-10 07:38:57 +02:00
Hakim El Hattab
c92d08acdd Merge pull request #2378 from mbotsch/fix-plugin-documentation
Fix plugin documentation regarding init-Promises
2019-06-10 07:34:21 +02:00
Hakim El Hattab
ff2a927de8 Merge pull request #2433 from autopp/fix-typo-in-readme
add missing comma to MathJax example in README
2019-06-10 07:19:57 +02:00
Hakim El Hattab
bba760e549 remove available route changes #2416 2019-06-10 07:14:04 +02:00
Hakim El Hattab
51e8da5d9a Merge branch '2380-linear-navigation-mobile' of https://github.com/earboxer/reveal.js into dev 2019-06-10 07:04:49 +02:00
Hakim El Hattab
f6f7f28ad9 enable url hash for default index.html #2434 #2175 2019-06-10 06:57:07 +02:00
TehDmitry
bdda443335 Allowing autoplay in data-background-iframe for audio and video elements
It was restricted by «Autoplay Policy Changes»: https://developers.google.com/web/updates/2017/09/autoplay-policy-changes#iframe
2019-06-09 16:31:36 +03:00
autopp
f5759c3d52 add missing comma to MathJax example in README 2019-06-07 09:45:20 +09:00
Zach DeCook
969e7b3ef1 * Mobile Linear Navigation: Fix swipes to navigate linearly 2019-05-29 10:44:43 -04:00
Zach DeCook
c62f4c7cfb * Linear Navigation: Fix showing arrows when last slide has vertical children 2019-05-29 10:22:15 -04:00
Hakim El Hattab
99c3498253 first/last slide shortcut now uses shift modified, cmd conflicted with browser back/fwd 2019-05-27 08:45:00 +02:00
Hakim El Hattab
25e521a16c Merge branch 'alternate-timing' of https://github.com/fghaas/reveal.js into dev 2019-05-27 08:08:00 +02:00
Hakim El Hattab
a1dd1028a1 down arrow padding for edge aligned controls 2019-05-27 08:04:58 +02:00
Hakim El Hattab
9108519dc1 Merge pull request #2410 from NoriSte/feature/fix-touch-arrow-down
Fix arrow down navigation on touch devices
2019-05-27 07:56:15 +02:00
Hakim El Hattab
a2e9e525d5 avoid exception when highlighting empty code blocks 2019-05-27 07:30:08 +02:00
Florian Haas
23c12d7332 Notes: Weakly enforce a minimum allocated pacing time per slide
When using the totalTime-based pacing calculation, a presenter may
inadvertently set totalTime and per-slide data-timing attributes in
such a way that the pacing time for some slides is impossibly low or
even negative.

Add a check to ensure that the pacing on a slide never falls below a
configurable minimum, defaulting to 0. Display an alert if the
pacing for any slide(s) falls below the threshold.
2019-05-22 21:44:44 +02:00
Hakim El Hattab
9ac654d584 fix issue where syncSlide would not run/play newly added background content 2019-05-20 14:58:52 +02:00
Hakim El Hattab
bd1e82d19a new API methods for getting horizontal/vertical slides, force linear navigation for one-dimensional decks 2019-05-20 11:24:05 +02:00
NoriSte
6ac01281d2 fix the touch devices issues with the down arrow 2019-05-18 12:57:35 +02:00
Hakim El Hattab
1766e37a63 iframe background preload behavior now matches inline iframes + adheres to the new 'preloadIframes' config option 2019-05-13 10:55:29 +02:00
Florian Haas
078ba62050 Notes: Introduce alternate pacing timer, based on total presentation time
The current pacing timer operates on the assumption that there is
a default amount of time to be allocated to each slide, and that
individual slides can deviate from that default by specifying their
own data-timing attribute.

This patch introduces an alternate pacing method: by specifying
the totalTime configuration option, the presenter can set the total
time available to present. The pacing timer will then continue to
allocate the exact pacing time for slides that do have data-timing
set, as before. However, rather than applying the defaultTiming
constant to all others, it will

- Add up the time already allocated to slides via data-timing;
- subtract that from totalTime;
- divide the difference by the number of slides without data-timing set;
- apply the thus-calculated average to those slides.

totalTime has no default, and if both defaultTiming and totalTime are
set, totalTime wins. This preserves backward compatibility: if a
presenter has set defaultTiming and updates reveal.js, totalTime will
be null and defaultTiming is still applied to all slides without a
data-timing attribute. The presenter can then switch to the automatic
calculation, if desired, by setting a value for totalTime.
2019-05-12 20:10:06 +02:00
Daniel Noga
39ed39f3e2 update minimal nodejs version in readme 2019-05-05 13:34:43 +02:00
Mario Botsch
1f5fb971d4 Fix plugin documentation
Mention that reveal.js will wait for the Promise of a plugin's init()
function only when the plugin is loaded non-async. The init functions
of plugins that are loaded as async dependencies are called after
reveal.js has dispatched the 'ready' event.
2019-04-23 23:28:05 +02:00
Hakim El Hattab
a16b71a981 the postMessage API now works for getter methods 2019-04-23 10:52:45 +02:00
Hakim El Hattab
32197bd77d fix numeric presence condition 2019-04-10 10:09:41 +02:00
Richard Westenra
33bed47dac Remove calls to missing modules from gruntfile
When running the app, Grunt throws the following warnings:

>> Local Npm module "grunt-contrib-clean" not found. Is it installed?
>> Local Npm module "grunt-contrib-nodeunit" not found. Is it installed?

These modules don't appear to do anything except throw a warning so they can probably just be removed.
2019-04-08 10:36:33 +02:00
Hakim El Hattab
9aa514bc70 Merge pull request #2364 from richardwestenra/fix/missing-modules
Bugfix: Remove calls to missing modules from gruntfile
2019-04-08 10:14:02 +02:00
Richard Westenra
3ff070536e Remove calls to missing modules from gruntfile
When running the app, Grunt throws the following warnings:

>> Local Npm module "grunt-contrib-clean" not found. Is it installed?
>> Local Npm module "grunt-contrib-nodeunit" not found. Is it installed?

These modules don't appear to do anything except throw a warning so they can probably just be removed.
2019-04-06 11:07:05 +03:00
Hakim El Hattab
e9ba289e80 refinements for multi-step code highlights 2019-04-05 19:49:17 +02:00
Hakim El Hattab
7eb2cec6b6 first version of multi-step code highlights 2019-04-05 07:59:35 +02:00
Hakim El Hattab
c636b88b2d Merge branch 'master' of github.com:hakimel/reveal.js into dev 2019-04-03 10:49:22 +02:00
Hakim El Hattab
3643112b35 plugin doc tweaks 2019-04-03 10:49:14 +02:00
Hakim El Hattab
4c557a5959 prefer transform scaling over zoom on hdpi displays 2019-04-02 16:25:27 +02:00
Hakim El Hattab
15dec96e73 better example for line range highlighting 2019-04-01 15:48:46 +02:00
Hakim El Hattab
da4ec074f1 docs for code highlight line numbering 2019-04-01 15:45:07 +02:00
Hakim El Hattab
485870946f plugin docs 2019-04-01 15:25:40 +02:00
Hakim El Hattab
25c504c22f plugin api docs 2019-04-01 15:11:51 +02:00
Hakim El Hattab
3da09f1fef 3.8.0 2019-04-01 14:34:10 +02:00
Hakim El Hattab
eb5d79370b fix typos 2019-04-01 14:29:26 +02:00
Hakim El Hattab
2734aa3da0 fix grunt ci error 2019-04-01 13:46:08 +02:00
Hakim El Hattab
e6fa04d485 fix typos 2019-04-01 13:11:29 +02:00
Hakim El Hattab
94cbfcbdf6 Merge pull request #2326 from earboxer/2313-navigation-mode-shortcuts-table
Allow Navigation Mode setting to change the shortcuts table
2019-04-01 13:01:29 +02:00
Hakim El Hattab
29ea072ddf fix npm security warnings, auto run tests when changed 2019-04-01 11:14:22 +02:00
Hakim El Hattab
df25fbebba add hasPlugin and getPlugin API methods and tests 2019-04-01 11:07:11 +02:00
Hakim El Hattab
d6f0f41f77 tweaks and tests for #2354 2019-03-28 15:42:28 +01:00
Hakim El Hattab
6faab091bb Merge branch 'dev' of https://github.com/maxrothman/reveal.js into dev 2019-03-28 15:12:33 +01:00
Hakim El Hattab
922d791fd9 fix an error where reveal.js returned a 1> progress number when there were fragments on last slide 2019-03-25 12:00:46 +01:00
Max Rothman
93b1abc736 Add data-preload attribute for iframes
Allows lazy-loaded (i.e. data-src) iframes to be preloaded when they
come within the viewDistance, rather than once they're visible.
2019-03-22 10:45:08 -04:00
Hakim El Hattab
b8de5e02d2 make #2350 work using replaceState 2019-03-21 09:13:28 +01:00
Hakim El Hattab
ae556d0844 Merge pull request #2350 from rparree/hash-problem
Fixed not bing able to follow same inner links twice with history:false
2019-03-21 09:03:50 +01:00
Hakim El Hattab
b5fe0f8126 Merge branch 'dev' into hash-problem 2019-03-21 09:03:27 +01:00
Hakim El Hattab
01874c6e70 new demo slide to promote iframes/iframe backgrounds 2019-03-20 09:12:31 +01:00
Raphael Parree
b4c6c92033 Fixed not bing able to follow same inner links twice with history:false
Scenario:

- history set to false in Reveal’s config
- follow anchor to `/#someid`
- navigate to other sections
- follow anchor to same section `/#someid`

This does not work as the hash has not changed.

This fix removes the hash from the URL when navigating
2019-03-15 08:45:43 +01:00
Hakim El Hattab
c7db11d9cf tests for plugins 2019-03-14 16:03:55 +01:00
Hakim El Hattab
b180d94e02 fix error when reveal.js was initialized with no plugins 2019-03-14 15:39:19 +01:00
Hakim El Hattab
6410ed15aa support for plugins where the init method doesn't return a Promise 2019-03-14 14:52:59 +01:00
Hakim El Hattab
5301a9ea03 more forgiving code highlight line number format, add Promise polyfill 2019-03-14 13:05:10 +01:00
Hakim El Hattab
cfc2f9cf9c line number styling tweaks 2019-03-12 13:21:27 +01:00
Hakim El Hattab
553a174cc7 highlight.js plugin improvements 2019-03-12 13:17:50 +01:00
Hakim El Hattab
7b62a0f356 prevent same plugin from being registered twice 2019-03-12 13:17:08 +01:00
Hakim El Hattab
fbbae1dc55 switch to monokai as default syntax highlight theme 2019-03-12 11:26:10 +01:00
Hakim El Hattab
7b66abd49c Merge pull request #2346 from dougalsutherland/patch-3
notes plugin: callRevealApi wants apply, not call
2019-03-12 10:38:50 +01:00
Dougal J. Sutherland
00e30a11e2 notes plugin: callRevealApi wants apply, not call 2019-03-11 22:25:19 -04:00
Hakim El Hattab
da53b3a637 validate code line numbers to highlight 2019-03-11 16:12:33 +01:00
Hakim El Hattab
8690858b6f more succinct syntax for code block line highlights 2019-03-11 15:48:03 +01:00
Hakim El Hattab
5adc2032c0 use internal pointer for current slide 2019-03-11 15:03:13 +01:00
Hakim El Hattab
69ee643846 syncFragments now returns all affected fragments 2019-03-11 14:50:35 +01:00
Hakim El Hattab
cef864a7be highlight plugin updates; support for line numbers and highlighting specific lines 2019-03-08 15:07:59 +01:00
Hakim El Hattab
b6e136776a Merge pull request #2340 from sophware/fix_zoom_demo
demo.html - Added Linux instructions for zoom
2019-03-07 16:13:33 +01:00
Sophware
d0771922c9 demo.html - Added Linux instructions for zoom 2019-03-06 17:05:45 -05:00
Hakim El Hattab
fc30774ef2 Merge pull request #2339 from mikeshatch/patch-1
Fixed a couple of typos
2019-03-06 13:31:16 +01:00
Mike Hatch
dd6f8b402c Fixed a couple of typos 2019-03-04 12:24:04 -06:00
Hakim El Hattab
c40e9819a2 highlight, math, notes and zoom plugins now register via Reveal.registerPlugin 2019-03-04 14:32:38 +01:00
Hakim El Hattab
d780352b7f reveal.js plugin flow now uses promises, refactor markdown plugin to use promises 2019-03-04 14:11:21 +01:00
James
c2e048bc16 Update README.md with strike fragment
the strike type fragment was un-documented, so I stuck a mention of it in with the others.
2019-03-02 22:08:17 +08:00
Hakim El Hattab
46f8f86fa1 few plugin registration tweaks 2019-03-01 21:34:11 +01:00
Hakim El Hattab
4862de26eb async loading of external markdown, add Reveal.registerPlugin() 2019-03-01 21:28:52 +01:00
Hakim El Hattab
213023760a build dependency updates 2019-02-28 13:47:49 +01:00
Hakim El Hattab
3b4fabc8a7 upgrade .travis nodejs version 2019-02-28 13:27:41 +01:00
Hakim El Hattab
4a8899e520 see if increased node version fixes build 2019-02-28 13:25:46 +01:00
Hakim El Hattab
5ae2d3eb1e update grunt dependencies 2019-02-28 11:22:32 +01:00
Hakim El Hattab
205ef8fdcc fix scss compilation task 2019-02-28 10:07:41 +01:00
Hakim El Hattab
d549204ef1 Merge pull request #2333 from dougalsutherland/patch-2
remove unused `isPrintingPDFFragments` function
2019-02-28 09:58:02 +01:00
Dougal J. Sutherland
a36f7cbf99 remove unused isPrintingPDFFragments function 2019-02-28 01:19:43 +00:00
Zach DeCook
bb4eeb6c3c * Keyboard Shortcuts table: Dynamically fill object at configuration 2019-02-19 17:29:07 -05:00
Hakim El Hattab
1efb8260af Merge pull request #2325 from hakimel/revert-2312-improve_random_number_generation
Revert "impove randomness"
2019-02-18 15:18:59 +01:00
Hakim El Hattab
d927cdf579 Revert "impove randomness" 2019-02-18 15:17:30 +01:00
Hakim El Hattab
27b70ed0ba Merge pull request #2312 from albert-ziegler/improve_random_number_generation
impove randomness
2019-02-18 15:14:39 +01:00
Albert
9e3a52f14a correct typo 2019-02-11 09:05:46 +00:00
Hakim El Hattab
2d57981261 zoom transition now uses zooming for vertical transitions, too 2019-02-01 11:09:03 +01:00
Hakim El Hattab
7867b77833 indentation fix 2019-02-01 10:16:32 +01:00
Hakim El Hattab
ce53e63b5b documentation for #2315 2019-02-01 10:15:10 +01:00
Hakim El Hattab
d0337246f2 Merge pull request #2315 from dougalsutherland/slide-formats
allow custom slide numbering functions
2019-02-01 09:49:39 +01:00
Hakim El Hattab
2a9edd23e6 define available values for showSlideNumber 2019-02-01 09:48:36 +01:00
Hakim El Hattab
812b802c1c resize event tweaks for #2300 2019-01-31 20:13:32 +01:00
Hakim El Hattab
9c1615fff1 Merge pull request #2300 from mw75/master
Resize Event
2019-01-31 20:09:45 +01:00
Dougal J. Sutherland
43d1c71107 allow custom slide numbering functions 2019-01-31 18:28:38 +00:00
Hakim El Hattab
aa8be6829c Merge pull request #2305 from reyerstudio/marked
Upgrade marked to 0.6.0
2019-01-31 10:10:28 +01:00
Albert
90473eeb05 impove randomness 2019-01-30 16:33:41 +00:00
Hakim El Hattab
6a2cb42e6b enable pinch-to-zoom for android 2019-01-30 16:31:31 +01:00
Hakim El Hattab
2219107c69 only force media controls to be visible when necessarry 2019-01-29 11:26:46 +01:00
Hakim El Hattab
23c2d2795c navigationMode documentation improvements 2019-01-23 10:43:05 +01:00
Hakim El Hattab
481208f43f hide vertical arrows when navigationMode is 'linear' #2307 2019-01-23 10:30:29 +01:00
Hakim El Hattab
2fa3ab6a6b documentation for navigationMode #2307 2019-01-23 10:14:40 +01:00
Hakim El Hattab
51b1658a60 'gridNavigation' and 'simpleNavigation' merged into 'navigationMode' setting #2307 2019-01-23 09:58:10 +01:00
Hakim El Hattab
4c3f778e6e refactor keyboard listener conditions 2019-01-22 15:43:42 +01:00
Hakim El Hattab
fef15ea9d1 Merge pull request #2307 from reyerstudio/feature/shortcuts@dev
Enable simpleNavigation
2019-01-22 15:21:31 +01:00
Hakim El Hattab
baac3413ed upgrade to socket.io 2.2.0 #2257 2019-01-22 15:05:13 +01:00
Hakim El Hattab
ddd9f818f3 hide body overflow 2019-01-22 12:05:57 +01:00
Hakim El Hattab
41858b91d5 adjust how global height is styled 2019-01-22 10:02:08 +01:00
Hakim El Hattab
5002304fb1 correct height of reveal.js on mobile devices, fixes vertical overflow 2019-01-22 09:45:33 +01:00
Stéphane Este-Gracias
65584ff3a9 Enable simpleNavigation 2019-01-21 21:57:20 +01:00
Stéphane Este-Gracias
cf4af0fbcd Fix test after upgrading marked to 0.6.0 2019-01-20 19:29:46 +01:00
Stéphane Este-Gracias
a86dab0363 Upgrade marked to 0.6.0 2019-01-20 19:28:27 +01:00
Mario Wolff
126365627b fixed documentation on resize event 2019-01-15 13:18:55 +01:00
Mario Wolff
abee356e42 emmit resize event if scale changed 2019-01-15 13:13:19 +01:00
Hakim El Hattab
c36caef5e7 2019 2019-01-10 14:58:38 +01:00
Hakim El Hattab
10e44aabfc remove pinch gesture for triggering overview mode on touch devices, enables regular mobile pinch-to-zoom 2019-01-10 14:43:33 +01:00
Hakim El Hattab
9712cc9ad6 whitespace 2019-01-07 14:43:46 +01:00
Hakim El Hattab
65938f388b Merge pull request #1188 from sanand0/master
Display .stretch images in overview mode. Fix #1187
2019-01-07 14:41:45 +01:00
Hakim El Hattab
b645828707 ensure history api is available, default to hash: true with no history in demo #2286 2018-12-19 11:04:29 +01:00
Hakim El Hattab
6ef565c9fb Merge pull request #2286 from asottile/hash_without_history_2211
Add new 'hash: true' option which uses replaceState for url
2018-12-19 10:52:15 +01:00
Hakim El Hattab
7eb74ac335 correct variable name in inline comment 2018-12-19 10:41:13 +01:00
Hakim El Hattab
dedad930e3 add section about vertical slides and gridNavigation to readme 2018-12-19 10:37:30 +01:00
Hakim El Hattab
665dfb9cd6 add gridNavigation config to configure navigation between adjacent vertical stacks 2018-12-19 09:38:15 +01:00
Hakim El Hattab
db9c346b41 optimization; avoid reading computed styles unless necessary 2018-12-18 14:21:11 +01:00
Hakim El Hattab
9f1856d55b fix notes layout when container isnt as wide as viewport 2018-12-18 10:14:18 +01:00
Hakim El Hattab
6fe0cbc0dd prefer vh for speaker notes layout 2018-12-17 12:58:55 +01:00
Hakim El Hattab
c2270cc0c5 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2018-12-12 10:00:56 +01:00
Hakim El Hattab
0b3e7839eb note about backticks to avoid LaTeX <> Markdown syntax conflicts #1359 2018-12-12 09:59:45 +01:00
Anthony Sottile
fd6245bb28 Add new 'hash: true' option which uses replaceState for url
Resolves #2211
2018-12-02 16:49:06 -08:00
Hakim El Hattab
87d6af2cb4 Merge pull request #2266 from f00ale/custom_code_font
Make code font customizable for themes.
2018-11-21 08:33:56 +01:00
Hakim El Hattab
82076c5a0b demo presentation now refers to correct zoom.js shortcut for linux #2280 2018-11-21 08:29:17 +01:00
Hakim El Hattab
8ac3383bee add getRevealElement API method 2018-11-16 10:39:43 +01:00
Hakim El Hattab
f042a8c394 add cmd/ctrl + arrow key shortcuts to first/last slides 2018-11-13 10:48:23 +01:00
Hakim El Hattab
b6ce0a9724 fix concave/convex transitions on vertical slides #1947 2018-11-08 14:05:53 +01:00
Hakim El Hattab
1c07fccc35 reset css in default index.html 2018-11-05 08:59:19 +01:00
ggodreau
40bf81ce9b Fixes #2268
- Added clarification to README.md that 'markdown.js' and 'marked.js' scripts were imported within the default included index.html file
2018-11-01 08:18:21 -05:00
Hakim El Hattab
bc2477bf10 fix no-transform mode 2018-10-31 09:20:12 +01:00
Hakim El Hattab
2b61dde83b add audio autoplay test 2018-10-31 08:59:47 +01:00
Arno Lepisk
8e5bdcc2bb Make code font customizable for themes. 2018-10-30 22:03:13 +01:00
Hakim El Hattab
42e796afb2 dispatch state events after current slide has updated #2264 2018-10-26 11:29:08 +02:00
Hakim El Hattab
6abc6e0058 move reset.css out of reveal.css to make it optional #1952 #2248 2018-10-25 13:34:03 +02:00
Hakim El Hattab
4ac153c46f Merge pull request #2263 from mbotsch/fix-readURL
Fix if-statement in readURL
2018-10-25 13:00:03 +02:00
Mario Botsch
8a35a1e1ed Fix nested if-statement in readURL that caused slide(h,v) to be
called even when the current slide is the target slide.
2018-10-24 23:22:11 +02:00
Hakim El Hattab
7d66999c7f syntax tweak 2018-10-11 11:32:23 +02:00
Hakim El Hattab
387455b755 replace while with forEach loop 2018-10-11 11:32:16 +02:00
Hakim El Hattab
a4dc1c6440 fix #1590 2018-10-11 11:24:54 +02:00
Hakim El Hattab
62cd74a890 add note about lazy loading iframes #1672 #1938 2018-10-09 11:08:09 +02:00
Hakim El Hattab
7b707696b4 automatically hide the mouse pointer after 5s of inactivity (#1837) 2018-10-08 09:58:06 +02:00
Hakim El Hattab
5890f602b3 Merge pull request #2090 from bnjmnt4n/math
Allow users to customise MathJax options.
2018-10-08 08:41:08 +02:00
Hakim El Hattab
e7a365255f Merge pull request #2251 from oyron/2229-speaker-notes-bug
Give focus to previously opened speaker notes (fixes #2229)
2018-10-08 08:32:39 +02:00
oyron
f32cd8586d Handle previously opened notes window, by giving focus. 2018-10-05 15:18:08 +02:00
Hakim El Hattab
fb089e7083 fix build error 2018-10-04 15:43:58 +02:00
Hakim El Hattab
196d2a3971 remove classlist polyfill, cross browser support is good enough now 2018-10-04 14:54:35 +02:00
Hakim El Hattab
01ceba3f73 remove mention of head.js in readme 2018-10-04 14:48:39 +02:00
Hakim El Hattab
29b0e86089 remove head.min.js in favor of simple built-in script loader 2018-10-04 14:48:01 +02:00
Hakim El Hattab
d5cf3fa13c formatting and tweaks for #2104 2018-10-04 13:26:22 +02:00
Hakim El Hattab
8582c9aac8 resolve notes merge conflict 2018-10-04 12:32:37 +02:00
Hakim El Hattab
90fc0bc466 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2018-10-03 12:53:07 +02:00
Hakim El Hattab
c35cce54a5 Merge pull request #2231 from esthor/patch-1
bring install instructions to top, as is tradition
2018-10-03 12:48:41 +02:00
Hakim El Hattab
c9ab489ba2 Merge pull request #2245 from rollandf/master
Fix typo
2018-10-03 12:44:53 +02:00
Hakim El Hattab
f089e1b228 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2018-10-03 12:44:26 +02:00
Hakim El Hattab
436b41a8fc dont refer to outdated speaker notes style in readme #2244 2018-10-03 12:43:00 +02:00
Fred Rolland
7b2769901e Fix typo 2018-10-02 17:52:51 +03:00
Erik
ed581add7f bring install instructions to top, as is tradition
The Install was waaaay at the bottom, which didn't make sense to scroll through all the detailed documentation, just to find how to get started with an install.
2018-09-18 16:33:16 -04:00
Hakim El Hattab
7dbf519104 fix css conflict 2018-08-21 09:27:55 +02:00
Hakim El Hattab
4b1866b040 Merge pull request #2218 from eldios/patch-1
Fixed broken link to markdown options doc
2018-08-17 09:57:54 +02:00
Lele
b0ebb7deed Fixed broken link to markdown options doc
Fixed broken link to markdown options doc
2018-08-16 14:34:46 +02:00
Hakim El Hattab
b003a54f91 Merge pull request #2215 from anderslemke/let-resume-follow-controls
Only show resume on pause if controls enabled
2018-08-16 11:46:46 +02:00
anderslemke
f52460a6fd Only show resume on pause if controls enabled 2018-08-15 19:58:18 +02:00
Hakim El Hattab
249f013959 fix detection of named links (closes #1655) 2018-08-01 10:55:59 +02:00
Hakim El Hattab
2c5396b7d3 3.7.0 2018-08-01 10:37:51 +02:00
Hakim El Hattab
72b05a3245 Merge pull request #2171 from tristansokol/tristans/add-all-transitions
add a full list of transitions to readme
2018-08-01 10:36:07 +02:00
Hakim El Hattab
b6aa0cac23 Merge branch 'dev' of github.com:hakimel/reveal.js 2018-08-01 10:34:55 +02:00
Hakim El Hattab
f6f7f58537 Merge branch 'master' of github.com:hakimel/reveal.js 2018-07-25 10:56:02 +02:00
Hakim El Hattab
b9bb353a11 add 'resume presentation' button to pause overlay 2018-07-02 11:08:45 +02:00
Hakim El Hattab
fd95c8c266 use absolute positioning for slide number 2018-06-21 10:07:38 +02:00
Hakim El Hattab
be87adcdf8 rename new fragment style 2018-06-13 14:12:28 +02:00
Hakim El Hattab
078a7520cd refactor fragment pdf exporting to support multiple fragments with same index #1955 2018-06-12 20:44:49 +02:00
Hakim El Hattab
3680f1ad10 merge #1955 with minor changes 2018-06-11 12:35:11 +02:00
Hakim El Hattab
a86146180f Merge branch 'master' of https://github.com/koehlma/reveal.js into dev 2018-06-11 12:16:41 +02:00
Hakim El Hattab
a9e95e7e6c merge conflicts 2018-06-11 11:02:21 +02:00
Hakim El Hattab
4bea8e17e8 add 'fade-in-then-half-out' fragment style, 'current-visible' was renamed to 'fade-in-then-out' 2018-06-11 10:59:31 +02:00
Hakim El Hattab
a82c4333ed Merge pull request #2141 from marcvangend/marcvangend-clarify-notes-regex
Clarify the meaning of the notes?: regex
2018-06-11 10:04:58 +02:00
Tristan Sokol
27553e2fcb add a full list of transitions to readme 2018-06-05 09:30:02 -07:00
Hakim El Hattab
4672801229 new syncFragments api method 2018-05-31 10:35:09 +02:00
Hakim El Hattab
30b670cf42 flatten slide number when there are only vertical slides 2018-05-24 09:21:42 +02:00
Daniel Panero
4818acbaf0 Removed .jshintrc and added eslint instead of jshint
I added the same jshint configuration/rules in package.json and I replaced some old function with arrow function to improve legibility
2018-05-14 20:01:59 +02:00
Hakim El Hattab
3c5c50f3fe Merge pull request #2158 from denehyg/issue-2157
Fix timer when speaker notes window opened via RevealNotes.open()
2018-05-07 11:06:16 +02:00
Greg Denehy
ee63b2ac60 Fixed notes timer when speaker notes window opened via RevealNotes.open() 2018-05-05 17:38:37 +09:30
Hakim El Hattab
667c83f1b7 refactor code to match new background dom structure 2018-05-03 15:45:31 +02:00
Hakim El Hattab
0bbcc6b594 add Reveal.syncSlide 2018-05-03 15:25:54 +02:00
Hakim El Hattab
042fbde61b data-background-content-opacity -> data-background-opacity 2018-05-03 11:02:36 +02:00
Hakim El Hattab
4ba0d73345 add , adds wrapper element around background images/videos/iframes 2018-04-27 15:53:02 +02:00
Hakim El Hattab
de41f6cf50 smaller font size for sub/sup 2018-04-24 14:56:03 +02:00
Hakim El Hattab
5771ae39f0 speaker view has visible connection status, times out with error after 5s 2018-04-24 14:23:28 +02:00
Hakim El Hattab
f1133f0e10 support interactive iframe backgrounds in vertical stacks 2018-04-17 09:46:55 +02:00
Hakim El Hattab
2a57223939 revise readURL to handle one-based indices 2018-04-16 09:58:03 +02:00
Hakim El Hattab
531d1e8791 prevent linked slide numbers from changing color 2018-04-16 09:48:37 +02:00
Hakim El Hattab
f713d9d67d Merge pull request #2133 from sean-parent/master
Adding support for hash linked slideNumber
2018-04-16 09:31:05 +02:00
Sean Parent
97c1a0ecc1 Merge branch 'dev' into master 2018-04-13 07:55:02 -07:00
marcvangend
ceb1738a0f Clarify the meaning of the notes?: regex 2018-04-01 20:03:25 +02:00
Hakim El Hattab
397feab8b4 gracefully handle duplicate slide id's 2018-03-27 14:21:41 +02:00
Sean Parent
64b2a27455 Made one based indexing optional 2018-03-23 10:07:42 -07:00
Quentin PROUST
93cacaa40c Print background in pdf (#2131)
* Print background in pdf

Pull request to integrate issue https://github.com/hakimel/reveal.js/issues/1686. Adding the workaround to the theme template to make it work for every theme.

* apply suggestion of @hakimel
2018-03-23 13:50:42 +01:00
Hakim El Hattab
1257ee7e27 code formatting 2018-03-22 11:58:15 +01:00
Hakim El Hattab
4cb0d52c73 Merge branch 'URI-encode-name-hash' of https://github.com/nnormand/reveal.js into dev 2018-03-22 11:56:50 +01:00
Hakim El Hattab
ba0e432542 formatting 2018-03-22 11:55:44 +01:00
Hakim El Hattab
a2e69a4b42 Merge pull request #2097 from bnjmnt4n/docs/readme
Cleanup readme to make it easier to read/edit.
2018-03-22 11:51:05 +01:00
Hakim El Hattab
3bbf969686 Merge pull request #2114 from ChumpChief/standardized-pointer
Prefer W3C pointer events and updates to match the standard definition
2018-03-22 11:47:19 +01:00
Hakim El Hattab
49251078f3 remove legacy vendor prefixes from pdf css 2018-03-22 11:43:07 +01:00
Hakim El Hattab
8bf1cc601a Merge pull request #2128 from craigsdennis/feature/update-copyright-date
Updates copyright to 2018
2018-03-22 11:16:41 +01:00
Hakim El Hattab
6dbc593280 disableLayout comment tweak 2018-03-22 11:10:27 +01:00
Steve Hartzog
9dbccd6978 add support for overriding the default layout (#2121)
* add support for overriding the default layout
New `overrideLayout` option (if true) will prevent h/w calcs.

* fix error if options are empty

* Implement requested changes
Rename overrideLayout to disableLayout and remove code to unset display
2018-03-22 11:06:19 +01:00
Sean Parent
443b4475bc Adding support for hash linked slideNumber 2018-03-21 18:08:16 -07:00
Hakim El Hattab
ea57e697a1 Revert "remove pdf height offset"
This reverts commit f76b4fda93.
2018-03-20 10:09:47 +01:00
craigsdennis
8ff5fe4986 Updates copyright to 2018 2018-03-16 22:41:16 -07:00
Hakim El Hattab
f76b4fda93 remove pdf height offset 2018-03-16 13:52:19 +01:00
Hakim El Hattab
511397c177 prevent missing 'present' class when navigating to same slide twice 2018-03-14 12:03:42 +01:00
Daniel
fb5f4c034a Added the remaining gulp watch
I forgot them 😧
2018-03-11 17:52:37 +01:00
Daniel
8069b003f4 Added Gulp
I have created a gulpfile.js with the same tasks of grunt, replaced npm script and finally ad .jshintrc for jshint
2018-03-11 14:15:17 +01:00
Matt Rakow
389c3f52b5 Prefer W3C pointer events, remove pointerEnabled references (it is not part of the standard), unconditional event removal 2018-03-07 09:18:26 -08:00
Hakim El Hattab
0282413b69 fix autoplay of inline videos in ios 2018-03-05 14:59:32 +01:00
Hakim El Hattab
5848a432d9 Merge branch 'patch-1' of https://github.com/Jmuccigr/reveal.js into dev 2018-02-22 10:08:02 +01:00
Martin Jurča
250580fc4c added missing documentation 2018-02-20 16:08:29 +01:00
Martin Jurča
6a2c5b4de8 documentation 2018-02-20 10:30:56 +01:00
Martin Jurča
8468d82433 fixed showing speaker's view with timings/pacing while serving the presentation from the file system 2018-02-20 10:29:16 +01:00
Benjamin Tan
1427f7a1ae Cleanup readme to make it easier to read/edit.
- Use `single backticks` consistently for inline code snippets.
- Add double linefeeds before level 2 headings.
- Add a single linefeed after each heading.
- Minor docs edits.
2018-02-14 18:36:18 +08:00
Hakim El Hattab
325162692e navigateNext no longer gets stuck on first stack when looping is enabled 2018-02-12 13:49:33 +01:00
John Muccigrosso
5d273cfb29 Background repeat & position to parallax background 2018-02-10 12:32:16 -05:00
Benjamin Tan
d5f4edeeef Merge pull request #1836 from RobertBaron/background-whitespace-uri
Allow whitespace on background-images, w3 compliance
2018-02-09 20:05:26 +08:00
Benjamin Tan
b2d532ea28 Allow users to customise MathJax options.
Ref. #1856, #2006, #2045.

This is a more open approach to allow customisation of all MathJax options instead of select options only.
2018-02-08 20:54:21 +08:00
Benjamin Tan
7cd2c9138d head.js: Remove source map URL since it doesn't exist.
This prevents additional requests from devtools when debugging code.
2018-02-08 11:22:11 +08:00
Benjamin Tan
18e7dd2173 Cleanup code style. 2018-02-08 11:22:01 +08:00
Benjamin Tan
fb97d99bff Simplify Travis test script. 2018-02-08 11:20:41 +08:00
Hakim El Hattab
27aba10756 fix looping of presentations that only have vertical slides 2018-02-07 13:45:57 +01:00
Hakim El Hattab
5eba331935 Merge branch 'fragment-in-url' of https://github.com/dougalsutherland/reveal.js into dev 2018-02-07 10:33:19 +01:00
Benjamin Tan
496db06441 head.js: Remove source map URL since it doesn't exist.
This prevents additional requests from devtools when debugging code.
2018-02-07 13:04:15 +08:00
Benjamin Tan
7991693bde Docs: add note on how to enable/disable preview links individually.
Closes #2005.
2018-02-07 12:51:14 +08:00
Benjamin Tan
410f7767b9 Docs: mention that syntax highlighting requires CSS theme file.
Closes #2075.
2018-02-06 22:34:25 +08:00
Benjamin Tan
57a4c45cf6 Docs: avoid recommending global Grunt installation.
Closes #1951.
2018-02-06 22:12:35 +08:00
Benjamin Tan
80bc1971e0 Docs: Add note about Windows carriage returns.
Closes #1808.
2018-02-06 19:39:03 +08:00
Benjamin Tan
4dabd439d2 Fix testing on Windows machines.
Windows carriage return line endings were not being tested for.

Fixes #2087.
2018-02-01 20:28:20 +08:00
Hakim El Hattab
e704b3ffc8 fix bug where left/right arrows appeared when there were no horizontal slides 2018-01-25 09:59:04 +01:00
Hakim El Hattab
de746bb642 reorganize config options 2018-01-25 09:26:10 +01:00
Hakim El Hattab
4232f41abd Merge pull request #2080 from bnjmnt4n/update-deps
Update dependencies.
2018-01-24 15:52:40 +01:00
Benjamin Tan
f9d0766637 Update QUnit to 2.5.0 and grunt-contrib-qunit to 2.0.0. 2018-01-22 22:38:32 +08:00
Benjamin Tan
f0fa6fb226 Update grunt-contrib-uglify. 2018-01-22 22:38:30 +08:00
Benjamin Tan
e382d5cfab Update dependencies. 2018-01-22 22:38:29 +08:00
Hakim El Hattab
e3205a55be Merge pull request #2078 from bnjmnt4n/data-background
Allow `data-background` images to load even if there is whitespace at…
2018-01-22 10:53:44 +01:00
Benjamin Tan
6816a0205e Allow data-background images to load even if there is whitespace at the end.
Fixes #2032.
2018-01-22 17:17:08 +08:00
Hakim El Hattab
40e5544776 Merge pull request #2077 from bnjmnt4n/js-load
Allow JS files with query strings to be loaded.
2018-01-22 10:09:46 +01:00
Benjamin Tan
fd7894fa13 Allow JS files with query strings to be loaded.
Fixes #1944.
2018-01-22 16:33:10 +08:00
Dougal J. Sutherland
d68423f310 fix fragment handling when desired fragment is 0 2018-01-21 18:03:48 +00:00
Dougal J. Sutherland
260f287926 optionally put the fragment in the URL 2018-01-04 20:09:01 +00:00
Hakim El Hattab
0c946ae18b fix missing theme line-height when printing #1967 2017-12-04 14:03:16 +01:00
Hakim El Hattab
7a0b4a56f9 prevent cmd+r in notes window since reloading breaks the view #1958 2017-12-04 13:57:19 +01:00
Hakim El Hattab
edc9c0a8fd Merge pull request #1958 from ThomasWeinert/feature/block_f5_in_notes
Block F5 in speaker notes window, avoid disconnects
2017-12-04 13:46:04 +01:00
Hakim El Hattab
09471a0508 Merge branch 'patch-1' of https://github.com/keradus/reveal.js into dev 2017-12-04 13:44:06 +01:00
Dariusz Rumiński
aee62ff0af .gitignore - ignore package-lock.json file
Ignore lock file of newer node versions
2017-12-02 20:36:36 +01:00
Hakim El Hattab
137e383950 Merge pull request #2045 from jgm/issue2026
Allow tex2jax options to be passed into math plugin.
2017-12-01 14:37:47 +01:00
John MacFarlane
773569b4a2 Allow tex2jax options to be passed into math plugin.
Closes #2026.

This does not change the default behavior of the math plugin,
but it allows $ delimiters to be disabled (which is usually
what you want, since otherwise normal uses of $ for currency get
treated as math delimiters).

To use:

    Reveal.initialize({
      math: {
        tex2jax: { inlineMath: [['\\(','\\)']],
                   skipTags: ['script','noscript','style',
                              'textarea','pre'] }
            },
      etc.
      });
2017-11-29 21:57:29 -08:00
Hakim El Hattab
1f1f86ec73 Merge branch 'issue_2041' of https://github.com/denehyg/reveal.js into dev 2017-11-29 09:54:48 +01:00
Hakim El Hattab
c966c118fa minor formatting tweaks 2017-11-29 09:46:45 +01:00
Hakim El Hattab
6028844452 Merge branch 'plugin-key-bindings' of https://github.com/denehyg/reveal.js into dev 2017-11-29 09:38:05 +01:00
Greg Denehy
8579fc773d Fixed issue with getProgress() when called from slidechanged event on edge case 2017-11-25 11:07:09 +10:30
Hakim El Hattab
a0a9aa7821 optimize use of getSlideBackground by avoiding index lookup 2017-11-23 15:45:15 +01:00
Hakim El Hattab
a0c013606e add inline and external markdown images to example #2039 2017-11-23 11:12:54 +01:00
Hakim El Hattab
65bdccd580 lab.hakim.se/reveal-js -> revealjs.com 2017-11-22 14:46:55 +01:00
Hakim El Hattab
8a63686017 3.6.0 2017-11-22 14:10:33 +01:00
Hakim El Hattab
a03e803628 make it possible to load/unload slides via the api 2017-11-21 15:38:44 +01:00
Hakim El Hattab
4022cbfe84 simplify logic for finding slide backgrounds 2017-11-21 15:29:40 +01:00
Nicolas Normand
fa8a7334ce URI encode name hash 2017-11-17 11:59:21 +01:00
Hakim El Hattab
28d6a7775b Merge branch 'update-css' of https://github.com/sfairchild/reveal.js into dev 2017-11-09 11:52:11 +01:00
Hakim El Hattab
afce29d79a Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-11-09 11:51:59 +01:00
Hakim El Hattab
9d0a3d7d5e Merge pull request #1983 from ssfrr/patch-1
adds note about necessary markdown scripts to README
2017-11-09 11:48:51 +01:00
Hakim El Hattab
41e86a2a22 Merge pull request #2017 from hoeggi/patch-1
Update README.md
2017-11-09 11:47:38 +01:00
Hakim El Hattab
1c8edfc8e4 Merge pull request #1957 from crowchirp/patch-1
corrected minor typo in readme file
2017-11-09 11:46:57 +01:00
Hakim El Hattab
463770cc53 Merge pull request #2029 from lechten/export-isSpeakerNotes
Export isSpeakerNotes
2017-11-09 11:41:08 +01:00
Hakim El Hattab
3d1d7683b2 reconfiguring no longer unloads iframes on current slide 2017-11-09 11:40:25 +01:00
Hakim El Hattab
376d140b2a Merge pull request #2030 from lechten/registersearchkey
Register search key shortcut for help overlay
2017-11-09 11:30:38 +01:00
Hakim El Hattab
3beda63a7d allow to be called directly before or after (closes #2021) 2017-11-09 10:26:35 +01:00
Jens Lechtenbörger
1002d39e7c Register search key shortcut for help overlay 2017-11-05 17:45:18 +01:00
Jens Lechtenbörger
44a5673e6f Export isSpeakerNotes 2017-11-05 10:31:43 +01:00
hoeggi
8041759b8b Update README.md 2017-10-28 19:57:35 +02:00
Hakim El Hattab
4a4719b587 always show media controls on mobile devices 2017-10-04 11:13:09 +02:00
Spencer Russell
665d3a151d adds note about necessary markdown scripts to README 2017-09-11 15:13:37 -04:00
Hakim El Hattab
56504b50a9 support negative values in query config overrides 2017-09-07 10:33:44 +02:00
Sean Fairchild
f9a4a27087 Prevent text-transform inside code tags 2017-09-06 10:50:39 -04:00
Thomas Weinert
c0109d948f Block F5 in speaker notes window, avoid disconnects 2017-08-12 13:42:55 +02:00
Chandan Rai
04dcc48fa9 corrected minor typo in readme file 2017-08-10 00:17:08 +05:30
Maximilian Köhl
08e0f5e47b fix indent: replace spaces with tabs 2017-08-08 22:53:32 +02:00
Maximilian Köhl
a2cf23b30c PDF export: add option to export one page per fragment 2017-08-08 22:47:10 +02:00
Hakim El Hattab
bfd431a0c4 add option for disabling all forms of auto-sliding 2017-07-27 08:42:40 +02:00
Hakim El Hattab
8725593805 localstorage feature test in notes plugin, fixes speaker view error in safari 2017-07-13 20:19:16 +02:00
Hakim El Hattab
b04489b129 zoom.js works on main wrapper element 2017-06-19 11:06:58 +02:00
Hakim El Hattab
76eea30083 zoom.js uses ctrl+click for linux, alt+click for others #1909 2017-06-19 09:52:56 +02:00
Hakim El Hattab
af6754bfb7 simplify point zoom, switch back to alt + click shortcut for os x support #1909 2017-06-19 09:45:52 +02:00
Hakim El Hattab
a781b6a22b clear existing matches when searching for empty string #1909 2017-06-19 09:43:29 +02:00
Hakim El Hattab
7d0d3c24ca Merge branch 'master' of https://github.com/linux-man/reveal.js into dev 2017-06-19 09:36:25 +02:00
Hakim El Hattab
af7c33b902 unload lazy loaded videos that are moved out of view 2017-06-14 19:11:08 +02:00
Hakim El Hattab
dc17129082 themes use default quotation marks for <q> #1720 2017-06-14 10:42:51 +02:00
Hakim El Hattab
1233092223 prevent mobile safari header from covering presentation content 2017-06-13 09:43:05 +02:00
Hakim El Hattab
9342d19b5a fix centering of edge-aligned controls 2017-06-12 10:22:47 +02:00
Hakim El Hattab
6ae4ad69d2 change event listener syntax #1917 2017-06-12 09:17:46 +02:00
Hakim El Hattab
5e279efdf3 Merge branch 'issue1896' of https://github.com/OleMussmann/reveal.js into dev 2017-06-12 09:11:24 +02:00
Hakim El Hattab
2961f00946 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-06-12 09:05:37 +02:00
Hakim El Hattab
43eada7990 Merge pull request #1898 from bentsai/patch-1
Fix typo
2017-06-12 08:53:09 +02:00
Hakim El Hattab
9139bc32de alias 'notes:' alias for md speaker note separator #1913 2017-06-07 15:43:25 +02:00
Ole Mussmann
b279a47a76 patch to allow multiplexing on URL load 2017-06-06 10:36:40 +02:00
Hakim El Hattab
9ab14374e5 change condition for detecting when there are horizontal slides 2017-06-02 12:13:41 +02:00
Hakim El Hattab
0388c96e60 'showNotes' does nothing when there are no notes 2017-05-24 10:05:16 +02:00
Hakim El Hattab
53c56510ed larger speaker notes font on big screens 2017-05-23 13:14:25 +02:00
Hakim El Hattab
b64c35ed0b tweak control spacing 2017-05-22 11:50:18 +02:00
Hakim El Hattab
fab28362ce highlight.js 9.0.0 -> 9.11.0 2017-05-22 11:34:24 +02:00
linux-man
ce467b53bc Remove comment 2017-05-21 19:49:07 +01:00
linux-man
9c3a65744c Modified Zoom
Block dimension calculation is not accurate, so zoom is made on mouse coordinates
Change default modifier to ctrl - alt don't work on Linux
New parameter zoomLevel: default 2
2017-05-21 19:13:41 +01:00
linux-man
e3a3d3aa0a Better Search
Open/close with Control+Shift+f
Find words inside SPAN
Don't duplicate findings
2017-05-21 19:00:12 +01:00
Hakim El Hattab
64bcfc4f69 change default color of controls to match legacy 2017-05-19 16:14:37 +02:00
Hakim El Hattab
522db9513c remove border from notes contain when printing on separate page 2017-05-19 11:21:40 +02:00
Hakim El Hattab
955075bfc4 adjust autplay position when notes are bottom-aligned 2017-05-19 10:46:13 +02:00
Hakim El Hattab
b1a7b0799f low width speaker notes mode no longer uses vh 2017-05-19 10:20:06 +02:00
Hakim El Hattab
9a7d491ede adjust speaker notes layout on mobile devices 2017-05-19 09:51:01 +02:00
Hakim El Hattab
7ae18c6b1e 'no notes on this slide' placeholder 2017-05-18 16:03:20 +02:00
Hakim El Hattab
052a3f0c71 speaker notes tweak 2017-05-18 16:00:48 +02:00
Hakim El Hattab
b7b3fe3ed4 comment typo 2017-05-18 15:40:17 +02:00
Hakim El Hattab
453a888797 fix error with multiple decimal em in safari 2017-05-18 15:35:25 +02:00
Hakim El Hattab
6dde00fb2e improve controls on touch devices 2017-05-18 14:11:48 +02:00
Hakim El Hattab
fb1b8a2790 revise progress to make them easier to override 2017-05-18 09:58:25 +02:00
Hakim El Hattab
a5e175d59f fix up arrow position 2017-05-18 09:42:01 +02:00
Hakim El Hattab
d770f32bb9 control layout tweaks 2017-05-17 17:10:17 +02:00
Hakim El Hattab
c966672aa4 adjust control layouts when there are no vertical/horiozontal slides 2017-05-17 15:20:45 +02:00
Hakim El Hattab
b784bd56d1 more flexible control size using em 2017-05-17 14:45:01 +02:00
Hakim El Hattab
13733edaa8 control opacity tweak 2017-05-16 15:51:20 +02:00
Hakim El Hattab
67507ccb9d controlsHints -> controlsTutorial 2017-05-16 15:40:50 +02:00
Hakim El Hattab
9e013ccbb2 in/out transitions for controls 2017-05-16 15:31:05 +02:00
Hakim El Hattab
617c17be3c add controlsHint option, animates vertical arrow first time we encounter a vertical slide 2017-05-16 15:04:32 +02:00
Hakim El Hattab
58dc6b7c36 adjust controls layout when there are no vertical or horizontal slides in the deck 2017-05-16 09:45:37 +02:00
Hakim El Hattab
f8b5813e59 prevent flicker on hover 2017-05-16 09:45:37 +02:00
Hakim El Hattab
16c03a5b03 spacing adjustment 2017-05-16 09:45:37 +02:00
Hakim El Hattab
92049d8244 fix unclickable slides in overview when controls were edge-aligned 2017-05-16 09:45:37 +02:00
Hakim El Hattab
2a0a6cbabc reduce control spacing 2017-05-16 09:45:37 +02:00
Hakim El Hattab
54a2137c0d fix responsive issue with speaker notes 2017-05-16 09:45:37 +02:00
Hakim El Hattab
2cc5ae946b new, fixed, speaker notes layout 2017-05-16 09:45:37 +02:00
Hakim El Hattab
44a355b6e9 'controls-placement' -> 'controls-layout', cut back on controls spacing 2017-05-16 09:45:37 +02:00
Hakim El Hattab
10545d41cc simplify control styling using currentColor 2017-05-16 09:45:37 +02:00
Hakim El Hattab
2155415767 more flexible back arrow controls option 2017-05-16 09:45:37 +02:00
Hakim El Hattab
e45a425575 default to bottom right controls, rename soften arrows option 2017-05-16 09:45:37 +02:00
Hakim El Hattab
4fb8e78eb4 collapse control element size when corner aligned 2017-05-16 09:45:37 +02:00
Hakim El Hattab
a9fcaa6f9e new controls are used by default, add config options 2017-05-16 09:45:37 +02:00
Hakim El Hattab
8a09557699 control size tweaks 2017-05-16 09:45:37 +02:00
Hakim El Hattab
69c72b9e08 invert colors of controls based on current background 2017-05-16 09:45:37 +02:00
Hakim El Hattab
ce4537f883 new controls responsively move to bottom right for small displays 2017-05-16 09:45:37 +02:00
Hakim El Hattab
1319016957 new optional controls aligned to screen edges 2017-05-16 09:45:37 +02:00
Hakim El Hattab
963e5c8678 correct target for cssmin 2017-05-16 09:44:36 +02:00
Ben Tsai
0d1be9920f Fix typo
"proceding" → "proceeding"
2017-05-10 20:36:45 -04:00
Hakim El Hattab
ada8003183 Merge pull request #1887 from tristansokol/tristans/add-useavailableport
adds `useAvailablePort` option when serving page with connect.
2017-05-05 14:11:07 +02:00
Hakim El Hattab
00570ea5ce Merge pull request #1884 from demoneaux/upgrade-deps
Upgrade Grunt dependencies and standardise on a consistent file format.
2017-05-05 14:10:24 +02:00
Tristan Sokol
d948c2cd6b adds useAvailablePort option when serving page with connect. 2017-05-02 17:54:29 -07:00
Benjamin Tan
b294323854 Upgrade Grunt dependencies and standardise on a consistent file format.
Closes #1226, #1538.
2017-05-01 12:16:30 +08:00
Greg Denehy
b86b667d25 Changes to fix failed jshint test related to Key Binding API 2017-04-30 19:42:45 +09:30
Greg Denehy
e16508477a Fixed notes.js to account for upstream updates 2017-04-30 17:51:38 +09:30
Greg Denehy
f8bc679182 Merge branch 'dev' into plugin-key-bindings 2017-04-30 17:42:16 +09:30
Greg Denehy
40a46e1c0c Added description of custom key binding API to readme 2017-04-30 17:19:01 +09:30
Greg Denehy
e48e1e19b9 Changed custom key binding config properties to use 'keyCode' instead of 'code' 2017-04-30 16:35:35 +09:30
Greg Denehy
8bf9986fa2 Pass through key event when calling keyboardCondition() to allow conditional function to filter on key codes 2017-04-30 15:24:42 +09:30
Greg Denehy
7297474b2e Added programatic support for custom key bindings with optional descriptions to be added to the help screen 2017-04-30 15:23:04 +09:30
Hakim El Hattab
360bc94006 new fix for prematurely autoplaying background videos 2017-04-27 18:49:20 +02:00
Hakim El Hattab
9f4ed56bb3 larger headings for background sections 2017-04-27 16:42:24 +02:00
Hakim El Hattab
caccf67d3a add for iframe backgrounds 2017-04-27 16:39:49 +02:00
Hakim El Hattab
b19dc7fc80 don't autoplay background videos in overview mode 2017-04-27 16:36:25 +02:00
Hakim El Hattab
8e93a1ddf9 3.5.0 2017-04-26 14:21:54 +02:00
Hakim El Hattab
0c3d89bfce minor tweak for #1564 2017-04-21 09:35:51 +02:00
Adam Spiers
715cf0ba11 optionally display pacing advice based on slide timings
Add an option to display advice on whether the current pace of the
presentation is on track for the right timing (shown as green), and if
not, whether the presenter should speed up (shown as red) or has the
luxury of slowing down (blue).

The pacing timer can be enabled by configuring by the `defaultTiming`
parameter in the `Reveal` configuration block, which specifies the
number of seconds per slide.  120 can be a reasonable rule of thumb.
Timings can also be given per slide `<section>` by setting the
`data-timing` attribute.  Both values are in numbers of seconds.

When the option is enabled, clicking on the timers will reset the timer
to the beginning of the current slide, i.e. as if pacing was perfectly
on track, not to zero as if the presentation had just begun.
2017-04-20 16:11:10 +01:00
Adam Spiers
921a605567 document clock and timer in speaker notes window 2017-04-20 15:18:15 +01:00
Adam Spiers
9c7fda43e9 don't show negative signs inside minutes/seconds elements 2017-04-20 15:18:15 +01:00
Adam Spiers
933eba8789 round decreasing timers to mirror increasing timers 2017-04-20 15:18:15 +01:00
Adam Spiers
1eada3b360 avoid deleting existing classes when muting time elements
and make muting work for negative values
2017-04-20 15:18:15 +01:00
Adam Spiers
b1b4ee270b don't mute minutes when hours is unmuted 2017-04-20 15:18:15 +01:00
Adam Spiers
89b0c5a8d0 use opacity for muted clock elements
This allows us to use different colours for different timers,
which will be useful when we add a pacing timer.
2017-04-20 15:18:15 +01:00
Adam Spiers
a161acaba9 extract time display code into new _displayTime() function
This will allow us to reuse the display code for displaying
an additional pacing timer.
2017-04-20 15:18:15 +01:00
Adam Spiers
eb23e58114 Allow popup window access to Reveal API 2017-04-20 15:18:15 +01:00
Adam Spiers
ef9cbbbbb9 add new getSlides() API
This can be used by plugins which are concerned with helping the
presenter with their pace.
2017-04-20 15:18:15 +01:00
Adam Spiers
40912ace1f clarify getTotalSlides() returns the number of slides 2017-04-20 15:18:15 +01:00
Adam Spiers
d75afd6108 expose getPastSlideCount() via public API
This can be used by plugins which are concerned with helping the
presenter with their pace.
2017-04-20 15:18:15 +01:00
Adam Spiers
eac37990e1 clarify meaning of getProgress() value 2017-04-20 15:18:15 +01:00
Hakim El Hattab
9bbd5f2735 formatting 2017-04-07 10:10:11 +02:00
Hakim El Hattab
2289b92961 Merge pull request #1851 from astone123/master
Fix data-background-video autoplay on iOS Safari
2017-04-07 10:02:58 +02:00
Hakim El Hattab
d1d44cf6b7 formatting 2017-04-07 09:55:55 +02:00
Hakim El Hattab
30f2af0ac5 Merge pull request #1844 from riezebosch/pdf-print-stretch
print-pdf layout slide contents to fit stretch elements
2017-04-07 09:54:39 +02:00
Hakim El Hattab
8ec5e00062 Merge pull request #1843 from riezebosch/pdf-print-callback
print-pdf using callback iso timer
2017-04-07 09:42:24 +02:00
Hakim El Hattab
1babc8d31c Merge pull request #1866 from christianp/mathjax-cdn
replace cdn.mathjax.org with cdnjs
2017-04-07 09:33:05 +02:00
Christian Lawson-Perfect
9495b64d2c replace cdn.mathjax.org with cdnjs
cdn.mathjax.org is shutting down: https://www.mathjax.org/cdn-shutting-down/

This changes the default MathJax URL in the math plugin, as well as
references in README.md and test/examples/math.html
2017-04-05 12:48:56 +01:00
Hakim El Hattab
c3e96f1f0e make pdf page height offset configurable 2017-04-04 14:02:54 +02:00
Hakim El Hattab
2584a6d970 new cli and in-browser pdf printing compatible fix for #1804 2017-04-04 13:37:01 +02:00
Hakim El Hattab
3ea7e2ff59 allow fullscreen for background iframes 2017-03-30 16:26:49 +02:00
Hakim El Hattab
a0a3b4f80d add autoPlayMedia config option, overrides individual autoplay settings 2017-03-23 11:44:02 +01:00
ADAM STONE
d9dd9a92fb Fix video background autoplay on iOS 2017-03-17 22:47:25 -04:00
Manuel Riezebosch
34f3773bf0 print-pdf layout slide contents to fit stretch elements
layout() and thereby layoutSlideContents() is never invoked
when isPrintingPdf() is true so stretch elements are not
sized correctly.
This is ensured now by invoking the layoutSlideContents
from SetupPDF(). There seems no need to scale down
like in other PR's is suggested.
2017-03-14 19:16:08 +01:00
Manuel Riezebosch
9a7c7ce93a print-pdf using callback iso timer
Use window.callPhantom icw page. onCallback to wait for pdf-ready event.
From: http://stackoverflow.com/a/28925479/129269
2017-03-14 18:54:04 +01:00
Hakim El Hattab
7e6fb9ec87 avoid npe on iframe postMessage 2017-03-14 09:06:39 +01:00
RobertBaron
f070ba47ec Allow whitespace on background-images, w3 compliance 2017-02-23 19:03:15 -06:00
Hakim El Hattab
b143e5976b tweaks to showSlideNumber config #1833 2017-02-20 11:49:36 +01:00
Hakim El Hattab
8f7e4bfd41 Merge branch 'slidenum' of https://github.com/malcomio/reveal.js into dev 2017-02-20 11:41:31 +01:00
Hakim El Hattab
5565d08612 note about deploying multiplex server with now #1830 2017-02-20 11:37:18 +01:00
Malcolm Young
95bca847d6 correct config name in README 2017-02-17 15:19:15 +00:00
Malcolm Young
da23d682c6 allow configuration of which view slide number appears on - fixes #1791 2017-02-17 15:08:57 +00:00
Hakim El Hattab
1cee8998a0 fix overview rendering issues in latest chrome #1649 2017-02-17 10:50:52 +01:00
Hakim El Hattab
fa70a7a517 phantom export throws error if reveal.js isn't present 2017-02-15 11:43:57 +01:00
Hakim El Hattab
bef8109506 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-02-15 11:19:25 +01:00
Hakim El Hattab
a349ff43c5 new phantom pdf export script that works with 3.4.0 #1815 2017-02-15 11:19:02 +01:00
Hakim El Hattab
313a23ba2b merge autoplay conflict #1771 2017-02-14 14:51:43 +01:00
Hakim El Hattab
909efab7df fix readme conflict 2017-02-14 14:42:22 +01:00
Hakim El Hattab
bc1ca1a58a updated pdf docs 2017-02-14 14:40:12 +01:00
Hakim El Hattab
2f54af4614 update readme re: pdf exports #1823 2017-02-14 14:38:57 +01:00
Hakim El Hattab
8b97ff3126 Merge pull request #1823 from gilxa1226/master
Update to README.md for PDF printing
2017-02-14 14:25:55 +01:00
Hakim El Hattab
5ad66f3779 docs for #1816 and remove showHelp 2017-02-09 11:37:47 +01:00
Hakim El Hattab
1749f0d019 Merge pull request #1816 from Frazer/patch-1
added toggleHelp function
2017-02-09 11:31:00 +01:00
Hakim El Hattab
adc326139a update deserialize regex to work with decimals 2017-02-08 12:56:51 +01:00
Frazer Kirkman
2a1303f3c1 added override parameter to toggleHelp function 2017-02-07 19:53:58 +01:00
gilxa1226
d7b34b6e0f Update README.md to include block for pdf printing 2017-02-07 07:44:52 -05:00
gilxa1226
bcfb65658f Update README.md 2017-02-07 07:43:41 -05:00
Frazer Kirkman
bede9a22e8 added toggleHelp function
this way a key can be given ability to toggleHelp on and off.  Previously Reveal.showHelp could open the help screen, but no way to close it.
2017-02-05 18:42:59 +01:00
Hakim El Hattab
9f99ac8b84 adjust comment for display config value #1325 2017-02-02 10:47:39 +01:00
Hakim El Hattab
8a0dca2ba0 Merge branch 'issue-1324' of https://github.com/mojavelinux/reveal.js into dev 2017-02-02 10:42:21 +01:00
Hakim El Hattab
cc43ff21ef Merge branch 'master' of https://github.com/Bramas/reveal.js into dev 2017-02-01 11:13:40 +01:00
Hakim El Hattab
2c9e226fab warning about cube/page being deprecated #1774 2017-02-01 10:33:50 +01:00
Hakim El Hattab
f496613dd3 improved fragment notes support #1636 2017-01-31 17:08:08 +01:00
Hakim El Hattab
c49f76d271 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-01-31 16:48:55 +01:00
Hakim El Hattab
1413cbc1a9 Merge pull request #1636 from traff/master
For a fragment: allow to show a separate note defined in it
2017-01-31 16:47:29 +01:00
Hakim El Hattab
dc159f2825 Merge pull request #1644 from rajgoel/dev
Turn off preview links locally
2017-01-31 16:45:07 +01:00
Hakim El Hattab
7daa0e04de make background videos work on ipad #1778 2017-01-31 16:24:06 +01:00
Hakim El Hattab
981a8b98e4 Merge pull request #1728 from opdavies/sass-extension
support .sass themes
2017-01-31 15:49:51 +01:00
Hakim El Hattab
581da02def Merge pull request #1764 from demoneaux/package-json
Shift `dependencies` to `devDependencies`.
2017-01-31 15:11:38 +01:00
Hakim El Hattab
eada86c8fd recommend using textarea wrapper for inline markdown #1780 2017-01-31 15:07:03 +01:00
Hakim El Hattab
02a6b0515e fix markdown typo, update comment #1780 2017-01-31 15:02:59 +01:00
Hakim El Hattab
37f3da6095 Merge branch 'patch-2' of https://github.com/ccqgithub/reveal.js into dev 2017-01-31 15:02:26 +01:00
Hakim El Hattab
3617eaccb6 note about showNotes in PDF exports #1800 2017-01-30 14:50:17 +01:00
Hakim El Hattab
fa01fa366a typo 2017-01-30 14:38:14 +01:00
Hakim El Hattab
c018d04197 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-01-30 14:33:52 +01:00
Hakim El Hattab
3bcd167ce9 Merge pull request #1803 from bitjson/patch-1
correct grunt option usage
2017-01-30 14:20:41 +01:00
Hakim El Hattab
cd36c9274f Merge branch 'master' of github.com:hakimel/reveal.js into dev 2017-01-25 11:01:40 +01:00
Hakim El Hattab
9f8e4d5742 3.4.1 2017-01-25 10:51:25 +01:00
Hakim El Hattab
953d302f8b adjust pdf margins instead of heights to fix #1804 2017-01-25 10:46:03 +01:00
Hakim El Hattab
84202fa072 adjust pdf margins instead of heights to fix #1804 2017-01-25 10:43:26 +01:00
Hakim El Hattab
d9dcff1503 additional fix for empty pages in pdf exports #1804 2017-01-24 15:29:34 +01:00
Hakim El Hattab
286b69b61f fix empty pages in pdf exports (closes #1804) 2017-01-24 15:29:27 +01:00
Hakim El Hattab
934c2e9730 additional fix for empty pages in pdf exports #1804 2017-01-24 15:27:37 +01:00
Hakim El Hattab
d4133f0160 fix empty pages in pdf exports (closes #1804) 2017-01-24 14:48:36 +01:00
Jason Dreyzehner
e3ca5e84a3 correct grunt option usage 2017-01-23 21:26:33 -05:00
Hakim El Hattab
a6ecbfa732 merge info links in index 2017-01-23 11:23:45 +01:00
Hakim El Hattab
08e6cc5a3c Merge pull request #1794 from pkubowicz/index-history
Remove 'history: true' from index.html
2017-01-23 11:16:48 +01:00
Hakim El Hattab
cb16f27dd3 Merge pull request #1768 from demoneaux/background-images
Allow background images without protocols to have query hashes/parameters.
2017-01-23 11:11:28 +01:00
Hakim El Hattab
e8164c1392 2017 2017-01-20 10:35:01 +01:00
Hakim El Hattab
20238ee1d6 make backgrounds (iframes) interactive when the foreground is empty 2017-01-19 12:16:30 +01:00
Hakim El Hattab
98de9327a7 remove unused argument 2017-01-19 12:08:28 +01:00
Hakim El Hattab
941b86b6c3 works with video, defaults to (same as for images) 2017-01-18 10:43:29 +01:00
Hakim El Hattab
84090b882f fix race condition by updating backgrounds after slide visibility 2017-01-17 18:37:43 +01:00
Hakim El Hattab
f9e5467000 prevent autoplaying backgrounds from playing if slide is hidden 2017-01-17 13:19:10 +01:00
Hakim El Hattab
a38207f1d7 wait for in-slide video/audio to load before playing, reuse same autoplay logic for slide backgrounds 2017-01-16 16:11:20 +01:00
Piotr Kubowicz
4afd854037 Remove 'history: true' from index.html
Readme says the default is 'history: false', so it may be surprising
for users - it's easy to miss the contradicting setting in index.html
2017-01-15 16:35:31 +01:00
Hakim El Hattab
568c7516f7 fix unclosed code block 2017-01-10 14:43:47 +01:00
Hakim El Hattab
fb8414f4cb 3.4.0 2017-01-10 13:47:33 +01:00
Hakim El Hattab
a144134b42 Merge branch 'dev' of github.com:hakimel/reveal.js 2017-01-10 13:45:52 +01:00
Season Chen
5f76234566 support complex markdown
support <textarea data-template> `some code` </textarea>
2016-12-23 13:08:23 +08:00
Hakim El Hattab
97bb6e9b58 fragments inherit visibility to avoid conflicts with parent slide visibility 2016-12-15 14:06:17 +01:00
Hakim El Hattab
f2bd9d2970 don't show error message while iframe fades in #1577 2016-12-13 16:16:51 +01:00
Hakim El Hattab
001d4d94d3 Merge branch 'add-refused-to-display-tips-to-link-preview' of https://github.com/Huxpro/reveal.js into dev 2016-12-13 15:57:43 +01:00
Hakim El Hattab
40c4db1e04 always use lowercase reveal.js 2016-12-13 15:52:34 +01:00
Hakim El Hattab
63d3b59ab2 Merge pull request #1767 from demoneaux/readme
Add note about head.js to readme.
2016-12-13 15:50:30 +01:00
Markku Roponen
962c6c133b #1770, set 'data-paused-by-reveal' attribute only for the media elements, which are not already in paused state. 2016-12-13 16:02:26 +02:00
Markku Roponen
da40eafccd #1770, added second argument for setAttribute 2016-12-12 16:44:24 +02:00
Markku Roponen
54bfad62d7 #1770, fixed function name. 2016-12-12 16:41:52 +02:00
Markku Roponen
6831f6c174 #1770, resume playback for paused media. 2016-12-12 16:30:07 +02:00
Benjamin Tan
441a26cf90 Allow background images without protocols to have query hashes/parameters.
Closes #1603.
2016-12-11 18:14:02 +08:00
Benjamin Tan
4d0f1adc40 Add note about head.js to readme.
Closes #1569.
2016-12-11 16:29:07 +08:00
Benjamin Tan
90b301d0a0 Enable passing options for parsing Markdown.
Closes #1163, #1495.
2016-12-08 17:41:55 +08:00
Benjamin Tan
22de402888 Shift dependencies to devDependencies.
The `reveal.js` npm module is typically installed to access the CSS/JS
assets for Reveal.js. For those that want to run the plugins, they would
clone the whole repository. Hence, it doesn’t make sense to include
those as `dependencies`, which will increase download times.

Closes #1734.
2016-12-08 15:26:16 +08:00
Benjamin Tan
713702a0ab Reduce required Node.js version to 4.0.0.
The development workflow can be used with Node 4+, not just Node 6. We
should avoid showing warnings and errors when users are installing this
package via npm/yarn.

Ref. #1729, #1743.
Closes #1725.
2016-12-06 11:38:17 +01:00
Hakim El Hattab
2bd6b563be Merge pull request #1760 from demoneaux/package-json
Reduce required Node.js version to 4.0.0.
2016-12-06 11:37:31 +01:00
Benjamin Tan
03ac4a2e8e Reduce required Node.js version to 4.0.0.
The development workflow can be used with Node 4+, not just Node 6. We
should avoid showing warnings and errors when users are installing this
package via npm/yarn.

Ref. #1729, #1743.
Closes #1725.
2016-12-06 18:12:41 +08:00
Hakim El Hattab
e4e5cc1083 Merge pull request #1740 from christinakayastha/feature/printing-remove-slide-number
Hide slide number when in paper or pdf print view
2016-12-01 10:36:03 +01:00
Hakim El Hattab
f0dfb5b5e3 merge package version conflicts 2016-12-01 10:34:02 +01:00
Hakim El Hattab
b4d46d2b7c update dependencies to work with latest node #1743 2016-12-01 10:32:44 +01:00
Hakim El Hattab
3de1521a39 Merge pull request #1743 from haf/patch-1
Bump node engine in packages.json
2016-12-01 10:31:44 +01:00
Hakim El Hattab
e460b2bd4b Merge pull request #1747 from spencermathews/feature/readme-defaults-fix
Defaults in README are not current
2016-12-01 10:23:44 +01:00
Hakim El Hattab
67ac871397 Merge pull request #1757 from daanmichiels/correct-copyright
include contributors in (c)
2016-12-01 10:22:44 +01:00
Hakim El Hattab
775d510c2f Merge pull request #1756 from jmpp/better-data-trim
Implementing a better data-trim
2016-12-01 10:18:50 +01:00
Daan Michiels
785dbddd28 correct copyright message to include contributors 2016-11-25 12:36:57 -06:00
J.M. Cléry
35162c1f5e Better version of data-trim on code snippets 2016-11-22 23:42:21 +01:00
Spencer Mathews
21c1fafa52 Update README.md to reflect current defaults in js/reveal.js 2016-11-15 13:14:56 -08:00
Hakim El Hattab
19188205de add pdf-ready event; dispatched when the presentation is laid out and ready to print 2016-11-09 11:56:55 +01:00
Henrik Feldt
a8586b3ab3 Bump node engine in packages.json 2016-11-09 11:11:34 +01:00
Christi Kaes
80e28774dd Don't remove slide-number in pdf view 2016-10-30 14:11:10 -04:00
christikaes
659822a8b5 Hide slide number when in paper or pdf print view 2016-10-30 11:31:20 -04:00
Oliver Davies
b78cca5831 Support sass extension for custom themes 2016-10-16 09:53:19 +01:00
Hakim El Hattab
ca37d4e5b9 remove debug code 2016-10-12 13:21:22 +02:00
Hakim El Hattab
7547b893d4 fixes ff overview rendering bug #1649 2016-10-10 12:11:35 +02:00
Hakim El Hattab
e76855e257 remove unused dom lookup 2016-10-06 11:01:44 +02:00
Hakim El Hattab
0b9233cf4a attempt at fixing ff transition bug #1627 2016-10-05 14:00:40 +02:00
Hakim El Hattab
ce55d1a179 fix merge conflict for #1634 2016-10-05 12:21:21 +02:00
Hakim El Hattab
02f95f4de6 code format tweaks 2016-10-05 12:00:21 +02:00
Maarten Schroeven
7e99626b14 only use nodeType 1 and 3 (only relevant types) 2016-10-05 11:54:46 +02:00
Maarten Schroeven
ab33b31f0a limit text written to the status div 2016-10-05 11:54:46 +02:00
CH
2cf00254a1 renamed grunt 'base' option to 'root' (#1660)
* Allow slides to be served away from revealjs server location

The previous 'base' option conflicts with Grunt's 'base' option.
Changing it to 'root' avoids this. Further, updating to a newer Grunt
allows multiple parameters to be used. therefore `grunt serve --root="."
--root="pathtomyslides"` allows you to keep your slide content separate
from JS/CSS and such

* Live reload for relocated base

* Updated packages to match origin/dev

* Updated packages to match origin/dev

* Ensure root is an array
2016-10-05 11:45:37 +02:00
Hakim El Hattab
693a370f06 remove issue comment 2016-10-05 11:36:56 +02:00
Gerald
969885a7dc ignore delta=0 mousewheel event
fix #1607
2016-10-05 11:29:47 +02:00
Hakim El Hattab
0b6585bd44 prevent exception when initializing with no slides #1678 #1679 2016-10-05 11:23:41 +02:00
Jaiden Mispy
3c36ee6cff Add note to README about how to disable scaling 2016-10-05 11:16:41 +02:00
chadmorrow
ea8964ddbf autoSlide duration with playbackRate
The autoSlide duration of media elements with data-autoplay now takes the playbackRate of said media element into account when setting the duration so that autoSlide and the media element stay in sync.
2016-10-05 11:12:27 +02:00
Hakim El Hattab
255bde174c Merge branch 'r400-linux' of https://github.com/jroper/reveal.js into dev 2016-10-05 11:07:10 +02:00
James Roper
1301de9e39 Logitech R400 on Ubuntu blackout button support
On Ubuntu 16.04, the Logitech R400's blackout button gets mapped to 'v'
(keyCode 86). I don't know why this is, but since nothing else is
currently using 'v', this allows it to be supported out of the box.
2016-10-01 22:00:00 +10:00
Hakim El Hattab
ec76f4790c speaker layouts in server side notes plugin 2016-09-21 14:10:45 +02:00
Hakim El Hattab
da5709919b layout selector for speaker view; includes four options 2016-09-21 13:54:42 +02:00
Hakim El Hattab
79728e25cd autoplay support for content inside of fragments 2016-09-20 13:41:38 +02:00
Hakim El Hattab
bc4fc65da4 none/fade/slide transitions use flat transform style, prevents blurred content #1002 2016-08-01 09:15:34 +02:00
Asvin Goel
a652e0a8ea Allow switching off preview links
The data-preview-link=false tag can be used to switch off preview links
2016-07-21 12:15:07 +02:00
Asvin Goel
c1d94f1b60 Merge pull request #12 from hakimel/dev
Syncing to current version
2016-07-21 12:09:08 +02:00
Dmitry Trofimov
86a3f0276b For a fragment: allow to show a separate note defined in it
When a slide has several fragments it could be convenient to define a note for each of them. In this case we need to show only this specific note defined in a fragment and not others. General note of a slide shouldn't be also shown, as a more specific one should have greater relevance in this case.
2016-07-04 16:57:01 +02:00
Hakim El Hattab
304b0292be null computed style to avoid npe 2016-07-04 14:46:46 +02:00
Hakim El Hattab
ab2bb869a3 null check to avoid occasional npe 2016-07-04 13:32:03 +02:00
Hakim El Hattab
6447b59ac5 ready flag on .reveal container 2016-07-01 08:44:27 +02:00
Charles Grigg
59f3395c7f Update JSDocs and fix typos 2016-06-29 23:10:55 -04:00
Hakim El Hattab
541bcf2123 update dependencies based on retire.js info #1473 2016-06-28 15:48:09 +02:00
Hakim El Hattab
e7de1bd8b0 merge retire.js #1473 2016-06-28 15:43:11 +02:00
Hakim El Hattab
9639b53ff4 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2016-06-28 15:36:08 +02:00
Hakim El Hattab
8f47b17230 Merge pull request #1628 from davidjb/markdown-doc-fix
Detail markdown plugin attributes & defaults
2016-06-28 14:46:05 +02:00
Quentin Bramas
338a7b0ff9 add 'npm build' script that launch grunt 2016-06-28 14:31:37 +02:00
Hakim El Hattab
1da1ff0d6d use first fragment's data-autoslide value when there is no current fragment 2016-06-27 11:13:09 +02:00
Hakim El Hattab
65a90cc75d remove unused dom reference 2016-06-22 09:31:05 +02:00
Hakim El Hattab
e4634f20e8 revise simple.md so that slide 1.1 and 1.2 correctly break into separate slides 2016-06-22 09:24:09 +02:00
Hakim El Hattab
8d7ff10ce3 Merge branch 'bug/markdownSetOptions' of https://github.com/snowyu/reveal.js into dev 2016-06-22 09:20:24 +02:00
David Beitey
1fe20cb42a Detail markdown plugin attributes & defaults
Expands the details already given by highlighting the defaults for all attributes and clarifying what's required.
2016-06-22 15:10:31 +10:00
Hakim El Hattab
8d4cb810d6 move speaker notes into page container when printing pdf 2016-06-21 14:21:42 +02:00
Hakim El Hattab
bac187f3a0 request fullscreen on documentElement instead of body (#1621 #1624) 2016-06-21 11:33:07 +02:00
Hakim El Hattab
a12a17b2d7 request fullscreen on documentElement instead of body (#1621 #1624) 2016-06-21 11:30:12 +02:00
Hakim El Hattab
ce777e4c4b Revert "fix theme backgrounds in firefox fullscreen mode #1386"
This reverts commit b7e0d9b1c7.
2016-06-21 11:27:24 +02:00
Hakim El Hattab
b7e0d9b1c7 fix theme backgrounds in firefox fullscreen mode #1386 2016-06-20 10:27:04 +02:00
Hakim El Hattab
8162855d23 increase default font sizes, adjust config defaults for less margings and larger max scale #1605 2016-06-10 10:58:40 +02:00
Hakim El Hattab
6bfa48a667 prevent repeated initialization #1616 2016-06-10 10:41:16 +02:00
Hakim El Hattab
d78a8046dc Merge branch 'Timothep-master' into dev 2016-06-10 10:13:06 +02:00
Timothep
ad86772f20 Horizontal 2-1 View for the speaker notes instead of a vertical 1-2 2016-06-10 10:12:54 +02:00
Timothep
02123205a0 Added a description of the undocumented timer-reset feature 2016-06-10 10:12:54 +02:00
Hakim El Hattab
64aa3b2647 Merge branch 'master' of https://github.com/dhyegofernando/reveal.js into dev 2016-06-10 10:09:21 +02:00
Hakim El Hattab
ca92d22adc add showHelp to api #1611 2016-06-10 10:04:54 +02:00
Hakim El Hattab
7d6cc9f3ec Merge branch 'master' of github.com:hakimel/reveal.js into dev 2016-06-03 13:57:09 +02:00
Hakim El Hattab
c2997c605d text alignment 2016-06-03 13:56:52 +02:00
Hakim El Hattab
6b4bdd2c90 hdpi slides banner 2016-06-03 13:54:42 +02:00
Hakim El Hattab
f9ae4122f7 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2016-06-03 10:15:34 +02:00
Hakim El Hattab
904f9878d3 slides banner 2016-06-03 10:15:26 +02:00
Hakim El Hattab
4321266276 include layout for notes outside of pdf exports 2016-05-26 10:09:09 +02:00
Hakim El Hattab
3111d3b1ae support for 'separate-page' layout for notes in PDF exports #1518 2016-05-26 09:57:27 +02:00
Hakim El Hattab
e93afb7289 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2016-05-23 12:03:39 +02:00
Hakim El Hattab
a8c4109244 Update README.md
more in-depth documentation of slide backgrounds #1542
2016-05-23 11:59:29 +02:00
Hakim El Hattab
fd97d56894 Merge pull request #1537 from vincentbernat/fix/dark-background-simple-theme
make theme "simple" use white titles on dark backgrounds
2016-05-23 10:57:47 +02:00
Hakim El Hattab
9cd7f3f37b code format 2016-05-23 10:54:40 +02:00
Hakim El Hattab
884d3cd177 Merge pull request #1585 from jasonkiss/feature/disabled-buttons
set/remove @disabled on navigation buttons
2016-05-23 10:52:14 +02:00
Hakim El Hattab
e2fa1d966c ocd 2016-05-23 10:50:39 +02:00
Hakim El Hattab
2418a12cb9 Merge pull request #1586 from jasonkiss/feature/accessible-speaker-notes
make speaker notes keyboard accessible
2016-05-23 10:48:39 +02:00
Hakim El Hattab
6593ac3d5f moz selection color in theme template #1575 2016-05-23 10:38:46 +02:00
Hakim El Hattab
3483aacfa7 Merge pull request #1575 from aniqah/firefox-selection-colour
Add selection colour for Mozilla Firefox
2016-05-23 10:36:54 +02:00
Hakim El Hattab
2503b1a2e8 merge readme conflict #1595 2016-05-23 10:34:58 +02:00
Hakim El Hattab
c5c0290cca Merge branch 'patch-1' of https://github.com/tiagorg/reveal.js into dev 2016-05-23 10:28:32 +02:00
Tiago Garcia
187114f472 Removing duplicated "position" property at pdf.css
Found that by running css-lint on the code
2016-05-21 11:36:49 -07:00
Tristan Sokol
b79f1fac13 Add minor imporovements to the PDF export instructions 2016-05-19 16:47:25 -07:00
Jason Kiss
dec6d1745b make speaker notes keyboard accessible
Places div.speaker-notes in default kbd Tab order, and when focused,
prevent slide navigation with up/down arrows, allowing up/down arrow
keys to scroll div.speaker-notes.
2016-05-10 11:02:45 +12:00
Jason Kiss
fb8bbaac00 set/remove @disabled on navigation buttons
Keeps disabled buttons out of kbd tab order and indicates to assistive
tech like screen readers that button is disabled. Otherwise buttons
that aren’t enabled remain in kbd Tab order and screen readers announce
them as buttons, but they don’t work.
2016-05-10 10:03:05 +12:00
黄玄
e2a8634057 add refused-to-display tips in link-preview-overlay 2016-05-02 01:42:11 +08:00
Hakim El Hattab
2a79d054d4 Merge branch 'master' of github.com:hakimel/reveal.js into dev 2016-04-29 09:26:41 +02:00
Hakim El Hattab
3d49b1dea3 Merge pull request #1571 from adius/patch-1
Simplify full setup
2016-04-29 09:26:28 +02:00
Hakim El Hattab
ce7d494ae9 tweak formatting to match rest of slide 2016-04-29 09:25:05 +02:00
Hakim El Hattab
2d54bc6823 Merge pull request #1572 from jesstelford/zoom-content-size
More natural zooming on block level elements
2016-04-29 09:24:25 +02:00
Hakim El Hattab
9b11915c3a fix pdf bg layering, simplify code 2016-04-28 17:07:26 +02:00
Hakim El Hattab
5558103522 make max pages per slide limit configurable 2016-04-28 11:31:11 +02:00
Hakim El Hattab
fcb6ea8385 prevent pages from overflowing when printing to pdf 2016-04-28 11:16:36 +02:00
Aniqah Mair
d1a3656108 Add selection colour for Mozilla Firefox
Defines the highlight colour when selecting slide content using Mozilla
Firefox to match other browsers, instead of being the default colour.
2016-04-27 14:50:03 -04:00
Hakim El Hattab
66c4e6a77f use scrollHeight instead of custom measurement 2016-04-27 11:12:16 +02:00
Jess Telford
a0e6da6a9c More natural zooming on block level elements
Switching a `display: block` element to `display: inline-block` allows calculating the bounds based on the contents of the div rather than the entire container (which is often `width: 100%`).

This provides a much more natural zoom, especially for paragraphs and code examples.
2016-04-26 07:27:59 +10:00
Adrian Sieber
87b082340f Simplify full setup 2016-04-24 09:39:23 +00:00
Vincent Bernat
a9566dfbd4 make theme "simple" use white titles on dark backgrounds
This is similar to what is done in the "white" theme.
2016-03-24 16:25:01 +01:00
Dhyego Fernando
587d16ceef fix(PDF Export): Mark as important width, height and add zoom properties to fix CSS rules which were overrided by inline styles 2016-03-10 13:50:35 -04:00
Bjoern Kimminich
7621e1085d added retire.js to build process
-allows security vulnerability check in used npm-dependencies and own scripts
-execute with ```grunt retire```
2016-01-08 10:51:35 +01:00
Riceball LEE
16ebf2a783 * [bug] the markdown plugin can not render highlight codes for marked.setOptions(highlight) 2015-11-11 07:37:08 +00:00
Riceball LEE
6952931451 * update marked.js version to 0.3.5 2015-11-10 21:40:46 +00:00
Dan Allen
ccbc7ed6bc resolves #1324 allow display property to be configured
- allow display property apply to current slide to be configured
2015-08-07 23:04:23 -06:00
S Anand
ee98f13dd9 display .stretch images in overview mode 2015-04-02 21:04:00 +05:30
174 changed files with 22538 additions and 13119 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: [hakimel]

24
.github/workflows/js.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: tests
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [10.x, 14.x]
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm install
- run: npm run build --if-present
- run: npm test
env:
CI: true

3
.gitignore vendored
View File

@@ -9,5 +9,4 @@ log/*.log
tmp/**
node_modules/
.sass-cache
css/reveal.min.css
js/reveal.min.js
dist/*.map

7
.npmignore Normal file
View File

@@ -0,0 +1,7 @@
/test
/examples
.github
.gulpfile
.sass-cache
gulpfile.js
CONTRIBUTING.md

View File

@@ -1,5 +0,0 @@
language: node_js
node_js:
- 4.1.1
before_script:
- npm install -g grunt-cli

View File

@@ -1,176 +0,0 @@
/* global module:false */
module.exports = function(grunt) {
var port = grunt.option('port') || 8000;
var base = grunt.option('base') || '.';
// Project configuration
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
meta: {
banner:
'/*!\n' +
' * reveal.js <%= pkg.version %> (<%= grunt.template.today("yyyy-mm-dd, HH:MM") %>)\n' +
' * http://lab.hakim.se/reveal-js\n' +
' * MIT licensed\n' +
' *\n' +
' * Copyright (C) 2016 Hakim El Hattab, http://hakim.se\n' +
' */'
},
qunit: {
files: [ 'test/*.html' ]
},
uglify: {
options: {
banner: '<%= meta.banner %>\n'
},
build: {
src: 'js/reveal.js',
dest: 'js/reveal.min.js'
}
},
sass: {
core: {
files: {
'css/reveal.css': 'css/reveal.scss',
}
},
themes: {
files: [
{
expand: true,
cwd: 'css/theme/source',
src: ['*.scss'],
dest: 'css/theme',
ext: '.css'
}
]
}
},
autoprefixer: {
dist: {
src: 'css/reveal.css'
}
},
cssmin: {
compress: {
files: {
'css/reveal.min.css': [ 'css/reveal.css' ]
}
}
},
jshint: {
options: {
curly: false,
eqeqeq: true,
immed: true,
latedef: true,
newcap: true,
noarg: true,
sub: true,
undef: true,
eqnull: true,
browser: true,
expr: true,
globals: {
head: false,
module: false,
console: false,
unescape: false,
define: false,
exports: false
}
},
files: [ 'Gruntfile.js', 'js/reveal.js' ]
},
connect: {
server: {
options: {
port: port,
base: base,
livereload: true,
open: true
}
}
},
zip: {
'reveal-js-presentation.zip': [
'index.html',
'css/**',
'js/**',
'lib/**',
'images/**',
'plugin/**',
'**.md'
]
},
watch: {
js: {
files: [ 'Gruntfile.js', 'js/reveal.js' ],
tasks: 'js'
},
theme: {
files: [ 'css/theme/source/*.scss', 'css/theme/template/*.scss' ],
tasks: 'css-themes'
},
css: {
files: [ 'css/reveal.scss' ],
tasks: 'css-core'
},
html: {
files: [ '*.html']
},
markdown: {
files: [ '*.md' ]
},
options: {
livereload: true
}
}
});
// Dependencies
grunt.loadNpmTasks( 'grunt-contrib-qunit' );
grunt.loadNpmTasks( 'grunt-contrib-jshint' );
grunt.loadNpmTasks( 'grunt-contrib-cssmin' );
grunt.loadNpmTasks( 'grunt-contrib-uglify' );
grunt.loadNpmTasks( 'grunt-contrib-watch' );
grunt.loadNpmTasks( 'grunt-sass' );
grunt.loadNpmTasks( 'grunt-contrib-connect' );
grunt.loadNpmTasks( 'grunt-autoprefixer' );
grunt.loadNpmTasks( 'grunt-zip' );
// Default task
grunt.registerTask( 'default', [ 'css', 'js' ] );
// JS task
grunt.registerTask( 'js', [ 'jshint', 'uglify', 'qunit' ] );
// Theme CSS
grunt.registerTask( 'css-themes', [ 'sass:themes' ] );
// Core framework CSS
grunt.registerTask( 'css-core', [ 'sass:core', 'autoprefixer', 'cssmin' ] );
// All CSS
grunt.registerTask( 'css', [ 'sass', 'autoprefixer', 'cssmin' ] );
// Package presentation to archive
grunt.registerTask( 'package', [ 'default', 'zip' ] );
// Serve presentation locally
grunt.registerTask( 'serve', [ 'connect', 'watch' ] );
// Run tests
grunt.registerTask( 'test', [ 'jshint', 'qunit' ] );
};

View File

@@ -1,4 +1,4 @@
Copyright (C) 2016 Hakim El Hattab, http://hakim.se
Copyright (C) 2020 Hakim El Hattab, http://hakim.se, and reveal.js contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

1110
README.md

File diff suppressed because it is too large Load Diff

View File

@@ -1,27 +0,0 @@
{
"name": "reveal.js",
"version": "3.3.0",
"main": [
"js/reveal.js",
"css/reveal.css"
],
"homepage": "http://lab.hakim.se/reveal-js/",
"license": "MIT",
"description": "The HTML Presentation Framework",
"authors": [
"Hakim El Hattab <hakim.elhattab@gmail.com>"
],
"dependencies": {
"headjs": "~1.0.3"
},
"repository": {
"type": "git",
"url": "git://github.com/hakimel/reveal.js.git"
},
"ignore": [
"**/.*",
"node_modules",
"bower_components",
"test"
]
}

69
css/layout.scss Normal file
View File

@@ -0,0 +1,69 @@
/**
* Layout helpers.
*/
// Stretch an element vertically based on available space
.reveal .stretch,
.reveal .r-stretch {
max-width: none;
max-height: none;
}
.reveal pre.stretch code,
.reveal pre.r-stretch code {
height: 100%;
max-height: 100%;
box-sizing: border-box;
}
// Text that auto-fits it's container
.reveal .r-fit-text {
display: inline-block; // https://github.com/rikschennink/fitty#performance
white-space: nowrap;
}
// Stack multiple elements on top of each other
.reveal .r-stack {
display: grid;
}
.reveal .r-stack > * {
grid-area: 1/1;
margin: auto;
}
// Horizontal and vertical stacks
.reveal .r-vstack,
.reveal .r-hstack {
display: flex;
img, video {
min-width: 0;
min-height: 0;
object-fit: contain;
}
}
.reveal .r-vstack {
flex-direction: column;
align-items: center;
justify-content: center;
}
.reveal .r-hstack {
flex-direction: row;
align-items: center;
justify-content: center;
}
// 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 .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; }

View File

@@ -1,202 +0,0 @@
/* Default Print Stylesheet Template
by Rob Glazebrook of CSSnewbie.com
Last Updated: June 4, 2008
Feel free (nay, compelled) to edit, append, and
manipulate this file as you see fit. */
@media print {
/* SECTION 1: Set default width, margin, float, and
background. This prevents elements from extending
beyond the edge of the printed page, and prevents
unnecessary background images from printing */
html {
background: #fff;
width: auto;
height: auto;
overflow: visible;
}
body {
background: #fff;
font-size: 20pt;
width: auto;
height: auto;
border: 0;
margin: 0 5%;
padding: 0;
overflow: visible;
float: none !important;
}
/* SECTION 2: Remove any elements not needed in print.
This would include navigation, ads, sidebars, etc. */
.nestedarrow,
.controls,
.fork-reveal,
.share-reveal,
.state-background,
.reveal .progress,
.reveal .backgrounds {
display: none !important;
}
/* SECTION 3: Set body font face, size, and color.
Consider using a serif font for readability. */
body, p, td, li, div {
font-size: 20pt!important;
font-family: Georgia, "Times New Roman", Times, serif !important;
color: #000;
}
/* SECTION 4: Set heading font face, sizes, and color.
Differentiate your headings from your body text.
Perhaps use a large sans-serif for distinction. */
h1,h2,h3,h4,h5,h6 {
color: #000!important;
height: auto;
line-height: normal;
font-family: Georgia, "Times New Roman", Times, serif !important;
text-shadow: 0 0 0 #000 !important;
text-align: left;
letter-spacing: normal;
}
/* Need to reduce the size of the fonts for printing */
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; }
/* SECTION 5: Make hyperlinks more usable.
Ensure links are underlined, and consider appending
the URL to the end of the link for usability. */
a:link,
a:visited {
color: #000 !important;
font-weight: bold;
text-decoration: underline;
}
/*
.reveal a:link:after,
.reveal a:visited:after {
content: " (" attr(href) ") ";
color: #222 !important;
font-size: 90%;
}
*/
/* SECTION 6: more reveal.js specific additions by @skypanther */
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: 0;
text-align: left !important;
}
.reveal pre,
.reveal table {
margin-left: 0;
margin-right: 0;
}
.reveal pre code {
padding: 20px;
border: 1px solid #ddd;
}
.reveal blockquote {
margin: 20px 0;
}
.reveal .slides {
position: static !important;
width: auto !important;
height: auto !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
zoom: 1 !important;
overflow: visible !important;
display: block !important;
text-align: left !important;
-webkit-perspective: none;
-moz-perspective: none;
-ms-perspective: none;
perspective: none;
-webkit-perspective-origin: 50% 50%;
-moz-perspective-origin: 50% 50%;
-ms-perspective-origin: 50% 50%;
perspective-origin: 50% 50%;
}
.reveal .slides section {
visibility: visible !important;
position: static !important;
width: auto !important;
height: auto !important;
display: block !important;
overflow: visible !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 60px 20px !important;
z-index: auto !important;
opacity: 1 !important;
page-break-after: always !important;
-webkit-transform-style: flat !important;
-moz-transform-style: flat !important;
-ms-transform-style: flat !important;
transform-style: flat !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
-webkit-transition: none !important;
-moz-transition: none !important;
-ms-transition: none !important;
transition: none !important;
}
.reveal .slides section.stack {
padding: 0 !important;
}
.reveal section:last-of-type {
page-break-after: avoid !important;
}
.reveal section .fragment {
opacity: 1 !important;
visibility: visible !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
}
.reveal section img {
display: block;
margin: 15px 0px;
background: rgba(255,255,255,1);
border: 1px solid #666;
box-shadow: none;
}
.reveal section small {
font-size: 0.8em;
}
}

173
css/print/paper.scss Normal file
View File

@@ -0,0 +1,173 @@
/* Default Print Stylesheet Template
by Rob Glazebrook of CSSnewbie.com
Last Updated: June 4, 2008
Feel free (nay, compelled) to edit, append, and
manipulate this file as you see fit. */
@media print {
html:not(.print-pdf) {
background: #fff;
width: auto;
height: auto;
overflow: visible;
body {
background: #fff;
font-size: 20pt;
width: auto;
height: auto;
border: 0;
margin: 0 5%;
padding: 0;
overflow: visible;
float: none !important;
}
.nestedarrow,
.controls,
.fork-reveal,
.share-reveal,
.state-background,
.reveal .progress,
.reveal .backgrounds,
.reveal .slide-number {
display: none !important;
}
body, p, td, li {
font-size: 20pt!important;
color: #000;
}
h1,h2,h3,h4,h5,h6 {
color: #000!important;
height: auto;
line-height: normal;
text-align: left;
letter-spacing: normal;
}
/* Need to reduce the size of the fonts for printing */
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 {
color: #000 !important;
font-weight: bold;
text-decoration: underline;
}
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: 0;
text-align: left !important;
}
.reveal pre,
.reveal table {
margin-left: 0;
margin-right: 0;
}
.reveal pre code {
padding: 20px;
}
.reveal blockquote {
margin: 20px 0;
}
.reveal .slides {
position: static !important;
width: auto !important;
height: auto !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 0 !important;
zoom: 1 !important;
transform: none !important;
overflow: visible !important;
display: block !important;
text-align: left !important;
perspective: none;
perspective-origin: 50% 50%;
}
.reveal .slides section {
visibility: visible !important;
position: static !important;
width: auto !important;
height: auto !important;
display: block !important;
overflow: visible !important;
left: 0 !important;
top: 0 !important;
margin-left: 0 !important;
margin-top: 0 !important;
padding: 60px 20px !important;
z-index: auto !important;
opacity: 1 !important;
page-break-after: always !important;
transform-style: flat !important;
transform: none !important;
transition: none !important;
}
.reveal .slides section.stack {
padding: 0 !important;
}
.reveal section:last-of-type {
page-break-after: avoid !important;
}
.reveal section .fragment {
opacity: 1 !important;
visibility: visible !important;
transform: none !important;
}
.reveal section img {
display: block;
margin: 15px 0px;
background: rgba(255,255,255,1);
border: 1px solid #666;
box-shadow: none;
}
.reveal section small {
font-size: 0.8em;
}
.reveal .hljs {
max-height: 100%;
white-space: pre-wrap;
word-wrap: break-word;
word-break: break-word;
font-size: 15pt;
}
.reveal .hljs .hljs-ln-numbers {
white-space: nowrap;
}
.reveal .hljs td {
font-size: inherit !important;
color: inherit !important;
}
}
}

View File

@@ -1,160 +0,0 @@
/**
* This stylesheet is used to print reveal.js
* presentations to PDF.
*
* https://github.com/hakimel/reveal.js#pdf-export
*/
* {
-webkit-print-color-adjust: exact;
}
body {
margin: 0 auto !important;
border: 0;
padding: 0;
float: none !important;
overflow: visible;
}
html {
width: 100%;
height: 100%;
overflow: visible;
}
/* Remove any elements not needed in print. */
.nestedarrow,
.reveal .controls,
.reveal .progress,
.reveal .playback,
.reveal.overview,
.fork-reveal,
.share-reveal,
.state-background {
display: none !important;
}
h1, h2, h3, h4, h5, h6 {
text-shadow: 0 0 0 #000 !important;
}
.reveal pre code {
overflow: hidden !important;
font-family: Courier, 'Courier New', monospace !important;
}
ul, ol, div, p {
visibility: visible;
position: static;
width: auto;
height: auto;
display: block;
overflow: visible;
margin: auto;
}
.reveal {
width: auto !important;
height: auto !important;
overflow: hidden !important;
}
.reveal .slides {
position: static;
width: 100%;
height: auto;
left: auto;
top: auto;
margin: 0 !important;
padding: 0 !important;
overflow: visible;
display: block;
-webkit-perspective: none;
-moz-perspective: none;
-ms-perspective: none;
perspective: none;
-webkit-perspective-origin: 50% 50%; /* there isn't a none/auto value but 50-50 is the default */
-moz-perspective-origin: 50% 50%;
-ms-perspective-origin: 50% 50%;
perspective-origin: 50% 50%;
}
.reveal .slides section {
page-break-after: always !important;
visibility: visible !important;
position: relative !important;
display: block !important;
position: relative !important;
margin: 0 !important;
padding: 0 !important;
box-sizing: border-box !important;
min-height: 1px;
opacity: 1 !important;
-webkit-transform-style: flat !important;
-moz-transform-style: flat !important;
-ms-transform-style: flat !important;
transform-style: flat !important;
-webkit-transform: none !important;
-moz-transform: none !important;
-ms-transform: none !important;
transform: none !important;
}
.reveal section.stack {
margin: 0 !important;
padding: 0 !important;
page-break-after: avoid !important;
height: auto !important;
min-height: auto !important;
}
.reveal img {
box-shadow: none;
}
.reveal .roll {
overflow: visible;
line-height: 1em;
}
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
.reveal section .slide-background {
display: block !important;
position: absolute;
top: 0;
left: 0;
width: 100%;
z-index: -1;
}
/* All elements should be above the slide-background */
.reveal section>* {
position: relative;
z-index: 1;
}
/* Display slide speaker notes when 'showNotes' is enabled */
.reveal .speaker-notes-pdf {
display: block;
width: 100%;
max-height: none;
left: auto;
top: auto;
z-index: 100;
}
/* Display slide numbers when 'slideNumber' is enabled */
.reveal .slide-number-pdf {
display: block;
position: absolute;
font-size: 14px;
}

156
css/print/pdf.scss Normal file
View File

@@ -0,0 +1,156 @@
/**
* This stylesheet is used to print reveal.js
* presentations to PDF.
*
* https://revealjs.com/pdf-export/
*/
html.print-pdf {
* {
-webkit-print-color-adjust: exact;
}
& {
width: 100%;
height: 100%;
overflow: visible;
}
body {
margin: 0 auto !important;
border: 0;
padding: 0;
float: none !important;
overflow: visible;
}
/* Remove any elements not needed in print. */
.nestedarrow,
.reveal .controls,
.reveal .progress,
.reveal .playback,
.reveal.overview,
.state-background {
display: none !important;
}
.reveal pre code {
overflow: hidden !important;
font-family: Courier, 'Courier New', monospace !important;
}
.reveal {
width: auto !important;
height: auto !important;
overflow: hidden !important;
}
.reveal .slides {
position: static;
width: 100% !important;
height: auto !important;
zoom: 1 !important;
pointer-events: initial;
left: auto;
top: auto;
margin: 0 !important;
padding: 0 !important;
overflow: visible;
display: block;
perspective: none;
perspective-origin: 50% 50%;
}
.reveal .slides .pdf-page {
position: relative;
overflow: hidden;
z-index: 1;
page-break-after: always;
}
.reveal .slides section {
visibility: visible !important;
display: block !important;
position: absolute !important;
margin: 0 !important;
padding: 0 !important;
box-sizing: border-box !important;
min-height: 1px;
opacity: 1 !important;
transform-style: flat !important;
transform: none !important;
}
.reveal section.stack {
position: relative !important;
margin: 0 !important;
padding: 0 !important;
page-break-after: avoid !important;
height: auto !important;
min-height: auto !important;
}
.reveal img {
box-shadow: none;
}
/* Slide backgrounds are placed inside of their slide when exporting to PDF */
.reveal .backgrounds {
display: none;
}
.reveal .slide-background {
display: block !important;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: auto !important;
}
/* Display slide speaker notes when 'showNotes' is enabled */
.reveal.show-notes {
max-width: none;
max-height: none;
}
.reveal .speaker-notes-pdf {
display: block;
width: 100%;
height: auto;
max-height: none;
top: auto;
right: auto;
bottom: auto;
left: auto;
z-index: 100;
}
/* Layout option which makes notes appear on a separate page */
.reveal .speaker-notes-pdf[data-layout="separate-page"] {
position: relative;
color: inherit;
background-color: transparent;
padding: 20px;
page-break-after: always;
border: 0;
}
/* Display slide numbers when 'slideNumber' is enabled */
.reveal .slide-number-pdf {
display: block;
position: absolute;
font-size: 14px;
}
/* This accessibility tool is not useful in PDF and breaks it visually */
.aria-status {
display: none;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,10 @@
## Dependencies
Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment including the Grunt dependencies installed before proceding: https://github.com/hakimel/reveal.js#full-setup
Themes are written using Sass to keep things modular and reduce the need for repeated selectors across files. Make sure that you have the reveal.js development environment installed before proceeding: https://revealjs.com/installation/#full-setup
## 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 by Grunt from Sass to CSS (see the [Gruntfile](https://github.com/hakimel/reveal.js/blob/master/Gruntfile.js)) when you run `grunt css-themes`.
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 -- css-themes`.
Each theme file does four things in the following order:

View File

@@ -13,7 +13,7 @@
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
@@ -32,8 +32,10 @@ $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b
@include radial-gradient( rgba(247,242,211,1), rgba(255,255,255,1) );
}
// Change text colors against dark slide backgrounds
@include dark-bg-text-color(#fff);
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------
// ---------------------------------------------

View File

@@ -12,16 +12,16 @@
// Include theme-specific fonts
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
@import url(./fonts/source-sans-pro/source-sans-pro.css);
// Override theme settings (see ../template/settings.scss)
$backgroundColor: #222;
$backgroundColor: #191919;
$mainColor: #fff;
$headingColor: #fff;
$mainFontSize: 38px;
$mainFontSize: 42px;
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingTextShadow: none;
@@ -37,13 +37,10 @@ $heading2Size: 1.6em;
$heading3Size: 1.3em;
$heading4Size: 1.0em;
section.has-light-background {
&, h1, h2, h3, h4, h5, h6 {
color: #222;
}
}
// Change text colors against light slide backgrounds
@include light-bg-text-color(#222);
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------
// ---------------------------------------------

View File

@@ -28,7 +28,6 @@ $backgroundColor: $coal;
// Main text
$mainFont: Ubuntu, 'sans-serif';
$mainFontSize: 36px;
$mainColor: #eee;
// Headings
@@ -47,6 +46,9 @@ $linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: $blood;
$selectionColor: #fff;
// Change text colors against dark slide backgrounds
@include light-bg-text-color(#222);
// Theme template ------------------------------
@import "../template/theme";
@@ -59,6 +61,12 @@ $selectionColor: #fff;
text-shadow: 1px 1px $coal;
}
section.has-light-background {
p, h1, h2, h3, h4 {
text-shadow: none;
}
}
.reveal h1,
.reveal h2,
.reveal h3,

View File

@@ -15,7 +15,7 @@
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
// Override theme settings (see ../template/settings.scss)
@@ -27,8 +27,10 @@ $heading1TextShadow: 0 1px 0 #ccc, 0 2px 0 #c9c9c9, 0 3px 0 #bbb, 0 4px 0 #b9b9b
@include radial-gradient( rgba(28,30,32,1), rgba(85,90,95,1) );
}
// Change text colors against light slide backgrounds
@include light-bg-text-color(#222);
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------
// ---------------------------------------------

View File

@@ -12,7 +12,7 @@
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
@@ -50,7 +50,8 @@ $linkColor: $blue;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: $magenta;
// Change text colors against light slide backgrounds
@include light-bg-text-color(#222);
// Theme template ------------------------------
@import "../template/theme";

View File

@@ -27,7 +27,9 @@ $headingTextShadow: none;
$headingLetterSpacing: -0.03em;
$headingTextTransform: none;
$selectionBackgroundColor: #e7ad52;
$mainFontSize: 30px;
// Change text colors against light slide backgrounds
@include light-bg-text-color(#222);
// Theme template ------------------------------

View File

@@ -29,6 +29,9 @@ $selectionBackgroundColor: #26351C;
line-height: 1.3em;
}
// Change text colors against dark slide backgrounds
@include dark-bg-text-color(#fff);
// Theme template ------------------------------
@import "../template/theme";

View File

@@ -31,6 +31,8 @@ $linkColor: #00008B;
$linkColorHover: lighten( $linkColor, 20% );
$selectionBackgroundColor: rgba(0, 0, 0, 0.99);
// Change text colors against dark slide backgrounds
@include dark-bg-text-color(#fff);
// Theme template ------------------------------

View File

@@ -39,6 +39,9 @@ $selectionBackgroundColor: #134674;
@include radial-gradient( #add9e4, #f7fbfc );
}
// Change text colors against dark slide backgrounds
@include dark-bg-text-color(#fff);
// Theme template ------------------------------

View File

@@ -12,7 +12,7 @@
// Include theme-specific fonts
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);

View File

@@ -12,7 +12,7 @@
// Include theme-specific fonts
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
@import url(./fonts/source-sans-pro/source-sans-pro.css);
// Override theme settings (see ../template/settings.scss)
@@ -21,7 +21,7 @@ $backgroundColor: #fff;
$mainColor: #222;
$headingColor: #222;
$mainFontSize: 38px;
$mainFontSize: 42px;
$mainFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingFont: 'Source Sans Pro', Helvetica, sans-serif;
$headingTextShadow: none;
@@ -37,13 +37,10 @@ $heading2Size: 1.6em;
$heading3Size: 1.3em;
$heading4Size: 1.0em;
section.has-dark-background {
&, h1, h2, h3, h4, h5, h6 {
color: #fff;
}
}
// Change text colors against dark slide backgrounds
@include dark-bg-text-color(#fff);
// Theme template ------------------------------
@import "../template/theme";
// ---------------------------------------------
// ---------------------------------------------

View File

@@ -0,0 +1,27 @@
// Exposes theme's variables for easy re-use in CSS for plugin authors
:root {
--background-color: #{$backgroundColor};
--main-font: #{$mainFont};
--main-font-size: #{$mainFontSize};
--main-color: #{$mainColor};
--block-margin: #{$blockMargin};
--heading-margin: #{$headingMargin};
--heading-font: #{$headingFont};
--heading-color: #{$headingColor};
--heading-line-height: #{$headingLineHeight};
--heading-letter-spacing: #{$headingLetterSpacing};
--heading-text-transform: #{$headingTextTransform};
--heading-text-shadow: #{$headingTextShadow};
--heading-font-weight: #{$headingFontWeight};
--heading1-text-shadow: #{$heading1TextShadow};
--heading1-size: #{$heading1Size};
--heading2-size: #{$heading2Size};
--heading3-size: #{$heading3Size};
--heading4-size: #{$heading4Size};
--code-font: #{$codeFont};
--link-color: #{$linkColor};
--link-color-hover: #{$linkColorHover};
--selection-background-color: #{$selectionBackgroundColor};
--selection-color: #{$selectionColor};
}

View File

@@ -26,4 +26,20 @@
background: -o-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: -ms-radial-gradient( center, $type cover, $inner 0%, $outer 100% );
background: radial-gradient( center, $type cover, $inner 0%, $outer 100% );
}
@mixin light-bg-text-color( $color ) {
section.has-light-background {
&, h1, h2, h3, h4, h5, h6 {
color: $color;
}
}
}
@mixin dark-bg-text-color( $color ) {
section.has-dark-background {
&, h1, h2, h3, h4, h5, h6 {
color: $color;
}
}
}

View File

@@ -6,7 +6,7 @@ $backgroundColor: #2b2b2b;
// Primary/body text
$mainFont: 'Lato', sans-serif;
$mainFontSize: 36px;
$mainFontSize: 40px;
$mainColor: #eee;
// Vertical spacing between blocks of text
@@ -28,6 +28,8 @@ $heading2Size: 2.11em;
$heading3Size: 1.55em;
$heading4Size: 1.00em;
$codeFont: monospace;
// Links and actions
$linkColor: #13DAEC;
$linkColorHover: lighten( $linkColor, 20% );
@@ -40,4 +42,4 @@ $selectionColor: #fff;
// to return a background image or gradient
@mixin bodyBackground() {
background: $backgroundColor;
}
}

View File

@@ -4,7 +4,9 @@
* GLOBAL STYLES
*********************************************/
body {
@import "./exposer";
.reveal-viewport {
@include bodyBackground();
background-color: $backgroundColor;
}
@@ -16,14 +18,20 @@ body {
color: $mainColor;
}
::selection {
.reveal ::selection {
color: $selectionColor;
background: $selectionBackgroundColor;
text-shadow: none;
}
.reveal .slides>section,
.reveal .slides>section>section {
.reveal ::-moz-selection {
color: $selectionColor;
background: $selectionBackgroundColor;
text-shadow: none;
}
.reveal .slides section,
.reveal .slides section>section {
line-height: 1.3;
font-weight: inherit;
}
@@ -71,6 +79,16 @@ body {
line-height: 1.3;
}
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0;
}
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -128,11 +146,6 @@ body {
margin-left: 40px;
}
.reveal q,
.reveal blockquote {
quotes: none;
}
.reveal blockquote {
display: block;
position: relative;
@@ -161,15 +174,17 @@ body {
text-align: left;
font-size: 0.55em;
font-family: monospace;
font-family: $codeFont;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0,0,0,0.3);
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15);
}
.reveal code {
font-family: monospace;
font-family: $codeFont;
text-transform: none;
}
.reveal pre code {
@@ -214,9 +229,11 @@ body {
.reveal sup {
vertical-align: super;
font-size: smaller;
}
.reveal sub {
vertical-align: sub;
font-size: smaller;
}
.reveal small {
@@ -230,6 +247,10 @@ body {
vertical-align: top;
}
.reveal img {
margin: $blockMargin 0;
}
/*********************************************
* LINKS
@@ -238,14 +259,10 @@ body {
.reveal a {
color: $linkColor;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease;
transition: color .15s ease;
}
.reveal a:hover {
color: $linkColorHover;
text-shadow: none;
border: none;
}
@@ -257,74 +274,30 @@ body {
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255,255,255,0.12);
.reveal .r-frame {
border: 4px solid $mainColor;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15);
}
.reveal section img.plain {
border: 0;
box-shadow: none;
}
.reveal a .r-frame {
transition: all .15s linear;
}
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
transition: all .15s linear;
}
.reveal a:hover img {
background: rgba(255,255,255,0.2);
border-color: $linkColor;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
}
.reveal a:hover .r-frame {
border-color: $linkColor;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55);
}
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: $linkColor;
}
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: $linkColor;
}
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: $linkColor;
}
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: $linkColor;
}
.reveal .controls .navigate-left.enabled:hover {
border-right-color: $linkColorHover;
}
.reveal .controls .navigate-right.enabled:hover {
border-left-color: $linkColorHover;
}
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: $linkColorHover;
}
.reveal .controls .navigate-down.enabled:hover {
border-top-color: $linkColorHover;
.reveal .controls {
color: $linkColor;
}
@@ -334,13 +307,14 @@ body {
.reveal .progress {
background: rgba(0,0,0,0.2);
color: $linkColor;
}
.reveal .progress span {
background: $linkColor;
-webkit-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
-moz-transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
transition: width 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985);
}
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: $backgroundColor;
}
}

230
demo.html
View File

@@ -12,26 +12,14 @@
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/black.css" id="theme">
<link rel="stylesheet" href="dist/reset.css">
<link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/theme/black.css" id="theme">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="lib/css/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!--[if lt IE 9]>
<script src="lib/js/html5shiv.js"></script>
<![endif]-->
<link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
</head>
<body>
@@ -41,10 +29,12 @@
<!-- Any section element inside of this container is displayed as a slide -->
<div class="slides">
<section>
<h1>Reveal.js</h1>
<a href="https://revealjs.com">
<img src="https://static.slid.es/reveal/logo-v1/reveal-white-text.svg" alt="reveal.js logo" style="height: 180px; margin: 0 auto 4rem auto; background: transparent;" class="demo-logo">
</a>
<h3>The HTML Presentation Framework</h3>
<p>
<small>Created by <a href="http://hakim.se">Hakim El Hattab</a> / <a href="http://twitter.com/hakimel">@hakimel</a></small>
<small>Created by <a href="http://hakim.se">Hakim El Hattab</a> and <a href="https://github.com/hakimel/reveal.js/graphs/contributors">contributors</a></small>
</p>
</section>
@@ -63,7 +53,7 @@
<p>Use the <em>Space</em> key to navigate through all slides.</p>
<br>
<a href="#" class="navigate-down">
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
<img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow">
</a>
</section>
<section>
@@ -75,7 +65,7 @@
<p>That's it, time to go back up.</p>
<br>
<a href="#/2">
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Up arrow" style="transform: rotate(180deg); -webkit-transform: rotate(180deg);">
<img class="r-frame" style="background: rgba(255,255,255,0.1); transform: rotate(180deg);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Up arrow">
</a>
</section>
</section>
@@ -83,18 +73,103 @@
<section>
<h2>Slides</h2>
<p>
Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="http://slides.com" target="_blank">http://slides.com</a>.
Not a coder? Not a problem. There's a fully-featured visual editor for authoring these, try it out at <a href="https://slides.com" target="_blank">https://slides.com</a>.
</p>
</section>
<section data-visibility="hidden">
<h2>Hidden Slides</h2>
<p>
This slide is visible in the source, but hidden when the presentation is viewed. You can show all hidden slides by setting the `showHiddenSlides` config option to `true`.
</p>
</section>
<section data-auto-animate>
<h2 data-id="code-title">Pretty Code</h2>
<pre data-id="code-animation"><code class="hljs" data-trim data-line-numbers>
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
...
);
}
</code></pre>
<p>Code syntax highlighting courtesy of <a href="https://highlightjs.org/usage/">highlight.js</a>.</p>
</section>
<section data-auto-animate>
<h2 data-id="code-title">With animations</h2>
<pre data-id="code-animation"><code class="hljs" data-trim data-line-numbers="|4,8-11|17|22-24"><script type="text/template">
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
function SecondExample() {
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
</script></code></pre>
</section>
<section>
<h2>Point of View</h2>
<p>
Press <strong>ESC</strong> to enter the slide overview.
</p>
<p>
Hold down alt and click on any element to zoom in on it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Alt + click anywhere to zoom back out.
Hold down the <strong>alt</strong> key (<strong>ctrl</strong> in Linux) and click on any element to zoom towards it using <a href="http://lab.hakim.se/zoom-js">zoom.js</a>. Click again to zoom back out.
</p>
<p>
(NOTE: Use ctrl + click in Linux.)
</p>
</section>
<section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)">
<h2>Auto-Animate</h2>
<p>Automatically animate matching elements across slides with <a href="https://revealjs.com/auto-animate/">Auto-Animate</a>.</p>
<div class="r-hstack justify-center">
<div data-id="box1" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div>
<div data-id="box2" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div>
<div data-id="box3" style="background: #999; width: 50px; height: 50px; margin: 10px; border-radius: 5px;"></div>
</div>
</section>
<section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)">
<div class="r-hstack justify-center">
<div data-id="box1" data-auto-animate-delay="0" style="background: cyan; width: 150px; height: 100px; margin: 10px;"></div>
<div data-id="box2" data-auto-animate-delay="0.1" style="background: magenta; width: 150px; height: 100px; margin: 10px;"></div>
<div data-id="box3" data-auto-animate-delay="0.2" style="background: yellow; width: 150px; height: 100px; margin: 10px;"></div>
</div>
<h2 style="margin-top: 20px;">Auto-Animate</h2>
</section>
<section data-auto-animate data-auto-animate-easing="cubic-bezier(0.770, 0.000, 0.175, 1.000)">
<div class="r-stack">
<div data-id="box1" style="background: cyan; width: 300px; height: 300px; border-radius: 200px;"></div>
<div data-id="box2" style="background: magenta; width: 200px; height: 200px; border-radius: 200px;"></div>
<div data-id="box3" style="background: yellow; width: 100px; height: 100px; border-radius: 200px;"></div>
</div>
<h2 style="margin-top: 20px;">Auto-Animate</h2>
</section>
<section>
@@ -109,19 +184,24 @@
## Markdown support
Write content using inline or external Markdown.
Instructions and more info available in the [readme](https://github.com/hakimel/reveal.js#markdown).
Instructions and more info available in the [docs](https://revealjs.com/markdown/).
```
```[]
<section data-markdown>
## Markdown support
Write content using inline or external Markdown.
Instructions and more info available in the [readme](https://github.com/hakimel/reveal.js#markdown).
Instructions and more info available in the [docs](https://revealjs.com/markdown/).
</section>
```
</script>
</section>
<section>
<p>Add the <code>r-fit-text</code> class to auto-size text</p>
<h2 class="r-fit-text">FIT TEXT</h2>
</section>
<section>
<section id="fragments">
<h2>Fragments</h2>
@@ -139,8 +219,14 @@
<p class="fragment grow">grow</p>
<p class="fragment shrink">shrink</p>
<p class="fragment fade-out">fade-out</p>
<p class="fragment fade-up">fade-up (also down, left and right!)</p>
<p class="fragment current-visible">current-visible</p>
<p>
<span style="display: inline-block;" class="fragment fade-right">fade-right, </span>
<span style="display: inline-block;" class="fragment fade-up">up, </span>
<span style="display: inline-block;" class="fragment fade-down">down, </span>
<span style="display: inline-block;" class="fragment fade-left">left</span>
</p>
<p class="fragment fade-in-then-out">fade-in-then-out</p>
<p class="fragment fade-in-then-semi-out">fade-in-then-semi-out</p>
<p>Highlight <span class="fragment highlight-red">red</span> <span class="fragment highlight-blue">blue</span> <span class="fragment highlight-green">green</span></p>
</section>
</section>
@@ -184,21 +270,21 @@
Set <code>data-background="#dddddd"</code> on a slide to change the background color. All CSS color formats are supported.
</p>
<a href="#" class="navigate-down">
<img width="178" height="238" data-src="https://s3.amazonaws.com/hakim-static/reveal-js/arrow.png" alt="Down arrow">
<img class="r-frame" style="background: rgba(255,255,255,0.1);" width="178" height="238" data-src="https://static.slid.es/reveal/arrow.png" alt="Down arrow">
</a>
</section>
<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png">
<section data-background="https://static.slid.es/reveal/image-placeholder.png">
<h2>Image Backgrounds</h2>
<pre><code class="hljs">&lt;section data-background="image.png"&gt;</code></pre>
<pre><code class="hljs html">&lt;section data-background="image.png"&gt;</code></pre>
</section>
<section data-background="https://s3.amazonaws.com/hakim-static/reveal-js/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px">
<section data-background="https://static.slid.es/reveal/image-placeholder.png" data-background-repeat="repeat" data-background-size="100px">
<h2>Tiled Backgrounds</h2>
<pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
<pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background="image.png" data-background-repeat="repeat" data-background-size="100px"&gt;</code></pre>
</section>
<section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4,https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.webm" data-background-color="#000000">
<section data-background-video="https://s3.amazonaws.com/static.slid.es/site/homepage/v1/homepage-video-editor.mp4" data-background-color="#000000">
<div style="background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px;">
<h2>Video Backgrounds</h2>
<pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background-video="video.mp4,video.webm"&gt;</code></pre>
<pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-video="video.mp4,video.webm"&gt;</code></pre>
</div>
</section>
<section data-background="http://i.giphy.com/90F8aUepslB84.gif">
@@ -211,7 +297,7 @@
<p>
Different background transitions are available via the backgroundTransition option. This one's called "zoom".
</p>
<pre><code class="hljs">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre>
<pre><code class="hljs javascript">Reveal.configure({ backgroundTransition: 'zoom' })</code></pre>
</section>
<section data-transition="slide" data-background="#b5533c" data-background-transition="zoom">
@@ -219,28 +305,14 @@
<p>
You can override background transitions per-slide.
</p>
<pre><code class="hljs" style="word-wrap: break-word;">&lt;section data-background-transition="zoom"&gt;</code></pre>
<pre><code class="hljs html" style="word-wrap: break-word;">&lt;section data-background-transition="zoom"&gt;</code></pre>
</section>
<section>
<h2>Pretty Code</h2>
<pre><code class="hljs" data-trim contenteditable>
function linkify( selector ) {
if( supports3DTransforms ) {
var nodes = document.querySelectorAll( selector );
for( var i = 0, len = nodes.length; i &lt; len; i++ ) {
var node = nodes[i];
if( !node.className ) {
node.className += ' roll';
}
}
}
}
</code></pre>
<p>Code syntax highlighting courtesy of <a href="http://softwaremaniacs.org/soft/highlight/en/description/">highlight.js</a>.</p>
<section data-background-iframe="https://hakim.se" data-background-interactive>
<div style="position: absolute; width: 40%; right: 0; box-shadow: 0 1px 4px rgba(0,0,0,0.5), 0 5px 25px rgba(0,0,0,0.2); background-color: rgba(0, 0, 0, 0.9); color: #fff; padding: 20px; font-size: 20px; text-align: left;">
<h2>Iframe Backgrounds</h2>
<p>Since reveal.js runs on the web, you can easily embed other web content. Try interacting with the page in the background.</p>
</div>
</section>
<section>
@@ -295,8 +367,7 @@ function linkify( selector ) {
<section>
<h2>Clever Quotes</h2>
<p>
These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
&ldquo;The nice thing about standards is that there are so many to choose from&rdquo;</q> and block:
These guys come in two forms, inline: <q cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">The nice thing about standards is that there are so many to choose from</q> and block:
</p>
<blockquote cite="http://searchservervirtualization.techtarget.com/definition/Our-Favorite-Technology-Quotations">
&ldquo;For years there has been a theory that millions of monkeys typing at random on millions of typewriters would
@@ -314,7 +385,7 @@ function linkify( selector ) {
<section>
<h2>Speaker View</h2>
<p>There's a <a href="https://github.com/hakimel/reveal.js#speaker-notes">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p>
<p>There's a <a href="https://revealjs.com/speaker-view/">speaker view</a>. It includes a timer, preview of the upcoming slide as well as your speaker notes.</p>
<p>Press the <em>S</em> key to try it out.</p>
<aside class="notes">
@@ -324,7 +395,7 @@ function linkify( selector ) {
<section>
<h2>Export to PDF</h2>
<p>Presentations can be <a href="https://github.com/hakimel/reveal.js#pdf-export">exported to PDF</a>, here's an example:</p>
<p>Presentations can be <a href="https://revealjs.com/pdf-export/">exported to PDF</a>, here's an example:</p>
<iframe data-src="https://www.slideshare.net/slideshow/embed_code/42840540" width="445" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:3px solid #666; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe>
</section>
@@ -343,7 +414,7 @@ function linkify( selector ) {
Additionally custom events can be triggered on a per slide basis by binding to the <code>data-state</code> name.
</p>
<pre><code class="javascript" data-trim contenteditable style="font-size: 18px;">
Reveal.addEventListener( 'customevent', function() {
Reveal.on( 'customevent', function() {
console.log( '"customevent" has fired' );
} );
</code></pre>
@@ -360,17 +431,17 @@ Reveal.addEventListener( 'customevent', function() {
<h2>Much more</h2>
<ul>
<li>Right-to-left support</li>
<li><a href="https://github.com/hakimel/reveal.js#api">Extensive JavaScript API</a></li>
<li><a href="https://github.com/hakimel/reveal.js#auto-sliding">Auto-progression</a></li>
<li><a href="https://github.com/hakimel/reveal.js#parallax-background">Parallax backgrounds</a></li>
<li><a href="https://github.com/hakimel/reveal.js#keyboard-bindings">Custom keyboard bindings</a></li>
<li><a href="https://revealjs.com/api/">Extensive JavaScript API</a></li>
<li><a href="https://revealjs.com/auto-slide/">Auto-progression</a></li>
<li><a href="https://revealjs.com/backgrounds/#parallax-background">Parallax backgrounds</a></li>
<li><a href="https://revealjs.com/keyboard/">Custom keyboard bindings</a></li>
</ul>
</section>
<section style="text-align: left;">
<h1>THE END</h1>
<p>
- <a href="http://slides.com">Try the online editor</a> <br>
- <a href="https://slides.com">Try the online editor</a> <br>
- <a href="https://github.com/hakimel/reveal.js">Source code &amp; documentation</a>
</p>
</section>
@@ -379,29 +450,24 @@ Reveal.addEventListener( 'customevent', function() {
</div>
<script src="lib/js/head.min.js"></script>
<script src="js/reveal.js"></script>
<script src="dist/reveal.js"></script>
<script src="plugin/zoom/zoom.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/search/search.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
// More info https://github.com/hakimel/reveal.js#configuration
// Also available as an ES module, see:
// https://revealjs.com/initialization/
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
hash: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'plugin/zoom-js/zoom.js', async: true },
{ src: 'plugin/notes/notes.js', async: true }
]
// Learn about plugins: https://revealjs.com/plugins/
plugins: [ RevealZoom, RevealNotes, RevealSearch, RevealMarkdown, RevealHighlight ]
});
</script>

30
dist/reset.css vendored Normal file
View File

@@ -0,0 +1,30 @@
/* http://meyerweb.com/eric/tools/css/reset/
v4.0 | 20180602
License: none (public domain)
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
main, menu, nav, output, ruby, section, summary,
time, mark, audio, video {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, main, menu, nav, section {
display: block;
}

8
dist/reveal.css vendored Normal file

File diff suppressed because one or more lines are too long

9
dist/reveal.esm.js vendored Normal file

File diff suppressed because one or more lines are too long

9
dist/reveal.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -3,12 +3,40 @@
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #f7f3de;
--main-font: Lato, sans-serif;
--main-font-size: 40px;
--main-color: #333;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: League Gothic, Impact, sans-serif;
--heading-color: #333;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: normal;
--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: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #8b743d;
--link-color-hover: #c0a86e;
--selection-background-color: rgba(79, 64, 28, 0.99);
--selection-color: #fff; }
.reveal-viewport {
background: #f7f2d3;
background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3));
@@ -20,17 +48,22 @@ body {
.reveal {
font-family: "Lato", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #333; }
::selection {
.reveal ::selection {
color: #fff;
background: rgba(79, 64, 28, 0.99);
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: rgba(79, 64, 28, 0.99);
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -75,6 +108,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -121,10 +163,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -152,10 +190,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -191,10 +230,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -205,14 +246,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #8b743d;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -225,67 +267,35 @@ body {
background: #564826; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #333;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #8b743d;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #8b743d; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #8b743d; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #8b743d; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #8b743d; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #c0a86e; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #c0a86e; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #c0a86e; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #c0a86e; }
.reveal .controls {
color: #8b743d; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #8b743d; }
.reveal .progress span {
background: #8b743d;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #f7f3de; } }

View File

@@ -3,30 +3,60 @@
*
* By Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
@import url(./fonts/source-sans-pro/source-sans-pro.css);
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
background: #222;
background-color: #222; }
:root {
--background-color: #191919;
--main-font: Source Sans Pro, Helvetica, sans-serif;
--main-font-size: 42px;
--main-color: #fff;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Source Sans Pro, Helvetica, sans-serif;
--heading-color: #fff;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: 600;
--heading1-text-shadow: none;
--heading1-size: 2.5em;
--heading2-size: 1.6em;
--heading3-size: 1.3em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #42affa;
--link-color-hover: #8dcffc;
--selection-background-color: #bee4fd;
--selection-color: #fff; }
.reveal-viewport {
background: #191919;
background-color: #191919; }
.reveal {
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-size: 38px;
font-size: 42px;
font-weight: normal;
color: #fff; }
::selection {
.reveal ::selection {
color: #fff;
background: #bee4fd;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #bee4fd;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -71,6 +101,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -117,10 +156,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -148,10 +183,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -187,10 +223,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -201,14 +239,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #42affa;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -221,67 +260,35 @@ body {
background: #068de9; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #42affa;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #42affa; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #42affa; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #42affa; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #42affa; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #8dcffc; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #8dcffc; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #8dcffc; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #8dcffc; }
.reveal .controls {
color: #42affa; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #42affa; }
.reveal .progress span {
background: #42affa;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #191919; } }

View File

@@ -10,26 +10,59 @@
*
*/
@import url(https://fonts.googleapis.com/css?family=Ubuntu:300,700,300italic,700italic);
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #222;
--main-font: Ubuntu, sans-serif;
--main-font-size: 40px;
--main-color: #eee;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Ubuntu, sans-serif;
--heading-color: #eee;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: 2px 2px 2px #222;
--heading-font-weight: normal;
--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: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #a23;
--link-color-hover: #dd5566;
--selection-background-color: #a23;
--selection-color: #fff; }
.reveal-viewport {
background: #222;
background-color: #222; }
.reveal {
font-family: Ubuntu, "sans-serif";
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
.reveal ::selection {
color: #fff;
background: #a23;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #a23;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -74,6 +107,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -120,10 +162,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -151,10 +189,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -190,10 +229,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -204,14 +245,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #a23;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -224,75 +266,46 @@ body {
background: #6a1520; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #a23;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #a23; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #a23; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #a23; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #a23; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #dd5566; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #dd5566; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #dd5566; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #dd5566; }
.reveal .controls {
color: #a23; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #a23; }
.reveal .progress span {
background: #a23;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #222; } }
.reveal p {
font-weight: 300;
text-shadow: 1px 1px #222; }
section.has-light-background p, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4 {
text-shadow: none; }
.reveal h1,
.reveal h2,
.reveal h3,

View File

@@ -0,0 +1,10 @@
@font-face {
font-family: 'League Gothic';
src: url('./league-gothic.eot');
src: url('./league-gothic.eot?#iefix') format('embedded-opentype'),
url('./league-gothic.woff') format('woff'),
url('./league-gothic.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,39 @@
@font-face {
font-family: 'Source Sans Pro';
src: url('./source-sans-pro-regular.eot');
src: url('./source-sans-pro-regular.eot?#iefix') format('embedded-opentype'),
url('./source-sans-pro-regular.woff') format('woff'),
url('./source-sans-pro-regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('./source-sans-pro-italic.eot');
src: url('./source-sans-pro-italic.eot?#iefix') format('embedded-opentype'),
url('./source-sans-pro-italic.woff') format('woff'),
url('./source-sans-pro-italic.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('./source-sans-pro-semibold.eot');
src: url('./source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'),
url('./source-sans-pro-semibold.woff') format('woff'),
url('./source-sans-pro-semibold.ttf') format('truetype');
font-weight: 600;
font-style: normal;
}
@font-face {
font-family: 'Source Sans Pro';
src: url('./source-sans-pro-semibolditalic.eot');
src: url('./source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'),
url('./source-sans-pro-semibolditalic.woff') format('woff'),
url('./source-sans-pro-semibolditalic.ttf') format('truetype');
font-weight: 600;
font-style: italic;
}

View File

@@ -5,12 +5,40 @@
*
* Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #2b2b2b;
--main-font: Lato, sans-serif;
--main-font-size: 40px;
--main-color: #eee;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: League Gothic, Impact, sans-serif;
--heading-color: #eee;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: 0px 0px 6px rgba(0, 0, 0, 0.2);
--heading-font-weight: normal;
--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: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #13DAEC;
--link-color-hover: #71e9f4;
--selection-background-color: #FF5E99;
--selection-color: #fff; }
.reveal-viewport {
background: #1c1e20;
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20));
@@ -22,17 +50,22 @@ body {
.reveal {
font-family: "Lato", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
.reveal ::selection {
color: #fff;
background: #FF5E99;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #FF5E99;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -77,6 +110,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -123,10 +165,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -154,10 +192,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -193,10 +232,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -207,14 +248,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #13DAEC;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -227,67 +269,35 @@ body {
background: #0d99a5; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #13DAEC;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #13DAEC; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #13DAEC; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #13DAEC; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #13DAEC; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #71e9f4; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #71e9f4; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #71e9f4; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #71e9f4; }
.reveal .controls {
color: #13DAEC; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #13DAEC; }
.reveal .progress span {
background: #13DAEC;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #2b2b2b; } }

View File

@@ -2,7 +2,7 @@
* Solarized Dark theme for reveal.js.
* Author: Achim Staebler
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
@@ -11,26 +11,59 @@ html * {
color-profile: sRGB;
rendering-intent: auto; }
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #002b36;
--main-font: Lato, sans-serif;
--main-font-size: 40px;
--main-color: #93a1a1;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: League Gothic, Impact, sans-serif;
--heading-color: #eee8d5;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #268bd2;
--link-color-hover: #78b9e6;
--selection-background-color: #d33682;
--selection-color: #fff; }
.reveal-viewport {
background: #002b36;
background-color: #002b36; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #93a1a1; }
::selection {
.reveal ::selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -75,6 +108,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -121,10 +163,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -152,10 +190,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -191,10 +230,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -205,14 +246,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #268bd2;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -225,67 +267,35 @@ body {
background: #1a6091; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #93a1a1;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #268bd2;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #268bd2; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #268bd2; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #268bd2; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #268bd2; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #78b9e6; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #78b9e6; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #78b9e6; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #78b9e6; }
.reveal .controls {
color: #268bd2; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #268bd2; }
.reveal .progress span {
background: #268bd2;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #002b36; } }

View File

@@ -5,26 +5,59 @@
*/
@import url(https://fonts.googleapis.com/css?family=Montserrat:700);
@import url(https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic,700italic);
section.has-light-background, section.has-light-background h1, section.has-light-background h2, section.has-light-background h3, section.has-light-background h4, section.has-light-background h5, section.has-light-background h6 {
color: #222; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #111;
--main-font: Open Sans, sans-serif;
--main-font-size: 40px;
--main-color: #eee;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Montserrat, Impact, sans-serif;
--heading-color: #eee;
--heading-line-height: 1.2;
--heading-letter-spacing: -0.03em;
--heading-text-transform: none;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #e7ad52;
--link-color-hover: #f3d7ac;
--selection-background-color: #e7ad52;
--selection-color: #fff; }
.reveal-viewport {
background: #111;
background-color: #111; }
.reveal {
font-family: "Open Sans", sans-serif;
font-size: 30px;
font-size: 40px;
font-weight: normal;
color: #eee; }
::selection {
.reveal ::selection {
color: #fff;
background: #e7ad52;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #e7ad52;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -69,6 +102,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -115,10 +157,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -146,10 +184,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -185,10 +224,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -199,14 +240,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #e7ad52;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -219,67 +261,35 @@ body {
background: #d08a1d; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #eee;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #e7ad52;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #e7ad52; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #e7ad52; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #e7ad52; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #e7ad52; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #f3d7ac; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #f3d7ac; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #f3d7ac; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #f3d7ac; }
.reveal .controls {
color: #e7ad52; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #e7ad52; }
.reveal .progress span {
background: #e7ad52;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #111; } }

View File

@@ -7,26 +7,59 @@
.reveal a {
line-height: 1.3em; }
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #F0F1EB;
--main-font: Palatino Linotype, Book Antiqua, Palatino, FreeSerif, serif;
--main-font-size: 40px;
--main-color: #000;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Palatino Linotype, Book Antiqua, Palatino, FreeSerif, serif;
--heading-color: #383D3D;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: none;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #51483D;
--link-color-hover: #8b7c69;
--selection-background-color: #26351C;
--selection-color: #fff; }
.reveal-viewport {
background: #F0F1EB;
background-color: #F0F1EB; }
.reveal {
font-family: "Palatino Linotype", "Book Antiqua", Palatino, FreeSerif, serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #000; }
::selection {
.reveal ::selection {
color: #fff;
background: #26351C;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #26351C;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -71,6 +104,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -117,10 +159,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -148,10 +186,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -187,10 +226,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -201,14 +242,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #51483D;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -221,67 +263,35 @@ body {
background: #25211c; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #000;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #51483D;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #51483D; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #51483D; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #51483D; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #51483D; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #8b7c69; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #8b7c69; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #8b7c69; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #8b7c69; }
.reveal .controls {
color: #51483D; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #51483D; }
.reveal .progress span {
background: #51483D;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #F0F1EB; } }

View File

@@ -7,26 +7,59 @@
*/
@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);
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #fff;
--main-font: Lato, sans-serif;
--main-font-size: 40px;
--main-color: #000;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: News Cycle, Impact, sans-serif;
--heading-color: #000;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: none;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #00008B;
--link-color-hover: #0000f1;
--selection-background-color: rgba(0, 0, 0, 0.99);
--selection-color: #fff; }
.reveal-viewport {
background: #fff;
background-color: #fff; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #000; }
::selection {
.reveal ::selection {
color: #fff;
background: rgba(0, 0, 0, 0.99);
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: rgba(0, 0, 0, 0.99);
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -71,6 +104,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -117,10 +159,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -148,10 +186,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -187,10 +226,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -201,14 +242,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #00008B;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -221,67 +263,35 @@ body {
background: #00003f; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #000;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #00008B;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #00008B; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #00008B; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #00008B; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #00008B; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #0000f1; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #0000f1; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #0000f1; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #0000f1; }
.reveal .controls {
color: #00008B; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #00008B; }
.reveal .progress span {
background: #00008B;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fff; } }

View File

@@ -8,10 +8,38 @@
.reveal a {
line-height: 1.3em; }
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #f7fbfc;
--main-font: Open Sans, sans-serif;
--main-font-size: 40px;
--main-color: #333;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Quicksand, sans-serif;
--heading-color: #333;
--heading-line-height: 1.2;
--heading-letter-spacing: -0.08em;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #3b759e;
--link-color-hover: #74a7cb;
--selection-background-color: #134674;
--selection-color: #fff; }
.reveal-viewport {
background: #add9e4;
background: -moz-radial-gradient(center, circle cover, #f7fbfc 0%, #add9e4 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #f7fbfc), color-stop(100%, #add9e4));
@@ -23,17 +51,22 @@ body {
.reveal {
font-family: "Open Sans", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #333; }
::selection {
.reveal ::selection {
color: #fff;
background: #134674;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #134674;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -78,6 +111,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -124,10 +166,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -155,10 +193,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -194,10 +233,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -208,14 +249,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #3b759e;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -228,67 +270,35 @@ body {
background: #264c66; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #333;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #3b759e;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #3b759e; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #3b759e; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #3b759e; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #3b759e; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #74a7cb; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #74a7cb; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #74a7cb; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #74a7cb; }
.reveal .controls {
color: #3b759e; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #3b759e; }
.reveal .progress span {
background: #3b759e;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #f7fbfc; } }

View File

@@ -2,7 +2,7 @@
* Solarized Light theme for reveal.js.
* Author: Achim Staebler
*/
@import url(../../lib/font/league-gothic/league-gothic.css);
@import url(./fonts/league-gothic/league-gothic.css);
@import url(https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic);
/**
* Solarized colors by Ethan Schoonover
@@ -14,23 +14,53 @@ html * {
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #fdf6e3;
--main-font: Lato, sans-serif;
--main-font-size: 40px;
--main-color: #657b83;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: League Gothic, Impact, sans-serif;
--heading-color: #586e75;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: normal;
--heading1-text-shadow: none;
--heading1-size: 3.77em;
--heading2-size: 2.11em;
--heading3-size: 1.55em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #268bd2;
--link-color-hover: #78b9e6;
--selection-background-color: #d33682;
--selection-color: #fff; }
.reveal-viewport {
background: #fdf6e3;
background-color: #fdf6e3; }
.reveal {
font-family: "Lato", sans-serif;
font-size: 36px;
font-size: 40px;
font-weight: normal;
color: #657b83; }
::selection {
.reveal ::selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #d33682;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -75,6 +105,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -121,10 +160,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -152,10 +187,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -191,10 +227,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -205,14 +243,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #268bd2;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -225,67 +264,35 @@ body {
background: #1a6091; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #657b83;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #268bd2;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #268bd2; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #268bd2; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #268bd2; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #268bd2; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #78b9e6; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #78b9e6; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #78b9e6; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #78b9e6; }
.reveal .controls {
color: #268bd2; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #268bd2; }
.reveal .progress span {
background: #268bd2;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fdf6e3; } }

View File

@@ -3,30 +3,60 @@
*
* By Hakim El Hattab, http://hakim.se
*/
@import url(../../lib/font/source-sans-pro/source-sans-pro.css);
@import url(./fonts/source-sans-pro/source-sans-pro.css);
section.has-dark-background, section.has-dark-background h1, section.has-dark-background h2, section.has-dark-background h3, section.has-dark-background h4, section.has-dark-background h5, section.has-dark-background h6 {
color: #fff; }
/*********************************************
* GLOBAL STYLES
*********************************************/
body {
:root {
--background-color: #fff;
--main-font: Source Sans Pro, Helvetica, sans-serif;
--main-font-size: 42px;
--main-color: #222;
--block-margin: 20px;
--heading-margin: 0 0 20px 0;
--heading-font: Source Sans Pro, Helvetica, sans-serif;
--heading-color: #222;
--heading-line-height: 1.2;
--heading-letter-spacing: normal;
--heading-text-transform: uppercase;
--heading-text-shadow: none;
--heading-font-weight: 600;
--heading1-text-shadow: none;
--heading1-size: 2.5em;
--heading2-size: 1.6em;
--heading3-size: 1.3em;
--heading4-size: 1em;
--code-font: monospace;
--link-color: #2a76dd;
--link-color-hover: #6ca0e8;
--selection-background-color: #98bdef;
--selection-color: #fff; }
.reveal-viewport {
background: #fff;
background-color: #fff; }
.reveal {
font-family: "Source Sans Pro", Helvetica, sans-serif;
font-size: 38px;
font-size: 42px;
font-weight: normal;
color: #222; }
::selection {
.reveal ::selection {
color: #fff;
background: #98bdef;
text-shadow: none; }
.reveal .slides > section,
.reveal .slides > section > section {
.reveal ::-moz-selection {
color: #fff;
background: #98bdef;
text-shadow: none; }
.reveal .slides section,
.reveal .slides section > section {
line-height: 1.3;
font-weight: inherit; }
@@ -71,6 +101,15 @@ body {
margin: 20px 0;
line-height: 1.3; }
/* Remove trailing margins after titles */
.reveal h1:last-child,
.reveal h2:last-child,
.reveal h3:last-child,
.reveal h4:last-child,
.reveal h5:last-child,
.reveal h6:last-child {
margin-bottom: 0; }
/* Ensure certain elements are never larger than the slide itself */
.reveal img,
.reveal video,
@@ -117,10 +156,6 @@ body {
.reveal dd {
margin-left: 40px; }
.reveal q,
.reveal blockquote {
quotes: none; }
.reveal blockquote {
display: block;
position: relative;
@@ -148,10 +183,11 @@ body {
font-family: monospace;
line-height: 1.2em;
word-wrap: break-word;
box-shadow: 0px 0px 6px rgba(0, 0, 0, 0.3); }
box-shadow: 0px 5px 15px rgba(0, 0, 0, 0.15); }
.reveal code {
font-family: monospace; }
font-family: monospace;
text-transform: none; }
.reveal pre code {
display: block;
@@ -187,10 +223,12 @@ body {
border-bottom: none; }
.reveal sup {
vertical-align: super; }
vertical-align: super;
font-size: smaller; }
.reveal sub {
vertical-align: sub; }
vertical-align: sub;
font-size: smaller; }
.reveal small {
display: inline-block;
@@ -201,14 +239,15 @@ body {
.reveal small * {
vertical-align: top; }
.reveal img {
margin: 20px 0; }
/*********************************************
* LINKS
*********************************************/
.reveal a {
color: #2a76dd;
text-decoration: none;
-webkit-transition: color .15s ease;
-moz-transition: color .15s ease;
transition: color .15s ease; }
.reveal a:hover {
@@ -221,67 +260,35 @@ body {
background: #1a53a1; }
/*********************************************
* IMAGES
* Frame helper
*********************************************/
.reveal section img {
margin: 15px 0px;
background: rgba(255, 255, 255, 0.12);
.reveal .r-frame {
border: 4px solid #222;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); }
.reveal section img.plain {
border: 0;
box-shadow: none; }
.reveal a img {
-webkit-transition: all .15s linear;
-moz-transition: all .15s linear;
.reveal a .r-frame {
transition: all .15s linear; }
.reveal a:hover img {
background: rgba(255, 255, 255, 0.2);
.reveal a:hover .r-frame {
border-color: #2a76dd;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.55); }
/*********************************************
* NAVIGATION CONTROLS
*********************************************/
.reveal .controls .navigate-left,
.reveal .controls .navigate-left.enabled {
border-right-color: #2a76dd; }
.reveal .controls .navigate-right,
.reveal .controls .navigate-right.enabled {
border-left-color: #2a76dd; }
.reveal .controls .navigate-up,
.reveal .controls .navigate-up.enabled {
border-bottom-color: #2a76dd; }
.reveal .controls .navigate-down,
.reveal .controls .navigate-down.enabled {
border-top-color: #2a76dd; }
.reveal .controls .navigate-left.enabled:hover {
border-right-color: #6ca0e8; }
.reveal .controls .navigate-right.enabled:hover {
border-left-color: #6ca0e8; }
.reveal .controls .navigate-up.enabled:hover {
border-bottom-color: #6ca0e8; }
.reveal .controls .navigate-down.enabled:hover {
border-top-color: #6ca0e8; }
.reveal .controls {
color: #2a76dd; }
/*********************************************
* PROGRESS BAR
*********************************************/
.reveal .progress {
background: rgba(0, 0, 0, 0.2); }
background: rgba(0, 0, 0, 0.2);
color: #2a76dd; }
.reveal .progress span {
background: #2a76dd;
-webkit-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
-moz-transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985);
transition: width 800ms cubic-bezier(0.26, 0.86, 0.44, 0.985); }
/*********************************************
* PRINT BACKGROUND
*********************************************/
@media print {
.backgrounds {
background-color: #fff; } }

View File

@@ -0,0 +1,2 @@
Source: https://freesound.org/people/fennelliott/sounds/379419/
License: CC0 (public domain)

BIN
examples/assets/beeping.wav Normal file

Binary file not shown.

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

176
examples/auto-animate.html Normal file
View File

@@ -0,0 +1,176 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Auto Animate</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/black.css" id="theme">
<link rel="stylesheet" href="../plugin/highlight/monokai.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section data-auto-animate data-auto-animate-unmatched="fade">
<h3>Auto-Animate Example</h3>
<p>This will fade out</p>
<img src="assets/image1.png" style="height: 100px;">
<pre data-id="code"><code data-line-numbers class="hljs" data-trim>
function Example() {
const [count, setCount] = useState(0);
}
</code></pre>
</section>
<section data-auto-animate data-auto-animate-unmatched="fade">
<h3>Auto-Animate Example</h3>
<p style="opacity: 0.2; margin-top: 100px;">This will fade out</p>
<p>This element is unmatched</p>
<img src="assets/image1.png" style="height: 150px;">
<pre data-id="code"><code data-line-numbers class="hljs" data-trim>
function Example() {
New line!
const [count, setCount] = useState(0);
}
</code></pre>
</section>
<section data-auto-animate>
<p data-id="text-props" style="background: #555; line-height: 1em; letter-spacing: 0em;">Line Height & Letter Spacing</p>
</section>
<section data-auto-animate>
<p data-id="text-props" style="background: #555; line-height: 3em; letter-spacing: 0.2em;">Line Height & Letter Spacing</p>
</section>
<section>
<section data-auto-animate>
<pre data-id="code"><code data-line-numbers class="hljs" data-trim>
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
return (
...
);
}
</code></pre>
</section>
<section data-auto-animate>
<pre data-id="code"><code data-line-numbers class="hljs" data-trim>
function Example() {
const [count, setCount] = useState(0);
return (
&lt;div&gt;
&lt;p&gt;You clicked {count} times&lt;/p&gt;
&lt;button onClick={() =&gt; setCount(count + 1)}&gt;
Click me
&lt;/button&gt;
&lt;/div&gt;
);
}
</code></pre>
</section>
<section data-auto-animate>
<pre data-id="code"><code data-line-numbers class="hljs" data-trim>
function Example() {
// A comment!
const [count, setCount] = useState(0);
return (
&lt;div&gt;
&lt;p&gt;You clicked {count} times&lt;/p&gt;
&lt;button onClick={() =&gt; setCount(count + 1)}&gt;
Click me
&lt;/button&gt;
&lt;/div&gt;
);
}
</code></pre>
</section>
</section>
<section>
<section data-auto-animate>
<h3>Swapping list items</h3>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</section>
<section data-auto-animate>
<h3>Swapping list items</h3>
<ul>
<li>Two</li>
<li>One</li>
<li>Three</li>
</ul>
</section>
<section data-auto-animate>
<h3>Swapping list items</h3>
<ul>
<li>Two</li>
<li>Three</li>
<li>One</li>
</ul>
</section>
</section>
<section data-auto-animate style="height: 600px">
<h3 style="opacity: 0.3; font-size: 18px;">SLIDE 1</h2>
<h2 data-id="title" style="margin-top: 260px;">Animate Anything</h2>
<div data-id="1" style="background: white; position: absolute; top: 150px; left: 16%; width: 60px; height: 60px;"></div>
<div data-id="2" style="background: white; position: absolute; top: 150px; left: 36%; width: 60px; height: 60px;"></div>
<div data-id="3" style="background: white; position: absolute; top: 150px; left: 56%; width: 60px; height: 60px;"></div>
<div data-id="4" style="background: white; position: absolute; top: 150px; left: 76%; width: 60px; height: 60px;"></div>
</section>
<section data-auto-animate style="height: 600px">
<h3 style="opacity: 0.3; font-size: 18px;">SLIDE 2</h2>
<h2 data-id="title" style="margin-top: 500px">With Auto Animate</h2>
<div data-id="1" style="background: cyan; position: absolute; bottom: 190px; left: 16%; width: 60px; height: 60px;"></div>
<div data-id="2" style="background: magenta; position: absolute; bottom: 190px; left: 36%; width: 60px; height: 160px;"></div>
<div data-id="3" style="background: yellow; position: absolute; bottom: 190px; left: 56%; width: 60px; height: 260px;"></div>
<div data-id="4" style="background: red; position: absolute; bottom: 190px; left: 76%; width: 60px; height: 360px;"></div>
</section>
<section data-auto-animate style="height: 600px">
<h3 style="opacity: 0.3; font-size: 18px;">SLIDE 3</h2>
<h2 data-id="title" style="margin-top: 500px; opacity: 0;">With Auto Animate</h2>
<div data-id="1" style="background: cyan; position: absolute; top: 50%; left: 50%; width: 400px; height: 400px; margin: -200px 0 0 -200px; border-radius: 400px;"></div>
<div data-id="2" style="background: magenta; position: absolute; top: 50%; left: 50%; width: 300px; height: 300px; margin: -150px 0 0 -150px; border-radius: 400px;"></div>
<div data-id="3" style="background: yellow; position: absolute; top: 50%; left: 50%; width: 200px; height: 200px; margin: -100px 0 0 -100px; border-radius: 400px;"></div>
<div data-id="4" style="background: red; position: absolute; top: 50%; left: 50%; width: 100px; height: 100px; margin: -50px 0 0 -50px; border-radius: 400px;"></div>
</section>
<section data-auto-animate style="height: 600px">
<h3 style="opacity: 0.3; font-size: 18px;">SLIDE 3</h2>
<h2 data-id="title" style="margin-top: 500px; opacity: 0;">With Auto Animate</h2>
<div data-id="1" style="background: red; position: absolute; top: 250px; left: 16%; width: 60px; height: 60px;"></div>
<div data-id="2" style="background: yellow; position: absolute; top: 250px; left: 36%; width: 60px; height: 60px;"></div>
<div data-id="3" style="background: magenta; position: absolute; top: 250px; left: 56%; width: 60px; height: 60px;"></div>
<div data-id="4" style="background: cyan; position: absolute; top: 250px; left: 76%; width: 60px; height: 60px;"></div>
</section>
</div>
</div>
<script src="../dist/reveal.js"></script>
<script src="../plugin/highlight/highlight.js"></script>
<script>
Reveal.initialize({
center: true,
hash: true,
plugins: [ RevealHighlight ]
});
</script>
</body>
</html>

View File

@@ -8,8 +8,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../../css/theme/serif.css" id="theme">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/serif.css" id="theme">
<style type="text/css" media="screen">
.slides section.has-dark-background,
.slides section.has-dark-background h2 {
@@ -122,16 +122,13 @@
</div>
<script src="../../lib/js/head.min.js"></script>
<script src="../../js/reveal.js"></script>
<script src="../dist/reveal.js"></script>
<script>
// Full list of configuration options available here:
// https://github.com/hakimel/reveal.js#configuration
// Full list of configuration options:
// https://revealjs.revealjs.com/config/
Reveal.initialize({
center: true,
// rtl: true,
transition: 'linear',
// transitionSpeed: 'slow',

View File

@@ -1,18 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Barebones</title>
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../dist/reveal.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
@@ -26,15 +21,11 @@
</section>
</div>
</div>
<script src="../../js/reveal.js"></script>
<script src="../dist/reveal.js"></script>
<script>
Reveal.initialize();
</script>
</body>

View File

@@ -0,0 +1,160 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Layout Helpers</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/white.css" id="theme">
<link rel="stylesheet" href="../plugin/highlight/monokai.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<h2>Layout Helper Examples</h2>
<ul>
<li><a href="#/fit-text">Big Text</a></li>
<li><a href="#/stretch">Stretch</a></li>
<li><a href="#/stack">Stack</a></li>
<li><a href="#/hstack">HStack</a></li>
<li><a href="#/vstack">VStack</a></li>
</ul>
</section>
<section id="fit-text">
<h2>Fit Text</h2>
<p>Resizes text to be as large as possible within its container.</p>
<pre><code class="html" data-trim data-line-numbers>
<h2 class="r-fit-text">FIT</h2>
</code></pre>
</section>
<section>
<h2 class="r-fit-text">FIT</h2>
</section>
<section>
<h2 class="r-fit-text">HELLO WORLD</h2>
<h2 class="r-fit-text">BOTH THESE TITLES USE FIT-TEXT</h2>
</section>
<section id="stretch">
<h2>Stretch</h2>
<p>Makes an element as tall as possible while remaining within the slide bounds.</p>
<pre><code class="html" data-trim data-line-numbers>
<h2>Stretch Example</h2>
<img src="assets/image2.png" class="r-stretch">
<p>Image byline</p>
</code></pre>
</section>
<section>
<h2>Stretch Example</h2>
<img src="assets/image2.png" class="r-stretch">
<p>Image byline</p>
</section>
<section id="stack">
<h2>Stack</h2>
<p>Stacks multiple elements on top of each other, for use with fragments.</p>
<pre><code class="html" data-trim data-line-numbers>
<div class="r-stack">
&lt;img class="fragment" width="450" height="300" src="..."&gt;
&lt;img class="fragment" width="300" height="450" src="..."&gt;
&lt;img class="fragment" width="400" height="400" src="..."&gt;
</div>
</code></pre>
</section>
<section>
<h2>Stack Example</h2>
<div class="r-stack">
<p class="fragment fade-in-then-out">One</p>
<p class="fragment fade-in-then-out">Two</p>
<p class="fragment fade-in-then-out">Three</p>
<p class="fragment fade-in-then-out">Four</p>
</div>
<div class="r-stack">
<img src="https://placekitten.com/450/300" width="450" height="300" class="fragment">
<img src="https://placekitten.com/300/450" width="300" height="450" class="fragment">
<img src="https://placekitten.com/400/400" width="400" height="400" class="fragment">
</div>
</section>
<section>
<h2>Stack Example</h2>
<p>fade-in-then-out fragments</p>
<div class="r-stack">
<img src="https://placekitten.com/450/300" width="450" height="300" class="fragment fade-in-then-out">
<img src="https://placekitten.com/300/450" width="300" height="450" class="fragment fade-in-then-out">
<img src="https://placekitten.com/400/400" width="400" height="400" class="fragment fade-in-then-out">
</div>
</section>
<section id="hstack">
<h2>HStack</h2>
<p>Stacks multiple elements horizontally.</p>
<pre><code class="html" data-trim data-line-numbers>
<div class="r-hstack">
&lt;img width="450" height="300" src="..."&gt;
&lt;img width="300" height="450" src="..."&gt;
&lt;img width="400" height="400" src="..."&gt;
</div>
</code></pre>
</section>
<section data-auto-animate>
<h2>HStack Example</h2>
<div class="r-hstack">
<p style="padding: 0.50em; background: #eee; margin: 0.25em">One</p>
<p style="padding: 0.75em; background: #eee; margin: 0.25em">Two</p>
<p style="padding: 1.00em; background: #eee; margin: 0.25em">Three</p>
</div>
</section>
<section id="vstack">
<h2>VStack</h2>
<p>Stacks multiple elements horizontally.</p>
<pre><code class="html" data-trim data-line-numbers>
<div class="r-vstack">
&lt;img width="450" height="300" src="..."&gt;
&lt;img width="300" height="450" src="..."&gt;
&lt;img width="400" height="400" src="..."&gt;
</div>
</code></pre>
</section>
<section data-auto-animate>
<h2>VStack Example</h2>
<div class="r-vstack">
<p style="padding: 0.50em; background: #eee; margin: 0.25em">One</p>
<p style="padding: 0.75em; background: #eee; margin: 0.25em">Two</p>
<p style="padding: 1.00em; background: #eee; margin: 0.25em">Three</p>
</div>
</section>
</div>
</div>
<script src="../dist/reveal.js"></script>
<script src="../plugin/highlight/highlight.js"></script>
<script>
Reveal.initialize({
center: true,
hash: true,
plugins: [ RevealHighlight ]
});
</script>
</body>
</html>

View File

@@ -4,12 +4,12 @@
<head>
<meta charset="utf-8">
<title>reveal.js - Markdown Demo</title>
<title>reveal.js - Markdown Example</title>
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../../css/theme/white.css" id="theme">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/white.css" id="theme">
<link rel="stylesheet" href="../../lib/css/zenburn.css">
<link rel="stylesheet" href="../plugin/highlight/monokai.css">
</head>
<body>
@@ -19,7 +19,7 @@
<div class="slides">
<!-- Use external markdown resource, separate slides by three newlines; vertical slides by two newlines -->
<section data-markdown="example.md" data-separator="^\n\n\n" data-separator-vertical="^\n\n"></section>
<section data-markdown="markdown.md" data-separator="^\n\n\n" data-separator-vertical="^\n\n"></section>
<!-- Slides are separated by three dashes (quick 'n dirty regular expression) -->
<section data-markdown data-separator="---">
@@ -88,7 +88,7 @@
<!-- Code -->
<section data-markdown>
<script type="text/template">
```php
```php [1|3-5]
public function foo()
{
$foo = array(
@@ -99,11 +99,20 @@
</script>
</section>
<!-- Images -->
<section data-markdown>
<script type="text/template">
![Sample image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png)
</script>
</section>
</div>
</div>
<script src="../../lib/js/head.min.js"></script>
<script src="../../js/reveal.js"></script>
<script src="../dist/reveal.js"></script>
<script src="../plugin/markdown/markdown.js"></script>
<script src="../plugin/highlight/highlight.js"></script>
<script src="../plugin/notes/notes.js"></script>
<script>
@@ -113,14 +122,7 @@
history: true,
center: true,
// Optional libraries used to extend on reveal.js
dependencies: [
{ src: '../../lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: '../highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: '../notes/notes.js' }
]
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
});
</script>

View File

@@ -29,3 +29,8 @@ Content 3.1
## External 3.2
Content 3.2
## External 3.3
![External Image](https://s3.amazonaws.com/static.slid.es/logo/v2/slides-symbol-512x512.png)

View File

@@ -8,8 +8,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../../css/theme/night.css" id="theme">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/night.css" id="theme">
</head>
<body>
@@ -82,6 +82,14 @@
\]
</section>
<section>
<h3>TeX Macros</h3>
Here is a common vector space:
\[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 &lt; +\infty}\]
used in functional analysis.
</section>
<section>
<section>
<h3>The Lorenz Equations</h3>
@@ -153,32 +161,40 @@
\]
</div>
</section>
<section>
<h3>TeX Macros</h3>
Here is a common vector space:
\[L^2(\R) = \set{u : \R \to \R}{\int_\R |u|^2 &lt; +\infty}\]
used in functional analysis.
</section>
</section>
</div>
</div>
<script src="../../lib/js/head.min.js"></script>
<script src="../../js/reveal.js"></script>
<script src="../dist/reveal.js"></script>
<script src="../plugin/math/math.js"></script>
<script>
Reveal.initialize({
history: true,
transition: 'linear',
math: {
// mathjax: 'http://cdn.mathjax.org/mathjax/latest/MathJax.js',
config: 'TeX-AMS_HTML-full'
// mathjax: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js',
config: 'TeX-AMS_HTML-full',
TeX: {
Macros: {
R: '\\mathbb{R}',
set: [ '\\left\\{#1 \\; ; \\; #2\\right\\}', 2 ]
}
}
},
dependencies: [
{ src: '../../lib/js/classList.js' },
{ src: '../../plugin/math/math.js', async: true }
]
plugins: [ RevealMath ]
});
</script>
</body>

75
examples/media.html Normal file
View File

@@ -0,0 +1,75 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Video, Audio and Iframes</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/white.css" id="theme">
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<h2>Examples of embedded Video, Audio and Iframes</h2>
</section>
<section>
<h2>Iframe</h2>
<iframe data-autoplay width="700" height="540" src="https://slides.com/news/auto-animate/embed" frameborder="0"></iframe>
</section>
<section data-background-iframe="https://www.youtube.com/embed/h1_nyI3z8gI" data-background-interactive>
<h2 style="color: #fff;">Iframe Background</h2>
</section>
<section>
<h2>Video</h2>
<video src="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4" data-autoplay></video>
</section>
<section data-background-video="http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4">
<h2>Background Video</h2>
</section>
<section>
<h2>Auto-playing audio</h2>
<audio src="assets/beeping.wav" data-autoplay></audio>
</section>
<section>
<h2>Audio inside slide fragments</h2>
<div class="fragment">
Beep 1
<audio src="assets/beeping.wav" data-autoplay></audio>
</div>
<div class="fragment">
Beep 2
<audio src="assets/beeping.wav" data-autoplay></audio>
</div>
</section>
<section>
<h2>Audio with controls</h2>
<audio src="assets/beeping.wav" controls></audio>
</section>
</div>
</div>
<script src="../dist/reveal.js"></script>
<script>
Reveal.initialize({hash: true});
</script>
</body>
</html>

View File

@@ -0,0 +1,102 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>reveal.js - Multiple Presentations</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/white.css" id="theme">
<link rel="stylesheet" href="../plugin/highlight/monokai.css">
</head>
<body style="background: #ddd;">
<div style="display: flex; flex-direction: row;">
<div class="reveal deck1" style="width: 100%; height: 50vh; margin: 10px;">
<div class="slides">
<section>Deck 1, Slide 1</section>
<section>Deck 1, Slide 2</section>
<section>
<pre data-id="code-animation"><code class="hljs" data-trim data-line-numbers>
import React, { useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
}
</code></pre>
</section>
</div>
</div>
<div class="reveal deck2" style="width: 100%; height: 50vh; margin: 10px;">
<div class="slides">
<section>Deck 2, Slide 1</section>
<section>Deck 2, Slide 2</section>
<section data-markdown>
<script type="text/template">
## Markdown plugin
- 1
- 2
- 3
</script>
</section>
<section>
<h3>The Lorenz Equations</h3>
\[\begin{aligned}
\dot{x} &amp; = \sigma(y-x) \\
\dot{y} &amp; = \rho x - y - xz \\
\dot{z} &amp; = -\beta z + xy
\end{aligned} \]
</section>
</div>
</div>
</div>
<style>
.reveal {
border: 4px solid #ccc;
}
.reveal.focused {
border-color: #94b5ff;
}
</style>
<script src="../dist/reveal.js"></script>
<script src="../plugin/highlight/highlight.js"></script>
<script src="../plugin/markdown/markdown.js"></script>
<script src="../plugin/math/math.js"></script>
<script>
let deck1 = new Reveal( document.querySelector( '.deck1' ), {
embedded: true,
progress: false,
keyboardCondition: 'focused',
plugins: [ RevealHighlight ]
} );
deck1.on( 'slidechanged', () => {
console.log( 'Deck 1 slide changed' );
} );
deck1.initialize();
let deck2 = new Reveal( document.querySelector( '.deck2' ), {
embedded: true,
progress: false,
keyboardCondition: 'focused',
plugins: [ RevealMarkdown, RevealMath ]
} );
deck2.initialize().then( () => {
deck2.slide(1);
} );
deck2.on( 'slidechanged', () => {
console.log( 'Deck 2 slide changed' );
} );
</script>
</body>
</html>

View File

@@ -6,8 +6,8 @@
<title>reveal.js - Slide Transitions</title>
<link rel="stylesheet" href="../../css/reveal.css">
<link rel="stylesheet" href="../../css/theme/white.css" id="theme">
<link rel="stylesheet" href="../dist/reveal.css">
<link rel="stylesheet" href="../dist/theme/white.css" id="theme">
<style type="text/css" media="screen">
.slides section.has-dark-background,
.slides section.has-dark-background h3 {
@@ -81,11 +81,8 @@
</div>
<script src="../../lib/js/head.min.js"></script>
<script src="../../js/reveal.js"></script>
<script src="../dist/reveal.js"></script>
<script>
Reveal.initialize({
center: true,
history: true,
@@ -94,7 +91,6 @@
// transitionSpeed: 'slow',
// backgroundTransition: 'slide'
});
</script>
</body>

291
gulpfile.js Normal file
View File

@@ -0,0 +1,291 @@
const pkg = require('./package.json')
const path = require('path')
const glob = require('glob')
const yargs = require('yargs')
const colors = require('colors')
const qunit = require('node-qunit-puppeteer')
const {rollup} = require('rollup')
const {terser} = require('rollup-plugin-terser')
const babel = require('@rollup/plugin-babel').default
const commonjs = require('@rollup/plugin-commonjs')
const resolve = require('@rollup/plugin-node-resolve').default
const gulp = require('gulp')
const tap = require('gulp-tap')
const zip = require('gulp-zip')
const sass = require('gulp-sass')
const header = require('gulp-header')
const eslint = require('gulp-eslint')
const minify = require('gulp-clean-css')
const connect = require('gulp-connect')
const autoprefixer = require('gulp-autoprefixer')
const root = yargs.argv.root || '.'
const port = yargs.argv.port || 8000
const banner = `/*!
* reveal.js ${pkg.version}
* ${pkg.homepage}
* MIT licensed
*
* Copyright (C) 2020 Hakim El Hattab, https://hakim.se
*/\n`
// Prevents warnings from opening too many test pages
process.setMaxListeners(20);
const babelConfig = {
babelHelpers: 'bundled',
ignore: ['node_modules'],
compact: false,
extensions: ['.js', '.html'],
plugins: [
'transform-html-import-to-string'
],
presets: [[
'@babel/preset-env',
{
corejs: 3,
useBuiltIns: 'usage',
modules: false
}
]]
};
// Our ES module bundle only targets newer browsers with
// module support. Browsers are targeted explicitly instead
// of using the "esmodule: true" target since that leads to
// polyfilling older browsers and a larger bundle.
const babelConfigESM = JSON.parse( JSON.stringify( babelConfig ) );
babelConfigESM.presets[0][1].targets = { browsers: [
'last 2 Chrome versions', 'not Chrome < 60',
'last 2 Safari versions', 'not Safari < 10.1',
'last 2 iOS versions', 'not iOS < 10.3',
'last 2 Firefox versions', 'not Firefox < 60',
'last 2 Edge versions', 'not Edge < 16',
] };
let cache = {};
// Creates a bundle with broad browser support, exposed
// as UMD
gulp.task('js-es5', () => {
return rollup({
cache: cache.umd,
input: 'js/index.js',
plugins: [
resolve(),
commonjs(),
babel( babelConfig ),
terser()
]
}).then( bundle => {
cache.umd = bundle.cache;
return bundle.write({
name: 'Reveal',
file: './dist/reveal.js',
format: 'umd',
banner: banner,
sourcemap: true
});
});
})
// Creates an ES module bundle
gulp.task('js-es6', () => {
return rollup({
cache: cache.esm,
input: 'js/index.js',
plugins: [
resolve(),
commonjs(),
babel( babelConfigESM ),
terser()
]
}).then( bundle => {
cache.esm = bundle.cache;
return bundle.write({
file: './dist/reveal.esm.js',
format: 'es',
banner: banner,
sourcemap: true
});
});
})
gulp.task('js', gulp.parallel('js-es5', 'js-es6'));
// Creates a UMD and ES module bundle for each of our
// built-in plugins
gulp.task('plugins', () => {
return Promise.all([
{ name: 'RevealHighlight', input: './plugin/highlight/plugin.js', output: './plugin/highlight/highlight' },
{ name: 'RevealMarkdown', input: './plugin/markdown/plugin.js', output: './plugin/markdown/markdown' },
{ name: 'RevealSearch', input: './plugin/search/plugin.js', output: './plugin/search/search' },
{ name: 'RevealNotes', input: './plugin/notes/plugin.js', output: './plugin/notes/notes' },
{ name: 'RevealZoom', input: './plugin/zoom/plugin.js', output: './plugin/zoom/zoom' },
{ name: 'RevealMath', input: './plugin/math/plugin.js', output: './plugin/math/math' },
].map( plugin => {
return rollup({
cache: cache[plugin.input],
input: plugin.input,
plugins: [
resolve(),
commonjs(),
babel({
...babelConfig,
ignore: [/node_modules\/(?!(highlight\.js|marked)\/).*/],
}),
terser()
]
}).then( bundle => {
cache[plugin.input] = bundle.cache;
bundle.write({
file: plugin.output + '.esm.js',
name: plugin.name,
format: 'es'
})
bundle.write({
file: plugin.output + '.js',
name: plugin.name,
format: 'umd'
})
});
} ));
})
gulp.task('css-themes', () => gulp.src(['./css/theme/source/*.{sass,scss}'])
.pipe(sass())
.pipe(gulp.dest('./dist/theme')))
gulp.task('css-core', () => gulp.src(['css/reveal.scss'])
.pipe(sass())
.pipe(autoprefixer())
.pipe(minify({compatibility: 'ie9'}))
.pipe(header(banner))
.pipe(gulp.dest('./dist')))
gulp.task('css', gulp.parallel('css-themes', 'css-core'))
gulp.task('qunit', () => {
let serverConfig = {
root,
port: 8009,
host: '0.0.0.0',
name: 'test-server'
}
let server = connect.server( serverConfig )
let testFiles = glob.sync('test/*.html' )
let totalTests = 0;
let failingTests = 0;
let tests = Promise.all( testFiles.map( filename => {
return new Promise( ( resolve, reject ) => {
qunit.runQunitPuppeteer({
targetUrl: `http://${serverConfig.host}:${serverConfig.port}/${filename}`,
timeout: 20000,
redirectConsole: false,
puppeteerArgs: ['--allow-file-access-from-files']
})
.then(result => {
if( result.stats.failed > 0 ) {
console.log(`${'!'} ${filename} [${result.stats.passed}/${result.stats.total}] in ${result.stats.runtime}ms`.red);
// qunit.printResultSummary(result, console);
qunit.printFailedTests(result, console);
}
else {
console.log(`${'✔'} ${filename} [${result.stats.passed}/${result.stats.total}] in ${result.stats.runtime}ms`.green);
}
totalTests += result.stats.total;
failingTests += result.stats.failed;
resolve();
})
.catch(error => {
console.error(error);
reject();
});
} )
} ) );
return new Promise( ( resolve, reject ) => {
tests.then( () => {
if( failingTests > 0 ) {
reject( new Error(`${failingTests}/${totalTests} tests failed`.red) );
}
else {
console.log(`${'✔'} Passed ${totalTests} tests`.green.bold);
resolve();
}
} )
.catch( () => {
reject();
} )
.finally( () => {
server.close();
} );
} );
} )
gulp.task('eslint', () => gulp.src(['./js/**', 'gulpfile.js'])
.pipe(eslint())
.pipe(eslint.format()))
gulp.task('test', gulp.series( 'eslint', 'qunit' ))
gulp.task('default', gulp.series(gulp.parallel('js', 'css', 'plugins'), 'test'))
gulp.task('build', gulp.parallel('js', 'css', 'plugins'))
gulp.task('package', gulp.series('default', () =>
gulp.src([
'./index.html',
'./dist/**',
'./lib/**',
'./images/**',
'./plugin/**',
'./**.md'
]).pipe(zip('reveal-js-presentation.zip')).pipe(gulp.dest('./'))
))
gulp.task('reload', () => gulp.src(['*.html', '*.md'])
.pipe(connect.reload()));
gulp.task('serve', () => {
connect.server({
root: root,
port: port,
host: '0.0.0.0',
livereload: true
})
gulp.watch(['*.html', '*.md'], gulp.series('reload'))
gulp.watch(['js/**'], gulp.series('js', 'reload', 'test'))
gulp.watch(['plugin/**/plugin.js'], gulp.series('plugins', 'reload'))
gulp.watch([
'css/theme/source/*.{sass,scss}',
'css/theme/template/*.{sass,scss}',
], gulp.series('css-themes', 'reload'))
gulp.watch([
'css/*.scss',
'css/print/*.{sass,scss,css}'
], gulp.series('css-core', 'reload'))
gulp.watch(['test/*.html'], gulp.series('test'))
})

View File

@@ -6,20 +6,12 @@
<title>reveal.js</title>
<link rel="stylesheet" href="css/reveal.css">
<link rel="stylesheet" href="css/theme/black.css">
<link rel="stylesheet" href="dist/reset.css">
<link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/theme/black.css" id="theme">
<!-- Theme used for syntax highlighting of code -->
<link rel="stylesheet" href="lib/css/zenburn.css">
<!-- Printing and PDF exports -->
<script>
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
</script>
<!-- Theme used for syntax highlighted code -->
<link rel="stylesheet" href="plugin/highlight/monokai.css" id="highlight-theme">
</head>
<body>
<div class="reveal">
@@ -29,21 +21,19 @@
</div>
</div>
<script src="lib/js/head.min.js"></script>
<script src="js/reveal.js"></script>
<script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
// More info https://github.com/hakimel/reveal.js#configuration
// More info about initialization & config:
// - https://revealjs.com/initialization/
// - https://revealjs.com/config/
Reveal.initialize({
history: true,
hash: true,
// More info https://github.com/hakimel/reveal.js#dependencies
dependencies: [
{ src: 'plugin/markdown/marked.js' },
{ src: 'plugin/markdown/markdown.js' },
{ src: 'plugin/notes/notes.js', async: true },
{ src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }
]
// Learn about plugins: https://revealjs.com/plugins/
plugins: [ RevealMarkdown, RevealHighlight, RevealNotes ]
});
</script>
</body>

165
js/components/playback.js Normal file
View File

@@ -0,0 +1,165 @@
/**
* UI component that lets the use control auto-slide
* playback via play/pause.
*/
export default class Playback {
/**
* @param {HTMLElement} container The component will append
* itself to this
* @param {function} progressCheck A method which will be
* called frequently to get the current playback progress on
* a range of 0-1
*/
constructor( container, progressCheck ) {
// Cosmetics
this.diameter = 100;
this.diameter2 = this.diameter/2;
this.thickness = 6;
// Flags if we are currently playing
this.playing = false;
// Current progress on a 0-1 range
this.progress = 0;
// Used to loop the animation smoothly
this.progressOffset = 1;
this.container = container;
this.progressCheck = progressCheck;
this.canvas = document.createElement( 'canvas' );
this.canvas.className = 'playback';
this.canvas.width = this.diameter;
this.canvas.height = this.diameter;
this.canvas.style.width = this.diameter2 + 'px';
this.canvas.style.height = this.diameter2 + 'px';
this.context = this.canvas.getContext( '2d' );
this.container.appendChild( this.canvas );
this.render();
}
setPlaying( value ) {
const wasPlaying = this.playing;
this.playing = value;
// Start repainting if we weren't already
if( !wasPlaying && this.playing ) {
this.animate();
}
else {
this.render();
}
}
animate() {
const progressBefore = this.progress;
this.progress = this.progressCheck();
// When we loop, offset the progress so that it eases
// smoothly rather than immediately resetting
if( progressBefore > 0.8 && this.progress < 0.2 ) {
this.progressOffset = this.progress;
}
this.render();
if( this.playing ) {
requestAnimationFrame( this.animate.bind( this ) );
}
}
/**
* Renders the current progress and playback state.
*/
render() {
let progress = this.playing ? this.progress : 0,
radius = ( this.diameter2 ) - this.thickness,
x = this.diameter2,
y = this.diameter2,
iconSize = 28;
// Ease towards 1
this.progressOffset += ( 1 - this.progressOffset ) * 0.1;
const endAngle = ( - Math.PI / 2 ) + ( progress * ( Math.PI * 2 ) );
const startAngle = ( - Math.PI / 2 ) + ( this.progressOffset * ( Math.PI * 2 ) );
this.context.save();
this.context.clearRect( 0, 0, this.diameter, this.diameter );
// Solid background color
this.context.beginPath();
this.context.arc( x, y, radius + 4, 0, Math.PI * 2, false );
this.context.fillStyle = 'rgba( 0, 0, 0, 0.4 )';
this.context.fill();
// Draw progress track
this.context.beginPath();
this.context.arc( x, y, radius, 0, Math.PI * 2, false );
this.context.lineWidth = this.thickness;
this.context.strokeStyle = 'rgba( 255, 255, 255, 0.2 )';
this.context.stroke();
if( this.playing ) {
// Draw progress on top of track
this.context.beginPath();
this.context.arc( x, y, radius, startAngle, endAngle, false );
this.context.lineWidth = this.thickness;
this.context.strokeStyle = '#fff';
this.context.stroke();
}
this.context.translate( x - ( iconSize / 2 ), y - ( iconSize / 2 ) );
// Draw play/pause icons
if( this.playing ) {
this.context.fillStyle = '#fff';
this.context.fillRect( 0, 0, iconSize / 2 - 4, iconSize );
this.context.fillRect( iconSize / 2 + 4, 0, iconSize / 2 - 4, iconSize );
}
else {
this.context.beginPath();
this.context.translate( 4, 0 );
this.context.moveTo( 0, 0 );
this.context.lineTo( iconSize - 4, iconSize / 2 );
this.context.lineTo( 0, iconSize );
this.context.fillStyle = '#fff';
this.context.fill();
}
this.context.restore();
}
on( type, listener ) {
this.canvas.addEventListener( type, listener, false );
}
off( type, listener ) {
this.canvas.removeEventListener( type, listener, false );
}
destroy() {
this.playing = false;
if( this.canvas.parentNode ) {
this.container.removeChild( this.canvas );
}
}
}

293
js/config.js Normal file
View File

@@ -0,0 +1,293 @@
/**
* The default reveal.js config object.
*/
export default {
// The "normal" size of the presentation, aspect ratio will be preserved
// when the presentation is scaled to fit different resolutions
width: 960,
height: 700,
// Factor of the display size that should remain empty around the content
margin: 0.04,
// Bounds for smallest/largest possible scale to apply to content
minScale: 0.2,
maxScale: 2.0,
// Display presentation control arrows
controls: true,
// Help the user learn the controls by providing hints, for example by
// bouncing the down arrow when they first encounter a vertical slide
controlsTutorial: true,
// Determines where controls appear, "edges" or "bottom-right"
controlsLayout: 'bottom-right',
// Visibility rule for backwards navigation arrows; "faded", "hidden"
// or "visible"
controlsBackArrows: 'faded',
// Display a presentation progress bar
progress: true,
// 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().
slideNumber: false,
// 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
showSlideNumber: 'all',
// Use 1 based indexing for # links to match slide number (default is zero
// based)
hashOneBasedIndex: false,
// Add the current slide number to the URL hash so that reloading the
// page/copying the URL will return you to the same slide
hash: false,
// Flags if we should monitor the hash and change slides accordingly
respondToHashChanges: true,
// Push each slide change to the browser history. Implies `hash: true`
history: false,
// Enable keyboard shortcuts for navigation
keyboard: true,
// Optional function that blocks keyboard events when retuning false
//
// If you set this to 'foucsed', we will only capture keyboard events
// for embdedded decks when they are in focus
keyboardCondition: null,
// Disables the default reveal.js slide layout (scaling and centering)
// so that you can use custom CSS layout
disableLayout: false,
// Enable the slide overview mode
overview: true,
// Vertical centering of slides
center: true,
// Enables touch navigation on devices with touch input
touch: true,
// Loop the presentation
loop: false,
// Change the presentation direction to be RTL
rtl: false,
// 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.
navigationMode: 'default',
// Randomizes the order of slides each time the presentation loads
shuffle: false,
// Turns fragments on and off globally
fragments: true,
// Flags whether to include the current fragment in the URL,
// so that reloading brings you to the same fragment position
fragmentInURL: true,
// Flags if the presentation is running in an embedded mode,
// i.e. contained within a limited portion of the screen
embedded: false,
// Flags if we should show a help overlay when the question-mark
// key is pressed
help: true,
// Flags if it should be possible to pause the presentation (blackout)
pause: true,
// Flags if speaker notes should be visible to all viewers
showNotes: false,
// Flags if slides with data-visibility="hidden" should be kep visible
showHiddenSlides: false,
// Global override for autolaying 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
autoPlayMedia: null,
// 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
preloadIframes: null,
// Can be used to globally disable auto-animation
autoAnimate: true,
// Optionally provide a custom element matcher that will be
// used to dictate which elements we can animate between.
autoAnimateMatcher: null,
// Default settings for our auto-animate transitions, can be
// overridden per-slide or per-element via data arguments
autoAnimateEasing: 'ease',
autoAnimateDuration: 1.0,
autoAnimateUnmatched: true,
// 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.
autoAnimateStyles: [
'opacity',
'color',
'background-color',
'padding',
'font-size',
'line-height',
'letter-spacing',
'border-width',
'border-color',
'border-radius',
'outline',
'outline-offset'
],
// 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
autoSlide: 0,
// Stop auto-sliding after user input
autoSlideStoppable: true,
// Use this method for navigation when auto-sliding (defaults to navigateNext)
autoSlideMethod: null,
// 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
defaultTiming: null,
// Enable slide navigation via mouse wheel
mouseWheel: false,
// Opens links in an iframe preview overlay
// Add `data-preview-link` and `data-preview-link="false"` to customise each link
// individually
previewLinks: false,
// Exposes the reveal.js API through window.postMessage
postMessage: true,
// Dispatches all reveal.js events to the parent window through postMessage
postMessageEvents: false,
// Focuses body when page changes visibility to ensure keyboard shortcuts work
focusBodyOnPageVisibilityChange: true,
// Transition style
transition: 'slide', // none/fade/slide/convex/concave/zoom
// Transition speed
transitionSpeed: 'default', // default/fast/slow
// Transition style for full page slide backgrounds
backgroundTransition: 'fade', // none/fade/slide/convex/concave/zoom
// Parallax background image
parallaxBackgroundImage: '', // CSS syntax, e.g. "a.jpg"
// Parallax background size
parallaxBackgroundSize: '', // CSS syntax, e.g. "3000px 2000px"
// Parallax background repeat
parallaxBackgroundRepeat: '', // repeat/repeat-x/repeat-y/no-repeat/initial/inherit
// Parallax background position
parallaxBackgroundPosition: '', // CSS syntax, e.g. "top left"
// Amount of pixels to move the parallax background per slide step
parallaxBackgroundHorizontal: null,
parallaxBackgroundVertical: null,
// The maximum number of pages a single slide can expand onto when printing
// to PDF, unlimited by default
pdfMaxPagesPerSlide: Number.POSITIVE_INFINITY,
// Prints each fragment on a separate slide
pdfSeparateFragments: true,
// 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.
pdfPageHeightOffset: -1,
// Number of slides away from the current that are visible
viewDistance: 3,
// 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.
mobileViewDistance: 2,
// The display mode that will be used to show slides
display: 'block',
// Hide cursor if inactive
hideInactiveCursor: true,
// Time before the cursor is hidden (in ms)
hideCursorTime: 5000,
// Script dependencies to load
dependencies: [],
// Plugin objects to register and use for this presentation
plugins: []
}

View File

@@ -0,0 +1,619 @@
import { queryAll, extend, createStyleSheet, matches, closest } from '../utils/util.js'
import { FRAGMENT_STYLE_REGEX } from '../utils/constants.js'
// Counter used to generate unique IDs for auto-animated elements
let autoAnimateCounter = 0;
/**
* Automatically animates matching elements across
* slides with the [data-auto-animate] attribute.
*/
export default class AutoAnimate {
constructor( Reveal ) {
this.Reveal = Reveal;
}
/**
* Runs an auto-animation between the given slides.
*
* @param {HTMLElement} fromSlide
* @param {HTMLElement} toSlide
*/
run( fromSlide, toSlide ) {
// Clean up after prior animations
this.reset();
// Ensure that both slides are auto-animate targets
if( fromSlide.hasAttribute( 'data-auto-animate' ) && toSlide.hasAttribute( 'data-auto-animate' ) ) {
// Create a new auto-animate sheet
this.autoAnimateStyleSheet = this.autoAnimateStyleSheet || createStyleSheet();
let animationOptions = this.getAutoAnimateOptions( toSlide );
// Set our starting state
fromSlide.dataset.autoAnimate = 'pending';
toSlide.dataset.autoAnimate = 'pending';
// Flag the navigation direction, needed for fragment buildup
let allSlides = this.Reveal.getSlides();
animationOptions.slideDirection = allSlides.indexOf( toSlide ) > allSlides.indexOf( fromSlide ) ? 'forward' : 'backward';
// Inject our auto-animate styles for this transition
let css = this.getAutoAnimatableElements( fromSlide, toSlide ).map( elements => {
return this.autoAnimateElements( elements.from, elements.to, elements.options || {}, animationOptions, autoAnimateCounter++ );
} );
// Animate unmatched elements, if enabled
if( toSlide.dataset.autoAnimateUnmatched !== 'false' && this.Reveal.getConfig().autoAnimateUnmatched === true ) {
// Our default timings for unmatched elements
let defaultUnmatchedDuration = animationOptions.duration * 0.8,
defaultUnmatchedDelay = animationOptions.duration * 0.2;
this.getUnmatchedAutoAnimateElements( toSlide ).forEach( unmatchedElement => {
let unmatchedOptions = this.getAutoAnimateOptions( unmatchedElement, animationOptions );
let id = 'unmatched';
// If there is a duration or delay set specifically for this
// element our unmatched elements should adhere to those
if( unmatchedOptions.duration !== animationOptions.duration || unmatchedOptions.delay !== animationOptions.delay ) {
id = 'unmatched-' + autoAnimateCounter++;
css.push( `[data-auto-animate="running"] [data-auto-animate-target="${id}"] { transition: opacity ${unmatchedOptions.duration}s ease ${unmatchedOptions.delay}s; }` );
}
unmatchedElement.dataset.autoAnimateTarget = id;
}, this );
// Our default transition for unmatched elements
css.push( `[data-auto-animate="running"] [data-auto-animate-target="unmatched"] { transition: opacity ${defaultUnmatchedDuration}s ease ${defaultUnmatchedDelay}s; }` );
}
// Setting the whole chunk of CSS at once is the most
// efficient way to do this. Using sheet.insertRule
// is multiple factors slower.
this.autoAnimateStyleSheet.innerHTML = css.join( '' );
// Start the animation next cycle
requestAnimationFrame( () => {
if( this.autoAnimateStyleSheet ) {
// This forces our newly injected styles to be applied in Firefox
getComputedStyle( this.autoAnimateStyleSheet ).fontWeight;
toSlide.dataset.autoAnimate = 'running';
}
} );
this.Reveal.dispatchEvent({
type: 'autoanimate',
data: {
fromSlide,
toSlide,
sheet: this.autoAnimateStyleSheet
}
});
}
}
/**
* Rolls back all changes that we've made to the DOM so
* that as part of animating.
*/
reset() {
// Reset slides
queryAll( this.Reveal.getRevealElement(), '[data-auto-animate]:not([data-auto-animate=""])' ).forEach( element => {
element.dataset.autoAnimate = '';
} );
// Reset elements
queryAll( this.Reveal.getRevealElement(), '[data-auto-animate-target]' ).forEach( element => {
delete element.dataset.autoAnimateTarget;
} );
// Remove the animation sheet
if( this.autoAnimateStyleSheet && this.autoAnimateStyleSheet.parentNode ) {
this.autoAnimateStyleSheet.parentNode.removeChild( this.autoAnimateStyleSheet );
this.autoAnimateStyleSheet = null;
}
}
/**
* Creates a FLIP animation where the `to` element starts out
* in the `from` element position and animates to its original
* state.
*
* @param {HTMLElement} from
* @param {HTMLElement} to
* @param {Object} elementOptions Options for this element pair
* @param {Object} animationOptions Options set at the slide level
* @param {String} id Unique ID that we can use to identify this
* auto-animate element in the DOM
*/
autoAnimateElements( from, to, elementOptions, animationOptions, id ) {
// 'from' elements are given a data-auto-animate-target with no value,
// 'to' elements are are given a data-auto-animate-target with an ID
from.dataset.autoAnimateTarget = '';
to.dataset.autoAnimateTarget = id;
// Each element may override any of the auto-animate options
// like transition easing, duration and delay via data-attributes
let options = this.getAutoAnimateOptions( to, animationOptions );
// If we're using a custom element matcher the element options
// may contain additional transition overrides
if( typeof elementOptions.delay !== 'undefined' ) options.delay = elementOptions.delay;
if( typeof elementOptions.duration !== 'undefined' ) options.duration = elementOptions.duration;
if( typeof elementOptions.easing !== 'undefined' ) options.easing = elementOptions.easing;
let fromProps = this.getAutoAnimatableProperties( 'from', from, elementOptions ),
toProps = this.getAutoAnimatableProperties( 'to', to, elementOptions );
// Maintain fragment visibility for matching elements when
// we're navigating forwards, this way the viewer won't need
// to step through the same fragments twice
if( to.classList.contains( 'fragment' ) ) {
// Don't auto-animate the opacity of fragments to avoid
// conflicts with fragment animations
delete toProps.styles['opacity'];
if( from.classList.contains( 'fragment' ) ) {
let fromFragmentStyle = ( from.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];
let toFragmentStyle = ( to.className.match( FRAGMENT_STYLE_REGEX ) || [''] )[0];
// Only skip the fragment if the fragment animation style
// remains unchanged
if( fromFragmentStyle === toFragmentStyle && animationOptions.slideDirection === 'forward' ) {
to.classList.add( 'visible', 'disabled' );
}
}
}
// If translation and/or scaling are enabled, css transform
// the 'to' element so that it matches the position and size
// of the 'from' element
if( elementOptions.translate !== false || elementOptions.scale !== false ) {
let presentationScale = this.Reveal.getScale();
let delta = {
x: ( fromProps.x - toProps.x ) / presentationScale,
y: ( fromProps.y - toProps.y ) / presentationScale,
scaleX: fromProps.width / toProps.width,
scaleY: fromProps.height / toProps.height
};
// Limit decimal points to avoid 0.0001px blur and stutter
delta.x = Math.round( delta.x * 1000 ) / 1000;
delta.y = Math.round( delta.y * 1000 ) / 1000;
delta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;
delta.scaleX = Math.round( delta.scaleX * 1000 ) / 1000;
let translate = elementOptions.translate !== false && ( delta.x !== 0 || delta.y !== 0 ),
scale = elementOptions.scale !== false && ( delta.scaleX !== 0 || delta.scaleY !== 0 );
// No need to transform if nothing's changed
if( translate || scale ) {
let transform = [];
if( translate ) transform.push( `translate(${delta.x}px, ${delta.y}px)` );
if( scale ) transform.push( `scale(${delta.scaleX}, ${delta.scaleY})` );
fromProps.styles['transform'] = transform.join( ' ' );
fromProps.styles['transform-origin'] = 'top left';
toProps.styles['transform'] = 'none';
}
}
// Delete all unchanged 'to' styles
for( let propertyName in toProps.styles ) {
const toValue = toProps.styles[propertyName];
const fromValue = fromProps.styles[propertyName];
if( toValue === fromValue ) {
delete toProps.styles[propertyName];
}
else {
// If these property values were set via a custom matcher providing
// an explicit 'from' and/or 'to' value, we always inject those values.
if( toValue.explicitValue === true ) {
toProps.styles[propertyName] = toValue.value;
}
if( fromValue.explicitValue === true ) {
fromProps.styles[propertyName] = fromValue.value;
}
}
}
let css = '';
let toStyleProperties = Object.keys( toProps.styles );
// Only create animate this element IF at least one style
// property has changed
if( toStyleProperties.length > 0 ) {
// Instantly move to the 'from' state
fromProps.styles['transition'] = 'none';
// Animate towards the 'to' state
toProps.styles['transition'] = `all ${options.duration}s ${options.easing} ${options.delay}s`;
toProps.styles['transition-property'] = toStyleProperties.join( ', ' );
toProps.styles['will-change'] = toStyleProperties.join( ', ' );
// Build up our custom CSS. We need to override inline styles
// so we need to make our styles vErY IMPORTANT!1!!
let fromCSS = Object.keys( fromProps.styles ).map( propertyName => {
return propertyName + ': ' + fromProps.styles[propertyName] + ' !important;';
} ).join( '' );
let toCSS = Object.keys( toProps.styles ).map( propertyName => {
return propertyName + ': ' + toProps.styles[propertyName] + ' !important;';
} ).join( '' );
css = '[data-auto-animate-target="'+ id +'"] {'+ fromCSS +'}' +
'[data-auto-animate="running"] [data-auto-animate-target="'+ id +'"] {'+ toCSS +'}';
}
return css;
}
/**
* Returns the auto-animate options for the given element.
*
* @param {HTMLElement} element Element to pick up options
* from, either a slide or an animation target
* @param {Object} [inheritedOptions] Optional set of existing
* options
*/
getAutoAnimateOptions( element, inheritedOptions ) {
let options = {
easing: this.Reveal.getConfig().autoAnimateEasing,
duration: this.Reveal.getConfig().autoAnimateDuration,
delay: 0
};
options = extend( options, inheritedOptions );
// Inherit options from parent elements
if( element.parentNode ) {
let autoAnimatedParent = closest( element.parentNode, '[data-auto-animate-target]' );
if( autoAnimatedParent ) {
options = this.getAutoAnimateOptions( autoAnimatedParent, options );
}
}
if( element.dataset.autoAnimateEasing ) {
options.easing = element.dataset.autoAnimateEasing;
}
if( element.dataset.autoAnimateDuration ) {
options.duration = parseFloat( element.dataset.autoAnimateDuration );
}
if( element.dataset.autoAnimateDelay ) {
options.delay = parseFloat( element.dataset.autoAnimateDelay );
}
return options;
}
/**
* Returns an object containing all of the properties
* that can be auto-animated for the given element and
* their current computed values.
*
* @param {String} direction 'from' or 'to'
*/
getAutoAnimatableProperties( direction, element, elementOptions ) {
let config = this.Reveal.getConfig();
let properties = { styles: [] };
// Position and size
if( elementOptions.translate !== false || elementOptions.scale !== false ) {
let bounds;
// Custom auto-animate may optionally return a custom tailored
// measurement function
if( typeof elementOptions.measure === 'function' ) {
bounds = elementOptions.measure( element );
}
else {
if( config.center ) {
// More precise, but breaks when used in combination
// with zoom for scaling the deck ¯\_(ツ)_/¯
bounds = element.getBoundingClientRect();
}
else {
let scale = this.Reveal.getScale();
bounds = {
x: element.offsetLeft * scale,
y: element.offsetTop * scale,
width: element.offsetWidth * scale,
height: element.offsetHeight * scale
};
}
}
properties.x = bounds.x;
properties.y = bounds.y;
properties.width = bounds.width;
properties.height = bounds.height;
}
const computedStyles = getComputedStyle( element );
// CSS styles
( elementOptions.styles || config.autoAnimateStyles ).forEach( style => {
let value;
// `style` is either the property name directly, or an object
// definition of a style property
if( typeof style === 'string' ) style = { property: style };
if( typeof style.from !== 'undefined' && direction === 'from' ) {
value = { value: style.from, explicitValue: true };
}
else if( typeof style.to !== 'undefined' && direction === 'to' ) {
value = { value: style.to, explicitValue: true };
}
else {
value = computedStyles[style.property];
}
if( value !== '' ) {
properties.styles[style.property] = value;
}
} );
return properties;
}
/**
* Get a list of all element pairs that we can animate
* between the given slides.
*
* @param {HTMLElement} fromSlide
* @param {HTMLElement} toSlide
*
* @return {Array} Each value is an array where [0] is
* the element we're animating from and [1] is the
* element we're animating to
*/
getAutoAnimatableElements( fromSlide, toSlide ) {
let matcher = typeof this.Reveal.getConfig().autoAnimateMatcher === 'function' ? this.Reveal.getConfig().autoAnimateMatcher : this.getAutoAnimatePairs;
let pairs = matcher.call( this, fromSlide, toSlide );
let reserved = [];
// Remove duplicate pairs
return pairs.filter( ( pair, index ) => {
if( reserved.indexOf( pair.to ) === -1 ) {
reserved.push( pair.to );
return true;
}
} );
}
/**
* Identifies matching elements between slides.
*
* You can specify a custom matcher function by using
* the `autoAnimateMatcher` config option.
*/
getAutoAnimatePairs( fromSlide, toSlide ) {
let pairs = [];
const codeNodes = 'pre';
const textNodes = 'h1, h2, h3, h4, h5, h6, p, li';
const mediaNodes = 'img, video, iframe';
// Eplicit matches via data-id
this.findAutoAnimateMatches( pairs, fromSlide, toSlide, '[data-id]', node => {
return node.nodeName + ':::' + node.getAttribute( 'data-id' );
} );
// Text
this.findAutoAnimateMatches( pairs, fromSlide, toSlide, textNodes, node => {
return node.nodeName + ':::' + node.innerText;
} );
// Media
this.findAutoAnimateMatches( pairs, fromSlide, toSlide, mediaNodes, node => {
return node.nodeName + ':::' + ( node.getAttribute( 'src' ) || node.getAttribute( 'data-src' ) );
} );
// Code
this.findAutoAnimateMatches( pairs, fromSlide, toSlide, codeNodes, node => {
return node.nodeName + ':::' + node.innerText;
} );
pairs.forEach( pair => {
// Disable scale transformations on text nodes, we transition
// each individual text property instead
if( matches( pair.from, textNodes ) ) {
pair.options = { scale: false };
}
// Animate individual lines of code
else if( matches( pair.from, codeNodes ) ) {
// Transition the code block's width and height instead of scaling
// to prevent its content from being squished
pair.options = { scale: false, styles: [ 'width', 'height' ] };
// Lines of code
this.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-code', node => {
return node.textContent;
}, {
scale: false,
styles: [],
measure: this.getLocalBoundingBox.bind( this )
} );
// Line numbers
this.findAutoAnimateMatches( pairs, pair.from, pair.to, '.hljs .hljs-ln-line[data-line-number]', node => {
return node.getAttribute( 'data-line-number' );
}, {
scale: false,
styles: [ 'width' ],
measure: this.getLocalBoundingBox.bind( this )
} );
}
}, this );
return pairs;
}
/**
* Helper method which returns a bounding box based on
* the given elements offset coordinates.
*
* @param {HTMLElement} element
* @return {Object} x, y, width, height
*/
getLocalBoundingBox( element ) {
const presentationScale = this.Reveal.getScale();
return {
x: Math.round( ( element.offsetLeft * presentationScale ) * 100 ) / 100,
y: Math.round( ( element.offsetTop * presentationScale ) * 100 ) / 100,
width: Math.round( ( element.offsetWidth * presentationScale ) * 100 ) / 100,
height: Math.round( ( element.offsetHeight * presentationScale ) * 100 ) / 100
};
}
/**
* Finds matching elements between two slides.
*
* @param {Array} pairs List of pairs to push matches to
* @param {HTMLElement} fromScope Scope within the from element exists
* @param {HTMLElement} toScope Scope within the to element exists
* @param {String} selector CSS selector of the element to match
* @param {Function} serializer A function that accepts an element and returns
* a stringified ID based on its contents
* @param {Object} animationOptions Optional config options for this pair
*/
findAutoAnimateMatches( pairs, fromScope, toScope, selector, serializer, animationOptions ) {
let fromMatches = {};
let toMatches = {};
[].slice.call( fromScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {
const key = serializer( element );
if( typeof key === 'string' && key.length ) {
fromMatches[key] = fromMatches[key] || [];
fromMatches[key].push( element );
}
} );
[].slice.call( toScope.querySelectorAll( selector ) ).forEach( ( element, i ) => {
const key = serializer( element );
toMatches[key] = toMatches[key] || [];
toMatches[key].push( element );
let fromElement;
// Retrieve the 'from' element
if( fromMatches[key] ) {
const pimaryIndex = toMatches[key].length - 1;
const secondaryIndex = fromMatches[key].length - 1;
// If there are multiple identical from elements, retrieve
// the one at the same index as our to-element.
if( fromMatches[key][ pimaryIndex ] ) {
fromElement = fromMatches[key][ pimaryIndex ];
fromMatches[key][ pimaryIndex ] = null;
}
// If there are no matching from-elements at the same index,
// use the last one.
else if( fromMatches[key][ secondaryIndex ] ) {
fromElement = fromMatches[key][ secondaryIndex ];
fromMatches[key][ secondaryIndex ] = null;
}
}
// If we've got a matching pair, push it to the list of pairs
if( fromElement ) {
pairs.push({
from: fromElement,
to: element,
options: animationOptions
});
}
} );
}
/**
* Returns a all elements within the given scope that should
* be considered unmatched in an auto-animate transition. If
* fading of unmatched elements is turned on, these elements
* will fade when going between auto-animate slides.
*
* Note that parents of auto-animate targets are NOT considerd
* unmatched since fading them would break the auto-animation.
*
* @param {HTMLElement} rootElement
* @return {Array}
*/
getUnmatchedAutoAnimateElements( rootElement ) {
return [].slice.call( rootElement.children ).reduce( ( result, element ) => {
const containsAnimatedElements = element.querySelector( '[data-auto-animate-target]' );
// The element is unmatched if
// - It is not an auto-animate target
// - It does not contain any auto-animate targets
if( !element.hasAttribute( 'data-auto-animate-target' ) && !containsAnimatedElements ) {
result.push( element );
}
if( element.querySelector( '[data-auto-animate-target]' ) ) {
result = result.concat( this.getUnmatchedAutoAnimateElements( element ) );
}
return result;
}, [] );
}
}

View File

@@ -0,0 +1,397 @@
import { queryAll } from '../utils/util.js'
import { colorToRgb, colorBrightness } from '../utils/color.js'
/**
* Creates and updates slide backgrounds.
*/
export default class Backgrounds {
constructor( Reveal ) {
this.Reveal = Reveal;
}
render() {
this.element = document.createElement( 'div' );
this.element.className = 'backgrounds';
this.Reveal.getRevealElement().appendChild( this.element );
}
/**
* Creates the slide background elements and appends them
* to the background container. One element is created per
* slide no matter if the given slide has visible background.
*/
create() {
let printMode = this.Reveal.isPrintingPDF();
// Clear prior backgrounds
this.element.innerHTML = '';
this.element.classList.add( 'no-transition' );
// Iterate over all horizontal slides
this.Reveal.getHorizontalSlides().forEach( slideh => {
let backgroundStack = this.createBackground( slideh, this.element );
// Iterate over all vertical slides
queryAll( slideh, 'section' ).forEach( slidev => {
this.createBackground( slidev, backgroundStack );
backgroundStack.classList.add( 'stack' );
} );
} );
// Add parallax background if specified
if( this.Reveal.getConfig().parallaxBackgroundImage ) {
this.element.style.backgroundImage = 'url("' + this.Reveal.getConfig().parallaxBackgroundImage + '")';
this.element.style.backgroundSize = this.Reveal.getConfig().parallaxBackgroundSize;
this.element.style.backgroundRepeat = this.Reveal.getConfig().parallaxBackgroundRepeat;
this.element.style.backgroundPosition = this.Reveal.getConfig().parallaxBackgroundPosition;
// Make sure the below properties are set on the element - these properties are
// needed for proper transitions to be set on the element via CSS. To remove
// annoying background slide-in effect when the presentation starts, apply
// these properties after short time delay
setTimeout( () => {
this.Reveal.getRevealElement().classList.add( 'has-parallax-background' );
}, 1 );
}
else {
this.element.style.backgroundImage = '';
this.Reveal.getRevealElement().classList.remove( 'has-parallax-background' );
}
}
/**
* Creates a background for the given slide.
*
* @param {HTMLElement} slide
* @param {HTMLElement} container The element that the background
* should be appended to
* @return {HTMLElement} New background div
*/
createBackground( slide, container ) {
// Main slide background element
let element = document.createElement( 'div' );
element.className = 'slide-background ' + slide.className.replace( /present|past|future/, '' );
// Inner background element that wraps images/videos/iframes
let contentElement = document.createElement( 'div' );
contentElement.className = 'slide-background-content';
element.appendChild( contentElement );
container.appendChild( element );
slide.slideBackgroundElement = element;
slide.slideBackgroundContentElement = contentElement;
// Syncs the background to reflect all current background settings
this.sync( slide );
return element;
}
/**
* Renders all of the visual properties of a slide background
* based on the various background attributes.
*
* @param {HTMLElement} slide
*/
sync( slide ) {
let element = slide.slideBackgroundElement,
contentElement = slide.slideBackgroundContentElement;
// Reset the prior background state in case this is not the
// initial sync
slide.classList.remove( 'has-dark-background' );
slide.classList.remove( 'has-light-background' );
element.removeAttribute( 'data-loaded' );
element.removeAttribute( 'data-background-hash' );
element.removeAttribute( 'data-background-size' );
element.removeAttribute( 'data-background-transition' );
element.style.backgroundColor = '';
contentElement.style.backgroundSize = '';
contentElement.style.backgroundRepeat = '';
contentElement.style.backgroundPosition = '';
contentElement.style.backgroundImage = '';
contentElement.style.opacity = '';
contentElement.innerHTML = '';
let data = {
background: slide.getAttribute( 'data-background' ),
backgroundSize: slide.getAttribute( 'data-background-size' ),
backgroundImage: slide.getAttribute( 'data-background-image' ),
backgroundVideo: slide.getAttribute( 'data-background-video' ),
backgroundIframe: slide.getAttribute( 'data-background-iframe' ),
backgroundColor: slide.getAttribute( 'data-background-color' ),
backgroundRepeat: slide.getAttribute( 'data-background-repeat' ),
backgroundPosition: slide.getAttribute( 'data-background-position' ),
backgroundTransition: slide.getAttribute( 'data-background-transition' ),
backgroundOpacity: slide.getAttribute( 'data-background-opacity' )
};
if( data.background ) {
// Auto-wrap image urls in url(...)
if( /^(http|file|\/\/)/gi.test( data.background ) || /\.(svg|png|jpg|jpeg|gif|bmp)([?#\s]|$)/gi.test( data.background ) ) {
slide.setAttribute( 'data-background-image', data.background );
}
else {
element.style.background = data.background;
}
}
// Create a hash for this combination of background settings.
// This is used to determine when two slide backgrounds are
// the same.
if( data.background || data.backgroundColor || data.backgroundImage || data.backgroundVideo || data.backgroundIframe ) {
element.setAttribute( 'data-background-hash', data.background +
data.backgroundSize +
data.backgroundImage +
data.backgroundVideo +
data.backgroundIframe +
data.backgroundColor +
data.backgroundRepeat +
data.backgroundPosition +
data.backgroundTransition +
data.backgroundOpacity );
}
// Additional and optional background properties
if( data.backgroundSize ) element.setAttribute( 'data-background-size', data.backgroundSize );
if( data.backgroundColor ) element.style.backgroundColor = data.backgroundColor;
if( data.backgroundTransition ) element.setAttribute( 'data-background-transition', data.backgroundTransition );
if( slide.hasAttribute( 'data-preload' ) ) element.setAttribute( 'data-preload', '' );
// Background image options are set on the content wrapper
if( data.backgroundSize ) contentElement.style.backgroundSize = data.backgroundSize;
if( data.backgroundRepeat ) contentElement.style.backgroundRepeat = data.backgroundRepeat;
if( data.backgroundPosition ) contentElement.style.backgroundPosition = data.backgroundPosition;
if( data.backgroundOpacity ) contentElement.style.opacity = data.backgroundOpacity;
// If this slide has a background color, we add a class that
// signals if it is light or dark. If the slide has no background
// color, no class will be added
let contrastColor = data.backgroundColor;
// If no bg color was found, check the computed background
if( !contrastColor ) {
let computedBackgroundStyle = window.getComputedStyle( element );
if( computedBackgroundStyle && computedBackgroundStyle.backgroundColor ) {
contrastColor = computedBackgroundStyle.backgroundColor;
}
}
if( contrastColor ) {
let rgb = colorToRgb( contrastColor );
// Ignore fully transparent backgrounds. Some browsers return
// rgba(0,0,0,0) when reading the computed background color of
// an element with no background
if( rgb && rgb.a !== 0 ) {
if( colorBrightness( contrastColor ) < 128 ) {
slide.classList.add( 'has-dark-background' );
}
else {
slide.classList.add( 'has-light-background' );
}
}
}
}
/**
* Updates the background elements to reflect the current
* slide.
*
* @param {boolean} includeAll If true, the backgrounds of
* all vertical slides (not just the present) will be updated.
*/
update( includeAll = false ) {
let currentSlide = this.Reveal.getCurrentSlide();
let indices = this.Reveal.getIndices();
let currentBackground = null;
// Reverse past/future classes when in RTL mode
let horizontalPast = this.Reveal.getConfig().rtl ? 'future' : 'past',
horizontalFuture = this.Reveal.getConfig().rtl ? 'past' : 'future';
// Update the classes of all backgrounds to match the
// states of their slides (past/present/future)
Array.from( this.element.childNodes ).forEach( ( backgroundh, h ) => {
backgroundh.classList.remove( 'past', 'present', 'future' );
if( h < indices.h ) {
backgroundh.classList.add( horizontalPast );
}
else if ( h > indices.h ) {
backgroundh.classList.add( horizontalFuture );
}
else {
backgroundh.classList.add( 'present' );
// Store a reference to the current background element
currentBackground = backgroundh;
}
if( includeAll || h === indices.h ) {
queryAll( backgroundh, '.slide-background' ).forEach( ( backgroundv, v ) => {
backgroundv.classList.remove( 'past', 'present', 'future' );
if( v < indices.v ) {
backgroundv.classList.add( 'past' );
}
else if ( v > indices.v ) {
backgroundv.classList.add( 'future' );
}
else {
backgroundv.classList.add( 'present' );
// Only if this is the present horizontal and vertical slide
if( h === indices.h ) currentBackground = backgroundv;
}
} );
}
} );
// Stop content inside of previous backgrounds
if( this.previousBackground ) {
this.Reveal.slideContent.stopEmbeddedContent( this.previousBackground, { unloadIframes: !this.Reveal.slideContent.shouldPreload( this.previousBackground ) } );
}
// Start content in the current background
if( currentBackground ) {
this.Reveal.slideContent.startEmbeddedContent( currentBackground );
let currentBackgroundContent = currentBackground.querySelector( '.slide-background-content' );
if( currentBackgroundContent ) {
let backgroundImageURL = currentBackgroundContent.style.backgroundImage || '';
// Restart GIFs (doesn't work in Firefox)
if( /\.gif/i.test( backgroundImageURL ) ) {
currentBackgroundContent.style.backgroundImage = '';
window.getComputedStyle( currentBackgroundContent ).opacity;
currentBackgroundContent.style.backgroundImage = backgroundImageURL;
}
}
// Don't transition between identical backgrounds. This
// prevents unwanted flicker.
let previousBackgroundHash = this.previousBackground ? this.previousBackground.getAttribute( 'data-background-hash' ) : null;
let currentBackgroundHash = currentBackground.getAttribute( 'data-background-hash' );
if( currentBackgroundHash && currentBackgroundHash === previousBackgroundHash && currentBackground !== this.previousBackground ) {
this.element.classList.add( 'no-transition' );
}
this.previousBackground = currentBackground;
}
// If there's a background brightness flag for this slide,
// bubble it to the .reveal container
if( currentSlide ) {
[ 'has-light-background', 'has-dark-background' ].forEach( classToBubble => {
if( currentSlide.classList.contains( classToBubble ) ) {
this.Reveal.getRevealElement().classList.add( classToBubble );
}
else {
this.Reveal.getRevealElement().classList.remove( classToBubble );
}
}, this );
}
// Allow the first background to apply without transition
setTimeout( () => {
this.element.classList.remove( 'no-transition' );
}, 1 );
}
/**
* Updates the position of the parallax background based
* on the current slide index.
*/
updateParallax() {
let indices = this.Reveal.getIndices();
if( this.Reveal.getConfig().parallaxBackgroundImage ) {
let horizontalSlides = this.Reveal.getHorizontalSlides(),
verticalSlides = this.Reveal.getVerticalSlides();
let backgroundSize = this.element.style.backgroundSize.split( ' ' ),
backgroundWidth, backgroundHeight;
if( backgroundSize.length === 1 ) {
backgroundWidth = backgroundHeight = parseInt( backgroundSize[0], 10 );
}
else {
backgroundWidth = parseInt( backgroundSize[0], 10 );
backgroundHeight = parseInt( backgroundSize[1], 10 );
}
let slideWidth = this.element.offsetWidth,
horizontalSlideCount = horizontalSlides.length,
horizontalOffsetMultiplier,
horizontalOffset;
if( typeof this.Reveal.getConfig().parallaxBackgroundHorizontal === 'number' ) {
horizontalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundHorizontal;
}
else {
horizontalOffsetMultiplier = horizontalSlideCount > 1 ? ( backgroundWidth - slideWidth ) / ( horizontalSlideCount-1 ) : 0;
}
horizontalOffset = horizontalOffsetMultiplier * indices.h * -1;
let slideHeight = this.element.offsetHeight,
verticalSlideCount = verticalSlides.length,
verticalOffsetMultiplier,
verticalOffset;
if( typeof this.Reveal.getConfig().parallaxBackgroundVertical === 'number' ) {
verticalOffsetMultiplier = this.Reveal.getConfig().parallaxBackgroundVertical;
}
else {
verticalOffsetMultiplier = ( backgroundHeight - slideHeight ) / ( verticalSlideCount-1 );
}
verticalOffset = verticalSlideCount > 0 ? verticalOffsetMultiplier * indices.v : 0;
this.element.style.backgroundPosition = horizontalOffset + 'px ' + -verticalOffset + 'px';
}
}
}

259
js/controllers/controls.js vendored Normal file
View File

@@ -0,0 +1,259 @@
import { queryAll } from '../utils/util.js'
import { isAndroid } from '../utils/device.js'
/**
* Manages our presentation controls. This includes both
* the built-in control arrows as well as event monitoring
* of any elements within the presentation with either of the
* following helper classes:
* - .navigate-up
* - .navigate-right
* - .navigate-down
* - .navigate-left
* - .navigate-next
* - .navigate-prev
*/
export default class Controls {
constructor( Reveal ) {
this.Reveal = Reveal;
this.onNavigateLeftClicked = this.onNavigateLeftClicked.bind( this );
this.onNavigateRightClicked = this.onNavigateRightClicked.bind( this );
this.onNavigateUpClicked = this.onNavigateUpClicked.bind( this );
this.onNavigateDownClicked = this.onNavigateDownClicked.bind( this );
this.onNavigatePrevClicked = this.onNavigatePrevClicked.bind( this );
this.onNavigateNextClicked = this.onNavigateNextClicked.bind( this );
}
render() {
const rtl = this.Reveal.getConfig().rtl;
const revealElement = this.Reveal.getRevealElement();
this.element = document.createElement( 'aside' );
this.element.className = 'controls';
this.element.innerHTML =
`<button class="navigate-left" aria-label="${ rtl ? 'next slide' : 'previous slide' }"><div class="controls-arrow"></div></button>
<button class="navigate-right" aria-label="${ rtl ? 'previous slide' : 'next slide' }"><div class="controls-arrow"></div></button>
<button class="navigate-up" aria-label="above slide"><div class="controls-arrow"></div></button>
<button class="navigate-down" aria-label="below slide"><div class="controls-arrow"></div></button>`;
this.Reveal.getRevealElement().appendChild( this.element );
// There can be multiple instances of controls throughout the page
this.controlsLeft = queryAll( revealElement, '.navigate-left' );
this.controlsRight = queryAll( revealElement, '.navigate-right' );
this.controlsUp = queryAll( revealElement, '.navigate-up' );
this.controlsDown = queryAll( revealElement, '.navigate-down' );
this.controlsPrev = queryAll( revealElement, '.navigate-prev' );
this.controlsNext = queryAll( revealElement, '.navigate-next' );
// The left, right and down arrows in the standard reveal.js controls
this.controlsRightArrow = this.element.querySelector( '.navigate-right' );
this.controlsLeftArrow = this.element.querySelector( '.navigate-left' );
this.controlsDownArrow = this.element.querySelector( '.navigate-down' );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
this.element.style.display = config.controls ? 'block' : 'none';
this.element.setAttribute( 'data-controls-layout', config.controlsLayout );
this.element.setAttribute( 'data-controls-back-arrows', config.controlsBackArrows );
}
bind() {
// Listen to both touch and click events, in case the device
// supports both
let pointerEvents = [ 'touchstart', 'click' ];
// Only support touch for Android, fixes double navigations in
// stock browser
if( isAndroid ) {
pointerEvents = [ 'touchstart' ];
}
pointerEvents.forEach( eventName => {
this.controlsLeft.forEach( el => el.addEventListener( eventName, this.onNavigateLeftClicked, false ) );
this.controlsRight.forEach( el => el.addEventListener( eventName, this.onNavigateRightClicked, false ) );
this.controlsUp.forEach( el => el.addEventListener( eventName, this.onNavigateUpClicked, false ) );
this.controlsDown.forEach( el => el.addEventListener( eventName, this.onNavigateDownClicked, false ) );
this.controlsPrev.forEach( el => el.addEventListener( eventName, this.onNavigatePrevClicked, false ) );
this.controlsNext.forEach( el => el.addEventListener( eventName, this.onNavigateNextClicked, false ) );
} );
}
unbind() {
[ 'touchstart', 'click' ].forEach( eventName => {
this.controlsLeft.forEach( el => el.removeEventListener( eventName, this.onNavigateLeftClicked, false ) );
this.controlsRight.forEach( el => el.removeEventListener( eventName, this.onNavigateRightClicked, false ) );
this.controlsUp.forEach( el => el.removeEventListener( eventName, this.onNavigateUpClicked, false ) );
this.controlsDown.forEach( el => el.removeEventListener( eventName, this.onNavigateDownClicked, false ) );
this.controlsPrev.forEach( el => el.removeEventListener( eventName, this.onNavigatePrevClicked, false ) );
this.controlsNext.forEach( el => el.removeEventListener( eventName, this.onNavigateNextClicked, false ) );
} );
}
/**
* Updates the state of all control/navigation arrows.
*/
update() {
let routes = this.Reveal.availableRoutes();
// Remove the 'enabled' class from all directions
[...this.controlsLeft, ...this.controlsRight, ...this.controlsUp, ...this.controlsDown, ...this.controlsPrev, ...this.controlsNext].forEach( node => {
node.classList.remove( 'enabled', 'fragmented' );
// Set 'disabled' attribute on all directions
node.setAttribute( 'disabled', 'disabled' );
} );
// Add the 'enabled' class to the available routes; remove 'disabled' attribute to enable buttons
if( routes.left ) this.controlsLeft.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( routes.right ) this.controlsRight.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( routes.up ) this.controlsUp.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( routes.down ) this.controlsDown.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
// Prev/next buttons
if( routes.left || routes.up ) this.controlsPrev.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( routes.right || routes.down ) this.controlsNext.forEach( el => { el.classList.add( 'enabled' ); el.removeAttribute( 'disabled' ); } );
// Highlight fragment directions
let currentSlide = this.Reveal.getCurrentSlide();
if( currentSlide ) {
let fragmentsRoutes = this.Reveal.fragments.availableRoutes();
// Always apply fragment decorator to prev/next buttons
if( fragmentsRoutes.prev ) this.controlsPrev.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( fragmentsRoutes.next ) this.controlsNext.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
// Apply fragment decorators to directional buttons based on
// what slide axis they are in
if( this.Reveal.isVerticalSlide( currentSlide ) ) {
if( fragmentsRoutes.prev ) this.controlsUp.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( fragmentsRoutes.next ) this.controlsDown.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
}
else {
if( fragmentsRoutes.prev ) this.controlsLeft.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
if( fragmentsRoutes.next ) this.controlsRight.forEach( el => { el.classList.add( 'fragmented', 'enabled' ); el.removeAttribute( 'disabled' ); } );
}
}
if( this.Reveal.getConfig().controlsTutorial ) {
let indices = this.Reveal.getIndices();
// Highlight control arrows with an animation to ensure
// that the viewer knows how to navigate
if( !this.Reveal.hasNavigatedVertically() && routes.down ) {
this.controlsDownArrow.classList.add( 'highlight' );
}
else {
this.controlsDownArrow.classList.remove( 'highlight' );
if( this.Reveal.getConfig().rtl ) {
if( !this.Reveal.hasNavigatedHorizontally() && routes.left && indices.v === 0 ) {
this.controlsLeftArrow.classList.add( 'highlight' );
}
else {
this.controlsLeftArrow.classList.remove( 'highlight' );
}
} else {
if( !this.Reveal.hasNavigatedHorizontally() && routes.right && indices.v === 0 ) {
this.controlsRightArrow.classList.add( 'highlight' );
}
else {
this.controlsRightArrow.classList.remove( 'highlight' );
}
}
}
}
}
/**
* Event handlers for navigation control buttons.
*/
onNavigateLeftClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
if( this.Reveal.getConfig().navigationMode === 'linear' ) {
this.Reveal.prev();
}
else {
this.Reveal.left();
}
}
onNavigateRightClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
if( this.Reveal.getConfig().navigationMode === 'linear' ) {
this.Reveal.next();
}
else {
this.Reveal.right();
}
}
onNavigateUpClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
this.Reveal.up();
}
onNavigateDownClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
this.Reveal.down();
}
onNavigatePrevClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
this.Reveal.prev();
}
onNavigateNextClicked( event ) {
event.preventDefault();
this.Reveal.onUserInput();
this.Reveal.next();
}
}

97
js/controllers/focus.js Normal file
View File

@@ -0,0 +1,97 @@
import { closest } from '../utils/util.js'
/**
* Manages focus when a presentation is embedded. This
* helps us only capture keyboard from the presentation
* a user is currently interacting with in a page where
* multiple presentations are embedded.
*/
const STATE_FOCUS = 'focus';
const STATE_BLUR = 'blur';
export default class Focus {
constructor( Reveal ) {
this.Reveal = Reveal;
this.onRevealPointerDown = this.onRevealPointerDown.bind( this );
this.onDocumentPointerDown = this.onDocumentPointerDown.bind( this );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
if( config.embedded ) {
this.blur();
}
else {
this.focus();
this.unbind();
}
}
bind() {
if( this.Reveal.getConfig().embedded ) {
this.Reveal.getRevealElement().addEventListener( 'pointerdown', this.onRevealPointerDown, false );
}
}
unbind() {
this.Reveal.getRevealElement().removeEventListener( 'pointerdown', this.onRevealPointerDown, false );
document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );
}
focus() {
if( this.state !== STATE_FOCUS ) {
this.Reveal.getRevealElement().classList.add( 'focused' );
document.addEventListener( 'pointerdown', this.onDocumentPointerDown, false );
}
this.state = STATE_FOCUS;
}
blur() {
if( this.state !== STATE_BLUR ) {
this.Reveal.getRevealElement().classList.remove( 'focused' );
document.removeEventListener( 'pointerdown', this.onDocumentPointerDown, false );
}
this.state = STATE_BLUR;
}
isFocused() {
return this.state === STATE_FOCUS;
}
onRevealPointerDown( event ) {
this.focus();
}
onDocumentPointerDown( event ) {
let revealElement = closest( event.target, '.reveal' );
if( !revealElement || revealElement !== this.Reveal.getRevealElement() ) {
this.blur();
}
}
}

375
js/controllers/fragments.js Normal file
View File

@@ -0,0 +1,375 @@
import { extend, queryAll } from '../utils/util.js'
/**
* Handles sorting and navigation of slide fragments.
* Fragments are elements within a slide that are
* revealed/animated incrementally.
*/
export default class Fragments {
constructor( Reveal ) {
this.Reveal = Reveal;
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
if( config.fragments === false ) {
this.disable();
}
else if( oldConfig.fragments === false ) {
this.enable();
}
}
/**
* If fragments are disabled in the deck, they should all be
* visible rather than stepped through.
*/
disable() {
queryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {
element.classList.add( 'visible' );
element.classList.remove( 'current-fragment' );
} );
}
/**
* Reverse of #disable(). Only called if fragments have
* previously been disabled.
*/
enable() {
queryAll( this.Reveal.getSlidesElement(), '.fragment' ).forEach( element => {
element.classList.remove( 'visible' );
element.classList.remove( 'current-fragment' );
} );
}
/**
* Returns an object describing the available fragment
* directions.
*
* @return {{prev: boolean, next: boolean}}
*/
availableRoutes() {
let currentSlide = this.Reveal.getCurrentSlide();
if( currentSlide && this.Reveal.getConfig().fragments ) {
let fragments = currentSlide.querySelectorAll( '.fragment:not(.disabled)' );
let hiddenFragments = currentSlide.querySelectorAll( '.fragment:not(.disabled):not(.visible)' );
return {
prev: fragments.length - hiddenFragments.length > 0,
next: !!hiddenFragments.length
};
}
else {
return { prev: false, next: false };
}
}
/**
* Return a sorted fragments list, ordered by an increasing
* "data-fragment-index" attribute.
*
* Fragments will be revealed in the order that they are returned by
* this function, so you can use the index attributes to control the
* order of fragment appearance.
*
* To maintain a sensible default fragment order, fragments are presumed
* to be passed in document order. This function adds a "fragment-index"
* attribute to each node if such an attribute is not already present,
* and sets that attribute to an integer value which is the position of
* the fragment within the fragments list.
*
* @param {object[]|*} fragments
* @param {boolean} grouped If true the returned array will contain
* nested arrays for all fragments with the same index
* @return {object[]} sorted Sorted array of fragments
*/
sort( fragments, grouped = false ) {
fragments = Array.from( fragments );
let ordered = [],
unordered = [],
sorted = [];
// Group ordered and unordered elements
fragments.forEach( fragment => {
if( fragment.hasAttribute( 'data-fragment-index' ) ) {
let index = parseInt( fragment.getAttribute( 'data-fragment-index' ), 10 );
if( !ordered[index] ) {
ordered[index] = [];
}
ordered[index].push( fragment );
}
else {
unordered.push( [ fragment ] );
}
} );
// Append fragments without explicit indices in their
// DOM order
ordered = ordered.concat( unordered );
// Manually count the index up per group to ensure there
// are no gaps
let index = 0;
// Push all fragments in their sorted order to an array,
// this flattens the groups
ordered.forEach( group => {
group.forEach( fragment => {
sorted.push( fragment );
fragment.setAttribute( 'data-fragment-index', index );
} );
index ++;
} );
return grouped === true ? ordered : sorted;
}
/**
* Sorts and formats all of fragments in the
* presentation.
*/
sortAll() {
this.Reveal.getHorizontalSlides().forEach( horizontalSlide => {
let verticalSlides = queryAll( horizontalSlide, 'section' );
verticalSlides.forEach( ( verticalSlide, y ) => {
this.sort( verticalSlide.querySelectorAll( '.fragment' ) );
}, this );
if( verticalSlides.length === 0 ) this.sort( horizontalSlide.querySelectorAll( '.fragment' ) );
} );
}
/**
* Refreshes the fragments on the current slide so that they
* have the appropriate classes (.visible + .current-fragment).
*
* @param {number} [index] The index of the current fragment
* @param {array} [fragments] Array containing all fragments
* in the current slide
*
* @return {{shown: array, hidden: array}}
*/
update( index, fragments ) {
let changedFragments = {
shown: [],
hidden: []
};
let currentSlide = this.Reveal.getCurrentSlide();
if( currentSlide && this.Reveal.getConfig().fragments ) {
fragments = fragments || this.sort( currentSlide.querySelectorAll( '.fragment' ) );
if( fragments.length ) {
let maxIndex = 0;
if( typeof index !== 'number' ) {
let currentFragment = this.sort( currentSlide.querySelectorAll( '.fragment.visible' ) ).pop();
if( currentFragment ) {
index = parseInt( currentFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );
}
}
Array.from( fragments ).forEach( ( el, i ) => {
if( el.hasAttribute( 'data-fragment-index' ) ) {
i = parseInt( el.getAttribute( 'data-fragment-index' ), 10 );
}
maxIndex = Math.max( maxIndex, i );
// Visible fragments
if( i <= index ) {
let wasVisible = el.classList.contains( 'visible' )
el.classList.add( 'visible' );
el.classList.remove( 'current-fragment' );
if( i === index ) {
// Announce the fragments one by one to the Screen Reader
this.Reveal.announceStatus( this.Reveal.getStatusText( el ) );
el.classList.add( 'current-fragment' );
this.Reveal.slideContent.startEmbeddedContent( el );
}
if( !wasVisible ) {
changedFragments.shown.push( el )
this.Reveal.dispatchEvent({
target: el,
type: 'visible',
bubbles: false
});
}
}
// Hidden fragments
else {
let wasVisible = el.classList.contains( 'visible' )
el.classList.remove( 'visible' );
el.classList.remove( 'current-fragment' );
if( wasVisible ) {
changedFragments.hidden.push( el );
this.Reveal.dispatchEvent({
target: el,
type: 'hidden',
bubbles: false
});
}
}
} );
// Write the current fragment index to the slide <section>.
// This can be used by end users to apply styles based on
// the current fragment index.
index = typeof index === 'number' ? index : -1;
index = Math.max( Math.min( index, maxIndex ), -1 );
currentSlide.setAttribute( 'data-fragment', index );
}
}
return changedFragments;
}
/**
* Formats the fragments on the given slide so that they have
* valid indices. Call this if fragments are changed in the DOM
* after reveal.js has already initialized.
*
* @param {HTMLElement} slide
* @return {Array} a list of the HTML fragments that were synced
*/
sync( slide = this.Reveal.getCurrentSlide() ) {
return this.sort( slide.querySelectorAll( '.fragment' ) );
}
/**
* Navigate to the specified slide fragment.
*
* @param {?number} index The index of the fragment that
* should be shown, -1 means all are invisible
* @param {number} offset Integer offset to apply to the
* fragment index
*
* @return {boolean} true if a change was made in any
* fragments visibility as part of this call
*/
goto( index, offset = 0 ) {
let currentSlide = this.Reveal.getCurrentSlide();
if( currentSlide && this.Reveal.getConfig().fragments ) {
let fragments = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled)' ) );
if( fragments.length ) {
// If no index is specified, find the current
if( typeof index !== 'number' ) {
let lastVisibleFragment = this.sort( currentSlide.querySelectorAll( '.fragment:not(.disabled).visible' ) ).pop();
if( lastVisibleFragment ) {
index = parseInt( lastVisibleFragment.getAttribute( 'data-fragment-index' ) || 0, 10 );
}
else {
index = -1;
}
}
// Apply the offset if there is one
index += offset;
let changedFragments = this.update( index, fragments );
if( changedFragments.hidden.length ) {
this.Reveal.dispatchEvent({
type: 'fragmenthidden',
data: {
fragment: changedFragments.hidden[0],
fragments: changedFragments.hidden
}
});
}
if( changedFragments.shown.length ) {
this.Reveal.dispatchEvent({
type: 'fragmentshown',
data: {
fragment: changedFragments.shown[0],
fragments: changedFragments.shown
}
});
}
this.Reveal.controls.update();
this.Reveal.progress.update();
if( this.Reveal.getConfig().fragmentInURL ) {
this.Reveal.location.writeURL();
}
return !!( changedFragments.shown.length || changedFragments.hidden.length );
}
}
return false;
}
/**
* Navigate to the next slide fragment.
*
* @return {boolean} true if there was a next fragment,
* false otherwise
*/
next() {
return this.goto( null, 1 );
}
/**
* Navigate to the previous slide fragment.
*
* @return {boolean} true if there was a previous fragment,
* false otherwise
*/
prev() {
return this.goto( null, -1 );
}
}

388
js/controllers/keyboard.js Normal file
View File

@@ -0,0 +1,388 @@
import { enterFullscreen } from '../utils/util.js'
/**
* Handles all reveal.js keyboard interactions.
*/
export default class Keyboard {
constructor( Reveal ) {
this.Reveal = Reveal;
// A key:value map of keyboard keys and descriptions of
// the actions they trigger
this.shortcuts = {};
// Holds custom key code mappings
this.bindings = {};
this.onDocumentKeyDown = this.onDocumentKeyDown.bind( this );
this.onDocumentKeyPress = this.onDocumentKeyPress.bind( this );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
if( config.navigationMode === 'linear' ) {
this.shortcuts['&#8594; , &#8595; , SPACE , N , L , J'] = 'Next slide';
this.shortcuts['&#8592; , &#8593; , P , H , K'] = 'Previous slide';
}
else {
this.shortcuts['N , SPACE'] = 'Next slide';
this.shortcuts['P'] = 'Previous slide';
this.shortcuts['&#8592; , H'] = 'Navigate left';
this.shortcuts['&#8594; , L'] = 'Navigate right';
this.shortcuts['&#8593; , K'] = 'Navigate up';
this.shortcuts['&#8595; , J'] = 'Navigate down';
}
this.shortcuts['Home , Shift &#8592;'] = 'First slide';
this.shortcuts['End , Shift &#8594;'] = 'Last slide';
this.shortcuts['B , .'] = 'Pause';
this.shortcuts['F'] = 'Fullscreen';
this.shortcuts['ESC, O'] = 'Slide overview';
}
/**
* Starts listening for keyboard events.
*/
bind() {
document.addEventListener( 'keydown', this.onDocumentKeyDown, false );
document.addEventListener( 'keypress', this.onDocumentKeyPress, false );
}
/**
* Stops listening for keyboard events.
*/
unbind() {
document.removeEventListener( 'keydown', this.onDocumentKeyDown, false );
document.removeEventListener( 'keypress', this.onDocumentKeyPress, false );
}
/**
* Add a custom key binding with optional description to
* be added to the help screen.
*/
addKeyBinding( binding, callback ) {
if( typeof binding === 'object' && binding.keyCode ) {
this.bindings[binding.keyCode] = {
callback: callback,
key: binding.key,
description: binding.description
};
}
else {
this.bindings[binding] = {
callback: callback,
key: null,
description: null
};
}
}
/**
* Removes the specified custom key binding.
*/
removeKeyBinding( keyCode ) {
delete this.bindings[keyCode];
}
/**
* Programmatically triggers a keyboard event
*
* @param {int} keyCode
*/
triggerKey( keyCode ) {
this.onDocumentKeyDown( { keyCode } );
}
/**
* Registers a new shortcut to include in the help overlay
*
* @param {String} key
* @param {String} value
*/
registerKeyboardShortcut( key, value ) {
this.shortcuts[key] = value;
}
getShortcuts() {
return this.shortcuts;
}
getBindings() {
return this.bindings;
}
/**
* Handler for the document level 'keypress' event.
*
* @param {object} event
*/
onDocumentKeyPress( event ) {
// Check if the pressed key is question mark
if( event.shiftKey && event.charCode === 63 ) {
this.Reveal.toggleHelp();
}
}
/**
* Handler for the document level 'keydown' event.
*
* @param {object} event
*/
onDocumentKeyDown( event ) {
let config = this.Reveal.getConfig();
// If there's a condition specified and it returns false,
// ignore this event
if( typeof config.keyboardCondition === 'function' && config.keyboardCondition(event) === false ) {
return true;
}
// If keyboardCondition is set, only capture keyboard events
// for embedded decks when they are focused
if( config.keyboardCondition === 'focused' && !this.Reveal.isFocused() ) {
return true;
}
// Shorthand
let keyCode = event.keyCode;
// Remember if auto-sliding was paused so we can toggle it
let autoSlideWasPaused = !this.Reveal.isAutoSliding();
this.Reveal.onUserInput( event );
// Is there a focused element that could be using the keyboard?
let activeElementIsCE = document.activeElement && document.activeElement.isContentEditable === true;
let activeElementIsInput = document.activeElement && document.activeElement.tagName && /input|textarea/i.test( document.activeElement.tagName );
let activeElementIsNotes = document.activeElement && document.activeElement.className && /speaker-notes/i.test( document.activeElement.className);
// Whitelist specific modified + keycode combinations
let prevSlideShortcut = event.shiftKey && event.keyCode === 32;
let firstSlideShortcut = event.shiftKey && keyCode === 37;
let lastSlideShortcut = event.shiftKey && keyCode === 39;
// Prevent all other events when a modifier is pressed
let unusedModifier = !prevSlideShortcut && !firstSlideShortcut && !lastSlideShortcut &&
( event.shiftKey || event.altKey || event.ctrlKey || event.metaKey );
// Disregard the event if there's a focused element or a
// keyboard modifier key is present
if( activeElementIsCE || activeElementIsInput || activeElementIsNotes || unusedModifier ) return;
// While paused only allow resume keyboard events; 'b', 'v', '.'
let resumeKeyCodes = [66,86,190,191];
let key;
// Custom key bindings for togglePause should be able to resume
if( typeof config.keyboard === 'object' ) {
for( key in config.keyboard ) {
if( config.keyboard[key] === 'togglePause' ) {
resumeKeyCodes.push( parseInt( key, 10 ) );
}
}
}
if( this.Reveal.isPaused() && resumeKeyCodes.indexOf( keyCode ) === -1 ) {
return false;
}
// Use linear navigation if we're configured to OR if
// the presentation is one-dimensional
let useLinearMode = config.navigationMode === 'linear' || !this.Reveal.hasHorizontalSlides() || !this.Reveal.hasVerticalSlides();
let triggered = false;
// 1. User defined key bindings
if( typeof config.keyboard === 'object' ) {
for( key in config.keyboard ) {
// Check if this binding matches the pressed key
if( parseInt( key, 10 ) === keyCode ) {
let value = config.keyboard[ key ];
// Callback function
if( typeof value === 'function' ) {
value.apply( null, [ event ] );
}
// String shortcuts to reveal.js API
else if( typeof value === 'string' && typeof this.Reveal[ value ] === 'function' ) {
this.Reveal[ value ].call();
}
triggered = true;
}
}
}
// 2. Registered custom key bindings
if( triggered === false ) {
for( key in this.bindings ) {
// Check if this binding matches the pressed key
if( parseInt( key, 10 ) === keyCode ) {
let action = this.bindings[ key ].callback;
// Callback function
if( typeof action === 'function' ) {
action.apply( null, [ event ] );
}
// String shortcuts to reveal.js API
else if( typeof action === 'string' && typeof this.Reveal[ action ] === 'function' ) {
this.Reveal[ action ].call();
}
triggered = true;
}
}
}
// 3. System defined key bindings
if( triggered === false ) {
// Assume true and try to prove false
triggered = true;
// P, PAGE UP
if( keyCode === 80 || keyCode === 33 ) {
this.Reveal.prev();
}
// N, PAGE DOWN
else if( keyCode === 78 || keyCode === 34 ) {
this.Reveal.next();
}
// H, LEFT
else if( keyCode === 72 || keyCode === 37 ) {
if( firstSlideShortcut ) {
this.Reveal.slide( 0 );
}
else if( !this.Reveal.overview.isActive() && useLinearMode ) {
this.Reveal.prev();
}
else {
this.Reveal.left();
}
}
// L, RIGHT
else if( keyCode === 76 || keyCode === 39 ) {
if( lastSlideShortcut ) {
this.Reveal.slide( Number.MAX_VALUE );
}
else if( !this.Reveal.overview.isActive() && useLinearMode ) {
this.Reveal.next();
}
else {
this.Reveal.right();
}
}
// K, UP
else if( keyCode === 75 || keyCode === 38 ) {
if( !this.Reveal.overview.isActive() && useLinearMode ) {
this.Reveal.prev();
}
else {
this.Reveal.up();
}
}
// J, DOWN
else if( keyCode === 74 || keyCode === 40 ) {
if( !this.Reveal.overview.isActive() && useLinearMode ) {
this.Reveal.next();
}
else {
this.Reveal.down();
}
}
// HOME
else if( keyCode === 36 ) {
this.Reveal.slide( 0 );
}
// END
else if( keyCode === 35 ) {
this.Reveal.slide( Number.MAX_VALUE );
}
// SPACE
else if( keyCode === 32 ) {
if( this.Reveal.overview.isActive() ) {
this.Reveal.overview.deactivate();
}
if( event.shiftKey ) {
this.Reveal.prev();
}
else {
this.Reveal.next();
}
}
// TWO-SPOT, SEMICOLON, B, V, PERIOD, LOGITECH PRESENTER TOOLS "BLACK SCREEN" BUTTON
else if( keyCode === 58 || keyCode === 59 || keyCode === 66 || keyCode === 86 || keyCode === 190 || keyCode === 191 ) {
this.Reveal.togglePause();
}
// F
else if( keyCode === 70 ) {
enterFullscreen( config.embedded ? this.Reveal.getViewportElement() : document.documentElement );
}
// A
else if( keyCode === 65 ) {
if ( config.autoSlideStoppable ) {
this.Reveal.toggleAutoSlide( autoSlideWasPaused );
}
}
else {
triggered = false;
}
}
// If the input resulted in a triggered action we should prevent
// the browsers default behavior
if( triggered ) {
event.preventDefault && event.preventDefault();
}
// ESC or O key
else if( keyCode === 27 || keyCode === 79 ) {
if( this.Reveal.closeOverlay() === false ) {
this.Reveal.overview.toggle();
}
event.preventDefault && event.preventDefault();
}
// If auto-sliding is enabled we need to cue up
// another timeout
this.Reveal.cueAutoSlide();
}
}

209
js/controllers/location.js Normal file
View File

@@ -0,0 +1,209 @@
/**
* Reads and writes the URL based on reveal.js' current state.
*/
export default class Location {
constructor( Reveal ) {
this.Reveal = Reveal;
// Delays updates to the URL due to a Chrome thumbnailer bug
this.writeURLTimeout = 0;
this.onWindowHashChange = this.onWindowHashChange.bind( this );
}
bind() {
window.addEventListener( 'hashchange', this.onWindowHashChange, false );
}
unbind() {
window.removeEventListener( 'hashchange', this.onWindowHashChange, false );
}
/**
* Reads the current URL (hash) and navigates accordingly.
*/
readURL() {
let config = this.Reveal.getConfig();
let indices = this.Reveal.getIndices();
let currentSlide = this.Reveal.getCurrentSlide();
let hash = window.location.hash;
// Attempt to parse the hash as either an index or name
let bits = hash.slice( 2 ).split( '/' ),
name = hash.replace( /#\/?/gi, '' );
// If the first bit is not fully numeric and there is a name we
// can assume that this is a named link
if( !/^[0-9]*$/.test( bits[0] ) && name.length ) {
let element;
let f;
// Parse named links with fragments (#/named-link/2)
if( /\/[-\d]+$/g.test( name ) ) {
f = parseInt( name.split( '/' ).pop(), 10 );
f = isNaN(f) ? undefined : f;
name = name.split( '/' ).shift();
}
// Ensure the named link is a valid HTML ID attribute
try {
element = document.getElementById( decodeURIComponent( name ) );
}
catch ( error ) { }
// Ensure that we're not already on a slide with the same name
let isSameNameAsCurrentSlide = currentSlide ? currentSlide.getAttribute( 'id' ) === name : false;
if( element ) {
// If the slide exists and is not the current slide...
if ( !isSameNameAsCurrentSlide || typeof f !== 'undefined' ) {
// ...find the position of the named slide and navigate to it
let slideIndices = this.Reveal.getIndices( element );
this.Reveal.slide( slideIndices.h, slideIndices.v, f );
}
}
// If the slide doesn't exist, navigate to the current slide
else {
this.Reveal.slide( indices.h || 0, indices.v || 0 );
}
}
else {
let hashIndexBase = config.hashOneBasedIndex ? 1 : 0;
// Read the index components of the hash
let h = ( parseInt( bits[0], 10 ) - hashIndexBase ) || 0,
v = ( parseInt( bits[1], 10 ) - hashIndexBase ) || 0,
f;
if( config.fragmentInURL ) {
f = parseInt( bits[2], 10 );
if( isNaN( f ) ) {
f = undefined;
}
}
if( h !== indices.h || v !== indices.v || f !== undefined ) {
this.Reveal.slide( h, v, f );
}
}
}
/**
* Updates the page URL (hash) to reflect the current
* state.
*
* @param {number} delay The time in ms to wait before
* writing the hash
*/
writeURL( delay ) {
let config = this.Reveal.getConfig();
let currentSlide = this.Reveal.getCurrentSlide();
// Make sure there's never more than one timeout running
clearTimeout( this.writeURLTimeout );
// If a delay is specified, timeout this call
if( typeof delay === 'number' ) {
this.writeURLTimeout = setTimeout( this.writeURL, delay );
}
else if( currentSlide ) {
let hash = this.getHash();
// If we're configured to push to history OR the history
// API is not avaialble.
if( config.history ) {
window.location.hash = hash;
}
// If we're configured to reflect the current slide in the
// URL without pushing to history.
else if( config.hash ) {
// If the hash is empty, don't add it to the URL
if( hash === '/' ) {
window.history.replaceState( null, null, window.location.pathname + window.location.search );
}
else {
window.history.replaceState( null, null, '#' + hash );
}
}
// UPDATE: The below nuking of all hash changes breaks
// anchors on pages where reveal.js is running. Removed
// in 4.0. Why was it here in the first place? ¯\_(ツ)_/¯
//
// If history and hash are both disabled, a hash may still
// be added to the URL by clicking on a href with a hash
// target. Counter this by always removing the hash.
// else {
// window.history.replaceState( null, null, window.location.pathname + window.location.search );
// }
}
}
/**
* Return a hash URL that will resolve to the given slide location.
*
* @param {HTMLElement} [slide=currentSlide] The slide to link to
*/
getHash( slide ) {
let url = '/';
// Attempt to create a named link based on the slide's ID
let s = slide || this.Reveal.getCurrentSlide();
let id = s ? s.getAttribute( 'id' ) : null;
if( id ) {
id = encodeURIComponent( id );
}
let index = this.Reveal.getIndices( slide );
if( !this.Reveal.getConfig().fragmentInURL ) {
index.f = undefined;
}
// If the current slide has an ID, use that as a named link,
// but we don't support named links with a fragment index
if( typeof id === 'string' && id.length ) {
url = '/' + id;
// If there is also a fragment, append that at the end
// of the named link, like: #/named-link/2
if( index.f >= 0 ) url += '/' + index.f;
}
// Otherwise use the /h/v index
else {
let hashIndexBase = this.Reveal.getConfig().hashOneBasedIndex ? 1 : 0;
if( index.h > 0 || index.v > 0 || index.f >= 0 ) url += index.h + hashIndexBase;
if( index.v > 0 || index.f >= 0 ) url += '/' + (index.v + hashIndexBase );
if( index.f >= 0 ) url += '/' + index.f;
}
return url;
}
/**
* Handler for the window level 'hashchange' event.
*
* @param {object} [event]
*/
onWindowHashChange( event ) {
this.readURL();
}
}

114
js/controllers/notes.js Normal file
View File

@@ -0,0 +1,114 @@
/**
* Handles the showing and
*/
export default class Notes {
constructor( Reveal ) {
this.Reveal = Reveal;
}
render() {
this.element = document.createElement( 'div' );
this.element.className = 'speaker-notes';
this.element.setAttribute( 'data-prevent-swipe', '' );
this.element.setAttribute( 'tabindex', '0' );
this.Reveal.getRevealElement().appendChild( this.element );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
if( config.showNotes ) {
this.element.setAttribute( 'data-layout', typeof config.showNotes === 'string' ? config.showNotes : 'inline' );
}
}
/**
* Pick up notes from the current slide and display them
* to the viewer.
*
* @see {@link config.showNotes}
*/
update() {
if( this.Reveal.getConfig().showNotes && this.element && this.Reveal.getCurrentSlide() && !this.Reveal.print.isPrintingPDF() ) {
this.element.innerHTML = this.getSlideNotes() || '<span class="notes-placeholder">No notes on this slide.</span>';
}
}
/**
* Updates the visibility of the speaker notes sidebar that
* is used to share annotated slides. The notes sidebar is
* only visible if showNotes is true and there are notes on
* one or more slides in the deck.
*/
updateVisibility() {
if( this.Reveal.getConfig().showNotes && this.hasNotes() && !this.Reveal.print.isPrintingPDF() ) {
this.Reveal.getRevealElement().classList.add( 'show-notes' );
}
else {
this.Reveal.getRevealElement().classList.remove( 'show-notes' );
}
}
/**
* Checks if there are speaker notes for ANY slide in the
* presentation.
*/
hasNotes() {
return this.Reveal.getSlidesElement().querySelectorAll( '[data-notes], aside.notes' ).length > 0;
}
/**
* Checks if this presentation is running inside of the
* speaker notes window.
*
* @return {boolean}
*/
isSpeakerNotesWindow() {
return !!window.location.search.match( /receiver/gi );
}
/**
* Retrieves the speaker notes from a slide. Notes can be
* defined in two ways:
* 1. As a data-notes attribute on the slide <section>
* 2. As an <aside class="notes"> inside of the slide
*
* @param {HTMLElement} [slide=currentSlide]
* @return {(string|null)}
*/
getSlideNotes( slide = this.Reveal.getCurrentSlide() ) {
// Notes can be specified via the data-notes attribute...
if( slide.hasAttribute( 'data-notes' ) ) {
return slide.getAttribute( 'data-notes' );
}
// ... or using an <aside class="notes"> element
let notesElement = slide.querySelector( 'aside.notes' );
if( notesElement ) {
return notesElement.innerHTML;
}
return null;
}
}

255
js/controllers/overview.js Normal file
View File

@@ -0,0 +1,255 @@
import { SLIDES_SELECTOR } from '../utils/constants.js'
import { extend, queryAll, transformElement } from '../utils/util.js'
/**
* Handles all logic related to the overview mode
* (birds-eye view of all slides).
*/
export default class Overview {
constructor( Reveal ) {
this.Reveal = Reveal;
this.active = false;
this.onSlideClicked = this.onSlideClicked.bind( this );
}
/**
* Displays the overview of slides (quick nav) by scaling
* down and arranging all slide elements.
*/
activate() {
// Only proceed if enabled in config
if( this.Reveal.getConfig().overview && !this.isActive() ) {
this.active = true;
this.Reveal.getRevealElement().classList.add( 'overview' );
// Don't auto-slide while in overview mode
this.Reveal.cancelAutoSlide();
// Move the backgrounds element into the slide container to
// that the same scaling is applied
this.Reveal.getSlidesElement().appendChild( this.Reveal.getBackgroundsElement() );
// Clicking on an overview slide navigates to it
queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {
if( !slide.classList.contains( 'stack' ) ) {
slide.addEventListener( 'click', this.onSlideClicked, true );
}
} );
// Calculate slide sizes
const margin = 70;
const slideSize = this.Reveal.getComputedSlideSize();
this.overviewSlideWidth = slideSize.width + margin;
this.overviewSlideHeight = slideSize.height + margin;
// Reverse in RTL mode
if( this.Reveal.getConfig().rtl ) {
this.overviewSlideWidth = -this.overviewSlideWidth;
}
this.Reveal.updateSlidesVisibility();
this.layout();
this.update();
this.Reveal.layout();
const indices = this.Reveal.getIndices();
// Notify observers of the overview showing
this.Reveal.dispatchEvent({
type: 'overviewshown',
data: {
'indexh': indices.h,
'indexv': indices.v,
'currentSlide': this.Reveal.getCurrentSlide()
}
});
}
}
/**
* Uses CSS transforms to position all slides in a grid for
* display inside of the overview mode.
*/
layout() {
// Layout slides
this.Reveal.getHorizontalSlides().forEach( ( hslide, h ) => {
hslide.setAttribute( 'data-index-h', h );
transformElement( hslide, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );
if( hslide.classList.contains( 'stack' ) ) {
queryAll( hslide, 'section' ).forEach( ( vslide, v ) => {
vslide.setAttribute( 'data-index-h', h );
vslide.setAttribute( 'data-index-v', v );
transformElement( vslide, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );
} );
}
} );
// Layout slide backgrounds
Array.from( this.Reveal.getBackgroundsElement().childNodes ).forEach( ( hbackground, h ) => {
transformElement( hbackground, 'translate3d(' + ( h * this.overviewSlideWidth ) + 'px, 0, 0)' );
queryAll( hbackground, '.slide-background' ).forEach( ( vbackground, v ) => {
transformElement( vbackground, 'translate3d(0, ' + ( v * this.overviewSlideHeight ) + 'px, 0)' );
} );
} );
}
/**
* Moves the overview viewport to the current slides.
* Called each time the current slide changes.
*/
update() {
const vmin = Math.min( window.innerWidth, window.innerHeight );
const scale = Math.max( vmin / 5, 150 ) / vmin;
const indices = this.Reveal.getIndices();
this.Reveal.transformSlides( {
overview: [
'scale('+ scale +')',
'translateX('+ ( -indices.h * this.overviewSlideWidth ) +'px)',
'translateY('+ ( -indices.v * this.overviewSlideHeight ) +'px)'
].join( ' ' )
} );
}
/**
* Exits the slide overview and enters the currently
* active slide.
*/
deactivate() {
// Only proceed if enabled in config
if( this.Reveal.getConfig().overview ) {
this.active = false;
this.Reveal.getRevealElement().classList.remove( 'overview' );
// Temporarily add a class so that transitions can do different things
// depending on whether they are exiting/entering overview, or just
// moving from slide to slide
this.Reveal.getRevealElement().classList.add( 'overview-deactivating' );
setTimeout( () => {
this.Reveal.getRevealElement().classList.remove( 'overview-deactivating' );
}, 1 );
// Move the background element back out
this.Reveal.getRevealElement().appendChild( this.Reveal.getBackgroundsElement() );
// Clean up changes made to slides
queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( slide => {
transformElement( slide, '' );
slide.removeEventListener( 'click', this.onSlideClicked, true );
} );
// Clean up changes made to backgrounds
queryAll( this.Reveal.getBackgroundsElement(), '.slide-background' ).forEach( background => {
transformElement( background, '' );
} );
this.Reveal.transformSlides( { overview: '' } );
const indices = this.Reveal.getIndices();
this.Reveal.slide( indices.h, indices.v );
this.Reveal.layout();
this.Reveal.cueAutoSlide();
// Notify observers of the overview hiding
this.Reveal.dispatchEvent({
type: 'overviewhidden',
data: {
'indexh': indices.h,
'indexv': indices.v,
'currentSlide': this.Reveal.getCurrentSlide()
}
});
}
}
/**
* Toggles the slide overview mode on and off.
*
* @param {Boolean} [override] Flag which overrides the
* toggle logic and forcibly sets the desired state. True means
* overview is open, false means it's closed.
*/
toggle( override ) {
if( typeof override === 'boolean' ) {
override ? this.activate() : this.deactivate();
}
else {
this.isActive() ? this.deactivate() : this.activate();
}
}
/**
* Checks if the overview is currently active.
*
* @return {Boolean} true if the overview is active,
* false otherwise
*/
isActive() {
return this.active;
}
/**
* Invoked when a slide is and we're in the overview.
*
* @param {object} event
*/
onSlideClicked( event ) {
if( this.isActive() ) {
event.preventDefault();
let element = event.target;
while( element && !element.nodeName.match( /section/gi ) ) {
element = element.parentNode;
}
if( element && !element.classList.contains( 'disabled' ) ) {
this.deactivate();
if( element.nodeName.match( /section/gi ) ) {
let h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),
v = parseInt( element.getAttribute( 'data-index-v' ), 10 );
this.Reveal.slide( h, v );
}
}
}
}
}

241
js/controllers/plugins.js Normal file
View File

@@ -0,0 +1,241 @@
import { loadScript } from '../utils/loader.js'
/**
* Manages loading and registering of reveal.js plugins.
*/
export default class Plugins {
constructor( reveal ) {
this.Reveal = reveal;
// Flags our current state (idle -> loading -> loaded)
this.state = 'idle';
// An id:instance map of currently registed plugins
this.registeredPlugins = {};
this.asyncDependencies = [];
}
/**
* Loads reveal.js dependencies, registers and
* initializes plugins.
*
* Plugins are direct references to a reveal.js plugin
* object that we register and initialize after any
* synchronous dependencies have loaded.
*
* Dependencies are defined via the 'dependencies' config
* option and will be loaded prior to starting reveal.js.
* Some dependencies may have an 'async' flag, if so they
* will load after reveal.js has been started up.
*/
load( plugins, dependencies ) {
this.state = 'loading';
plugins.forEach( this.registerPlugin.bind( this ) );
return new Promise( resolve => {
let scripts = [],
scriptsToLoad = 0;
dependencies.forEach( s => {
// Load if there's no condition or the condition is truthy
if( !s.condition || s.condition() ) {
if( s.async ) {
this.asyncDependencies.push( s );
}
else {
scripts.push( s );
}
}
} );
if( scripts.length ) {
scriptsToLoad = scripts.length;
const scriptLoadedCallback = (s) => {
if( s && typeof s.callback === 'function' ) s.callback();
if( --scriptsToLoad === 0 ) {
this.initPlugins().then( resolve );
}
};
// Load synchronous scripts
scripts.forEach( s => {
if( typeof s.id === 'string' ) {
this.registerPlugin( s );
scriptLoadedCallback( s );
}
else if( typeof s.src === 'string' ) {
loadScript( s.src, () => scriptLoadedCallback(s) );
}
else {
console.warn( 'Unrecognized plugin format', s );
scriptLoadedCallback();
}
} );
}
else {
this.initPlugins().then( resolve );
}
} );
}
/**
* Initializes our plugins and waits for them to be ready
* before proceeding.
*/
initPlugins() {
return new Promise( resolve => {
let pluginValues = Object.values( this.registeredPlugins );
let pluginsToInitialize = pluginValues.length;
// If there are no plugins, skip this step
if( pluginsToInitialize === 0 ) {
this.loadAsync().then( resolve );
}
// ... otherwise initialize plugins
else {
let initNextPlugin;
let afterPlugInitialized = () => {
if( --pluginsToInitialize === 0 ) {
this.loadAsync().then( resolve );
}
else {
initNextPlugin();
}
};
let i = 0;
// Initialize plugins serially
initNextPlugin = () => {
let plugin = pluginValues[i++];
// If the plugin has an 'init' method, invoke it
if( typeof plugin.init === 'function' ) {
let promise = plugin.init( this.Reveal );
// If the plugin returned a Promise, wait for it
if( promise && typeof promise.then === 'function' ) {
promise.then( afterPlugInitialized );
}
else {
afterPlugInitialized();
}
}
else {
afterPlugInitialized();
}
}
initNextPlugin();
}
} )
}
/**
* Loads all async reveal.js dependencies.
*/
loadAsync() {
this.state = 'loaded';
if( this.asyncDependencies.length ) {
this.asyncDependencies.forEach( s => {
loadScript( s.src, s.callback );
} );
}
return Promise.resolve();
}
/**
* Registers a new plugin with this reveal.js instance.
*
* reveal.js waits for all regisered plugins to initialize
* before considering itself ready, as long as the plugin
* is registered before calling `Reveal.initialize()`.
*/
registerPlugin( plugin ) {
// Backwards compatibility to make reveal.js ~3.9.0
// plugins work with reveal.js 4.0.0
if( arguments.length === 2 && typeof arguments[0] === 'string' ) {
plugin = arguments[1];
plugin.id = arguments[0];
}
// Plugin can optionally be a function which we call
// to create an instance of the plugin
else if( typeof plugin === 'function' ) {
plugin = plugin();
}
let id = plugin.id;
if( typeof id !== 'string' ) {
console.warn( 'Unrecognized plugin format; can\'t find plugin.id', plugin );
}
else if( this.registeredPlugins[id] === undefined ) {
this.registeredPlugins[id] = plugin;
// If a plugin is registered after reveal.js is loaded,
// initialize it right away
if( this.state === 'loaded' && typeof plugin.init === 'function' ) {
plugin.init( this.Reveal );
}
}
else {
console.warn( 'reveal.js: "'+ id +'" plugin has already been registered' );
}
}
/**
* Checks if a specific plugin has been registered.
*
* @param {String} id Unique plugin identifier
*/
hasPlugin( id ) {
return !!this.registeredPlugins[id];
}
/**
* Returns the specific plugin instance, if a plugin
* with the given ID has been registered.
*
* @param {String} id Unique plugin identifier
*/
getPlugin( id ) {
return this.registeredPlugins[id];
}
getRegisteredPlugins() {
return this.registeredPlugins;
}
}

118
js/controllers/pointer.js Normal file
View File

@@ -0,0 +1,118 @@
/**
* Handles hiding of the pointer/cursor when inactive.
*/
export default class Pointer {
constructor( Reveal ) {
this.Reveal = Reveal;
// Throttles mouse wheel navigation
this.lastMouseWheelStep = 0;
// Is the mouse pointer currently hidden from view
this.cursorHidden = false;
// Timeout used to determine when the cursor is inactive
this.cursorInactiveTimeout = 0;
this.onDocumentCursorActive = this.onDocumentCursorActive.bind( this );
this.onDocumentMouseScroll = this.onDocumentMouseScroll.bind( this );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
if( config.mouseWheel ) {
document.addEventListener( 'DOMMouseScroll', this.onDocumentMouseScroll, false ); // FF
document.addEventListener( 'mousewheel', this.onDocumentMouseScroll, false );
}
else {
document.removeEventListener( 'DOMMouseScroll', this.onDocumentMouseScroll, false ); // FF
document.removeEventListener( 'mousewheel', this.onDocumentMouseScroll, false );
}
// Auto-hide the mouse pointer when its inactive
if( config.hideInactiveCursor ) {
document.addEventListener( 'mousemove', this.onDocumentCursorActive, false );
document.addEventListener( 'mousedown', this.onDocumentCursorActive, false );
}
else {
this.showCursor();
document.removeEventListener( 'mousemove', this.onDocumentCursorActive, false );
document.removeEventListener( 'mousedown', this.onDocumentCursorActive, false );
}
}
/**
* Shows the mouse pointer after it has been hidden with
* #hideCursor.
*/
showCursor() {
if( this.cursorHidden ) {
this.cursorHidden = false;
this.Reveal.getRevealElement().style.cursor = '';
}
}
/**
* Hides the mouse pointer when it's on top of the .reveal
* container.
*/
hideCursor() {
if( this.cursorHidden === false ) {
this.cursorHidden = true;
this.Reveal.getRevealElement().style.cursor = 'none';
}
}
/**
* Called whenever there is mouse input at the document level
* to determine if the cursor is active or not.
*
* @param {object} event
*/
onDocumentCursorActive( event ) {
this.showCursor();
clearTimeout( this.cursorInactiveTimeout );
this.cursorInactiveTimeout = setTimeout( this.hideCursor.bind( this ), this.Reveal.getConfig().hideCursorTime );
}
/**
* Handles mouse wheel scrolling, throttled to avoid skipping
* multiple slides.
*
* @param {object} event
*/
onDocumentMouseScroll( event ) {
if( Date.now() - this.lastMouseWheelStep > 1000 ) {
this.lastMouseWheelStep = Date.now();
let delta = event.detail || -event.wheelDelta;
if( delta > 0 ) {
this.Reveal.next();
}
else if( delta < 0 ) {
this.Reveal.prev();
}
}
}
}

195
js/controllers/print.js Normal file
View File

@@ -0,0 +1,195 @@
import { SLIDES_SELECTOR } from '../utils/constants.js'
import { queryAll, createStyleSheet } from '../utils/util.js'
/**
* Setups up our presentation for printing/exporting to PDF.
*/
export default class Print {
constructor( Reveal ) {
this.Reveal = Reveal;
}
/**
* Configures the presentation for printing to a static
* PDF.
*/
setupPDF() {
let config = this.Reveal.getConfig();
let slideSize = this.Reveal.getComputedSlideSize( window.innerWidth, window.innerHeight );
// Dimensions of the PDF pages
let pageWidth = Math.floor( slideSize.width * ( 1 + config.margin ) ),
pageHeight = Math.floor( slideSize.height * ( 1 + config.margin ) );
// Dimensions of slides within the pages
let slideWidth = slideSize.width,
slideHeight = slideSize.height;
// Let the browser know what page size we want to print
createStyleSheet( '@page{size:'+ pageWidth +'px '+ pageHeight +'px; margin: 0px;}' );
// Limit the size of certain elements to the dimensions of the slide
createStyleSheet( '.reveal section>img, .reveal section>video, .reveal section>iframe{max-width: '+ slideWidth +'px; max-height:'+ slideHeight +'px}' );
document.documentElement.classList.add( 'print-pdf' );
document.body.style.width = pageWidth + 'px';
document.body.style.height = pageHeight + 'px';
// Make sure stretch elements fit on slide
this.Reveal.layoutSlideContents( slideWidth, slideHeight );
// Compute slide numbers now, before we start duplicating slides
let doingSlideNumbers = config.slideNumber && /all|print/i.test( config.showSlideNumber );
queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( function( slide ) {
slide.setAttribute( 'data-slide-number', this.Reveal.slideNumber.getSlideNumber( slide ) );
}, this );
// Slide and slide background layout
queryAll( this.Reveal.getRevealElement(), SLIDES_SELECTOR ).forEach( function( slide ) {
// Vertical stacks are not centred since their section
// children will be
if( slide.classList.contains( 'stack' ) === false ) {
// Center the slide inside of the page, giving the slide some margin
let left = ( pageWidth - slideWidth ) / 2,
top = ( pageHeight - slideHeight ) / 2;
let contentHeight = slide.scrollHeight;
let numberOfPages = Math.max( Math.ceil( contentHeight / pageHeight ), 1 );
// Adhere to configured pages per slide limit
numberOfPages = Math.min( numberOfPages, config.pdfMaxPagesPerSlide );
// Center slides vertically
if( numberOfPages === 1 && config.center || slide.classList.contains( 'center' ) ) {
top = Math.max( ( pageHeight - contentHeight ) / 2, 0 );
}
// Wrap the slide in a page element and hide its overflow
// so that no page ever flows onto another
let page = document.createElement( 'div' );
page.className = 'pdf-page';
page.style.height = ( ( pageHeight + config.pdfPageHeightOffset ) * numberOfPages ) + 'px';
slide.parentNode.insertBefore( page, slide );
page.appendChild( slide );
// Position the slide inside of the page
slide.style.left = left + 'px';
slide.style.top = top + 'px';
slide.style.width = slideWidth + 'px';
if( slide.slideBackgroundElement ) {
page.insertBefore( slide.slideBackgroundElement, slide );
}
// Inject notes if `showNotes` is enabled
if( config.showNotes ) {
// Are there notes for this slide?
let notes = this.Reveal.getSlideNotes( slide );
if( notes ) {
let notesSpacing = 8;
let notesLayout = typeof config.showNotes === 'string' ? config.showNotes : 'inline';
let notesElement = document.createElement( 'div' );
notesElement.classList.add( 'speaker-notes' );
notesElement.classList.add( 'speaker-notes-pdf' );
notesElement.setAttribute( 'data-layout', notesLayout );
notesElement.innerHTML = notes;
if( notesLayout === 'separate-page' ) {
page.parentNode.insertBefore( notesElement, page.nextSibling );
}
else {
notesElement.style.left = notesSpacing + 'px';
notesElement.style.bottom = notesSpacing + 'px';
notesElement.style.width = ( pageWidth - notesSpacing*2 ) + 'px';
page.appendChild( notesElement );
}
}
}
// Inject slide numbers if `slideNumbers` are enabled
if( doingSlideNumbers ) {
let numberElement = document.createElement( 'div' );
numberElement.classList.add( 'slide-number' );
numberElement.classList.add( 'slide-number-pdf' );
numberElement.innerHTML = slide.getAttribute( 'data-slide-number' );
page.appendChild( numberElement );
}
// Copy page and show fragments one after another
if( config.pdfSeparateFragments ) {
// Each fragment 'group' is an array containing one or more
// fragments. Multiple fragments that appear at the same time
// are part of the same group.
let fragmentGroups = this.Reveal.fragments.sort( page.querySelectorAll( '.fragment' ), true );
let previousFragmentStep;
let previousPage;
fragmentGroups.forEach( function( fragments ) {
// Remove 'current-fragment' from the previous group
if( previousFragmentStep ) {
previousFragmentStep.forEach( function( fragment ) {
fragment.classList.remove( 'current-fragment' );
} );
}
// Show the fragments for the current index
fragments.forEach( function( fragment ) {
fragment.classList.add( 'visible', 'current-fragment' );
}, this );
// Create a separate page for the current fragment state
let clonedPage = page.cloneNode( true );
page.parentNode.insertBefore( clonedPage, ( previousPage || page ).nextSibling );
previousFragmentStep = fragments;
previousPage = clonedPage;
}, this );
// Reset the first/original page so that all fragments are hidden
fragmentGroups.forEach( function( fragments ) {
fragments.forEach( function( fragment ) {
fragment.classList.remove( 'visible', 'current-fragment' );
} );
} );
}
// Show all fragments
else {
queryAll( page, '.fragment:not(.fade-out)' ).forEach( function( fragment ) {
fragment.classList.add( 'visible' );
} );
}
}
}, this );
// Notify subscribers that the PDF layout is good to go
this.Reveal.dispatchEvent({ type: 'pdf-ready' });
}
/**
* Checks if this instance is being used to print a PDF.
*/
isPrintingPDF() {
return ( /print-pdf/gi ).test( window.location.search );
}
}

103
js/controllers/progress.js Normal file
View File

@@ -0,0 +1,103 @@
/**
* Creates a visual progress bar for the presentation.
*/
export default class Progress {
constructor( Reveal ) {
this.Reveal = Reveal;
this.onProgressClicked = this.onProgressClicked.bind( this );
}
render() {
this.element = document.createElement( 'div' );
this.element.className = 'progress';
this.Reveal.getRevealElement().appendChild( this.element );
this.bar = document.createElement( 'span' );
this.element.appendChild( this.bar );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
this.element.style.display = config.progress ? 'block' : 'none';
}
bind() {
if( this.Reveal.getConfig().progress && this.element ) {
this.element.addEventListener( 'click', this.onProgressClicked, false );
}
}
unbind() {
if ( this.Reveal.getConfig().progress && this.element ) {
this.element.removeEventListener( 'click', this.onProgressClicked, false );
}
}
/**
* Updates the progress bar to reflect the current slide.
*/
update() {
// Update progress if enabled
if( this.Reveal.getConfig().progress && this.bar ) {
let scale = this.Reveal.getProgress();
// Don't fill the progress bar if there's only one slide
if( this.Reveal.getTotalSlides() < 2 ) {
scale = 0;
}
this.bar.style.transform = 'scaleX('+ scale +')';
}
}
getMaxWidth() {
return this.Reveal.getRevealElement().offsetWidth;
}
/**
* Clicking on the progress bar results in a navigation to the
* closest approximate horizontal slide using this equation:
*
* ( clickX / presentationWidth ) * numberOfSlides
*
* @param {object} event
*/
onProgressClicked( event ) {
this.Reveal.onUserInput( event );
event.preventDefault();
let slidesTotal = this.Reveal.getHorizontalSlides().length;
let slideIndex = Math.floor( ( event.clientX / this.getMaxWidth() ) * slidesTotal );
if( this.Reveal.getConfig().rtl ) {
slideIndex = slidesTotal - slideIndex;
}
this.Reveal.slide( slideIndex );
}
}

View File

@@ -0,0 +1,456 @@
import { HORIZONTAL_SLIDES_SELECTOR, VERTICAL_SLIDES_SELECTOR } from '../utils/constants.js'
import { extend, queryAll, closest } from '../utils/util.js'
import { isMobile } from '../utils/device.js'
import fitty from 'fitty';
/**
* Handles loading, unloading and playback of slide
* content such as images, videos and iframes.
*/
export default class SlideContent {
constructor( Reveal ) {
this.Reveal = Reveal;
this.startEmbeddedIframe = this.startEmbeddedIframe.bind( this );
}
/**
* Should the given element be preloaded?
* Decides based on local element attributes and global config.
*
* @param {HTMLElement} element
*/
shouldPreload( element ) {
// Prefer an explicit global preload setting
let preload = this.Reveal.getConfig().preloadIframes;
// If no global setting is available, fall back on the element's
// own preload setting
if( typeof preload !== 'boolean' ) {
preload = element.hasAttribute( 'data-preload' );
}
return preload;
}
/**
* Called when the given slide is within the configured view
* distance. Shows the slide element and loads any content
* that is set to load lazily (data-src).
*
* @param {HTMLElement} slide Slide to show
*/
load( slide, options = {} ) {
// Show the slide element
slide.style.display = this.Reveal.getConfig().display;
// Media elements with data-src attributes
queryAll( slide, 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ).forEach( element => {
if( element.tagName !== 'IFRAME' || this.shouldPreload( element ) ) {
element.setAttribute( 'src', element.getAttribute( 'data-src' ) );
element.setAttribute( 'data-lazy-loaded', '' );
element.removeAttribute( 'data-src' );
}
} );
// Media elements with <source> children
queryAll( slide, 'video, audio' ).forEach( media => {
let sources = 0;
queryAll( media, 'source[data-src]' ).forEach( source => {
source.setAttribute( 'src', source.getAttribute( 'data-src' ) );
source.removeAttribute( 'data-src' );
source.setAttribute( 'data-lazy-loaded', '' );
sources += 1;
} );
// Enable inline video playback in mobile Safari
if( isMobile && media.tagName === 'VIDEO' ) {
media.setAttribute( 'playsinline', '' );
}
// If we rewrote sources for this video/audio element, we need
// to manually tell it to load from its new origin
if( sources > 0 ) {
media.load();
}
} );
// Show the corresponding background element
let background = slide.slideBackgroundElement;
if( background ) {
background.style.display = 'block';
let backgroundContent = slide.slideBackgroundContentElement;
let backgroundIframe = slide.getAttribute( 'data-background-iframe' );
// If the background contains media, load it
if( background.hasAttribute( 'data-loaded' ) === false ) {
background.setAttribute( 'data-loaded', 'true' );
let backgroundImage = slide.getAttribute( 'data-background-image' ),
backgroundVideo = slide.getAttribute( 'data-background-video' ),
backgroundVideoLoop = slide.hasAttribute( 'data-background-video-loop' ),
backgroundVideoMuted = slide.hasAttribute( 'data-background-video-muted' );
// Images
if( backgroundImage ) {
backgroundContent.style.backgroundImage = 'url('+ encodeURI( backgroundImage ) +')';
}
// Videos
else if ( backgroundVideo && !this.Reveal.isSpeakerNotes() ) {
let video = document.createElement( 'video' );
if( backgroundVideoLoop ) {
video.setAttribute( 'loop', '' );
}
if( backgroundVideoMuted ) {
video.muted = true;
}
// Enable inline playback in mobile Safari
//
// Mute is required for video to play when using
// swipe gestures to navigate since they don't
// count as direct user actions :'(
if( isMobile ) {
video.muted = true;
video.setAttribute( 'playsinline', '' );
}
// Support comma separated lists of video sources
backgroundVideo.split( ',' ).forEach( source => {
video.innerHTML += '<source src="'+ source +'">';
} );
backgroundContent.appendChild( video );
}
// Iframes
else if( backgroundIframe && options.excludeIframes !== true ) {
let iframe = document.createElement( 'iframe' );
iframe.setAttribute( 'allowfullscreen', '' );
iframe.setAttribute( 'mozallowfullscreen', '' );
iframe.setAttribute( 'webkitallowfullscreen', '' );
iframe.setAttribute( 'allow', 'autoplay' );
iframe.setAttribute( 'data-src', backgroundIframe );
iframe.style.width = '100%';
iframe.style.height = '100%';
iframe.style.maxHeight = '100%';
iframe.style.maxWidth = '100%';
backgroundContent.appendChild( iframe );
}
}
// Start loading preloadable iframes
let backgroundIframeElement = backgroundContent.querySelector( 'iframe[data-src]' );
if( backgroundIframeElement ) {
// Check if this iframe is eligible to be preloaded
if( this.shouldPreload( background ) && !/autoplay=(1|true|yes)/gi.test( backgroundIframe ) ) {
if( backgroundIframeElement.getAttribute( 'src' ) !== backgroundIframe ) {
backgroundIframeElement.setAttribute( 'src', backgroundIframe );
}
}
}
}
// Autosize text with the r-fit-text class based on the
// size of its container. This needs to happen after the
// slide is visible in order to measure the text.
Array.from( slide.querySelectorAll( '.r-fit-text:not([data-fitted])' ) ).forEach( element => {
element.dataset.fitted = '';
fitty( element, {
minSize: 24,
maxSize: this.Reveal.getConfig().height * 0.8,
observeMutations: false,
observeWindow: false
} );
} );
}
/**
* Unloads and hides the given slide. This is called when the
* slide is moved outside of the configured view distance.
*
* @param {HTMLElement} slide
*/
unload( slide ) {
// Hide the slide element
slide.style.display = 'none';
// Hide the corresponding background element
let background = this.Reveal.getSlideBackground( slide );
if( background ) {
background.style.display = 'none';
// Unload any background iframes
queryAll( background, 'iframe[src]' ).forEach( element => {
element.removeAttribute( 'src' );
} );
}
// Reset lazy-loaded media elements with src attributes
queryAll( slide, 'video[data-lazy-loaded][src], audio[data-lazy-loaded][src], iframe[data-lazy-loaded][src]' ).forEach( element => {
element.setAttribute( 'data-src', element.getAttribute( 'src' ) );
element.removeAttribute( 'src' );
} );
// Reset lazy-loaded media elements with <source> children
queryAll( slide, 'video[data-lazy-loaded] source[src], audio source[src]' ).forEach( source => {
source.setAttribute( 'data-src', source.getAttribute( 'src' ) );
source.removeAttribute( 'src' );
} );
}
/**
* Enforces origin-specific format rules for embedded media.
*/
formatEmbeddedContent() {
let _appendParamToIframeSource = ( sourceAttribute, sourceURL, param ) => {
queryAll( this.Reveal.getSlidesElement(), 'iframe['+ sourceAttribute +'*="'+ sourceURL +'"]' ).forEach( el => {
let src = el.getAttribute( sourceAttribute );
if( src && src.indexOf( param ) === -1 ) {
el.setAttribute( sourceAttribute, src + ( !/\?/.test( src ) ? '?' : '&' ) + param );
}
});
};
// YouTube frames must include "?enablejsapi=1"
_appendParamToIframeSource( 'src', 'youtube.com/embed/', 'enablejsapi=1' );
_appendParamToIframeSource( 'data-src', 'youtube.com/embed/', 'enablejsapi=1' );
// Vimeo frames must include "?api=1"
_appendParamToIframeSource( 'src', 'player.vimeo.com/', 'api=1' );
_appendParamToIframeSource( 'data-src', 'player.vimeo.com/', 'api=1' );
}
/**
* Start playback of any embedded content inside of
* the given element.
*
* @param {HTMLElement} element
*/
startEmbeddedContent( element ) {
if( element && !this.Reveal.isSpeakerNotes() ) {
// Restart GIFs
queryAll( element, 'img[src$=".gif"]' ).forEach( el => {
// Setting the same unchanged source like this was confirmed
// to work in Chrome, FF & Safari
el.setAttribute( 'src', el.getAttribute( 'src' ) );
} );
// HTML5 media elements
queryAll( element, 'video, audio' ).forEach( el => {
if( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {
return;
}
// Prefer an explicit global autoplay setting
let autoplay = this.Reveal.getConfig().autoPlayMedia;
// If no global setting is available, fall back on the element's
// own autoplay setting
if( typeof autoplay !== 'boolean' ) {
autoplay = el.hasAttribute( 'data-autoplay' ) || !!closest( el, '.slide-background' );
}
if( autoplay && typeof el.play === 'function' ) {
// If the media is ready, start playback
if( el.readyState > 1 ) {
this.startEmbeddedMedia( { target: el } );
}
// Mobile devices never fire a loaded event so instead
// of waiting, we initiate playback
else if( isMobile ) {
let promise = el.play();
// If autoplay does not work, ensure that the controls are visible so
// that the viewer can start the media on their own
if( promise && typeof promise.catch === 'function' && el.controls === false ) {
promise.catch( () => {
el.controls = true;
// Once the video does start playing, hide the controls again
el.addEventListener( 'play', () => {
el.controls = false;
} );
} );
}
}
// If the media isn't loaded, wait before playing
else {
el.removeEventListener( 'loadeddata', this.startEmbeddedMedia ); // remove first to avoid dupes
el.addEventListener( 'loadeddata', this.startEmbeddedMedia );
}
}
} );
// Normal iframes
queryAll( element, 'iframe[src]' ).forEach( el => {
if( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {
return;
}
this.startEmbeddedIframe( { target: el } );
} );
// Lazy loading iframes
queryAll( element, 'iframe[data-src]' ).forEach( el => {
if( closest( el, '.fragment' ) && !closest( el, '.fragment.visible' ) ) {
return;
}
if( el.getAttribute( 'src' ) !== el.getAttribute( 'data-src' ) ) {
el.removeEventListener( 'load', this.startEmbeddedIframe ); // remove first to avoid dupes
el.addEventListener( 'load', this.startEmbeddedIframe );
el.setAttribute( 'src', el.getAttribute( 'data-src' ) );
}
} );
}
}
/**
* Starts playing an embedded video/audio element after
* it has finished loading.
*
* @param {object} event
*/
startEmbeddedMedia( event ) {
let isAttachedToDOM = !!closest( event.target, 'html' ),
isVisible = !!closest( event.target, '.present' );
if( isAttachedToDOM && isVisible ) {
event.target.currentTime = 0;
event.target.play();
}
event.target.removeEventListener( 'loadeddata', this.startEmbeddedMedia );
}
/**
* "Starts" the content of an embedded iframe using the
* postMessage API.
*
* @param {object} event
*/
startEmbeddedIframe( event ) {
let iframe = event.target;
if( iframe && iframe.contentWindow ) {
let isAttachedToDOM = !!closest( event.target, 'html' ),
isVisible = !!closest( event.target, '.present' );
if( isAttachedToDOM && isVisible ) {
// Prefer an explicit global autoplay setting
let autoplay = this.Reveal.getConfig().autoPlayMedia;
// If no global setting is available, fall back on the element's
// own autoplay setting
if( typeof autoplay !== 'boolean' ) {
autoplay = iframe.hasAttribute( 'data-autoplay' ) || !!closest( iframe, '.slide-background' );
}
// YouTube postMessage API
if( /youtube\.com\/embed\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {
iframe.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' );
}
// Vimeo postMessage API
else if( /player\.vimeo\.com\//.test( iframe.getAttribute( 'src' ) ) && autoplay ) {
iframe.contentWindow.postMessage( '{"method":"play"}', '*' );
}
// Generic postMessage API
else {
iframe.contentWindow.postMessage( 'slide:start', '*' );
}
}
}
}
/**
* Stop playback of any embedded content inside of
* the targeted slide.
*
* @param {HTMLElement} element
*/
stopEmbeddedContent( element, options = {} ) {
options = extend( {
// Defaults
unloadIframes: true
}, options );
if( element && element.parentNode ) {
// HTML5 media elements
queryAll( element, 'video, audio' ).forEach( el => {
if( !el.hasAttribute( 'data-ignore' ) && typeof el.pause === 'function' ) {
el.setAttribute('data-paused-by-reveal', '');
el.pause();
}
} );
// Generic postMessage API for non-lazy loaded iframes
queryAll( element, 'iframe' ).forEach( el => {
if( el.contentWindow ) el.contentWindow.postMessage( 'slide:stop', '*' );
el.removeEventListener( 'load', this.startEmbeddedIframe );
});
// YouTube postMessage API
queryAll( element, 'iframe[src*="youtube.com/embed/"]' ).forEach( el => {
if( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {
el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' );
}
});
// Vimeo postMessage API
queryAll( element, 'iframe[src*="player.vimeo.com/"]' ).forEach( el => {
if( !el.hasAttribute( 'data-ignore' ) && el.contentWindow && typeof el.contentWindow.postMessage === 'function' ) {
el.contentWindow.postMessage( '{"method":"pause"}', '*' );
}
});
if( options.unloadIframes === true ) {
// Unload lazy-loaded iframes
queryAll( element, 'iframe[data-src]' ).forEach( el => {
// Only removing the src doesn't actually unload the frame
// in all browsers (Firefox) so we set it to blank first
el.setAttribute( 'src', 'about:blank' );
el.removeAttribute( 'src' );
} );
}
}
}
}

View File

@@ -0,0 +1,126 @@
/**
* Handles the display of reveal.js' optional slide number.
*/
export default class SlideNumber {
constructor( Reveal ) {
this.Reveal = Reveal;
}
render() {
this.element = document.createElement( 'div' );
this.element.className = 'slide-number';
this.Reveal.getRevealElement().appendChild( this.element );
}
/**
* Called when the reveal.js config is updated.
*/
configure( config, oldConfig ) {
let slideNumberDisplay = 'none';
if( config.slideNumber && !this.Reveal.isPrintingPDF() ) {
if( config.showSlideNumber === 'all' ) {
slideNumberDisplay = 'block';
}
else if( config.showSlideNumber === 'speaker' && this.Reveal.isSpeakerNotes() ) {
slideNumberDisplay = 'block';
}
}
this.element.style.display = slideNumberDisplay;
}
/**
* Updates the slide number to match the current slide.
*/
update() {
// Update slide number if enabled
if( this.Reveal.getConfig().slideNumber && this.element ) {
this.element.innerHTML = this.getSlideNumber();
}
}
/**
* Returns the HTML string corresponding to the current slide
* number, including formatting.
*/
getSlideNumber( slide = this.Reveal.getCurrentSlide() ) {
let config = this.Reveal.getConfig();
let value;
let format = 'h.v';
if ( typeof config.slideNumber === 'function' ) {
value = config.slideNumber( slide );
} else {
// Check if a custom number format is available
if( typeof config.slideNumber === 'string' ) {
format = config.slideNumber;
}
// If there are ONLY vertical slides in this deck, always use
// a flattened slide number
if( !/c/.test( format ) && this.Reveal.getHorizontalSlides().length === 1 ) {
format = 'c';
}
// Offset the current slide number by 1 to make it 1-indexed
let horizontalOffset = slide && slide.dataset.visibility === 'uncounted' ? 0 : 1;
value = [];
switch( format ) {
case 'c':
value.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset );
break;
case 'c/t':
value.push( this.Reveal.getSlidePastCount( slide ) + horizontalOffset, '/', this.Reveal.getTotalSlides() );
break;
default:
let indices = this.Reveal.getIndices( slide );
value.push( indices.h + horizontalOffset );
let sep = format === 'h/v' ? '/' : '.';
if( this.Reveal.isVerticalSlide( slide ) ) value.push( sep, indices.v + 1 );
}
}
let url = '#' + this.Reveal.location.getHash( slide );
return this.formatNumber( value[0], value[1], value[2], url );
}
/**
* Applies HTML formatting to a slide number before it's
* written to the DOM.
*
* @param {number} a Current slide
* @param {string} delimiter Character to separate slide numbers
* @param {(number|*)} b Total slides
* @param {HTMLElement} [url='#'+locationHash()] The url to link to
* @return {string} HTML string fragment
*/
formatNumber( a, delimiter, b, url = '#' + this.Reveal.location.getHash() ) {
if( typeof b === 'number' && !isNaN( b ) ) {
return `<a href="${url}">
<span class="slide-number-a">${a}</span>
<span class="slide-number-delimiter">${delimiter}</span>
<span class="slide-number-b">${b}</span>
</a>`;
}
else {
return `<a href="${url}">
<span class="slide-number-a">${a}</span>
</a>`;
}
}
}

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