@blendviewer/vision-scope 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 (87) hide show
  1. package/README.md +95 -0
  2. package/dist/index.js +187288 -0
  3. package/dist/nestcad-envmaps/citadella/negx.jpg +0 -0
  4. package/dist/nestcad-envmaps/citadella/negy.jpg +0 -0
  5. package/dist/nestcad-envmaps/citadella/negz.jpg +0 -0
  6. package/dist/nestcad-envmaps/citadella/posx.jpg +0 -0
  7. package/dist/nestcad-envmaps/citadella/posy.jpg +0 -0
  8. package/dist/nestcad-envmaps/citadella/posz.jpg +0 -0
  9. package/dist/nestcad-envmaps/citadella/readme.txt +13 -0
  10. package/dist/nestcad-envmaps/citadella.jpg +0 -0
  11. package/dist/nestcad-envmaps/fishermans_bastion/negx.jpg +0 -0
  12. package/dist/nestcad-envmaps/fishermans_bastion/negy.jpg +0 -0
  13. package/dist/nestcad-envmaps/fishermans_bastion/negz.jpg +0 -0
  14. package/dist/nestcad-envmaps/fishermans_bastion/posx.jpg +0 -0
  15. package/dist/nestcad-envmaps/fishermans_bastion/posy.jpg +0 -0
  16. package/dist/nestcad-envmaps/fishermans_bastion/posz.jpg +0 -0
  17. package/dist/nestcad-envmaps/fishermans_bastion/readme.txt +13 -0
  18. package/dist/nestcad-envmaps/fishermans_bastion.jpg +0 -0
  19. package/dist/nestcad-envmaps/ice_river/negx.jpg +0 -0
  20. package/dist/nestcad-envmaps/ice_river/negy.jpg +0 -0
  21. package/dist/nestcad-envmaps/ice_river/negz.jpg +0 -0
  22. package/dist/nestcad-envmaps/ice_river/posx.jpg +0 -0
  23. package/dist/nestcad-envmaps/ice_river/posy.jpg +0 -0
  24. package/dist/nestcad-envmaps/ice_river/posz.jpg +0 -0
  25. package/dist/nestcad-envmaps/ice_river/readme.txt +13 -0
  26. package/dist/nestcad-envmaps/ice_river.jpg +0 -0
  27. package/dist/nestcad-envmaps/maskonaive/negx.jpg +0 -0
  28. package/dist/nestcad-envmaps/maskonaive/negy.jpg +0 -0
  29. package/dist/nestcad-envmaps/maskonaive/negz.jpg +0 -0
  30. package/dist/nestcad-envmaps/maskonaive/posx.jpg +0 -0
  31. package/dist/nestcad-envmaps/maskonaive/posy.jpg +0 -0
  32. package/dist/nestcad-envmaps/maskonaive/posz.jpg +0 -0
  33. package/dist/nestcad-envmaps/maskonaive/readme.txt +13 -0
  34. package/dist/nestcad-envmaps/maskonaive.jpg +0 -0
  35. package/dist/nestcad-envmaps/noimage.jpg +0 -0
  36. package/dist/nestcad-envmaps/park/1.png +0 -0
  37. package/dist/nestcad-envmaps/park/2.png +0 -0
  38. package/dist/nestcad-envmaps/park/3.png +0 -0
  39. package/dist/nestcad-envmaps/park/4.png +0 -0
  40. package/dist/nestcad-envmaps/park/5.png +0 -0
  41. package/dist/nestcad-envmaps/park/6.png +0 -0
  42. package/dist/nestcad-envmaps/park/7.png +0 -0
  43. package/dist/nestcad-envmaps/park/negx.jpg +0 -0
  44. package/dist/nestcad-envmaps/park/negy.jpg +0 -0
  45. package/dist/nestcad-envmaps/park/negz.jpg +0 -0
  46. package/dist/nestcad-envmaps/park/posx.jpg +0 -0
  47. package/dist/nestcad-envmaps/park/posy.jpg +0 -0
  48. package/dist/nestcad-envmaps/park/posz.jpg +0 -0
  49. package/dist/nestcad-envmaps/park/readme.txt +13 -0
  50. package/dist/nestcad-envmaps/park.jpg +0 -0
  51. package/dist/nestcad-envmaps/teide/negx.jpg +0 -0
  52. package/dist/nestcad-envmaps/teide/negy.jpg +0 -0
  53. package/dist/nestcad-envmaps/teide/negz.jpg +0 -0
  54. package/dist/nestcad-envmaps/teide/posx.jpg +0 -0
  55. package/dist/nestcad-envmaps/teide/posy.jpg +0 -0
  56. package/dist/nestcad-envmaps/teide/posz.jpg +0 -0
  57. package/dist/nestcad-envmaps/teide/readme.txt +13 -0
  58. package/dist/nestcad-envmaps/teide.jpg +0 -0
  59. package/dist/nestcad-loaders/draco.license.md +252 -0
  60. package/dist/nestcad-loaders/draco_decoder.js +118 -0
  61. package/dist/nestcad-loaders/draco_decoder.wasm +0 -0
  62. package/dist/nestcad-loaders/occt-import-js-worker.js +15 -0
  63. package/dist/nestcad-loaders/occt-import-js.js +21 -0
  64. package/dist/nestcad-loaders/occt-import-js.license.md +504 -0
  65. package/dist/nestcad-loaders/occt-import-js.wasm +0 -0
  66. package/dist/nestcad-loaders/rhino3dm.license.md +21 -0
  67. package/dist/nestcad-loaders/rhino3dm.min.js +21 -0
  68. package/dist/nestcad-loaders/rhino3dm.wasm +0 -0
  69. package/dist/nestcad-loaders/web-ifc-api-browser.js +54925 -0
  70. package/dist/nestcad-loaders/web-ifc.license.md +375 -0
  71. package/dist/nestcad-loaders/web-ifc.wasm +0 -0
  72. package/dist/samples/.gitkeep +3 -0
  73. package/dist/samples/config-sample.json +6 -0
  74. package/dist/samples/logo-sample.svg +4 -0
  75. package/dist/samples/readme-sample.md +10 -0
  76. package/dist/styles/archive.css +431 -0
  77. package/dist/styles/code.css +119 -0
  78. package/dist/styles/document.css +1158 -0
  79. package/dist/styles/image.css +77 -0
  80. package/dist/styles/loading.css +124 -0
  81. package/dist/styles/media.css +99 -0
  82. package/dist/styles/native-three.css +54 -0
  83. package/dist/styles/spatial.css +39 -0
  84. package/dist/styles/tabular.css +157 -0
  85. package/dist/ui-styles/ui.css +1171 -0
  86. package/dist/vision-scope.css +1 -0
  87. package/package.json +80 -0
@@ -0,0 +1,1158 @@
1
+ /* Document Renderer Styles */
2
+
3
+ .vision-scope-document {
4
+ width: 100%;
5
+ height: 100%;
6
+ min-height: 0;
7
+ overflow: hidden;
8
+ background: #eeeeee;
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
10
+ sans-serif;
11
+ }
12
+
13
+ /* PDF viewport fills the shell without propagating intrinsic height to VisionScope chrome */
14
+ .vision-scope-viewport.vision-scope-document.vision-scope-pdf {
15
+ display: flex;
16
+ flex-direction: column;
17
+ min-height: 0;
18
+ }
19
+
20
+ .vision-scope-viewport.vision-scope-document.vision-scope-pdf > .pdf-viewer-layout {
21
+ flex: 1 1 auto;
22
+ min-height: 0;
23
+ }
24
+
25
+ /* PDF Viewer Layout */
26
+ .pdf-viewer-layout {
27
+ width: 100%;
28
+ height: 100%;
29
+ display: flex;
30
+ flex-direction: column;
31
+ overflow: hidden;
32
+ min-height: 0;
33
+ flex: 1 1 auto;
34
+ background: #eeeeee;
35
+ }
36
+
37
+ /* Custom Scrollbar Styles (Ultra-thin & Auto-hide) */
38
+ .pdf-sidebar::-webkit-scrollbar,
39
+ .pdf-main-viewer::-webkit-scrollbar {
40
+ width: 3px !important;
41
+ height: 3px !important;
42
+ }
43
+
44
+ .pdf-sidebar::-webkit-scrollbar-track,
45
+ .pdf-main-viewer::-webkit-scrollbar-track {
46
+ background: transparent !important;
47
+ }
48
+
49
+ .pdf-sidebar::-webkit-scrollbar-thumb,
50
+ .pdf-main-viewer::-webkit-scrollbar-thumb {
51
+ background: transparent !important;
52
+ border-radius: 2px;
53
+ transition: background 0.3s ease;
54
+ }
55
+
56
+ /* Show scrollbar on hover */
57
+ .pdf-sidebar:hover::-webkit-scrollbar-thumb,
58
+ .pdf-main-viewer:hover::-webkit-scrollbar-thumb {
59
+ background: rgba(0, 0, 0, 0.25) !important;
60
+ }
61
+
62
+ .pdf-sidebar::-webkit-scrollbar-thumb:hover,
63
+ .pdf-main-viewer::-webkit-scrollbar-thumb:hover {
64
+ background: rgba(0, 0, 0, 0.4) !important;
65
+ }
66
+
67
+ /* Firefox Scrollbar */
68
+ .pdf-sidebar,
69
+ .pdf-main-viewer {
70
+ scrollbar-width: thin !important;
71
+ scrollbar-color: transparent transparent !important;
72
+ }
73
+
74
+ .pdf-sidebar:hover,
75
+ .pdf-main-viewer:hover {
76
+ scrollbar-color: rgba(0, 0, 0, 0.25) transparent !important;
77
+ }
78
+
79
+ /* Custom Toolbar — 与主内容区 .pdf-main-viewer 背景一致,无分割线与投影 */
80
+ .pdf-custom-toolbar {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ padding: 4px 16px;
85
+ background: #eeeeee;
86
+ border-bottom: none;
87
+ flex-shrink: 0;
88
+ box-shadow: none;
89
+ }
90
+
91
+ .pdf-toolbar-left,
92
+ .pdf-toolbar-center,
93
+ .pdf-toolbar-right {
94
+ display: flex;
95
+ align-items: center;
96
+ gap: 8px;
97
+ flex: 1;
98
+ }
99
+
100
+ .pdf-toolbar-left {
101
+ justify-content: flex-start;
102
+ }
103
+
104
+ .pdf-toolbar-center {
105
+ justify-content: center;
106
+ }
107
+
108
+ .pdf-toolbar-right {
109
+ justify-content: flex-end;
110
+ }
111
+
112
+ /* Icon-only — match VisionScope .vsui-btn (no white tile; hover = soft gray) */
113
+ button.pdf-toolbar-btn {
114
+ appearance: none;
115
+ -webkit-appearance: none;
116
+ font: inherit;
117
+ line-height: 1;
118
+ }
119
+
120
+ button.pdf-toolbar-btn::-moz-focus-inner {
121
+ border: 0;
122
+ padding: 0;
123
+ }
124
+
125
+ .pdf-toolbar-btn {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ width: 24px;
130
+ height: 24px;
131
+ padding: 0;
132
+ margin: 0;
133
+ background: transparent;
134
+ border: none;
135
+ border-radius: 0;
136
+ color: rgba(26, 26, 26, 0.88);
137
+ cursor: pointer;
138
+ transition:
139
+ color 0.15s ease,
140
+ opacity 0.15s ease,
141
+ background-color 0.15s ease,
142
+ border-radius 0.15s ease;
143
+ box-shadow: none;
144
+ -webkit-tap-highlight-color: transparent;
145
+ }
146
+
147
+ .pdf-toolbar-btn:focus {
148
+ outline: none;
149
+ }
150
+
151
+ .pdf-toolbar-btn:focus-visible {
152
+ outline: 2px solid rgba(0, 0, 0, 0.2);
153
+ outline-offset: 2px;
154
+ }
155
+
156
+ .pdf-toolbar-btn:hover {
157
+ color: #111;
158
+ background: rgba(0, 0, 0, 0.08);
159
+ border-radius: 6px;
160
+ }
161
+
162
+ .pdf-toolbar-btn:active {
163
+ color: #111;
164
+ background: rgba(0, 0, 0, 0.08);
165
+ border-radius: 6px;
166
+ }
167
+
168
+ .pdf-toolbar-btn svg {
169
+ display: block;
170
+ flex-shrink: 0;
171
+ width: 16px;
172
+ height: 16px;
173
+ filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.18));
174
+ }
175
+
176
+ .pdf-page-info {
177
+ display: flex;
178
+ align-items: center;
179
+ gap: 6px;
180
+ font-size: 12px;
181
+ font-weight: 500;
182
+ color: #1a1a1a;
183
+ min-width: 72px;
184
+ justify-content: center;
185
+ }
186
+
187
+ .pdf-zoom-level {
188
+ font-size: 13px;
189
+ color: #1a1a1a;
190
+ font-weight: 500;
191
+ min-width: 50px;
192
+ text-align: center;
193
+ }
194
+
195
+ /* Main Content */
196
+ .pdf-main-content {
197
+ flex: 1 1 0;
198
+ display: flex;
199
+ overflow: hidden;
200
+ min-height: 0;
201
+ min-width: 0;
202
+ }
203
+
204
+ /* Sidebar rail: equal top/bottom inset to the main row (floating card); keep modest gap */
205
+ .pdf-sidebar-outer {
206
+ flex-shrink: 0;
207
+ align-self: stretch;
208
+ display: flex;
209
+ flex-direction: column;
210
+ box-sizing: border-box;
211
+ width: 228px;
212
+ padding: 16px 12px 16px 16px;
213
+ overflow: hidden;
214
+ transition:
215
+ width 0.22s ease,
216
+ padding 0.22s ease,
217
+ opacity 0.2s ease;
218
+ }
219
+
220
+ .pdf-viewer-layout.sidebar-collapsed .pdf-sidebar-outer {
221
+ width: 0;
222
+ padding-left: 0;
223
+ padding-right: 0;
224
+ opacity: 0;
225
+ pointer-events: none;
226
+ }
227
+
228
+ /* Sidebar (Thumbnails) — white card with shadow inside the rail */
229
+ .pdf-sidebar {
230
+ width: 200px;
231
+ flex: 1;
232
+ min-height: 0;
233
+ background: #ffffff;
234
+ border-radius: 10px;
235
+ box-shadow:
236
+ 0 2px 12px rgba(0, 0, 0, 0.08),
237
+ 0 1px 3px rgba(0, 0, 0, 0.06);
238
+ border: none;
239
+ overflow-y: auto;
240
+ overflow-x: hidden;
241
+ }
242
+
243
+ .pdf-thumbnails-title {
244
+ padding: 12px 16px;
245
+ font-size: 14px;
246
+ font-weight: 600;
247
+ color: #374151;
248
+ border-bottom: 1px solid #e5e7eb;
249
+ }
250
+
251
+ .pdf-thumbnail {
252
+ padding: 12px;
253
+ cursor: pointer;
254
+ border-bottom: 1px solid #f3f4f6;
255
+ transition: background 0.2s;
256
+ position: relative;
257
+ }
258
+
259
+ .pdf-thumbnail:hover {
260
+ background: #f3f4f6;
261
+ }
262
+
263
+ .pdf-thumbnail.active {
264
+ background: #e0f2fe;
265
+ border-left: 4px solid #3b82f6;
266
+ }
267
+
268
+ .pdf-thumbnail canvas {
269
+ width: 100%;
270
+ height: auto;
271
+ display: block;
272
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
273
+ }
274
+
275
+ .pdf-thumbnail-label {
276
+ text-align: center;
277
+ margin-top: 8px;
278
+ font-size: 12px;
279
+ color: #6b7280;
280
+ font-weight: 500;
281
+ }
282
+
283
+ /* Main Viewer — only inner vertical scroll; no outer horizontal/vertical bars on this panel */
284
+ .pdf-main-viewer {
285
+ flex: 1;
286
+ min-width: 0;
287
+ min-height: 0;
288
+ overflow-x: hidden;
289
+ overflow-y: auto;
290
+ display: flex;
291
+ justify-content: center;
292
+ align-items: flex-start;
293
+ padding: 24px;
294
+ background: #eeeeee;
295
+ }
296
+
297
+ /* PDF main column — same flex boundary pattern as ppt-main-viewer-wrap */
298
+ .vision-scope-pdf .pdf-main-viewer-wrap {
299
+ position: relative;
300
+ flex: 1 1 0;
301
+ min-width: 0;
302
+ min-height: 0;
303
+ display: flex;
304
+ flex-direction: column;
305
+ overflow: hidden;
306
+ }
307
+
308
+ .vision-scope-pdf .pdf-main-viewer-wrap > .pdf-main-viewer {
309
+ flex: 1 1 0;
310
+ min-height: 0;
311
+ }
312
+
313
+ /* Continuous scroll: scroll stays inside the wrap; outer shell never grows with page stack */
314
+ .vision-scope-pdf .pdf-main-viewer.continuous-scroll {
315
+ padding: 0;
316
+ overflow: hidden;
317
+ display: flex;
318
+ flex-direction: column;
319
+ align-items: stretch;
320
+ justify-content: flex-start;
321
+ }
322
+
323
+ .pdf-main-viewer-scroll {
324
+ flex: 1 1 0;
325
+ min-height: 0;
326
+ width: 100%;
327
+ overflow-x: hidden;
328
+ overflow-y: auto;
329
+ padding: 24px;
330
+ box-sizing: border-box;
331
+ -webkit-overflow-scrolling: touch;
332
+ overscroll-behavior: contain;
333
+ overscroll-behavior-y: contain;
334
+ }
335
+
336
+ .pdf-main-viewer.continuous-scroll .pdf-main-viewer-scroll::-webkit-scrollbar,
337
+ .pdf-main-viewer-scroll::-webkit-scrollbar {
338
+ width: 3px !important;
339
+ height: 3px !important;
340
+ }
341
+
342
+ .pdf-main-viewer.continuous-scroll .pdf-main-viewer-scroll::-webkit-scrollbar-thumb,
343
+ .pdf-main-viewer-scroll::-webkit-scrollbar-thumb {
344
+ background: transparent !important;
345
+ border-radius: 2px;
346
+ transition: background 0.3s ease;
347
+ }
348
+
349
+ .pdf-main-viewer.continuous-scroll .pdf-main-viewer-scroll:hover::-webkit-scrollbar-thumb,
350
+ .pdf-main-viewer-scroll:hover::-webkit-scrollbar-thumb {
351
+ background: rgba(0, 0, 0, 0.25) !important;
352
+ }
353
+
354
+ .pdf-main-viewer.continuous-scroll .pdf-main-viewer-scroll,
355
+ .pdf-main-viewer-scroll {
356
+ scrollbar-width: thin !important;
357
+ scrollbar-color: transparent transparent !important;
358
+ }
359
+
360
+ .pdf-main-viewer.continuous-scroll .pdf-main-viewer-scroll:hover,
361
+ .pdf-main-viewer-scroll:hover {
362
+ scrollbar-color: rgba(0, 0, 0, 0.25) transparent !important;
363
+ }
364
+
365
+ .pdf-pages-scroll {
366
+ display: flex;
367
+ flex-direction: column;
368
+ align-items: center;
369
+ width: 100%;
370
+ flex-shrink: 0;
371
+ }
372
+
373
+ .pdf-page-slot {
374
+ position: relative;
375
+ width: 100%;
376
+ display: flex;
377
+ justify-content: center;
378
+ flex-shrink: 0;
379
+ overflow: hidden;
380
+ box-sizing: border-box;
381
+ }
382
+
383
+ .pdf-page-placeholder {
384
+ width: 100%;
385
+ height: 100%;
386
+ min-height: inherit;
387
+ border-radius: 2px;
388
+ background: rgba(255, 255, 255, 0.55);
389
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.12);
390
+ }
391
+
392
+ .pdf-main-canvas {
393
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
394
+ background: white;
395
+ display: block;
396
+ max-width: 100%;
397
+ height: auto;
398
+ }
399
+
400
+ /* PDF Text Layer for text selection */
401
+ .pdf-page-container {
402
+ position: relative;
403
+ display: inline-block;
404
+ max-width: 100%;
405
+ overflow: hidden;
406
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.3);
407
+ }
408
+
409
+ /* Reading Mode Styles */
410
+ .pdf-main-viewer.reading-mode {
411
+ background: #2a2a2a;
412
+ padding: 0;
413
+ display: flex;
414
+ align-items: center;
415
+ justify-content: center;
416
+ }
417
+
418
+ .pdf-double-page-container {
419
+ display: flex;
420
+ gap: 40px;
421
+ align-items: center;
422
+ justify-content: center;
423
+ padding: 40px;
424
+ animation: fadeIn 0.3s ease;
425
+ }
426
+
427
+ @keyframes fadeIn {
428
+ from {
429
+ opacity: 0;
430
+ transform: translateY(10px);
431
+ }
432
+ to {
433
+ opacity: 1;
434
+ transform: translateY(0);
435
+ }
436
+ }
437
+
438
+ .pdf-page-left,
439
+ .pdf-page-right {
440
+ flex-shrink: 0;
441
+ }
442
+
443
+ .pdf-custom-toolbar.hidden,
444
+ .pdf-sidebar-outer.hidden {
445
+ display: none !important;
446
+ }
447
+
448
+ .pdf-toolbar-btn.active {
449
+ color: #111;
450
+ background: rgba(0, 0, 0, 0.08);
451
+ border-radius: 6px;
452
+ }
453
+
454
+ .pdf-text-layer {
455
+ position: absolute;
456
+ left: 0;
457
+ top: 0;
458
+ right: 0;
459
+ bottom: 0;
460
+ overflow: hidden;
461
+ opacity: 1;
462
+ line-height: 1;
463
+ -webkit-text-size-adjust: none;
464
+ -moz-text-size-adjust: none;
465
+ text-size-adjust: none;
466
+ forced-color-adjust: none;
467
+ }
468
+
469
+ .pdf-text-layer span {
470
+ color: transparent;
471
+ position: absolute;
472
+ white-space: pre;
473
+ cursor: text;
474
+ transform-origin: 0% 0%;
475
+ }
476
+
477
+ .pdf-text-layer span::selection {
478
+ background: rgba(0, 100, 255, 0.3);
479
+ }
480
+
481
+ /* Text Styles */
482
+ .document-text {
483
+ max-width: 900px;
484
+ margin: 0 auto;
485
+ padding: 48px;
486
+ background: white;
487
+ border-radius: 8px;
488
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
489
+ font-family: 'Monaco', 'Menlo', 'Courier New', 'Consolas', monospace;
490
+ font-size: 14px;
491
+ line-height: 1.6;
492
+ color: #1a1a1a;
493
+ white-space: pre-wrap;
494
+ word-wrap: break-word;
495
+ overflow-wrap: break-word;
496
+ }
497
+
498
+ /* Plain text + Markdown — scroll inside the document viewport (PDF uses .pdf-main-viewer) */
499
+ .vision-scope-document > .document-markdown,
500
+ .vision-scope-document > .document-text {
501
+ height: 100%;
502
+ max-height: 100%;
503
+ min-height: 0;
504
+ overflow-x: hidden;
505
+ overflow-y: auto;
506
+ -webkit-overflow-scrolling: touch;
507
+ }
508
+
509
+ .vision-scope-document > .document-markdown::-webkit-scrollbar,
510
+ .vision-scope-document > .document-text::-webkit-scrollbar {
511
+ width: 6px;
512
+ }
513
+
514
+ .vision-scope-document > .document-markdown::-webkit-scrollbar-track,
515
+ .vision-scope-document > .document-text::-webkit-scrollbar-track {
516
+ background: transparent;
517
+ }
518
+
519
+ .vision-scope-document > .document-markdown::-webkit-scrollbar-thumb,
520
+ .vision-scope-document > .document-text::-webkit-scrollbar-thumb {
521
+ background: rgba(0, 0, 0, 0.2);
522
+ border-radius: 3px;
523
+ }
524
+
525
+ .vision-scope-document > .document-markdown::-webkit-scrollbar-thumb:hover,
526
+ .vision-scope-document > .document-text::-webkit-scrollbar-thumb:hover {
527
+ background: rgba(0, 0, 0, 0.35);
528
+ }
529
+
530
+ /* Markdown Styles */
531
+ .document-markdown {
532
+ max-width: 900px;
533
+ margin: 0 auto;
534
+ padding: 48px;
535
+ background: white;
536
+ border-radius: 8px;
537
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
538
+ font-size: 16px;
539
+ line-height: 1.7;
540
+ color: #1a1a1a;
541
+ }
542
+
543
+ .document-markdown h1,
544
+ .document-markdown h2,
545
+ .document-markdown h3,
546
+ .document-markdown h4,
547
+ .document-markdown h5,
548
+ .document-markdown h6 {
549
+ margin-top: 24px;
550
+ margin-bottom: 16px;
551
+ font-weight: 600;
552
+ line-height: 1.25;
553
+ color: #1a1a1a;
554
+ }
555
+
556
+ .document-markdown h1 {
557
+ font-size: 32px;
558
+ border-bottom: 1px solid #eaeaea;
559
+ padding-bottom: 8px;
560
+ }
561
+
562
+ .document-markdown h2 {
563
+ font-size: 24px;
564
+ border-bottom: 1px solid #eaeaea;
565
+ padding-bottom: 6px;
566
+ }
567
+
568
+ .document-markdown h3 {
569
+ font-size: 20px;
570
+ }
571
+
572
+ .document-markdown h4 {
573
+ font-size: 18px;
574
+ }
575
+
576
+ .document-markdown p {
577
+ margin: 16px 0;
578
+ }
579
+
580
+ .document-markdown a {
581
+ color: #0366d6;
582
+ text-decoration: none;
583
+ }
584
+
585
+ .document-markdown a:hover {
586
+ text-decoration: underline;
587
+ }
588
+
589
+ .document-markdown ul,
590
+ .document-markdown ol {
591
+ margin: 16px 0;
592
+ padding-left: 32px;
593
+ }
594
+
595
+ .document-markdown li {
596
+ margin: 8px 0;
597
+ }
598
+
599
+ .document-markdown blockquote {
600
+ margin: 16px 0;
601
+ padding: 0 16px;
602
+ border-left: 4px solid #ddd;
603
+ color: #666;
604
+ }
605
+
606
+ .document-markdown code {
607
+ background: #f6f8fa;
608
+ border-radius: 4px;
609
+ padding: 2px 6px;
610
+ font-size: 85%;
611
+ font-family: 'Monaco', 'Menlo', 'Courier New', 'Consolas', monospace;
612
+ }
613
+
614
+ .document-markdown pre {
615
+ background: #f6f8fa;
616
+ border-radius: 6px;
617
+ padding: 16px;
618
+ overflow-x: auto;
619
+ margin: 16px 0;
620
+ }
621
+
622
+ .document-markdown pre code {
623
+ background: transparent;
624
+ padding: 0;
625
+ font-size: 13px;
626
+ line-height: 1.6;
627
+ }
628
+
629
+ .document-markdown table {
630
+ border-collapse: collapse;
631
+ width: 100%;
632
+ margin: 16px 0;
633
+ }
634
+
635
+ .document-markdown th,
636
+ .document-markdown td {
637
+ border: 1px solid #ddd;
638
+ padding: 8px 12px;
639
+ text-align: left;
640
+ }
641
+
642
+ .document-markdown th {
643
+ background: #f6f8fa;
644
+ font-weight: 600;
645
+ }
646
+
647
+ .document-markdown img {
648
+ max-width: 100%;
649
+ height: auto;
650
+ border-radius: 4px;
651
+ margin: 16px 0;
652
+ }
653
+
654
+ .document-markdown hr {
655
+ border: none;
656
+ border-top: 1px solid #eaeaea;
657
+ margin: 24px 0;
658
+ }
659
+
660
+ /* Loading State */
661
+ .vision-scope-loading {
662
+ display: flex;
663
+ flex-direction: column;
664
+ align-items: center;
665
+ justify-content: center;
666
+ height: 100%;
667
+ color: #666;
668
+ }
669
+
670
+ .loading-spinner {
671
+ width: 48px;
672
+ height: 48px;
673
+ border: 4px solid #e0e0e0;
674
+ border-top-color: #666;
675
+ border-radius: 50%;
676
+ animation: spin 1s linear infinite;
677
+ }
678
+
679
+ .loading-text {
680
+ margin-top: 16px;
681
+ font-size: 14px;
682
+ color: #999;
683
+ }
684
+
685
+ @keyframes spin {
686
+ to {
687
+ transform: rotate(360deg);
688
+ }
689
+ }
690
+
691
+ /* Error State */
692
+ .vision-scope-error {
693
+ display: flex;
694
+ flex-direction: column;
695
+ align-items: center;
696
+ justify-content: center;
697
+ height: 100%;
698
+ padding: 48px;
699
+ text-align: center;
700
+ }
701
+
702
+ .error-icon {
703
+ font-size: 64px;
704
+ margin-bottom: 16px;
705
+ }
706
+
707
+ .error-message {
708
+ font-size: 18px;
709
+ font-weight: 600;
710
+ color: #d32f2f;
711
+ margin-bottom: 8px;
712
+ }
713
+
714
+ .error-details {
715
+ font-size: 14px;
716
+ color: #666;
717
+ max-width: 500px;
718
+ }
719
+
720
+ /* Responsive */
721
+ @media (max-width: 768px) {
722
+ .vision-scope-pdf .pdf-sidebar-outer,
723
+ .vision-scope-presentation .ppt-sidebar-outer {
724
+ width: 200px;
725
+ padding: 12px;
726
+ }
727
+
728
+ .vision-scope-pdf .pdf-page-thumb,
729
+ .vision-scope-presentation .ppt-slide-thumb {
730
+ width: 168px;
731
+ }
732
+
733
+ .vision-scope-pdf .pdf-thumbnail-limit-note,
734
+ .vision-scope-presentation .ppt-thumbnail-limit-note {
735
+ width: 168px;
736
+ }
737
+
738
+ .pdf-sidebar-outer {
739
+ width: 178px;
740
+ padding: 16px 8px 16px 12px;
741
+ }
742
+
743
+ .pdf-sidebar {
744
+ width: 150px;
745
+ }
746
+
747
+ .pdf-custom-toolbar {
748
+ padding: 4px 12px;
749
+ }
750
+
751
+ .pdf-main-viewer {
752
+ padding: 16px;
753
+ }
754
+
755
+ .document-text,
756
+ .document-markdown {
757
+ padding: 24px;
758
+ }
759
+ }
760
+
761
+ /* PDF document viewer — sidebar aligned with presentation thumb rail */
762
+ .vision-scope-pdf .pdf-viewer-layout,
763
+ .vision-scope-pdf .pdf-main-content,
764
+ .vision-scope-pdf .pdf-main-viewer,
765
+ .vision-scope-pdf .pdf-sidebar-outer,
766
+ .vision-scope-pdf .pdf-page-sidebar {
767
+ background: #eeeeee;
768
+ }
769
+
770
+ .vision-scope-pdf .pdf-sidebar-outer {
771
+ width: 240px;
772
+ padding: 16px;
773
+ align-self: stretch;
774
+ }
775
+
776
+ .vision-scope-pdf .pdf-page-sidebar {
777
+ width: 100%;
778
+ flex: 1;
779
+ min-height: 0;
780
+ border-radius: 0;
781
+ box-shadow: none;
782
+ border: none;
783
+ background: transparent;
784
+ }
785
+
786
+ .vision-scope-pdf .pdf-thumbnails-title {
787
+ background: transparent;
788
+ border-bottom: none;
789
+ padding: 4px 4px 8px;
790
+ font-size: 12px;
791
+ font-weight: 600;
792
+ color: #6b7280;
793
+ }
794
+
795
+ .vision-scope-pdf .pdf-page-sidebar .pdf-thumb-list {
796
+ display: flex;
797
+ flex-direction: column;
798
+ align-items: center;
799
+ gap: 16px;
800
+ padding: 0;
801
+ }
802
+
803
+ .pdf-page-thumb {
804
+ position: relative;
805
+ flex-shrink: 0;
806
+ display: block;
807
+ width: 150px;
808
+ padding: 0;
809
+ margin: 0;
810
+ border: none;
811
+ border-radius: 6px;
812
+ overflow: hidden;
813
+ cursor: pointer;
814
+ background: #fff;
815
+ box-shadow: none;
816
+ transition: opacity 0.15s ease;
817
+ }
818
+
819
+ .pdf-page-thumb:hover:not(.is-active) {
820
+ opacity: 0.88;
821
+ }
822
+
823
+ .pdf-page-thumb.is-active {
824
+ opacity: 1;
825
+ }
826
+
827
+ .pdf-page-thumb:focus {
828
+ outline: none;
829
+ }
830
+
831
+ .pdf-page-thumb:focus-visible {
832
+ outline: none;
833
+ }
834
+
835
+ .pdf-page-thumb.is-active::after,
836
+ .ppt-slide-thumb.is-active::after {
837
+ content: '';
838
+ position: absolute;
839
+ top: 0;
840
+ left: 0;
841
+ bottom: 0;
842
+ width: 4px;
843
+ background: #3b82f6;
844
+ border-radius: 6px 0 0 6px;
845
+ pointer-events: none;
846
+ z-index: 3;
847
+ }
848
+
849
+ .pdf-page-thumb:focus-visible::before,
850
+ .ppt-slide-thumb:focus-visible::before {
851
+ content: '';
852
+ position: absolute;
853
+ inset: 0;
854
+ border-radius: 6px;
855
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.45);
856
+ pointer-events: none;
857
+ z-index: 2;
858
+ }
859
+
860
+ .pdf-page-thumb-preview {
861
+ display: block;
862
+ width: 100%;
863
+ overflow: hidden;
864
+ line-height: 0;
865
+ pointer-events: none;
866
+ user-select: none;
867
+ }
868
+
869
+ .pdf-page-thumb-preview canvas {
870
+ width: 100%;
871
+ height: auto;
872
+ display: block;
873
+ pointer-events: none;
874
+ }
875
+
876
+ .pdf-page-thumb-badge,
877
+ .ppt-slide-thumb-badge {
878
+ position: absolute;
879
+ right: 6px;
880
+ bottom: 4px;
881
+ z-index: 2;
882
+ padding: 2px 4px;
883
+ border-radius: 4px;
884
+ font-size: 9px;
885
+ font-weight: 500;
886
+ line-height: 1;
887
+ color: rgba(255, 255, 255, 0.85);
888
+ background: rgba(0, 0, 0, 0.3);
889
+ pointer-events: none;
890
+ transition: background-color 0.15s ease, color 0.15s ease;
891
+ }
892
+
893
+ .pdf-page-thumb:hover .pdf-page-thumb-badge,
894
+ .ppt-slide-thumb:hover .ppt-slide-thumb-badge {
895
+ background: rgba(0, 0, 0, 0.5);
896
+ }
897
+
898
+ .vision-scope-pdf .pdf-thumbnail-limit-note,
899
+ .vision-scope-presentation .ppt-thumbnail-limit-note {
900
+ width: 200px;
901
+ padding: 8px 0 4px;
902
+ font-size: 11px;
903
+ color: #6b7280;
904
+ text-align: center;
905
+ border-top: none;
906
+ }
907
+
908
+ /* PPTX presentation viewer (PresentationRenderer) */
909
+ .vision-scope-presentation .ppt-viewer-layout,
910
+ .vision-scope-presentation .pdf-main-content,
911
+ .vision-scope-presentation .ppt-main-viewer,
912
+ .vision-scope-presentation .ppt-sidebar-outer,
913
+ .vision-scope-presentation .ppt-slide-sidebar {
914
+ background: #eeeeee;
915
+ }
916
+
917
+ .vision-scope-presentation .ppt-viewer-layout {
918
+ position: relative;
919
+ }
920
+
921
+ .vision-scope-presentation .ppt-sidebar-outer {
922
+ width: 240px;
923
+ padding: 16px;
924
+ align-self: stretch;
925
+ }
926
+
927
+ .vision-scope-presentation .ppt-slide-sidebar {
928
+ width: 100%;
929
+ flex: 1;
930
+ min-height: 0;
931
+ border-radius: 0;
932
+ box-shadow: none;
933
+ border: none;
934
+ }
935
+
936
+ .vision-scope-presentation .pdf-thumbnails-title {
937
+ background: transparent;
938
+ border-bottom: none;
939
+ padding: 4px 4px 8px;
940
+ font-size: 12px;
941
+ font-weight: 600;
942
+ color: #6b7280;
943
+ }
944
+
945
+ .vision-scope-presentation .ppt-main-viewer-wrap {
946
+ position: relative;
947
+ flex: 1;
948
+ min-width: 0;
949
+ min-height: 0;
950
+ display: flex;
951
+ flex-direction: column;
952
+ }
953
+
954
+ .vision-scope-presentation .ppt-main-viewer {
955
+ position: relative;
956
+ flex: 1;
957
+ min-height: 0;
958
+ align-items: stretch;
959
+ justify-content: stretch;
960
+ padding: 0;
961
+ scroll-snap-type: y mandatory;
962
+ scroll-padding: 0;
963
+ overflow-y: scroll;
964
+ overflow-x: hidden;
965
+ }
966
+
967
+ .vision-scope-presentation .ppt-slide-stage {
968
+ width: 100%;
969
+ max-width: 100%;
970
+ min-height: min-content;
971
+ padding: 0;
972
+ box-sizing: border-box;
973
+ }
974
+
975
+ /* One slide per viewport — slot height set in JS via --ppt-slide-slot-height */
976
+ .vision-scope-presentation .ppt-slide-stage > [data-slide-index] {
977
+ height: var(--ppt-slide-slot-height, 100%);
978
+ min-height: var(--ppt-slide-slot-height, 100%);
979
+ max-height: var(--ppt-slide-slot-height, 100%);
980
+ margin-bottom: 0 !important;
981
+ overflow: hidden;
982
+ display: flex;
983
+ flex-direction: column;
984
+ align-items: center;
985
+ justify-content: center;
986
+ flex-shrink: 0;
987
+ scroll-snap-align: start;
988
+ scroll-snap-stop: always;
989
+ box-sizing: border-box;
990
+ }
991
+
992
+ /* SlideReport-style floating capsule toolbar */
993
+ .ppt-float-toolbar {
994
+ position: absolute;
995
+ bottom: 16px;
996
+ left: 50%;
997
+ transform: translateX(-50%);
998
+ z-index: 10;
999
+ display: flex;
1000
+ align-items: center;
1001
+ gap: 2px;
1002
+ padding: 6px 8px;
1003
+ border-radius: 12px;
1004
+ background: rgba(0, 0, 0, 0.6);
1005
+ backdrop-filter: blur(8px);
1006
+ -webkit-backdrop-filter: blur(8px);
1007
+ color: #fff;
1008
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.25);
1009
+ opacity: 0;
1010
+ pointer-events: none;
1011
+ transition: opacity 0.2s ease;
1012
+ }
1013
+
1014
+ .ppt-main-viewer-wrap:hover .ppt-float-toolbar,
1015
+ .ppt-main-viewer-wrap:focus-within .ppt-float-toolbar,
1016
+ .ppt-viewer-layout.is-playing .ppt-float-toolbar,
1017
+ .ppt-viewer-layout.is-fullscreen .ppt-float-toolbar {
1018
+ opacity: 1;
1019
+ pointer-events: auto;
1020
+ }
1021
+
1022
+ .ppt-float-btn {
1023
+ appearance: none;
1024
+ -webkit-appearance: none;
1025
+ display: inline-flex;
1026
+ align-items: center;
1027
+ justify-content: center;
1028
+ width: 28px;
1029
+ height: 28px;
1030
+ padding: 0;
1031
+ margin: 0;
1032
+ border: none;
1033
+ border-radius: 6px;
1034
+ background: transparent;
1035
+ color: inherit;
1036
+ cursor: pointer;
1037
+ transition: background-color 0.15s ease;
1038
+ }
1039
+
1040
+ .ppt-float-btn:hover:not(:disabled) {
1041
+ background: rgba(255, 255, 255, 0.15);
1042
+ }
1043
+
1044
+ .ppt-float-btn:disabled {
1045
+ opacity: 0.3;
1046
+ cursor: default;
1047
+ }
1048
+
1049
+ .ppt-float-btn:focus-visible {
1050
+ outline: 2px solid rgba(255, 255, 255, 0.5);
1051
+ outline-offset: 1px;
1052
+ }
1053
+
1054
+ .ppt-float-btn svg {
1055
+ display: block;
1056
+ flex-shrink: 0;
1057
+ }
1058
+
1059
+ .ppt-float-page {
1060
+ font-size: 13px;
1061
+ font-weight: 500;
1062
+ font-variant-numeric: tabular-nums;
1063
+ color: rgba(255, 255, 255, 0.85);
1064
+ min-width: 52px;
1065
+ text-align: center;
1066
+ user-select: none;
1067
+ padding: 0 4px;
1068
+ }
1069
+
1070
+ .ppt-float-divider {
1071
+ width: 1px;
1072
+ height: 16px;
1073
+ background: rgba(255, 255, 255, 0.25);
1074
+ margin: 0 4px;
1075
+ flex-shrink: 0;
1076
+ }
1077
+
1078
+ /* Auto-play / fullscreen — hide sidebar like SlideReport */
1079
+ .ppt-viewer-layout.is-playing .ppt-sidebar-outer {
1080
+ display: none !important;
1081
+ }
1082
+
1083
+ .ppt-viewer-layout.is-playing .ppt-main-viewer,
1084
+ .ppt-viewer-layout.is-fullscreen .ppt-main-viewer {
1085
+ background: #111;
1086
+ }
1087
+
1088
+ .ppt-main-viewer.is-fullscreen {
1089
+ cursor: pointer;
1090
+ }
1091
+
1092
+ .ppt-viewer-layout:fullscreen {
1093
+ background: #111;
1094
+ }
1095
+
1096
+ .ppt-viewer-layout:fullscreen .pdf-main-content {
1097
+ flex: 1;
1098
+ min-height: 0;
1099
+ }
1100
+
1101
+ /* Presentation thumbnail items — active state: right-side vertical bar only */
1102
+ .vision-scope-presentation .ppt-slide-sidebar .ppt-thumb-list {
1103
+ display: flex;
1104
+ flex-direction: column;
1105
+ align-items: center;
1106
+ gap: 16px;
1107
+ padding: 0;
1108
+ }
1109
+
1110
+ .ppt-slide-thumb {
1111
+ position: relative;
1112
+ flex-shrink: 0;
1113
+ display: block;
1114
+ width: 150px;
1115
+ aspect-ratio: 16 / 9;
1116
+ padding: 0;
1117
+ margin: 0;
1118
+ border: none;
1119
+ border-radius: 6px;
1120
+ overflow: hidden;
1121
+ cursor: pointer;
1122
+ background: #fff;
1123
+ box-shadow: none;
1124
+ transition: opacity 0.15s ease;
1125
+ }
1126
+
1127
+ .ppt-slide-thumb:hover:not(.is-active) {
1128
+ opacity: 0.88;
1129
+ }
1130
+
1131
+ .ppt-slide-thumb.is-active {
1132
+ opacity: 1;
1133
+ }
1134
+
1135
+ .ppt-slide-thumb:focus {
1136
+ outline: none;
1137
+ }
1138
+
1139
+ .ppt-slide-thumb:focus-visible {
1140
+ outline: none;
1141
+ }
1142
+
1143
+ .ppt-slide-thumb-preview {
1144
+ position: absolute;
1145
+ inset: 0;
1146
+ display: flex;
1147
+ align-items: center;
1148
+ justify-content: center;
1149
+ overflow: hidden;
1150
+ pointer-events: none;
1151
+ user-select: none;
1152
+ }
1153
+
1154
+ .ppt-slide-thumb-preview > * {
1155
+ max-width: 100%;
1156
+ max-height: 100%;
1157
+ pointer-events: none;
1158
+ }