decaframe 0.1.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.
Files changed (145) hide show
  1. package/LICENSE +32 -0
  2. package/README.md +55 -0
  3. package/dist/archetype.js +1 -0
  4. package/dist/blocks.css +2822 -0
  5. package/dist/blocks.js +6 -0
  6. package/dist/brand.js +1 -0
  7. package/dist/chart.js +3 -0
  8. package/dist/chartView.js +1 -0
  9. package/dist/cli.js +22 -0
  10. package/dist/colour.js +1 -0
  11. package/dist/commands.js +1 -0
  12. package/dist/design.js +1 -0
  13. package/dist/diagram.js +99 -0
  14. package/dist/diagramRender.js +1 -0
  15. package/dist/diagramTheme.js +1 -0
  16. package/dist/diagramView.js +1 -0
  17. package/dist/diagramZoom.js +2 -0
  18. package/dist/export/assets.js +1 -0
  19. package/dist/export/html.js +6 -0
  20. package/dist/export/spec.js +1 -0
  21. package/dist/export/viewer.js +1112 -0
  22. package/dist/extensions.js +1 -0
  23. package/dist/figure.js +1 -0
  24. package/dist/filename.js +1 -0
  25. package/dist/fit.js +6 -0
  26. package/dist/fitLoop.js +1 -0
  27. package/dist/furniture.js +1 -0
  28. package/dist/icons.js +1 -0
  29. package/dist/id.js +1 -0
  30. package/dist/index.js +1 -0
  31. package/dist/item.js +1 -0
  32. package/dist/layout.js +1 -0
  33. package/dist/lint.js +1 -0
  34. package/dist/markdown.js +32 -0
  35. package/dist/mcp/browser.js +81 -0
  36. package/dist/mcp/channel.js +7 -0
  37. package/dist/mcp/export.js +1 -0
  38. package/dist/mcp/exportCli.js +11 -0
  39. package/dist/mcp/fit.js +1 -0
  40. package/dist/mcp/open.js +1 -0
  41. package/dist/mcp/openCli.js +1 -0
  42. package/dist/mcp/read.js +1 -0
  43. package/dist/mcp/server.js +31 -0
  44. package/dist/mcp/session.js +2 -0
  45. package/dist/mcp/stdio.js +2 -0
  46. package/dist/media.js +1 -0
  47. package/dist/notes.js +1 -0
  48. package/dist/page.js +1 -0
  49. package/dist/placeholder.js +1 -0
  50. package/dist/present/constants.js +1 -0
  51. package/dist/prose.js +1 -0
  52. package/dist/registry.js +1 -0
  53. package/dist/sizePreview.js +1 -0
  54. package/dist/slotMarkdown.js +3 -0
  55. package/dist/table.js +2 -0
  56. package/dist/template/catalogue.json +1 -0
  57. package/dist/template/index.js +1 -0
  58. package/dist/template/look.js +1 -0
  59. package/dist/text.js +8 -0
  60. package/dist/theme/atelier.json +1 -0
  61. package/dist/theme/aurora.json +1 -0
  62. package/dist/theme/boardroom.json +1 -0
  63. package/dist/theme/decaframe.json +1 -0
  64. package/dist/theme/editorial.json +1 -0
  65. package/dist/theme/emit.js +19 -0
  66. package/dist/theme/fonts.js +1 -0
  67. package/dist/theme/foundry.json +1 -0
  68. package/dist/theme/index.js +1 -0
  69. package/dist/theme/meadow.json +1 -0
  70. package/dist/theme/signal.json +1 -0
  71. package/dist/theme/tokens.json +1 -0
  72. package/dist/videoPlay.js +1 -0
  73. package/editor/assets/App-BvOGZ4cc.js +56 -0
  74. package/editor/assets/PresenterView-Barr5wsl.js +1 -0
  75. package/editor/assets/Shell-Dvc8Yvly.js +413 -0
  76. package/editor/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  77. package/editor/assets/abnfDiagram-N423BO3Z-DMNuYXhv.js +1 -0
  78. package/editor/assets/arc-DOR9Dhm9.js +1 -0
  79. package/editor/assets/architectureDiagram-T3A2C74G-CpcCHDGw.js +36 -0
  80. package/editor/assets/blockDiagram-VBNYF7ZC-CbCqcHim.js +132 -0
  81. package/editor/assets/c4Diagram-5PPSVZJV-DouVYESX.js +10 -0
  82. package/editor/assets/channel-Dt7MgGxB.js +1 -0
  83. package/editor/assets/chunk-2GRJ4B5K-DCJz-Q3N.js +1 -0
  84. package/editor/assets/chunk-2Q5K7J3B-D5q9RvV7.js +1 -0
  85. package/editor/assets/chunk-5RXB4S5H-DnaXL-Vg.js +231 -0
  86. package/editor/assets/chunk-5VM5RSS4-Dsc890tp.js +15 -0
  87. package/editor/assets/chunk-6Q2QTUOP-B5F620Er.js +88 -0
  88. package/editor/assets/chunk-GF5L2VYU-D6F2cocl.js +206 -0
  89. package/editor/assets/chunk-JWPE2WC7-bRknM2iE.js +1 -0
  90. package/editor/assets/chunk-KBJHAD2P-DOPClpqF.js +1 -0
  91. package/editor/assets/chunk-RYQCIY6F-CvMFFqLU.js +1 -0
  92. package/editor/assets/chunk-XXDRQBXY-1qxA3khf.js +1 -0
  93. package/editor/assets/classDiagram-JCYQIIEL-DCQKoo1F.js +1 -0
  94. package/editor/assets/classDiagram-v2-OCEON4UE-DCQKoo1F.js +1 -0
  95. package/editor/assets/cose-bilkent-JH36ORCC-ClwDXN93.js +1 -0
  96. package/editor/assets/cynefin-VYW2F7L2-D_3oIqit.js +178 -0
  97. package/editor/assets/cynefinDiagram-MW4NZA55-5VKykgH3.js +62 -0
  98. package/editor/assets/cytoscape.esm-BjAbmLdb.js +331 -0
  99. package/editor/assets/dagre-VZM6K2ZE-DcheWwdS.js +4 -0
  100. package/editor/assets/defaultLocale-DX6XiGOO.js +1 -0
  101. package/editor/assets/diagram-7IWD3JNH-BKU8hufg.js +30 -0
  102. package/editor/assets/diagram-B4RE2ZJO-C6NwNXMM.js +3 -0
  103. package/editor/assets/diagram-LBJQPF4R-D5l8kaaB.js +24 -0
  104. package/editor/assets/diagram-Q27KOJAE-B839mp_E.js +24 -0
  105. package/editor/assets/diagram-UB23O5K3-BEJ8nrHN.js +41 -0
  106. package/editor/assets/ebnfDiagram-BXEA7PRR-Clexv7zP.js +1 -0
  107. package/editor/assets/erDiagram-JOGREHBK-CQiS9gcI.js +85 -0
  108. package/editor/assets/flowDiagram-UKHOOZJN-CKnVd1JX.js +156 -0
  109. package/editor/assets/ganttDiagram-PKOTCBZU-B2_YsT7P.js +292 -0
  110. package/editor/assets/gitGraphDiagram-DS77QQ5N-woKMsCpe.js +106 -0
  111. package/editor/assets/graph-C9eacEi8.js +1 -0
  112. package/editor/assets/index-CBRsrwap.css +1 -0
  113. package/editor/assets/index-CnMC8Z9d.js +9167 -0
  114. package/editor/assets/index-CzJ1nSGZ.js +61 -0
  115. package/editor/assets/infoDiagram-6WML65LV-DQBHUzYs.js +2 -0
  116. package/editor/assets/init-Gi6I4Gst.js +1 -0
  117. package/editor/assets/ishikawaDiagram-WSZJBQD7-B0ECJjey.js +70 -0
  118. package/editor/assets/journeyDiagram-NVQOT4AX-C6IoE7ds.js +139 -0
  119. package/editor/assets/kanban-definition-27J2QSJJ-BsRx6-QA.js +89 -0
  120. package/editor/assets/katex-C5jXJg4s.js +257 -0
  121. package/editor/assets/layout-DEXfKzaS.js +1 -0
  122. package/editor/assets/linear-CZdkbpsZ.js +1 -0
  123. package/editor/assets/map-Czzmt4hB.js +1 -0
  124. package/editor/assets/mermaid.core-BD7SxJD7.js +314 -0
  125. package/editor/assets/mindmap-definition-FAOFIHXS-zQTmawZC.js +96 -0
  126. package/editor/assets/ordinal-Cboi1Yqb.js +1 -0
  127. package/editor/assets/pegDiagram-VL7TDLO6-DwfoSDjb.js +1 -0
  128. package/editor/assets/pieDiagram-7S7Q4E2Y-CFju-NFP.js +39 -0
  129. package/editor/assets/quadrantDiagram-CIZ2JOQS-BD6kYPyE.js +7 -0
  130. package/editor/assets/railroadDiagram-AXF67PYL-RqQwm-lL.js +1 -0
  131. package/editor/assets/requirementDiagram-LRYGKXZP-piqHrBVs.js +84 -0
  132. package/editor/assets/sankeyDiagram-W5VNT64P-CiALLT6P.js +40 -0
  133. package/editor/assets/sequenceDiagram-SI44F4Z6-CjpaYPxa.js +162 -0
  134. package/editor/assets/sizeCapture-X5ZJPWSS-DG9i3uEZ.js +1 -0
  135. package/editor/assets/stateDiagram-OKZ733FA-BgfrUiLR.js +1 -0
  136. package/editor/assets/stateDiagram-v2-UEYNNEHI-OBUiw3fk.js +1 -0
  137. package/editor/assets/swimlanes-SLNWSIFB-edAhP15G.js +2 -0
  138. package/editor/assets/swimlanesDiagram-ULZ7WXOC-BvcKTcG0.js +8 -0
  139. package/editor/assets/timeline-definition-Z64GVDOM-CLCag48V.js +120 -0
  140. package/editor/assets/vennDiagram-T6HMQDX7-CNuGpJHG.js +34 -0
  141. package/editor/assets/wardleyDiagram-T6FBY63Y-D-NVpbtn.js +78 -0
  142. package/editor/assets/xychartDiagram-ELKLHX3M-CmO8305Y.js +7 -0
  143. package/editor/favicon.ico +0 -0
  144. package/editor/index.html +15 -0
  145. package/package.json +61 -0
@@ -0,0 +1,1112 @@
1
+ import{PRESENT_IDLE_MS as i,PRESENT_NEXT_KEYS as o,PRESENT_PREV_KEYS as a}from"../present/constants.js";import{DIAGRAM_ZOOM_JS as n}from"../diagramZoom.js";import{FIT_FLOOR as d,FIT_STEP as s}from"../fit.js";const t=JSON.stringify(Object.fromEntries(o.map(e=>[e,1]))),r=JSON.stringify(Object.fromEntries(a.map(e=>[e,1]))),u=`
2
+ html, body { margin: 0; padding: 0; height: 100%; }
3
+
4
+ body {
5
+ --dfx-glass: color-mix(in oklab, oklch(0.885 0.004 228.8) 50%, transparent);
6
+ --dfx-glass-edge: color-mix(in oklab, oklch(0.19 0.004 228.8) 15%, transparent);
7
+ --dfx-glass-hover-edge: color-mix(in oklab, oklch(0.19 0.004 228.8) 38%, transparent);
8
+ --dfx-glass-blur: blur(40px);
9
+ --dfx-glass-sheen: linear-gradient(
10
+ 145deg,
11
+ color-mix(in oklab, white 55%, transparent) 0,
12
+ color-mix(in oklab, white 18%, transparent) 90px,
13
+ transparent 240px
14
+ );
15
+
16
+ --dfx-stage: oklch(0 0 0);
17
+ --dfx-stage-ink: oklch(0.925 0.003 228.8);
18
+
19
+ --dfx-fg: oklch(0.148 0.004 228.8);
20
+ --dfx-muted-fg: oklch(0.46 0.014 228.8);
21
+ --dfx-muted: oklch(0.963 0.002 228.8);
22
+ --dfx-bg: oklch(1 0 0);
23
+ --dfx-border: oklch(0.915 0.004 228.8);
24
+
25
+ --dfx-input: oklch(0.915 0.004 228.8);
26
+
27
+ --dfx-mark: oklch(0.32 0.006 228.8);
28
+
29
+ background: var(--dfx-muted);
30
+ }
31
+ [data-mode='dark'] body {
32
+ --dfx-glass: color-mix(in oklab, oklch(0.19 0.004 228.8) 50%, transparent);
33
+ --dfx-glass-edge: color-mix(in oklab, oklch(0.885 0.004 228.8) 15%, transparent);
34
+ --dfx-glass-hover-edge: color-mix(in oklab, oklch(0.885 0.004 228.8) 38%, transparent);
35
+ --dfx-glass-sheen: linear-gradient(
36
+ 145deg,
37
+ color-mix(in oklab, white 10%, transparent) 0,
38
+ color-mix(in oklab, white 3.5%, transparent) 90px,
39
+ transparent 240px
40
+ );
41
+ --dfx-fg: oklch(0.987 0.002 228.8);
42
+ --dfx-muted-fg: oklch(0.823 0.010 228.8);
43
+ --dfx-muted: oklch(0.275 0.008 228.8);
44
+ --dfx-bg: oklch(0.148 0.004 228.8);
45
+ --dfx-border: oklch(0.345 0.010 228.8);
46
+ --dfx-input: oklch(0.375 0.010 228.8);
47
+ --dfx-mark: oklch(0.93 0.003 214.3);
48
+ }
49
+
50
+ [data-view='present'] body { background: var(--dfx-stage); }
51
+
52
+ .dfx-deck {
53
+ display: flex;
54
+ height: 100svh;
55
+ overflow-x: auto;
56
+ overflow-y: hidden;
57
+ scroll-snap-type: x mandatory;
58
+ scroll-behavior: smooth;
59
+ overscroll-behavior-x: contain;
60
+ scrollbar-width: none;
61
+ }
62
+ .dfx-deck::-webkit-scrollbar { display: none; }
63
+
64
+ .dfx-slide {
65
+ position: relative;
66
+ flex: 0 0 100%;
67
+ width: 100%;
68
+ height: 100%;
69
+ scroll-snap-align: center;
70
+ scroll-snap-stop: always;
71
+ overflow: hidden;
72
+ }
73
+ [data-format='fluid'] .dfx-slide { overflow-y: auto; overscroll-behavior-y: contain; }
74
+
75
+ .dfx-fit {
76
+ position: absolute;
77
+ left: 50%;
78
+ top: 50%;
79
+ transform: translate(-50%, -50%) scale(var(--dfx-fit, 1));
80
+ transform-origin: center center;
81
+ }
82
+
83
+ [data-format='fluid'] .dfx-fit {
84
+ position: static;
85
+ width: max-content;
86
+ transform: translateX(var(--dfx-x, 0px)) scale(var(--dfx-fit, 1));
87
+ transform-origin: top left;
88
+ }
89
+
90
+ .dfx-hud {
91
+ position: fixed;
92
+ right: 16px;
93
+ bottom: 14px;
94
+ z-index: 10;
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 2px;
98
+ padding: 4px;
99
+ border-radius: 999px;
100
+ background: color-mix(in oklab, var(--dfx-stage) 82%, transparent);
101
+ -webkit-backdrop-filter: blur(8px);
102
+ backdrop-filter: blur(8px);
103
+ color: var(--dfx-stage-ink);
104
+ font: 500 12px/1 ui-sans-serif, system-ui, sans-serif;
105
+ letter-spacing: 0.04em;
106
+ font-variant-numeric: tabular-nums;
107
+ pointer-events: none;
108
+ transition: opacity 0.4s;
109
+ }
110
+ .dfx-hud[data-idle='true'] { opacity: 0; }
111
+
112
+ [data-view='browse'] .dfx-hud { display: none; }
113
+
114
+ .dfx-hud-btn {
115
+ display: grid;
116
+ place-items: center;
117
+ width: 28px;
118
+ height: 28px;
119
+ padding: 0;
120
+ border: 0;
121
+ border-radius: 999px;
122
+ background: transparent;
123
+ color: inherit;
124
+ cursor: pointer;
125
+ pointer-events: auto;
126
+ }
127
+ .dfx-hud-btn:hover { background: color-mix(in oklab, white 14%, transparent); }
128
+ .dfx-hud-btn:disabled { opacity: 0.35; cursor: default; }
129
+
130
+ .dfx-hud-more { position: relative; }
131
+ .dfx-hud-more > summary.dfx-hud-btn { list-style: none; }
132
+ .dfx-hud-more > summary::-webkit-details-marker { display: none; }
133
+ .dfx-hud-more .dfx-menu {
134
+ top: auto;
135
+ bottom: calc(100% + 8px);
136
+ background: color-mix(in oklab, var(--dfx-stage) 92%, transparent);
137
+ border-color: color-mix(in oklab, white 15%, transparent);
138
+ color: var(--dfx-stage-ink);
139
+ }
140
+ .dfx-hud-more .dfx-menu-item:hover { background: color-mix(in oklab, white 14%, transparent); }
141
+
142
+ .dfx-hud-at {
143
+ min-width: 34px;
144
+ height: 28px;
145
+ display: grid;
146
+ place-items: center;
147
+ padding: 0 9px;
148
+ border-radius: 999px;
149
+ background: color-mix(in oklab, white 10%, transparent);
150
+ }
151
+
152
+ .dfx-titlebar {
153
+ position: fixed;
154
+ top: 0;
155
+ left: 0;
156
+ right: 0;
157
+
158
+ height: 44px;
159
+ display: flex;
160
+ align-items: center;
161
+ justify-content: space-between;
162
+ gap: 6px;
163
+ padding: 0 10px;
164
+ z-index: 10;
165
+ }
166
+ .dfx-titlebar::before {
167
+ content: '';
168
+ position: absolute;
169
+ left: 0;
170
+ right: 0;
171
+ top: 0;
172
+ bottom: -10px;
173
+ z-index: -1;
174
+ pointer-events: none;
175
+ background: linear-gradient(to bottom, var(--dfx-muted) 0%, var(--dfx-muted) 78%, transparent 100%);
176
+ }
177
+
178
+ .dfx-titlebar-left {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 8px;
182
+ min-width: 0;
183
+ }
184
+
185
+ .dfx-titlebar-right {
186
+ display: flex;
187
+ align-items: center;
188
+ gap: 6px;
189
+ }
190
+
191
+ .dfx-brand {
192
+ flex: 0 0 auto;
193
+ display: grid;
194
+ place-items: center;
195
+ height: 32px;
196
+ color: var(--dfx-fg);
197
+ }
198
+
199
+ .dfx-rail-toggle {
200
+ flex: none;
201
+ display: grid;
202
+ place-items: center;
203
+ width: 26px;
204
+ height: 26px;
205
+ margin-left: -4px;
206
+ padding: 0;
207
+ border: 0;
208
+ border-radius: 8px;
209
+ background: none;
210
+ color: var(--dfx-muted-fg);
211
+ cursor: pointer;
212
+ }
213
+ .dfx-rail-toggle:hover { background: color-mix(in oklab, var(--dfx-fg) 8%, transparent); color: var(--dfx-fg); }
214
+
215
+ .dfx-mode-toggle {
216
+ flex: 0 0 auto;
217
+ display: grid;
218
+ place-items: center;
219
+ width: 34px;
220
+ height: 34px;
221
+ padding: 0;
222
+ border: 1px solid var(--dfx-glass-edge);
223
+ border-radius: 999px;
224
+ background: var(--dfx-glass);
225
+ background-image: var(--dfx-glass-sheen);
226
+ -webkit-backdrop-filter: var(--dfx-glass-blur);
227
+ backdrop-filter: var(--dfx-glass-blur);
228
+ color: var(--dfx-muted-fg);
229
+ cursor: pointer;
230
+ }
231
+ .dfx-mode-toggle:hover { color: var(--dfx-fg); }
232
+
233
+ .dfx-titlebar-title {
234
+ flex: 1 1 auto;
235
+ min-width: 0;
236
+ font: 600 13px/1 ui-sans-serif, system-ui, sans-serif;
237
+ color: var(--dfx-fg);
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ white-space: nowrap;
241
+ }
242
+
243
+ .dfx-split { display: inline-flex; align-items: center; position: relative; }
244
+ .dfx-present-btn {
245
+ flex: 0 0 auto;
246
+ display: inline-flex;
247
+ align-items: center;
248
+ gap: 6px;
249
+ height: 32px;
250
+ padding: 0 14px;
251
+ border-radius: 20px 0 0 20px;
252
+ border: 1px solid var(--dfx-border);
253
+ border-right: none;
254
+ background: var(--dfx-bg);
255
+ color: var(--dfx-fg);
256
+ font: 500 14px/1 ui-sans-serif, system-ui, sans-serif;
257
+ cursor: pointer;
258
+ transition: background-color 0.15s ease, border-color 0.25s ease;
259
+ }
260
+ [data-mode='dark'] .dfx-present-btn { background: transparent; }
261
+ .dfx-present-btn:hover { background: var(--dfx-muted); border-color: var(--dfx-glass-hover-edge); }
262
+ [data-mode='dark'] .dfx-present-btn:hover {
263
+ background: color-mix(in oklab, var(--dfx-input) 30%, transparent);
264
+ }
265
+ .dfx-present-btn svg { flex: none; }
266
+
267
+ .dfx-split-more { position: relative; }
268
+
269
+ .dfx-split-more > summary {
270
+
271
+ box-sizing: border-box;
272
+ list-style: none;
273
+ display: inline-flex;
274
+ align-items: center;
275
+ justify-content: center;
276
+ height: 32px;
277
+ padding-inline: 6px;
278
+ border: 1px solid var(--dfx-border);
279
+ border-radius: 0 20px 20px 0;
280
+ background: var(--dfx-bg);
281
+ color: var(--dfx-fg);
282
+ cursor: pointer;
283
+ transition: background-color 0.15s ease, border-color 0.25s ease;
284
+ }
285
+ [data-mode='dark'] .dfx-split-more > summary { background: transparent; }
286
+ .dfx-split-more > summary::-webkit-details-marker { display: none; }
287
+ .dfx-split-more > summary:hover,
288
+ .dfx-split-more[open] > summary { background: var(--dfx-muted); border-color: var(--dfx-glass-hover-edge); }
289
+ [data-mode='dark'] .dfx-split-more > summary:hover,
290
+ [data-mode='dark'] .dfx-split-more[open] > summary {
291
+ background: color-mix(in oklab, var(--dfx-input) 30%, transparent);
292
+ }
293
+
294
+ .dfx-menu {
295
+ position: absolute;
296
+ top: calc(100% + 6px);
297
+ right: 0;
298
+ min-width: 180px;
299
+ padding: 4px;
300
+ border-radius: 10px;
301
+ border: 1px solid var(--dfx-border);
302
+ background: var(--dfx-glass);
303
+ -webkit-backdrop-filter: var(--dfx-glass-blur);
304
+ backdrop-filter: var(--dfx-glass-blur);
305
+
306
+ color: var(--dfx-fg);
307
+ box-shadow: 0 8px 24px color-mix(in oklab, black 25%, transparent);
308
+
309
+ pointer-events: auto;
310
+ z-index: 20;
311
+ }
312
+ .dfx-menu-item {
313
+ display: block;
314
+ width: 100%;
315
+ padding: 7px 10px;
316
+ border: 0;
317
+ border-radius: 6px;
318
+ background: none;
319
+ color: inherit;
320
+ font: 500 13px/1.3 ui-sans-serif, system-ui, sans-serif;
321
+ text-align: left;
322
+ cursor: pointer;
323
+ }
324
+ .dfx-menu-item:hover { background: color-mix(in oklab, var(--dfx-fg) 8%, transparent); }
325
+
326
+ .dfx-rail {
327
+
328
+ box-sizing: border-box;
329
+ position: fixed;
330
+ top: 50px;
331
+ left: 10px;
332
+ bottom: 14px;
333
+ width: 140px;
334
+ display: flex;
335
+ flex-direction: column;
336
+ border-radius: 16px;
337
+ background-color: var(--dfx-glass);
338
+ background-image: var(--dfx-glass-sheen);
339
+ -webkit-backdrop-filter: var(--dfx-glass-blur);
340
+ backdrop-filter: var(--dfx-glass-blur);
341
+ border: 1px solid var(--dfx-glass-edge);
342
+
343
+ overflow: hidden;
344
+ font-family: ui-sans-serif, system-ui, sans-serif;
345
+ z-index: 9;
346
+ }
347
+
348
+ .dfx-rail-head {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 8px;
352
+ padding: 13px 14px;
353
+ border-bottom: 1px solid var(--dfx-border);
354
+ font-family: ui-monospace, monospace;
355
+ font-size: 10.5px;
356
+ letter-spacing: 0.12em;
357
+ text-transform: uppercase;
358
+ color: var(--dfx-muted-fg);
359
+ }
360
+ .dfx-count { margin-left: auto; color: var(--dfx-muted-fg); }
361
+
362
+ .dfx-rail-list {
363
+ flex: 1;
364
+ min-height: 0;
365
+ overflow-y: auto;
366
+ padding: 8px;
367
+ }
368
+ .dfx-rail-list::-webkit-scrollbar { width: 0; }
369
+
370
+ .dfx-rail-item {
371
+ box-sizing: border-box;
372
+ position: relative;
373
+ display: block;
374
+ width: 100%;
375
+ padding: 4px;
376
+ border: 1px solid transparent;
377
+ border-radius: 9px;
378
+ background: none;
379
+ font: inherit;
380
+ text-align: left;
381
+ color: var(--dfx-muted-fg);
382
+ cursor: pointer;
383
+ }
384
+ .dfx-rail-item:focus-visible {
385
+ outline: none;
386
+ border-color: color-mix(in oklab, var(--dfx-mark) 55%, transparent);
387
+ }
388
+
389
+ .dfx-thumb {
390
+
391
+ position: relative;
392
+ box-sizing: content-box;
393
+ display: block;
394
+ width: 110px;
395
+
396
+ aspect-ratio: 16 / 9;
397
+ overflow: hidden;
398
+ border-radius: 5px;
399
+ border: 1px solid var(--dfx-border);
400
+ background: var(--dfx-bg);
401
+ pointer-events: none;
402
+ }
403
+ .dfx-rail-item:hover .dfx-thumb { border-color: color-mix(in oklab, var(--dfx-muted-fg) 75%, transparent); }
404
+ .dfx-rail-item[data-current='true'] .dfx-thumb {
405
+ border-color: var(--dfx-mark);
406
+ box-shadow: 0 0 0 1px var(--dfx-mark);
407
+ }
408
+
409
+ .dfx-rail-num {
410
+ position: absolute;
411
+ top: 8px;
412
+ right: 8px;
413
+ padding: 1px 5px;
414
+ border-radius: 4px;
415
+ background: var(--dfx-muted);
416
+ font-family: ui-monospace, monospace;
417
+ font-size: 9px;
418
+ letter-spacing: 0.06em;
419
+ line-height: 1.5;
420
+ color: var(--dfx-muted-fg);
421
+ }
422
+ .dfx-rail-item[data-current='true'] .dfx-rail-num { color: var(--dfx-mark); }
423
+
424
+ .dfx-rail-foot {
425
+ display: flex;
426
+ justify-content: center;
427
+ padding: 10px 14px 12px;
428
+ border-top: 1px solid var(--dfx-border);
429
+ color: var(--dfx-muted-fg);
430
+ }
431
+
432
+ .dfx-rail-show {
433
+ position: fixed;
434
+ left: 16px;
435
+ top: 59px;
436
+ z-index: 9;
437
+ display: none;
438
+ place-items: center;
439
+ width: 36px;
440
+ height: 36px;
441
+ padding: 0;
442
+ border-radius: 11px;
443
+ background-color: var(--dfx-glass);
444
+ background-image: var(--dfx-glass-sheen);
445
+ -webkit-backdrop-filter: var(--dfx-glass-blur);
446
+ backdrop-filter: var(--dfx-glass-blur);
447
+ border: 1px solid var(--dfx-glass-edge);
448
+ color: var(--dfx-muted-fg);
449
+ cursor: pointer;
450
+ }
451
+ .dfx-rail-show:hover { color: var(--dfx-fg); }
452
+
453
+ [data-view='present'] .dfx-titlebar,
454
+ [data-view='present'] .dfx-rail {
455
+ display: none;
456
+ }
457
+ [data-view='browse'] .dfx-deck {
458
+ position: absolute;
459
+ top: calc(44px + 30px);
460
+ left: 150px;
461
+ right: 0;
462
+ bottom: 90px;
463
+ height: auto;
464
+ }
465
+
466
+ [data-rail-collapsed='true'] .dfx-rail { display: none; }
467
+ [data-rail-collapsed='true'][data-view='browse'] .dfx-deck { left: 0; }
468
+ [data-rail-collapsed='true'][data-view='browse'] .dfx-rail-show { display: grid; }
469
+
470
+ .dfx-presenter { display: none; }
471
+ [data-role='presenter'] .dfx-titlebar,
472
+ [data-role='presenter'] .dfx-rail,
473
+ [data-role='presenter'] .dfx-deck,
474
+ [data-role='presenter'] .dfx-hud {
475
+ display: none;
476
+ }
477
+
478
+ [data-role='presenter'] body { background: var(--dfx-bg); }
479
+ [data-role='presenter'] .dfx-presenter {
480
+ display: flex;
481
+ flex-direction: column;
482
+ height: 100svh;
483
+ color: var(--dfx-fg);
484
+ font: 500 13px/1.4 ui-sans-serif, system-ui, sans-serif;
485
+ }
486
+
487
+ .dfx-presenter-head {
488
+ display: flex;
489
+ align-items: center;
490
+ gap: 8px;
491
+ padding: 10px 16px;
492
+ border-bottom: 1px solid var(--dfx-border);
493
+ }
494
+ .dfx-presenter-timer { font-variant-numeric: tabular-nums; font-weight: 600; }
495
+ .dfx-presenter-timer-btn {
496
+ display: grid;
497
+ place-items: center;
498
+ width: 24px;
499
+ height: 24px;
500
+ padding: 0;
501
+ border: 0;
502
+ border-radius: 999px;
503
+ background: transparent;
504
+ color: var(--dfx-muted-fg);
505
+ cursor: pointer;
506
+ }
507
+ .dfx-presenter-timer-btn:hover { color: var(--dfx-fg); background: color-mix(in oklab, var(--dfx-fg) 8%, transparent); }
508
+ .dfx-presenter-count { margin-inline-start: auto; color: var(--dfx-muted-fg); }
509
+
510
+ .dfx-presenter-body {
511
+ flex: 1;
512
+ min-height: 0;
513
+ display: grid;
514
+ grid-template-columns: minmax(320px, 480px) 1fr;
515
+ grid-template-rows: auto auto;
516
+ gap: 8px 16px;
517
+ padding: 16px;
518
+ }
519
+ .dfx-presenter-current {
520
+ grid-column: 1;
521
+ grid-row: 1;
522
+ position: relative;
523
+
524
+ aspect-ratio: 16 / 9;
525
+ border-radius: 8px;
526
+ overflow: hidden;
527
+
528
+ border: 1px solid var(--dfx-border);
529
+ background: var(--dfx-bg);
530
+ box-shadow: 0 8px 24px color-mix(in oklab, black 25%, transparent);
531
+ }
532
+ .dfx-presenter-adjacent { grid-column: 1; grid-row: 2; display: flex; gap: 8px; align-self: start; }
533
+ .dfx-presenter-thumb {
534
+ display: flex;
535
+ flex-direction: column;
536
+ align-items: center;
537
+ gap: 6px;
538
+ flex: 1;
539
+ border: 0;
540
+ border-radius: 8px;
541
+ background: none;
542
+ cursor: pointer;
543
+ padding: 6px;
544
+ }
545
+ .dfx-presenter-thumb:hover:not(:disabled) { background: color-mix(in oklab, var(--dfx-fg) 5%, transparent); }
546
+ .dfx-presenter-thumb:disabled { cursor: default; }
547
+ .dfx-presenter-thumb:disabled .dfx-presenter-thumb-label { opacity: 0.35; }
548
+ .dfx-presenter-thumb-pic {
549
+ position: relative;
550
+ display: block;
551
+ width: 100%;
552
+ aspect-ratio: 16 / 9;
553
+ border-radius: 6px;
554
+ overflow: hidden;
555
+ border: 1px solid var(--dfx-border);
556
+ background: var(--dfx-bg);
557
+ }
558
+ .dfx-presenter-thumb-label {
559
+ font-size: 12px;
560
+ font-weight: 500;
561
+ color: var(--dfx-muted-fg);
562
+ }
563
+
564
+ .dfx-presenter-notes {
565
+ grid-column: 2;
566
+ grid-row: 1 / 3;
567
+ display: flex;
568
+ flex-direction: column;
569
+ min-height: 0;
570
+ }
571
+ .dfx-presenter-notes-label {
572
+ margin: 0 0 8px;
573
+ font-weight: 600;
574
+ color: var(--dfx-muted-fg);
575
+ text-transform: uppercase;
576
+ letter-spacing: 0.04em;
577
+ font-size: 11px;
578
+ }
579
+
580
+ .dfx-presenter-notes-body { flex: 1; overflow-y: auto; white-space: pre-wrap; line-height: 1.6; }
581
+ .dfx-presenter-notes-body[data-empty='true'] { color: var(--dfx-muted-fg); font-style: italic; }
582
+
583
+ [class^='dfx-']:focus-visible, [class*=' dfx-']:focus-visible {
584
+ outline: 2px solid var(--dfx-mark);
585
+ outline-offset: 2px;
586
+ }
587
+
588
+ .dfx-embed {
589
+ position: absolute;
590
+ inset: 0;
591
+ z-index: 3;
592
+ inline-size: 100%;
593
+ block-size: 100%;
594
+ border: 0;
595
+ }
596
+
597
+ .dfx-embed:not([src]) { display: none; }
598
+
599
+ .dfx-missing {
600
+ position: absolute;
601
+ inset: auto 0 0 0;
602
+ z-index: 2;
603
+ display: flex;
604
+ flex-direction: column;
605
+ gap: 2px;
606
+ padding: 8px 10px;
607
+ background: rgba(17, 18, 20, 0.72);
608
+ color: #fff;
609
+ font: 500 11px/1.35 ui-sans-serif, system-ui, sans-serif;
610
+ text-align: start;
611
+ }
612
+ .dfx-missing-label { font-weight: 600; letter-spacing: 0.02em; }
613
+ .dfx-missing-why { font-weight: 400; opacity: 0.82; }
614
+ @container (max-width: 260px) { .dfx-missing-why { display: none; } }
615
+
616
+ @media (prefers-reduced-motion: reduce) { .dfx-deck { scroll-behavior: auto; } }
617
+ `,p=`
618
+ (function () {
619
+ var slides = Array.prototype.slice.call(document.querySelectorAll('.dfx-slide'))
620
+ var notesEl = document.getElementById('dfx-notes')
621
+ var notesData = []
622
+ try { notesData = notesEl ? JSON.parse(notesEl.textContent) : [] } catch (e) { notesData = [] }
623
+
624
+
625
+ function pictureFailed(el) {
626
+ if (!el || el.tagName !== 'IMG' || el.className.indexOf('media-img') < 0) return
627
+ if (el.getAttribute('src') === 'data:,') return
628
+ el.setAttribute('src', 'data:,')
629
+ }
630
+ document.addEventListener('error', function (e) { pictureFailed(e.target) }, true)
631
+
632
+
633
+ Array.prototype.forEach.call(document.querySelectorAll('img.media-img'), function (el) {
634
+ if (el.complete && el.naturalWidth === 0) pictureFailed(el)
635
+ })
636
+
637
+
638
+ if (location.protocol !== 'file:') {
639
+ var embeds = document.querySelectorAll('iframe.dfx-embed[data-src]')
640
+ for (var e = 0; e < embeds.length; e++) embeds[e].src = embeds[e].getAttribute('data-src')
641
+ }
642
+
643
+
644
+ function frameHeightPx(ratio, w, h) {
645
+ var parts = ratio.split('/')
646
+ var rw = parseFloat(parts[0])
647
+ var rh = parseFloat(parts[1])
648
+ if (!rw || !rh || !isFinite(rw) || !isFinite(rh)) return h
649
+ return (w * rh) / rw
650
+ }
651
+
652
+
653
+ function sizeThumb(el, targetWidth, source) {
654
+ var ratio = getComputedStyle(source).aspectRatio
655
+ var scale = targetWidth / source.offsetWidth
656
+ el.style.height = (frameHeightPx(ratio, source.offsetWidth, source.offsetHeight) * scale) + 'px'
657
+ }
658
+
659
+
660
+ function fitThumb(thumb, clone) {
661
+ var w = thumb.clientWidth / clone.offsetWidth
662
+ var h = thumb.clientHeight / clone.offsetHeight
663
+ clone.style.transform = 'scale(' + Math.min(w, h) + ')'
664
+ }
665
+
666
+
667
+ function cloneSlide(i) {
668
+ var clone = slides[i].firstElementChild.cloneNode(true)
669
+ clone.style.position = 'absolute'
670
+ clone.style.top = '0'
671
+ clone.style.left = '0'
672
+ clone.style.transformOrigin = 'top left'
673
+ clone.style.counterReset = 'dfx-page ' + i
674
+ return clone
675
+ }
676
+
677
+
678
+ ${n}
679
+
680
+
681
+ function zoomDiagrams() {
682
+ try {
683
+ var figures = document.querySelectorAll('.dfx-deck .blk-diagram')
684
+ for (var i = 0; i < figures.length; i++) {
685
+ var drawing = figures[i].querySelector('.diagram-drawing')
686
+
687
+ if (!drawing || !drawing.querySelector('svg')) continue
688
+ var stored = parseFloat(figures[i].getAttribute('data-zoom'))
689
+
690
+ attachZoom(drawing, figures[i], { initial: stored > 0 && isFinite(stored) ? stored : 1 })
691
+ }
692
+ } catch (e) {
693
+
694
+ }
695
+ }
696
+
697
+ if (new URLSearchParams(location.search).get('view') === 'presenter') initPresenter()
698
+ else initDeck()
699
+
700
+ function initDeck() {
701
+ var deck = document.querySelector('.dfx-deck')
702
+ var hud = document.querySelector('.dfx-hud')
703
+ var at = document.querySelector('.dfx-at')
704
+ var fluid = document.documentElement.dataset.format === 'fluid'
705
+ var idle
706
+
707
+
708
+
709
+ function fit() {
710
+ if (fluid && slides.length) {
711
+ var b0 = slides[0].firstElementChild
712
+ var k0 = Math.min(1, slides[0].clientWidth / b0.offsetWidth)
713
+ document.documentElement.style.setProperty('--fluid-floor', (slides[0].clientHeight / k0) + 'px')
714
+ }
715
+ for (var i = 0; i < slides.length; i++) {
716
+ var box = slides[i].firstElementChild
717
+ var w = slides[i].clientWidth / box.offsetWidth
718
+ var k = fluid ? Math.min(1, w) : Math.min(w, slides[i].clientHeight / box.offsetHeight)
719
+ box.style.setProperty('--dfx-fit', k)
720
+ if (fluid) {
721
+
722
+ box.style.setProperty('--dfx-x', Math.max(0, (slides[i].clientWidth - box.offsetWidth * k) / 2) + 'px')
723
+ box.style.marginBottom = -box.offsetHeight * (1 - k) + 'px'
724
+ }
725
+ }
726
+ }
727
+
728
+
729
+ var cur = 0
730
+ function index() { return Math.round(deck.scrollLeft / deck.clientWidth) }
731
+
732
+ var root = document.documentElement
733
+ var rail = document.querySelector('.dfx-rail-list')
734
+ var presentBtn = document.querySelector('.dfx-present-btn')
735
+ var railToggle = document.querySelector('.dfx-rail-toggle')
736
+ var railShow = document.querySelector('.dfx-rail-show')
737
+ var modeToggle = document.querySelector('.dfx-mode-toggle')
738
+ var presenterWin = null
739
+
740
+
741
+ function setView(mode) {
742
+ root.dataset.view = mode
743
+ fit()
744
+ markCurrent()
745
+ }
746
+
747
+ function markCurrent() {
748
+
749
+ for (var s = 0; s < slides.length; s++) slides[s].dataset.current = String(s === cur)
750
+ if (!rail) return
751
+ var items = rail.querySelectorAll('.dfx-rail-item')
752
+ for (var i = 0; i < items.length; i++) {
753
+ items[i].dataset.current = String(i === cur)
754
+ items[i].setAttribute('aria-selected', String(i === cur))
755
+ }
756
+ }
757
+
758
+
759
+ function buildRail() {
760
+ if (!rail) return
761
+ for (var i = 0; i < slides.length; i++) {
762
+
763
+ var item = document.createElement('button')
764
+ item.type = 'button'
765
+ item.className = 'dfx-rail-item'
766
+ item.setAttribute('role', 'option')
767
+ item.setAttribute('aria-label', 'Page ' + (i + 1))
768
+ var thumb = document.createElement('span')
769
+ thumb.className = 'dfx-thumb'
770
+ var source = slides[i].firstElementChild
771
+ var clone = cloneSlide(i)
772
+ thumb.appendChild(clone)
773
+ item.appendChild(thumb)
774
+ var num = document.createElement('span')
775
+ num.className = 'dfx-rail-num'
776
+ num.textContent = (i + 1 < 10 ? '0' : '') + (i + 1)
777
+ item.appendChild(num)
778
+ ;(function (i2) {
779
+ item.addEventListener('click', function () { go(i2) })
780
+ })(i)
781
+ rail.appendChild(item)
782
+ sizeThumb(thumb, thumb.clientWidth, source)
783
+ fitThumb(thumb, clone)
784
+ }
785
+ markCurrent()
786
+ }
787
+
788
+ if (presentBtn) {
789
+ presentBtn.addEventListener('click', function () {
790
+ setView('present')
791
+
792
+ if (document.documentElement.requestFullscreen) {
793
+ var req = document.documentElement.requestFullscreen()
794
+ if (req && req.catch) req.catch(function () {})
795
+ }
796
+ })
797
+ }
798
+
799
+
800
+ var RAIL_AUTO_COLLAPSE = 700
801
+ var userSetRail = false
802
+ function autoRail() {
803
+ if (userSetRail) return
804
+ root.dataset.railCollapsed = innerWidth < RAIL_AUTO_COLLAPSE ? 'true' : 'false'
805
+ }
806
+
807
+
808
+ function toggleRail() {
809
+ userSetRail = true
810
+ root.dataset.railCollapsed = root.dataset.railCollapsed === 'true' ? 'false' : 'true'
811
+ fit()
812
+ }
813
+ if (railToggle) railToggle.addEventListener('click', toggleRail)
814
+ if (railShow) railShow.addEventListener('click', toggleRail)
815
+
816
+
817
+ var MOON_SVG = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" ' +
818
+ 'stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' +
819
+ '<path d="M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z"/></svg>'
820
+ var SUN_SVG = '<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" ' +
821
+ 'stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' +
822
+ '<circle cx="12" cy="12" r="4"/><path d="M12 2v2"/><path d="M12 20v2"/>' +
823
+ '<path d="m4.93 4.93 1.41 1.41"/><path d="m17.66 17.66 1.41 1.41"/><path d="M2 12h2"/>' +
824
+ '<path d="M20 12h2"/><path d="m6.34 17.66-1.41 1.41"/><path d="m19.07 4.93-1.41 1.41"/></svg>'
825
+ if (modeToggle) {
826
+ modeToggle.addEventListener('click', function (e) {
827
+
828
+ e.stopPropagation()
829
+ var next = root.dataset.mode === 'dark' ? 'light' : 'dark'
830
+ root.dataset.mode = next
831
+ modeToggle.innerHTML = next === 'dark' ? SUN_SVG : MOON_SVG
832
+ modeToggle.setAttribute('aria-label', 'Switch to ' + (next === 'dark' ? 'light' : 'dark') + ' theme')
833
+ })
834
+ }
835
+
836
+
837
+ function openPresenter() {
838
+ if (presenterWin && !presenterWin.closed) { presenterWin.focus(); return }
839
+ var url = location.href.split('#')[0].split('?')[0] + '?view=presenter&at=' + cur
840
+ presenterWin = window.open(url, 'dfx-presenter', 'width=1100,height=700')
841
+ }
842
+
843
+ var hudButtons = document.querySelectorAll('.dfx-hud-btn:not(summary)')
844
+ for (var hi = 0; hi < hudButtons.length; hi++) {
845
+ hudButtons[hi].addEventListener('click', function (e) {
846
+ var action = e.currentTarget.getAttribute('data-action')
847
+ if (action === 'prev') go(cur - 1)
848
+ else if (action === 'next') go(cur + 1)
849
+ })
850
+ }
851
+
852
+
853
+ var splitMore = document.querySelector('.dfx-split-more')
854
+ var hudMore = document.querySelector('.dfx-hud-more')
855
+ ;[splitMore, hudMore].forEach(function (details) {
856
+ if (!details) return
857
+ details.querySelectorAll('.dfx-menu-item').forEach(function (item) {
858
+ item.addEventListener('click', function () {
859
+ details.open = false
860
+ var action = item.getAttribute('data-action')
861
+ if (action === 'presenter-view') { setView('present'); openPresenter() }
862
+ else if (action === 'start-over') go(0)
863
+ else if (action === 'exit') exitPresenting()
864
+ })
865
+ })
866
+ })
867
+
868
+ addEventListener('click', function (e) {
869
+ ;[splitMore, hudMore].forEach(function (details) {
870
+ if (details && details.open && !details.contains(e.target)) details.open = false
871
+ })
872
+ })
873
+
874
+ function updateHudButtons() {
875
+ var prevBtn = document.querySelector('.dfx-hud-btn[data-action="prev"]')
876
+ var nextBtn = document.querySelector('.dfx-hud-btn[data-action="next"]')
877
+ if (prevBtn) prevBtn.disabled = cur === 0
878
+ if (nextBtn) nextBtn.disabled = cur === slides.length - 1
879
+ }
880
+
881
+
882
+ document.addEventListener('fullscreenchange', function () {
883
+ if (!document.fullscreenElement && root.dataset.view === 'present') setView('browse')
884
+ })
885
+
886
+
887
+ function exitPresenting() {
888
+ if (document.fullscreenElement) {
889
+ var ext = document.exitFullscreen()
890
+ if (ext && ext.catch) ext.catch(function () {})
891
+ } else {
892
+ setView('browse')
893
+ }
894
+ }
895
+
896
+ function wake() {
897
+ hud.dataset.idle = 'false'
898
+ clearTimeout(idle)
899
+ idle = setTimeout(function () { hud.dataset.idle = 'true' }, ${i})
900
+ }
901
+
902
+
903
+ function show(n) {
904
+ at.textContent = String(n + 1)
905
+ markCurrent()
906
+ updateHudButtons()
907
+ if (presenterWin && !presenterWin.closed) presenterWin.postMessage({ at: n }, '*')
908
+ try { history.replaceState(null, '', '#' + (n + 1)) } catch (e) { }
909
+ }
910
+
911
+
912
+ function go(i) {
913
+ cur = Math.max(0, Math.min(slides.length - 1, i))
914
+ deck.scrollTo({ left: cur * deck.clientWidth })
915
+ show(cur)
916
+ }
917
+
918
+
919
+ addEventListener('message', function (e) {
920
+ if (e.source !== presenterWin) return
921
+ var msg = e.data || {}
922
+ if (typeof msg.go === 'number') go(msg.go)
923
+ })
924
+
925
+ var NEXT = ${t}
926
+ var PREV = ${r}
927
+
928
+ addEventListener('keydown', function (e) {
929
+ if (e.metaKey || e.ctrlKey || e.altKey) return
930
+ if (e.key === 'Escape' && ((splitMore && splitMore.open) || (hudMore && hudMore.open))) {
931
+ if (splitMore) splitMore.open = false
932
+ if (hudMore) hudMore.open = false
933
+ e.preventDefault()
934
+ return
935
+ }
936
+ if (NEXT[e.key]) { go(cur + 1); e.preventDefault() }
937
+ else if (PREV[e.key]) { go(cur - 1); e.preventDefault() }
938
+
939
+ else if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
940
+ var s = slides[cur]
941
+ if (fluid && s.scrollHeight > s.clientHeight + 1) {
942
+ s.scrollTop += e.key === 'ArrowDown' ? 80 : -80
943
+ wake()
944
+ }
945
+ e.preventDefault()
946
+ }
947
+ else if (e.key === 'Home') { go(0); e.preventDefault() }
948
+ else if (e.key === 'End') { go(slides.length - 1); e.preventDefault() }
949
+ else if (e.key === 'f') {
950
+ var toggle = document.fullscreenElement ? document.exitFullscreen() : document.documentElement.requestFullscreen()
951
+ if (toggle && toggle.catch) toggle.catch(function () {})
952
+ }
953
+ else if (e.key === 'Escape' && root.dataset.view === 'present' && !document.fullscreenElement) {
954
+ setView('browse')
955
+ }
956
+ })
957
+
958
+
959
+ addEventListener('click', function (e) {
960
+ if (e.target.closest('a')) return
961
+ if (e.target.closest('.dfx-titlebar, .dfx-rail, .dfx-rail-show, .dfx-hud, .dfx-presenter')) return
962
+ if (String(getSelection())) return
963
+ go(cur + 1)
964
+ })
965
+
966
+
967
+ deck.addEventListener('scroll', function () {
968
+ clearTimeout(deck._t)
969
+ deck._t = setTimeout(function () { cur = index(); show(cur) }, 90)
970
+ })
971
+ addEventListener('resize', function () { autoRail(); fit() })
972
+
973
+
974
+ var NEAR = { x: 260, y: 170 }
975
+ addEventListener('mousemove', function (e) {
976
+ if (e.clientX > innerWidth - NEAR.x && e.clientY > innerHeight - NEAR.y) wake()
977
+ })
978
+
979
+ autoRail()
980
+ fit()
981
+ buildRail()
982
+
983
+ zoomDiagrams()
984
+ updateHudButtons()
985
+
986
+ if (document.fonts && document.fonts.ready) document.fonts.ready.then(fit)
987
+
988
+
989
+ function autoFitPages() {
990
+ if (document.documentElement.getAttribute('data-autofit') === 'off') return
991
+ var found = readScale(deck, ${d}, ${s})
992
+ for (var i = 0; i < found.length; i++) {
993
+ if (found[i].scale >= 1) continue
994
+ var el = deck.querySelector('.page[data-id="' + found[i].id + '"]')
995
+ if (el) el.style.setProperty('--fit', String(found[i].scale))
996
+ }
997
+ }
998
+ if (document.fonts && document.fonts.ready) document.fonts.ready.then(autoFitPages)
999
+
1000
+
1001
+ hud.dataset.idle = 'true'
1002
+
1003
+ var start = parseInt(location.hash.slice(1), 10)
1004
+ if (start > 1) { deck.style.scrollBehavior = 'auto'; go(start - 1); deck.style.scrollBehavior = '' }
1005
+ else show(cur)
1006
+ }
1007
+
1008
+
1009
+ function initPresenter() {
1010
+ document.documentElement.dataset.role = 'presenter'
1011
+ var params = new URLSearchParams(location.search)
1012
+ var startAt = parseInt(params.get('at'), 10)
1013
+ var at = Number.isInteger(startAt) && startAt >= 0 && startAt < slides.length ? startAt : 0
1014
+ var seconds = 0
1015
+ var paused = false
1016
+ var NEXT_MAP_ = ${t}
1017
+ var PREV_MAP_ = ${r}
1018
+
1019
+ var timerEl = document.querySelector('.dfx-presenter-timer')
1020
+ var countEl = document.querySelector('.dfx-presenter-count')
1021
+ var currentEl = document.querySelector('.dfx-presenter-current')
1022
+ var notesBody = document.querySelector('.dfx-presenter-notes-body')
1023
+ var thumbs = document.querySelectorAll('.dfx-presenter-thumb')
1024
+ var pauseBtn = document.querySelector('.dfx-presenter-timer-btn[data-action="pause"]')
1025
+ var resetBtn = document.querySelector('.dfx-presenter-timer-btn[data-action="reset"]')
1026
+
1027
+ function render() {
1028
+ countEl.textContent = 'Slide ' + (at + 1) + ' of ' + slides.length
1029
+
1030
+ currentEl.innerHTML = ''
1031
+ var clone = cloneSlide(at)
1032
+ currentEl.appendChild(clone)
1033
+ sizeThumb(currentEl, currentEl.clientWidth, slides[at].firstElementChild)
1034
+ fitThumb(currentEl, clone)
1035
+
1036
+ var note = notesData[at]
1037
+ notesBody.textContent = note || 'No notes for this page.'
1038
+ notesBody.dataset.empty = note ? 'false' : 'true'
1039
+
1040
+ for (var i = 0; i < thumbs.length; i++) {
1041
+ var dir = thumbs[i].getAttribute('data-action') === 'prev' ? -1 : 1
1042
+ var target = at + dir
1043
+ var pic = thumbs[i].querySelector('.dfx-presenter-thumb-pic')
1044
+ pic.innerHTML = ''
1045
+ thumbs[i].disabled = !slides[target]
1046
+ if (slides[target]) {
1047
+ var thumbClone = cloneSlide(target)
1048
+ pic.appendChild(thumbClone)
1049
+ sizeThumb(pic, pic.clientWidth, slides[target].firstElementChild)
1050
+ fitThumb(pic, thumbClone)
1051
+ }
1052
+ }
1053
+ }
1054
+
1055
+
1056
+ function go(n) {
1057
+ at = Math.max(0, Math.min(slides.length - 1, n))
1058
+ render()
1059
+ if (window.opener && !window.opener.closed) window.opener.postMessage({ go: at }, '*')
1060
+ }
1061
+
1062
+ for (var ti = 0; ti < thumbs.length; ti++) {
1063
+ thumbs[ti].addEventListener('click', function (e) {
1064
+ go(at + (e.currentTarget.getAttribute('data-action') === 'prev' ? -1 : 1))
1065
+ })
1066
+ }
1067
+
1068
+ addEventListener('message', function (e) {
1069
+ if (e.source !== window.opener) return
1070
+ var msg = e.data || {}
1071
+ if (typeof msg.at === 'number') { at = msg.at; render() }
1072
+ })
1073
+
1074
+ addEventListener('keydown', function (e) {
1075
+ if (e.metaKey || e.ctrlKey || e.altKey) return
1076
+ if (NEXT_MAP_[e.key]) { go(at + 1); e.preventDefault() }
1077
+ else if (PREV_MAP_[e.key]) { go(at - 1); e.preventDefault() }
1078
+ })
1079
+
1080
+ function renderTimer() {
1081
+ var mm = String(Math.floor(seconds / 60)).padStart(2, '0')
1082
+ var ss = String(seconds % 60).padStart(2, '0')
1083
+ timerEl.textContent = mm + ':' + ss
1084
+ }
1085
+
1086
+
1087
+ var PAUSE_SVG = '<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" ' +
1088
+ 'stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' +
1089
+ '<rect x="14" y="3" width="5" height="18" rx="1"/><rect x="5" y="3" width="5" height="18" rx="1"/></svg>'
1090
+ var PLAY_SVG = '<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" ' +
1091
+ 'stroke-width="2" stroke-linecap="round" stroke-linejoin="round">' +
1092
+ '<polygon points="6 3 20 12 6 21 6 3"/></svg>'
1093
+ if (pauseBtn) {
1094
+ pauseBtn.addEventListener('click', function () {
1095
+ paused = !paused
1096
+ pauseBtn.setAttribute('aria-label', paused ? 'Resume timer' : 'Pause timer')
1097
+ pauseBtn.innerHTML = paused ? PLAY_SVG : PAUSE_SVG
1098
+ })
1099
+ }
1100
+
1101
+ if (resetBtn) resetBtn.addEventListener('click', function () { seconds = 0; renderTimer() })
1102
+
1103
+ setInterval(function () {
1104
+ if (paused) return
1105
+ seconds++
1106
+ renderTimer()
1107
+ }, 1000)
1108
+
1109
+ render()
1110
+ }
1111
+ })()
1112
+ `;export{u as VIEWER_CSS,p as VIEWER_JS};