style.css
⎇
Raw
1/* Custom layout and components on top of Pico.css */
2
3/* Scale down Pico's default sizing */
4html {
5 font-size: 16px;
6}
7
8/* Remove Pico's default bottom margin on button types */
9[type="button"],
10[type="reset"],
11[type="submit"] {
12 margin-bottom: 0;
13}
14
15/* Layout */
16body {
17 min-height: 100vh;
18 display: flex;
19 flex-direction: column;
20}
21
22header {
23 padding: 1rem 2rem;
24 position: sticky;
25 top: 0;
26 z-index: 100;
27 background-color: var(--pico-card-background-color);
28 border-bottom: 1px solid var(--pico-muted-border-color);
29 display: flex;
30 align-items: center;
31 gap: 2rem;
32}
33
34header h1 {
35 margin: 0;
36 flex-shrink: 0;
37 font-size: 1.5rem;
38}
39
40/* Brand: logo + wordmark, no longer a link */
41.brand {
42 display: flex;
43 align-items: center;
44 gap: 0.55rem;
45}
46
47.brand-logo {
48 display: block;
49 flex-shrink: 0;
50}
51
52nav {
53 display: flex;
54 gap: 1rem;
55}
56
57nav a {
58 color: var(--pico-muted-color);
59 text-decoration: none;
60 padding: 0.5rem 1rem;
61 border-radius: var(--pico-border-radius);
62 transition: all 0.2s;
63}
64
65nav a:hover {
66 color: var(--pico-primary);
67 background-color: var(--pico-card-sectioning-background-color);
68}
69
70nav a.active {
71 background-color: var(--pico-primary);
72 color: var(--pico-primary-inverse);
73 font-weight: 600;
74}
75
76main {
77 flex: 1;
78 padding: 2rem 1rem;
79}
80
81main > * {
82 max-width: 1400px;
83 margin-left: auto;
84 margin-right: auto;
85}
86
87footer {
88 padding: 1rem 2rem;
89 text-align: center;
90 color: var(--pico-muted-color);
91 font-size: 0.9rem;
92 background-color: var(--pico-card-background-color);
93 border-top: 1px solid var(--pico-muted-border-color);
94}
95
96/* Page headers */
97.page-header {
98 display: flex;
99 justify-content: space-between;
100 align-items: center;
101 margin-bottom: 1.5rem;
102 flex-wrap: wrap;
103 gap: 1rem;
104}
105
106.page-header h2 {
107 font-size: 1.5rem;
108 margin: 0;
109}
110
111.actions {
112 display: flex;
113 gap: 1rem;
114 align-items: center;
115 flex-wrap: wrap;
116}
117
118/* Forms */
119.form-group {
120 margin-bottom: 1rem;
121}
122
123.form-row {
124 display: grid;
125 grid-template-columns: 1fr 1fr;
126 gap: 1rem;
127}
128
129.radio-group {
130 display: flex;
131 flex-wrap: wrap;
132 gap: 1rem;
133}
134
135.radio-group label {
136 display: flex;
137 align-items: center;
138 gap: 0.3rem;
139 cursor: pointer;
140 font-weight: normal;
141 margin-bottom: 0;
142}
143
144.form-actions {
145 display: flex;
146 gap: 1rem;
147 margin-top: 1.5rem;
148}
149
150.file-selector {
151 display: flex;
152 align-items: center;
153 gap: 0.75rem;
154 flex-wrap: wrap;
155 margin-bottom: 1rem;
156}
157
158.file-selector label {
159 margin: 0;
160}
161
162.file-selector select {
163 flex: 1;
164 min-width: 0;
165 margin: 0;
166}
167
168.file-selector button {
169 margin: 0;
170 width: auto;
171 flex: none;
172}
173
174/* Buttons */
175button.small,
176[role="button"].small {
177 padding: 0.3rem 0.6rem;
178 font-size: 0.85rem;
179}
180
181button.danger,
182button.danger:hover,
183button.danger:focus,
184[role="button"].danger,
185[role="button"].danger:hover,
186[role="button"].danger:focus {
187 --pico-background-color: #c62828;
188 --pico-border-color: #c62828;
189 --pico-color: white;
190}
191
192button.danger:hover,
193button.danger:focus,
194[role="button"].danger:hover,
195[role="button"].danger:focus {
196 --pico-background-color: #b71c1c;
197 --pico-border-color: #b71c1c;
198}
199
200/* One-shot feedback banner shown after a form action (see PageData.Flash). */
201.flash {
202 padding: 0.75rem 1rem;
203 margin-bottom: 1.5rem;
204 border-radius: var(--pico-border-radius);
205 border: 1px solid transparent;
206 border-left-width: 4px;
207}
208
209.flash-success {
210 background-color: rgba(46, 125, 50, 0.12);
211 border-color: #2e7d32;
212 color: var(--pico-color);
213}
214
215.flash-error {
216 background-color: rgba(198, 40, 40, 0.12);
217 border-color: #c62828;
218 color: var(--pico-color);
219}
220
221button:disabled {
222 opacity: 0.5;
223 cursor: not-allowed;
224}
225
226/* Library */
227.breadcrumbs {
228 margin-bottom: 1rem;
229 display: flex;
230 align-items: center;
231 justify-content: flex-start;
232 gap: 0.35rem;
233 flex-wrap: wrap;
234 text-align: left;
235 width: 100%;
236}
237
238.breadcrumbs a,
239.breadcrumbs span {
240 flex-shrink: 0;
241}
242
243.breadcrumbs .current {
244 cursor: default;
245 pointer-events: none;
246}
247
248.library-grid {
249 display: grid;
250 grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
251 gap: 1rem;
252}
253
254.folder-item,
255.media-item {
256 background: var(--pico-card-background-color);
257 border: 1px solid var(--pico-card-border-color);
258 border-radius: var(--pico-border-radius);
259 overflow: hidden;
260 text-decoration: none;
261 color: var(--pico-color);
262 box-shadow: var(--pico-card-box-shadow);
263}
264
265.folder-item:hover,
266.media-item:hover {
267 background-color: var(--pico-primary-background);
268 border-color: var(--pico-primary-border);
269 box-shadow: var(--pico-card-box-shadow), 0 4px 12px rgba(0, 0, 0, 0.15);
270}
271
272.folder-item:hover .folder-name,
273.media-item:hover .media-info,
274.media-item:hover .media-title,
275.media-item:hover .media-path {
276 color: var(--pico-primary-inverse);
277}
278
279.media-info {
280 transition: color 0.2s;
281}
282
283.media-thumbnail {
284 aspect-ratio: 16/9;
285 background: var(--pico-card-sectioning-background-color);
286 display: flex;
287 align-items: center;
288 justify-content: center;
289 font-size: 3rem;
290 position: relative;
291}
292
293/* Each thumbnail sits in a tile so it can carry its own per-file duration
294 badge; the tile fills the container (single file) or a grid cell (multi). */
295.thumb-tile {
296 position: relative;
297 display: flex;
298 align-items: center;
299 justify-content: center;
300 overflow: hidden;
301 width: 100%;
302 height: 100%;
303 min-width: 0;
304 min-height: 0;
305}
306
307.thumb-tile .media-duration {
308 position: absolute;
309 bottom: 0.4rem;
310 right: 0.4rem;
311 background: rgba(0, 0, 0, 0.75);
312 color: #fff;
313 padding: 0.15rem 0.4rem;
314 border-radius: var(--pico-border-radius);
315 font-size: 0.7rem;
316 font-weight: 500;
317 line-height: 1;
318}
319
320.folder-icon {
321 aspect-ratio: 16/9;
322 background: var(--pico-card-sectioning-background-color);
323 display: flex;
324 align-items: center;
325 justify-content: center;
326 font-size: 3rem;
327}
328
329.thumb-tile img {
330 width: 100%;
331 height: 100%;
332 /* contain: show the whole thumbnail (letterboxed) and never overflow the
333 16/9 box, including portrait/vertical sources. */
334 object-fit: contain;
335}
336
337.thumb-tile img[src$=".svg"] {
338 width: 48px;
339 height: 48px;
340 opacity: 0.5;
341 object-fit: contain;
342}
343
344/* Multi-file items: tile each media file's thumbnail in a grid. */
345.media-thumbnail.count-2,
346.media-thumbnail.count-3,
347.media-thumbnail.count-many {
348 display: grid;
349 gap: 2px;
350}
351
352.media-thumbnail.count-2 {
353 grid-template-columns: 1fr 1fr;
354}
355
356.media-thumbnail.count-3,
357.media-thumbnail.count-many {
358 grid-template-columns: 1fr 1fr;
359 grid-template-rows: 1fr 1fr;
360}
361
362/* For 3 files, let the first thumbnail span the full top row. */
363.media-thumbnail.count-3 .thumb-tile:first-of-type {
364 grid-column: 1 / -1;
365}
366
367/* "+N" overlay on the last tile when there are more than 4 files. */
368.media-thumbnail .thumb-more {
369 position: absolute;
370 right: 0;
371 bottom: 0;
372 width: 50%;
373 height: 50%;
374 display: flex;
375 align-items: center;
376 justify-content: center;
377 background: rgba(0, 0, 0, 0.6);
378 color: #fff;
379 font-size: 1.1rem;
380 font-weight: 600;
381 pointer-events: none;
382}
383
384/* File-count badge in the top-left for multi-file items. */
385.media-thumbnail .thumb-count {
386 position: absolute;
387 top: 0.4rem;
388 left: 0.4rem;
389 background: rgba(0, 0, 0, 0.75);
390 color: #fff;
391 padding: 0.15rem 0.4rem;
392 border-radius: var(--pico-border-radius);
393 font-size: 0.7rem;
394 font-weight: 500;
395 line-height: 1;
396}
397
398.folder-name,
399.media-info {
400 padding: 0.75rem;
401}
402
403.media-title {
404 font-weight: 500;
405 margin-bottom: 0.3rem;
406 overflow: hidden;
407 text-overflow: ellipsis;
408 white-space: nowrap;
409}
410
411.media-path {
412 font-size: 0.85rem;
413}
414
415.media-info .media-duration {
416 display: none;
417}
418
419/* Detail view */
420.detail-view {
421 max-width: 900px;
422}
423
424.detail-header {
425 display: flex;
426 justify-content: space-between;
427 align-items: center;
428 margin-bottom: 1.5rem;
429 flex-wrap: wrap;
430 gap: 1rem;
431}
432
433.player-container {
434 background: #000;
435 border-radius: var(--pico-border-radius);
436 overflow: hidden;
437 margin-bottom: 1.5rem;
438 max-height: 80vh;
439 display: flex;
440 align-items: center;
441 justify-content: center;
442}
443
444.player-container video,
445.player-container audio {
446 max-width: 100%;
447 max-height: 80vh;
448 width: auto;
449 height: auto;
450 display: block;
451}
452
453.detail-meta dl {
454 display: grid;
455 grid-template-columns: 150px 1fr;
456 gap: 0.5rem 1rem;
457 align-items: baseline;
458}
459
460/* Render keys as understated labels so they read as keys — not just another
461 line of value text — in both the two-column and the stacked (narrow) layout. */
462.detail-meta dt {
463 font-size: 0.75rem;
464 font-weight: 600;
465 text-transform: uppercase;
466 letter-spacing: 0.04em;
467 color: var(--pico-muted-color);
468}
469
470.detail-meta dd {
471 word-break: break-all;
472 margin: 0;
473}
474
475/* Description: preserve the source line breaks; collapse long ones to ~2 lines
476 with a pure-CSS (no-JS, CSP-safe) Show more/less toggle. */
477.detail-meta dd.description {
478 margin: 0;
479}
480
481.description .desc-text {
482 white-space: pre-wrap;
483 word-break: normal;
484 overflow-wrap: anywhere;
485 line-height: 1.5;
486}
487
488/* The checkbox is the toggle state; it's driven by the label, never shown. */
489.description.collapsible .desc-toggle {
490 display: none;
491}
492
493/* Collapsed: clamp to ~2 lines (max-height works with pre-wrap; line-clamp
494 does not), with a fade so the cut reads as intentional. */
495.description.collapsible .desc-text {
496 position: relative;
497 max-height: 3em;
498 overflow: hidden;
499}
500
501.description.collapsible .desc-text::after {
502 content: "";
503 position: absolute;
504 left: 0;
505 right: 0;
506 bottom: 0;
507 height: 1.5em;
508 background: linear-gradient(to bottom, transparent, var(--pico-background-color));
509 pointer-events: none;
510}
511
512.description.collapsible .desc-toggle:checked ~ .desc-text {
513 max-height: none;
514}
515
516.description.collapsible .desc-toggle:checked ~ .desc-text::after {
517 display: none;
518}
519
520.description.collapsible .desc-toggle-label {
521 display: inline-block;
522 margin-top: 0.4rem;
523 color: var(--pico-primary);
524 font-size: 0.85rem;
525 font-weight: 600;
526 cursor: pointer;
527 user-select: none;
528}
529
530.description.collapsible .desc-toggle-label::after {
531 content: "Show more \25be";
532}
533
534.description.collapsible .desc-toggle:checked ~ .desc-toggle-label::after {
535 content: "Show less \25b4";
536}
537
538/* Queue */
539.queue-list {
540 display: flex;
541 flex-direction: column;
542 gap: 1rem;
543}
544
545.queue-item {
546 padding: 1rem;
547 margin-bottom: 0;
548 position: relative;
549 transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
550}
551
552/* Stretched link: the whole row navigates to the detail page, matching the
553 library card hover. Interactive children (Remove) sit above it via z-index. */
554.queue-link {
555 position: absolute;
556 inset: 0;
557 z-index: 1;
558}
559
560.queue-item:hover {
561 background-color: var(--pico-primary-background);
562 border-color: var(--pico-primary-border);
563 box-shadow: var(--pico-card-box-shadow), 0 4px 12px rgba(0, 0, 0, 0.15);
564 cursor: pointer;
565}
566
567/* Keep text legible on the solid primary hover background (status badges and
568 the error message keep their own colors). */
569.queue-item:hover .queue-url,
570.queue-item:hover .queue-meta {
571 color: var(--pico-primary-inverse);
572}
573
574.queue-header {
575 display: flex;
576 justify-content: space-between;
577 align-items: flex-start;
578 gap: 1rem;
579 flex-wrap: wrap;
580 margin-bottom: 0.5rem;
581}
582
583.queue-url {
584 flex: 1;
585 min-width: 0;
586 word-break: break-all;
587}
588
589.queue-status {
590 display: flex;
591 gap: 0.5rem;
592 align-items: center;
593 flex-wrap: wrap;
594}
595
596/* Keep the Remove action clickable above the stretched link overlay. */
597.queue-action {
598 position: relative;
599 z-index: 2;
600}
601
602.status-badge {
603 padding: 0.2rem 0.6rem;
604 border-radius: 12px;
605 font-size: 0.85rem;
606 font-weight: 500;
607}
608
609.status-badge.queued {
610 background: var(--pico-card-sectioning-background-color);
611 color: var(--pico-muted-color);
612}
613
614.status-badge.downloading {
615 background: var(--pico-primary);
616 color: var(--pico-primary-inverse);
617}
618
619.status-badge.completed {
620 background: var(--pico-ins-color);
621 color: white;
622}
623
624.status-badge.error {
625 background: var(--pico-del-color);
626 color: white;
627}
628
629.error-message {
630 color: var(--pico-del-color);
631 font-size: 0.9rem;
632 margin-top: 0.5rem;
633}
634
635.error-text {
636 color: var(--pico-del-color);
637}
638
639.queue-meta {
640 margin-top: 0.5rem;
641 font-size: 0.85rem;
642 display: flex;
643 gap: 1rem;
644}
645
646/* Logs */
647.logs {
648 max-height: 500px;
649 overflow-y: auto;
650 white-space: pre-wrap;
651 word-break: break-all;
652}
653
654pre {
655 padding: 1.5rem;
656}
657
658/* Settings */
659.settings-layout {
660 display: flex;
661 flex-direction: column;
662 gap: 2rem;
663}
664
665.presets-list {
666 display: flex;
667 flex-direction: column;
668 gap: 1rem;
669 margin-bottom: 1.5rem;
670}
671
672.preset-header {
673 display: flex;
674 justify-content: space-between;
675 align-items: center;
676 margin-bottom: 0.5rem;
677}
678
679.preset-header h4 {
680 display: flex;
681 align-items: center;
682 gap: 0.5rem;
683 margin: 0;
684}
685
686.badge {
687 background: var(--pico-primary);
688 color: var(--pico-primary-inverse);
689 padding: 0.1rem 0.4rem;
690 border-radius: 10px;
691 font-size: 0.75rem;
692}
693
694.preset-actions {
695 display: flex;
696 gap: 0.5rem;
697 flex-wrap: wrap;
698 margin-top: 1rem;
699}
700
701.preset-description {
702 margin-bottom: 0.5rem;
703}
704
705.preset-flags {
706 margin-top: 0.5rem;
707}
708
709.preset-flags pre {
710 overflow-x: auto;
711 margin-top: 0.3rem;
712 margin-bottom: 0;
713}
714
715/* Nested articles need visible borders */
716.presets-list article {
717 border: 1px solid var(--pico-muted-border-color);
718}
719
720/* Suppress Pico details marker for button-like summaries */
721details:has(summary[role="button"]) summary::after {
722 display: none !important;
723}
724
725details summary[role="button"] {
726 display: inline-flex;
727 width: auto;
728}
729
730/* Toggle text: Edit vs Cancel */
731details .cancel-text {
732 display: none;
733}
734
735details[open] .edit-text {
736 display: none;
737}
738
739details[open] .cancel-text {
740 display: inline;
741}
742
743/* Delete overlay popover */
744.delete-overlay {
745 position: relative;
746}
747
748.delete-overlay summary {
749 list-style: none;
750 cursor: pointer;
751}
752
753.delete-overlay summary::-webkit-details-marker {
754 display: none;
755}
756
757.delete-overlay summary::after {
758 display: none !important;
759}
760
761.delete-overlay .overlay-panel {
762 position: absolute;
763 top: calc(100% + 0.5rem);
764 right: 0;
765 z-index: 1000;
766 width: 260px;
767 background: var(--pico-background-color);
768 border: 1px solid var(--pico-muted-border-color);
769 border-radius: var(--pico-border-radius);
770 padding: 1rem;
771 box-shadow: var(--pico-dropdown-box-shadow);
772}
773
774/* Popover arrow */
775.delete-overlay .overlay-panel::before {
776 content: '';
777 position: absolute;
778 top: -6px;
779 right: 1rem;
780 width: 10px;
781 height: 10px;
782 background: var(--pico-background-color);
783 border-left: 1px solid var(--pico-muted-border-color);
784 border-top: 1px solid var(--pico-muted-border-color);
785 transform: rotate(45deg);
786}
787
788.delete-overlay .overlay-panel p {
789 margin-bottom: 1rem;
790 font-size: 0.9rem;
791}
792
793.delete-overlay .overlay-panel .form-actions {
794 margin-top: 0;
795 justify-content: flex-end;
796}
797
798/* Inline edit form */
799.edit-form {
800 padding: 1rem;
801}
802
803/* Conditional sections (no-JS show/hide) */
804.conditional-section {
805 margin-bottom: 1rem;
806}
807
808.conditional-section .conditional-content {
809 display: none;
810 margin-top: 1rem;
811}
812
813/* Checkbox triggers */
814.conditional-section:has(input[type="checkbox"].conditional-trigger:checked) .conditional-content {
815 display: block;
816}
817
818/* Radio triggers for format mode */
819.conditional-section:has(.radio-group input[value="preset"]:checked) .conditional-content.format-preset,
820.conditional-section:has(.radio-group input[value="custom"]:checked) .conditional-content.format-custom {
821 display: block;
822}
823
824/* Subscriptions: lock the cron field unless the schedule is "Custom (cron)".
825 Pure CSS — the :has() reacts live as the <select> changes, no JS needed. */
826input[name="cron_expr"] {
827 opacity: 0.5;
828 pointer-events: none;
829}
830.form-row:has(select[name="schedule_kind"] option[value="cron"]:checked) input[name="cron_expr"] {
831 opacity: 1;
832 pointer-events: auto;
833}
834
835/* Format mode selector - hidden radio inputs with button-like labels */
836.radio-group.format-mode {
837 display: flex;
838 gap: 0.5rem;
839 margin-top: 0.5rem;
840 flex-wrap: wrap;
841}
842
843.radio-group.format-mode input[type="radio"] {
844 position: absolute;
845 opacity: 0;
846 width: 0;
847 height: 0;
848}
849
850.radio-group.format-mode label {
851 padding: 0.4rem 0.8rem;
852 border: 1px solid var(--pico-muted-border-color);
853 border-radius: var(--pico-border-radius);
854 cursor: pointer;
855 background: var(--pico-background-color);
856 transition: all 0.2s;
857 font-weight: normal;
858}
859
860.radio-group.format-mode label:hover {
861 background: var(--pico-card-sectioning-background-color);
862}
863
864.radio-group.format-mode label:has(input:checked) {
865 background: var(--pico-primary);
866 color: var(--pico-primary-inverse);
867 border-color: var(--pico-primary);
868}
869
870/* Inline informational note paragraph */
871.note {
872 font-size: 0.85rem;
873 color: var(--pico-muted-color);
874}
875
876/* Collapsible "managed yt-dlp options" notes component */
877.ytdlp-notes {
878 margin: 0 0 1rem;
879 border: 1px solid var(--pico-muted-border-color);
880 border-radius: var(--pico-border-radius);
881 background: var(--pico-card-sectioning-background-color);
882 overflow: hidden;
883}
884
885.ytdlp-notes > summary {
886 cursor: pointer;
887 padding: 0.6rem 0.9rem;
888 font-size: 0.9rem;
889 font-weight: 600;
890 color: var(--pico-color);
891 user-select: none;
892 transition: background 0.15s ease-in-out;
893}
894
895.ytdlp-notes > summary:hover {
896 background: var(--pico-card-background-color);
897}
898
899.ytdlp-notes-icon {
900 color: var(--pico-primary);
901 font-style: normal;
902 font-size: 1rem;
903 margin-right: 0.4rem;
904}
905
906.ytdlp-notes-body {
907 padding: 0 0.9rem 0.6rem;
908 border-top: 1px solid var(--pico-muted-border-color);
909}
910
911.ytdlp-notes-body > p {
912 font-size: 0.85rem;
913 color: var(--pico-muted-color);
914 margin: 0.7rem 0;
915}
916
917.ytdlp-notes-table-wrap {
918 overflow-x: auto;
919}
920
921.ytdlp-notes-body table {
922 margin: 0;
923 font-size: 0.85rem;
924}
925
926.ytdlp-notes-body th,
927.ytdlp-notes-body td {
928 padding: 0.4rem 0.6rem;
929 vertical-align: top;
930}
931
932.ytdlp-notes-body td:first-child {
933 white-space: nowrap;
934}
935
936.ytdlp-notes-body code {
937 font-size: 0.8rem;
938}
939
940/* Theme selector */
941.theme-selector {
942 display: flex;
943 gap: 0.5rem;
944}
945
946.theme-selector button {
947 min-width: 80px;
948}
949
950.theme-selector button.active {
951 background: var(--pico-primary);
952 color: var(--pico-primary-inverse);
953 border-color: var(--pico-primary);
954}
955
956/* Download form */
957.download-form {
958 max-width: 900px;
959}
960
961.download-form form {
962 max-width: 800px;
963}
964
965/* Filter form inline */
966.filter-form {
967 display: flex;
968 gap: 0.5rem;
969 align-items: center;
970}
971
972.filter-form input,
973.filter-form select,
974.filter-form button {
975 margin-bottom: 0;
976 width: auto;
977 display: inline-block;
978 flex-shrink: 0;
979}
980
981.filter-form input[type="text"] {
982 min-width: 200px;
983}
984
985/* Empty state */
986.empty-state {
987 text-align: center;
988 padding: 3rem;
989}
990
991/* Utility */
992.inline {
993 display: inline;
994}
995
996/* Responsive */
997@media (max-width: 768px) {
998 main {
999 padding: 1rem;
1000 }
1001
1002 .page-header {
1003 flex-direction: column;
1004 align-items: flex-start;
1005 }
1006
1007 .library-grid {
1008 grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1009 }
1010
1011 .form-row {
1012 grid-template-columns: 1fr;
1013 }
1014
1015 .detail-meta dl {
1016 grid-template-columns: 1fr;
1017 gap: 0;
1018 }
1019
1020 /* Stacked layout: tighten key→value and space out each pair so the grouping
1021 is obvious without the column alignment to lean on. */
1022 .detail-meta dt {
1023 margin-top: 0.85rem;
1024 }
1025
1026 .detail-meta dt:first-child {
1027 margin-top: 0;
1028 }
1029
1030 .detail-meta dd {
1031 margin-top: 0.15rem;
1032 }
1033
1034 .queue-header {
1035 flex-direction: column;
1036 }
1037
1038 header {
1039 flex-direction: column;
1040 gap: 1rem;
1041 padding: 1rem;
1042 }
1043
1044 nav {
1045 width: 100%;
1046 justify-content: center;
1047 }
1048}
1049