@zerohive/hive-viewer 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/styles.css CHANGED
@@ -1,17 +1,32 @@
1
1
  /* src/styles/hiveviewer.css */
2
2
 
3
3
  /* --- 1. Variables & Theme --- */
4
- .hv-root {
5
- --hv-bg: #f3f4f6; /* Canvas background (light gray) */
6
- --hv-paper-bg: #ffffff; /* Document page background */
7
- --hv-fg: #1f2937; /* Primary text color */
8
- --hv-muted: #6b7280; /* Secondary text color */
9
- --hv-border: #e5e7eb; /* Border color */
10
- --hv-primary: #4f46e5; /* Primary interactive color (Indigo) */
11
- --hv-primary-fg: #ffffff; /* Text on primary color */
12
- --hv-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
13
- --hv-shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
14
- --hv-radius: 8px;
4
+ .hv-root {
5
+ --hv-bg: #f3f4f6; /* Canvas background (light gray) */
6
+ --hv-paper-bg: #ffffff; /* Document page background */
7
+ --hv-fg: #1f2937; /* Primary text color */
8
+ --hv-muted: #6b7280; /* Secondary text color */
9
+ --hv-border: #e5e7eb; /* Border color */
10
+ --hv-primary: #4f46e5; /* Primary interactive color (Indigo) */
11
+ --hv-primary-fg: #ffffff; /* Text on primary color */
12
+ --hv-page-bg: #ffffff;
13
+ --hv-panel-subtle-bg: #eef2ff;
14
+ --hv-input-bg: #f8fafc;
15
+ --hv-input-fg: #1f2937;
16
+ --hv-input-border: #d1d5db;
17
+ --hv-thumb-preview-bg: #ffffff;
18
+ --hv-thumb-skeleton-bg: #e5e7eb;
19
+ --hv-thumb-skeleton-fg: #cbd5e1;
20
+ --hv-modal-bg: #ffffff;
21
+ --hv-modal-subtle-bg: #f8fafc;
22
+ --hv-sheet-scroll-bg: #f8fafc;
23
+ --hv-sheet-header-bg: #f1f5f9;
24
+ --hv-sheet-header-fg: #475569;
25
+ --hv-sheet-cell-bg: #ffffff;
26
+ --hv-sheet-cell-fg: #0f172a;
27
+ --hv-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
28
+ --hv-shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
29
+ --hv-radius: 8px;
15
30
 
16
31
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
17
32
  background: var(--hv-bg);
@@ -25,14 +40,29 @@
25
40
  }
26
41
 
27
42
  /* Dark Mode Override (applied via data-hv-theme="dark") */
28
- .hv-root[data-hv-theme="dark"] {
29
- --hv-bg: #111827;
30
- --hv-paper-bg: #1f2937; /* Darker paper for eye comfort, or keep white for fidelity */
31
- --hv-fg: #f9fafb;
32
- --hv-muted: #9ca3af;
33
- --hv-border: #374151;
34
- --hv-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.5);
35
- }
43
+ .hv-root[data-hv-theme="dark"] {
44
+ --hv-bg: #0f172a;
45
+ --hv-paper-bg: #111827;
46
+ --hv-fg: #f8fafc;
47
+ --hv-muted: #94a3b8;
48
+ --hv-border: #334155;
49
+ --hv-panel-subtle-bg: rgba(79, 70, 229, 0.14);
50
+ --hv-input-bg: #0f172a;
51
+ --hv-input-fg: #f8fafc;
52
+ --hv-input-border: #475569;
53
+ --hv-thumb-preview-bg: #111827;
54
+ --hv-thumb-skeleton-bg: #1e293b;
55
+ --hv-thumb-skeleton-fg: #475569;
56
+ --hv-modal-bg: #111827;
57
+ --hv-modal-subtle-bg: #0f172a;
58
+ --hv-sheet-scroll-bg: #0f172a;
59
+ --hv-sheet-header-bg: #1e293b;
60
+ --hv-sheet-header-fg: #cbd5e1;
61
+ --hv-sheet-cell-bg: #111827;
62
+ --hv-sheet-cell-fg: #f8fafc;
63
+ --hv-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.5);
64
+ --hv-shadow-lg: 0 20px 25px -5px rgba(0, 0, 0, 0.45), 0 10px 10px -5px rgba(0, 0, 0, 0.35);
65
+ }
36
66
 
37
67
  /* --- 2. Toolbar --- */
38
68
  .hv-toolbar {
@@ -69,10 +99,16 @@
69
99
  height: 36px;
70
100
  }
71
101
 
72
- .hv-btn:hover:not(:disabled) {
73
- background: var(--hv-bg);
74
- color: var(--hv-fg);
75
- }
102
+ .hv-btn:hover:not(:disabled) {
103
+ background: var(--hv-bg);
104
+ color: var(--hv-fg);
105
+ }
106
+
107
+ .hv-btn-active {
108
+ background: var(--hv-panel-subtle-bg);
109
+ color: var(--hv-primary);
110
+ border-color: rgba(79, 70, 229, 0.16);
111
+ }
76
112
 
77
113
  .hv-btn:disabled {
78
114
  opacity: 0.4;
@@ -85,18 +121,61 @@
85
121
  font-weight: 500;
86
122
  padding: 0 16px;
87
123
  }
88
- .hv-btn-primary:hover:not(:disabled) {
89
- background: #4338ca; /* Darker indigo */
90
- color: #fff;
91
- }
124
+ .hv-btn-primary:hover:not(:disabled) {
125
+ background: #4338ca; /* Darker indigo */
126
+ color: #fff;
127
+ }
128
+
129
+ .hv-btn-primary.hv-btn-active {
130
+ box-shadow: 0 0 0 2px rgba(129, 140, 248, 0.35);
131
+ }
92
132
 
93
133
  /* --- 3. Main Shell (Sidebar + Content) --- */
94
- .hv-shell {
95
- flex: 1;
96
- display: flex;
97
- overflow: hidden;
98
- position: relative;
99
- }
134
+ .hv-shell {
135
+ flex: 1;
136
+ display: flex;
137
+ overflow: hidden;
138
+ position: relative;
139
+ }
140
+
141
+ .hv-slot {
142
+ flex: 0 0 auto;
143
+ padding: 12px 16px;
144
+ background: var(--hv-paper-bg);
145
+ color: var(--hv-fg);
146
+ }
147
+
148
+ .hv-slot-header {
149
+ border-bottom: 1px solid var(--hv-border);
150
+ }
151
+
152
+ .hv-slot-footer {
153
+ border-top: 1px solid var(--hv-border);
154
+ }
155
+
156
+ .hv-export-slot-host {
157
+ position: fixed;
158
+ top: 0;
159
+ left: -200vw;
160
+ width: 960px;
161
+ opacity: 0;
162
+ pointer-events: none;
163
+ z-index: -1;
164
+ }
165
+
166
+ .hv-export-slot {
167
+ width: 100%;
168
+ box-sizing: border-box;
169
+ background: transparent;
170
+ }
171
+
172
+ .hv-export-slot-header {
173
+ margin-bottom: 12px;
174
+ }
175
+
176
+ .hv-export-slot-footer {
177
+ margin-top: 12px;
178
+ }
100
179
 
101
180
  /* --- 4. Sidebar / Thumbnails --- */
102
181
  .hv-sidebar {
@@ -115,50 +194,57 @@
115
194
  overflow: hidden;
116
195
  }
117
196
 
118
- .hv-thumb-list {
119
- flex: 1;
120
- overflow-y: auto;
121
- padding: 16px;
122
- display: flex;
123
- flex-direction: column;
124
- gap: 16px;
125
- }
126
-
127
- .hv-thumb-item {
128
- cursor: pointer;
129
- display: flex;
130
- flex-direction: column;
131
- align-items: center;
132
- gap: 8px;
133
- opacity: 0.7;
134
- transition: opacity 0.2s;
135
- }
197
+ .hv-thumb-list {
198
+ flex: 1;
199
+ overflow-y: auto;
200
+ padding: 16px;
201
+ position: relative;
202
+ }
203
+
204
+ .hv-thumb-viewport {
205
+ position: relative;
206
+ width: 100%;
207
+ }
208
+
209
+ .hv-thumb-item {
210
+ position: absolute;
211
+ left: 0;
212
+ right: 0;
213
+ cursor: pointer;
214
+ display: flex;
215
+ flex-direction: column;
216
+ align-items: center;
217
+ gap: 8px;
218
+ opacity: 0.7;
219
+ transition: opacity 0.2s;
220
+ padding-bottom: 16px;
221
+ }
136
222
 
137
223
  .hv-thumb-item:hover, .hv-thumb-item.active {
138
224
  opacity: 1;
139
225
  }
140
226
 
141
- .hv-thumb-preview {
142
- width: 100px;
143
- height: 140px; /* Approx A4 aspect */
144
- background: white;
145
- border: 1px solid var(--hv-border);
146
- box-shadow: var(--hv-shadow);
147
- border-radius: 4px;
148
- overflow: hidden;
149
- position: relative;
227
+ .hv-thumb-preview {
228
+ width: 100px;
229
+ height: 140px; /* Approx A4 aspect */
230
+ background: var(--hv-thumb-preview-bg);
231
+ border: 1px solid var(--hv-border);
232
+ box-shadow: var(--hv-shadow);
233
+ border-radius: 4px;
234
+ overflow: hidden;
235
+ position: relative;
150
236
  }
151
237
  .hv-thumb-item.active .hv-thumb-preview {
152
238
  outline: 2px solid var(--hv-primary);
153
239
  outline-offset: 2px;
154
240
  }
155
241
 
156
- .hv-thumb-img {
157
- width: 100%;
158
- height: 100%;
159
- object-fit: contain;
160
- background: #fff;
161
- }
242
+ .hv-thumb-img {
243
+ width: 100%;
244
+ height: 100%;
245
+ object-fit: contain;
246
+ background: var(--hv-thumb-preview-bg);
247
+ }
162
248
 
163
249
  .hv-thumb-label {
164
250
  font-size: 12px;
@@ -166,27 +252,43 @@
166
252
  }
167
253
 
168
254
  /* --- 5. Main Content Area (The "Desk") --- */
169
- .hv-main {
170
- flex: 1;
171
- background: var(--hv-bg);
172
- overflow: auto;
173
- padding: 32px;
174
- display: flex;
175
- flex-direction: column;
176
- align-items: center;
177
- /* Scroll behavior */
178
- scroll-behavior: smooth;
179
- }
255
+ .hv-main {
256
+ flex: 1;
257
+ background: var(--hv-bg);
258
+ overflow: auto;
259
+ padding: 32px;
260
+ display: flex;
261
+ flex-direction: column;
262
+ align-items: stretch;
263
+ /* Scroll behavior */
264
+ scroll-behavior: smooth;
265
+ }
266
+
267
+ .hv-main.hv-main-richtext-authoring {
268
+ padding: 0 0 32px;
269
+ }
270
+
271
+ .hv-zoom-shell {
272
+ display: flex;
273
+ justify-content: center;
274
+ align-items: flex-start;
275
+ margin: 0 auto;
276
+ }
277
+
278
+ .hv-zoom-stage {
279
+ flex: 0 0 auto;
280
+ will-change: transform;
281
+ }
180
282
 
181
283
  /* --- 6. The "Page" Concept (Critical for fidelity) --- */
182
284
  /* This class wraps PDF canvases, Docx HTML, and Images to look like paper */
183
- .hv-page-container {
184
- background: white;
185
- box-shadow: var(--hv-shadow-lg);
186
- margin-bottom: 24px;
187
- transition: transform 0.2s ease;
188
- position: relative;
189
- }
285
+ .hv-page-container {
286
+ background: var(--hv-page-bg);
287
+ box-shadow: var(--hv-shadow-lg);
288
+ margin-bottom: 24px;
289
+ transition: transform 0.2s ease;
290
+ position: relative;
291
+ }
190
292
 
191
293
  /* Center layout for single page */
192
294
  .hv-view-single .hv-page-container {
@@ -231,34 +333,592 @@
231
333
  }
232
334
 
233
335
  /* Error State */
234
- .hv-error-banner {
235
- margin: 32px auto;
236
- padding: 16px 24px;
237
- background: #fef2f2;
336
+ .hv-error-banner {
337
+ margin: 32px auto;
338
+ padding: 16px 24px;
339
+ background: #fef2f2;
238
340
  border: 1px solid #fee2e2;
239
341
  border-radius: var(--hv-radius);
240
342
  color: #991b1b;
241
- text-align: center;
242
- max-width: 500px;
243
- }
343
+ text-align: center;
344
+ max-width: 500px;
345
+ }
346
+
347
+ .hv-info-banner {
348
+ margin: 0 auto 24px;
349
+ padding: 16px 20px;
350
+ background: #eff6ff;
351
+ border: 1px solid #bfdbfe;
352
+ border-radius: var(--hv-radius);
353
+ color: #1d4ed8;
354
+ max-width: 720px;
355
+ box-shadow: var(--hv-shadow);
356
+ }
357
+
358
+ .hv-info-banner.warning {
359
+ background: #fffbeb;
360
+ border-color: #fcd34d;
361
+ color: #92400e;
362
+ }
363
+
364
+ .hv-info-banner p {
365
+ margin: 8px 0 0;
366
+ }
244
367
 
245
368
  /* DOCX Specifics to simulate Word */
246
- .hv-docx-content {
247
- /* Simulate A4 Page: 210mm x 297mm */
248
- width: 816px;
249
- min-height: 1056px;
250
- padding: 96px; /* 1 inch margins approx */
251
- background: white;
252
- color: black;
253
- font-family: "Calibri", "Times New Roman", serif;
254
- line-height: 1.5;
255
- outline: none;
256
- }
257
- /* Ensure images in DOCX don't overflow the page */
258
- .hv-docx-content img {
259
- max-width: 100%;
260
- height: auto;
261
- }
369
+ .hv-docx-content {
370
+ box-sizing: border-box;
371
+ width: 816px;
372
+ min-height: 1056px;
373
+ padding: 96px; /* 1 inch margins approx */
374
+ background: white;
375
+ color: black;
376
+ font-family: "Calibri", "Times New Roman", serif;
377
+ line-height: 1.5;
378
+ outline: none;
379
+ }
380
+ /* Ensure images in DOCX don't overflow the page */
381
+ .hv-docx-content img {
382
+ max-width: 100%;
383
+ height: auto;
384
+ border-radius: 8px;
385
+ }
386
+
387
+ .hv-docx-content figure {
388
+ margin: 28px 0;
389
+ display: flex;
390
+ flex-direction: column;
391
+ gap: 10px;
392
+ }
393
+
394
+ .hv-docx-content figure.hv-inline-image {
395
+ width: 100%;
396
+ --hv-image-scale: 1;
397
+ --hv-image-focus-x: 50%;
398
+ --hv-image-focus-y: 50%;
399
+ }
400
+
401
+ .hv-docx-content figure.hv-inline-image.size-sm {
402
+ max-width: 240px;
403
+ }
404
+
405
+ .hv-docx-content figure.hv-inline-image.size-md {
406
+ max-width: 420px;
407
+ }
408
+
409
+ .hv-docx-content figure.hv-inline-image.size-lg {
410
+ max-width: 560px;
411
+ }
412
+
413
+ .hv-docx-content figure.hv-inline-image.size-full {
414
+ max-width: 100%;
415
+ }
416
+
417
+ .hv-docx-content figure.hv-inline-image.align-left {
418
+ margin-left: 0;
419
+ margin-right: auto;
420
+ }
421
+
422
+ .hv-docx-content figure.hv-inline-image.align-center {
423
+ margin-left: auto;
424
+ margin-right: auto;
425
+ }
426
+
427
+ .hv-docx-content figure.hv-inline-image.align-right {
428
+ margin-left: auto;
429
+ margin-right: 0;
430
+ }
431
+
432
+ .hv-inline-image-frame {
433
+ width: 100%;
434
+ overflow: hidden;
435
+ border-radius: 12px;
436
+ background: #eef2f7;
437
+ }
438
+
439
+ .hv-inline-image-frame img {
440
+ display: block;
441
+ width: 100%;
442
+ object-position: var(--hv-image-focus-x) var(--hv-image-focus-y);
443
+ transform: scale(var(--hv-image-scale));
444
+ transform-origin: center center;
445
+ }
446
+
447
+ .hv-docx-content figure.hv-inline-image.crop-original .hv-inline-image-frame {
448
+ aspect-ratio: auto;
449
+ }
450
+
451
+ .hv-docx-content figure.hv-inline-image.crop-original .hv-inline-image-frame img {
452
+ height: auto;
453
+ object-fit: contain;
454
+ }
455
+
456
+ .hv-docx-content figure.hv-inline-image.crop-wide .hv-inline-image-frame {
457
+ aspect-ratio: 16 / 9;
458
+ }
459
+
460
+ .hv-docx-content figure.hv-inline-image.crop-square .hv-inline-image-frame {
461
+ aspect-ratio: 1 / 1;
462
+ }
463
+
464
+ .hv-docx-content figure.hv-inline-image.crop-portrait .hv-inline-image-frame {
465
+ aspect-ratio: 4 / 5;
466
+ }
467
+
468
+ .hv-docx-content figure.hv-inline-image.crop-wide img,
469
+ .hv-docx-content figure.hv-inline-image.crop-square img,
470
+ .hv-docx-content figure.hv-inline-image.crop-portrait img {
471
+ width: 100%;
472
+ height: 100%;
473
+ object-fit: cover;
474
+ }
475
+
476
+ .hv-docx-content figcaption {
477
+ font-size: 12px;
478
+ color: #64748b;
479
+ text-align: center;
480
+ }
481
+
482
+ .hv-docx-content a {
483
+ color: #2563eb;
484
+ text-decoration: underline;
485
+ }
486
+
487
+ .hv-docx-content blockquote {
488
+ margin: 24px 0;
489
+ padding: 12px 16px;
490
+ border-left: 4px solid #94a3b8;
491
+ background: #f8fafc;
492
+ color: #334155;
493
+ }
494
+
495
+ .hv-docx-content hr {
496
+ border: 0;
497
+ border-top: 1px solid #cbd5e1;
498
+ margin: 28px 0;
499
+ }
500
+
501
+ .hv-docx-content table {
502
+ width: 100%;
503
+ border-collapse: collapse;
504
+ margin: 24px 0;
505
+ }
506
+
507
+ .hv-plain-text-doc {
508
+ color: #0f172a;
509
+ font-family: "Georgia", "Times New Roman", serif;
510
+ }
511
+
512
+ .hv-plain-text-doc p,
513
+ .hv-plain-text-doc ul,
514
+ .hv-plain-text-doc ol {
515
+ margin: 0 0 18px;
516
+ line-height: 1.72;
517
+ font-size: 17px;
518
+ }
519
+
520
+ .hv-plain-text-doc ul,
521
+ .hv-plain-text-doc ol {
522
+ padding-left: 28px;
523
+ }
524
+
525
+ .hv-docx-content th,
526
+ .hv-docx-content td {
527
+ border: 1px solid #cbd5e1;
528
+ padding: 10px 12px;
529
+ vertical-align: top;
530
+ }
531
+
532
+ .hv-docx-content th {
533
+ background: #f8fafc;
534
+ font-weight: 700;
535
+ }
536
+
537
+ .hv-docx-measure-shell {
538
+ position: fixed;
539
+ top: 0;
540
+ left: -200vw;
541
+ width: 816px;
542
+ opacity: 0;
543
+ pointer-events: none;
544
+ z-index: -1;
545
+ }
546
+
547
+ .hv-docx-measure-content {
548
+ overflow: visible;
549
+ }
550
+
551
+ .hv-docx-page-surface {
552
+ width: 816px;
553
+ min-height: 1056px;
554
+ overflow: hidden;
555
+ }
556
+
557
+ .hv-richtext-authoring-shell {
558
+ width: 100%;
559
+ min-width: 100%;
560
+ display: flex;
561
+ flex-direction: column;
562
+ gap: 0;
563
+ }
564
+
565
+ .hv-richtext-authoring-top {
566
+ width: 100%;
567
+ box-sizing: border-box;
568
+ flex: 0 0 auto;
569
+ align-self: stretch;
570
+ margin: 0 0 24px;
571
+ background: var(--hv-paper-bg);
572
+ border-bottom: 1px solid var(--hv-border);
573
+ overflow: hidden;
574
+ }
575
+
576
+ .hv-docx-editor-stage {
577
+ position: relative;
578
+ }
579
+
580
+ .hv-docx-page-image {
581
+ display: block;
582
+ width: 100%;
583
+ height: auto;
584
+ }
585
+
586
+ .hv-richtext-toolbar {
587
+ display: flex;
588
+ flex-direction: column;
589
+ gap: 10px;
590
+ padding: 12px 24px;
591
+ border-bottom: none;
592
+ background: var(--hv-paper-bg);
593
+ }
594
+
595
+ .hv-richtext-file-input {
596
+ display: none;
597
+ }
598
+
599
+ .hv-richtext-toolbar-row {
600
+ display: flex;
601
+ flex-wrap: wrap;
602
+ gap: 0 12px;
603
+ align-items: flex-end;
604
+ }
605
+
606
+ .hv-richtext-toolbar-section {
607
+ display: flex;
608
+ flex-direction: column;
609
+ gap: 8px;
610
+ position: relative;
611
+ padding: 0 24px;
612
+ }
613
+
614
+ .hv-richtext-toolbar-section:first-child {
615
+ padding-left: 0;
616
+ }
617
+
618
+ .hv-richtext-toolbar-section:last-child {
619
+ padding-right: 0;
620
+ }
621
+
622
+ .hv-richtext-toolbar-section:not(:last-child)::after {
623
+ content: "";
624
+ position: absolute;
625
+ top: 2px;
626
+ right: 0;
627
+ bottom: 2px;
628
+ width: 1px;
629
+ background: var(--hv-border);
630
+ }
631
+
632
+ .hv-richtext-toolbar-section-toggle {
633
+ display: none;
634
+ }
635
+
636
+ .hv-richtext-toolbar-label {
637
+ font-size: 11px;
638
+ font-weight: 700;
639
+ letter-spacing: 0.08em;
640
+ text-transform: uppercase;
641
+ color: var(--hv-muted);
642
+ }
643
+
644
+ .hv-richtext-toolbar-subgroup {
645
+ display: flex;
646
+ flex-direction: column;
647
+ gap: 6px;
648
+ }
649
+
650
+ .hv-richtext-toolbar-sublabel {
651
+ font-size: 11px;
652
+ font-weight: 600;
653
+ color: var(--hv-muted);
654
+ }
655
+
656
+ .hv-richtext-button-group {
657
+ display: flex;
658
+ flex-wrap: wrap;
659
+ gap: 8px;
660
+ }
661
+
662
+ .hv-richtext-button-group .hv-btn {
663
+ min-width: auto;
664
+ height: 32px;
665
+ padding: 0 10px;
666
+ font-size: 12px;
667
+ }
668
+
669
+ .hv-richtext-context-panel {
670
+ display: flex;
671
+ flex-direction: column;
672
+ gap: 14px;
673
+ padding: 14px 0 4px;
674
+ border-top: 1px solid var(--hv-border);
675
+ }
676
+
677
+ .hv-richtext-context-panel-compact {
678
+ padding-top: 8px;
679
+ }
680
+
681
+ .hv-richtext-context-header strong {
682
+ display: block;
683
+ font-size: 14px;
684
+ color: var(--hv-fg);
685
+ }
686
+
687
+ .hv-richtext-context-header p {
688
+ margin: 6px 0 0;
689
+ font-size: 12px;
690
+ line-height: 1.5;
691
+ color: var(--hv-muted);
692
+ }
693
+
694
+ .hv-richtext-image-editor {
695
+ display: grid;
696
+ grid-template-columns: minmax(220px, 280px) minmax(0, 1fr);
697
+ gap: 16px;
698
+ align-items: start;
699
+ }
700
+
701
+ .hv-richtext-image-preview-card {
702
+ padding: 12px;
703
+ border: 1px solid var(--hv-border);
704
+ border-radius: 14px;
705
+ background: var(--hv-modal-subtle-bg);
706
+ }
707
+
708
+ .hv-richtext-image-preview {
709
+ position: relative;
710
+ width: 100%;
711
+ overflow: hidden;
712
+ border-radius: 12px;
713
+ background: #e2e8f0;
714
+ cursor: crosshair;
715
+ }
716
+
717
+ .hv-richtext-image-preview.crop-original {
718
+ aspect-ratio: 4 / 3;
719
+ }
720
+
721
+ .hv-richtext-image-preview.crop-wide {
722
+ aspect-ratio: 16 / 9;
723
+ }
724
+
725
+ .hv-richtext-image-preview.crop-square {
726
+ aspect-ratio: 1 / 1;
727
+ }
728
+
729
+ .hv-richtext-image-preview.crop-portrait {
730
+ aspect-ratio: 4 / 5;
731
+ }
732
+
733
+ .hv-richtext-image-preview img {
734
+ width: 100%;
735
+ height: 100%;
736
+ object-fit: cover;
737
+ pointer-events: none;
738
+ }
739
+
740
+ .hv-richtext-image-preview.crop-original img {
741
+ object-fit: contain;
742
+ background: #fff;
743
+ }
744
+
745
+ .hv-richtext-image-focus-point {
746
+ position: absolute;
747
+ width: 20px;
748
+ height: 20px;
749
+ border-radius: 999px;
750
+ border: 2px solid #fff;
751
+ background: var(--hv-primary);
752
+ box-shadow: 0 4px 12px rgba(15, 23, 42, 0.24);
753
+ transform: translate(-50%, -50%);
754
+ pointer-events: none;
755
+ }
756
+
757
+ .hv-richtext-image-controls {
758
+ display: flex;
759
+ flex-direction: column;
760
+ gap: 12px;
761
+ }
762
+
763
+ .hv-richtext-range-group {
764
+ display: flex;
765
+ flex-direction: column;
766
+ gap: 8px;
767
+ font-size: 12px;
768
+ color: var(--hv-muted);
769
+ }
770
+
771
+ .hv-richtext-focus-readout {
772
+ display: flex;
773
+ gap: 12px;
774
+ font-size: 12px;
775
+ color: var(--hv-muted);
776
+ }
777
+
778
+ .hv-richtext-select {
779
+ min-width: 150px;
780
+ border: 1px solid var(--hv-input-border);
781
+ border-radius: 10px;
782
+ padding: 8px 10px;
783
+ background: var(--hv-input-bg);
784
+ color: var(--hv-input-fg);
785
+ font-size: 12px;
786
+ outline: none;
787
+ }
788
+
789
+ .hv-richtext-select:focus {
790
+ border-color: var(--hv-primary);
791
+ box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.16);
792
+ }
793
+
794
+ .hv-richtext-template-panel {
795
+ display: flex;
796
+ flex-direction: column;
797
+ gap: 10px;
798
+ flex: 0 0 auto;
799
+ padding: 10px 24px 14px;
800
+ border-top: 1px solid var(--hv-border);
801
+ background: var(--hv-paper-bg);
802
+ }
803
+
804
+ .hv-richtext-template-strip {
805
+ display: flex;
806
+ flex-wrap: wrap;
807
+ align-items: center;
808
+ gap: 8px;
809
+ justify-content: space-between;
810
+ }
811
+
812
+ .hv-richtext-template-label {
813
+ font-size: 11px;
814
+ font-weight: 700;
815
+ letter-spacing: 0.08em;
816
+ text-transform: uppercase;
817
+ color: var(--hv-muted);
818
+ }
819
+
820
+ .hv-richtext-template-grid {
821
+ display: flex;
822
+ flex-wrap: nowrap;
823
+ gap: 10px;
824
+ overflow-x: auto;
825
+ overflow-y: hidden;
826
+ padding-bottom: 4px;
827
+ scrollbar-width: thin;
828
+ }
829
+
830
+ .hv-richtext-template-toggle {
831
+ min-width: auto;
832
+ padding: 0 12px;
833
+ color: var(--hv-fg);
834
+ background: var(--hv-paper-bg);
835
+ border-color: var(--hv-border);
836
+ }
837
+
838
+ .hv-richtext-template-card {
839
+ display: flex;
840
+ flex: 0 0 220px;
841
+ flex-direction: column;
842
+ gap: 8px;
843
+ align-items: flex-start;
844
+ min-height: 104px;
845
+ padding: 14px;
846
+ border: 1px solid var(--hv-border);
847
+ border-radius: 12px;
848
+ background: var(--hv-paper-bg);
849
+ text-align: left;
850
+ cursor: pointer;
851
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
852
+ }
853
+
854
+ .hv-richtext-template-card:hover {
855
+ border-color: rgba(79, 70, 229, 0.35);
856
+ transform: translateY(-1px);
857
+ }
858
+
859
+ .hv-richtext-template-card.active {
860
+ border-color: rgba(79, 70, 229, 0.6);
861
+ box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.12);
862
+ background: var(--hv-panel-subtle-bg);
863
+ }
864
+
865
+ .hv-richtext-template-title {
866
+ font-size: 14px;
867
+ font-weight: 700;
868
+ color: var(--hv-fg);
869
+ }
870
+
871
+ .hv-richtext-template-description {
872
+ font-size: 12px;
873
+ line-height: 1.45;
874
+ color: var(--hv-muted);
875
+ }
876
+
877
+ .hv-docx-preview-stage {
878
+ width: 100%;
879
+ }
880
+
881
+ .hv-docx-preview-shell {
882
+ position: fixed;
883
+ top: 0;
884
+ left: -200vw;
885
+ width: 1200px;
886
+ opacity: 0;
887
+ pointer-events: none;
888
+ z-index: -1;
889
+ overflow: visible;
890
+ }
891
+
892
+ .hv-docx-preview-host {
893
+ width: max-content;
894
+ }
895
+
896
+ .hv-docx-preview-host .hv-docx-page-wrapper {
897
+ display: flex;
898
+ flex-wrap: wrap;
899
+ justify-content: center;
900
+ gap: 24px;
901
+ width: 100%;
902
+ background: transparent !important;
903
+ padding: 0 !important;
904
+ }
905
+
906
+ .hv-docx-preview-host section.hv-docx-page {
907
+ position: relative;
908
+ margin: 0 !important;
909
+ box-shadow: var(--hv-shadow-lg);
910
+ background: #ffffff;
911
+ color: #000000;
912
+ }
913
+
914
+ .hv-docx-preview-host section.hv-docx-page img {
915
+ max-width: 100%;
916
+ height: auto;
917
+ }
918
+
919
+ .hv-docx-preview-host section.hv-docx-page .hv-signature-overlay {
920
+ z-index: 12;
921
+ }
262
922
 
263
923
  /* PPTX Slide Container */
264
924
  .hv-slide-container {
@@ -298,13 +958,913 @@
298
958
  backdrop-filter: blur(2px); /* Optional blur effect */
299
959
  }
300
960
 
301
- .hv-modal {
302
- background: #fff;
303
- border-radius: 12px;
304
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
305
- overflow: hidden;
306
- display: flex;
307
- flex-direction: column;
308
- max-height: 90vh;
309
- position: relative;
310
- }
961
+ .hv-modal {
962
+ background: var(--hv-modal-bg);
963
+ border-radius: 12px;
964
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
965
+ overflow: hidden;
966
+ display: flex;
967
+ flex-direction: column;
968
+ max-height: 90vh;
969
+ position: relative;
970
+ }
971
+
972
+ .hv-signature-overlay {
973
+ position: absolute;
974
+ inset: 0;
975
+ pointer-events: none;
976
+ z-index: 8;
977
+ }
978
+
979
+ .hv-signature-overlay-capture {
980
+ position: absolute;
981
+ inset: 0;
982
+ pointer-events: auto;
983
+ cursor: crosshair;
984
+ background: rgba(79, 70, 229, 0.08);
985
+ outline: 2px dashed rgba(79, 70, 229, 0.3);
986
+ outline-offset: -8px;
987
+ }
988
+
989
+ .hv-signature-overlay-hint {
990
+ position: absolute;
991
+ top: 16px;
992
+ right: 16px;
993
+ max-width: 260px;
994
+ padding: 10px 12px;
995
+ border-radius: 999px;
996
+ background: rgba(15, 23, 42, 0.82);
997
+ color: #fff;
998
+ font-size: 12px;
999
+ font-weight: 600;
1000
+ box-shadow: var(--hv-shadow);
1001
+ }
1002
+
1003
+ .hv-signature-stamp {
1004
+ position: absolute;
1005
+ display: flex;
1006
+ flex-direction: column;
1007
+ justify-content: flex-start;
1008
+ gap: 6px;
1009
+ padding: 12px 14px 10px;
1010
+ border: 1px solid transparent;
1011
+ border-radius: 12px;
1012
+ background: transparent;
1013
+ box-shadow: none;
1014
+ pointer-events: auto;
1015
+ user-select: none;
1016
+ touch-action: none;
1017
+ cursor: pointer;
1018
+ }
1019
+
1020
+ .hv-signature-stamp.active {
1021
+ background: rgba(255, 255, 255, 0.92);
1022
+ border-color: rgba(79, 70, 229, 0.7);
1023
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.18), 0 14px 28px rgba(15, 23, 42, 0.2);
1024
+ cursor: move;
1025
+ }
1026
+
1027
+ .hv-signature-image {
1028
+ flex: 1 1 auto;
1029
+ min-height: 0;
1030
+ width: 100%;
1031
+ height: 100%;
1032
+ display: block;
1033
+ pointer-events: none;
1034
+ }
1035
+
1036
+ .hv-signature-image-wrap {
1037
+ flex: 1 1 auto;
1038
+ min-height: 0;
1039
+ display: flex;
1040
+ align-items: center;
1041
+ }
1042
+
1043
+ .hv-signature-ink {
1044
+ background: #111827;
1045
+ mask-position: center center;
1046
+ mask-repeat: no-repeat;
1047
+ mask-size: contain;
1048
+ -webkit-mask-position: center center;
1049
+ -webkit-mask-repeat: no-repeat;
1050
+ -webkit-mask-size: contain;
1051
+ }
1052
+
1053
+ .hv-signature-meta {
1054
+ display: flex;
1055
+ flex-direction: column;
1056
+ align-items: flex-start;
1057
+ gap: 3px;
1058
+ margin-top: auto;
1059
+ padding-top: 2px;
1060
+ border-top: none;
1061
+ font-size: 10px;
1062
+ color: #334155;
1063
+ pointer-events: none;
1064
+ }
1065
+
1066
+ .hv-signature-meta-name {
1067
+ min-width: 0;
1068
+ line-height: 1.2;
1069
+ font-size: 12px;
1070
+ font-weight: 700;
1071
+ white-space: normal;
1072
+ }
1073
+
1074
+ .hv-signature-meta-jobtitle {
1075
+ line-height: 1.2;
1076
+ font-size: 11px;
1077
+ font-weight: 700;
1078
+ }
1079
+
1080
+ .hv-signature-meta-date {
1081
+ line-height: 1.2;
1082
+ font-size: 10px;
1083
+ font-weight: 500;
1084
+ opacity: 0.9;
1085
+ }
1086
+
1087
+ .hv-signature-remove {
1088
+ position: absolute;
1089
+ top: -10px;
1090
+ right: -10px;
1091
+ width: 22px;
1092
+ height: 22px;
1093
+ border: none;
1094
+ border-radius: 999px;
1095
+ background: #ef4444;
1096
+ color: #fff;
1097
+ cursor: pointer;
1098
+ box-shadow: var(--hv-shadow);
1099
+ }
1100
+
1101
+ .hv-signature-resize {
1102
+ position: absolute;
1103
+ right: -5px;
1104
+ bottom: -5px;
1105
+ width: 14px;
1106
+ height: 14px;
1107
+ border-radius: 4px;
1108
+ background: var(--hv-primary);
1109
+ cursor: nwse-resize;
1110
+ }
1111
+
1112
+ .hv-signature-note-indicator {
1113
+ position: absolute;
1114
+ left: 10px;
1115
+ top: -10px;
1116
+ display: inline-flex;
1117
+ align-items: center;
1118
+ justify-content: center;
1119
+ min-width: 38px;
1120
+ height: 20px;
1121
+ padding: 0 8px;
1122
+ border-radius: 999px;
1123
+ background: #f59e0b;
1124
+ color: #fff;
1125
+ font-size: 10px;
1126
+ font-weight: 700;
1127
+ letter-spacing: 0.02em;
1128
+ box-shadow: var(--hv-shadow);
1129
+ }
1130
+
1131
+ .hv-signature-color-picker,
1132
+ .hv-signature-color-toolbar {
1133
+ display: flex;
1134
+ flex-direction: column;
1135
+ gap: 6px;
1136
+ align-items: flex-start;
1137
+ }
1138
+
1139
+ .hv-signature-color-picker-label,
1140
+ .hv-signature-color-toolbar-label {
1141
+ font-size: 11px;
1142
+ font-weight: 600;
1143
+ color: var(--hv-muted);
1144
+ }
1145
+
1146
+ .hv-signature-color-swatch-row {
1147
+ display: flex;
1148
+ align-items: center;
1149
+ gap: 8px;
1150
+ flex-wrap: wrap;
1151
+ }
1152
+
1153
+ .hv-signature-color-swatch {
1154
+ width: 18px;
1155
+ height: 18px;
1156
+ padding: 0;
1157
+ border: 2px solid rgba(148, 163, 184, 0.35);
1158
+ border-radius: 999px;
1159
+ cursor: pointer;
1160
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.25);
1161
+ }
1162
+
1163
+ .hv-signature-color-swatch.active {
1164
+ border-color: var(--hv-primary);
1165
+ box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.18);
1166
+ }
1167
+
1168
+ .hv-annotation-chip {
1169
+ position: absolute;
1170
+ display: inline-flex;
1171
+ align-items: center;
1172
+ justify-content: center;
1173
+ width: 32px;
1174
+ height: 32px;
1175
+ border: none;
1176
+ border-radius: 999px;
1177
+ background: #f59e0b;
1178
+ color: #fff;
1179
+ box-shadow: var(--hv-shadow);
1180
+ pointer-events: auto;
1181
+ cursor: pointer;
1182
+ transform: translate(-10%, -10%);
1183
+ z-index: 1;
1184
+ }
1185
+
1186
+ .hv-annotation-chip:hover {
1187
+ filter: brightness(1.05);
1188
+ }
1189
+
1190
+ .hv-annotation-chip.linked {
1191
+ background: #d97706;
1192
+ }
1193
+
1194
+ .hv-annotation-chip.empty {
1195
+ background: #fbbf24;
1196
+ color: #78350f;
1197
+ }
1198
+
1199
+ .hv-annotation-card {
1200
+ position: absolute;
1201
+ display: flex;
1202
+ flex-direction: column;
1203
+ min-width: 120px;
1204
+ min-height: 80px;
1205
+ border: 1px solid rgba(217, 119, 6, 0.26);
1206
+ border-radius: 14px;
1207
+ background: rgba(255, 251, 235, 0.98);
1208
+ box-shadow: 0 14px 26px rgba(15, 23, 42, 0.12);
1209
+ pointer-events: auto;
1210
+ user-select: none;
1211
+ overflow: hidden;
1212
+ z-index: 2;
1213
+ }
1214
+
1215
+ .hv-annotation-card.active {
1216
+ border-color: rgba(217, 119, 6, 0.66);
1217
+ box-shadow: 0 0 0 3px rgba(251, 191, 36, 0.2), 0 18px 30px rgba(15, 23, 42, 0.18);
1218
+ }
1219
+
1220
+ .hv-annotation-card.linked {
1221
+ background: rgba(254, 249, 195, 0.98);
1222
+ }
1223
+
1224
+ .hv-annotation-header {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ justify-content: space-between;
1228
+ gap: 10px;
1229
+ padding: 10px 12px 8px;
1230
+ background: rgba(245, 158, 11, 0.16);
1231
+ cursor: pointer;
1232
+ }
1233
+
1234
+ .hv-annotation-card.active .hv-annotation-header {
1235
+ cursor: move;
1236
+ }
1237
+
1238
+ .hv-annotation-header-copy {
1239
+ display: flex;
1240
+ align-items: center;
1241
+ gap: 8px;
1242
+ min-width: 0;
1243
+ }
1244
+
1245
+ .hv-annotation-title {
1246
+ font-size: 11px;
1247
+ font-weight: 800;
1248
+ text-transform: uppercase;
1249
+ letter-spacing: 0.08em;
1250
+ color: #92400e;
1251
+ }
1252
+
1253
+ .hv-annotation-badge {
1254
+ display: inline-flex;
1255
+ align-items: center;
1256
+ justify-content: center;
1257
+ height: 20px;
1258
+ padding: 0 8px;
1259
+ border-radius: 999px;
1260
+ background: rgba(217, 119, 6, 0.12);
1261
+ color: #b45309;
1262
+ font-size: 10px;
1263
+ font-weight: 700;
1264
+ }
1265
+
1266
+ .hv-annotation-remove {
1267
+ flex: 0 0 auto;
1268
+ width: 22px;
1269
+ height: 22px;
1270
+ border: none;
1271
+ border-radius: 999px;
1272
+ background: #ef4444;
1273
+ color: #fff;
1274
+ cursor: pointer;
1275
+ box-shadow: var(--hv-shadow);
1276
+ }
1277
+
1278
+ .hv-annotation-body {
1279
+ flex: 1;
1280
+ min-height: 0;
1281
+ padding: 10px 12px 12px;
1282
+ }
1283
+
1284
+ .hv-annotation-input,
1285
+ .hv-annotation-preview {
1286
+ width: 100%;
1287
+ height: 100%;
1288
+ border: none;
1289
+ background: transparent;
1290
+ color: #451a03;
1291
+ font-size: 13px;
1292
+ line-height: 1.45;
1293
+ }
1294
+
1295
+ .hv-annotation-input {
1296
+ resize: none;
1297
+ outline: none;
1298
+ font-family: inherit;
1299
+ }
1300
+
1301
+ .hv-annotation-preview {
1302
+ white-space: pre-wrap;
1303
+ overflow: hidden;
1304
+ }
1305
+
1306
+ .hv-annotation-preview.empty,
1307
+ .hv-annotation-input::placeholder {
1308
+ color: #b45309;
1309
+ }
1310
+
1311
+ .hv-annotation-resize {
1312
+ position: absolute;
1313
+ right: -5px;
1314
+ bottom: -5px;
1315
+ width: 14px;
1316
+ height: 14px;
1317
+ border-radius: 4px;
1318
+ background: #d97706;
1319
+ cursor: nwse-resize;
1320
+ }
1321
+
1322
+ .hv-signature-selection-card {
1323
+ display: flex;
1324
+ flex-direction: column;
1325
+ gap: 10px;
1326
+ padding: 14px;
1327
+ border: 1px solid rgba(79, 70, 229, 0.22);
1328
+ border-radius: 12px;
1329
+ background: rgba(79, 70, 229, 0.08);
1330
+ }
1331
+
1332
+ .hv-signature-selection-title {
1333
+ font-size: 12px;
1334
+ font-weight: 700;
1335
+ text-transform: uppercase;
1336
+ letter-spacing: 0.08em;
1337
+ color: var(--hv-primary);
1338
+ }
1339
+
1340
+ .hv-signature-selection-image {
1341
+ align-self: center;
1342
+ height: 48px;
1343
+ object-fit: contain;
1344
+ }
1345
+
1346
+ .hv-signature-selection-copy {
1347
+ font-size: 12px;
1348
+ color: var(--hv-fg);
1349
+ }
1350
+
1351
+ .hv-signature-empty {
1352
+ padding: 12px;
1353
+ border: 1px dashed var(--hv-border);
1354
+ border-radius: 12px;
1355
+ font-size: 12px;
1356
+ color: var(--hv-muted);
1357
+ text-align: center;
1358
+ }
1359
+
1360
+ .hv-signature-item {
1361
+ position: relative;
1362
+ align-items: stretch;
1363
+ width: 100%;
1364
+ }
1365
+
1366
+ .hv-signature-item-main {
1367
+ width: 100%;
1368
+ display: flex;
1369
+ align-items: flex-start;
1370
+ gap: 12px;
1371
+ border: 1px solid var(--hv-border);
1372
+ border-radius: 12px;
1373
+ background: var(--hv-paper-bg);
1374
+ padding: 12px;
1375
+ cursor: pointer;
1376
+ text-align: left;
1377
+ }
1378
+
1379
+ .hv-signature-item.active .hv-signature-item-main {
1380
+ border-color: rgba(79, 70, 229, 0.6);
1381
+ box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.12);
1382
+ }
1383
+
1384
+ .hv-signature-item-stack {
1385
+ display: flex;
1386
+ flex-direction: column;
1387
+ align-items: flex-start;
1388
+ gap: 8px;
1389
+ min-width: 0;
1390
+ width: 100%;
1391
+ }
1392
+
1393
+ .hv-signature-item-image {
1394
+ height: 48px;
1395
+ max-width: 100%;
1396
+ object-fit: contain;
1397
+ }
1398
+
1399
+ .hv-signature-item-copy {
1400
+ display: flex;
1401
+ flex-direction: column;
1402
+ gap: 4px;
1403
+ font-size: 11px;
1404
+ color: var(--hv-muted);
1405
+ min-width: 0;
1406
+ width: 100%;
1407
+ }
1408
+
1409
+ .hv-signature-item-copy strong {
1410
+ color: var(--hv-fg);
1411
+ font-size: 12px;
1412
+ white-space: normal;
1413
+ word-break: break-word;
1414
+ }
1415
+
1416
+ .hv-signature-item-copy em {
1417
+ font-style: italic;
1418
+ }
1419
+
1420
+ .hv-signature-item-check {
1421
+ margin-left: auto;
1422
+ display: inline-flex;
1423
+ align-items: center;
1424
+ justify-content: center;
1425
+ width: 24px;
1426
+ height: 24px;
1427
+ border-radius: 999px;
1428
+ background: rgba(34, 197, 94, 0.12);
1429
+ color: #16a34a;
1430
+ }
1431
+
1432
+ .hv-image-surface {
1433
+ width: fit-content;
1434
+ max-width: min(100%, 1080px);
1435
+ padding: 20px;
1436
+ background: var(--hv-page-bg);
1437
+ }
1438
+
1439
+ .hv-image-renderer {
1440
+ display: block;
1441
+ max-width: min(100%, 1020px);
1442
+ height: auto;
1443
+ }
1444
+
1445
+ .hv-slide-surface {
1446
+ width: min(100%, 1080px);
1447
+ overflow: hidden;
1448
+ }
1449
+
1450
+ .hv-slide-stage {
1451
+ position: relative;
1452
+ width: 100%;
1453
+ height: 100%;
1454
+ overflow: hidden;
1455
+ }
1456
+
1457
+ .hv-slide-scene {
1458
+ position: absolute;
1459
+ inset: 0 auto auto 0;
1460
+ transform-origin: top left;
1461
+ }
1462
+
1463
+ .hv-slide-stage .hv-signature-stamp {
1464
+ padding: 6px 8px 4px;
1465
+ gap: 6px;
1466
+ }
1467
+
1468
+ .hv-slide-stage .hv-signature-meta {
1469
+ padding-top: 2px;
1470
+ border-top: none;
1471
+ font-size: 12px;
1472
+ gap: 3px;
1473
+ }
1474
+
1475
+ .hv-slide-stage .hv-signature-meta-name {
1476
+ font-weight: 700;
1477
+ }
1478
+
1479
+ .hv-slide-stage .hv-signature-meta-date {
1480
+ font-weight: 600;
1481
+ }
1482
+
1483
+ .hv-slide-element {
1484
+ position: absolute;
1485
+ box-sizing: border-box;
1486
+ overflow: hidden;
1487
+ }
1488
+
1489
+ .hv-slide-element.shape {
1490
+ padding: 8px 10px;
1491
+ border: 1px solid transparent;
1492
+ }
1493
+
1494
+ .hv-slide-textbox {
1495
+ width: 100%;
1496
+ height: 100%;
1497
+ padding: 10px 12px;
1498
+ overflow: hidden;
1499
+ word-break: break-word;
1500
+ }
1501
+
1502
+ .hv-slide-paragraph {
1503
+ display: block;
1504
+ margin: 0 0 10px;
1505
+ line-height: 1.34;
1506
+ white-space: normal;
1507
+ }
1508
+
1509
+ .hv-slide-paragraph.align-ctr {
1510
+ text-align: center;
1511
+ }
1512
+
1513
+ .hv-slide-paragraph.align-r {
1514
+ text-align: right;
1515
+ }
1516
+
1517
+ .hv-slide-paragraph.align-l {
1518
+ text-align: left;
1519
+ }
1520
+
1521
+ .hv-slide-bullet {
1522
+ display: inline-block;
1523
+ width: 1.1em;
1524
+ font-size: 0;
1525
+ vertical-align: top;
1526
+ }
1527
+
1528
+ .hv-slide-bullet::before {
1529
+ content: "\2022";
1530
+ font-size: 0.95rem;
1531
+ color: currentColor;
1532
+ }
1533
+
1534
+ .hv-slide-paragraph-copy {
1535
+ display: inline;
1536
+ white-space: pre-wrap;
1537
+ }
1538
+
1539
+ .hv-slide-image {
1540
+ width: 100%;
1541
+ height: 100%;
1542
+ object-fit: contain;
1543
+ }
1544
+
1545
+ .hv-slide-image-fallback {
1546
+ display: flex;
1547
+ width: 100%;
1548
+ height: 100%;
1549
+ align-items: center;
1550
+ justify-content: center;
1551
+ padding: 12px;
1552
+ background: linear-gradient(135deg, #f8fafc, #eef2ff);
1553
+ color: #64748b;
1554
+ font-size: 14px;
1555
+ text-align: center;
1556
+ }
1557
+
1558
+ .hv-sheet-container {
1559
+ width: min(100%, 1180px);
1560
+ padding: 0;
1561
+ overflow: hidden;
1562
+ }
1563
+
1564
+ .hv-sheet-tabs {
1565
+ display: flex;
1566
+ align-items: center;
1567
+ justify-content: space-between;
1568
+ gap: 12px;
1569
+ padding: 12px;
1570
+ overflow-x: auto;
1571
+ background: var(--hv-sheet-scroll-bg);
1572
+ border-bottom: 1px solid var(--hv-border);
1573
+ }
1574
+
1575
+ .hv-sheet-tab-list {
1576
+ display: flex;
1577
+ gap: 8px;
1578
+ overflow-x: auto;
1579
+ }
1580
+
1581
+ .hv-sheet-tab {
1582
+ flex: 0 0 auto;
1583
+ padding: 8px 14px;
1584
+ border: 1px solid transparent;
1585
+ border-radius: 999px;
1586
+ background: rgba(148, 163, 184, 0.14);
1587
+ color: var(--hv-fg);
1588
+ font-size: 12px;
1589
+ font-weight: 600;
1590
+ cursor: pointer;
1591
+ }
1592
+
1593
+ .hv-sheet-tab.active {
1594
+ background: rgba(37, 99, 235, 0.12);
1595
+ border-color: rgba(37, 99, 235, 0.2);
1596
+ color: #1d4ed8;
1597
+ }
1598
+
1599
+ .hv-sheet-actions {
1600
+ display: flex;
1601
+ flex: 0 0 auto;
1602
+ align-items: center;
1603
+ gap: 8px;
1604
+ }
1605
+
1606
+ .hv-sheet-actions .hv-btn {
1607
+ min-width: auto;
1608
+ padding: 0 12px;
1609
+ color: var(--hv-fg);
1610
+ background: var(--hv-paper-bg);
1611
+ border-color: var(--hv-border);
1612
+ }
1613
+
1614
+ .hv-sheet-formula-bar {
1615
+ display: flex;
1616
+ gap: 12px;
1617
+ align-items: center;
1618
+ padding: 10px 12px;
1619
+ border-bottom: 1px solid var(--hv-border);
1620
+ background: var(--hv-paper-bg);
1621
+ }
1622
+
1623
+ .hv-sheet-formula-cell {
1624
+ min-width: 64px;
1625
+ padding: 8px 10px;
1626
+ border-radius: 10px;
1627
+ background: var(--hv-sheet-header-bg);
1628
+ color: var(--hv-sheet-header-fg);
1629
+ font-size: 12px;
1630
+ font-weight: 700;
1631
+ text-align: center;
1632
+ }
1633
+
1634
+ .hv-sheet-formula-input {
1635
+ flex: 1;
1636
+ min-width: 0;
1637
+ border: 1px solid var(--hv-input-border);
1638
+ border-radius: 10px;
1639
+ padding: 10px 12px;
1640
+ outline: none;
1641
+ font-size: 13px;
1642
+ background: var(--hv-input-bg);
1643
+ color: var(--hv-input-fg);
1644
+ }
1645
+
1646
+ .hv-sheet-viewport-note {
1647
+ padding: 10px 12px;
1648
+ border-bottom: 1px solid var(--hv-border);
1649
+ background: rgba(148, 163, 184, 0.08);
1650
+ color: var(--hv-muted);
1651
+ font-size: 12px;
1652
+ }
1653
+
1654
+ .hv-sheet-scroll {
1655
+ overflow: auto;
1656
+ max-height: calc(100vh - 240px);
1657
+ background: var(--hv-sheet-scroll-bg);
1658
+ }
1659
+
1660
+ .hv-sheet-surface {
1661
+ position: relative;
1662
+ width: max-content;
1663
+ min-width: 100%;
1664
+ background: var(--hv-sheet-cell-bg);
1665
+ }
1666
+
1667
+ .hv-sheet-table {
1668
+ border-collapse: collapse;
1669
+ table-layout: fixed;
1670
+ }
1671
+
1672
+ .hv-sheet-corner,
1673
+ .hv-sheet-column-header,
1674
+ .hv-sheet-row-header {
1675
+ background: var(--hv-sheet-header-bg);
1676
+ color: var(--hv-sheet-header-fg);
1677
+ font-size: 11px;
1678
+ font-weight: 700;
1679
+ border: 1px solid var(--hv-border);
1680
+ }
1681
+
1682
+ .hv-sheet-corner {
1683
+ width: 48px;
1684
+ min-width: 48px;
1685
+ position: sticky;
1686
+ left: 0;
1687
+ top: 0;
1688
+ z-index: 30;
1689
+ }
1690
+
1691
+ .hv-sheet-column-header {
1692
+ position: sticky;
1693
+ top: 0;
1694
+ z-index: 20;
1695
+ padding: 8px 0;
1696
+ }
1697
+
1698
+ .hv-sheet-row-header {
1699
+ width: 48px;
1700
+ min-width: 48px;
1701
+ text-align: center;
1702
+ position: sticky;
1703
+ left: 0;
1704
+ z-index: 10;
1705
+ }
1706
+
1707
+ .hv-sheet-cell {
1708
+ border: 1px solid var(--hv-border);
1709
+ padding: 8px 10px;
1710
+ font-size: 13px;
1711
+ color: var(--hv-sheet-cell-fg);
1712
+ white-space: pre-wrap;
1713
+ vertical-align: top;
1714
+ outline: none;
1715
+ background: var(--hv-sheet-cell-bg);
1716
+ }
1717
+
1718
+ .hv-sheet-cell.active {
1719
+ box-shadow: inset 0 0 0 2px rgba(37, 99, 235, 0.45);
1720
+ background: rgba(239, 246, 255, 0.7);
1721
+ }
1722
+
1723
+ .hv-toolbar-page-group {
1724
+ display: flex;
1725
+ align-items: center;
1726
+ gap: 8px;
1727
+ color: var(--hv-fg);
1728
+ font-size: 14px;
1729
+ font-weight: 600;
1730
+ }
1731
+
1732
+ .hv-toolbar-page-input {
1733
+ width: 48px;
1734
+ text-align: center;
1735
+ border: 1px solid var(--hv-input-border);
1736
+ border-radius: 8px;
1737
+ padding: 6px 4px;
1738
+ background: var(--hv-input-bg);
1739
+ color: var(--hv-input-fg);
1740
+ outline: none;
1741
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
1742
+ }
1743
+
1744
+ .hv-toolbar-page-input:focus {
1745
+ border-color: var(--hv-primary);
1746
+ box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.18);
1747
+ }
1748
+
1749
+ .hv-toolbar-page-sep {
1750
+ color: var(--hv-muted);
1751
+ }
1752
+
1753
+ .hv-btn-label {
1754
+ display: inline;
1755
+ }
1756
+
1757
+ .hv-thumb-skeleton {
1758
+ width: 100%;
1759
+ height: 100%;
1760
+ display: flex;
1761
+ align-items: center;
1762
+ justify-content: center;
1763
+ background: var(--hv-thumb-skeleton-bg);
1764
+ color: var(--hv-thumb-skeleton-fg);
1765
+ animation: hv-pulse 1.2s ease-in-out infinite;
1766
+ }
1767
+
1768
+ .hv-thumb-empty,
1769
+ .hv-empty-state,
1770
+ .hv-loading-copy {
1771
+ padding: 16px;
1772
+ text-align: center;
1773
+ color: var(--hv-muted);
1774
+ }
1775
+
1776
+ .hv-empty-state {
1777
+ font-size: 14px;
1778
+ }
1779
+
1780
+ .hv-thumb-empty {
1781
+ font-size: 12px;
1782
+ }
1783
+
1784
+ .hv-loading-copy {
1785
+ padding: 48px;
1786
+ font-size: 14px;
1787
+ }
1788
+
1789
+ @keyframes hv-pulse {
1790
+ 0%, 100% { opacity: 0.6; }
1791
+ 50% { opacity: 1; }
1792
+ }
1793
+
1794
+ @media (max-width: 640px) {
1795
+ .hv-richtext-authoring-top {
1796
+ margin: 0 0 16px;
1797
+ }
1798
+
1799
+ .hv-richtext-toolbar,
1800
+ .hv-richtext-template-panel {
1801
+ padding-left: 16px;
1802
+ padding-right: 16px;
1803
+ }
1804
+
1805
+ .hv-richtext-image-editor {
1806
+ grid-template-columns: 1fr;
1807
+ }
1808
+
1809
+ .hv-btn-label {
1810
+ display: none;
1811
+ }
1812
+ }
1813
+
1814
+ @media (max-width: 900px) {
1815
+ .hv-richtext-toolbar {
1816
+ gap: 12px;
1817
+ }
1818
+
1819
+ .hv-richtext-toolbar-row {
1820
+ flex-direction: column;
1821
+ align-items: stretch;
1822
+ gap: 10px;
1823
+ }
1824
+
1825
+ .hv-richtext-toolbar-section {
1826
+ padding: 12px;
1827
+ border: 1px solid var(--hv-border);
1828
+ border-radius: 14px;
1829
+ background: var(--hv-modal-subtle-bg);
1830
+ }
1831
+
1832
+ .hv-richtext-toolbar-section::after {
1833
+ display: none;
1834
+ }
1835
+
1836
+ .hv-richtext-toolbar-section-toggle {
1837
+ display: flex;
1838
+ align-items: center;
1839
+ justify-content: space-between;
1840
+ gap: 12px;
1841
+ width: 100%;
1842
+ padding: 0;
1843
+ border: none;
1844
+ background: transparent;
1845
+ color: var(--hv-fg);
1846
+ text-align: left;
1847
+ cursor: pointer;
1848
+ }
1849
+
1850
+ .hv-richtext-toolbar-section-toggle .hv-richtext-toolbar-label {
1851
+ color: var(--hv-fg);
1852
+ }
1853
+
1854
+ .hv-richtext-toolbar-toggle-copy {
1855
+ flex: 0 0 auto;
1856
+ font-size: 10px;
1857
+ font-weight: 800;
1858
+ letter-spacing: 0.08em;
1859
+ text-transform: uppercase;
1860
+ color: var(--hv-primary);
1861
+ }
1862
+
1863
+ .hv-richtext-toolbar-section-toggle.open .hv-richtext-toolbar-toggle-copy {
1864
+ color: var(--hv-muted);
1865
+ }
1866
+
1867
+ .hv-richtext-select {
1868
+ width: 100%;
1869
+ }
1870
+ }