@tblaisot/prez-as-adoc 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.github/workflows/release.yml +18 -0
  2. package/README.adoc +30 -0
  3. package/asciidoctor/extensions/slides_treeprocessor.js +96 -0
  4. package/asciidoctor/extensions/speaker_notes_treeprocessor.js +40 -0
  5. package/asciidoctor/templates/admonition.js +10 -0
  6. package/asciidoctor/templates/document.js +86 -0
  7. package/asciidoctor/templates/package.json +3 -0
  8. package/asciidoctor/templates/preamble.js +11 -0
  9. package/asciidoctor/templates/section.js +29 -0
  10. package/asciidoctor/templates/slide.js +54 -0
  11. package/asciidoctor/templates/speaker_note.js +12 -0
  12. package/asciidoctor/templates/title.js +24 -0
  13. package/bespoke-plugins/bespoke-classes.js +44 -0
  14. package/bespoke-plugins/bespoke-debug.js +30 -0
  15. package/bespoke-plugins/bespoke-editor.js +96 -0
  16. package/bespoke-plugins/bespoke-hash.js +89 -0
  17. package/bespoke-plugins/bespoke-nav.js +46 -0
  18. package/bespoke-plugins/bespoke-overview.js +21 -0
  19. package/bespoke-plugins/bespoke-progress.js +18 -0
  20. package/bespoke-plugins/bespoke-scale.js +45 -0
  21. package/bespoke-plugins/bespoke-speaker.js +112 -0
  22. package/bespoke-plugins/bespoke-view-mode.js +51 -0
  23. package/bin/prez-as-adoc.js +52 -0
  24. package/package.json +30 -0
  25. package/statics/assets/bespoke-speaker.css +193 -0
  26. package/statics/assets/bespoke-speaker.html +45 -0
  27. package/statics/assets/bespoke-speaker.js +100 -0
  28. package/statics/styles/blocks/progress.css +56 -0
  29. package/statics/styles/debug.css +9 -0
  30. package/statics/styles/deck/deck-full.css +19 -0
  31. package/statics/styles/deck/deck-grid.css +13 -0
  32. package/statics/styles/deck/deck-list.css +58 -0
  33. package/statics/styles/deck/deck-pointless.css +5 -0
  34. package/statics/styles/deck/deck-print.css +11 -0
  35. package/statics/styles/deck/deck.css +31 -0
  36. package/statics/styles/main.css +6 -0
  37. package/statics/styles/normalize.css +226 -0
  38. package/statics/styles/slide/slide-full.css +16 -0
  39. package/statics/styles/slide/slide-list.css +31 -0
  40. package/statics/styles/slide/slide.css +28 -0
  41. package/vitejs/plugins/prez-as-adoc-plugin.js +114 -0
@@ -0,0 +1,89 @@
1
+ export default function () {
2
+ return function (deck) {
3
+
4
+ let _hash = {main: '', query: {}}
5
+
6
+ deck.hash = function (value = undefined) {
7
+ if (value) {
8
+ if (value.main !== undefined) {
9
+ _hash.main = value.main;
10
+ }
11
+ if (value.query !== undefined) {
12
+ Object.assign(_hash.query, value.query);
13
+ }
14
+ const searchParams = new URLSearchParams();
15
+ Object.keys(_hash.query).forEach((e) => {
16
+ if (_hash.query[e] !== null) {
17
+ searchParams.set(e, _hash.query[e]);
18
+ }
19
+ });
20
+ let hash = _hash.main || '';
21
+ const query = searchParams.toString();
22
+ if (query.length > 0) {
23
+ hash += '?';
24
+ hash += query;
25
+ }
26
+ window.location.hash = hash;
27
+ }
28
+ return _hash;
29
+ }
30
+
31
+ function activateSlide(index) {
32
+ const indexToActivate = -1 < index && index < deck.slides.length ? index : 0;
33
+ if (indexToActivate !== deck.slide()) {
34
+ deck.slide(indexToActivate);
35
+ }
36
+ }
37
+
38
+ function parseHash() {
39
+ const hash = window.location.hash.slice(1).split('?');
40
+ const main = hash[0];
41
+ let query = {};
42
+ if (hash.length > 1) {
43
+ const searchParams = new URLSearchParams(hash[1]);
44
+ query = Array.from(searchParams.entries()).reduce(
45
+ (acc, e) => {
46
+ acc[e[0]] = e[1];
47
+ return acc;
48
+ },
49
+ {}
50
+ );
51
+ }
52
+ _hash = {
53
+ main,
54
+ query
55
+ };
56
+ deck.fire('hashchange', _hash);
57
+ }
58
+
59
+ function navigateToSlide() {
60
+ const hash = deck.hash().main;
61
+ const slideNumberOrName = parseInt(hash, 10);
62
+
63
+ if (hash) {
64
+ if (slideNumberOrName) {
65
+ activateSlide(slideNumberOrName - 1);
66
+ } else {
67
+ deck.slides.forEach(function (slide, i) {
68
+ if (slide.getAttribute('data-bespoke-hash') === hash || slide.id === hash) {
69
+ activateSlide(i);
70
+ }
71
+ });
72
+ }
73
+ }
74
+ }
75
+
76
+ setTimeout(() => {
77
+
78
+ deck.on('activate', (e) => {
79
+ const slideName = e.slide.getAttribute('data-bespoke-hash') || e.slide.id;
80
+ // window.location.hash = slideName || e.index + 1;
81
+ deck.hash({main: (slideName || e.index + 1)})
82
+ });
83
+
84
+ deck.on('hashchange', navigateToSlide)
85
+ parseHash();
86
+ window.addEventListener('hashchange', parseHash);
87
+ }, 0);
88
+ };
89
+ };
@@ -0,0 +1,46 @@
1
+
2
+ const KEY_PAGEUP = "PageUp",
3
+ KEY_PAGEDOWN = "PageDown",
4
+ KEY_END = "End",
5
+ KEY_HOME = "Up",
6
+ KEY_LEFT = "ArrowLeft",
7
+ KEY_RIGHT = "ArrowRight",
8
+ KEY_UP = "ArrowUp",
9
+ KEY_DOWN = "ArrowDown";
10
+ const KD = 'keydown';
11
+
12
+
13
+ export default function () {
14
+ return function (deck) {
15
+ const handlers = {}
16
+
17
+ function modified(e, k) {
18
+ return e.ctrlKey || (e.shiftKey && (k === KEY_HOME || k === KEY_END)) || e.altKey || e.metaKey;
19
+ }
20
+
21
+ function addKeyHandler(keys, handler) {
22
+ if (!Array.isArray(keys)) {
23
+ keys = [keys];
24
+ }
25
+ keys.forEach(key => { handlers[key] = handler });
26
+ }
27
+ deck.addKeyHandler = addKeyHandler;
28
+
29
+ function onKey(e) {
30
+ // console.log("KEYBOARD", e.key)
31
+ if (!modified(e, e.key)) {
32
+ if (handlers.hasOwnProperty(e.key)) {
33
+ handlers[e.key]()
34
+ }
35
+ }
36
+ }
37
+ deck.on('destroy', function () { document.removeEventListener(KD, onKey); });
38
+ document.addEventListener(KD, onKey);
39
+
40
+ // deck.addKeyHandler(KEY_SP, () => { return (e.shiftKey ? deck.prev : deck.next()); });
41
+ deck.addKeyHandler([KEY_RIGHT, KEY_PAGEDOWN], () => { return deck.next(); });
42
+ deck.addKeyHandler([KEY_LEFT, KEY_PAGEUP], () => { return deck.prev(); });
43
+ deck.addKeyHandler(KEY_HOME, () => { return deck.slide(0); });
44
+ deck.addKeyHandler(KEY_END, () => { return deck.slide(deck.slides.length - 1); });
45
+ };
46
+ };
@@ -0,0 +1,21 @@
1
+ const KEY_V = "v";
2
+ const MODES = ['full', 'list'];
3
+ export default function () {
4
+ return function (deck) {
5
+ function cycleViewMode(){
6
+ for(let i =0; i<MODES.length; i++){
7
+ if(deck.parent.classList.contains(MODES[i])){
8
+ deck.parent.classList.remove(MODES[i])
9
+ deck.parent.classList.add(MODES[(i+1)%MODES.length])
10
+ return;
11
+ }
12
+ }
13
+ }
14
+
15
+ deck.parent.classList.add(MODES[0]);
16
+ deck.addKeyHandler(KEY_V, () => {
17
+ return cycleViewMode();
18
+ });
19
+
20
+ };
21
+ };
@@ -0,0 +1,18 @@
1
+ export default function (options = {}) {
2
+ return function (deck) {
3
+ const parent = deck.parent;
4
+
5
+ const updateProgress = (index) => {
6
+ const {length} = deck.slides;
7
+ const progress = (index / (length - 1)) * 100;
8
+ parent.style.setProperty('--deck-progress-percentage', `${progress}%`);
9
+ parent.style.setProperty('--deck-slide-index', `${index + 1}`);
10
+ parent.style.setProperty('--deck-slides-count', `${length}`);
11
+ };
12
+
13
+ deck.on('activate', function (e) {
14
+ updateProgress(e.index);
15
+ });
16
+ updateProgress(deck.slide());
17
+ };
18
+ };
@@ -0,0 +1,45 @@
1
+ export default function (config) {
2
+ return function (deck) {
3
+ const parent = deck.parent;
4
+ // slideHeight = config.slideHeight,
5
+ // slideWidth = config.slideWidth;
6
+
7
+ const updateScale = () => {
8
+ const firstSlide = deck.slides[0];
9
+ if (!firstSlide) return;
10
+
11
+ const { innerWidth, innerHeight } = window;
12
+ // const innerWidth = window.offsetWidth;
13
+ // const innerHeight = window.offsetHeight;
14
+ const { offsetWidth, offsetHeight } = firstSlide;
15
+
16
+ // const listScale = 1 / (offsetWidth / innerWidth);
17
+ const fullScale = 1 / Math.max(offsetWidth / innerWidth, offsetHeight / innerHeight);
18
+
19
+ // parent.style.setProperty('--deck-list-scale', listScale);
20
+ parent.style.setProperty('--deck-full-scale', fullScale);
21
+ };
22
+
23
+ // function scale(element, ratio) {
24
+ // element.style.transform = `scale(${ratio})`;
25
+ // }
26
+
27
+ // function scaleAll() {
28
+ // // scale(firstSlide, 1);
29
+ // console.log("scaleAll", parent.offsetWidth, parent.offsetHeight, slideWidth, slideHeight)
30
+ // const xScale = parent.offsetWidth / slideWidth;
31
+ // const yScale = parent.offsetHeight / slideHeight;
32
+ //
33
+ // console.log(xScale, yScale)
34
+ //
35
+ // deck.slides.forEach((slide =>{
36
+ // scale(slide, Math.min(xScale, yScale));
37
+ // }))
38
+ //
39
+ // }
40
+
41
+ window.addEventListener('resize', updateScale);
42
+ updateScale();
43
+ };
44
+
45
+ };
@@ -0,0 +1,112 @@
1
+ // import speakerViewHTML from './bespoke-speaker.html'
2
+
3
+ const NAMESPACE = "bespoke-speaker"
4
+
5
+ const KEY_S = "s";
6
+
7
+ export default function (config = {notes: "prez-speaker-notes"}) {
8
+ return function (deck) {
9
+ const clients = [];
10
+ let speakerWindow;
11
+
12
+ function sendMessage(client, type, data) {
13
+ client.postMessage(
14
+ JSON.stringify({
15
+ namespace: NAMESPACE,
16
+ type,
17
+ ...data
18
+ }),
19
+ '*'
20
+ );
21
+ }
22
+
23
+ function openSpeakerView() {
24
+ // console.log("OPEN")
25
+ speakerWindow = window.open('/assets/bespoke-speaker.html', 'Speaker View - Notes', 'width=1100,height=700');
26
+ // speakerWindow.document.write(speakerViewHTML);
27
+
28
+ if (!speakerWindow) {
29
+ alert('Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.');
30
+ return;
31
+ }
32
+ // updateSpeakerView();
33
+ // updateSpeakerCss();
34
+ }
35
+
36
+ function updateSpeakerCss(){
37
+ document.head.querySelectorAll('style').forEach(el => {
38
+ speakerWindow.document.head.prepend(el.cloneNode(true))
39
+ })
40
+ document.head.querySelectorAll('link[rel="stylesheet"][type="text/css"]').forEach(el => {
41
+ speakerWindow.document.head.prepend(el.cloneNode(true))
42
+ })
43
+ }
44
+
45
+ function updateSpeakerView() {
46
+ if (!speakerWindow) {
47
+ return;
48
+ }
49
+ const currentSlideIndex = deck.slide();
50
+
51
+ const currentVignette = speakerWindow.document.querySelector('#present');
52
+ const nextVignette = speakerWindow.document.querySelector('#future');
53
+ const notes = speakerWindow.document.querySelector('#notes #notes-content');
54
+
55
+ // Update previews
56
+ currentVignette.innerHTML = deck.slides[currentSlideIndex]?.outerHTML
57
+ nextVignette.innerHTML = deck.slides[currentSlideIndex + 1]?.outerHTML
58
+ notes.innerHTML = [...deck.slides[currentSlideIndex].querySelectorAll(config.notes)].map(n => n.outerHTML).join('')
59
+
60
+ // Notify to update scale
61
+ sendMessage(speakerWindow, 'UPDATE', {})
62
+ }
63
+
64
+ function onMessage(e) {
65
+ if(typeof e.data !== "string"){
66
+ return
67
+ }
68
+ let data = null
69
+ try {
70
+ data = JSON.parse(e.data);
71
+ } catch (err){
72
+ // console.log("cant parse",typeof e.data, e.data)
73
+ return;//unparsable msg
74
+ }
75
+ if (!data || data.namespace !== NAMESPACE) {
76
+ return;
77
+ }
78
+ // console.log("onMessage", data)
79
+ const client = e.source;
80
+ switch (data.type) {
81
+ case 'REGISTER':
82
+ // console.log("Register")
83
+ clients.push(client);
84
+ sendMessage(
85
+ client,
86
+ 'REGISTERED',
87
+ {
88
+ config: config,
89
+ url: encodeURIComponent(document.title || 'Untitled')
90
+ }
91
+ );
92
+ updateSpeakerView();
93
+ updateSpeakerCss();
94
+ break;
95
+ case 'KEYDOWN':
96
+ document.dispatchEvent(new KeyboardEvent('keydown', data));
97
+ break;
98
+ }
99
+ }
100
+
101
+ deck.on('destroy', function () {
102
+ removeEventListener('message', onMessage, false);
103
+ });
104
+ deck.on('activate', function () {
105
+ updateSpeakerView();
106
+ });
107
+ window.addEventListener('message', onMessage, false);
108
+ deck.addKeyHandler(KEY_S, () => {
109
+ return openSpeakerView();
110
+ });
111
+ };
112
+ };
@@ -0,0 +1,51 @@
1
+ const KEY_V = "v";
2
+ export default function (modes) {
3
+ return function (deck) {
4
+ function applyMode(current, previous = undefined) {
5
+ if (previous) {
6
+ document.body.classList.remove(previous);
7
+ deck.parent.classList.remove(previous);
8
+ }
9
+ document.body.classList.add(current);
10
+ deck.parent.classList.add(current);
11
+ }
12
+
13
+ deck.mode = function (value = undefined) {
14
+ const currentValue = (deck.hash().query || {}).mode || modes[0];
15
+ if (value) {
16
+ let mode = value;
17
+ if (value === 'default') {
18
+ mode = modes[0];
19
+ deck.hash({query: {mode: null}});
20
+ } else {
21
+ deck.hash({query: {mode: value}});
22
+ }
23
+ applyMode(mode, currentValue)
24
+ deck.fire('viewmode', {current: mode, previous: currentValue});
25
+ }
26
+ return currentValue;
27
+ }
28
+
29
+ deck.toogleMode = function (value) {
30
+ if (deck.mode() === value) {
31
+ deck.mode('default');
32
+ } else {
33
+ deck.mode(value)
34
+ }
35
+ }
36
+
37
+ function cycleViewMode() {
38
+ const current = modes.indexOf(deck.mode());
39
+ deck.mode(modes[(current + 1) % modes.length]);
40
+ }
41
+
42
+ deck.addKeyHandler(KEY_V, () => {
43
+ return cycleViewMode();
44
+ });
45
+
46
+ setTimeout(()=>{
47
+ applyMode(deck.mode());
48
+ deck.fire('viewmode', {current: deck.mode(), previous: null});
49
+ },1)
50
+ };
51
+ };
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+ import arg from 'arg';
3
+
4
+ import * as path from "path";
5
+ import {asciidoctor, BASE_OPTIONS, REGISTRY} from "@tblaisot/asciidoctor-js-templates";
6
+ import * as url from 'url';
7
+
8
+ import * as slidesTreeprocessor from "../asciidoctor/extensions/slides_treeprocessor.js";
9
+ import * as speakerNotesTreeprocessor from "../asciidoctor/extensions/speaker_notes_treeprocessor.js";
10
+
11
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
12
+
13
+ slidesTreeprocessor.register(REGISTRY);
14
+ speakerNotesTreeprocessor.register(REGISTRY);
15
+
16
+ const args = arg(
17
+ {
18
+ '--slides-templates': [String],
19
+ '--asciidoctor-templates-overloads': [String],
20
+ '--base_dir': String,
21
+ '--to_dir': String,
22
+ },
23
+ {
24
+ argv: process.argv.slice(2),
25
+ }
26
+ );
27
+
28
+ const template_dirs = [...BASE_OPTIONS.template_dirs, path.resolve(__dirname, '../asciidoctor/templates')]
29
+ const overloads = args['--asciidoctor-templates-overloads']
30
+ if (overloads && overloads.length > 0) {
31
+ overloads.forEach(overload => {
32
+ template_dirs.push(path.resolve(process.cwd(), overload));
33
+ })
34
+
35
+ }
36
+ const base_dir = path.resolve(process.cwd(), args['--base_dir'] || './src');
37
+ const to_dir = path.resolve(process.cwd(), args['--to_dir'] || './dist');
38
+ const slides_templates = args['--slides-templates'] || [];
39
+
40
+ const OPTIONS = {
41
+ ...BASE_OPTIONS,
42
+ attributes: {
43
+ ...BASE_OPTIONS.attributes,
44
+ 'slide-template-dirs': slides_templates.map(p => path.resolve(process.cwd(), p))
45
+ },
46
+ template_dirs,
47
+ base_dir,
48
+ to_dir,
49
+ }
50
+
51
+ // console.log(JSON.stringify(OPTIONS))
52
+ asciidoctor.convertFile(args._[0], OPTIONS);
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@tblaisot/prez-as-adoc",
3
+ "version": "0.0.1",
4
+ "description": "",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/tblaisot/prez-as-adoc.git"
8
+ },
9
+ "type": "module",
10
+ "bin": {
11
+ "prez-as-adoc": "bin/prez-as-adoc.js"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "require": "./index.cjs",
16
+ "import": "./index.mjs"
17
+ },
18
+ "./vitejs/plugins/prez-as-adoc-plugin.js": "./vitejs/plugins/prez-as-adoc-plugin.js"
19
+ },
20
+ "keywords": [
21
+ "cli"
22
+ ],
23
+ "author": "",
24
+ "license": "ISC",
25
+ "dependencies": {
26
+ "arg": "^5.0.2",
27
+ "node-html-parser": "^6.1.5",
28
+ "vite": "^4.2.1"
29
+ }
30
+ }
@@ -0,0 +1,193 @@
1
+ *,
2
+ ::before,
3
+ ::after {
4
+ -moz-box-sizing: inherit;
5
+ box-sizing: inherit;
6
+ }
7
+
8
+ html {
9
+ -moz-box-sizing: border-box;
10
+ box-sizing: border-box;
11
+ }
12
+
13
+ body {
14
+ margin: 0;
15
+ height: 100vh;
16
+ width: 100vw;
17
+ font-family: sans-serif;
18
+ overflow: hidden;
19
+
20
+ display: grid;
21
+ /*grid-template-columns: 3fr 1fr;*/
22
+ /*grid-template-rows: 3fr 3fr 1fr;*/
23
+ gap: 0;
24
+ /*grid-auto-flow: row;*/
25
+ /*grid-template-areas:*/
26
+ /* "present future"*/
27
+ /* "present notes"*/
28
+ /* "present timer";*/
29
+
30
+ grid-template-columns: 1fr 1.1fr 0.9fr;
31
+ grid-template-rows: min-content 1fr 2fr min-content;
32
+ grid-template-areas:
33
+ "top top top"
34
+ "main main next"
35
+ "main main notes"
36
+ "bottom bottom bottom";
37
+ }
38
+
39
+
40
+ #top {
41
+ grid-area: top;
42
+ height: 3.5rem;
43
+ }
44
+ #bottom {
45
+ grid-area: bottom;
46
+ height: 3.5rem;
47
+ }
48
+
49
+ #present-container {
50
+ grid-area: main;
51
+ }
52
+
53
+ #future-container {
54
+ grid-area: next;
55
+ }
56
+
57
+ #notes {
58
+ grid-area: notes;
59
+ }
60
+
61
+ #time { /*grid-area: timer;*/
62
+ }
63
+
64
+ #present-container, #future-container {
65
+ position: relative;
66
+ outline: solid red 2px;
67
+ }
68
+
69
+ #present-container .slide, #future-container .slide {
70
+ clip: auto;
71
+ visibility: visible;
72
+ outline: solid blue 1px;
73
+ }
74
+
75
+ /*#present {*/
76
+ /* position: absolute;*/
77
+ /* width: 65%;*/
78
+ /* height: 100%;*/
79
+ /* top: 0;*/
80
+ /* left: 0;*/
81
+ /*}*/
82
+
83
+ /*#future {*/
84
+ /* position: absolute;*/
85
+ /* width: 35%;*/
86
+ /* height: 100%;*/
87
+ /* top: 0;*/
88
+ /* left: 65%;*/
89
+ /*}*/
90
+
91
+ /*#notes {*/
92
+ /* position: absolute;*/
93
+ /* width: 35%;*/
94
+ /* height: 30%;*/
95
+ /* top: 30%;*/
96
+ /* left: 65%;*/
97
+ /*}*/
98
+
99
+ /*#timer {*/
100
+ /* position: absolute;*/
101
+ /* width: 35%;*/
102
+ /* height: 10%;*/
103
+ /* top: 90%;*/
104
+ /* left: 65%;*/
105
+ /*}*/
106
+
107
+
108
+ /*#present,*/
109
+ /*#future {*/
110
+ /* !*padding: 10px;*!*/
111
+ /* display: grid;*/
112
+ /* place-items: center;*/
113
+ /*}*/
114
+
115
+ /*#notes {*/
116
+ /* overflow: auto;*/
117
+ /* font-size: 18px;*/
118
+ /* padding: 6px;*/
119
+ /*}*/
120
+
121
+ /*#notes #notes-content {*/
122
+ /* color: #444;*/
123
+ /* margin: 0 10px;*/
124
+ /* line-height: 1.4;*/
125
+ /* font-size: 1.2em;*/
126
+ /*}*/
127
+
128
+ /*#notes #notes-content p {*/
129
+ /* margin: 0 0 1em 0;*/
130
+ /*}*/
131
+
132
+ /*#time {*/
133
+ /* !*bottom: 0;*!*/
134
+ /* !*right: 0;*!*/
135
+ /* !*height: 10%;*!*/
136
+ /* !*width: 35%;*!*/
137
+ /* !*position: absolute;*!*/
138
+ /* padding: 0 6px;*/
139
+ /* font-size: 2em;*/
140
+ /*}*/
141
+
142
+ /*#time #clock {*/
143
+ /* float: left;*/
144
+ /* margin-left: 10px;*/
145
+ /*}*/
146
+
147
+ /*#time #timer {*/
148
+ /* float: right;*/
149
+ /* margin-right: 10px;*/
150
+ /* cursor: pointer;*/
151
+ /*}*/
152
+
153
+ /*!*#time::before,*!*/
154
+ /*!*#notes::before {*!*/
155
+ /*!* content: attr(id);*!*/
156
+ /*!* text-transform: uppercase;*!*/
157
+ /*!* font-size: 0.75rem;*!*/
158
+ /*!* color: #666;*!*/
159
+ /*!* display: block;*!*/
160
+ /*!* padding: 10px 10px 5px 10px;*!*/
161
+ /*!*}*!*/
162
+
163
+ /*!*#time::before {*!*/
164
+ /*!* border-top: 1px solid rgba(200, 200, 200, 0.5);*!*/
165
+ /*!*}*!*/
166
+
167
+
168
+ /*!* Override of bespokes css for speker view *!*/
169
+ /*.bespoke-inactive {*/
170
+ /* opacity: 1;*/
171
+ /*}*/
172
+ /*.bespoke-slide {*/
173
+ /* !*position: relative;*!*/
174
+ /* transform-origin: top left;*/
175
+ /*}*/
176
+
177
+
178
+ /*.deck.full {*/
179
+ /* position: absolute;*/
180
+ /* top: 50%;*/
181
+ /* left: 50%;*/
182
+ /* overflow: hidden;*/
183
+ /* margin-top: calc(*/
184
+ /* var(--slide-height) / 2 * -1*/
185
+ /* );*/
186
+ /* margin-left: calc(*/
187
+ /* var(--slide-width) / 2 * -1*/
188
+ /* );*/
189
+ /* width: var(--slide-width);*/
190
+ /* height: var(--slide-height);*/
191
+ /* background-color: black;*/
192
+ /* transform: scale(var(--deck-full-scale));*/
193
+ /*}*/