@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,45 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+
4
+ <head>
5
+ <meta charset="utf-8">
6
+ <title>Speaker View</title>
7
+ <link rel="stylesheet" href="/css/main.css">
8
+ <link rel="stylesheet" href="./bespoke-speaker.css">
9
+ <!-- <link rel="stylesheet" href="./bespoke-speaker-overrides.css">-->
10
+ </head>
11
+
12
+ <body>
13
+ <div id="present-container">
14
+ <div class="slides full" id="present">
15
+ <!-- <div id="present-content"></div>-->
16
+ </div>
17
+ </div>
18
+ <div id="future-container">
19
+ <div class="slides full" id="future">
20
+ <!-- <div id="future-content"></div>-->
21
+ </div>
22
+ </div>
23
+
24
+ <div id="notes">
25
+ <p id="notes-content"></p>
26
+ </div>
27
+
28
+ <div id="top">
29
+ <div id="time">
30
+ <span id="clock">
31
+ <span id="hours">00</span>:<span id="minutes">00</span>:<span id="seconds">00</span>
32
+ </span>
33
+ <span id="timer" onclick="startClock()">
34
+ <span id="t-hours">00</span>:<span id="t-minutes">00</span>:<span id="t-seconds">00</span>
35
+ </span>
36
+ </div>
37
+ </div>
38
+ <div id="bottom">
39
+
40
+ </div>
41
+
42
+ <script type="application/javascript" src="./bespoke-speaker.js"></script>
43
+ </body>
44
+
45
+ </html>
@@ -0,0 +1,100 @@
1
+ // FIXME: extaire les classes css du parent de la config ?
2
+ const NAMESPACE = "bespoke-speaker"
3
+ const config = {
4
+ parent: 'deck',
5
+ slides: 'slide',
6
+ slideWidth: 1024,
7
+ slideHeight: 768
8
+ }
9
+
10
+ function init() {
11
+ startClock();
12
+ connect();
13
+ window.addEventListener('message', onMessage);
14
+ window.addEventListener('keydown', onKeyDown);
15
+ window.addEventListener('resize', updateDisplay);
16
+ // console.log(window.opener.document)
17
+ }
18
+
19
+ function connect() {
20
+ sendMessage('REGISTER', {})
21
+ }
22
+
23
+ function sendMessage(type, data) {
24
+ window.opener.postMessage(
25
+ JSON.stringify({
26
+ namespace: NAMESPACE,
27
+ type,
28
+ ...data
29
+ }),
30
+ '*'
31
+ );
32
+ }
33
+
34
+ function onKeyDown(event) {
35
+ const {ctrlKey, shiftKey, altKey, metaKey, key} = event;
36
+ sendMessage('KEYDOWN', {ctrlKey, shiftKey, altKey, metaKey, key})
37
+ }
38
+
39
+ function onMessage(e) {
40
+ let data = null
41
+ try {
42
+ data = JSON.parse(e.data);
43
+ } catch (e) {
44
+ // console.log("cant parse",typeof e.data, e.data)
45
+ return;//unparsable msg
46
+ }
47
+ if (!data || data.namespace !== NAMESPACE) {
48
+ return;
49
+ }
50
+ // console.log("onMessage", data)
51
+ // const client = e.source;
52
+ switch (data.type) {
53
+ case 'UPDATE':
54
+ updateDisplay();
55
+ break;
56
+ case 'REGISTERED':
57
+ // config = data.config;
58
+ updateDisplay();
59
+ break;
60
+ }
61
+ }
62
+
63
+ function startClock() {
64
+
65
+ }
66
+
67
+ function updateDisplay() {
68
+ const currentVignetteParent = document.querySelector('#present');
69
+ const currentVignetteContainer = document.querySelector('#present-container');
70
+ const currentVignette = currentVignetteParent.children[0];
71
+
72
+ const nextVignetteParent = document.querySelector('#future');
73
+ const nextVignetteContainer = document.querySelector('#future-container');
74
+ const nextVignette = nextVignetteParent.children[0];
75
+
76
+ if (currentVignette) {
77
+ const innerWidth = currentVignetteContainer.offsetWidth;
78
+ const innerHeight = currentVignetteContainer.offsetHeight;
79
+ const offsetWidth = currentVignette.offsetWidth;
80
+ const offsetHeight = currentVignette.offsetHeight;
81
+
82
+ const fullScale = 1 / Math.max(offsetWidth / innerWidth, offsetHeight / innerHeight);
83
+
84
+ // currentVignetteParent.style.setProperty('--slide-scale', fullScale);
85
+ currentVignetteParent.style.setProperty('--deck-full-scale', fullScale);
86
+ }
87
+ if (nextVignette) {
88
+ const innerWidth = nextVignetteContainer.offsetWidth;
89
+ const innerHeight = nextVignetteContainer.offsetHeight;
90
+ const offsetWidth = nextVignette.offsetWidth;
91
+ const offsetHeight = nextVignette.offsetHeight;
92
+
93
+ const fullScale = 1 / Math.max(offsetWidth / innerWidth, offsetHeight / innerHeight);
94
+
95
+ // nextVignetteParent.style.setProperty('--slide-scale', fullScale);
96
+ nextVignetteParent.style.setProperty('--deck-full-scale', fullScale);
97
+ }
98
+ }
99
+
100
+ init();
@@ -0,0 +1,56 @@
1
+ /* Progress */
2
+
3
+ .slide-number .slide-index {
4
+ content: var(--deck-slide-index);
5
+ }
6
+ .slide-number .slides-count {
7
+ content: var(--deck-slides-count);
8
+ }
9
+ .progress-bar {
10
+ width: var(--deck-progress);
11
+ }
12
+
13
+ .progress-bar {
14
+ position: absolute;
15
+ left: 0;
16
+ bottom: 0;
17
+ width: 0;
18
+ height: var(--progress-size);
19
+ overflow: hidden;
20
+ transition: all 0.2s linear;
21
+ }
22
+
23
+ .progress-bar::before {
24
+ display: block;
25
+ width: 100%;
26
+ height: var(--progress-size);
27
+ background-color: var(--color-blue);
28
+ content: '';
29
+ transform-origin: 0 100%;
30
+ transform: skewX(45deg);
31
+ }
32
+
33
+ .progress-bar[style*='100%']::before {
34
+ transform: none;
35
+ }
36
+
37
+ /* List */
38
+
39
+ .slides.list .progress-bar {
40
+ display: none;
41
+ }
42
+
43
+ /* Full */
44
+
45
+ .slides.full .progress-bar {
46
+ display: block;
47
+ }
48
+
49
+ /* Print */
50
+
51
+ @media print {
52
+ .slides.list .progress-bar,
53
+ .slides.full .progress-bar {
54
+ display: none;
55
+ }
56
+ }
@@ -0,0 +1,9 @@
1
+ .debug .slide {
2
+ outline: 1px solid blue;
3
+ }
4
+ .debug.overflowing {
5
+ overflow: visible;
6
+ }
7
+ .debug.overflowing .slide.active {
8
+ outline: 10px solid red !important;
9
+ }
@@ -0,0 +1,19 @@
1
+ /* Shower Full */
2
+
3
+ .slides.full {
4
+ position: absolute;
5
+ top: 50%;
6
+ left: 50%;
7
+ overflow: hidden;
8
+ margin-top: calc(
9
+ var(--slide-height) / 2 * -1
10
+ );
11
+ margin-left: calc(
12
+ var(--slide-width) / 2 * -1
13
+ );
14
+ width: var(--slide-width);
15
+ height: var(--slide-height);
16
+ transform: scale(var(--deck-full-scale));
17
+
18
+ /*background-color: black;*/
19
+ }
@@ -0,0 +1,13 @@
1
+ /* Shower Grid */
2
+
3
+ .slides.full.grid::before {
4
+ position: absolute;
5
+ top: 0;
6
+ right: 0;
7
+ bottom: 0;
8
+ left: 0;
9
+ z-index: 1;
10
+ content: '';
11
+ pointer-events: none;
12
+ background-image: url('grid.svg');
13
+ }
@@ -0,0 +1,58 @@
1
+ /* Shower List */
2
+
3
+ .slides.list {
4
+ --deck-list-block: calc(
5
+ var(--slide-gap) *
6
+ var(--slide-scale)
7
+ );
8
+ --deck-list-inline: calc(
9
+ var(--slide-gap) *
10
+ var(--slide-scale) +
11
+ env(safe-area-inset-left)
12
+ );
13
+
14
+ padding:
15
+ var(--deck-list-block)
16
+ var(--deck-list-inline);
17
+
18
+ box-sizing: border-box;
19
+ width: 100%;
20
+ display: grid;
21
+ grid-gap: calc(
22
+ var(--slide-gap) * var(--slide-scale)
23
+ );
24
+ grid-auto-rows: calc(
25
+ var(--slide-height) * var(--slide-scale)
26
+ );
27
+ /*grid-template-rows: min-content;*/
28
+ grid-template-columns: repeat(
29
+ auto-fill,
30
+ calc(var(--slide-width) * var(--slide-scale))
31
+ );
32
+ background-color: var(--color-grey);
33
+ }
34
+
35
+ /* IE & Edge Fix */
36
+
37
+ .slides.list {
38
+ position: absolute;
39
+ clip: rect(0, auto, auto, 0);
40
+ }
41
+
42
+ /* Responsive */
43
+
44
+ .slides.list {
45
+ --slide-scale: 0.25;
46
+ }
47
+
48
+ @media (min-width: 1174px) {
49
+ .slides.list {
50
+ --slide-scale: 0.5;
51
+ }
52
+ }
53
+
54
+ @media (min-width: 2348px) {
55
+ .slides.list {
56
+ --slide-scale: 1;
57
+ }
58
+ }
@@ -0,0 +1,5 @@
1
+ /* Shower Pontless */
2
+
3
+ .slides.pointless {
4
+ cursor: none;
5
+ }
@@ -0,0 +1,11 @@
1
+ /* Shower Print */
2
+
3
+ @page {
4
+ margin: 0;
5
+ size: 1024px 576px;
6
+ }
7
+
8
+ .slides {
9
+ -webkit-print-color-adjust: exact;
10
+ text-rendering: geometricPrecision;
11
+ }
@@ -0,0 +1,31 @@
1
+ /* Shower */
2
+
3
+ @import './deck-full.css' screen;
4
+ @import './deck-list.css' screen;
5
+ @import './deck-pointless.css' screen;
6
+ @import './deck-grid.css' screen;
7
+ @import './deck-print.css' print;
8
+
9
+ .slides {
10
+ --slide-gap: 100px;
11
+ /*--slide-ratio: calc(16 / 9);*/
12
+ --slide-ratio: calc(4 / 3);
13
+ --slide-width: 1024px;
14
+ --slide-height: calc(
15
+ var(--slide-width) / var(--slide-ratio)
16
+ );
17
+ --slide-side: 100px;
18
+
19
+ --progress-size: 10px;
20
+
21
+ -webkit-text-size-adjust: none;
22
+ -moz-text-size-adjust: none;
23
+ -ms-text-size-adjust: none;
24
+
25
+ margin: 0;
26
+ counter-reset: slide;
27
+
28
+
29
+ color: black;
30
+ font: 25px/2 'PT Sans', sans-serif;
31
+ }
@@ -0,0 +1,6 @@
1
+ @import url("./normalize.css");
2
+ @import url("./deck/deck.css");
3
+ @import url("./slide/slide.css");
4
+ @import url("./blocks/progress.css");
5
+
6
+ @import url("./debug.css");
@@ -0,0 +1,226 @@
1
+ html {
2
+ font-family: sans-serif;
3
+ -ms-text-size-adjust: 100%;
4
+ -webkit-text-size-adjust: 100%
5
+ }
6
+
7
+ body {
8
+ margin: 0
9
+ }
10
+
11
+ article,
12
+ aside,
13
+ details,
14
+ figcaption,
15
+ figure,
16
+ footer,
17
+ header,
18
+ hgroup,
19
+ main,
20
+ nav,
21
+ section,
22
+ summary {
23
+ display: block
24
+ }
25
+
26
+ audio,
27
+ canvas,
28
+ progress,
29
+ video {
30
+ display: inline-block;
31
+ vertical-align: baseline
32
+ }
33
+
34
+ audio:not([controls]) {
35
+ display: none;
36
+ height: 0
37
+ }
38
+
39
+ [hidden],
40
+ template {
41
+ display: none
42
+ }
43
+
44
+ a {
45
+ background: 0 0
46
+ }
47
+
48
+ a:active,
49
+ a:hover {
50
+ outline: 0
51
+ }
52
+
53
+ abbr[title] {
54
+ border-bottom: 1px dotted
55
+ }
56
+
57
+ b {
58
+ font-weight: 700
59
+ }
60
+
61
+ dfn {
62
+ font-style: italic
63
+ }
64
+
65
+ h1 {
66
+ font-size: 2em
67
+ }
68
+
69
+ mark {
70
+ background: #ff0;
71
+ color: #000
72
+ }
73
+
74
+ small {
75
+ font-size: 80%
76
+ }
77
+
78
+ sub,
79
+ sup {
80
+ font-size: 75%;
81
+ line-height: 0;
82
+ position: relative;
83
+ vertical-align: baseline
84
+ }
85
+
86
+ sup {
87
+ top: -.5em
88
+ }
89
+
90
+ sub {
91
+ bottom: -.25em
92
+ }
93
+
94
+ img {
95
+ border: 0
96
+ }
97
+
98
+ svg:not(:root) {
99
+ overflow: hidden
100
+ }
101
+
102
+ figure {
103
+ margin: 1em 40px
104
+ }
105
+
106
+ hr {
107
+ box-sizing: content-box
108
+ }
109
+
110
+ pre {
111
+ overflow: auto
112
+ }
113
+
114
+ code,
115
+ kbd,
116
+ pre,
117
+ samp {
118
+ font-size: 1em
119
+ }
120
+
121
+ kbd,
122
+ pre,
123
+ samp {
124
+ font-family: monospace, monospace
125
+ }
126
+
127
+ button,
128
+ input,
129
+ optgroup,
130
+ select,
131
+ textarea {
132
+ color: inherit;
133
+ font: inherit;
134
+ margin: 0
135
+ }
136
+
137
+ button {
138
+ overflow: visible
139
+ }
140
+
141
+ button,
142
+ select {
143
+ text-transform: none
144
+ }
145
+
146
+ button,
147
+ html input[type=\"button\"],
148
+ input[type=\"reset\"],
149
+ input[type=\"submit\"] {
150
+ -webkit-appearance: button;
151
+ cursor: pointer
152
+ }
153
+
154
+ button[disabled],
155
+ html input[disabled] {
156
+ cursor: default
157
+ }
158
+
159
+ button::-moz-focus-inner,
160
+ input::-moz-focus-inner {
161
+ border: 0;
162
+ padding: 0
163
+ }
164
+
165
+ input {
166
+ line-height: normal
167
+ }
168
+
169
+ input[type=\"checkbox\"],
170
+ input[type=\"radio\"] {
171
+ box-sizing: border-box;
172
+ padding: 0
173
+ }
174
+
175
+ input[type=\"number\"]::-webkit-inner-spin-button,
176
+ input[type=\"number\"]::-webkit-outer-spin-button {
177
+ height: auto
178
+ }
179
+
180
+ input[type=\"search\"] {
181
+ -webkit-appearance: textfield;
182
+ box-sizing: content-box
183
+ }
184
+
185
+ input[type=\"search\"]::-webkit-search-cancel-button,
186
+ input[type=\"search\"]::-webkit-search-decoration {
187
+ -webkit-appearance: none
188
+ }
189
+
190
+ fieldset {
191
+ border: 1px solid silver;
192
+ margin: 0 2px;
193
+ padding: .35em .625em .75em
194
+ }
195
+
196
+ legend {
197
+ border: 0;
198
+ padding: 0
199
+ }
200
+
201
+ textarea {
202
+ overflow: auto
203
+ }
204
+
205
+ optgroup {
206
+ font-weight: 700
207
+ }
208
+
209
+ table {
210
+ border-collapse: collapse;
211
+ border-spacing: 0
212
+ }
213
+
214
+ td,
215
+ th,
216
+ * {
217
+ padding: 0
218
+ }
219
+
220
+ * {
221
+ margin: 0
222
+ }
223
+
224
+ html {
225
+ text-size-adjust: auto
226
+ }
@@ -0,0 +1,16 @@
1
+ /* Slide Full */
2
+
3
+ .slides.full .slide {
4
+ position: absolute;
5
+ top: 0;
6
+ left: 0;
7
+ clip: rect(0 0 0 0);
8
+ visibility: hidden;
9
+ }
10
+
11
+ /* Active */
12
+
13
+ .slides.full .slide.active {
14
+ clip: auto;
15
+ visibility: visible;
16
+ }
@@ -0,0 +1,31 @@
1
+ /* Slide List */
2
+
3
+ .slides.list .slide {
4
+ border-radius: 2px;
5
+ box-shadow: 0 20px 50px rgb(0 0 0 / 30%);
6
+ transform-origin: 0 0;
7
+ transform: scale(
8
+ var(--slide-scale)
9
+ );
10
+ }
11
+
12
+ .slides.list .slide * {
13
+ pointer-events: none;
14
+ }
15
+
16
+ /* Hover */
17
+
18
+ .slides.list .slide:hover {
19
+ box-shadow:
20
+ 0 0 0 20px rgb(0 0 0 / 10%),
21
+ 0 20px 50px rgb(0 0 0 / 30%);
22
+ }
23
+
24
+ /* Active */
25
+
26
+ .slides.list .slide.active {
27
+ box-shadow:
28
+ 0 0 0 1px #376da3,
29
+ 0 0 0 20px #4b86c2,
30
+ 0 20px 50px rgb(0 0 0 / 30%);
31
+ }
@@ -0,0 +1,28 @@
1
+ /* Types */
2
+
3
+
4
+ @import './slide-list.css' screen;
5
+ @import './slide-full.css' screen;
6
+
7
+ /* Slide */
8
+
9
+ /*.slides {*/
10
+ /* --slide-ratio: calc(16 / 9);*/
11
+ /*}*/
12
+
13
+ .slide {
14
+ position: relative;
15
+ z-index: 0;
16
+ overflow: hidden;
17
+ box-sizing: border-box;
18
+ width: var(--slide-width);
19
+ height: var(--slide-height);
20
+ }
21
+
22
+ .slide {
23
+ display: flex;
24
+ flex-direction: column;
25
+ justify-content: center;
26
+ z-index: 1;
27
+ }
28
+