返回 ppt-master
style.css
1 /* ============================================================
2 PPT Master - SVG Editor | Dark theme, three-panel layout
3 ============================================================ */
4
5 /* ---------- Reset & Base ---------- */
6 *, *::before, *::after {
7 margin: 0;
8 padding: 0;
9 box-sizing: border-box;
10 }
11
12 html, body {
13 height: 100%;
14 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
15 font-size: 14px;
16 color: #e0e0e0;
17 background: #1a1a2e;
18 overflow: hidden;
19 }
20
21 /* ---------- App shell ---------- */
22 #app {
23 display: flex;
24 height: 100vh;
25 width: 100vw;
26 }
27
28 /* ======================== LEFT PANEL ======================== */
29 #panel-left {
30 width: 200px;
31 min-width: 200px;
32 background: #16162a;
33 border-right: 1px solid #2a2a4a;
34 display: flex;
35 flex-direction: column;
36 overflow: hidden;
37 }
38
39 #panel-left .panel-header {
40 padding: 14px 16px;
41 font-weight: 600;
42 font-size: 15px;
43 border-bottom: 1px solid #2a2a4a;
44 flex-shrink: 0;
45 }
46
47 #slide-list {
48 flex: 1;
49 overflow-y: auto;
50 padding: 8px 0;
51 }
52
53 .slide-list-empty {
54 padding: 12px 16px;
55 color: #5a5a7a;
56 font-size: 13px;
57 line-height: 1.5;
58 }
59
60 /* Scrollbar */
61 #slide-list::-webkit-scrollbar {
62 width: 6px;
63 }
64 #slide-list::-webkit-scrollbar-track {
65 background: transparent;
66 }
67 #slide-list::-webkit-scrollbar-thumb {
68 background: #3a3a5a;
69 border-radius: 3px;
70 }
71
72 /* Slide item */
73 .slide-item {
74 display: flex;
75 align-items: center;
76 gap: 10px;
77 padding: 10px 16px;
78 cursor: pointer;
79 transition: background 0.15s;
80 border-left: 3px solid transparent;
81 user-select: none;
82 }
83
84 .slide-item:hover {
85 background: #1f1f38;
86 }
87
88 .slide-item.active {
89 background: #1e3a5f;
90 border-left-color: #4a9eff;
91 }
92
93 .slide-item.slide-error {
94 border-left-color: #ef4444;
95 }
96
97 .slide-item.slide-error .slide-name {
98 color: #fca5a5;
99 }
100
101 .slide-item.slide-error .slide-name::before {
102 content: "⚠ ";
103 color: #ef4444;
104 }
105
106 .slide-item .slide-name {
107 flex: 1;
108 white-space: nowrap;
109 overflow: hidden;
110 text-overflow: ellipsis;
111 font-size: 13px;
112 }
113
114 .slide-item .badge {
115 display: inline-flex;
116 align-items: center;
117 justify-content: center;
118 min-width: 20px;
119 height: 20px;
120 padding: 0 5px;
121 border-radius: 10px;
122 background: #f5c542;
123 color: #1a1a2e;
124 font-size: 11px;
125 font-weight: 700;
126 line-height: 1;
127 }
128
129 /* ======================== CENTER PANEL ======================== */
130 #panel-center {
131 flex: 1;
132 display: flex;
133 flex-direction: column;
134 align-items: stretch;
135 justify-content: stretch;
136 background: #12121f;
137 overflow: hidden;
138 }
139
140 #slide-nav {
141 flex-shrink: 0;
142 display: flex;
143 align-items: center;
144 justify-content: center;
145 gap: 8px;
146 padding: 10px 16px;
147 border-bottom: 1px solid #2a2a4a;
148 background: #16162a;
149 user-select: none;
150 }
151
152 .nav-btn {
153 min-width: 32px;
154 height: 28px;
155 padding: 0 8px;
156 font-size: 14px;
157 font-weight: 600;
158 line-height: 1;
159 color: #c0c0d8;
160 background: transparent;
161 border: 1px solid #3a3a5a;
162 border-radius: 4px;
163 cursor: pointer;
164 transition: background 0.15s, border-color 0.15s, color 0.15s;
165 }
166
167 .nav-btn:hover:not(:disabled) {
168 color: #ffffff;
169 background: #2a2a4a;
170 border-color: #5a5a7a;
171 }
172
173 .nav-btn:disabled {
174 opacity: 0.35;
175 cursor: not-allowed;
176 }
177
178 #nav-label {
179 display: flex;
180 align-items: baseline;
181 gap: 10px;
182 min-width: 220px;
183 max-width: 480px;
184 padding: 0 6px;
185 font-size: 13px;
186 color: #c0c0d8;
187 justify-content: center;
188 }
189
190 #nav-counter {
191 font-variant-numeric: tabular-nums;
192 font-weight: 600;
193 color: #f5c542;
194 white-space: nowrap;
195 }
196
197 #nav-name {
198 color: #8a8aaa;
199 overflow: hidden;
200 text-overflow: ellipsis;
201 white-space: nowrap;
202 }
203
204 #svg-container {
205 flex: 1;
206 display: flex;
207 align-items: center;
208 justify-content: center;
209 overflow: auto;
210 padding: 24px;
211 position: relative;
212 }
213
214 #svg-placeholder {
215 color: #5a5a7a;
216 font-size: 16px;
217 user-select: none;
218 }
219
220 #svg-content {
221 background: #ffffff;
222 border-radius: 4px;
223 box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
224 max-width: 100%;
225 max-height: 100%;
226 overflow: visible;
227 position: relative;
228 }
229
230 #svg-content svg {
231 display: block;
232 /* Both dimensions auto so the box hugs the slide at any aspect ratio: with
233 only height:auto, portrait formats (e.g. 1242x1660) keep their attribute
234 width while max-height shrinks the height, leaving large white bands
235 inside the white card. width:auto lets the element scale proportionally. */
236 width: auto;
237 height: auto;
238 max-width: 100%;
239 max-height: calc(100vh - 72px);
240 }
241
242 /* ---------- SVG element interaction states ---------- */
243 .svg-selectable {
244 cursor: pointer;
245 transition: outline 0.12s ease;
246 }
247
248 .svg-selectable:hover {
249 outline: 2px solid #4a9eff;
250 outline-offset: 2px;
251 }
252
253 .svg-selected {
254 outline: 2px solid #4a9eff !important;
255 outline-offset: 2px;
256 cursor: move;
257 }
258
259 /* While a drag is in progress, keep the move cursor everywhere so it does not
260 flicker to the hovered element's cursor as the pointer crosses other shapes. */
261 body.svg-dragging,
262 body.svg-dragging * {
263 cursor: move !important;
264 }
265
266 .svg-annotated {
267 outline: 2px solid #f59e0b !important;
268 outline-offset: 2px;
269 }
270
271 /* ======================== RIGHT PANEL ======================== */
272 #panel-right {
273 width: 280px;
274 min-width: 280px;
275 background: #16162a;
276 border-left: 1px solid #2a2a4a;
277 display: flex;
278 flex-direction: column;
279 overflow: hidden;
280 position: relative;
281 }
282
283 #panel-right .panel-header {
284 padding: 14px 16px;
285 font-weight: 600;
286 font-size: 15px;
287 border-bottom: 1px solid #2a2a4a;
288 flex-shrink: 0;
289 }
290
291 /* --- Selection info --- */
292 #selection-info {
293 padding: 12px 16px;
294 border-bottom: 1px solid #2a2a4a;
295 flex-shrink: 0;
296 }
297
298 .section-label {
299 font-size: 11px;
300 text-transform: uppercase;
301 letter-spacing: 0.8px;
302 color: #7a7a9a;
303 margin-bottom: 8px;
304 font-weight: 600;
305 }
306
307 #selected-element {
308 font-size: 13px;
309 word-break: break-all;
310 }
311
312 #selected-element.empty {
313 color: #5a5a7a;
314 font-style: italic;
315 }
316
317 #selected-element .el-tag {
318 display: inline-block;
319 padding: 2px 8px;
320 background: #2a2a4a;
321 border-radius: 4px;
322 font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
323 font-size: 12px;
324 color: #7ab4ff;
325 margin-right: 6px;
326 }
327
328 #selected-element .el-id {
329 font-size: 12px;
330 color: #a0a0c0;
331 }
332
333 /* --- Pending status --- */
334 .pending-status {
335 margin: 0 16px 10px;
336 padding: 8px 10px;
337 border: 1px solid #2a2a4a;
338 border-radius: 6px;
339 font-size: 12px;
340 line-height: 1.4;
341 }
342
343 .pending-status.empty {
344 color: #7a7a9a;
345 background: #18182a;
346 }
347
348 .pending-status.active {
349 color: #f8d46b;
350 background: rgba(245, 197, 66, 0.08);
351 border-color: rgba(245, 197, 66, 0.45);
352 }
353
354 .pending-pages {
355 margin-top: 3px;
356 color: #b8a866;
357 word-break: break-word;
358 }
359
360 /* --- Annotation input --- */
361 #annotation-input {
362 padding: 12px 16px;
363 border-bottom: 1px solid #2a2a4a;
364 flex-shrink: 0;
365 }
366
367 #annotation-quick-actions {
368 display: flex;
369 flex-wrap: wrap;
370 gap: 6px;
371 margin-bottom: 8px;
372 }
373
374 .annotation-quick-chip {
375 padding: 4px 8px;
376 font-size: 11.5px;
377 color: #c0c0d8;
378 background: #1e1e36;
379 border: 1px solid #3a3a5a;
380 border-radius: 999px;
381 cursor: pointer;
382 transition: background 0.15s, border-color 0.15s, color 0.15s;
383 }
384
385 .annotation-quick-chip:hover {
386 color: #ffffff;
387 background: #2a2a4a;
388 border-color: #4a9eff;
389 }
390
391 #annotation-text {
392 width: 100%;
393 min-height: 80px;
394 max-height: 160px;
395 resize: vertical;
396 padding: 10px 12px;
397 font-size: 13px;
398 font-family: inherit;
399 color: #e0e0e0;
400 background: #1e1e36;
401 border: 1px solid #3a3a5a;
402 border-radius: 6px;
403 outline: none;
404 transition: border-color 0.2s;
405 }
406
407 #annotation-text:focus {
408 border-color: #4a9eff;
409 }
410
411 #annotation-text::placeholder {
412 color: #5a5a7a;
413 }
414
415 #btn-add-annotation {
416 margin-top: 10px;
417 width: 100%;
418 padding: 9px 0;
419 font-size: 13px;
420 font-weight: 600;
421 color: #fff;
422 background: #4a9eff;
423 border: none;
424 border-radius: 6px;
425 cursor: pointer;
426 transition: background 0.15s;
427 }
428
429 #btn-add-annotation:hover {
430 background: #3a8eef;
431 }
432
433 #btn-add-annotation:active {
434 background: #2a7edf;
435 }
436
437 /* --- Annotation list --- */
438 #annotation-list {
439 flex: 1;
440 overflow-y: auto;
441 padding: 12px 16px;
442 display: flex;
443 flex-direction: column;
444 }
445
446 #annotation-list::-webkit-scrollbar {
447 width: 6px;
448 }
449 #annotation-list::-webkit-scrollbar-track {
450 background: transparent;
451 }
452 #annotation-list::-webkit-scrollbar-thumb {
453 background: #3a3a5a;
454 border-radius: 3px;
455 }
456
457 #annotations {
458 display: flex;
459 flex-direction: column;
460 gap: 8px;
461 }
462
463 .annotation-item {
464 background: #1e1e36;
465 border: 1px solid #2a2a4a;
466 border-radius: 6px;
467 padding: 10px 12px;
468 display: flex;
469 flex-direction: column;
470 gap: 6px;
471 }
472
473 .annotation-item .ann-header {
474 display: flex;
475 align-items: center;
476 justify-content: space-between;
477 }
478
479 .annotation-item .ann-tag {
480 font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
481 font-size: 11px;
482 color: #f59e0b;
483 background: rgba(245, 158, 11, 0.1);
484 padding: 2px 6px;
485 border-radius: 3px;
486 }
487
488 .annotation-item .ann-id {
489 font-size: 11px;
490 color: #7a7a9a;
491 }
492
493 .annotation-item .ann-remove {
494 background: none;
495 border: none;
496 color: #ff6b6b;
497 cursor: pointer;
498 font-size: 16px;
499 line-height: 1;
500 padding: 0 4px;
501 border-radius: 3px;
502 transition: background 0.15s;
503 }
504
505 .annotation-item .ann-remove:hover {
506 background: rgba(255, 107, 107, 0.15);
507 }
508
509 .annotation-item .ann-text {
510 font-size: 13px;
511 color: #c0c0d8;
512 word-break: break-word;
513 white-space: pre-wrap;
514 }
515
516 .annotations-empty {
517 color: #5a5a7a;
518 font-size: 13px;
519 font-style: italic;
520 }
521
522 /* --- Action buttons --- */
523 #preview-actions {
524 padding: 12px 16px 16px;
525 display: flex;
526 flex-direction: column;
527 gap: 10px;
528 flex-shrink: 0;
529 }
530
531 .lang-select {
532 position: absolute;
533 top: 10px;
534 right: 12px;
535 z-index: 5;
536 }
537
538 .lang-select-btn {
539 display: flex;
540 align-items: center;
541 gap: 5px;
542 min-width: 34px;
543 padding: 3px 10px;
544 font-size: 12px;
545 font-weight: 600;
546 color: #c0c0d8;
547 background: #1e1e3a;
548 border: 1px solid #3a3a5a;
549 border-radius: 4px;
550 cursor: pointer;
551 transition: background 0.15s, border-color 0.15s, color 0.15s;
552 }
553
554 .lang-select-btn:hover {
555 color: #ffffff;
556 background: #2a2a4a;
557 border-color: #5a5a7a;
558 }
559
560 .lang-caret { font-size: 9px; color: #8a8aa8; }
561
562 .lang-menu {
563 position: absolute;
564 right: 0;
565 top: calc(100% + 4px);
566 margin: 0;
567 padding: 4px;
568 list-style: none;
569 min-width: 96px;
570 background: #1e1e3a;
571 border: 1px solid #3a3a5a;
572 border-radius: 6px;
573 box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
574 }
575
576 .lang-menu li {
577 padding: 6px 10px;
578 border-radius: 4px;
579 font-size: 12px;
580 color: #c0c0d8;
581 cursor: pointer;
582 }
583
584 .lang-menu li:hover,
585 .lang-menu li:focus { background: #2a2a4a; color: #ffffff; }
586 .lang-menu li.selected { color: #ffffff; font-weight: 600; }
587
588 #btn-save {
589 padding: 11px 0;
590 font-size: 14px;
591 font-weight: 600;
592 color: #1a1a2e;
593 background: #f5c542;
594 border: none;
595 border-radius: 6px;
596 cursor: pointer;
597 flex-shrink: 0;
598 transition: background 0.15s;
599 }
600
601 #btn-save:hover {
602 background: #e5b532;
603 }
604
605 #btn-save:active {
606 background: #d5a522;
607 }
608
609 #btn-exit-preview {
610 padding: 10px 0;
611 font-size: 13px;
612 font-weight: 600;
613 color: #c0c0d8;
614 background: transparent;
615 border: 1px solid #3a3a5a;
616 border-radius: 6px;
617 cursor: pointer;
618 transition: background 0.15s, border-color 0.15s, color 0.15s;
619 }
620
621 #btn-exit-preview:hover {
622 color: #ffffff;
623 background: #2a2a4a;
624 border-color: #5a5a7a;
625 }
626
627 #btn-exit-preview:active {
628 background: #1e1e36;
629 }
630
631 .btn-undo {
632 padding: 10px 0;
633 font-size: 13px;
634 font-weight: 600;
635 color: #c0c0d8;
636 background: transparent;
637 border: 1px solid #3a3a5a;
638 border-radius: 6px;
639 cursor: pointer;
640 transition: background 0.15s, border-color 0.15s, color 0.15s;
641 }
642
643 .btn-undo:hover:not(:disabled) {
644 color: #ffffff;
645 background: #2a2a4a;
646 border-color: #5a5a7a;
647 }
648
649 .btn-undo:disabled {
650 opacity: 0.4;
651 cursor: not-allowed;
652 }
653
654 /* ======================== MODAL ======================== */
655 #modal-overlay {
656 position: fixed;
657 inset: 0;
658 background: rgba(0, 0, 0, 0.65);
659 display: flex;
660 align-items: center;
661 justify-content: center;
662 z-index: 1000;
663 }
664
665 #modal {
666 background: #1e1e36;
667 border: 1px solid #3a3a5a;
668 border-radius: 10px;
669 padding: 28px 32px;
670 max-width: 480px;
671 width: 90%;
672 box-shadow: 0 8px 40px rgba(0, 0, 0, 0.5);
673 text-align: center;
674 }
675
676 #modal-message {
677 font-size: 14px;
678 line-height: 1.7;
679 color: #d0d0e8;
680 margin-bottom: 20px;
681 white-space: pre-line;
682 text-align: left;
683 }
684
685 #modal-buttons {
686 display: flex;
687 gap: 12px;
688 justify-content: center;
689 }
690
691 #modal-confirm {
692 padding: 10px 32px;
693 font-size: 14px;
694 font-weight: 600;
695 color: #1a1a2e;
696 background: #f5c542;
697 border: none;
698 border-radius: 6px;
699 cursor: pointer;
700 transition: background 0.15s;
701 }
702
703 #modal-confirm:hover {
704 background: #e5b532;
705 }
706
707 #modal-cancel {
708 padding: 10px 32px;
709 font-size: 14px;
710 font-weight: 600;
711 color: #a0a0c0;
712 background: transparent;
713 border: 1px solid #3a3a5a;
714 border-radius: 6px;
715 cursor: pointer;
716 transition: background 0.15s;
717 }
718
719 #modal-cancel:hover {
720 background: #2a2a4a;
721 }
722
723 /* --- Element properties --- */
724 #element-props {
725 margin-top: 10px;
726 font-size: 12px;
727 max-height: 200px;
728 overflow-y: auto;
729 }
730
731 .prop-table {
732 width: 100%;
733 border-collapse: collapse;
734 }
735
736 .prop-table tr {
737 border-bottom: 1px solid #2a2a4a;
738 }
739
740 .prop-table tr:last-child {
741 border-bottom: none;
742 }
743
744 .prop-table td {
745 padding: 4px 0;
746 vertical-align: top;
747 }
748
749 .prop-table .prop-key {
750 color: #7a7a9a;
751 width: 80px;
752 font-size: 11px;
753 text-transform: uppercase;
754 letter-spacing: 0.4px;
755 }
756
757 .prop-table .prop-val {
758 color: #c0c0d8;
759 font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace;
760 font-size: 12px;
761 word-break: break-all;
762 }
763
764 .prop-table .prop-color {
765 display: inline-block;
766 width: 12px;
767 height: 12px;
768 border-radius: 2px;
769 vertical-align: middle;
770 margin-right: 4px;
771 border: 1px solid #3a3a5a;
772 }
773
774 /* --- Direct-edit controls --- */
775 .prop-caption {
776 font-size: 10px;
777 text-transform: uppercase;
778 letter-spacing: 0.6px;
779 color: #6a8ec0;
780 margin-bottom: 6px;
781 font-weight: 600;
782 }
783
784 .prop-section {
785 margin-top: 10px;
786 margin-bottom: 4px;
787 font-size: 10px;
788 color: #8a8aaa;
789 text-transform: uppercase;
790 letter-spacing: 0.4px;
791 font-weight: 600;
792 }
793
794 .prop-section:first-of-type {
795 margin-top: 0;
796 }
797
798 .prop-table .prop-ro {
799 color: #8a8aaa;
800 }
801
802 .prop-table .prop-note {
803 color: #8a8aaa;
804 font-family: inherit;
805 font-style: italic;
806 }
807
808 .prop-edit {
809 font-family: inherit;
810 color: #e0e0e0;
811 background: #1e1e36;
812 border: 1px solid #3a3a5a;
813 border-radius: 4px;
814 outline: none;
815 font-size: 12px;
816 transition: border-color 0.15s;
817 }
818
819 .prop-edit:focus {
820 border-color: #4a9eff;
821 }
822
823 textarea.prop-edit-content,
824 textarea.prop-edit-attr-area {
825 width: 100%;
826 resize: vertical;
827 padding: 6px 8px;
828 line-height: 1.4;
829 }
830
831 input.prop-edit-attr {
832 width: 100%;
833 padding: 4px 6px;
834 }
835
836 input.prop-edit-number {
837 width: 72px;
838 padding: 4px 6px;
839 }
840
841 select.prop-edit-select {
842 width: 100%;
843 padding: 4px 6px;
844 }
845
846 input.prop-edit-color {
847 width: 30px;
848 height: 24px;
849 padding: 0;
850 vertical-align: middle;
851 cursor: pointer;
852 background: #1e1e36;
853 }
854
855 input.prop-edit-color-text {
856 width: calc(100% - 40px);
857 margin-left: 6px;
858 padding: 4px 6px;
859 vertical-align: middle;
860 }
861
862 input.prop-edit-batch,
863 select.prop-edit-batch {
864 width: 100%;
865 padding: 4px 6px;
866 }
867
868 input.prop-edit-batch-color + input.prop-edit-batch {
869 width: calc(100% - 40px);
870 margin-left: 6px;
871 vertical-align: middle;
872 }
873
874 input.prop-edit-geo {
875 width: 56px;
876 padding: 4px 6px;
877 margin-right: 4px;
878 }
879
880 input.prop-edit-multi-geo {
881 width: 56px;
882 padding: 4px 6px;
883 margin-right: 4px;
884 }
885
886 .btn-select-group {
887 width: 100%;
888 padding: 5px 7px;
889 color: #d8e6ff;
890 background: #24365a;
891 border: 1px solid #3e5f98;
892 border-radius: 4px;
893 font-size: 12px;
894 cursor: pointer;
895 }
896
897 .btn-select-group:hover {
898 background: #2d4370;
899 }
900
901 .multi-el-list {
902 margin-top: 6px;
903 max-height: 100px;
904 overflow-y: auto;
905 font-size: 11px;
906 }
907
908 .multi-el-item {
909 padding: 2px 0;
910 color: #7a7a9a;
911 }
912
913 .multi-el-item .el-tag {
914 font-size: 10px;
915 margin-right: 4px;
916 }
917
918 .multi-summary {
919 margin-top: 8px;
920 font-size: 12px;
921 color: #a0a0c0;
922 }
923
924 /* --- Multi-select count --- */
925 .multi-count {
926 color: #4a9eff;
927 font-weight: 600;
928 font-size: 14px;
929 }
930
931 /* --- Rubber band selection --- */
932 #rubber-band-overlay {
933 position: absolute;
934 inset: 0;
935 z-index: 10;
936 pointer-events: none;
937 cursor: crosshair;
938 }
939
940 #rubber-band-overlay.active {
941 pointer-events: auto;
942 }
943
944 #rubber-band {
945 position: fixed;
946 border: 2px dashed #4a9eff;
947 background: rgba(74, 158, 255, 0.15);
948 pointer-events: none;
949 z-index: 11;
950 }
951
952 /* --- Overlap picker (right-click list of stacked elements) --- */
953 #overlap-picker {
954 position: fixed;
955 z-index: 1100;
956 min-width: 180px;
957 max-width: 340px;
958 max-height: 60vh;
959 overflow-y: auto;
960 background: #1f2430;
961 border: 1px solid #3a4252;
962 border-radius: 6px;
963 box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);
964 padding: 4px;
965 font-size: 12px;
966 }
967
968 .overlap-caption {
969 padding: 4px 8px 6px;
970 color: #8b94a7;
971 font-size: 11px;
972 }
973
974 .overlap-item {
975 display: flex;
976 align-items: baseline;
977 gap: 6px;
978 padding: 5px 8px;
979 border-radius: 4px;
980 cursor: pointer;
981 white-space: nowrap;
982 }
983
984 .overlap-item:hover {
985 background: #2d3545;
986 }
987
988 .overlap-tag { color: #4a9eff; }
989 .overlap-id { color: #e6e9ef; }
990 .overlap-txt {
991 color: #8b94a7;
992 overflow: hidden;
993 text-overflow: ellipsis;
994 }
995
996 /* Element highlighted while hovering its row in the overlap picker. */
997 .overlap-hover {
998 outline: 2px solid #f59e0b !important;
999 outline-offset: 2px;
1000 }
1001
1002 /* ======================== UTILITY ======================== */
1003 .visually-hidden {
1004 position: absolute;
1005 width: 1px;
1006 height: 1px;
1007 overflow: hidden;
1008 clip: rect(0 0 0 0);
1009 white-space: nowrap;
1010 }
1011
1011 lines CSS