pdf-presenter 1.0.0
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.
- package/LICENSE +21 -0
- package/README-zhtw.md +211 -0
- package/README.md +211 -0
- package/dist/pdf-presenter.js +760 -0
- package/package.json +58 -0
- package/src/ui/audience.html +22 -0
- package/src/ui/audience.js +85 -0
- package/src/ui/modules/import-export.js +94 -0
- package/src/ui/modules/notes-editor.js +126 -0
- package/src/ui/modules/pdf-render.js +66 -0
- package/src/ui/modules/recording-dialog.js +131 -0
- package/src/ui/modules/recording.js +268 -0
- package/src/ui/modules/resizable-layout.js +146 -0
- package/src/ui/modules/timer.js +72 -0
- package/src/ui/presenter-main.js +169 -0
- package/src/ui/presenter.css +669 -0
- package/src/ui/presenter.html +142 -0
- package/src/ui/presenter.js +7 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
|
6
|
+
<title>pdf-presenter — Presenter</title>
|
|
7
|
+
<link rel="stylesheet" href="/assets/presenter.css" />
|
|
8
|
+
<!--PDF_PRESENTER_CONFIG-->
|
|
9
|
+
</head>
|
|
10
|
+
<body class="presenter">
|
|
11
|
+
<div class="layout">
|
|
12
|
+
<div class="col col-left">
|
|
13
|
+
<section class="current">
|
|
14
|
+
<header class="panel-title">Current</header>
|
|
15
|
+
<div class="canvas-wrap">
|
|
16
|
+
<canvas id="current-canvas"></canvas>
|
|
17
|
+
</div>
|
|
18
|
+
</section>
|
|
19
|
+
<div
|
|
20
|
+
class="divider-row"
|
|
21
|
+
id="divider-row-left"
|
|
22
|
+
role="separator"
|
|
23
|
+
aria-orientation="horizontal"
|
|
24
|
+
aria-label="Resize left column rows"
|
|
25
|
+
></div>
|
|
26
|
+
<section class="notes">
|
|
27
|
+
<header class="panel-title">
|
|
28
|
+
<span>Speaker Notes</span>
|
|
29
|
+
<span id="notes-status" class="notes-status" aria-live="polite"></span>
|
|
30
|
+
<span id="notes-hint" class="notes-hint"></span>
|
|
31
|
+
</header>
|
|
32
|
+
<textarea
|
|
33
|
+
id="notes-body"
|
|
34
|
+
class="notes-body"
|
|
35
|
+
spellcheck="false"
|
|
36
|
+
autocomplete="off"
|
|
37
|
+
placeholder="Type notes for this slide… (saved automatically)"
|
|
38
|
+
></textarea>
|
|
39
|
+
</section>
|
|
40
|
+
</div>
|
|
41
|
+
<div
|
|
42
|
+
class="divider-col"
|
|
43
|
+
id="divider-col"
|
|
44
|
+
role="separator"
|
|
45
|
+
aria-orientation="vertical"
|
|
46
|
+
aria-label="Resize columns"
|
|
47
|
+
></div>
|
|
48
|
+
<div class="col col-right">
|
|
49
|
+
<section class="next">
|
|
50
|
+
<header class="panel-title">Next</header>
|
|
51
|
+
<div class="canvas-wrap">
|
|
52
|
+
<canvas id="next-canvas"></canvas>
|
|
53
|
+
</div>
|
|
54
|
+
</section>
|
|
55
|
+
<div
|
|
56
|
+
class="divider-row"
|
|
57
|
+
id="divider-row-right"
|
|
58
|
+
role="separator"
|
|
59
|
+
aria-orientation="horizontal"
|
|
60
|
+
aria-label="Resize right column rows"
|
|
61
|
+
></div>
|
|
62
|
+
<section class="meta">
|
|
63
|
+
<div class="timer-row">
|
|
64
|
+
<button
|
|
65
|
+
type="button"
|
|
66
|
+
id="timer"
|
|
67
|
+
class="timer"
|
|
68
|
+
title="Click to pause / resume (R to reset)"
|
|
69
|
+
aria-label="Timer — click to pause or resume"
|
|
70
|
+
>00:00</button>
|
|
71
|
+
<button
|
|
72
|
+
type="button"
|
|
73
|
+
id="timer-reset"
|
|
74
|
+
class="timer-reset"
|
|
75
|
+
title="Reset timer (R)"
|
|
76
|
+
aria-label="Reset timer"
|
|
77
|
+
>↺</button>
|
|
78
|
+
</div>
|
|
79
|
+
<div class="counter" id="counter">– / –</div>
|
|
80
|
+
<div class="notes-actions">
|
|
81
|
+
<button type="button" id="export-notes" class="btn">Export speaker note</button>
|
|
82
|
+
<button type="button" id="load-notes" class="btn">Load speaker note</button>
|
|
83
|
+
<input
|
|
84
|
+
type="file"
|
|
85
|
+
id="load-notes-input"
|
|
86
|
+
accept="application/json,.json"
|
|
87
|
+
hidden
|
|
88
|
+
/>
|
|
89
|
+
<div id="notes-action-status" class="notes-action-status" aria-live="polite"></div>
|
|
90
|
+
</div>
|
|
91
|
+
<div class="record-panel">
|
|
92
|
+
<div class="record-header">
|
|
93
|
+
<span class="record-indicator" id="record-indicator" aria-hidden="true"></span>
|
|
94
|
+
<span class="record-label" id="record-label">Audio</span>
|
|
95
|
+
<span class="record-elapsed" id="record-elapsed">00:00</span>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="record-buttons">
|
|
98
|
+
<button type="button" id="record-start" class="btn btn-record">● Start</button>
|
|
99
|
+
<button type="button" id="record-pause" class="btn" disabled>Pause</button>
|
|
100
|
+
<button type="button" id="record-stop" class="btn" disabled>Stop</button>
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
<div class="hints">
|
|
104
|
+
<span>← →</span> nav
|
|
105
|
+
<span>F</span> freeze
|
|
106
|
+
<span>B</span> black
|
|
107
|
+
<span>R</span> reset timer
|
|
108
|
+
</div>
|
|
109
|
+
</section>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div id="record-dialog" class="modal hidden" role="dialog" aria-modal="true" aria-labelledby="record-dialog-title">
|
|
114
|
+
<div class="modal-card">
|
|
115
|
+
<h2 id="record-dialog-title" class="modal-title">Save recording?</h2>
|
|
116
|
+
<dl class="modal-info">
|
|
117
|
+
<dt>File</dt>
|
|
118
|
+
<dd id="record-dialog-file">—</dd>
|
|
119
|
+
<dt>Slides</dt>
|
|
120
|
+
<dd id="record-dialog-range">—</dd>
|
|
121
|
+
<dt>Duration</dt>
|
|
122
|
+
<dd id="record-dialog-duration">—</dd>
|
|
123
|
+
<dt>Size</dt>
|
|
124
|
+
<dd id="record-dialog-size">—</dd>
|
|
125
|
+
<dt>Segments</dt>
|
|
126
|
+
<dd>
|
|
127
|
+
<ul id="record-dialog-segments" class="segment-list"></ul>
|
|
128
|
+
</dd>
|
|
129
|
+
</dl>
|
|
130
|
+
<div id="record-dialog-error" class="modal-error hidden"></div>
|
|
131
|
+
<div class="modal-actions">
|
|
132
|
+
<button type="button" id="record-dialog-abandon" class="btn">Abandon</button>
|
|
133
|
+
<button type="button" id="record-dialog-save" class="btn btn-primary">Save</button>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
<script type="module">
|
|
138
|
+
import { initPresenter } from "/assets/presenter.js";
|
|
139
|
+
initPresenter();
|
|
140
|
+
</script>
|
|
141
|
+
</body>
|
|
142
|
+
</html>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Entry barrel. Both audience.html and presenter.html import from this
|
|
2
|
+
// module via /assets/presenter.js. The actual view logic lives in
|
|
3
|
+
// ./audience.js and ./presenter-main.js respectively, and the shared
|
|
4
|
+
// subsystems live under ./modules/.
|
|
5
|
+
|
|
6
|
+
export { initAudience } from "./audience.js";
|
|
7
|
+
export { initPresenter } from "./presenter-main.js";
|