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.status-badge.cancelled {
630 background: var(--pico-muted-color);
631 color: var(--pico-background-color);
632}
633
634.error-message {
635 color: var(--pico-del-color);
636 font-size: 0.9rem;
637 margin-top: 0.5rem;
638}
639
640.error-text {
641 color: var(--pico-del-color);
642}
643
644.queue-meta {
645 margin-top: 0.5rem;
646 font-size: 0.85rem;
647 display: flex;
648 gap: 1rem;
649}
650
651/* Logs */
652.logs {
653 max-height: 500px;
654 overflow-y: auto;
655 white-space: pre-wrap;
656 word-break: break-all;
657}
658
659pre {
660 padding: 1.5rem;
661}
662
663/* Settings */
664.settings-layout {
665 display: flex;
666 flex-direction: column;
667 gap: 2rem;
668}
669
670.presets-list {
671 display: flex;
672 flex-direction: column;
673 gap: 1rem;
674 margin-bottom: 1.5rem;
675}
676
677.preset-header {
678 display: flex;
679 justify-content: space-between;
680 align-items: center;
681 margin-bottom: 0.5rem;
682}
683
684.preset-header h4 {
685 display: flex;
686 align-items: center;
687 gap: 0.5rem;
688 margin: 0;
689}
690
691.badge {
692 background: var(--pico-primary);
693 color: var(--pico-primary-inverse);
694 padding: 0.1rem 0.4rem;
695 border-radius: 10px;
696 font-size: 0.75rem;
697}
698
699.preset-actions {
700 display: flex;
701 gap: 0.5rem;
702 flex-wrap: wrap;
703 margin-top: 1rem;
704}
705
706.preset-description {
707 margin-bottom: 0.5rem;
708}
709
710.preset-flags {
711 margin-top: 0.5rem;
712}
713
714.preset-flags pre {
715 overflow-x: auto;
716 margin-top: 0.3rem;
717 margin-bottom: 0;
718}
719
720/* Nested articles need visible borders */
721.presets-list article {
722 border: 1px solid var(--pico-muted-border-color);
723}
724
725/* Suppress Pico details marker for button-like summaries */
726details:has(summary[role="button"]) summary::after {
727 display: none !important;
728}
729
730details summary[role="button"] {
731 display: inline-flex;
732 width: auto;
733}
734
735/* Toggle text: Edit vs Cancel */
736details .cancel-text {
737 display: none;
738}
739
740details[open] .edit-text {
741 display: none;
742}
743
744details[open] .cancel-text {
745 display: inline;
746}
747
748/* Delete overlay popover */
749.delete-overlay {
750 position: relative;
751}
752
753.delete-overlay summary {
754 list-style: none;
755 cursor: pointer;
756}
757
758.delete-overlay summary::-webkit-details-marker {
759 display: none;
760}
761
762.delete-overlay summary::after {
763 display: none !important;
764}
765
766.delete-overlay .overlay-panel {
767 position: absolute;
768 top: calc(100% + 0.5rem);
769 right: 0;
770 z-index: 1000;
771 width: 260px;
772 background: var(--pico-background-color);
773 border: 1px solid var(--pico-muted-border-color);
774 border-radius: var(--pico-border-radius);
775 padding: 1rem;
776 box-shadow: var(--pico-dropdown-box-shadow);
777}
778
779/* Popover arrow */
780.delete-overlay .overlay-panel::before {
781 content: '';
782 position: absolute;
783 top: -6px;
784 right: 1rem;
785 width: 10px;
786 height: 10px;
787 background: var(--pico-background-color);
788 border-left: 1px solid var(--pico-muted-border-color);
789 border-top: 1px solid var(--pico-muted-border-color);
790 transform: rotate(45deg);
791}
792
793.delete-overlay .overlay-panel p {
794 margin-bottom: 1rem;
795 font-size: 0.9rem;
796}
797
798.delete-overlay .overlay-panel .form-actions {
799 margin-top: 0;
800 justify-content: flex-end;
801}
802
803/* Inline edit form */
804.edit-form {
805 padding: 1rem;
806}
807
808/* Conditional sections (no-JS show/hide) */
809.conditional-section {
810 margin-bottom: 1rem;
811}
812
813.conditional-section .conditional-content {
814 display: none;
815 margin-top: 1rem;
816}
817
818/* Checkbox triggers */
819.conditional-section:has(input[type="checkbox"].conditional-trigger:checked) .conditional-content {
820 display: block;
821}
822
823/* Radio triggers for format mode */
824.conditional-section:has(.radio-group input[value="preset"]:checked) .conditional-content.format-preset,
825.conditional-section:has(.radio-group input[value="custom"]:checked) .conditional-content.format-custom {
826 display: block;
827}
828
829/* Subscriptions: lock the cron field unless the schedule is "Custom (cron)".
830 Pure CSS — the :has() reacts live as the <select> changes, no JS needed. */
831input[name="cron_expr"] {
832 opacity: 0.5;
833 pointer-events: none;
834}
835.form-row:has(select[name="schedule_kind"] option[value="cron"]:checked) input[name="cron_expr"] {
836 opacity: 1;
837 pointer-events: auto;
838}
839
840/* Format mode selector - hidden radio inputs with button-like labels */
841.radio-group.format-mode {
842 display: flex;
843 gap: 0.5rem;
844 margin-top: 0.5rem;
845 flex-wrap: wrap;
846}
847
848.radio-group.format-mode input[type="radio"] {
849 position: absolute;
850 opacity: 0;
851 width: 0;
852 height: 0;
853}
854
855.radio-group.format-mode label {
856 padding: 0.4rem 0.8rem;
857 border: 1px solid var(--pico-muted-border-color);
858 border-radius: var(--pico-border-radius);
859 cursor: pointer;
860 background: var(--pico-background-color);
861 transition: all 0.2s;
862 font-weight: normal;
863}
864
865.radio-group.format-mode label:hover {
866 background: var(--pico-card-sectioning-background-color);
867}
868
869.radio-group.format-mode label:has(input:checked) {
870 background: var(--pico-primary);
871 color: var(--pico-primary-inverse);
872 border-color: var(--pico-primary);
873}
874
875/* Inline informational note paragraph */
876.note {
877 font-size: 0.85rem;
878 color: var(--pico-muted-color);
879}
880
881/* Collapsible "managed yt-dlp options" notes component */
882.ytdlp-notes {
883 margin: 0 0 1rem;
884 border: 1px solid var(--pico-muted-border-color);
885 border-radius: var(--pico-border-radius);
886 background: var(--pico-card-sectioning-background-color);
887 overflow: hidden;
888}
889
890.ytdlp-notes > summary {
891 cursor: pointer;
892 padding: 0.6rem 0.9rem;
893 font-size: 0.9rem;
894 font-weight: 600;
895 color: var(--pico-color);
896 user-select: none;
897 transition: background 0.15s ease-in-out;
898}
899
900.ytdlp-notes > summary:hover {
901 background: var(--pico-card-background-color);
902}
903
904.ytdlp-notes-icon {
905 color: var(--pico-primary);
906 font-style: normal;
907 font-size: 1rem;
908 margin-right: 0.4rem;
909}
910
911.ytdlp-notes-body {
912 padding: 0 0.9rem 0.6rem;
913 border-top: 1px solid var(--pico-muted-border-color);
914}
915
916.ytdlp-notes-body > p {
917 font-size: 0.85rem;
918 color: var(--pico-muted-color);
919 margin: 0.7rem 0;
920}
921
922.ytdlp-notes-table-wrap {
923 overflow-x: auto;
924}
925
926.ytdlp-notes-body table {
927 margin: 0;
928 font-size: 0.85rem;
929}
930
931.ytdlp-notes-body th,
932.ytdlp-notes-body td {
933 padding: 0.4rem 0.6rem;
934 vertical-align: top;
935}
936
937.ytdlp-notes-body td:first-child {
938 white-space: nowrap;
939}
940
941.ytdlp-notes-body code {
942 font-size: 0.8rem;
943}
944
945/* Theme selector */
946.theme-selector {
947 display: flex;
948 gap: 0.5rem;
949}
950
951.theme-selector button {
952 min-width: 80px;
953}
954
955.theme-selector button.active {
956 background: var(--pico-primary);
957 color: var(--pico-primary-inverse);
958 border-color: var(--pico-primary);
959}
960
961/* Download form */
962.download-form {
963 max-width: 900px;
964}
965
966.download-form form {
967 max-width: 800px;
968}
969
970/* Filter form inline */
971.filter-form {
972 display: flex;
973 gap: 0.5rem;
974 align-items: center;
975}
976
977.filter-form input,
978.filter-form select,
979.filter-form button {
980 margin-bottom: 0;
981 width: auto;
982 display: inline-block;
983 flex-shrink: 0;
984}
985
986.filter-form input[type="text"] {
987 min-width: 200px;
988}
989
990/* Empty state */
991.empty-state {
992 text-align: center;
993 padding: 3rem;
994}
995
996/* Utility */
997.inline {
998 display: inline;
999}
1000
1001/* Responsive */
1002@media (max-width: 768px) {
1003 main {
1004 padding: 1rem;
1005 }
1006
1007 .page-header {
1008 flex-direction: column;
1009 align-items: flex-start;
1010 }
1011
1012 .library-grid {
1013 grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1014 }
1015
1016 .form-row {
1017 grid-template-columns: 1fr;
1018 }
1019
1020 .detail-meta dl {
1021 grid-template-columns: 1fr;
1022 gap: 0;
1023 }
1024
1025 /* Stacked layout: tighten key→value and space out each pair so the grouping
1026 is obvious without the column alignment to lean on. */
1027 .detail-meta dt {
1028 margin-top: 0.85rem;
1029 }
1030
1031 .detail-meta dt:first-child {
1032 margin-top: 0;
1033 }
1034
1035 .detail-meta dd {
1036 margin-top: 0.15rem;
1037 }
1038
1039 .queue-header {
1040 flex-direction: column;
1041 }
1042
1043 header {
1044 flex-direction: column;
1045 gap: 1rem;
1046 padding: 1rem;
1047 }
1048
1049 nav {
1050 width: 100%;
1051 justify-content: center;
1052 }
1053}
1054