device-56.home 2026-3-29:22:14:22

This commit is contained in:
oskar
2026-03-29 22:14:22 +02:00
parent 9b7ca323a2
commit 604e7b7c03
48 changed files with 634 additions and 260 deletions

View File

@@ -13,7 +13,7 @@
"startupType": "disabled" "startupType": "disabled"
}, },
"obsidian-advanced-slides": { "obsidian-advanced-slides": {
"startupType": "disabled" "startupType": "short"
}, },
"obsidian-asciimath": { "obsidian-asciimath": {
"startupType": "disabled" "startupType": "disabled"

View File

@@ -627,8 +627,7 @@ p.align-center {
--dbg-size: 1px; --dbg-size: 1px;
border: 1px solid red; border: 1px solid red;
} }
.reset-margin, .reset-margin {
.reset-margin > * {
--r-block-margin: 0; --r-block-margin: 0;
--r-heading-margin: 0; --r-heading-margin: 0;
} }

View File

@@ -75,13 +75,13 @@
--r-selection-color: #fff; --r-selection-color: #fff;
} }
.reveal-viewport { .reveal-viewport {
background: #1c1e20; background: rgb(28, 30, 32);
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -moz-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgb(85, 90, 95)), color-stop(100%, rgb(28, 30, 32)));
background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -webkit-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -o-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -ms-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background-color: var(--r-background-color); background-color: var(--r-background-color);
} }
.reveal { .reveal {
@@ -179,8 +179,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -360,6 +360,9 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}
.reveal .slides { .reveal .slides {
text-align: left; text-align: left;
} }

View File

@@ -1,21 +1,21 @@
{ {
"port": "", "port": "3123",
"autoReload": true, "autoReload": true,
"exportDirectory": "/presentations", "exportDirectory": "/presentations",
"enableChalkboard": true, "enableChalkboard": false,
"enableOverview": true, "enableOverview": true,
"enableMenu": true, "enableMenu": true,
"enablePointer": false, "enablePointer": true,
"enableTimeBar": false, "enableTimeBar": false,
"theme": "black", "theme": "serif",
"highlightTheme": "zenburn", "highlightTheme": "zenburn",
"transition": "fade", "transition": "slide",
"transitionSpeed": "normal", "transitionSpeed": "normal",
"controls": false, "controls": true,
"progress": true, "progress": true,
"slideNumber": true, "slideNumber": true,
"showGrid": false, "showGrid": false,
"autoComplete": "inPreview", "autoComplete": "never",
"paneMode": "tab", "paneMode": "tab",
"motm": "" "motm": "2026-03-29T19:04:49.274Z"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -57,13 +57,13 @@
--r-selection-color: #fff; --r-selection-color: #fff;
} }
.reveal-viewport { .reveal-viewport {
background: #f7f2d3; background: rgb(247, 242, 211);
background: -moz-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); background: -moz-radial-gradient(center, circle cover, rgb(255, 255, 255) 0%, rgb(247, 242, 211) 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, white), color-stop(100%, #f7f2d3)); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgb(255, 255, 255)), color-stop(100%, rgb(247, 242, 211)));
background: -webkit-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); background: -webkit-radial-gradient(center, circle cover, rgb(255, 255, 255) 0%, rgb(247, 242, 211) 100%);
background: -o-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); background: -o-radial-gradient(center, circle cover, rgb(255, 255, 255) 0%, rgb(247, 242, 211) 100%);
background: -ms-radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); background: -ms-radial-gradient(center, circle cover, rgb(255, 255, 255) 0%, rgb(247, 242, 211) 100%);
background: radial-gradient(center, circle cover, white 0%, #f7f2d3 100%); background: radial-gradient(center, circle cover, rgb(255, 255, 255) 0%, rgb(247, 242, 211) 100%);
background-color: var(--r-background-color); background-color: var(--r-background-color);
} }
.reveal { .reveal {
@@ -161,8 +161,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -342,3 +342,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -146,8 +146,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -327,3 +327,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -151,8 +151,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -332,6 +332,9 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}
.reveal p { .reveal p {
font-weight: 300; font-weight: 300;
text-shadow: 1px 1px #222; text-shadow: 1px 1px #222;

View File

@@ -146,8 +146,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -327,6 +327,9 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}
.reveal table th, .reveal table th,
.reveal table td { .reveal table td {
vertical-align: top; vertical-align: top;

View File

@@ -57,13 +57,13 @@
--r-selection-color: #fff; --r-selection-color: #fff;
} }
.reveal-viewport { .reveal-viewport {
background: #1c1e20; background: rgb(28, 30, 32);
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -moz-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgb(85, 90, 95)), color-stop(100%, rgb(28, 30, 32)));
background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -webkit-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -o-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -ms-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background-color: var(--r-background-color); background-color: var(--r-background-color);
} }
.reveal { .reveal {
@@ -161,8 +161,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -342,3 +342,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -75,13 +75,13 @@
--r-selection-color: #fff; --r-selection-color: #fff;
} }
.reveal-viewport { .reveal-viewport {
background: #1c1e20; background: rgb(28, 30, 32);
background: -moz-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -moz-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, #555a5f), color-stop(100%, #1c1e20)); background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%, rgb(85, 90, 95)), color-stop(100%, rgb(28, 30, 32)));
background: -webkit-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -webkit-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -o-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -o-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: -ms-radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: -ms-radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background: radial-gradient(center, circle cover, #555a5f 0%, #1c1e20 100%); background: radial-gradient(center, circle cover, rgb(85, 90, 95) 0%, rgb(28, 30, 32) 100%);
background-color: var(--r-background-color); background-color: var(--r-background-color);
} }
.reveal { .reveal {
@@ -179,8 +179,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -360,6 +360,9 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}
.reveal .slides { .reveal .slides {
text-align: left; text-align: left;
} }

View File

@@ -148,8 +148,8 @@ html * {
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -329,3 +329,6 @@ html * {
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -144,8 +144,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -325,3 +325,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -152,8 +152,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -333,3 +333,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -144,8 +144,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -325,3 +325,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -150,8 +150,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -331,3 +331,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -139,8 +139,8 @@ html * {
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -320,3 +320,6 @@ html * {
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -146,8 +146,8 @@
.reveal img, .reveal img,
.reveal video, .reveal video,
.reveal iframe { .reveal iframe {
max-width: 95%; max-width: 100%;
max-height: 95%; max-height: 100%;
} }
.reveal strong, .reveal strong,
.reveal b { .reveal b {
@@ -327,3 +327,6 @@
canvas[data-chart] { canvas[data-chart] {
padding: 0.5em; padding: 0.5em;
} }
.reveal .hljs {
min-height: 50%;
}

View File

@@ -1,3 +1,3 @@
{ {
"version": "1.15.0" "version": "1.20.0"
} }

View File

@@ -0,0 +1,144 @@
var ElapsedTimeBar = {
// default value
barColor: 'rgb(200,0,0)',
pausedBarColor: 'rgba(200,0,0,.6)',
isPaused: false,
isFinished: false,
allottedTime: null,
timeProgressBar: null,
startTime: null,
pauseTime: null,
pauseTimeDuration: 0,
/**
* initialize elements
*/
handleReady() {
var config = Reveal.getConfig();
// activate this plugin if config.allottedTime exists.
if (!config.allottedTime) {
console.warn('Failed to start ElapsedTimeBar plugin. "allottedTime" property is required.');
return;
}
// set configurations
this.barColor = config.barColor || this.barColor;
this.pausedBarColor = config.pausedBarColor || this.pausedBarColor;
// calc barHeight from config.barHeight or page-progress container
var barHeight;
var pageProgressContainer = document.querySelector('.progress');
if (config.progressBarHeight) {
barHeight = parseInt(config.progressBarHeight, 10) + 'px';
// override height of page-progress container
pageProgressContainer && (pageProgressContainer.style.height = barHeight);
} else if (config.progress && pageProgressContainer) {
// get height from page-progress container
barHeight = pageProgressContainer.getBoundingClientRect().height + 'px';
} else {
// default
barHeight = '3px';
}
// create container of time-progress
var timeProgressContainer = document.createElement('div');
timeProgressContainer.classList.add('progress');
Object.entries({
display: 'block',
position: 'fixed',
bottom: config.progress ? barHeight : 0,
width: '100%',
height: barHeight
}).forEach(([k, v]) => {
timeProgressContainer.style[k] = v;
});
document.querySelector('.reveal').appendChild(timeProgressContainer);
// create content of time-progress
this.timeProgressBar = document.createElement('div');
Object.entries({
height: '100%',
willChange: 'width'
}).forEach(([k, v]) => {
this.timeProgressBar.style[k] = v;
});
timeProgressContainer.appendChild(this.timeProgressBar);
// start timer
this.start(config.allottedTime);
},
/**
* update repeatedly using requestAnimationFrame.
*/
loop() {
if (this.isPaused) return;
var now = +new Date();
var elapsedTime = now - this.startTime - this.pauseTimeDuration;
if (elapsedTime > this.allottedTime) {
this.timeProgressBar.style.width = '100%';
this.isFinished = true;
} else {
this.timeProgressBar.style.width = elapsedTime / this.allottedTime * 100 + '%';
requestAnimationFrame(this.loop.bind(this));
}
},
/**
* set color of progress bar
*/
setBarColor() {
if (this.isPaused) {
this.timeProgressBar.style.backgroundColor = this.pausedBarColor;
} else {
this.timeProgressBar.style.backgroundColor = this.barColor;
}
},
/**
* start(reset) timer with new allotted time.
* @param {number} allottedTime
* @param {number} [elapsedTime=0]
*/
start(allottedTime, elapsedTime = 0) {
this.isFinished = false;
this.isPaused = false;
this.allottedTime = allottedTime;
this.startTime = +new Date() - elapsedTime;
this.pauseTimeDuration = 0;
this.setBarColor();
this.loop();
},
reset() {
this.start(this.allottedTime);
},
pause() {
if (this.isPaused) return;
this.isPaused = true;
this.pauseTime = +new Date();
this.setBarColor();
},
resume() {
if (!this.isPaused) return;
// add paused time duration
this.isPaused = false;
this.pauseTimeDuration += new Date() - this.pauseTime;
this.pauseTime = null;
this.setBarColor();
this.loop();
}
};
if (Reveal.isReady()) {
ElapsedTimeBar.handleReady();
} else {
Reveal.addEventListener('ready', () => ElapsedTimeBar.handleReady());
}

View File

@@ -106,7 +106,7 @@ const Plugin = {
var scrollState = { currentBlock: block }; var scrollState = { currentBlock: block };
// If there is at least one highlight step, generate // If there is more than one highlight step, generate
// fragments // fragments
var highlightSteps = Plugin.deserializeHighlightSteps( block.getAttribute( 'data-line-numbers' ) ); var highlightSteps = Plugin.deserializeHighlightSteps( block.getAttribute( 'data-line-numbers' ) );
if( highlightSteps.length > 1 ) { if( highlightSteps.length > 1 ) {
@@ -142,7 +142,7 @@ const Plugin = {
} ); } );
block.removeAttribute( 'data-fragment-index' ) block.removeAttribute( 'data-fragment-index' );
block.setAttribute( 'data-line-numbers', Plugin.serializeHighlightSteps( [ highlightSteps[0] ] ) ); block.setAttribute( 'data-line-numbers', Plugin.serializeHighlightSteps( [ highlightSteps[0] ] ) );
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,7 @@
* of external markdown documents. * of external markdown documents.
*/ */
import marked from 'marked' import { marked } from 'marked';
const DEFAULT_SLIDE_SEPARATOR = '\r?\n---\r?\n', const DEFAULT_SLIDE_SEPARATOR = '\r?\n---\r?\n',
DEFAULT_NOTES_SEPARATOR = 'notes?:', DEFAULT_NOTES_SEPARATOR = 'notes?:',

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -56,7 +56,7 @@ export const MathJax3 = () => {
let revealOptions = deck.getConfig().mathjax3 || {}; let revealOptions = deck.getConfig().mathjax3 || {};
let options = {...defaultOptions, ...revealOptions}; let options = {...defaultOptions, ...revealOptions};
options.tex = {...defaultOptions.tex, ...revealOptions.tex} options.tex = {...defaultOptions.tex, ...revealOptions.tex}
options.options = {...options.options, ...defaultOptions.options} options.options = {...defaultOptions.options, ...revealOptions.options}
options.startup = {...defaultOptions.startup, ...revealOptions.startup} options.startup = {...defaultOptions.startup, ...revealOptions.startup}
let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'; let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js';

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -4,16 +4,20 @@
import mermaid from "mermaid"; import mermaid from "mermaid";
mermaid.mermaidAPI.initialize({
// The node size will be calculated incorrectly if set `startOnLoad: start`,
// so we need to manually render.
startOnLoad: false,
});
const Plugin = { const Plugin = {
id: "mermaid", id: "mermaid",
init: function (reveal) { init: function (reveal) {
let { ...mermaidConfig } = reveal.getConfig().mermaid || {};
mermaid.mermaidAPI.initialize({
// The node size will be calculated incorrectly if set `startOnLoad: start`,
// so we need to manually render.
startOnLoad: false,
...mermaidConfig,
});
const mermaidEls = reveal.getRevealElement().querySelectorAll(".mermaid"); const mermaidEls = reveal.getRevealElement().querySelectorAll(".mermaid");
Array.from(mermaidEls).forEach(function (el) { Array.from(mermaidEls).forEach(function (el) {
@@ -30,8 +34,16 @@ const Plugin = {
insertSvg insertSvg
); );
} catch (error) { } catch (error) {
console.error(error, { graphDefinition, el }); let errorStr = "";
el.innerHTML = error.message; if (error?.str) {
// From mermaid 9.1.4, error.message does not exists anymore
errorStr = error.str;
}
if (error?.message) {
errorStr = error.message;
}
console.error(errorStr, { error, graphDefinition, el });
el.innerHTML = errorStr;
} }
}); });
}, },

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,6 @@
import speakerViewHTML from './speaker-view.html'; import speakerViewHTML from './speaker-view.html';
import marked from 'marked'; import { marked } from 'marked';
/** /**
* Handles opening of and synchronization with the reveal.js * Handles opening of and synchronization with the reveal.js
@@ -15,141 +15,172 @@ import marked from 'marked';
*/ */
const Plugin = () => { const Plugin = () => {
let popup = null; let connectInterval;
let speakerWindow = null;
let deck;
let deck; /**
* Opens a new speaker view window.
*/
function openSpeakerWindow() {
function openNotes() { // If a window is already open, focus it
if( speakerWindow && !speakerWindow.closed ) {
speakerWindow.focus();
}
else {
speakerWindow = window.open( 'about:blank', 'reveal.js - Notes', 'width=1100,height=700' );
speakerWindow.marked = marked;
speakerWindow.document.write( speakerViewHTML );
if (popup && !popup.closed) { if( !speakerWindow ) {
popup.focus(); alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' );
return; return;
} }
popup = window.open( 'about:blank', 'reveal.js - Notes', 'width=1100,height=700' ); connect();
popup.marked = marked;
popup.document.write( speakerViewHTML );
if( !popup ) {
alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' );
return;
} }
/** }
* Connect to the notes window through a postmessage handshake.
* Using postmessage enables us to work in situations where the
* origins differ, such as a presentation being opened from the
* file system.
*/
function connect() {
// Keep trying to connect until we get a 'connected' message back
let connectInterval = setInterval( function() {
popup.postMessage( JSON.stringify( {
namespace: 'reveal-notes',
type: 'connect',
url: window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search,
state: deck.getState()
} ), '*' );
}, 500 );
window.addEventListener( 'message', function( event ) { /**
let data = JSON.parse( event.data ); * Reconnect with an existing speaker view window.
if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { */
clearInterval( connectInterval ); function reconnectSpeakerWindow( reconnectWindow ) {
onConnected();
} if( speakerWindow && !speakerWindow.closed ) {
if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) { speakerWindow.focus();
callRevealApi( data.methodName, data.arguments, data.callId ); }
} else {
} ); speakerWindow = reconnectWindow;
window.addEventListener( 'message', onPostMessage );
onConnected();
} }
/** }
* Calls the specified Reveal.js method with the provided argument
* and then pushes the result to the notes frame.
*/
function callRevealApi( methodName, methodArguments, callId ) {
let result = deck[methodName].apply( deck, methodArguments ); /**
popup.postMessage( JSON.stringify( { * Connect to the notes window through a postmessage handshake.
* Using postmessage enables us to work in situations where the
* origins differ, such as a presentation being opened from the
* file system.
*/
function connect() {
const presentationURL = deck.getConfig().url;
const url = typeof presentationURL === 'string' ? presentationURL :
window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search;
// Keep trying to connect until we get a 'connected' message back
connectInterval = setInterval( function() {
speakerWindow.postMessage( JSON.stringify( {
namespace: 'reveal-notes', namespace: 'reveal-notes',
type: 'return', type: 'connect',
result: result, state: deck.getState(),
callId: callId url
} ), '*' ); } ), '*' );
}, 500 );
window.addEventListener( 'message', onPostMessage );
}
/**
* Calls the specified Reveal.js method with the provided argument
* and then pushes the result to the notes frame.
*/
function callRevealApi( methodName, methodArguments, callId ) {
let result = deck[methodName].apply( deck, methodArguments );
speakerWindow.postMessage( JSON.stringify( {
namespace: 'reveal-notes',
type: 'return',
result,
callId
} ), '*' );
}
/**
* Posts the current slide data to the notes window.
*/
function post( event ) {
let slideElement = deck.getCurrentSlide(),
notesElement = slideElement.querySelector( 'aside.notes' ),
fragmentElement = slideElement.querySelector( '.current-fragment' );
let messageData = {
namespace: 'reveal-notes',
type: 'state',
notes: '',
markdown: false,
whitespace: 'normal',
state: deck.getState()
};
// Look for notes defined in a slide attribute
if( slideElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = slideElement.getAttribute( 'data-notes' );
messageData.whitespace = 'pre-wrap';
} }
/** // Look for notes defined in a fragment
* Posts the current slide data to the notes window if( fragmentElement ) {
*/ let fragmentNotes = fragmentElement.querySelector( 'aside.notes' );
function post( event ) { if( fragmentNotes ) {
notesElement = fragmentNotes;
let slideElement = deck.getCurrentSlide(), }
notesElement = slideElement.querySelector( 'aside.notes' ), else if( fragmentElement.hasAttribute( 'data-notes' ) ) {
fragmentElement = slideElement.querySelector( '.current-fragment' ); messageData.notes = fragmentElement.getAttribute( 'data-notes' );
let messageData = {
namespace: 'reveal-notes',
type: 'state',
notes: '',
markdown: false,
whitespace: 'normal',
state: deck.getState()
};
// Look for notes defined in a slide attribute
if( slideElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = slideElement.getAttribute( 'data-notes' );
messageData.whitespace = 'pre-wrap'; messageData.whitespace = 'pre-wrap';
// In case there are slide notes
notesElement = null;
} }
// Look for notes defined in a fragment
if( fragmentElement ) {
let fragmentNotes = fragmentElement.querySelector( 'aside.notes' );
if( fragmentNotes ) {
notesElement = fragmentNotes;
}
else if( fragmentElement.hasAttribute( 'data-notes' ) ) {
messageData.notes = fragmentElement.getAttribute( 'data-notes' );
messageData.whitespace = 'pre-wrap';
// In case there are slide notes
notesElement = null;
}
}
// Look for notes defined in an aside element
if( notesElement ) {
messageData.notes = notesElement.innerHTML;
messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
}
popup.postMessage( JSON.stringify( messageData ), '*' );
} }
/** // Look for notes defined in an aside element
* Called once we have established a connection to the notes if( notesElement ) {
* window. messageData.notes = notesElement.innerHTML;
*/ messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string';
function onConnected() {
// Monitor events that trigger a change in state
deck.on( 'slidechanged', post );
deck.on( 'fragmentshown', post );
deck.on( 'fragmenthidden', post );
deck.on( 'overviewhidden', post );
deck.on( 'overviewshown', post );
deck.on( 'paused', post );
deck.on( 'resumed', post );
// Post the initial state
post();
} }
connect(); speakerWindow.postMessage( JSON.stringify( messageData ), '*' );
}
function onPostMessage( event ) {
let data = JSON.parse( event.data );
if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) {
clearInterval( connectInterval );
onConnected();
}
else if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) {
callRevealApi( data.methodName, data.arguments, data.callId );
}
}
/**
* Called once we have established a connection to the notes
* window.
*/
function onConnected() {
// Monitor events that trigger a change in state
deck.on( 'slidechanged', post );
deck.on( 'fragmentshown', post );
deck.on( 'fragmenthidden', post );
deck.on( 'overviewhidden', post );
deck.on( 'overviewshown', post );
deck.on( 'paused', post );
deck.on( 'resumed', post );
// Post the initial state
post();
} }
@@ -164,19 +195,40 @@ const Plugin = () => {
// If the there's a 'notes' query set, open directly // If the there's a 'notes' query set, open directly
if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) {
openNotes(); openSpeakerWindow();
}
else {
// Keep listening for speaker view hearbeats. If we receive a
// heartbeat from an orphaned window, reconnect it. This ensures
// that we remain connected to the notes even if the presentation
// is reloaded.
window.addEventListener( 'message', event => {
if( !speakerWindow && typeof event.data === 'string' ) {
let data;
try {
data = JSON.parse( event.data );
}
catch( error ) {}
if( data && data.namespace === 'reveal-notes' && data.type === 'heartbeat' ) {
reconnectSpeakerWindow( event.source );
}
}
});
} }
// Open the notes when the 's' key is hit // Open the notes when the 's' key is hit
deck.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() { deck.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() {
openNotes(); openSpeakerWindow();
} ); } );
} }
}, },
open: openNotes open: openSpeakerWindow
}; };
}; };

View File

@@ -1,3 +1,6 @@
<!--
NOTE: You need to build the notes plugin after making changes to this file.
-->
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
@@ -347,7 +350,8 @@
layoutDropdown, layoutDropdown,
pendingCalls = {}, pendingCalls = {},
lastRevealApiCallId = 0, lastRevealApiCallId = 0,
connected = false; connected = false,
whitelistedWindows = [window.opener];
var SPEAKER_LAYOUTS = { var SPEAKER_LAYOUTS = {
'default': 'Default', 'default': 'Default',
@@ -362,9 +366,14 @@
var connectionTimeout = setTimeout( function() { var connectionTimeout = setTimeout( function() {
connectionStatus.innerHTML = 'Error connecting to main window.<br>Please try closing and reopening the speaker view.'; connectionStatus.innerHTML = 'Error connecting to main window.<br>Please try closing and reopening the speaker view.';
}, 5000 ); }, 5000 );
;
window.addEventListener( 'message', function( event ) { window.addEventListener( 'message', function( event ) {
// Validate the origin of this message to prevent XSS
if( window.location.origin !== event.origin && whitelistedWindows.indexOf( event.source ) === -1 ) {
return;
}
clearTimeout( connectionTimeout ); clearTimeout( connectionTimeout );
connectionStatus.style.display = 'none'; connectionStatus.style.display = 'none';
@@ -395,13 +404,21 @@
} }
else if( /slidechanged|fragmentshown|fragmenthidden|paused|resumed/.test( data.eventName ) && currentState !== JSON.stringify( data.state ) ) { else if( /slidechanged|fragmentshown|fragmenthidden|paused|resumed/.test( data.eventName ) && currentState !== JSON.stringify( data.state ) ) {
window.opener.postMessage( JSON.stringify({ method: 'setState', args: [ data.state ]} ), '*' ); dispatchStateToMainWindow( data.state );
} }
} }
} ); } );
/**
* Updates the presentation in the main window to match the state
* of the presentation in the notes window.
*/
const dispatchStateToMainWindow = debounce(( state ) => {
window.opener.postMessage( JSON.stringify({ method: 'setState', args: [ state ]} ), '*' );
}, 500);
/** /**
* Asynchronously calls the Reveal.js API of the main frame. * Asynchronously calls the Reveal.js API of the main frame.
*/ */
@@ -432,6 +449,7 @@
setupKeyboard(); setupKeyboard();
setupNotes(); setupNotes();
setupTimer(); setupTimer();
setupHeartbeat();
} }
} }
@@ -521,6 +539,8 @@
upcomingSlide.setAttribute( 'src', upcomingURL ); upcomingSlide.setAttribute( 'src', upcomingURL );
document.querySelector( '#upcoming-slide' ).appendChild( upcomingSlide ); document.querySelector( '#upcoming-slide' ).appendChild( upcomingSlide );
whitelistedWindows.push( currentSlide.contentWindow, upcomingSlide.contentWindow );
} }
/** /**
@@ -533,6 +553,18 @@
} }
/**
* We send out a heartbeat at all times to ensure we can
* reconnect with the main presentation window after reloads.
*/
function setupHeartbeat() {
setInterval( () => {
window.opener.postMessage( JSON.stringify({ namespace: 'reveal-notes', type: 'heartbeat'} ), '*' );
}, 1000 );
}
function getTimings( callback ) { function getTimings( callback ) {
callRevealApi( 'getSlidesAttributes', [], function ( slideAttributes ) { callRevealApi( 'getSlidesAttributes', [], function ( slideAttributes ) {

View File

@@ -0,0 +1 @@
.cursor-dot,.cursor-dot-outline{pointer-events:none;position:absolute;top:0;left:0;border-radius:50%;opacity:0;transform:translate(-50%,-50%);transition:opacity 0.3s ease-in-out,transform 0.3s ease-in-out;}.cursor-dot{width:12px;height:12px;background-color:red;z-index:1;}.no-cursor{cursor:none;}.no-cursor a,.no-cursor div,.no-cursor span{cursor:none;}

View File

@@ -0,0 +1 @@
var RevealPointer=function(){"use strict";var e={backspace:8,tab:9,enter:13,shift:16,ctrl:17,alt:18,pausebreak:19,capslock:20,esc:27,space:32,pageup:33,pagedown:34,end:35,home:36,leftarrow:37,uparrow:38,rightarrow:39,downarrow:40,insert:45,delete:46,0:48,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,leftwindowkey:91,rightwindowkey:92,selectkey:93,numpad0:96,numpad1:97,numpad2:98,numpad3:99,numpad4:100,numpad5:101,numpad6:102,numpad7:103,numpad8:104,numpad9:105,multiply:106,add:107,subtract:109,decimalpoint:110,divide:111,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:122,f12:123,numlock:144,scrolllock:145,semicolon:186,equalsign:187,comma:188,dash:189,period:190,forwardslash:191,graveaccent:192,openbracket:219,backslash:220,closebracket:221,singlequote:222};return function(){var t={},o=!1,n=null,a={x:0,y:0,isVisible:!1},i={x:0,y:0,scale:1};function l(o){var n;null==(t=o.pointer||{}).key?t.key="q":t.key=t.key.toLowerCase(),null!=t.pointerSize&&"number"==typeof t.pointerSize||(t.pointerSize=12),null!=t.tailLength&&"number"==typeof t.tailLength||(t.tailLength=10),null!=t.color&&"string"==typeof t.color||(t.color="red"),null!=t.alwaysVisible&&"boolean"==typeof t.alwaysVisible||(t.alwaysVisible=!1),null!=t.opacity&&"number"==typeof t.opacity||(t.opacity=.8),t.keyCode=(n=t.key,e[n])}function r(){n.style.top="".concat((a.y-i.y)/i.scale,"px"),n.style.left="".concat((a.x-i.x)/i.scale,"px"),a.isVisible?n.style.opacity=t.opacity.toString():n.style.opacity="0",1!==i.scale?(n.style.width="".concat(t.pointerSize/i.scale,"px"),n.style.height="".concat(t.pointerSize/i.scale,"px")):(n.style.width="".concat(t.pointerSize,"px"),n.style.height="".concat(t.pointerSize,"px"))}function c(e){a.x=e.pageX,a.y=e.pageY;var t=document.body.style.transform;""!==t?(i.x=Number.parseInt(/translate\((.*)px,/gm.exec(t)[1]),i.y=Number.parseInt(/px,\s(.*)px\)/gm.exec(t)[1]),i.scale=Number.parseFloat(/scale\((.)\)/gm.exec(t)[1])):(i.x=0,i.y=0,i.scale=1),requestAnimationFrame(r)}function s(){(o=!o)?(document.addEventListener("mousemove",c),document.body.classList.add("no-cursor"),a.isVisible=!0):(document.removeEventListener("mousemove",c),document.body.classList.remove("no-cursor"),a.isVisible=!1,requestAnimationFrame(r))}return{id:"pointer",init:function(e){var o;l(e.getConfig()),t.alwaysVisible?s():e.addKeyBinding({keyCode:t.keyCode,key:t.key},(function(){s()})),e.on("pointerColorChange",(function(e){var o;o=e.color,null!=n&&(n.style.backgroundColor=null!=o?o:t.color)})),(o=document.createElement("div")).className="cursor-dot",o.style.width="".concat(t.pointerSize,"px"),o.style.height="".concat(t.pointerSize,"px"),o.style.backgroundColor=t.color,t.alwaysVisible&&(o.style.opacity="0.8"),document.body.appendChild(o),n=o}}}}();

View File

@@ -25,6 +25,12 @@ const Plugin = {
} }
} ); } );
},
destroy: () => {
zoom.reset();
} }
}; };
@@ -52,19 +58,11 @@ var zoom = (function(){
panUpdateInterval = -1; panUpdateInterval = -1;
// Check for transform support so that we can fallback otherwise // Check for transform support so that we can fallback otherwise
var supportsTransforms = 'WebkitTransform' in document.body.style || var supportsTransforms = 'transform' in document.body.style;
'MozTransform' in document.body.style ||
'msTransform' in document.body.style ||
'OTransform' in document.body.style ||
'transform' in document.body.style;
if( supportsTransforms ) { if( supportsTransforms ) {
// The easing that will be applied when we zoom in/out // The easing that will be applied when we zoom in/out
document.body.style.transition = 'transform 0.8s ease'; document.body.style.transition = 'transform 0.8s ease';
document.body.style.OTransition = '-o-transform 0.8s ease';
document.body.style.msTransition = '-ms-transform 0.8s ease';
document.body.style.MozTransition = '-moz-transform 0.8s ease';
document.body.style.WebkitTransition = '-webkit-transform 0.8s ease';
} }
// Zoom out if the user hits escape // Zoom out if the user hits escape
@@ -105,10 +103,6 @@ var zoom = (function(){
// Reset // Reset
if( scale === 1 ) { if( scale === 1 ) {
document.body.style.transform = ''; document.body.style.transform = '';
document.body.style.OTransform = '';
document.body.style.msTransform = '';
document.body.style.MozTransform = '';
document.body.style.WebkitTransform = '';
} }
// Scale // Scale
else { else {
@@ -116,16 +110,7 @@ var zoom = (function(){
transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')'; transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')';
document.body.style.transformOrigin = origin; document.body.style.transformOrigin = origin;
document.body.style.OTransformOrigin = origin;
document.body.style.msTransformOrigin = origin;
document.body.style.MozTransformOrigin = origin;
document.body.style.WebkitTransformOrigin = origin;
document.body.style.transform = transform; document.body.style.transform = transform;
document.body.style.OTransform = transform;
document.body.style.msTransform = transform;
document.body.style.MozTransform = transform;
document.body.style.WebkitTransform = transform;
} }
} }
else { else {

View File

@@ -1,4 +1,4 @@
/*! /*!
* reveal.js Zoom plugin * reveal.js Zoom plugin
*/ */
var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,s="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style;function r(t,o){var n=y();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,s)if(1===o)document.body.style.transform="",document.body.style.OTransform="",document.body.style.msTransform="",document.body.style.MozTransform="",document.body.style.WebkitTransform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.OTransformOrigin=i,document.body.style.msTransformOrigin=i,document.body.style.MozTransformOrigin=i,document.body.style.WebkitTransformOrigin=i,document.body.style.transform=d,document.body.style.OTransform=d,document.body.style.msTransform=d,document.body.style.MozTransform=d,document.body.style.WebkitTransform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function m(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=y();n<i?window.scroll(d.x,d.y-14/e*(1-n/i)):n>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),o<t?window.scroll(d.x-14/e*(1-o/t),d.y):o>window.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function y(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return s&&(document.body.style.transition="transform 0.8s ease",document.body.style.OTransition="-o-transform 0.8s ease",document.body.style.msTransition="-ms-transform 0.8s ease",document.body.style.MozTransition="-moz-transform 0.8s ease",document.body.style.WebkitTransition="-webkit-transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,r(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(m,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),r({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e} var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(n){var o=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:o)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;n[i]&&!e.isOverview()&&(n.preventDefault(),t.to({x:n.clientX,y:n.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,n=0,o=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,n){var o=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*n)/2,t.y-=(window.innerHeight-t.height*n)/2,l)if(1===n)document.body.style.transform="";else{var i=o.x+"px "+o.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+n+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===n?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(o.x+t.x)/n+"px",document.body.style.top=-(o.y+t.y)/n+"px",document.body.style.width=100*n+"%",document.body.style.height=100*n+"%",document.body.style.zoom=n);e=n,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();o<i?window.scroll(d.x,d.y-14/e*(1-o/i)):o>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-o)/i)*(14/e)),n<t?window.scroll(d.x-14/e*(1-n/t),d.y):n>window.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-n)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(n){1!==e&&27===n.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(n=t.clientX,o=t.clientY)})),{to:function(n){if(1!==e)t.out();else{if(n.x=n.x||0,n.y=n.y||0,n.element){var o=n.element.getBoundingClientRect();n.x=o.left-20,n.y=o.top-20,n.width=o.width+40,n.height=o.height+40}void 0!==n.width&&void 0!==n.height&&(n.scale=Math.max(Math.min(window.innerWidth/n.width,window.innerHeight/n.height),1)),n.scale>1&&(n.x*=n.scale,n.y*=n.scale,s(n,n.scale),!1!==n.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e}

View File

@@ -1,4 +1,4 @@
!function(e,o){"object"==typeof exports&&"undefined"!=typeof module?module.exports=o():"function"==typeof define&&define.amd?define(o):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=o()}(this,(function(){"use strict"; !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=t()}(this,(function(){"use strict";
/*! /*!
* reveal.js Zoom plugin * reveal.js Zoom plugin
*/var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(t){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;t[i]&&!e.isOverview()&&(t.preventDefault(),o.to({x:t.clientX,y:t.clientY,scale:d,pan:!1}))}))}},o=function(){var e=1,t=0,n=0,i=-1,d=-1,s="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style;function r(o,t){var n=l();if(o.width=o.width||1,o.height=o.height||1,o.x-=(window.innerWidth-o.width*t)/2,o.y-=(window.innerHeight-o.height*t)/2,s)if(1===t)document.body.style.transform="",document.body.style.OTransform="",document.body.style.msTransform="",document.body.style.MozTransform="",document.body.style.WebkitTransform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-o.x+"px,"+-o.y+"px) scale("+t+")";document.body.style.transformOrigin=i,document.body.style.OTransformOrigin=i,document.body.style.msTransformOrigin=i,document.body.style.MozTransformOrigin=i,document.body.style.WebkitTransformOrigin=i,document.body.style.transform=d,document.body.style.OTransform=d,document.body.style.msTransform=d,document.body.style.MozTransform=d,document.body.style.WebkitTransform=d}else 1===t?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+o.x)/t+"px",document.body.style.top=-(n.y+o.y)/t+"px",document.body.style.width=100*t+"%",document.body.style.height=100*t+"%",document.body.style.zoom=t);e=t,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function m(){var o=.12*window.innerWidth,i=.12*window.innerHeight,d=l();n<i?window.scroll(d.x,d.y-14/e*(1-n/i)):n>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),t<o?window.scroll(d.x-14/e*(1-t/o),d.y):t>window.innerWidth-o&&window.scroll(d.x+(1-(window.innerWidth-t)/o)*(14/e),d.y)}function l(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return s&&(document.body.style.transition="transform 0.8s ease",document.body.style.OTransition="-o-transform 0.8s ease",document.body.style.msTransition="-ms-transform 0.8s ease",document.body.style.MozTransition="-moz-transform 0.8s ease",document.body.style.WebkitTransition="-webkit-transform 0.8s ease"),document.addEventListener("keyup",(function(t){1!==e&&27===t.keyCode&&o.out()})),document.addEventListener("mousemove",(function(o){1!==e&&(t=o.clientX,n=o.clientY)})),{to:function(t){if(1!==e)o.out();else{if(t.x=t.x||0,t.y=t.y||0,t.element){var n=t.element.getBoundingClientRect();t.x=n.left-20,t.y=n.top-20,t.width=n.width+40,t.height=n.height+40}void 0!==t.width&&void 0!==t.height&&(t.scale=Math.max(Math.min(window.innerWidth/t.width,window.innerHeight/t.height),1)),t.scale>1&&(t.x*=t.scale,t.y*=t.scale,r(t,t.scale),!1!==t.pan&&(i=setTimeout((function(){d=setInterval(m,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),r({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}})); */var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();n<i?window.scroll(d.x,d.y-14/e*(1-n/i)):n>window.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),o<t?window.scroll(d.x-14/e*(1-o/t),d.y):o>window.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,s(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}}));

View File

@@ -16,6 +16,10 @@
<link rel="stylesheet" href="{{{base}}}plugin/chalkboard/style.css"> <link rel="stylesheet" href="{{{base}}}plugin/chalkboard/style.css">
{{/enableChalkboard}} {{/enableChalkboard}}
{{#enablePointer}}
<link rel="stylesheet" href="{{{base}}}plugin/reveal-pointer/pointer.css" />
{{/enablePointer}}
{{#cssPaths}} {{#cssPaths}}
<link rel="stylesheet" href="{{{base}}}{{{.}}}" /> <link rel="stylesheet" href="{{{base}}}{{{.}}}" />
{{/cssPaths}} {{/cssPaths}}
@@ -113,6 +117,14 @@
{{#enableChalkboard}} {{#enableChalkboard}}
<script src="{{{base}}}plugin/chalkboard/plugin.js"></script> <script src="{{{base}}}plugin/chalkboard/plugin.js"></script>
{{/enableChalkboard}} {{/enableChalkboard}}
{{#enablePointer}}
<script src="{{{base}}}plugin/reveal-pointer/pointer.js"></script>
{{/enablePointer}}
{{#timeForPresentation}}
{{#enableTimeBar}}
<script src="{{{base}}}plugin/elapsed-time-bar/elapsed-time-bar.js"></script>
{{/enableTimeBar}}
{{/timeForPresentation}}
<script> <script>
function extend() { function extend() {
@@ -144,8 +156,9 @@
} }
var bgColor = getComputedStyle(document.documentElement).getPropertyValue('--r-background-color').trim(); var bgColor = getComputedStyle(document.documentElement).getPropertyValue('--r-background-color').trim();
var isLight = isLight(bgColor);
if(isLight(bgColor)){ if(isLight){
document.body.classList.add('has-light-background'); document.body.classList.add('has-light-background');
} else { } else {
document.body.classList.add('has-dark-background'); document.body.classList.add('has-dark-background');
@@ -172,14 +185,38 @@
{{#enableMenu}} {{#enableMenu}}
RevealMenu, RevealMenu,
{{/enableMenu}} {{/enableMenu}}
{{#enablePointer}}
RevealPointer,
{{/enablePointer}}
{{#enableChalkboard}} {{#enableChalkboard}}
RevealChalkboard, RevealChalkboard,
{{/enableChalkboard}} {{/enableChalkboard}}
{{#timeForPresentation}}
{{#enableTimeBar}}
ElapsedTimeBar
{{/enableTimeBar}}
{{/timeForPresentation}}
], ],
{{#timeForPresentation}}
allottedTime: {{{.}}} * 1000,
{{/timeForPresentation}}
mathjax3: { mathjax3: {
mathjax: '{{{base}}}plugin/math/mathjax/tex-mml-chtml.js', mathjax: '{{{base}}}plugin/math/mathjax/tex-mml-chtml.js',
}, },
markdown: {
gfm: true,
mangle: true,
pedantic: false,
smartLists: false,
smartypants: false,
},
mermaid: {
theme: isLight ? 'default' : 'dark',
},
{{#enableCustomControls}} {{#enableCustomControls}}
customcontrols: { customcontrols: {
@@ -221,4 +258,6 @@
Reveal.initialize(options); Reveal.initialize(options);
</script> </script>
</body> </body>
<!-- created with {{! ignore me }}Advanced Slides -->
</html> </html>

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,7 @@
{ {
"id": 1, "id": 1,
"name": "Ma bibliothèque", "name": "Ma bibliothèque",
"lastUpdate": 1774723941998 "lastUpdate": 1774813426972
} }
], ],
"renderCitations": true, "renderCitations": true,

View File

@@ -1,15 +1,76 @@
---
center: true
transition: slide
---
# Définition # Définition
![[désintégration audioactive#^definition]] ![[désintégration audioactive#^definition]]
---
# Exemples # Exemples
$1 \longrightarrow \text{un } 1$ --
. . . ## Exemple 1
$11 \longrightarrow \text{deux }1$
. . .
$21 \longrightarrow \text{un }2,\quad \text{un }1$
. . .
$1211 \longrightarrow \text{un }1,\quad \text{un }2,\quad \text{deux } 1$
. . .
+ $1 \longrightarrow \text{un } 1$
+ $11 \longrightarrow \text{deux }1$
+ $21 \longrightarrow \text{un }2,\quad \text{un }1$
+ $1211 \longrightarrow \text{un }1,\quad \text{un }2,\quad \text{deux }2$
+ $\underparen{111\!}\,221 \longrightarrow \text{trois }1,\quad \text{deux }2,\quad \text{un} 1$
+ $312211$
+ $13112221$
+ $1113213211$
--
## Exemple 2
$22 \longrightarrow \text{deux} 2$ <!-- element class="fragment" -->
$22$ <!-- element class="fragment" -->
$22$ <!-- element class="fragment" -->
$\vdots$ <!-- element class="fragment" -->
---
# Notations
+ $12 \longrightarrow 1112$
+ $,11,12,$
+ $[11$ et $12]$
+ $1^{3}2^{1}$
+ $1^{\geq 2}(\neq 1)^{3}$
+ $[1^{3}X^{1 \text{ ou } 2}$
---
# Propriétés
--
## Première propriété évidente
Pour une étape : $a^{\alpha}b^{\beta}c^{\gamma}d^{\delta}\cdots \longrightarrow \alpha a\beta b\gamma c\delta d\cdots$
Il est évident que : $a\neq b,\quad b\neq c,\quad c\neq d,\dots$
--
## Théorème du jour 1
Les morceaux de type :
+ $,ax,bx,$ <span class="fragment"> devrait être dérivé en $(a+b)x$ </span>
+ $x^{\geq 4}$ <span class="fragment"> $=\begin{cases}x,xx,x\cdots \\ ,xx,xx, \cdots\end{cases}$ impossible </span>
+ $x^{3}y^{3}$ <span class="fragment"> $=\begin{cases},xx,xy,yy, \text{ un cas de } ,ay,by, \\ x,xx,xy,y \text{ un cas de } ,ax,bx,\end{cases}$ </span>
n'apparaîssent plus après 1 jour.
--
## Théorème du jour 2
Après 2 jours, on ne peut plus avoir :
+ apparition d'un $\geq 4$ <span class="fragment">car $x^4$ impossible (thm. J1)</span>
+ $3X3$ <span class="fragment"> $=\begin{cases},3X,3y \longleftarrow X^3y^3 {\,\color{red}\times } \text{ (thm. J1)} \\ 3,X3, \text{ impossible (thm. J1)}\end{cases}$ </span>

View File

@@ -43,13 +43,13 @@ header-auto-numbering:
# Propriétés # Propriétés
> [!proposition]+ > [!proposition]+ conséquence du regroupement
> Pour une étape : > Pour une étape :
> $a^{\alpha}b^{\beta}c^{\gamma}d^{\delta}\cdots \longrightarrow \alpha a\beta b\gamma c\delta d\cdots$ > $a^{\alpha}b^{\beta}c^{\gamma}d^{\delta}\cdots \longrightarrow \alpha a\beta b\gamma c\delta d\cdots$
> Il est évident que : > Il est évident que :
> $a\neq b,\quad b\neq c,\quad c\neq d,\dots$ > $a\neq b,\quad b\neq c,\quad c\neq d,\dots$
> - dem Cela découle directement du fait que l'on choisit, à chaque fois, les plus grands $\alpha, \beta, \gamma, \delta\dots$ possibles > - dem Cela découle directement du fait que l'on choisit, à chaque fois, les plus grands $\alpha, \beta, \gamma, \delta\dots$ possibles
^regroupement
## Atomes ## Atomes
> [!definition] Découpage > [!definition] Découpage