pptx-vanilla-viewer 0.5.1 → 0.7.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.
@@ -0,0 +1,1296 @@
1
+ .pptxv {
2
+ --pptx-background: #030712;
3
+ --pptx-foreground: #f3f4f6;
4
+ --pptx-card: #111827;
5
+ --pptx-card-foreground: #f3f4f6;
6
+ --pptx-popover: #111827;
7
+ --pptx-popover-foreground: #f3f4f6;
8
+ --pptx-primary: #6366f1;
9
+ --pptx-primary-foreground: #ffffff;
10
+ --pptx-secondary: #1f2937;
11
+ --pptx-secondary-foreground: #f3f4f6;
12
+ --pptx-muted: #1f2937;
13
+ --pptx-muted-foreground: #9ca3af;
14
+ --pptx-accent: #1f2937;
15
+ --pptx-accent-foreground: #f3f4f6;
16
+ --pptx-destructive: #ef4444;
17
+ --pptx-destructive-foreground: #ffffff;
18
+ --pptx-border: #374151;
19
+ --pptx-input: #374151;
20
+ --pptx-ring: #6366f1;
21
+ --pptx-radius: 0.5rem;
22
+ }
23
+
24
+ .pptxv {
25
+ position: relative;
26
+ display: flex;
27
+ flex-direction: column;
28
+ width: 100%;
29
+ height: 100%;
30
+ min-height: 0;
31
+ overflow: hidden;
32
+ background: var(--pptx-background);
33
+ color: var(--pptx-foreground);
34
+ font-family: system-ui, -apple-system, 'Segoe UI', sans-serif;
35
+ font-size: 14px;
36
+ }
37
+ .pptxv *, .pptxv *::before, .pptxv *::after { box-sizing: border-box; }
38
+ .pptxv:focus { outline: none; }
39
+ .pptxv:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -2px; }
40
+
41
+ /* Ribbon shell layout (primary row + nav row + tab bar + groups) lives in
42
+ * ribbon-css.ts; .pptxv-btn below is the shared icon-button primitive used by
43
+ * both the ribbon and the inspector. */
44
+ .pptxv-btn {
45
+ display: inline-flex;
46
+ align-items: center;
47
+ justify-content: center;
48
+ width: 28px;
49
+ height: 28px;
50
+ padding: 0;
51
+ border: none;
52
+ border-radius: var(--pptx-radius);
53
+ background: transparent;
54
+ color: inherit;
55
+ cursor: pointer;
56
+ }
57
+ .pptxv-btn:hover:not(:disabled) { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
58
+ .pptxv-btn:disabled { opacity: 0.4; cursor: default; }
59
+ .pptxv-btn.is-active { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
60
+ .pptxv-btn:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
61
+ .pptxv-btn svg { width: 16px; height: 16px; display: block; }
62
+ .pptxv-counter, .pptxv-zoom-label {
63
+ padding: 0 8px;
64
+ color: var(--pptx-muted-foreground);
65
+ white-space: nowrap;
66
+ font-variant-numeric: tabular-nums;
67
+ }
68
+ .pptxv-autosave-status {
69
+ padding: 0 6px;
70
+ font-size: 12px;
71
+ white-space: nowrap;
72
+ color: var(--pptx-muted-foreground);
73
+ }
74
+ .pptxv-autosave-status.is-saving { color: var(--pptx-accent-foreground); opacity: 0.8; }
75
+ .pptxv-autosave-status.is-error { color: #dc2626; }
76
+
77
+ /* ── PowerPoint-style title bar ─────────────────────────────────────── */
78
+ .pptxv-titlebar {
79
+ position: relative;
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 6px;
83
+ min-height: 34px;
84
+ padding: 4px 10px;
85
+ border-bottom: 1px solid var(--pptx-border);
86
+ background: var(--pptx-card);
87
+ color: var(--pptx-card-foreground);
88
+ font-size: 11px;
89
+ user-select: none;
90
+ }
91
+ .pptxv-titlebar-logo {
92
+ display: inline-grid;
93
+ width: 20px;
94
+ height: 20px;
95
+ place-items: center;
96
+ border-radius: 3px;
97
+ background: #d24726;
98
+ color: #fff;
99
+ font-size: 13px;
100
+ font-weight: 700;
101
+ }
102
+ .pptxv-titlebar-autosave, .pptxv-titlebar-file { display: inline-flex; align-items: center; gap: 5px; min-width: 0; }
103
+ .pptxv-titlebar-autosave-label, .pptxv-titlebar-status { color: var(--pptx-muted-foreground); white-space: nowrap; }
104
+ .pptxv-titlebar-switch {
105
+ position: relative;
106
+ width: 27px;
107
+ height: 14px;
108
+ padding: 0;
109
+ border: 0;
110
+ border-radius: 999px;
111
+ background: var(--pptx-muted-foreground);
112
+ cursor: pointer;
113
+ }
114
+ .pptxv-titlebar-switch.is-on { background: var(--pptx-primary); }
115
+ .pptxv-titlebar-switch-knob { position: absolute; top: 2px; left: 2px; width: 10px; height: 10px; border-radius: 50%; background: #fff; transition: transform 120ms ease; }
116
+ .pptxv-titlebar-switch.is-on .pptxv-titlebar-switch-knob { transform: translateX(13px); }
117
+ .pptxv-titlebar-switch:focus-visible, .pptxv-titlebar-btn:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
118
+ .pptxv-titlebar-btn { width: 24px; height: 24px; }
119
+ .pptxv-titlebar-btn:hover:not(:disabled) { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
120
+ .pptxv-titlebar-sep { width: 1px; height: 16px; background: var(--pptx-border); }
121
+ .pptxv-titlebar-filename { overflow: hidden; max-width: 180px; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
122
+ .pptxv-titlebar-dot { color: var(--pptx-muted-foreground); }
123
+ .pptxv-titlebar-status.is-error { color: #dc2626; }
124
+ .pptxv-titlebar-status.is-saving { color: #ca8a04; }
125
+ .pptxv-titlebar-search { position: absolute; left: 50%; width: min(320px, 30vw); transform: translateX(-50%); }
126
+ .pptxv-titlebar-spacer { flex: 1; min-width: 20px; }
127
+ .pptxv-cmdsearch { position: relative; width: 100%; }
128
+ .pptxv-cmdsearch-box { display: flex; align-items: center; gap: 5px; height: 24px; padding: 0 8px; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted); color: var(--pptx-muted-foreground); }
129
+ .pptxv-cmdsearch-box svg { width: 13px; height: 13px; flex: none; }
130
+ .pptxv-cmdsearch-input { width: 100%; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--pptx-foreground); font: inherit; }
131
+ .pptxv-cmdsearch-menu { position: absolute; z-index: 20; top: calc(100% + 4px); right: 0; left: 0; overflow: hidden; border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-card); box-shadow: 0 8px 20px rgb(0 0 0 / 0.16); }
132
+ .pptxv-cmdsearch-item, .pptxv-cmdsearch-empty { display: block; width: 100%; padding: 7px 9px; border: 0; background: transparent; color: var(--pptx-foreground); font: inherit; text-align: left; }
133
+ .pptxv-cmdsearch-item { cursor: pointer; }
134
+ .pptxv-cmdsearch-item:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
135
+ .pptxv-cmdsearch-empty { color: var(--pptx-muted-foreground); }
136
+ @media (max-width: 767px), (max-width: 1023px) and (max-height: 520px) { .pptxv-titlebar { display: none; } }
137
+
138
+ /* ── Body: thumbnail rail + viewport ─────────────────────────────────── */
139
+ .pptxv-body { display: flex; flex: 1; min-height: 0; }
140
+ .pptxv-thumbs {
141
+ flex: none;
142
+ width: 168px;
143
+ overflow-y: auto;
144
+ overflow-x: hidden;
145
+ padding: 8px;
146
+ border-right: 1px solid var(--pptx-border);
147
+ background: var(--pptx-card);
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 8px;
151
+ }
152
+ .pptxv-thumb {
153
+ display: flex;
154
+ align-items: flex-start;
155
+ gap: 6px;
156
+ padding: 0;
157
+ border: none;
158
+ background: transparent;
159
+ color: inherit;
160
+ cursor: pointer;
161
+ text-align: left;
162
+ }
163
+ .pptxv-thumb-num {
164
+ flex: none;
165
+ width: 16px;
166
+ font-size: 11px;
167
+ color: var(--pptx-muted-foreground);
168
+ line-height: 1.4;
169
+ }
170
+ .pptxv-thumb-frame {
171
+ position: relative;
172
+ overflow: hidden;
173
+ border: 2px solid var(--pptx-border);
174
+ border-radius: var(--pptx-radius);
175
+ background: #fff;
176
+ }
177
+ .pptxv-thumb.is-active .pptxv-thumb-frame { border-color: var(--pptx-primary); }
178
+ .pptxv-thumb:focus-visible .pptxv-thumb-frame { outline: 2px solid var(--pptx-ring); }
179
+
180
+ /* ── Viewport / stage ────────────────────────────────────────────────── */
181
+ .pptxv-viewport {
182
+ flex: 1;
183
+ min-width: 0;
184
+ overflow: auto;
185
+ display: grid;
186
+ place-items: center;
187
+ padding: 16px;
188
+ background: var(--pptx-muted);
189
+ }
190
+ .pptxv-stage-wrap {
191
+ position: relative;
192
+ overflow: hidden;
193
+ flex: none;
194
+ box-shadow: 0 2px 12px rgb(0 0 0 / 0.25);
195
+ }
196
+ .pptxv-stage { background: #fff; }
197
+ .pptxv-stage-wrap[data-draw-tool="pen"],
198
+ .pptxv-stage-wrap[data-draw-tool="highlighter"] { cursor: crosshair; }
199
+ .pptxv-stage-wrap[data-draw-tool="eraser"] { cursor: cell; }
200
+ .pptxv-para { margin: 0; }
201
+
202
+ /* ── Selection overlay (editing) ─────────────────────────────────────── */
203
+ .pptxv-editor-overlay {
204
+ position: absolute;
205
+ inset: 0;
206
+ pointer-events: none;
207
+ z-index: 5;
208
+ }
209
+ .pptxv-sel-box {
210
+ position: absolute;
211
+ box-sizing: border-box;
212
+ border: 1px solid var(--pptx-ring);
213
+ pointer-events: none;
214
+ transform-origin: center;
215
+ }
216
+ .pptxv-sel-handle {
217
+ position: absolute;
218
+ width: 10px;
219
+ height: 10px;
220
+ margin: -5px 0 0 -5px;
221
+ padding: 0;
222
+ border: 1px solid var(--pptx-ring);
223
+ border-radius: 2px;
224
+ background: #fff;
225
+ pointer-events: auto;
226
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.3);
227
+ }
228
+ .pptxv-rotate-stem {
229
+ position: absolute;
230
+ left: 50%;
231
+ width: 1px;
232
+ margin-left: -0.5px;
233
+ background: var(--pptx-ring);
234
+ pointer-events: none;
235
+ }
236
+ .pptxv-rotate-knob {
237
+ position: absolute;
238
+ left: 50%;
239
+ width: 12px;
240
+ height: 12px;
241
+ margin: -6px 0 0 -6px;
242
+ padding: 0;
243
+ border: 1px solid var(--pptx-ring);
244
+ border-radius: 50%;
245
+ background: #fff;
246
+ cursor: grab;
247
+ pointer-events: auto;
248
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.3);
249
+ }
250
+ .pptxv-snap-layer {
251
+ position: absolute;
252
+ inset: 0;
253
+ pointer-events: none;
254
+ }
255
+ .pptxv-snap-line { position: absolute; background: var(--pptx-destructive); }
256
+ .pptxv-snap-v { top: 0; bottom: 0; width: 1px; }
257
+ .pptxv-snap-h { left: 0; right: 0; height: 1px; }
258
+
259
+ /* ── Speaker notes panel ─────────────────────────────────────────────── */
260
+ .pptxv-notes {
261
+ display: flex;
262
+ flex-direction: column;
263
+ flex: none;
264
+ border-top: 1px solid var(--pptx-border);
265
+ background: var(--pptx-card);
266
+ color: var(--pptx-card-foreground);
267
+ }
268
+ .pptxv-notes-header {
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: space-between;
272
+ width: 100%;
273
+ padding: 6px 10px;
274
+ border: none;
275
+ background: transparent;
276
+ color: var(--pptx-muted-foreground);
277
+ font-size: 0.8125rem;
278
+ font-weight: 600;
279
+ text-align: left;
280
+ cursor: pointer;
281
+ }
282
+ .pptxv-notes-header:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
283
+ .pptxv-notes-header:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -2px; }
284
+ .pptxv-notes-chevron { font-size: 0.75rem; }
285
+ .pptxv-notes-body { padding: 0 10px 10px; }
286
+ .pptxv-notes-body[hidden] { display: none; }
287
+ .pptxv-notes-toolbar { display: flex; align-items: center; gap: 2px; margin: 0 0 6px; }
288
+ .pptxv-notes-tool, .pptxv-notes-mode {
289
+ min-width: 26px; height: 24px; padding: 0 6px; border: 1px solid var(--pptx-border);
290
+ border-radius: 3px; background: var(--pptx-muted); color: var(--pptx-foreground); cursor: pointer;
291
+ font-size: 0.75rem; line-height: 1;
292
+ }
293
+ .pptxv-notes-mode { margin-left: auto; font-size: 0.6875rem; }
294
+ .pptxv-notes-tool:hover, .pptxv-notes-mode:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
295
+ .pptxv-notes-tool:focus-visible, .pptxv-notes-mode:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
296
+ .pptxv-notes-rich-editor {
297
+ box-sizing: border-box; width: 100%; min-height: 76px; max-height: 192px; overflow-y: auto;
298
+ border: 1px solid var(--pptx-border); border-radius: 4px; background: var(--pptx-muted);
299
+ color: var(--pptx-foreground); padding: 7px 9px; font-size: 0.75rem; line-height: 1.4; white-space: pre-wrap;
300
+ }
301
+ .pptxv-notes-rich-editor:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
302
+ .pptxv-notes-rich-editor[contenteditable='false'] { cursor: default; opacity: 0.85; }
303
+ .pptxv-notes-textarea {
304
+ box-sizing: border-box;
305
+ width: 100%;
306
+ min-height: 80px;
307
+ max-height: 200px;
308
+ padding: 8px;
309
+ border: 1px solid var(--pptx-border);
310
+ border-radius: var(--pptx-radius);
311
+ background: var(--pptx-muted);
312
+ color: var(--pptx-foreground);
313
+ font: inherit;
314
+ font-size: 0.8125rem;
315
+ line-height: 1.5;
316
+ resize: vertical;
317
+ }
318
+ .pptxv-notes-textarea:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
319
+ .pptxv-notes-textarea:disabled,
320
+ .pptxv-notes-textarea:read-only { cursor: default; opacity: 0.85; }
321
+ .pptxv.pptxv-presenting .pptxv-notes { display: none; }
322
+
323
+ /* ── Bottom status bar ──────────────────────────────────────────────── */
324
+ .pptxv-statusbar {
325
+ display: flex;
326
+ align-items: center;
327
+ gap: 4px;
328
+ min-height: 28px;
329
+ padding: 2px 8px;
330
+ border-top: 1px solid var(--pptx-border);
331
+ background: color-mix(in srgb, var(--pptx-muted) 55%, var(--pptx-card));
332
+ color: var(--pptx-muted-foreground);
333
+ font-size: 10px;
334
+ }
335
+ .pptxv-statusbar-spacer { flex: 1; }
336
+ .pptxv-statusbar-sep { width: 1px; height: 12px; margin: 0 4px; background: var(--pptx-border); opacity: 0.6; }
337
+ .pptxv-statusbar-btn {
338
+ display: inline-flex;
339
+ align-items: center;
340
+ justify-content: center;
341
+ gap: 4px;
342
+ min-width: 24px;
343
+ height: 22px;
344
+ padding: 2px 4px;
345
+ border: none;
346
+ border-radius: 3px;
347
+ background: transparent;
348
+ color: inherit;
349
+ font: inherit;
350
+ cursor: pointer;
351
+ }
352
+ .pptxv-statusbar-btn:hover:not(:disabled) { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
353
+ .pptxv-statusbar-btn:disabled { opacity: 0.4; cursor: default; }
354
+ .pptxv-statusbar-btn.is-active { color: var(--pptx-primary); }
355
+ .pptxv-statusbar-btn:focus-visible,
356
+ .pptxv-statusbar-zoom:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
357
+ .pptxv-statusbar-btn svg, .pptxv-statusbar-icon svg { width: 12px; height: 12px; display: block; }
358
+ .pptxv-statusbar-counter, .pptxv-statusbar-text { white-space: nowrap; }
359
+ .pptxv-statusbar-save.is-saving { color: #ca8a04; }
360
+ .pptxv-statusbar-save.is-error { color: #dc2626; }
361
+ .pptxv-statusbar-zoom {
362
+ min-width: 48px;
363
+ height: 22px;
364
+ padding: 2px 6px;
365
+ border: none;
366
+ border-radius: 3px;
367
+ background: transparent;
368
+ color: inherit;
369
+ font: inherit;
370
+ font-variant-numeric: tabular-nums;
371
+ cursor: pointer;
372
+ }
373
+ .pptxv-statusbar-zoom:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
374
+ .pptxv.pptxv-presenting .pptxv-statusbar { display: none; }
375
+
376
+ @media (max-width: 767px), (max-width: 1023px) and (max-height: 520px) {
377
+ .pptxv-ribbon,
378
+ .pptxv-thumbs,
379
+ .pptxv-inspector,
380
+ .pptxv-statusbar { display: none; }
381
+ .pptxv-viewport { padding: 10px; }
382
+ }
383
+
384
+ /* ── Placeholder (element types without a renderer yet) ──────────────── */
385
+ .pptxv-placeholder {
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ border: 1px dashed var(--pptx-muted-foreground);
390
+ border-radius: 4px;
391
+ background: rgb(127 127 127 / 0.08);
392
+ }
393
+ .pptxv-placeholder-label {
394
+ padding: 2px 8px;
395
+ font-size: 12px;
396
+ color: var(--pptx-muted-foreground);
397
+ background: rgb(127 127 127 / 0.12);
398
+ border-radius: 4px;
399
+ }
400
+
401
+ /* ── Overlays ────────────────────────────────────────────────────────── */
402
+ .pptxv-overlay {
403
+ position: absolute;
404
+ inset: 0;
405
+ display: flex;
406
+ align-items: center;
407
+ justify-content: center;
408
+ background: color-mix(in srgb, var(--pptx-background) 70%, transparent);
409
+ z-index: 10;
410
+ }
411
+ .pptxv-overlay[hidden] { display: none; }
412
+ .pptxv-error-message { color: var(--pptx-destructive); padding: 0 24px; text-align: center; }
413
+ .pptxv-empty { color: var(--pptx-muted-foreground); }
414
+
415
+ /* ── Presentation (fullscreen) mode ──────────────────────────────────── */
416
+ .pptxv.pptxv-presenting .pptxv-ribbon,
417
+ .pptxv.pptxv-presenting .pptxv-thumbs,
418
+ .pptxv.pptxv-presenting .pptxv-titlebar { display: none; }
419
+ .pptxv.pptxv-presenting .pptxv-viewport { background: #000; padding: 0; }
420
+ .pptxv.pptxv-presenting .pptxv-stage-wrap { box-shadow: none; }
421
+
422
+
423
+ .pptxv-marquee { position: absolute; z-index: 4; border: 1px solid var(--pptx-primary); background: color-mix(in srgb, var(--pptx-primary) 14%, transparent); pointer-events: none; }
424
+ /* Colour swatch control (native <input type=color>, used by the inspector). */
425
+ .pptxv-color {
426
+ display: inline-flex;
427
+ align-items: center;
428
+ justify-content: center;
429
+ width: 28px;
430
+ height: 28px;
431
+ border-radius: var(--pptx-radius);
432
+ cursor: pointer;
433
+ }
434
+ .pptxv-color:hover { background: var(--pptx-accent); }
435
+ .pptxv-color.is-disabled { opacity: 0.4; cursor: default; }
436
+ .pptxv-color-input {
437
+ width: 20px;
438
+ height: 20px;
439
+ padding: 0;
440
+ border: 1px solid var(--pptx-border);
441
+ border-radius: 4px;
442
+ background: none;
443
+ cursor: pointer;
444
+ }
445
+ .pptxv-color-input:disabled { cursor: default; }
446
+
447
+ /* Numeric field */
448
+ .pptxv-field {
449
+ display: inline-flex;
450
+ align-items: center;
451
+ gap: 4px;
452
+ font-size: 12px;
453
+ color: var(--pptx-muted-foreground);
454
+ }
455
+ .pptxv-field-label { white-space: nowrap; }
456
+ .pptxv-field-input {
457
+ width: 64px;
458
+ height: 26px;
459
+ padding: 2px 6px;
460
+ border: 1px solid var(--pptx-border);
461
+ border-radius: var(--pptx-radius);
462
+ background: var(--pptx-background);
463
+ color: var(--pptx-foreground);
464
+ font: inherit;
465
+ font-size: 12px;
466
+ }
467
+ .pptxv-field-compact .pptxv-field-input { width: 48px; }
468
+ .pptxv-field-input:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
469
+ .pptxv-field-input:disabled { opacity: 0.5; }
470
+
471
+ /* ── Property inspector ──────────────────────────────────────────────── */
472
+ .pptxv-inspector {
473
+ flex: none;
474
+ width: 288px;
475
+ overflow-y: auto;
476
+ border-left: 1px solid var(--pptx-border);
477
+ background: var(--pptx-card);
478
+ color: var(--pptx-card-foreground);
479
+ font-size: 12px;
480
+ }
481
+ .pptxv-inspector[hidden] { display: none; }
482
+ .pptxv-inspector-header {
483
+ display: flex;
484
+ align-items: center;
485
+ justify-content: space-between;
486
+ width: 100%;
487
+ padding: 8px 12px;
488
+ border: none;
489
+ border-bottom: 1px solid var(--pptx-border);
490
+ background: transparent;
491
+ color: var(--pptx-foreground);
492
+ font: inherit;
493
+ font-weight: 600;
494
+ cursor: pointer;
495
+ }
496
+ .pptxv-inspector-header:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
497
+ .pptxv-inspector-body { padding: 10px 12px; }
498
+ .pptxv-inspector-body[hidden] { display: none; }
499
+ .pptxv-inspector-empty { color: var(--pptx-muted-foreground); margin: 0; }
500
+ .pptxv-inspector-empty[hidden] { display: none; }
501
+ .pptxv-inspector-section { margin-bottom: 14px; }
502
+ .pptxv-inspector-section[hidden] { display: none; }
503
+ .pptxv-inspector-section-title {
504
+ margin: 0 0 6px;
505
+ font-size: 11px;
506
+ font-weight: 600;
507
+ text-transform: uppercase;
508
+ letter-spacing: 0.04em;
509
+ color: var(--pptx-muted-foreground);
510
+ }
511
+ .pptxv-inspector-grid {
512
+ display: grid;
513
+ grid-template-columns: repeat(2, 1fr);
514
+ gap: 6px 8px;
515
+ }
516
+ .pptxv-inspector-grid .pptxv-field { justify-content: space-between; }
517
+ .pptxv-inspector-grid .pptxv-field-input { width: 100%; }
518
+ .pptxv-inspector-row {
519
+ display: flex;
520
+ align-items: center;
521
+ gap: 6px;
522
+ margin-bottom: 8px;
523
+ }
524
+ .pptxv-inspector-row-label { color: var(--pptx-muted-foreground); }
525
+
526
+ /* Compact SmartArt layout switcher and editable text pane. */
527
+ .pptxv-smartart-label { display: block; margin-bottom: 6px; color: var(--pptx-muted-foreground); }
528
+ .pptxv-smartart-layout-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 5px; margin-bottom: 10px; }
529
+ .pptxv-smartart-layout-button {
530
+ min-width: 0;
531
+ padding: 6px 3px;
532
+ border: 1px solid var(--pptx-border);
533
+ border-radius: var(--pptx-radius);
534
+ background: transparent;
535
+ color: var(--pptx-muted-foreground);
536
+ font: inherit;
537
+ font-size: 10px;
538
+ cursor: pointer;
539
+ overflow: hidden;
540
+ text-overflow: ellipsis;
541
+ }
542
+ .pptxv-smartart-layout-button:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
543
+ .pptxv-smartart-layout-button.is-active { border-color: var(--pptx-primary); background: color-mix(in srgb, var(--pptx-primary) 16%, transparent); color: var(--pptx-primary); }
544
+ .pptxv-smartart-nodes { display: flex; max-height: 208px; flex-direction: column; gap: 5px; overflow-y: auto; }
545
+ .pptxv-smartart-node { display: grid; grid-template-columns: 20px minmax(0, 1fr); align-items: center; gap: 5px; }
546
+ .pptxv-smartart-node-index { color: var(--pptx-muted-foreground); text-align: center; }
547
+ .pptxv-smartart-node-input { min-width: 0; height: 26px; box-sizing: border-box; padding: 2px 6px; border: 1px solid var(--pptx-border); border-radius: var(--pptx-radius); background: var(--pptx-background); color: var(--pptx-foreground); font: inherit; }
548
+ .pptxv-smartart-node-input:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
549
+
550
+ /* Select / checkbox / range fields (text/image/table inspector sections). */
551
+ .pptxv-field-select,
552
+ .pptxv-field-checkbox,
553
+ .pptxv-field-range {
554
+ display: flex;
555
+ align-items: center;
556
+ justify-content: space-between;
557
+ gap: 8px;
558
+ margin-bottom: 8px;
559
+ }
560
+ .pptxv-field-checkbox { justify-content: flex-start; }
561
+ .pptxv-field-checkbox .pptxv-field-label { order: 2; }
562
+ .pptxv-field-select-input {
563
+ height: 26px;
564
+ padding: 2px 6px;
565
+ border: 1px solid var(--pptx-border);
566
+ border-radius: var(--pptx-radius);
567
+ background: var(--pptx-background);
568
+ color: var(--pptx-foreground);
569
+ font: inherit;
570
+ font-size: 12px;
571
+ }
572
+ .pptxv-field-select-input:disabled { opacity: 0.5; }
573
+ .pptxv-field-range { flex-direction: column; align-items: stretch; }
574
+ .pptxv-field-range-row { display: flex; align-items: center; gap: 8px; }
575
+ .pptxv-field-range-row input[type='range'] { flex: 1; }
576
+ .pptxv-field-range-readout {
577
+ min-width: 34px;
578
+ text-align: right;
579
+ color: var(--pptx-muted-foreground);
580
+ font-variant-numeric: tabular-nums;
581
+ }
582
+
583
+ /* Gradient fill sub-panel (Fill & Stroke section). */
584
+ .pptxv-inspector-gradient { margin: 4px 0 8px; padding-left: 4px; border-left: 2px solid var(--pptx-border); }
585
+ .pptxv-inspector-gradient[hidden] { display: none; }
586
+ .pptxv-inspector-gradient-stops { display: flex; flex-direction: column; gap: 4px; margin: 6px 0; }
587
+
588
+ /* Presentation mode hides all editing chrome (the ribbon is covered by
589
+ * `.pptxv.pptxv-presenting .pptxv-ribbon` in css.ts). */
590
+ .pptxv.pptxv-presenting .pptxv-inspector { display: none; }
591
+
592
+ /* ── Accessibility checker ───────────────────────────────────────────── */
593
+ .pptxv-accessibility-panel {
594
+ position: absolute;
595
+ top: 56px;
596
+ right: 12px;
597
+ z-index: 20;
598
+ width: min(360px, calc(100% - 24px));
599
+ max-height: min(560px, calc(100% - 72px));
600
+ overflow: auto;
601
+ border: 1px solid var(--pptx-border);
602
+ border-radius: calc(var(--pptx-radius) + 2px);
603
+ background: var(--pptx-card);
604
+ color: var(--pptx-card-foreground);
605
+ box-shadow: 0 16px 36px rgb(0 0 0 / 20%);
606
+ }
607
+ .pptxv-accessibility-panel[hidden] { display: none; }
608
+ .pptxv-accessibility-header { display: flex; align-items: center; justify-content: space-between; padding: 12px; border-bottom: 1px solid var(--pptx-border); }
609
+ .pptxv-accessibility-title { margin: 0; font-size: 13px; }
610
+ .pptxv-accessibility-close { border: 0; border-radius: var(--pptx-radius); background: transparent; color: var(--pptx-foreground); cursor: pointer; font: inherit; font-size: 12px; padding: 4px 7px; }
611
+ .pptxv-accessibility-close:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
612
+ .pptxv-accessibility-summary { margin: 0; padding: 8px 12px; color: var(--pptx-muted-foreground); font-size: 11px; }
613
+ .pptxv-accessibility-list { padding: 0 8px 8px; }
614
+ .pptxv-accessibility-group { margin-top: 8px; }
615
+ .pptxv-accessibility-group-title { margin: 0 4px 5px; color: var(--pptx-muted-foreground); font-size: 10px; letter-spacing: .05em; text-transform: uppercase; }
616
+ .pptxv-accessibility-issue { display: grid; width: 100%; grid-template-columns: 1fr auto; gap: 3px 10px; margin: 3px 0; padding: 8px; border: 0; border-left: 3px solid var(--pptx-border); border-radius: var(--pptx-radius); background: var(--pptx-muted); color: inherit; cursor: pointer; font: inherit; text-align: left; }
617
+ .pptxv-accessibility-group.is-error .pptxv-accessibility-issue { border-left-color: #d64545; }
618
+ .pptxv-accessibility-group.is-warning .pptxv-accessibility-issue { border-left-color: #d9911b; }
619
+ .pptxv-accessibility-group.is-tip .pptxv-accessibility-issue { border-left-color: #4b8bc5; }
620
+ .pptxv-accessibility-issue:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
621
+ .pptxv-accessibility-issue-type { font-size: 11px; }
622
+ .pptxv-accessibility-issue-message { grid-column: 1 / -1; color: var(--pptx-muted-foreground); font-size: 11px; line-height: 1.35; }
623
+ .pptxv-accessibility-issue:hover .pptxv-accessibility-issue-message { color: inherit; }
624
+ .pptxv-accessibility-issue-slide { color: var(--pptx-muted-foreground); font-size: 10px; }
625
+ .pptxv-accessibility-empty { margin: 12px 4px; color: var(--pptx-muted-foreground); font-size: 12px; text-align: center; }
626
+ .pptxv.pptxv-presenting .pptxv-accessibility-panel { display: none; }
627
+
628
+
629
+ /* ── Ribbon shell and React-aligned command row ─────────────────────────── */
630
+ .pptxv-ribbon {
631
+ display: flex;
632
+ flex-direction: column;
633
+ border-bottom: 1px solid var(--pptx-border);
634
+ background: var(--pptx-card);
635
+ color: var(--pptx-card-foreground);
636
+ flex: none;
637
+ }
638
+ .pptxv-ribbon-primary {
639
+ display: flex;
640
+ align-items: center;
641
+ justify-content: flex-end;
642
+ gap: 4px;
643
+ min-height: 26px;
644
+ padding: 4px 8px;
645
+ border-bottom: 1px solid var(--pptx-border);
646
+ }
647
+ .pptxv-ribbon-primary:empty { display: none; }
648
+ .pptxv-ribbon-primary[hidden] { display: none; }
649
+ /* ── Tab bar ─────────────────────────────────────────────────────────── */
650
+ .pptxv-ribbon-tabs {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 2px;
654
+ padding: 0 6px;
655
+ border-bottom: 1px solid var(--pptx-border);
656
+ overflow-x: auto;
657
+ }
658
+ .pptxv-ribbon-tabs[hidden] { display: none; }
659
+ .pptxv-ribbon-tab {
660
+ padding: 6px 12px;
661
+ border: none;
662
+ border-bottom: 2px solid transparent;
663
+ background: transparent;
664
+ color: var(--pptx-muted-foreground);
665
+ font: inherit;
666
+ font-size: 12px;
667
+ font-weight: 500;
668
+ white-space: nowrap;
669
+ cursor: pointer;
670
+ }
671
+ .pptxv-ribbon-tab:hover { color: var(--pptx-foreground); background: var(--pptx-accent); }
672
+ .pptxv-ribbon-tab.is-active { color: var(--pptx-foreground); border-bottom-color: var(--pptx-primary); }
673
+ .pptxv-ribbon-tab-file { color: var(--pptx-primary); }
674
+ .pptxv-ribbon-tab-file.is-active {
675
+ color: #fff;
676
+ background: color-mix(in srgb, var(--pptx-primary) 80%, transparent);
677
+ border-radius: var(--pptx-radius);
678
+ }
679
+
680
+ /* ── Tab content + groups ────────────────────────────────────────────── */
681
+ .pptxv-ribbon-tab-content {
682
+ display: flex;
683
+ flex-wrap: wrap;
684
+ align-items: flex-start;
685
+ gap: 2px;
686
+ padding: 6px 8px;
687
+ }
688
+ .pptxv-ribbon-tab-content[hidden] { display: none; }
689
+ .pptxv-ribbon-insert-content {
690
+ flex-wrap: nowrap;
691
+ overflow-x: auto;
692
+ overflow-y: hidden;
693
+ }
694
+ .pptxv-rgroup {
695
+ display: flex;
696
+ flex-direction: column;
697
+ align-items: center;
698
+ gap: 2px;
699
+ padding: 2px 8px;
700
+ border-right: 1px solid var(--pptx-border);
701
+ }
702
+ .pptxv-rgroup:last-child { border-right: none; }
703
+ .pptxv-rgroup-row { display: flex; flex-wrap: wrap; align-items: center; gap: 2px; }
704
+ .pptxv-rgroup-label {
705
+ font-size: 9px;
706
+ color: var(--pptx-muted-foreground);
707
+ text-transform: uppercase;
708
+ letter-spacing: 0.03em;
709
+ }
710
+ .pptxv-rgroup .pptxv-btn.is-active { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
711
+
712
+ /* ── Shape insert grid ───────────────────────────────────────────────── */
713
+ .pptxv-shape-grid {
714
+ display: grid;
715
+ grid-template-columns: repeat(10, 28px);
716
+ gap: 2px;
717
+ max-width: 320px;
718
+ }
719
+
720
+ /* ── Dropdown popover (font/size/spacing/case/line-spacing) ─────────────*/
721
+ .pptxv-dropdown { position: relative; display: inline-flex; }
722
+ .pptxv-dropdown-trigger {
723
+ display: inline-flex;
724
+ align-items: center;
725
+ gap: 4px;
726
+ height: 28px;
727
+ padding: 0 6px;
728
+ border: 1px solid var(--pptx-border);
729
+ border-radius: var(--pptx-radius);
730
+ background: var(--pptx-background);
731
+ color: inherit;
732
+ font: inherit;
733
+ font-size: 11px;
734
+ cursor: pointer;
735
+ }
736
+ .pptxv-dropdown-trigger:hover:not(:disabled) { background: var(--pptx-accent); }
737
+ .pptxv-dropdown-trigger:disabled { opacity: 0.4; cursor: default; }
738
+ .pptxv-dropdown-trigger.is-active { background: var(--pptx-accent); }
739
+ .pptxv-dropdown-trigger svg { width: 12px; height: 12px; flex: none; }
740
+ .pptxv-dropdown-text { max-width: 96px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
741
+ .pptxv-font-family-dd .pptxv-dropdown-text { max-width: 120px; }
742
+ .pptxv-font-size-dd .pptxv-dropdown-trigger { min-width: 44px; justify-content: space-between; }
743
+ .pptxv-dropdown-menu {
744
+ position: absolute;
745
+ top: calc(100% + 4px);
746
+ left: 0;
747
+ z-index: 30;
748
+ min-width: 140px;
749
+ max-height: 240px;
750
+ overflow-y: auto;
751
+ padding: 4px;
752
+ border: 1px solid var(--pptx-border);
753
+ border-radius: var(--pptx-radius);
754
+ background: var(--pptx-card);
755
+ color: var(--pptx-card-foreground);
756
+ box-shadow: 0 6px 20px rgb(0 0 0 / 0.25);
757
+ }
758
+ .pptxv-dropdown-menu[hidden] { display: none; }
759
+ .pptxv-dropdown-item {
760
+ display: block;
761
+ width: 100%;
762
+ padding: 6px 8px;
763
+ border: none;
764
+ border-radius: 4px;
765
+ background: transparent;
766
+ color: inherit;
767
+ font: inherit;
768
+ text-align: left;
769
+ cursor: pointer;
770
+ }
771
+ .pptxv-dropdown-item:hover { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
772
+ .pptxv-dropdown-item.is-selected { font-weight: 600; color: var(--pptx-primary); }
773
+
774
+ /* ── Swatch colour picker ────────────────────────────────────────────── */
775
+ .pptxv-swatch-picker { position: relative; display: inline-flex; }
776
+ .pptxv-swatch-trigger { flex-direction: column; height: 28px; padding: 2px 6px; gap: 0; }
777
+ .pptxv-swatch-swab { display: block; width: 16px; height: 3px; border-radius: 1px; margin-top: 1px; }
778
+ .pptxv-swatch-menu {
779
+ position: absolute;
780
+ top: calc(100% + 4px);
781
+ left: 0;
782
+ z-index: 30;
783
+ padding: 8px;
784
+ border: 1px solid var(--pptx-border);
785
+ border-radius: var(--pptx-radius);
786
+ background: var(--pptx-card);
787
+ color: var(--pptx-card-foreground);
788
+ box-shadow: 0 6px 20px rgb(0 0 0 / 0.25);
789
+ }
790
+ .pptxv-swatch-menu[hidden] { display: none; }
791
+ .pptxv-swatch-grid { display: grid; grid-template-columns: repeat(5, 20px); gap: 4px; margin-bottom: 6px; }
792
+ .pptxv-swatch {
793
+ width: 20px;
794
+ height: 20px;
795
+ padding: 0;
796
+ border: 1px solid var(--pptx-border);
797
+ border-radius: 50%;
798
+ cursor: pointer;
799
+ }
800
+ .pptxv-swatch:hover { transform: scale(1.15); }
801
+ .pptxv-swatch.is-selected { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
802
+ .pptxv-swatch-custom {
803
+ display: flex;
804
+ align-items: center;
805
+ justify-content: space-between;
806
+ gap: 6px;
807
+ font-size: 11px;
808
+ color: var(--pptx-muted-foreground);
809
+ cursor: pointer;
810
+ }
811
+ .pptxv-swatch-custom-input {
812
+ width: 20px;
813
+ height: 20px;
814
+ padding: 0;
815
+ border: 1px solid var(--pptx-border);
816
+ border-radius: 4px;
817
+ background: none;
818
+ cursor: pointer;
819
+ }
820
+
821
+ /* ── Find & Replace docked panel ─────────────────────────────────────── */
822
+ .pptxv-findreplace {
823
+ display: flex;
824
+ flex-direction: column;
825
+ gap: 4px;
826
+ padding: 6px 8px;
827
+ border-bottom: 1px solid var(--pptx-border);
828
+ background: var(--pptx-muted);
829
+ }
830
+ .pptxv-findreplace[hidden] { display: none; }
831
+ .pptxv-findreplace-row { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; }
832
+ .pptxv-findreplace-input {
833
+ height: 28px;
834
+ min-width: 140px;
835
+ padding: 0 8px;
836
+ border: 1px solid var(--pptx-border);
837
+ border-radius: var(--pptx-radius);
838
+ background: var(--pptx-background);
839
+ color: var(--pptx-foreground);
840
+ font: inherit;
841
+ font-size: 12px;
842
+ }
843
+ .pptxv-findreplace-input:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
844
+ .pptxv-findreplace-checkbox {
845
+ display: inline-flex;
846
+ align-items: center;
847
+ gap: 4px;
848
+ font-size: 11px;
849
+ color: var(--pptx-muted-foreground);
850
+ cursor: pointer;
851
+ }
852
+ .pptxv-findreplace-status { font-size: 11px; color: var(--pptx-muted-foreground); }
853
+
854
+
855
+ .pptxv-smartart-dialog-layer {
856
+ position: fixed;
857
+ inset: 0;
858
+ z-index: 1200;
859
+ display: flex;
860
+ align-items: center;
861
+ justify-content: center;
862
+ }
863
+ .pptxv-smartart-dialog-layer[hidden] { display: none; }
864
+ .pptxv-smartart-dialog-backdrop {
865
+ position: absolute;
866
+ inset: 0;
867
+ width: 100%;
868
+ height: 100%;
869
+ padding: 0;
870
+ border: 0;
871
+ background: rgb(0 0 0 / 0.5);
872
+ cursor: default;
873
+ }
874
+ .pptxv-smartart-dialog {
875
+ position: relative;
876
+ z-index: 1;
877
+ display: flex;
878
+ flex-direction: column;
879
+ width: min(600px, 90vw);
880
+ max-height: 80vh;
881
+ overflow: hidden;
882
+ border: 1px solid var(--pptx-border);
883
+ border-radius: 8px;
884
+ background: var(--pptx-background);
885
+ color: var(--pptx-foreground);
886
+ box-shadow: 0 20px 50px rgb(0 0 0 / 0.35);
887
+ }
888
+ .pptxv-smartart-dialog:focus { outline: none; }
889
+ .pptxv-smartart-dialog-header,
890
+ .pptxv-smartart-dialog-footer {
891
+ display: flex;
892
+ align-items: center;
893
+ padding: 12px 16px;
894
+ }
895
+ .pptxv-smartart-dialog-header {
896
+ justify-content: space-between;
897
+ border-bottom: 1px solid var(--pptx-border);
898
+ }
899
+ .pptxv-smartart-dialog-header h2 { margin: 0; font-size: 14px; font-weight: 500; }
900
+ .pptxv-smartart-dialog-close {
901
+ display: grid;
902
+ width: 28px;
903
+ height: 28px;
904
+ padding: 0;
905
+ place-items: center;
906
+ border: 0;
907
+ border-radius: var(--pptx-radius);
908
+ background: transparent;
909
+ color: inherit;
910
+ font: inherit;
911
+ font-size: 20px;
912
+ line-height: 1;
913
+ cursor: pointer;
914
+ }
915
+ .pptxv-smartart-dialog-close:hover { background: var(--pptx-muted); }
916
+ .pptxv-smartart-dialog-body { display: flex; flex: 1; min-height: 0; overflow: hidden; }
917
+ .pptxv-smartart-categories {
918
+ flex: 0 0 160px;
919
+ padding: 8px 0;
920
+ border-right: 1px solid var(--pptx-border);
921
+ }
922
+ .pptxv-smartart-category {
923
+ display: block;
924
+ width: 100%;
925
+ padding: 6px 12px;
926
+ border: 0;
927
+ background: transparent;
928
+ color: inherit;
929
+ font: inherit;
930
+ font-size: 12px;
931
+ text-align: left;
932
+ cursor: pointer;
933
+ }
934
+ .pptxv-smartart-category:hover { background: var(--pptx-muted); }
935
+ .pptxv-smartart-category.is-active { background: var(--pptx-primary); color: #fff; }
936
+ .pptxv-smartart-gallery { flex: 1; min-width: 0; overflow-y: auto; padding: 12px; }
937
+ .pptxv-smartart-options { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
938
+ .pptxv-smartart-option {
939
+ display: flex;
940
+ min-width: 0;
941
+ padding: 8px;
942
+ align-items: center;
943
+ flex-direction: column;
944
+ gap: 4px;
945
+ border: 1px solid var(--pptx-border);
946
+ border-radius: var(--pptx-radius);
947
+ background: transparent;
948
+ color: inherit;
949
+ font: inherit;
950
+ cursor: pointer;
951
+ }
952
+ .pptxv-smartart-option:hover { background: color-mix(in srgb, var(--pptx-muted) 50%, transparent); }
953
+ .pptxv-smartart-option.is-selected {
954
+ border-color: var(--pptx-primary);
955
+ background: color-mix(in srgb, var(--pptx-primary) 20%, transparent);
956
+ }
957
+ .pptxv-smartart-option-preview {
958
+ display: grid;
959
+ width: 64px;
960
+ height: 48px;
961
+ place-items: center;
962
+ border-radius: var(--pptx-radius);
963
+ background: var(--pptx-muted);
964
+ color: var(--pptx-primary);
965
+ }
966
+ .pptxv-smartart-option-preview svg { width: 30px; height: 30px; }
967
+ .pptxv-smartart-option-label { font-size: 10px; line-height: 1.25; text-align: center; }
968
+ .pptxv-smartart-dialog-footer {
969
+ justify-content: flex-end;
970
+ gap: 8px;
971
+ border-top: 1px solid var(--pptx-border);
972
+ }
973
+ .pptxv-smartart-dialog-cancel,
974
+ .pptxv-smartart-dialog-insert {
975
+ padding: 6px 12px;
976
+ border: 0;
977
+ border-radius: var(--pptx-radius);
978
+ font: inherit;
979
+ font-size: 12px;
980
+ cursor: pointer;
981
+ }
982
+ .pptxv-smartart-dialog-cancel { background: var(--pptx-muted); color: inherit; }
983
+ .pptxv-smartart-dialog-insert { background: var(--pptx-primary); color: #fff; }
984
+ .pptxv-smartart-dialog-insert:disabled { background: var(--pptx-muted); color: var(--pptx-muted-foreground); cursor: not-allowed; }
985
+ .pptxv-smartart-dialog button:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: 1px; }
986
+
987
+ @media (max-width: 767px) {
988
+ .pptxv-smartart-dialog-layer { align-items: flex-end; }
989
+ .pptxv-smartart-dialog { width: 100%; max-height: 88dvh; border-radius: 16px 16px 0 0; }
990
+ .pptxv-smartart-categories { flex-basis: 120px; }
991
+ .pptxv-smartart-options { grid-template-columns: repeat(2, minmax(0, 1fr)); }
992
+ }
993
+
994
+
995
+ /* ── Modal dialog (Share / Broadcast) ────────────────────────────────── */
996
+ .pptxv-modal-backdrop {
997
+ position: fixed;
998
+ inset: 0;
999
+ z-index: 1000;
1000
+ display: flex;
1001
+ align-items: center;
1002
+ justify-content: center;
1003
+ background: rgb(0 0 0 / 0.5);
1004
+ }
1005
+ .pptxv-modal-backdrop[hidden] { display: none; }
1006
+ .pptxv-modal-panel {
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ max-height: 88vh;
1010
+ min-width: 320px;
1011
+ max-width: min(92vw, 480px);
1012
+ overflow: hidden;
1013
+ border: 1px solid var(--pptx-border);
1014
+ border-radius: var(--pptx-radius);
1015
+ background: var(--pptx-card);
1016
+ color: var(--pptx-card-foreground);
1017
+ box-shadow: 0 12px 36px rgb(0 0 0 / 0.35);
1018
+ }
1019
+ .pptxv-modal-panel:focus { outline: none; }
1020
+ .pptxv-modal-header {
1021
+ display: flex;
1022
+ align-items: center;
1023
+ justify-content: space-between;
1024
+ gap: 12px;
1025
+ padding: 12px 16px;
1026
+ border-bottom: 1px solid var(--pptx-border);
1027
+ }
1028
+ .pptxv-modal-title { margin: 0; font-size: 14px; font-weight: 600; }
1029
+ .pptxv-modal-close {
1030
+ display: inline-flex;
1031
+ align-items: center;
1032
+ justify-content: center;
1033
+ width: 24px;
1034
+ height: 24px;
1035
+ border: none;
1036
+ border-radius: 4px;
1037
+ background: transparent;
1038
+ color: var(--pptx-muted-foreground);
1039
+ font-size: 18px;
1040
+ line-height: 1;
1041
+ cursor: pointer;
1042
+ }
1043
+ .pptxv-modal-close:hover { background: var(--pptx-muted); color: var(--pptx-foreground); }
1044
+ .pptxv-modal-body { overflow-y: auto; padding: 16px; }
1045
+ .pptxv-modal-footer {
1046
+ display: flex;
1047
+ justify-content: flex-end;
1048
+ gap: 8px;
1049
+ padding: 12px 16px;
1050
+ border-top: 1px solid var(--pptx-border);
1051
+ }
1052
+ .pptxv-modal-section { display: flex; flex-direction: column; gap: 12px; }
1053
+ .pptxv-modal-section[hidden] { display: none; }
1054
+ .pptxv-modal-desc { margin: 0; font-size: 13px; line-height: 1.5; color: var(--pptx-muted-foreground); }
1055
+ .pptxv-modal-hint { margin: 4px 0 0; font-size: 11px; color: var(--pptx-muted-foreground); }
1056
+ .pptxv-modal-hint[hidden] { display: none; }
1057
+ .pptxv-modal-field { display: flex; flex-direction: column; gap: 6px; }
1058
+ .pptxv-modal-label { font-size: 12px; font-weight: 500; }
1059
+ .pptxv-modal-input {
1060
+ width: 100%;
1061
+ padding: 6px 10px;
1062
+ border: 1px solid var(--pptx-border);
1063
+ border-radius: var(--pptx-radius);
1064
+ background: var(--pptx-background);
1065
+ color: var(--pptx-foreground);
1066
+ font: inherit;
1067
+ font-size: 13px;
1068
+ }
1069
+ .pptxv-modal-input:focus-visible { outline: 2px solid var(--pptx-ring); outline-offset: -1px; }
1070
+ .pptxv-modal-link-row { display: flex; align-items: center; gap: 8px; }
1071
+ .pptxv-modal-link-row .pptxv-modal-input { flex: 1; }
1072
+ .pptxv-modal-btn {
1073
+ padding: 6px 12px;
1074
+ border: 1px solid var(--pptx-border);
1075
+ border-radius: var(--pptx-radius);
1076
+ background: var(--pptx-muted);
1077
+ color: var(--pptx-foreground);
1078
+ font-size: 12px;
1079
+ white-space: nowrap;
1080
+ cursor: pointer;
1081
+ }
1082
+ .pptxv-modal-btn:hover:not(:disabled) { background: var(--pptx-accent); color: var(--pptx-accent-foreground); }
1083
+ .pptxv-modal-btn:disabled { opacity: 0.4; cursor: default; }
1084
+ .pptxv-modal-btn-primary {
1085
+ border-color: var(--pptx-primary);
1086
+ background: var(--pptx-primary);
1087
+ color: var(--pptx-primary-foreground);
1088
+ }
1089
+ .pptxv-modal-danger-btn {
1090
+ width: 100%;
1091
+ padding: 8px 12px;
1092
+ border: 1px solid rgb(239 68 68 / 0.3);
1093
+ border-radius: var(--pptx-radius);
1094
+ background: rgb(239 68 68 / 0.1);
1095
+ color: #f87171;
1096
+ font-size: 12px;
1097
+ font-weight: 500;
1098
+ cursor: pointer;
1099
+ }
1100
+ .pptxv-modal-danger-btn:hover { background: rgb(239 68 68 / 0.2); }
1101
+
1102
+ /* ── Remote-cursor overlay ────────────────────────────────────────────── */
1103
+ .pptxv-collab-cursors {
1104
+ position: absolute;
1105
+ inset: 0;
1106
+ pointer-events: none;
1107
+ overflow: visible;
1108
+ z-index: 20;
1109
+ }
1110
+ .pptxv-collab-cursor {
1111
+ position: absolute;
1112
+ top: 0;
1113
+ left: 0;
1114
+ pointer-events: none;
1115
+ will-change: transform;
1116
+ transition: transform 90ms linear;
1117
+ }
1118
+ .pptxv-collab-pointer { display: block; filter: drop-shadow(0 1px 1px rgb(0 0 0 / 0.35)); }
1119
+ .pptxv-collab-label {
1120
+ position: absolute;
1121
+ top: 16px;
1122
+ left: 12px;
1123
+ max-width: 150px;
1124
+ padding: 2px 6px;
1125
+ border-radius: 4px;
1126
+ color: #ffffff;
1127
+ font-size: 10px;
1128
+ font-weight: 500;
1129
+ line-height: 1.2;
1130
+ white-space: nowrap;
1131
+ overflow: hidden;
1132
+ text-overflow: ellipsis;
1133
+ box-shadow: 0 1px 2px rgb(0 0 0 / 0.3);
1134
+ }
1135
+
1136
+ /* ── Toolbar collaboration-status pill ───────────────────────────────── */
1137
+ .pptxv-collab-status {
1138
+ display: inline-flex;
1139
+ align-items: center;
1140
+ gap: 6px;
1141
+ padding: 0 6px;
1142
+ font-size: 11px;
1143
+ white-space: nowrap;
1144
+ }
1145
+ .pptxv-collab-status[hidden] { display: none; }
1146
+ .pptxv-collab-status-dot {
1147
+ width: 8px;
1148
+ height: 8px;
1149
+ border-radius: 50%;
1150
+ background: var(--pptx-muted-foreground);
1151
+ }
1152
+ .pptxv-collab-status-dot.is-connected { background: #22c55e; }
1153
+ .pptxv-collab-status-dot.is-connecting { background: #eab308; }
1154
+ .pptxv-collab-status-dot.is-error { background: #ef4444; }
1155
+ .pptxv-collab-status-text { color: var(--pptx-muted-foreground); }
1156
+ .pptxv-collab-status-retry {
1157
+ border: none;
1158
+ background: transparent;
1159
+ color: var(--pptx-primary);
1160
+ font-size: 11px;
1161
+ text-decoration: underline;
1162
+ cursor: pointer;
1163
+ }
1164
+ .pptxv-collab-status-retry[hidden] { display: none; }
1165
+
1166
+ /* ── Follow-mode bar ─────────────────────────────────────────────────── */
1167
+ .pptxv-follow-bar {
1168
+ position: absolute;
1169
+ left: 50%;
1170
+ bottom: 12px;
1171
+ z-index: 15;
1172
+ display: flex;
1173
+ flex-wrap: wrap;
1174
+ align-items: center;
1175
+ gap: 10px;
1176
+ max-width: calc(100% - 24px);
1177
+ padding: 6px 10px;
1178
+ border-radius: var(--pptx-radius);
1179
+ background: color-mix(in srgb, var(--pptx-card) 95%, transparent);
1180
+ color: var(--pptx-card-foreground);
1181
+ font-size: 12px;
1182
+ transform: translateX(-50%);
1183
+ box-shadow: 0 4px 16px rgb(0 0 0 / 0.25);
1184
+ }
1185
+ .pptxv-follow-bar[hidden] { display: none; }
1186
+ .pptxv-follow-status {
1187
+ display: inline-flex;
1188
+ align-items: center;
1189
+ gap: 6px;
1190
+ white-space: nowrap;
1191
+ color: var(--pptx-muted-foreground);
1192
+ }
1193
+ .pptxv-follow-stop {
1194
+ padding: 2px 8px;
1195
+ border: 1px solid var(--pptx-border);
1196
+ border-radius: var(--pptx-radius);
1197
+ background: transparent;
1198
+ color: var(--pptx-foreground);
1199
+ font-size: 11px;
1200
+ cursor: pointer;
1201
+ }
1202
+ .pptxv-follow-stop:hover { background: var(--pptx-muted); }
1203
+ .pptxv-follow-list {
1204
+ display: flex;
1205
+ align-items: center;
1206
+ gap: 6px;
1207
+ margin: 0;
1208
+ padding: 0;
1209
+ list-style: none;
1210
+ }
1211
+ .pptxv-follow-peer {
1212
+ display: inline-flex;
1213
+ align-items: center;
1214
+ gap: 6px;
1215
+ padding: 2px 8px 2px 2px;
1216
+ border: 1px solid transparent;
1217
+ border-radius: 9999px;
1218
+ background: color-mix(in srgb, var(--pptx-muted) 60%, transparent);
1219
+ color: var(--pptx-foreground);
1220
+ cursor: pointer;
1221
+ }
1222
+ .pptxv-follow-peer:hover { background: var(--pptx-muted); }
1223
+ .pptxv-follow-peer.is-following { border-color: var(--pptx-primary); background: color-mix(in srgb, var(--pptx-primary) 30%, transparent); }
1224
+ .pptxv-follow-avatar {
1225
+ display: inline-flex;
1226
+ align-items: center;
1227
+ justify-content: center;
1228
+ width: 22px;
1229
+ height: 22px;
1230
+ border-radius: 50%;
1231
+ color: #ffffff;
1232
+ font-size: 10px;
1233
+ font-weight: 600;
1234
+ line-height: 1;
1235
+ }
1236
+ .pptxv-follow-name { max-width: 120px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1237
+
1238
+ /* Presentation mode hides all collaboration chrome. */
1239
+ .pptxv.pptxv-presenting .pptxv-collab-status,
1240
+ .pptxv.pptxv-presenting .pptxv-follow-bar { display: none; }
1241
+
1242
+
1243
+ .pptxv-presentation-touch-controls { display: none; }
1244
+ @media (any-pointer: coarse) {
1245
+ .pptxv.pptxv-presenting .pptxv-presentation-touch-controls { display: contents; }
1246
+ .pptxv-presentation-touch-controls .pptxv-btn { position: fixed; z-index: 90; display: flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0; border: 0; border-radius: 999px; background: rgb(0 0 0 / 55%); box-shadow: 0 4px 14px rgb(0 0 0 / 30%); color: #fff; font-size: 28px; touch-action: manipulation; }
1247
+ .pptxv-presentation-touch-controls .pptxv-btn:active { background: rgb(0 0 0 / 75%); }
1248
+ .pptxv-presentation-touch-controls .pptxv-btn:disabled { opacity: .3; }
1249
+ .pptxv-presentation-touch-controls svg { width: 26px; height: 26px; }
1250
+ .pptxv-presentation-touch-exit { top: calc(env(safe-area-inset-top, 0px) + 8px); right: calc(env(safe-area-inset-right, 0px) + 8px); }
1251
+ .pptxv-presentation-touch-prev { top: 50%; left: calc(env(safe-area-inset-left, 0px) + 8px); transform: translateY(-50%); }
1252
+ .pptxv-presentation-touch-next { top: 50%; right: calc(env(safe-area-inset-right, 0px) + 8px); transform: translateY(-50%); }
1253
+ .pptxv-presentation-touch-counter { position: fixed; z-index: 90; bottom: calc(env(safe-area-inset-bottom, 0px) + 8px); left: 50%; padding: 4px 12px; border-radius: 999px; background: rgb(0 0 0 / 55%); color: #fff; font: 12px ui-monospace, monospace; font-variant-numeric: tabular-nums; pointer-events: none; transform: translateX(-50%); }
1254
+ }
1255
+
1256
+
1257
+ .pptxv-mobile-toolbar, .pptxv-mobile-actions { display: none; }
1258
+ @media (max-width: 767px), (max-width: 1023px) and (max-height: 520px) {
1259
+ .pptxv-ribbon { display: none; }
1260
+ .pptxv-mobile-toolbar { position: relative; z-index: 20; display: flex; flex: none; align-items: center; gap: 4px; min-height: 52px; padding: max(env(safe-area-inset-top), 0px) 8px 4px; border-bottom: 1px solid var(--pptx-border); background: color-mix(in srgb, var(--pptx-muted) 55%, var(--pptx-card)); }
1261
+ .pptxv-mobile-toolbar-btn { display: inline-flex; align-items: center; justify-content: center; min-width: 44px; min-height: 44px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: var(--pptx-foreground); touch-action: manipulation; }
1262
+ .pptxv-mobile-toolbar-btn:hover:not(:disabled) { background: var(--pptx-accent); }
1263
+ .pptxv-mobile-toolbar-btn:disabled { opacity: .4; }
1264
+ .pptxv-mobile-toolbar-btn svg { width: 20px; height: 20px; }
1265
+ .pptxv-mobile-toolbar-spacer { flex: 1; }
1266
+ .pptxv-mobile-present { color: var(--pptx-primary); }
1267
+ .pptxv-mobile-toolbar-collaboration { display: flex; }
1268
+ .pptxv-mobile-toolbar-collaboration[hidden], .pptxv-mobile-toolbar-collaboration:empty { display: none; }
1269
+ .pptxv-mobile-share { min-width: 44px; background: var(--pptx-primary); color: var(--pptx-primary-foreground); }
1270
+ .pptxv-mobile-actions { display: contents; }
1271
+ .pptxv-mobile-actions > nav { position: relative; z-index: 50; display: flex; flex: none; min-height: 64px; padding-bottom: env(safe-area-inset-bottom); border-top: 1px solid var(--pptx-border); background: var(--pptx-card); }
1272
+ .pptxv-mobile-actions > nav button { position: relative; display: flex; flex: 1; flex-direction: column; align-items: center; justify-content: center; gap: 2px; min-width: 44px; border: 0; background: transparent; color: var(--pptx-muted-foreground); font-size: 10px; touch-action: manipulation; }
1273
+ .pptxv-mobile-actions > nav button svg { width: 20px; height: 20px; }
1274
+ .pptxv-mobile-actions > nav button[aria-pressed='true'] { color: var(--pptx-primary); }
1275
+ .pptxv-mobile-sheet-host { position: absolute; z-index: 48; inset: 0 0 64px; display: flex; align-items: end; }
1276
+ .pptxv-mobile-sheet-host[hidden] { display: none; }
1277
+ .pptxv-mobile-sheet-backdrop { position: absolute; inset: 0; width: 100%; border: 0; background: rgb(0 0 0 / 40%); }
1278
+ .pptxv-mobile-sheet { position: relative; display: flex; flex-direction: column; width: 100%; max-height: min(70dvh, 620px); border: 1px solid var(--pptx-border); border-bottom: 0; border-radius: 16px 16px 0 0; background: var(--pptx-background); box-shadow: 0 -12px 36px rgb(0 0 0 / 35%); transition: transform 150ms ease-out; }
1279
+ .pptxv-mobile-sheet-header { display: grid; justify-items: center; gap: 5px; padding: 8px 16px 10px; border-bottom: 1px solid var(--pptx-border); cursor: grab; touch-action: none; }
1280
+ .pptxv-mobile-sheet-handle { width: 40px; height: 4px; border-radius: 2px; background: var(--pptx-muted-foreground); opacity: .45; }
1281
+ .pptxv-mobile-sheet-body { display: flex; flex-wrap: wrap; gap: 8px; overflow: auto; padding: 12px; overscroll-behavior: contain; }
1282
+ .pptxv-mobile-sheet-body > button { min-height: 44px; padding: 8px 12px; border: 1px solid var(--pptx-border); border-radius: 8px; background: var(--pptx-muted); color: inherit; }
1283
+ .pptxv-mobile-slide-list { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; width: 100%; }
1284
+ .pptxv-mobile-comment { display: grid; gap: 6px; padding: 8px 0; border-bottom: 1px solid var(--pptx-border); }
1285
+ .pptxv-mobile-comment textarea, .pptxv-mobile-comment-add textarea { box-sizing: border-box; width: 100%; min-height: 58px; padding: 8px; border: 1px solid var(--pptx-border); border-radius: var(--pptx-radius); background: var(--pptx-background); color: var(--pptx-foreground); font: inherit; }
1286
+ .pptxv-mobile-comment-actions { display: flex; flex-wrap: wrap; gap: 6px; }
1287
+ .pptxv-mobile-comment-actions button, .pptxv-mobile-comment-add button { min-height: 36px; padding: 6px 10px; border: 1px solid var(--pptx-border); border-radius: var(--pptx-radius); background: var(--pptx-muted); color: var(--pptx-foreground); }
1288
+ .pptxv-mobile-comment-add { display: grid; gap: 6px; padding-top: 10px; }
1289
+ .pptxv-mobile-slide-list button { min-height: 44px; border: 1px solid var(--pptx-border); border-radius: 8px; background: var(--pptx-muted); color: inherit; }
1290
+ .pptxv-mobile-slide-list button.is-active { border-color: var(--pptx-primary); color: var(--pptx-primary); }
1291
+ .pptxv-mobile-sheet .pptxv-inspector { display: flex; width: 100%; max-height: 55dvh; border: 0; }
1292
+ .pptxv.pptxv-presenting .pptxv-mobile-toolbar,
1293
+ .pptxv.pptxv-presenting .pptxv-mobile-actions > nav,
1294
+ .pptxv.pptxv-presenting .pptxv-mobile-sheet-host { display: none; }
1295
+ }
1296
+