this repo has no description
1@import url('@szhsin/react-menu/dist/core.css');
2@import url('toastify-js/src/toastify.css');
3
4html,
5body {
6 margin: 0;
7 padding: 0;
8 background-color: var(--bg-color);
9 color: var(--text-color);
10 overflow-x: hidden;
11}
12body {
13 touch-action: pan-x pan-y;
14}
15
16#app {
17 min-height: 100vh;
18 min-height: 100dvh;
19 display: flex;
20 align-items: center;
21 justify-content: center;
22}
23#app-standalone {
24 background-color: var(--bg-faded-color);
25}
26
27/* MENTIONS */
28
29a.mention {
30 text-decoration-line: none;
31}
32a.mention span {
33 text-decoration-line: underline;
34 text-decoration-color: inherit;
35 text-decoration-thickness: 2px;
36 text-underline-offset: 2px;
37 font-variant-numeric: slashed-zero;
38 font-feature-settings: 'ss01';
39}
40/* a.mention:has(span).hashtag {
41 color: var(--link-light-color);
42} */
43a.mention span {
44 color: var(--text-color);
45}
46a[href^='http'][rel*='nofollow']:visited:not(:has(div)) {
47 color: var(--link-visited-color);
48 text-decoration-color: var(--link-visited-color);
49}
50
51.deck-container {
52 width: 100%;
53 height: 100vh;
54 height: 100dvh;
55 overflow: auto;
56 overflow-x: hidden;
57 transition: opacity 0.1s ease-in-out;
58 overscroll-behavior: contain;
59 scroll-behavior: smooth;
60 background-color: var(--bg-color);
61 flex-grow: 1;
62 /* This `transform` fixes carousel blocking vertical scrolling for pointer devices on iPad */
63 transform: translateZ(0);
64}
65
66@media (hover: hover) {
67 .deck-container {
68 overscroll-behavior: auto;
69 }
70}
71.deck-container[hidden] {
72 display: block;
73 position: absolute;
74 user-select: none;
75 pointer-events: none;
76 opacity: 0;
77 content-visibility: hidden;
78}
79
80.deck-container,
81.deck.contained {
82 scroll-padding-top: 4em;
83
84 &:has(~ #shortcuts > .tab-bar) {
85 scroll-padding-top: 7em;
86 }
87}
88
89:is(#home-page, #welcome, #columns, #loader-root) ~ .deck-container {
90 z-index: 10;
91 position: fixed;
92 inset: 0;
93}
94:is(#home-page, #welcome, #columns, #loader-root):has(~ .deck-container) {
95 /* display: block; */
96 position: absolute;
97 user-select: none;
98 pointer-events: none;
99 opacity: 0;
100 /* This causes scrollTop to be reset to 0 when the page is hidden */
101 /* content-visibility: hidden; */
102}
103
104.deck {
105 min-height: 100vh;
106 min-height: 100dvh;
107 margin: auto;
108 width: var(--main-width);
109 max-width: 100%;
110 background-color: var(--bg-color);
111 overflow-anchor: auto;
112
113 &.wide {
114 width: 60em;
115 }
116}
117.deck.contained {
118 overflow: auto;
119 overflow-x: hidden;
120 height: 100vh;
121 height: 100dvh;
122 overscroll-behavior: contain;
123}
124@media (hover: hover) {
125 .deck.contained {
126 overscroll-behavior: auto;
127 }
128}
129
130.deck > header {
131 position: sticky;
132 top: 0;
133 z-index: 1;
134 cursor: default;
135 z-index: 10;
136 user-select: none;
137 transition: transform 0.5s ease-in-out;
138 user-select: none;
139
140 .header-double-lines {
141 font-size: 90% !important;
142 cursor: pointer;
143
144 div {
145 font-weight: normal;
146 color: var(--text-insignificant-color);
147 }
148 }
149}
150.deck > header[hidden] {
151 display: block;
152 transform: translateY(-100%);
153 pointer-events: none;
154 user-select: none;
155}
156.deck > header .header-grid {
157 background-color: var(--bg-color);
158 /* background-color: var(--bg-blur-color);
159 background-image: linear-gradient(to bottom, var(--bg-color), transparent);
160 backdrop-filter: saturate(180%) blur(20px); */
161 border-bottom: var(--hairline-width) solid var(--divider-color);
162 min-height: 3em;
163 display: grid;
164 grid-template-columns: 1fr minmax(0, max-content) 1fr;
165 align-items: center;
166 white-space: nowrap;
167}
168.deck > header .header-grid > .header-side:last-of-type {
169 text-align: end;
170 grid-column: 3;
171}
172.deck > header .header-grid :is(button, .button).plain {
173 backdrop-filter: none;
174}
175.deck > header .header-grid h1 {
176 margin: 0 8px;
177 padding: 0;
178 font-size: 1.2em;
179 text-align: center;
180 overflow: hidden;
181 text-overflow: ellipsis;
182 white-space: nowrap;
183}
184.deck > header .header-grid.header-grid-2 {
185 grid-template-columns: 1fr max-content;
186}
187.deck > header .header-grid-2 h1 {
188 text-align: start;
189 padding-inline-start: 8px;
190}
191.deck > header .header-grid h1:has(.ancestors-indicator) {
192 display: flex;
193 gap: 8px;
194 align-items: center;
195 max-width: fit-content;
196}
197.deck > header .header-grid h1:has(.ancestors-indicator) .hero-heading {
198 flex: 1;
199 overflow: hidden;
200 text-overflow: ellipsis;
201 white-space: nowrap;
202}
203.deck h2 {
204 font-size: 1.45em;
205}
206.deck.padded-bottom .timeline > li:last-child {
207 padding-bottom: 80vh !important;
208 padding-bottom: 80dvh !important;
209}
210
211@keyframes indeterminate-bar {
212 0% {
213 transform: translateX(-50%);
214 opacity: 0.25;
215 }
216 50% {
217 opacity: 1;
218 }
219 100% {
220 transform: translateX(50%);
221 opacity: 0.25;
222 }
223}
224@keyframes indeterminate-bar-rtl {
225 0% {
226 transform: translateX(50%);
227 opacity: 0.25;
228 }
229 50% {
230 opacity: 1;
231 }
232 100% {
233 transform: translateX(-50%);
234 opacity: 0.25;
235 }
236}
237.deck > header.loading:after {
238 pointer-events: none;
239 content: '';
240 display: block;
241 height: 4px;
242 position: absolute;
243 bottom: 0;
244 width: 50%;
245 left: 25%;
246 background-image: radial-gradient(
247 farthest-side at bottom,
248 var(--link-color),
249 transparent
250 );
251 animation: indeterminate-bar 1s ease-in-out infinite alternate;
252 &:dir(rtl) {
253 animation-name: indeterminate-bar-rtl;
254 }
255}
256@media (min-width: 40em) {
257 .deck > header.loading:after {
258 height: 8px;
259 }
260}
261
262.timeline {
263 margin: 0 auto;
264 padding: 0;
265
266 &.timeline-media {
267 --grid-gap: 8px;
268 display: grid;
269 grid-template-columns: 1fr;
270 grid-auto-rows: fit-content;
271 gap: var(--grid-gap);
272 padding: var(--grid-gap);
273
274 &:not(#columns &) {
275 background-color: var(--bg-faded-color);
276 }
277
278 @media (min-width: 320px) {
279 grid-template-columns: 1fr 1fr;
280 }
281
282 @media (min-width: 40em) {
283 &:not(#columns &) {
284 --grid-gap: 16px;
285 grid-template-columns: 1fr 1fr 1fr;
286
287 @media (min-width: 40em) {
288 width: 95vw;
289 max-width: calc(320px * 3.3);
290 transform: translateX(calc(-50% + var(--main-width) / 2));
291 &:dir(rtl) {
292 transform: translateX(calc(50% - var(--main-width) / 2));
293 }
294 }
295 }
296
297 #columns & {
298 padding-inline: 0;
299 }
300 }
301
302 li {
303 padding: 0 !important;
304 margin: 0 !important;
305 border: 0 !important;
306 overflow: visible !important;
307 background-color: transparent !important;
308 box-shadow: none !important;
309 }
310
311 @supports (grid-template-rows: masonry) {
312 grid-template-rows: masonry;
313 masonry-auto-flow: pack;
314
315 .media-post a {
316 aspect-ratio: revert !important;
317
318 video,
319 img,
320 audio {
321 min-height: var(--min-dimension); /* for extreme dimensions */
322 }
323 }
324 }
325 }
326}
327
328.deck-container-media-first {
329 .timeline {
330 > li:not(.timeline-item-carousel, .timeline-item-container) {
331 &:has(.status-media-first) {
332 @media (min-width: 40em) {
333 width: fit-content;
334 max-width: min(480px, 100%);
335 }
336
337 background-color: transparent !important;
338 border: 0 !important;
339 box-shadow: none !important;
340 margin-inline: auto !important;
341
342 &:not(:first-child) {
343 margin-block: 32px;
344 }
345
346 &:has(.skeleton) {
347 width: 100%;
348 }
349 }
350
351 &:has(.media[data-orientation='landscape']) {
352 max-width: 100%;
353 }
354 }
355
356 .status-link:has(.status-media-first):hover {
357 background-color: transparent;
358 }
359 }
360}
361
362.timeline.grow {
363 /* min-height: 100vh;
364 min-height: 100dvh; */
365 padding-bottom: calc(env(safe-area-inset-bottom) + 16px);
366}
367.timeline > li {
368 list-style: none;
369 margin: 0;
370 padding: 0;
371 border-bottom: var(--hairline-width) solid var(--divider-color);
372 --line-dir: var(--to-forward);
373}
374.timeline > li + li:not(.timeline-item-carousel, .hero, .ancestor) {
375 content-visibility: auto;
376 contain-intrinsic-size: auto 160px;
377}
378.timeline.contextual
379 > li:is(:hover, :focus-visible, :focus-within, :has(.status-menu-open)) {
380 /* Needed to undo the overflow: hidden "effect" due to "content-visibility: auto" */
381 content-visibility: visible !important;
382}
383.timeline.flat > li {
384 border-bottom: none;
385}
386
387.timeline.contextual {
388 --indent-large-start: 40px;
389 --indent-small-start: 10px;
390 --thread-start: var(--indent-small-start);
391 --line-start: var(--indent-small-start);
392 --line-width: 3px;
393 --line-end: calc(var(--line-start) + var(--line-width));
394 --indent-large-end: calc(var(--indent-large-start) + var(--line-width));
395 --indent-small-end: calc(var(--indent-small-start) + var(--line-width));
396 --line-margin-end: 16px;
397 --line-radius: 10px;
398 --line-diameter: calc(var(--line-radius) * 2);
399 --avatar-size: 50px;
400 --avatar-margin-start: 16px;
401 --avatar-margin-end: 12px;
402 --line-curve: 45deg;
403 :dir(rtl) & {
404 --line-curve: -45deg;
405 }
406
407 > li:is(.hero:has(+ .thread), .hero:last-child, .thread, .ancestor) {
408 --thread-start: var(--indent-large-start);
409 --line-start: var(--indent-large-start);
410 --line-end: calc(var(--line-start) + var(--line-width));
411 }
412
413 > li.descendant.thread:has(+ .descendant:not(.thread)):after {
414 position: absolute;
415 inset-inline-start: 10px;
416 bottom: 0;
417 content: '';
418 display: block;
419 --curves-width: calc(var(--line-start) + var(--line-width) - 10px);
420 width: var(--curves-width);
421 background-color: var(--bg-color);
422 background-repeat: no-repeat;
423 /* border-bottom: var(--line-width) dotted var(--comment-line-color); */
424 /* height: calc(var(--line-diameter) - var(--line-width));
425 background-image: linear-gradient(
426 transparent calc(var(--line-radius) - var(--line-width)),
427 var(--comment-line-color) calc(var(--line-radius) - var(--line-width))
428 var(--line-radius),
429 transparent var(--line-radius)
430 ),
431 radial-gradient(
432 circle at bottom var(--forward),
433 transparent calc(var(--line-radius) - var(--line-width)),
434 var(--comment-line-color) calc(var(--line-radius) - var(--line-width))
435 var(--line-radius),
436 transparent var(--line-radius)
437 ),
438 radial-gradient(
439 circle at top var(--backward),
440 transparent calc(var(--line-radius) - var(--line-width)),
441 var(--comment-line-color) calc(var(--line-radius) - var(--line-width))
442 var(--line-radius),
443 transparent var(--line-radius)
444 );
445 background-position: var(--line-radius) 0, bottom var(--backward),
446 top var(--forward);
447 background-size: calc(100% - var(--line-radius) * 2) auto,
448 var(--line-radius), var(--line-radius); */
449 --curves-radius: calc(var(--curves-width) / 2);
450 height: calc(var(--curves-width) - var(--line-width));
451 background-image:
452 radial-gradient(
453 circle at bottom var(--forward),
454 transparent calc(var(--curves-radius) - var(--line-width)),
455 var(--comment-line-color) calc(var(--curves-radius) - var(--line-width))
456 var(--curves-radius),
457 transparent var(--curves-radius)
458 ),
459 radial-gradient(
460 circle at top var(--backward),
461 transparent calc(var(--curves-radius) - var(--line-width)),
462 var(--comment-line-color) calc(var(--curves-radius) - var(--line-width))
463 var(--curves-radius),
464 transparent var(--curves-radius)
465 );
466 background-size: var(--curves-radius);
467 background-position:
468 top var(--backward),
469 bottom var(--forward);
470 }
471}
472.timeline.contextual > li {
473 background-image: linear-gradient(
474 var(--line-dir),
475 transparent,
476 transparent var(--line-start),
477 var(--comment-line-color) var(--line-start),
478 var(--comment-line-color) var(--line-end),
479 transparent var(--line-end),
480 transparent
481 );
482 &.hero:not(:has(+ .thread), :first-child, :only-child, :last-child) {
483 background-image:
484 linear-gradient(
485 var(--line-dir),
486 transparent,
487 transparent var(--indent-small-start),
488 var(--comment-line-color) var(--indent-small-start),
489 var(--comment-line-color) var(--indent-small-end),
490 transparent var(--indent-small-end),
491 transparent
492 ),
493 linear-gradient(
494 var(--line-dir),
495 transparent,
496 transparent var(--indent-large-start),
497 var(--comment-line-color) var(--indent-large-start),
498 var(--comment-line-color) var(--indent-large-end),
499 transparent var(--indent-large-end),
500 transparent
501 );
502 background-size: 100% 50%;
503 background-position: bottom, top;
504 }
505 background-repeat: no-repeat;
506 transition: opacity 0.3s ease-in-out;
507}
508.timeline.contextual > li:first-child {
509 background-position: 0 calc(16px + var(--avatar-size));
510}
511.timeline.contextual > li:last-child {
512 background-size: 100% 20px;
513}
514.timeline.contextual > li:only-child {
515 background-image: none;
516}
517.timeline.contextual > li.descendant {
518 position: relative;
519}
520.timeline.contextual > li.descendant {
521 padding-bottom: 1em;
522}
523.timeline.contextual
524 > li.descendant:not(.thread)
525 > :is(.status-link, .status-focus) {
526 padding-inline-start: var(--line-start);
527}
528.timeline.contextual .replies[data-scroll-left]:not([data-scroll-left='0']) {
529 background-color: var(--bg-color);
530 box-shadow:
531 inset 0 -3px var(--comment-line-color),
532 inset 0 3px var(--comment-line-color);
533 overscroll-behavior-x: contain;
534 /* touch-action: pan-x; */
535}
536.timeline.contextual .replies[data-comments-level='4'] {
537 overflow-x: auto;
538}
539.timeline.contextual .replies[data-comments-level='4']:has(.replies) {
540 overflow-x: auto;
541 mask-image: linear-gradient(var(--to-backward), transparent, black 32px);
542}
543.timeline.contextual
544 .replies[data-comments-level='4']:has(.replies)
545 > .replies-summary {
546 border-top: 2px dashed var(--divider-color);
547}
548.timeline.contextual
549 .replies[data-comments-level='4']
550 .replies[data-comments-level-overflow='true']
551 .status {
552 min-width: min(20em, 80vw);
553}
554.timeline.contextual
555 > li.descendant.thread
556 > :is(.status-link, .status-focus)
557 + .replies
558 .replies-summary {
559 margin-inline-start: calc(
560 var(--avatar-size) +
561 var(--avatar-margin-start) +
562 var(--avatar-margin-end) +
563 (var(--line-margin-end) * (var(--comments-level) - 1))
564 );
565}
566.timeline.contextual
567 > li.descendant.thread
568 > :is(.status-link, .status-focus)
569 + .replies
570 :is(.status-link, .status-focus) {
571 padding-inline-start: calc(
572 var(--avatar-size) +
573 var(--avatar-margin-start) +
574 var(--avatar-margin-end) +
575 (var(--line-margin-end) * (var(--comments-level) - 1))
576 );
577}
578.timeline.contextual
579 > li.descendant:not(.thread)
580 > :is(.status-link, .status-focus)
581 + .replies
582 .replies-summary {
583 margin-inline-start: calc(
584 var(--thread-start) +
585 var(--line-margin-end) *
586 var(--comments-level)
587 );
588}
589.timeline.contextual
590 > li.descendant:not(.thread)
591 > :is(.status-link, .status-focus)
592 + .replies
593 :is(.status-link, .status-focus) {
594 padding-inline-start: calc(
595 var(--thread-start) +
596 var(--line-margin-end) *
597 var(--comments-level)
598 );
599}
600.timeline.contextual > li.descendant:not(.thread):before {
601 content: '';
602 position: absolute;
603 top: 10px;
604 inset-inline-start: var(--line-start);
605 width: var(--line-diameter);
606 height: var(--line-diameter);
607 border-radius: var(--line-radius);
608 border-style: solid;
609 border-width: var(--line-width);
610 border-color: transparent transparent var(--comment-line-color) transparent;
611 transform: rotate(var(--line-curve));
612}
613.timeline.contextual > li .replies-link {
614 color: var(--text-insignificant-color);
615 margin-inline-start: 16px;
616 margin-top: -12px;
617 padding-bottom: 12px;
618 font-size: 90%;
619}
620.timeline.contextual > li.ancestor .replies-link {
621 margin-inline-start: calc(
622 var(--avatar-size) +
623 var(--avatar-margin-start) +
624 var(--avatar-margin-end)
625 );
626}
627.timeline.contextual
628 > li.thread
629 > :is(.status-link, .status-focus)
630 .replies-link {
631 margin-inline-start: calc(
632 var(--avatar-size) +
633 var(--avatar-margin-start) +
634 var(--avatar-margin-end)
635 );
636}
637.timeline.contextual > li .replies-link * {
638 vertical-align: middle;
639}
640.timeline.contextual > li .replies {
641 margin-top: -12px;
642}
643.timeline.contextual > li .replies :is(ul, li):not(.content *) {
644 margin: 0;
645 padding: 0;
646 list-style: none;
647}
648.timeline.contextual > li .replies > .replies-summary {
649 --summary-padding: 8px;
650 padding: var(--summary-padding);
651 background-color: var(--bg-faded-color);
652 display: inline-flex;
653 border-radius: 8px;
654 cursor: pointer;
655 text-transform: uppercase;
656 font-size: 12px;
657 color: var(--text-insignificant-color);
658 user-select: none;
659 box-shadow: 0 0 0 2px var(--bg-color);
660 position: relative;
661 list-style: none;
662 gap: 8px;
663 align-items: center;
664 margin-inline-end: calc(44px + 8px);
665
666 b {
667 font-weight: 500;
668 color: var(--text-color);
669 }
670
671 .avatars {
672 flex-shrink: 0;
673 transition: opacity 0.3s ease;
674
675 .avatar {
676 transition: transform 0.3s ease;
677
678 &:not(:first-child) {
679 transform: rotate(0deg);
680 margin: 0;
681 margin-inline-start: -4px;
682 }
683 }
684 }
685
686 .replies-counts {
687 /* flex-grow: 1; */
688
689 > * {
690 display: inline-block;
691 }
692 }
693
694 .replies-summary-chevron {
695 transition: transform 0.3s ease;
696 }
697
698 .replies-parent-link {
699 position: absolute;
700 inset-inline-end: 4px;
701 height: 100%;
702 z-index: 2;
703 font-size: 16px;
704 font-weight: bold;
705 align-self: stretch;
706 text-decoration: none;
707 display: flex;
708 align-items: center;
709 padding: var(--summary-padding) calc(var(--summary-padding) * 2);
710 transform: translateX(100%);
711 &:dir(rtl) {
712 transform: translateX(-100%);
713 }
714 margin: calc(-1 * var(--summary-padding)) 0;
715 margin-inline-end: calc(-1 * var(--summary-padding));
716 border-radius: 8px;
717 background-color: var(--link-bg-color);
718
719 &:is(:hover, :focus) {
720 color: var(--link-text-color);
721 box-shadow: inset 0 0 0 2px var(--link-faded-color);
722 }
723
724 &:active {
725 background-color: var(--link-faded-color);
726 }
727 }
728}
729.timeline.contextual > li .replies > .replies-summary::-webkit-details-marker {
730 display: none;
731}
732.timeline.contextual > li .replies > .replies-summary > * {
733 vertical-align: middle;
734}
735.timeline.contextual
736 > li
737 .replies
738 > .replies-summary
739 .timeline.contextual
740 > li
741 .replies
742 > .replies-summary:active,
743.timeline.contextual > li .replies[open] > .replies-summary {
744 color: var(--text-color);
745 background-color: var(--comment-line-color);
746 background-image: linear-gradient(
747 to top var(--forward),
748 var(--comment-line-color),
749 var(--bg-faded-color)
750 );
751}
752@keyframes summary-fade {
753 0% {
754 opacity: 0;
755 transform: translateY(-8px);
756 }
757 100% {
758 opacity: 1;
759 transform: translateY(0);
760 }
761}
762.timeline.contextual > li .replies[open] > .replies-summary {
763 border-end-start-radius: 0;
764
765 .avatars {
766 opacity: 0.5;
767
768 .avatar {
769 transform: rotate(-15deg);
770 }
771 }
772
773 .replies-summary-chevron {
774 transform: rotate(180deg);
775 }
776
777 + * {
778 animation: summary-fade 0.3s ease-out both;
779 }
780}
781.timeline.contextual > li .replies .replies-summary[hidden] {
782 display: none;
783}
784.timeline.contextual > li .replies li:not(.content li) {
785 position: relative;
786}
787.timeline.contextual > li .replies li:not(.content li) {
788 --line-start: calc(
789 var(--thread-start) +
790 var(--line-margin-end) *
791 var(--comments-level)
792 );
793 --line-end: calc(var(--line-start) + var(--line-width));
794 background-image: linear-gradient(
795 var(--line-dir),
796 transparent,
797 transparent var(--line-start),
798 var(--comment-line-color) var(--line-start),
799 var(--comment-line-color) var(--line-end),
800 transparent var(--line-end),
801 transparent
802 );
803 background-repeat: no-repeat;
804}
805/* .timeline.contextual > li .replies .replies li {
806 --line-start: calc(var(--thread-start) + (var(--line-margin-end) * 2));
807}
808.timeline.contextual > li .replies .replies .replies li {
809 --line-start: calc(var(--thread-start) + (var(--line-margin-end) * 3));
810} */
811.timeline.contextual > li.thread .replies li:not(.content li) {
812 --line-start: calc(
813 var(--avatar-size) +
814 var(--avatar-margin-start) +
815 var(--avatar-margin-end) +
816 (var(--line-margin-end) * (var(--comments-level) - 1))
817 );
818}
819/* .timeline.contextual > li.thread .replies .replies li {
820 --line-start: calc(
821 var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) +
822 var(--line-margin-end)
823 );
824}
825.timeline.contextual > li.thread .replies .replies .replies li {
826 --line-start: calc(
827 var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) +
828 (var(--line-margin-end) * 2)
829 );
830} */
831.timeline.contextual > li .replies li:not(.content li):last-child {
832 background-size: 100% 20px;
833}
834.timeline.contextual > li .replies li:not(.content li):before {
835 content: '';
836 position: absolute;
837 top: 10px;
838 inset-inline-start: var(--line-start);
839 width: var(--line-diameter);
840 height: var(--line-diameter);
841 border-radius: var(--line-radius);
842 border-style: solid;
843 border-width: var(--line-width);
844 border-color: transparent transparent var(--comment-line-color) transparent;
845 transform: rotate(var(--line-curve));
846}
847/* .timeline.contextual > li .replies .replies li:before {
848 --line-start: calc(
849 var(--thread-start) + var(--line-margin-end) + var(--line-margin-end)
850 );
851}
852.timeline.contextual > li .replies .replies .replies li:before {
853 --line-start: calc(
854 var(--thread-start) + var(--line-margin-end) + (var(--line-margin-end) * 2)
855 );
856} */
857.timeline.contextual > li.thread .replies li:not(.content li):before {
858 --line-start: calc(
859 var(--avatar-size) +
860 var(--avatar-margin-start) +
861 var(--avatar-margin-end) +
862 (var(--line-margin-end) * (var(--comments-level) - 1))
863 );
864}
865/* .timeline.contextual > li.thread .replies .replies li:before {
866 --line-start: calc(
867 var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) +
868 var(--line-margin-end)
869 );
870}
871.timeline.contextual > li.thread .replies .replies .replies li:before {
872 --line-start: calc(
873 var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) +
874 (var(--line-margin-end) * 2)
875 );
876} */
877.timeline.contextual.loading > li:not(.hero) {
878 /* opacity: 0.5; */
879 pointer-events: none;
880}
881
882.timeline.contextual > li .replies {
883 > ul > li:only-child {
884 > .replies {
885 > ul > li:only-child {
886 margin-inline-start: calc(-1 * var(--line-margin-end));
887 background-position: 16px 0;
888 &:dir(rtl) {
889 background-position: -16px 0;
890 }
891 background-size: 100% calc(20px + 8px);
892
893 &:before {
894 display: none;
895 }
896 }
897 }
898 }
899}
900
901.timeline.contextual .time-gap {
902 padding-block: calc(24px + var(--time-gap-range, 0) * 4px) !important;
903 padding-inline-start: calc(var(--line-start) + 16px);
904 padding-inline-end: 16px;
905 color: var(--text-insignificant-color);
906 font-style: italic;
907 font-size: 0.9em;
908 position: relative;
909
910 &:before {
911 content: none !important;
912 }
913 &:after {
914 content: '';
915 position: absolute;
916 inset-block: 0;
917 inset-inline-start: var(--line-start);
918 width: var(--line-width);
919 background-image: repeating-linear-gradient(
920 to bottom,
921 transparent,
922 transparent var(--line-width),
923 var(--bg-color) var(--line-width),
924 var(--bg-color) calc(var(--line-width) * 2)
925 );
926 mask-image: linear-gradient(to bottom, transparent, black, transparent);
927 }
928}
929
930.timeline-deck.compact .status {
931 max-height: max(25vh, 160px);
932 overflow: hidden;
933 mask-image: linear-gradient(
934 rgba(0, 0, 0, 1),
935 rgba(0, 0, 0, 1) 80%,
936 transparent 95%
937 );
938}
939.timeline-deck.compact .status .meta ~ * {
940 pointer-events: none;
941}
942
943.timeline-header {
944 padding: 0 16px;
945 opacity: 0.75;
946}
947
948.timeline-empty {
949 color: var(--text-insignificant-color);
950 padding: 0 16px;
951 margin-bottom: 3em;
952}
953
954.timeline:not(.flat) > li.timeline-item-container {
955 --avatar-size: 50px;
956 --line-start: 40px;
957 --line-width: 3px;
958 --line-end: calc(var(--line-start) + var(--line-width));
959 background-image: linear-gradient(
960 var(--line-dir),
961 transparent,
962 transparent var(--line-start),
963 var(--comment-line-color) var(--line-start),
964 var(--comment-line-color) var(--line-end),
965 transparent var(--line-end),
966 transparent
967 );
968 background-repeat: no-repeat;
969}
970.timeline:not(.flat) > li.timeline-item-container-start {
971 margin-bottom: 0;
972 border-end-start-radius: 0;
973 border-end-end-radius: 0;
974 border-bottom: 0;
975 background-position: 0 calc(16px + var(--avatar-size));
976}
977.timeline:not(.flat) > li.timeline-item-container-middle {
978 margin-top: 0;
979 margin-bottom: 0;
980 border-radius: 0;
981 border-bottom: 0;
982 border-top: 0;
983}
984.timeline:not(.flat) > li.timeline-item-container-end {
985 margin-top: 0;
986 border-start-start-radius: 0;
987 border-start-end-radius: 0;
988 border-top: 0;
989 background-size: 100% 16px;
990
991 &:has(.status-pre-meta) {
992 /* 20px = icon of the pre-meta */
993 background-size: 100% calc(16px + 20px);
994 }
995}
996.timeline:not(.flat)
997 > li:is(.timeline-item-container-middle, .timeline-item-container-end)
998 .status-reply-to:not(.visibility-direct):not(.status-card) {
999 background-image: none;
1000}
1001.timeline:not(.flat)
1002 > li.timeline-item-diff-author
1003 > :is(.status-link, .status-focus)
1004 > .status
1005 > a
1006 > .avatar {
1007 transform: scale(0.8);
1008 filter: drop-shadow(0 0 16px var(--bg-color))
1009 drop-shadow(0 0 8px var(--bg-color)) drop-shadow(0 0 8px var(--bg-color));
1010}
1011.timeline:not(.flat) {
1012 > li.timeline-item-container-type-thread.timeline-item-container-middle:not(
1013 .timeline-item-diff-author
1014 ) {
1015 > :is(.status-link, .status-focus) {
1016 > .status > .container {
1017 > .meta {
1018 display: none;
1019 }
1020 }
1021 }
1022 }
1023}
1024
1025.timeline .show-more {
1026 padding-inline-start: calc(var(--line-end) + var(--line-margin-end)) !important;
1027 text-align: start;
1028 background-color: transparent !important;
1029 backdrop-filter: none !important;
1030 position: relative;
1031 border-radius: 0;
1032 padding-block: 16px !important;
1033
1034 .avatars-bunch > .avatar:not(:first-child) {
1035 margin-inline-start: -4px;
1036 }
1037}
1038.timeline .show-more:hover {
1039 filter: none !important;
1040 color: var(--text-color) !important;
1041 background-color: var(--bg-faded-blur-color) !important;
1042}
1043.timeline .show-more:before {
1044 content: '';
1045 position: absolute;
1046 top: 10px;
1047 inset-inline-start: var(--line-start);
1048 width: var(--line-diameter);
1049 height: var(--line-diameter);
1050 border-radius: var(--line-radius);
1051 border-style: solid;
1052 border-width: var(--line-width);
1053 border-color: transparent transparent var(--comment-line-color) transparent;
1054 transform: rotate(var(--line-curve));
1055}
1056
1057.status-loading {
1058 text-align: center;
1059 color: var(--text-insignificant-color);
1060 max-width: var(--main-width);
1061}
1062.status-error {
1063 text-align: center;
1064 color: var(--text-insignificant-color);
1065 max-width: var(--main-width);
1066}
1067
1068.status-link {
1069 display: block;
1070 text-decoration-line: none;
1071 color: inherit;
1072 user-select: none;
1073 transition: background-color 0.1s ease-out;
1074 -webkit-tap-highlight-color: transparent;
1075 animation: appear 0.2s ease-out;
1076 -webkit-touch-callout: none;
1077}
1078@media (pointer: coarse) {
1079 .status-focus:not(.hero .status-focus) {
1080 /* Only the hero doesn't have context menu */
1081 user-select: none;
1082 -webkit-tap-highlight-color: transparent;
1083 -webkit-touch-callout: none;
1084 }
1085}
1086@media not (pointer: coarse) {
1087 :is(.status-link, .status-focus):is(:focus, .is-active) {
1088 background-color: var(--link-bg-hover-color);
1089 outline-offset: -2px;
1090 }
1091}
1092@media (hover: hover) {
1093 .status-link:hover {
1094 background-color: var(--link-bg-hover-color);
1095 outline-offset: -2px;
1096 }
1097}
1098.status-link:active:not(:has(:is(.media, button):active)) {
1099 filter: brightness(0.95);
1100}
1101
1102.status-carousel {
1103 --carousel-faded-color: var(--bg-faded-color);
1104 background: linear-gradient(
1105 to bottom var(--forward),
1106 var(--carousel-faded-color),
1107 transparent
1108 );
1109 position: relative;
1110 container-type: inline-size;
1111}
1112.status-carousel:after {
1113 content: '';
1114 position: absolute;
1115 inset: 0;
1116 pointer-events: none;
1117 background-image:
1118 radial-gradient(
1119 ellipse 50% 32px at bottom center,
1120 var(--carousel-faded-color),
1121 transparent
1122 ), linear-gradient(to top, var(--bg-color) 8px, transparent 64px);
1123 background-repeat: no-repeat;
1124 background-position: bottom center;
1125}
1126.status-carousel header {
1127 padding: 8px 16px 0;
1128 display: flex;
1129 justify-content: space-between;
1130 align-items: center;
1131}
1132.status-carousel h3 {
1133 margin: 0;
1134 padding: 0;
1135 font-size: 14px;
1136 text-transform: uppercase;
1137 color: var(--carousel-color);
1138 text-shadow: 0 1px var(--bg-color);
1139}
1140.status-carousel > ul {
1141 --carousel-gap: 16px;
1142 display: flex;
1143 overflow-x: auto;
1144 overflow-y: clip;
1145 scroll-snap-type: x mandatory;
1146 scroll-behavior: smooth;
1147 margin: 0;
1148 padding: 8px 16px;
1149 gap: var(--carousel-gap);
1150 align-items: flex-start;
1151 counter-reset: index;
1152 min-height: 160px;
1153 max-height: 65vh;
1154 max-height: 65dvh;
1155}
1156.status-carousel > ul > li {
1157 scroll-snap-align: center;
1158 scroll-snap-stop: always;
1159 flex-shrink: 0;
1160 display: flex;
1161 width: 100%;
1162 max-width: min(320px, calc(100% - 16px));
1163 list-style: none;
1164 margin: 0;
1165 padding: 0;
1166 /* max-height: 65vh;
1167 max-height: 65dvh; */
1168 counter-increment: index;
1169 position: relative;
1170}
1171.status-carousel > ul > li:is(:empty, :has(> a:empty)) {
1172 display: none;
1173}
1174.status-carousel .status-carousel-beacon {
1175 margin-inline-end: calc(-1 * var(--carousel-gap));
1176 pointer-events: none;
1177 opacity: 0;
1178
1179 ~ .status-carousel-beacon {
1180 margin-inline-start: calc(-1 * var(--carousel-gap));
1181 }
1182}
1183/*
1184 Assume that browsers that do support inline-size property also support container queries.
1185 https://www.smashingmagazine.com/2021/05/css-container-queries-use-cases-migration-strategies/#progressive-enhancement-polyfills
1186*/
1187@supports not (contain: inline-size) {
1188 @media (hover: hover) or (pointer: fine) or (min-width: 40em) {
1189 .status-carousel > ul {
1190 scroll-snap-type: none;
1191 }
1192 }
1193}
1194@container (min-width: 640px) {
1195 .status-carousel > ul {
1196 scroll-snap-type: none;
1197 }
1198}
1199.status-carousel .content-container .content:only-child {
1200 font-size: calc(100% + 25% * max(2 - var(--content-text-weight), 0));
1201
1202 &:has(.status-card) {
1203 font-size: unset;
1204 }
1205}
1206/* .status-carousel
1207 .content-container[data-content-text-weight='1']
1208 .media-container.media-eq1 {
1209 /* LOL, this is madness, reading a value from the style attribute * /
1210 height: auto;
1211 min-height: 160px;
1212 max-height: max(160px, 50vh);
1213} */
1214.status-carousel.boosts-carousel {
1215 --carousel-color: var(--reblog-color);
1216 --carousel-faded-color: var(--reblog-faded-color);
1217}
1218.status-carousel.boosts-carousel .status-reblog {
1219 background-image: none;
1220}
1221.status-carousel.boosts-carousel > ul > li:before {
1222 content: counter(index);
1223 position: absolute;
1224 inset-inline-start: 0;
1225 font-size: 10px;
1226 color: var(--text-insignificant-color);
1227 padding: 6px;
1228}
1229
1230.status-carousel.boosts-carousel .timeline-item-carousel-group {
1231 flex-direction: column;
1232 gap: 8px;
1233
1234 &:before {
1235 content: '';
1236 }
1237}
1238
1239.ui-state {
1240 padding: 16px;
1241 text-align: center;
1242
1243 .icon {
1244 vertical-align: middle;
1245 }
1246}
1247
1248.status-carousel-link {
1249 display: block;
1250 width: 100%;
1251 text-decoration-line: none;
1252 color: inherit;
1253 user-select: none;
1254 transition: background-color 0.2s ease-out;
1255 -webkit-tap-highlight-color: transparent;
1256 animation: appear 0.2s ease-out;
1257 border: 1px solid var(--outline-color);
1258 background-color: var(--bg-blur-color);
1259 border-radius: 16px;
1260 overflow: clip;
1261 box-shadow: 0 1px var(--bg-color);
1262
1263 &:has(.status-badge:not(:empty)) {
1264 border-start-end-radius: 8px;
1265 }
1266
1267 .status-carousel.boosts-carousel &:not(.timeline-item-carousel-group &) {
1268 border-start-start-radius: 8px;
1269 }
1270}
1271.status-carousel-link::focus {
1272 background-color: var(--link-bg-hover-color);
1273}
1274@media (hover: hover) {
1275 .status-carousel-link:hover {
1276 background-color: var(--link-bg-hover-color);
1277 }
1278}
1279.status-carousel-link:active:not(:has(:is(.media, button):active)) {
1280 filter: brightness(0.95);
1281}
1282
1283.deck-backdrop {
1284 position: fixed;
1285 top: 0;
1286 right: 0;
1287 height: 100%;
1288 width: 100%;
1289 z-index: 1000;
1290 display: flex;
1291 background-color: var(--backdrop-color);
1292 animation: appear 0.1s ease-out;
1293}
1294.deck-backdrop > a {
1295 flex-grow: 1;
1296 /* backdrop-filter: saturate(0.75); */
1297}
1298@keyframes slide-in {
1299 0% {
1300 transform: translate3d(100%, 0, 0);
1301 }
1302 100% {
1303 transform: translate3d(0, 0, 0);
1304 }
1305}
1306@keyframes slide-in-rtl {
1307 0% {
1308 transform: translate3d(-100%, 0, 0);
1309 }
1310 100% {
1311 transform: translate3d(0, 0, 0);
1312 }
1313}
1314.deck-backdrop .deck {
1315 width: var(--main-width);
1316 max-width: 100vw;
1317 background-color: var(--bg-color);
1318 box-shadow: -1px 0 var(--bg-color);
1319 &:dir(rtl) {
1320 box-shadow: 1px 0 var(--bg-color);
1321 }
1322}
1323.deck-backdrop .deck.slide-in:not(.deck-view-full) {
1324 animation: slide-in 0.5s var(--timing-function);
1325
1326 &:dir(rtl) {
1327 animation-name: slide-in-rtl;
1328 }
1329}
1330.deck-backdrop .deck .status {
1331 max-width: var(--main-width);
1332}
1333.deck-backdrop .deck :is(.button-switch-view, .menu-switch-view) {
1334 display: none;
1335}
1336@media (min-width: 40em) {
1337 .deck-backdrop .deck .button-switch-view {
1338 display: inline-block;
1339 }
1340 .deck-backdrop .deck .menu-switch-view {
1341 display: flex;
1342 }
1343 .deck-backdrop .deck.deck-view-full {
1344 /* min-width: 100%; */
1345 width: 100%;
1346 background-image: radial-gradient(
1347 circle,
1348 transparent 30em,
1349 var(--bg-faded-color)
1350 );
1351 }
1352 .deck-backdrop .deck.deck-view-full > * {
1353 max-width: calc(var(--main-width) + 32px);
1354 margin: 0 auto;
1355 }
1356 .deck-backdrop .deck.deck-view-full .status {
1357 max-width: 100%;
1358 }
1359}
1360
1361.deck-close {
1362 color: var(--text-insignificant-color) !important;
1363}
1364.deck-close:is(:hover, :focus) {
1365 color: var(--text-color) !important;
1366}
1367
1368:is(button, .button).plain.has-badge:after {
1369 content: '';
1370 display: inline-block;
1371 position: absolute;
1372 inset-inline-end: 10px;
1373 width: 4px;
1374 height: 4px;
1375 border-radius: 50%;
1376 background-color: var(--link-color);
1377 opacity: 0.5;
1378}
1379
1380@keyframes fade-from-top {
1381 0% {
1382 transform: translate(-50%, -200%);
1383 opacity: 0;
1384 }
1385 100% {
1386 transform: translate(-50%, 0);
1387 opacity: 1;
1388 }
1389}
1390.updates-button {
1391 position: absolute;
1392 z-index: 2;
1393 top: 3em;
1394 animation: fade-from-top 0.3s var(--timing-function);
1395 left: 50%;
1396 margin-top: 16px;
1397 transform: translate(-50%, 0);
1398 font-size: 90%;
1399 pointer-events: auto;
1400 transition: all 0.3s ease-in-out;
1401
1402 header[hidden] & {
1403 opacity: 0;
1404 transform: translate(-50%, -100%) scale(0.9);
1405 pointer-events: none;
1406 animation: none !important;
1407 }
1408}
1409.updates-button .icon {
1410 vertical-align: top;
1411}
1412@media (pointer: coarse) {
1413 .updates-button:after {
1414 content: '';
1415 position: absolute;
1416 inset: -16px;
1417 }
1418}
1419
1420/* BOX */
1421
1422.box {
1423 width: var(--main-width);
1424 max-width: 100vw;
1425 padding: 16px;
1426}
1427
1428/* CAROUSEL */
1429/* use snap, center children, max width viewport */
1430
1431.media-modal-container {
1432 position: relative;
1433 width: 70%;
1434 flex-grow: 1;
1435 background-color: var(--backdrop-solid-color);
1436 animation: appear 0.1s var(--timing-function) both;
1437 transition: width 0.3s var(--timing-function);
1438
1439 &:only-child {
1440 width: 100%;
1441 }
1442}
1443.media-modal-container.loading {
1444 display: flex;
1445 justify-content: center;
1446 align-items: center;
1447 background-image: radial-gradient(
1448 closest-side,
1449 var(--bg-blur-color),
1450 transparent
1451 );
1452}
1453
1454.carousel {
1455 display: flex;
1456 overflow-x: auto;
1457 scroll-snap-type: x mandatory;
1458 /* scroll-behavior: smooth; */
1459 scrollbar-width: none;
1460 overscroll-behavior: contain;
1461 touch-action: pan-x;
1462 user-select: none;
1463 width: 100%;
1464 gap: 16px;
1465 --accent-gradient: var(--accent-gradient-light);
1466 @media (prefers-color-scheme: dark) {
1467 --accent-gradient: var(--accent-gradient-dark);
1468 }
1469 background-image: linear-gradient(to var(--forward), var(--accent-gradient));
1470}
1471.carousel::-webkit-scrollbar {
1472 display: none;
1473}
1474.carousel .carousel-item {
1475 scroll-snap-align: center;
1476 scroll-snap-stop: always;
1477 flex-shrink: 0;
1478 display: flex;
1479 justify-content: center;
1480 align-items: center;
1481 width: 100%;
1482 height: 100vh;
1483 height: 100dvh;
1484 background-color: var(--accent-light-color);
1485 @media (prefers-color-scheme: dark) {
1486 background-color: var(--accent-dark-color);
1487 }
1488 /* background-image: radial-gradient(
1489 closest-side,
1490 var(--accent-color) 10%,
1491 var(--accent-alpha-color) 40%,
1492 transparent 100%
1493 ); */
1494}
1495.carousel .carousel-item :is(img, video) {
1496 width: auto;
1497 max-width: 100%;
1498 height: auto;
1499 max-height: 100vh;
1500 max-height: 100svh;
1501 vertical-align: middle;
1502}
1503.carousel .carousel-item video {
1504 min-height: 80px;
1505 max-height: 80vh; /* prevent other UI elements from obscuring video */
1506}
1507.carousel .carousel-item .media {
1508 background-size: contain;
1509 background-repeat: no-repeat;
1510 background-position: center;
1511 width: 100%;
1512 height: 100%;
1513 overflow: hidden;
1514 display: flex;
1515 justify-content: center;
1516 align-items: center;
1517 padding: env(safe-area-inset-top, 0) env(safe-area-inset-right, 0)
1518 env(safe-area-inset-bottom, 0) env(safe-area-inset-left, 0);
1519 background-origin: content-box;
1520}
1521
1522.carousel-top-controls {
1523 top: 0;
1524 top: env(safe-area-inset-top, 0);
1525}
1526:is(.carousel-top-controls, .carousel-controls) {
1527 /* mix-blend-mode: luminosity; */
1528 position: absolute;
1529 left: 0;
1530 left: env(safe-area-inset-left, 0);
1531 right: 0;
1532 right: env(safe-area-inset-right, 0);
1533 padding: 16px;
1534 display: flex;
1535 gap: 8px;
1536 justify-content: space-between;
1537 text-align: center;
1538 pointer-events: none;
1539}
1540:is(.carousel-top-controls, .carousel-controls)[hidden] {
1541 opacity: 0;
1542}
1543.carousel-controls {
1544 top: 45%;
1545}
1546
1547:is(.button, button).carousel-button,
1548button.carousel-dot {
1549 pointer-events: auto;
1550 font-weight: bold;
1551 color: var(--text-color);
1552 background-color: var(--bg-faded-blur-color);
1553 border: 1px solid var(--outline-color);
1554 box-shadow: 0 4px 32px var(--drop-shadow-color);
1555 transition: all 0.2s ease-out;
1556}
1557button.carousel-dot {
1558 background-color: transparent;
1559}
1560:is(.button, button).carousel-button {
1561 background-color: var(--bg-blur-color);
1562}
1563:is(.button, button).carousel-button:is(:hover, :focus):not(:active) {
1564 background-color: var(--bg-color);
1565}
1566.carousel-top-controls .szh-menu-container {
1567 pointer-events: auto;
1568}
1569:is(.button, button).carousel-button[hidden] {
1570 display: inline-block;
1571 opacity: 0;
1572 pointer-events: none;
1573}
1574.carousel-dots {
1575 border-radius: 999px;
1576 background-color: var(--bg-faded-blur-color);
1577 border: 1px solid var(--outline-color);
1578 box-shadow: 0 4px 32px var(--drop-shadow-color);
1579 /* backdrop-filter: blur(12px) invert(0.25); */
1580 transition: background-color 0.2s ease-out;
1581 &:hover {
1582 background-color: var(--bg-color);
1583 }
1584}
1585button.carousel-dot {
1586 backdrop-filter: none !important;
1587 border: none;
1588 box-shadow: none;
1589}
1590/* button.carousel-dot[disabled] {
1591 pointer-events: none;
1592} */
1593button.carousel-dot .icon {
1594 transition: all 0.2s;
1595 transform: scale(0.5);
1596}
1597button.carousel-dot:not(.active) .icon {
1598 opacity: 0.5;
1599}
1600button.carousel-dot:not(.active):is(:hover, :focus) .icon {
1601 opacity: 1;
1602}
1603button.carousel-dot:is(.active, [disabled].active) {
1604 opacity: 1;
1605}
1606button.carousel-dot:is(.active, [disabled].active) .icon {
1607 opacity: 1;
1608 transform: scale(1);
1609}
1610@media (hover: hover) {
1611 .carousel-top-controls {
1612 transform: translateY(-100%);
1613 transition: transform 0.2s ease-in-out;
1614 }
1615 .carousel-controls {
1616 transform: scale(0);
1617 /* transition: transform 0.2s ease-in-out; */
1618 }
1619 .carousel-controls
1620 :is(.button, button).carousel-button:is(:hover, :focus):not(:active) {
1621 transform: scale(1.2);
1622 }
1623 .carousel-controls :is(.button, button).carousel-button:active {
1624 transition-duration: 0s;
1625 }
1626
1627 .carousel:hover + .carousel-top-controls,
1628 .carousel:hover + .carousel-top-controls + .carousel-controls,
1629 .carousel-top-controls:hover,
1630 .carousel-controls:hover,
1631 .carousel-top-controls:focus-within,
1632 .carousel-controls:focus-within {
1633 transform: translateY(0);
1634 }
1635}
1636
1637/* CAROUSEL + STATUS PAGE COMBO */
1638
1639.media-post-link .button-label {
1640 display: none;
1641}
1642body:has(.status-deck) .media-post-link {
1643 display: none;
1644}
1645.media-modal-count-1 .button-label {
1646 display: inline;
1647}
1648
1649/* ✨ New */
1650body:has(.media-modal-container + .status-deck) .media-post-link {
1651 display: inline-block;
1652}
1653.media-modal-container + .status-deck {
1654 /* display: none; */
1655 position: absolute;
1656 inset-inline-end: 0;
1657 z-index: -1;
1658 pointer-events: none;
1659 user-select: none;
1660 animation: none;
1661}
1662
1663@media (min-width: calc(40em + 350px)) {
1664 .media-post-link .button-label {
1665 display: inline;
1666 }
1667 #modal-container > div,
1668 .status-deck {
1669 transition: all 0.3s ease-in-out;
1670 }
1671 /* Don't do this if there's a modal sheet (.sheet) */
1672 :has(#modal-container .carousel):has(.status-deck):not(
1673 :has(.sheet, #compose-container)
1674 )
1675 .status-deck {
1676 width: 350px;
1677 min-width: 0;
1678 }
1679 :has(#modal-container .carousel):has(.status-deck):not(
1680 :has(.sheet, #compose-container)
1681 )
1682 #modal-container
1683 > div {
1684 inset-inline-start: 0;
1685 inset-inline-end: 350px;
1686 width: auto;
1687 }
1688 /* ✨ New */
1689 /* .deck-backdrop > a {
1690 width: 100%;
1691 flex-grow: 0;
1692 } */
1693 .deck-backdrop .media-modal-container + .status-deck:not(.deck-view-full) {
1694 /* display: block; */
1695 width: 30%;
1696 /* min-width: 350px; */
1697 position: static;
1698 z-index: 1;
1699 pointer-events: auto;
1700 user-select: auto;
1701 }
1702 .deck-backdrop .media-modal-container + .status-deck:not(.slide-in) {
1703 animation: appear 0.3s ease-in-out;
1704 }
1705 body:has(.media-modal-container + .status-deck) .media-post-link {
1706 display: none;
1707 }
1708}
1709
1710/* COMPOSE BUTTON */
1711
1712#compose-button {
1713 position: fixed;
1714 bottom: 16px;
1715 bottom: max(16px, env(safe-area-inset-bottom));
1716 inset-inline-end: 16px;
1717 inset-inline-end: max(16px, env(safe-area-inset-right));
1718 padding: 16px;
1719 background-color: var(--button-bg-blur-color);
1720 /* backdrop-filter: blur(16px); */
1721 z-index: 20;
1722 box-shadow:
1723 0 3px 8px -1px var(--drop-shadow-color),
1724 0 10px 36px -4px var(--button-bg-blur-color);
1725 transition: all 0.3s ease-in-out;
1726}
1727.deck-container:has(header[hidden]) ~ #compose-button:not(.loading),
1728#compose-button[hidden]:not(.loading) {
1729 transform: translateY(200%);
1730 pointer-events: none;
1731 user-select: none;
1732 opacity: 0;
1733}
1734#compose-button .icon {
1735 transition: transform 0.3s ease-in-out;
1736}
1737#compose-button[hidden] .icon {
1738 transform: rotate3d(0, 0, 1, -25deg);
1739}
1740#compose-button:is(:hover, :focus) {
1741 background-color: var(--button-bg-color);
1742 filter: none;
1743}
1744#compose-button:active {
1745 transform: scale(0.95);
1746 transition: none;
1747}
1748#compose-button .icon {
1749 filter: drop-shadow(0 1px 2px var(--button-bg-color));
1750}
1751@media (max-width: calc(40em - 1px)) {
1752 #app[data-shortcuts-view-mode='tab-menu-bar'] #compose-button {
1753 bottom: calc(16px + 52px);
1754 bottom: calc(16px + env(safe-area-inset-bottom) + 52px);
1755
1756 body.exp-tab-bar-v2 & {
1757 --inset-inline-end: max(16px, var(--inset-new), var(--sai-inline-end));
1758 inset-inline-end: var(--inset-inline-end);
1759 bottom: max(16px, var(--inset-new));
1760 }
1761 }
1762}
1763#compose-button {
1764 &.min {
1765 outline: 2px solid var(--button-text-color);
1766 z-index: 1001; /* Higher than modal */
1767
1768 &:after {
1769 content: '';
1770 display: block;
1771 position: absolute;
1772 top: 0;
1773 inset-inline-end: 0;
1774 width: 14px;
1775 height: 14px;
1776 border-radius: 50%;
1777 background-color: var(--button-bg-color);
1778 border: 2px solid var(--button-text-color);
1779 box-shadow: 0 2px 8px var(--drop-shadow-color);
1780 opacity: 0;
1781 transition: opacity 0.2s ease-out 0.5s;
1782 opacity: 1;
1783 }
1784 }
1785
1786 &.loading {
1787 outline-color: var(--button-bg-blur-color);
1788
1789 &:before {
1790 position: absolute;
1791 inset: 0;
1792 content: '';
1793 border-radius: 50%;
1794 animation: spin 5s linear infinite;
1795 border: 2px dashed var(--button-text-color);
1796 }
1797 }
1798
1799 &.error {
1800 &:after {
1801 background-color: var(--red-color);
1802 }
1803 }
1804}
1805
1806.menu-post-text {
1807 max-width: 40em;
1808 overflow: hidden;
1809 /* ellipsis 2 lines */
1810 white-space: normal;
1811 display: -webkit-box;
1812 -webkit-box-orient: vertical;
1813 -webkit-line-clamp: 2;
1814 line-clamp: 2;
1815 text-overflow: ellipsis;
1816}
1817
1818/* SHEET */
1819
1820.sheet {
1821 timeline-scope: --sheet-scroll;
1822 align-self: flex-end;
1823 display: flex;
1824 flex-direction: column;
1825 max-height: 90vh;
1826 max-height: 90dvh;
1827 /* overflow: hidden; */
1828 background-color: var(--bg-color);
1829 width: 100%;
1830 max-width: calc(var(--main-width) - 50px - 16px);
1831 border-radius: 16px 16px 0 0;
1832 box-shadow: 0 -1px 32px var(--drop-shadow-color);
1833 animation: slide-up 0.3s var(--timing-function);
1834 /* border: 1px solid var(--outline-color); */
1835 position: relative;
1836}
1837.sheet-max {
1838 max-width: none;
1839 height: 90vh;
1840 height: 90dvh;
1841}
1842@media (min-width: 40em) {
1843 .sheet {
1844 width: 90vw;
1845 width: 90dvw;
1846 }
1847}
1848.sheet .sheet-close {
1849 position: absolute;
1850 border-radius: 0;
1851 padding: 0;
1852 right: env(safe-area-inset-right);
1853 &:dir(rtl) {
1854 right: auto;
1855 left: env(safe-area-inset-left);
1856 }
1857 width: 44px;
1858 height: 44px;
1859 display: inline-flex;
1860 align-items: center;
1861 justify-content: center;
1862 z-index: 2;
1863 background-color: transparent;
1864 background-image: radial-gradient(
1865 circle,
1866 var(--close-button-bg-color) 0px 14px,
1867 transparent 14px
1868 );
1869 color: var(--close-button-color);
1870}
1871.sheet .sheet-close.outer {
1872 margin-top: -44px;
1873 background-image: radial-gradient(
1874 circle,
1875 var(--bg-faded-color) 0px 13px,
1876 var(--outline-color) 13px 14px,
1877 transparent 14px
1878 );
1879}
1880.sheet .sheet-close:is(:hover, :focus) {
1881 color: var(--close-button-hover-color);
1882}
1883.sheet .sheet-close:active {
1884 background-image: radial-gradient(
1885 circle,
1886 var(--close-button-bg-active-color) 0px 14px,
1887 transparent 14px
1888 );
1889}
1890.sheet header {
1891 padding: 16px 16px 8px;
1892 padding-left: max(16px, env(safe-area-inset-left));
1893 padding-right: max(16px, env(safe-area-inset-right));
1894 user-select: none;
1895}
1896@keyframes header-border {
1897 0% {
1898 box-shadow: none;
1899 }
1900 100% {
1901 box-shadow:
1902 0 0 0 1px var(--outline-color),
1903 0 8px 16px -8px var(--drop-shadow-color);
1904 }
1905}
1906@supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) {
1907 .sheet header {
1908 animation: header-border 1s linear both;
1909 animation-timeline: --sheet-scroll;
1910 animation-range: 0 8px;
1911 position: relative;
1912 z-index: 1;
1913 }
1914 .sheet header + main {
1915 mask-image: none !important;
1916 }
1917}
1918.sheet .sheet-close:not(.outer) + header {
1919 padding-right: max(44px, env(safe-area-inset-right));
1920
1921 &:dir(rtl) {
1922 padding-right: max(16px, env(safe-area-inset-right));
1923 padding-left: max(44px, env(safe-area-inset-left));
1924 }
1925}
1926.sheet header :is(h1, h2, h3) {
1927 margin: 0;
1928}
1929.sheet header.header-grid {
1930 display: grid;
1931 grid-template-columns: 1fr auto;
1932 grid-gap: 8px;
1933 align-items: center;
1934}
1935.sheet main {
1936 scroll-timeline: --sheet-scroll;
1937 overflow: auto;
1938 overflow-x: hidden;
1939 overscroll-behavior: contain;
1940 padding: 16px 16px;
1941 padding-left: max(16px, env(safe-area-inset-left));
1942 padding-right: max(16px, env(safe-area-inset-right));
1943 padding-bottom: max(16px, env(safe-area-inset-bottom));
1944}
1945.sheet header + main {
1946 padding-top: 0;
1947 mask-image: linear-gradient(to bottom, transparent 0%, black 10px);
1948}
1949
1950/* ICON */
1951
1952.icon {
1953 flex-shrink: 0;
1954 display: inline-block;
1955 overflow: hidden;
1956 line-height: 0;
1957
1958 svg {
1959 contain: none;
1960 width: 100%;
1961 height: 100%;
1962 }
1963
1964 :dir(rtl) &.rtl-flip {
1965 transform: scaleX(-1);
1966 }
1967}
1968
1969/* TAG */
1970
1971.tag {
1972 font-size: smaller;
1973 color: var(--bg-faded-color);
1974 background-color: var(--text-insignificant-color);
1975 padding: 2px 4px;
1976 border-radius: 4px;
1977 display: inline-block;
1978 margin: 4px;
1979 align-self: center;
1980 text-align: center;
1981
1982 &.clickable {
1983 cursor: pointer;
1984 }
1985}
1986.tag .icon {
1987 vertical-align: middle;
1988}
1989.tag.collapsed {
1990 margin: 0;
1991}
1992.tag.insignificant {
1993 border: 1px solid var(--outline-color);
1994 color: var(--text-insignificant-color);
1995 background-color: var(--bg-faded-color);
1996}
1997.tag.danger {
1998 background-color: var(--red-color);
1999}
2000.tag.minimal {
2001 margin: 0;
2002 color: var(--text-insignificant-color);
2003 background-color: var(--bg-faded-color);
2004 text-shadow: 0 1px var(--bg-color);
2005 line-height: 1;
2006}
2007
2008/* MENU POPUP */
2009
2010.szh-menu-container {
2011 user-select: none;
2012 -webkit-touch-callout: none;
2013 -webkit-user-drag: none;
2014}
2015body > .szh-menu-container {
2016 position: fixed !important;
2017 z-index: 10;
2018}
2019.szh-menu-container:not(:empty) {
2020 inset: 0;
2021 inset: env(safe-area-inset-top) env(safe-area-inset-right)
2022 env(safe-area-inset-bottom) env(safe-area-inset-left);
2023}
2024.szh-menu {
2025 padding: 4px 0;
2026 margin: 0;
2027 font-size: var(--text-size);
2028 background-color: var(--bg-color);
2029 border: 1px solid var(--outline-stronger-color);
2030 border-radius: 8px;
2031 box-shadow:
2032 0 3px 8px var(--drop-shadow-color),
2033 0 6px 32px -6px var(--drop-shadow-color);
2034 text-align: start;
2035 /* animation: appear-smooth 0.15s ease-in-out; */
2036 min-width: 16em;
2037 max-width: 90vw;
2038 /* overflow: hidden; */
2039}
2040.szh-menu[aria-label='Submenu'].menu-blur {
2041 background-color: var(--bg-blur-color);
2042 backdrop-filter: blur(4px);
2043 box-shadow: 0 3px 24px -3px var(--drop-shadow-color);
2044}
2045.szh-menu__header {
2046 margin: -4px 0 8px;
2047 padding: 8px 16px;
2048 color: var(--text-insignificant-color);
2049 font-size: 90%;
2050 background-color: var(--bg-faded-color);
2051 /* background-image: linear-gradient(to top, var(--bg-faded-color), transparent); */
2052 text-shadow: 0 1px 0 var(--bg-color);
2053 line-height: 1.2;
2054 /* border-bottom: 1px solid var(--outline-color); */
2055 border-radius: 8px 8px 0 0;
2056}
2057.szh-menu__header.plain {
2058 margin-bottom: 0;
2059 background-color: transparent;
2060}
2061.szh-menu__header * {
2062 vertical-align: middle;
2063}
2064.szh-menu.menu-emphasized {
2065 border-color: var(--outline-hover-color);
2066 box-shadow:
2067 0 3px 16px -3px var(--drop-shadow-color),
2068 0 3px 32px var(--drop-shadow-color),
2069 0 3px 48px var(--drop-shadow-color);
2070 background-color: var(--bg-color);
2071 animation-duration: 0.3s;
2072 animation-timing-function: ease-in-out;
2073 width: auto;
2074 min-width: min(12em, 90vw);
2075}
2076.szh-menu .footer {
2077 margin: 8px 0 -4px;
2078 padding: 8px 16px;
2079 color: var(--text-insignificant-color);
2080 font-size: 90%;
2081 background-color: var(--bg-faded-color);
2082 text-shadow: 0 1px 0 var(--bg-color);
2083 line-height: 1.2;
2084 display: flex;
2085 gap: 8px;
2086 align-items: center;
2087 border-radius: 0 0 8px 8px;
2088}
2089.szh-menu .szh-menu__item {
2090 display: flex;
2091 gap: 8px;
2092 align-items: center;
2093 line-height: 1.3;
2094 padding: 8px 16px !important;
2095 /* transition: all 0.1s ease-in-out; */
2096 text-decoration: none;
2097 white-space: nowrap;
2098 overflow: hidden;
2099 text-overflow: ellipsis;
2100
2101 --menu-item-bg-inset: 0 4px;
2102 --menu-item-bg-color: var(--button-bg-color);
2103}
2104.szh-menu .szh-menu__item--focusable {
2105 background-color: transparent;
2106}
2107.szh-menu .szh-menu__item span {
2108 white-space: nowrap;
2109 overflow: hidden;
2110 text-overflow: ellipsis;
2111}
2112/* .szh-menu .szh-menu__item * {
2113 vertical-align: middle;
2114} */
2115.szh-menu .szh-menu__item a {
2116 flex: 1;
2117 overflow: hidden;
2118 text-overflow: ellipsis;
2119 display: flex;
2120 gap: 8px;
2121 color: inherit;
2122 text-decoration: none;
2123 padding: 8px 16px !important;
2124 margin: -8px -16px !important;
2125 align-items: center;
2126 user-select: none;
2127 -webkit-touch-callout: none;
2128}
2129.szh-menu .szh-menu__item a.is-active {
2130 font-weight: bold;
2131}
2132.szh-menu .szh-menu__item .icon {
2133 opacity: 0.5;
2134}
2135.szh-menu
2136 .szh-menu__item:not(.szh-menu__item--disabled, .szh-menu__item--hover) {
2137 color: var(--text-color);
2138}
2139.szh-menu .szh-menu__item:not(.menu-field) {
2140 position: relative;
2141 & > * {
2142 /* z-index: 1; */
2143 }
2144
2145 &:before {
2146 content: '';
2147 background-color: var(--menu-item-bg-color);
2148 position: absolute;
2149 inset: var(--menu-item-bg-inset);
2150 border-radius: 4px;
2151 z-index: -1;
2152 opacity: 0;
2153 }
2154}
2155.szh-menu .szh-menu__item--hover:not(.menu-field) {
2156 color: var(--button-text-color);
2157 /* background-color: var(--button-bg-color); */
2158 background-color: transparent;
2159
2160 &:before {
2161 opacity: 1;
2162 }
2163}
2164.szh-menu__divider {
2165 background-color: var(--divider-color);
2166 margin-block: 4px;
2167
2168 > &:first-child,
2169 li[role='none']:not(.szh-menu__header):first-child + & {
2170 display: none;
2171 }
2172}
2173.szh-menu .szh-menu__item .menu-grow {
2174 flex-grow: 1;
2175 text-overflow: ellipsis;
2176 overflow: hidden;
2177}
2178.szh-menu .menu-double-lines {
2179 white-space: normal !important;
2180 display: -webkit-box;
2181 -webkit-line-clamp: 2;
2182 -webkit-box-orient: vertical;
2183 overflow: hidden !important;
2184}
2185.szh-menu .menu-double-lines span {
2186 white-space: normal;
2187 line-height: inherit;
2188 font-size: inherit;
2189}
2190.szh-menu .menu-horizontal {
2191 display: grid;
2192 /* two columns only */
2193 grid-template-columns: repeat(2, 1fr);
2194}
2195.szh-menu .menu-horizontal:has(> .szh-menu__item:only-child),
2196.szh-menu .menu-horizontal:has(> .szh-menu__submenu:only-child) {
2197 grid-template-columns: 1fr;
2198}
2199.szh-menu .menu-horizontal > .szh-menu__item:not(:only-child):first-child,
2200.szh-menu .menu-horizontal > *:not(:only-child):first-child .szh-menu__item {
2201 padding-inline-end: 4px !important;
2202}
2203.szh-menu
2204 .menu-horizontal
2205 > .szh-menu__item:not(:only-child):not(:first-child):not(:last-child),
2206.szh-menu
2207 .menu-horizontal
2208 > *:not(:only-child):not(:first-child):not(:last-child)
2209 .szh-menu__item {
2210 padding-inline-start: 8px !important;
2211 padding-inline-end: 4px !important;
2212}
2213.szh-menu .menu-horizontal > .szh-menu__item:not(:only-child):last-child,
2214.szh-menu .menu-horizontal > *:not(:only-child):last-child .szh-menu__item {
2215 padding-inline-start: 8px !important;
2216}
2217.szh-menu .szh-menu__item .menu-shortcut {
2218 opacity: 0.5;
2219 font-weight: normal;
2220}
2221.szh-menu .szh-menu__item form {
2222 display: flex;
2223 flex: 1;
2224 gap: 8px;
2225 align-items: center;
2226}
2227.szh-menu .szh-menu__item form > input[type='text'] {
2228 flex-grow: 1;
2229 width: 100%;
2230}
2231.szh-menu .szh-menu__item--hover .danger-icon {
2232 color: var(--red-color);
2233 opacity: 1;
2234}
2235.szh-menu
2236 .szh-menu__item:not(.szh-menu__item--disabled):not(
2237 .szh-menu__item--hover
2238 ).danger {
2239 color: var(--red-text-color);
2240}
2241.szh-menu
2242 .szh-menu__item.danger:not(.szh-menu__item--disabled).szh-menu__item--hover {
2243 /* background-color: var(--red-text-color); */
2244 --menu-item-bg-color: var(--red-text-color);
2245
2246 @media (prefers-color-scheme: dark) {
2247 /* background-color: var(--red-color); */
2248 --menu-item-bg-color: var(--red-color);
2249 }
2250}
2251.szh-menu
2252 .szh-menu__item:not(.szh-menu__item--disabled):not(
2253 .szh-menu__item--hover
2254 ).danger
2255 .icon {
2256 opacity: 1;
2257}
2258
2259.szh-menu {
2260 .menu-control-group-horizontal {
2261 display: grid;
2262 /* auto columns */
2263 grid-template-columns: repeat(auto-fit, minmax(44px, 1fr));
2264
2265 .szh-menu__item {
2266 display: flex;
2267 flex-direction: column;
2268 padding: 8px !important;
2269 gap: 2px;
2270
2271 .icon {
2272 opacity: 1;
2273
2274 + span {
2275 font-size: 80%;
2276 /* line-height: 1.2; */
2277 width: 100%;
2278 text-align: center;
2279 opacity: 0.5;
2280 text-overflow: clip;
2281 mask-image: linear-gradient(
2282 var(--to-backward),
2283 transparent,
2284 black 16px
2285 );
2286 }
2287 }
2288
2289 &:before {
2290 content: '';
2291 }
2292 }
2293
2294 .szh-menu__item--hover {
2295 background-color: var(--menu-item-bg-color);
2296 }
2297 }
2298
2299 .menu-control-group-horizontal:first-child,
2300 li[role='none'] + .menu-control-group-horizontal {
2301 margin-top: -4px;
2302 margin-bottom: -4px;
2303
2304 .szh-menu__item {
2305 padding-block: 12px !important;
2306 }
2307
2308 > [class^='szh-menu']:first-child {
2309 border-start-start-radius: 8px;
2310 }
2311 > [class^='szh-menu']:last-child {
2312 border-start-end-radius: 8px;
2313 }
2314 }
2315}
2316
2317.szh-menu
2318 .szh-menu__item--type-checkbox:not(.szh-menu__item--disabled):not(
2319 .szh-menu__item--hover
2320 ) {
2321 .icon {
2322 opacity: 0.15;
2323 }
2324
2325 &.szh-menu__item--checked {
2326 color: var(--link-color);
2327
2328 .icon {
2329 opacity: 1;
2330 color: inherit;
2331 }
2332 }
2333}
2334
2335.szh-menu .menu-wrap {
2336 min-width: 16em;
2337 width: min-content;
2338 display: flex;
2339 flex-wrap: wrap;
2340}
2341.szh-menu .menu-wrap > * {
2342 flex-grow: 1;
2343 flex-basis: 50%;
2344}
2345
2346/* GLASS MENU */
2347
2348.glass-menu {
2349 background-color: var(--bg-blur-color);
2350 backdrop-filter: blur(8px) saturate(3);
2351 border: var(--hairline-width) solid var(--bg-color);
2352 text-shadow:
2353 0 var(--hairline-width) var(--bg-color),
2354 0 0 8px var(--bg-color);
2355}
2356.glass-menu .szh-menu__item--hover {
2357 /* background-color: var(--button-bg-blur-color); */
2358 text-shadow: none;
2359}
2360
2361/* CHAR COUNTER */
2362
2363.char-counter {
2364 --dimension: 24px;
2365 min-width: var(--dimension);
2366 min-height: var(--dimension);
2367 position: relative;
2368 display: inline-block;
2369
2370 &[hidden] {
2371 visibility: hidden;
2372 }
2373
2374 * {
2375 pointer-events: none;
2376 }
2377
2378 meter {
2379 appearance: none;
2380 position: relative;
2381 --border-width: 2px;
2382 --middle-circle-radius: calc(var(--dimension) / 2 - var(--border-width));
2383 width: var(--dimension);
2384 height: var(--dimension);
2385 border-radius: 50%;
2386 --fill: calc(var(--percentage) * 1%);
2387 --color: var(--link-color);
2388 --middle-circle: radial-gradient(
2389 circle at 50% 50%,
2390 var(--bg-color) var(--middle-circle-radius),
2391 transparent var(--middle-circle-radius)
2392 );
2393 background-image:
2394 var(--middle-circle),
2395 conic-gradient(var(--color) var(--fill), var(--outline-color) 0);
2396 transform: scale(0.7);
2397 &:dir(rtl) {
2398 transform: scale(-0.7, 0.7);
2399 }
2400 transition: transform 0.2s ease-in-out;
2401
2402 &::-webkit-meter-inner-element,
2403 &::-webkit-meter-bar,
2404 &::-webkit-meter-optimum-value,
2405 &::-webkit-meter-suboptimum-value,
2406 &::-webkit-meter-even-less-good-value {
2407 display: none;
2408 }
2409
2410 &::-moz-meter-bar {
2411 background: transparent;
2412 }
2413
2414 &.warning {
2415 --color: var(--orange-color);
2416 transform: scale(1);
2417 }
2418 &.danger {
2419 --color: var(--red-color);
2420 transform: scale(1);
2421 }
2422 &.explode {
2423 background-image: none;
2424 transform: scale(1);
2425 }
2426 &:is(.warning, .danger, .explode) + .counter {
2427 opacity: 1;
2428 color: var(--text-insignificant-color);
2429 }
2430 &:is(.danger, .explode) + .counter {
2431 opacity: 1;
2432 color: var(--red-color);
2433 }
2434 }
2435
2436 .counter {
2437 line-height: 1;
2438 opacity: 0;
2439 position: absolute;
2440 top: 50%;
2441 left: 50%;
2442 transform: translate(-50%, -50%);
2443 font-size: 12px;
2444 }
2445}
2446
2447/* SHINY PILL */
2448
2449:is(.shiny-pill, :root .toastify.shiny-pill) {
2450 pointer-events: auto;
2451 color: var(--link-text-color);
2452 font-weight: 500;
2453 text-shadow: 0 1px var(--bg-color);
2454 background-color: var(--bg-color);
2455 border: 2px solid var(--link-faded-color);
2456 box-shadow:
2457 0 3px 16px var(--drop-shadow-color),
2458 0 6px 16px -3px var(--drop-shadow-color);
2459}
2460:is(.shiny-pill, :root .toastify.shiny-pill):hover:not(:active) {
2461 color: var(--text-color);
2462 border-color: var(--link-color);
2463 filter: none !important;
2464 box-shadow:
2465 0 3px 16px var(--drop-shadow-color),
2466 0 6px 16px -3px var(--drop-shadow-color),
2467 0 6px 16px var(--drop-shadow-color);
2468}
2469
2470/* TOAST */
2471
2472:root .toastify {
2473 user-select: none;
2474 padding: 8px 16px;
2475 border-radius: 44px;
2476 pointer-events: none;
2477 color: var(--button-text-color);
2478 text-shadow: 0 calc(var(--hairline-width) * -1) var(--drop-shadow-color);
2479 background-color: var(--button-bg-color);
2480 background-image: none;
2481 box-shadow:
2482 0 3px 8px -1px var(--drop-shadow-color),
2483 0 10px 36px -4px var(--button-bg-blur-color);
2484 text-align: center;
2485 width: fit-content;
2486 max-width: calc(100vw - 32px);
2487}
2488.toastify-bottom {
2489 margin-bottom: env(safe-area-inset-bottom);
2490}
2491
2492/* TOAST - ALERT */
2493
2494:root .toastify.alert {
2495 z-index: 1001;
2496 box-shadow: 0 8px 32px var(--text-insignificant-color);
2497 background-color: var(--bg-color);
2498 color: var(--text-color);
2499 cursor: pointer;
2500 pointer-events: auto;
2501 padding: 16px 32px;
2502 font-size: max(calc(16px * 1.1), var(--text-size));
2503 text-align: center;
2504 line-height: 1.25;
2505}
2506:root .toastify.alert:is(:hover, :active) {
2507 background-color: var(--bg-faded-color);
2508}
2509
2510/* AVATARS STACK */
2511
2512.avatars-stack {
2513 display: flex;
2514 flex-wrap: wrap;
2515 gap: 4px;
2516 align-items: center;
2517}
2518/* I'm just feeling bored, so having fun here */
2519@media (hover: hover) {
2520 .avatars-stack > * img {
2521 transition: transform 0.3s ease-in-out;
2522 }
2523 .avatars-stack:hover > *:nth-of-type(odd) img {
2524 transform: rotate(15deg);
2525 }
2526 .avatars-stack:hover > *:nth-of-type(even) img {
2527 transform: rotate(-15deg);
2528 }
2529}
2530
2531/* 404 */
2532
2533#not-found-page {
2534 display: flex;
2535 align-items: center;
2536 justify-content: center;
2537 text-align: center;
2538 overflow: hidden;
2539 cursor: default;
2540 color: var(--text-insignificant-color);
2541 background-image: radial-gradient(
2542 circle at 50% 50%,
2543 var(--bg-color) 25%,
2544 var(--bg-faded-color)
2545 );
2546 text-shadow: 0 1px var(--bg-color);
2547}
2548
2549/* ACCOUNT STATUSES */
2550
2551@keyframes peekaboo-header {
2552 from {
2553 opacity: 0;
2554 transform: translateY(10%);
2555 }
2556 to {
2557 opacity: 1;
2558 transform: translateY(0);
2559 }
2560}
2561
2562@supports ((animation-timeline: scroll()) and (animation-range: 0% 100%)) {
2563 .header-account {
2564 animation: peekaboo-header 1s linear both;
2565 animation-timeline: scroll();
2566 animation-range: 0 150px;
2567 }
2568}
2569
2570/* LINK LISTS? */
2571
2572ul.link-list {
2573 list-style: none;
2574 padding: 16px;
2575 margin: 0;
2576 display: flex;
2577 flex-direction: column;
2578 gap: 1px;
2579}
2580ul.link-list li {
2581 padding: 0;
2582 margin: 0;
2583}
2584ul.link-list li a {
2585 --radius: 8px;
2586 display: block;
2587 background-color: var(--bg-faded-color);
2588 line-height: 1.25;
2589 padding: 12px;
2590 text-decoration: none;
2591 line-height: 1.4;
2592 font-weight: 500;
2593 display: flex;
2594 align-items: center;
2595 gap: 8px;
2596
2597 .count {
2598 font-size: 80%;
2599 display: inline-block;
2600 color: var(--text-insignificant-color);
2601 min-width: 16px;
2602 min-height: 16px;
2603 padding: 4px;
2604 background-color: var(--bg-color);
2605 border-radius: 4px;
2606
2607 @media (min-width: 40em) {
2608 background-color: var(--bg-faded-color);
2609 }
2610 }
2611}
2612ul.link-list li:first-child a {
2613 border-start-start-radius: var(--radius);
2614 border-start-end-radius: var(--radius);
2615}
2616ul.link-list li:last-child a {
2617 border-end-start-radius: var(--radius);
2618 border-end-end-radius: var(--radius);
2619}
2620ul.link-list li a:is(:hover, :focus) {
2621 color: var(--text-color);
2622}
2623ul.link-list li a:active {
2624 filter: brightness(0.9);
2625}
2626ul.link-list li a * {
2627 vertical-align: middle;
2628}
2629ul.link-list li a .icon {
2630 flex-shrink: 0;
2631}
2632
2633@media (min-width: 40em) {
2634 ul.link-list li a {
2635 background-color: var(--bg-color);
2636 }
2637}
2638
2639/* NAV MENU BUTTON */
2640
2641.nav-menu-button.with-avatar {
2642 position: relative;
2643}
2644.nav-menu-button:is(:hover, :focus):not(:active) {
2645 filter: none !important;
2646}
2647.nav-menu-button .avatar {
2648 box-shadow:
2649 0 0 0 2px var(--bg-color),
2650 0 0 0 4px var(--link-light-color) !important;
2651}
2652.nav-menu-button:is(:hover, :focus, .active) .avatar {
2653 box-shadow:
2654 0 0 0 2px var(--bg-color),
2655 0 0 0 4px var(--link-color) !important;
2656}
2657.nav-menu-button.with-avatar .icon {
2658 position: absolute;
2659 inset-block-end: 4px;
2660 inset-inline-end: 8px;
2661 background-color: var(--bg-color);
2662 border-radius: 2px;
2663}
2664.nav-menu-button.with-avatar:hover:not(:active, .active) .icon {
2665 transform: translateY(-1px);
2666}
2667
2668/* COLUMNS */
2669
2670#columns {
2671 --column-size: 360px;
2672 display: flex;
2673 width: 100vw;
2674 overflow-y: hidden;
2675 overflow-x: auto;
2676 scroll-snap-type: x mandatory;
2677 scroll-behavior: smooth;
2678 /* scrollbar-width: none; */
2679 overscroll-behavior: contain;
2680 overscroll-behavior-x: contain;
2681 /* This `transform` fixes horizontal scrolling for pointer devices on iPad */
2682 transform: translateZ(0);
2683
2684 /* 360px * 2 */
2685 @media (min-width: 720px) {
2686 scroll-snap-type: none;
2687 }
2688}
2689/* #columns::-webkit-scrollbar {
2690 display: none;
2691} */
2692#columns > * {
2693 overscroll-behavior: auto;
2694 scroll-snap-align: start;
2695 scroll-snap-stop: always;
2696 overscroll-behavior: auto;
2697 flex-basis: min(100vw, var(--column-size));
2698 flex-shrink: 0;
2699 box-shadow:
2700 -1px 0 var(--bg-color),
2701 -2px 0 var(--drop-shadow-color),
2702 -3px 0 var(--bg-color);
2703 &:dir(rtl) {
2704 box-shadow:
2705 1px 0 var(--bg-color),
2706 2px 0 var(--drop-shadow-color),
2707 3px 0 var(--bg-color);
2708 }
2709}
2710#columns:has(> :nth-child(3)) > *:nth-child(even),
2711#columns:has(> :nth-child(3))
2712 > *:nth-child(even)
2713 .timeline-deck
2714 > header
2715 .header-grid {
2716 background-color: var(--bg-blur-color);
2717}
2718#columns > .deck-container > .timeline-deck {
2719 content-visibility: auto;
2720}
2721#columns > .deck-container {
2722 &:first-child:not(:only-child) > .deck {
2723 margin-inline-start: auto;
2724 margin-inline-end: 0;
2725 }
2726
2727 &:last-child:not(:only-child) > .deck {
2728 margin-inline-end: auto;
2729 margin-inline-start: 0;
2730 }
2731}
2732#columns .header-grid input {
2733 pointer-events: none;
2734}
2735#columns {
2736 /* Any buttons except nav menu button on first header-side, on 1st column */
2737 .deck-container:first-of-type .header-grid
2738 .header-side:first-of-type
2739 > *:not(.nav-menu-button),
2740 /* Any buttons on last header-side, on 1st column */
2741 .deck-container:first-of-type .header-grid
2742 .header-side:last-of-type
2743 > *,
2744 /* Any buttons on any header-side, on columns after 1st */
2745 .deck-container:not(:first-of-type) .header-grid
2746 .header-side
2747 > * {
2748 display: none;
2749 }
2750}
2751@media (min-width: 40em) {
2752 #columns {
2753 /* gap: 16px; */
2754 /* padding: 0 16px; */
2755 /* background-color: var(--bg-faded-color); */
2756 height: 100vh;
2757 height: 100dvh;
2758 justify-content: stretch;
2759 align-items: stretch;
2760 }
2761 #columns > * {
2762 padding: 0 16px;
2763
2764 &:not(.deck-container) {
2765 display: none;
2766 }
2767
2768 &:is(#notifications-page) {
2769 padding-inline: 0;
2770
2771 .timeline-deck > header {
2772 margin-inline: 16px;
2773 }
2774 }
2775
2776 border-inline: var(--hairline-width) solid var(--bg-faded-color);
2777 /* border-radius: 16px; */
2778 /* box-shadow: -4px 0 16px -8px var(--drop-shadow-color); */
2779 height: unset;
2780 /* background-color: var(--bg-faded-blur-color); */
2781 /* backdrop-filter: blur(16px) saturate(3); */
2782 /* background-image: linear-gradient(
2783 160deg,
2784 transparent 20%,
2785 var(--bg-color),
2786 transparent 75%
2787 ); */
2788 /* position: sticky;
2789 left: 0; */
2790 /* transition: all 0.3s ease-out; */
2791 }
2792 /* #columns > *:nth-child(2) {
2793 left: 5%;
2794 }
2795 #columns > *:nth-child(3) {
2796 left: 10%;
2797 }
2798 #columns > *:nth-child(4) {
2799 left: 15%;
2800 }
2801 #columns > *:nth-child(5) {
2802 left: 20%;
2803 }
2804 #columns > *:nth-child(6) {
2805 left: 25%;
2806 }
2807 #columns > *:nth-child(7) {
2808 left: 30%;
2809 }
2810 #columns > *:nth-child(8) {
2811 left: 35%;
2812 }
2813 #columns > *:nth-child(9) {
2814 left: 40%;
2815 }
2816 #columns > *:nth-child(10) {
2817 left: 45%;
2818 }
2819 #columns > *:focus {
2820 z-index: 1;
2821 box-shadow: 0 0 32px var(--drop-shadow-color),
2822 0 0 32px var(--drop-shadow-color);
2823 } */
2824 /* #columns:has(> *:focus) > *:not(:focus) > * {
2825 filter: opacity(0.8);
2826 } */
2827
2828 #columns > *:focus-visible,
2829 #columns > *:has(:focus-visible) {
2830 /* box-shadow: 0 4px 16px var(--drop-shadow-color),
2831 0 4px 16px var(--drop-shadow-color); */
2832 /* border-color: var(--outline-hover-color); */
2833 z-index: 1;
2834 box-shadow: inset 0 0 0 1px var(--outline-hover-color);
2835 }
2836 #columns .timeline:not(.flat) > li:has(.status-link.is-active),
2837 #columns
2838 .timeline:not(.flat)
2839 > li:not(:has(.status-carousel)):has(+ li .status-link.is-active),
2840 #columns
2841 .timeline:not(.flat)
2842 > li:not(:has(.status-carousel)):has(.status-link.is-active)
2843 + li {
2844 transform: none;
2845 }
2846 #columns .timeline-deck > header {
2847 margin: 0;
2848 }
2849 #columns .timeline-deck > header[hidden] {
2850 transform: none;
2851 pointer-events: auto;
2852 }
2853 #columns li.timeline-item-carousel {
2854 width: auto;
2855 transform: none;
2856 }
2857}
2858
2859/* FILTER BAR */
2860
2861.filter-bar {
2862 padding: 8px 16px;
2863 background-color: var(--bg-faded-color);
2864 display: flex;
2865 gap: 8px;
2866 overflow-x: auto;
2867 mask-image: linear-gradient(
2868 var(--to-forward),
2869 transparent,
2870 black 16px,
2871 black calc(100% - 16px),
2872 transparent
2873 );
2874 align-items: center;
2875 transition: opacity 0.3s ease-out;
2876
2877 &.expandable:not(#columns &) {
2878 @media (min-width: 40em) {
2879 width: 95vw;
2880 max-width: calc(320px * 3.3);
2881 transform: translateX(calc(-50% + var(--main-width) / 2));
2882 &:dir(rtl) {
2883 transform: translateX(calc(50% - var(--main-width) / 2));
2884 }
2885 }
2886 }
2887
2888 &.loading,
2889 .loading > & {
2890 pointer-events: none;
2891 opacity: 0.5;
2892 }
2893
2894 .filter-field {
2895 flex-shrink: 0;
2896 padding: 8px 16px;
2897 border-radius: 999px;
2898 color: var(--text-color);
2899 background-color: var(--bg-color);
2900 background-image: none;
2901 border: 2px solid transparent;
2902 margin: 0;
2903 /* appearance: none; */
2904 line-height: 1;
2905 font-size: 90%;
2906 display: flex;
2907 gap: 8px;
2908
2909 > .icon {
2910 color: var(--link-color);
2911 }
2912
2913 &:placeholder-shown {
2914 color: var(--text-insignificant-color);
2915 }
2916
2917 &:is(:hover, :focus-visible) {
2918 border-color: var(--link-light-color);
2919 }
2920 &:focus {
2921 outline-color: var(--link-light-color);
2922 }
2923 &.is-active {
2924 border-color: var(--link-color);
2925 box-shadow: inset 0 0 8px var(--link-faded-color);
2926 }
2927
2928 :is(input, select) {
2929 background-color: transparent;
2930 background-image: none;
2931 border: 0;
2932 padding: 0;
2933 margin: 0;
2934 color: inherit;
2935 font-size: inherit;
2936 line-height: inherit;
2937 appearance: none;
2938 border-radius: 0;
2939 box-shadow: none;
2940 outline: none;
2941 }
2942
2943 input[type='month'] {
2944 min-width: 6em;
2945
2946 &::-webkit-calendar-picker-indicator {
2947 /* replace icon with triangle */
2948 opacity: 0.5;
2949 background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none"><path d="M4 6L8 10L12 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>');
2950 }
2951
2952 @media (prefers-color-scheme: dark) {
2953 &::-webkit-calendar-picker-indicator {
2954 filter: invert(1);
2955 }
2956 }
2957 }
2958 }
2959}
2960.filter-bar.centered {
2961 justify-content: center;
2962}
2963@media (min-width: 40em) {
2964 .filter-bar {
2965 background-color: transparent;
2966 }
2967}
2968.filter-bar > a:not(.filter-clear) {
2969 padding: 8px 16px;
2970 border-radius: 999px;
2971 background-color: var(--bg-color);
2972 color: var(--link-color);
2973 text-decoration: none;
2974 white-space: nowrap;
2975 border: 2px solid transparent;
2976 transition: border-color 0.3s ease-out;
2977 display: inline-flex;
2978 align-items: center;
2979 gap: 8px;
2980}
2981.filter-bar > a:focus-visible {
2982 border-color: var(--link-light-color);
2983}
2984@media (hover: hover) {
2985 .filter-bar > a:hover {
2986 border-color: var(--link-light-color);
2987 }
2988}
2989.filter-bar > a > * {
2990 vertical-align: middle;
2991}
2992.filter-bar > a.is-active {
2993 border-color: var(--link-color);
2994 box-shadow: inset 0 0 8px var(--link-faded-color);
2995}
2996.filter-bar > a > .filter-count {
2997 font-size: 80%;
2998 display: inline-block;
2999 color: var(--text-insignificant-color);
3000 min-width: 16px;
3001 min-height: 16px;
3002 padding: 4px;
3003 margin: -4px 0;
3004 margin-inline-end: -8px;
3005 background-color: var(--bg-faded-color);
3006 border-radius: 999px;
3007}
3008
3009/* NOTIFICATION PEEK */
3010
3011.notification-peek .notification {
3012 padding-inline: 0 !important;
3013}
3014
3015/* OTHERS */
3016
3017@media (min-width: 40em) {
3018 html,
3019 body {
3020 background-color: var(--bg-faded-color);
3021 }
3022 .deck-container {
3023 background-color: var(--bg-faded-color);
3024 }
3025 #app {
3026 display: flex;
3027 }
3028 .deck-container {
3029 transition: transform 0.4s var(--timing-function);
3030 }
3031 .deck-container:has(~ .deck-backdrop .deck) {
3032 transition: transform 0.4s ease-out;
3033 transform: translate3d(-5vw, 0, 0);
3034 &:dir(rtl) {
3035 transform: translate3d(5vw, 0, 0);
3036 }
3037 }
3038 .deck-backdrop .deck {
3039 /* width: 50%;
3040 min-width: var(--main-width); */
3041 border-inline-start: 1px solid var(--divider-color);
3042 }
3043 .timeline-deck {
3044 border: 0;
3045 background-color: transparent;
3046 }
3047 .timeline-deck > header {
3048 --margin-top: 8px;
3049 top: var(--margin-top);
3050 margin-inline: 8px;
3051 }
3052 .timeline-deck > header .header-grid {
3053 border-bottom: 0;
3054 border-radius: 16px;
3055 background-color: var(--bg-faded-blur-color);
3056 backdrop-filter: blur(16px);
3057 background-image: none;
3058 border-radius: 16px;
3059 min-height: 4em;
3060 }
3061 .timeline-deck > header[hidden] {
3062 transform: translate3d(0, calc((100% + var(--margin-top)) * -1), 0);
3063 }
3064 .deck > header {
3065 text-shadow: 0 1px var(--bg-color);
3066
3067 .szh-menu-container,
3068 form {
3069 text-shadow: none;
3070 }
3071 }
3072 .deck > header h1 {
3073 font-size: 1.5em;
3074 }
3075 .updates-button {
3076 margin-top: 24px;
3077 }
3078 .timeline:not(.flat) > li {
3079 --item-radius: 16px;
3080 border: 1px solid var(--divider-color);
3081 margin: 16px 0;
3082 background-color: var(--bg-color);
3083 border-radius: var(--item-radius);
3084 overflow: hidden;
3085 box-shadow: 0px 1px var(--bg-blur-color);
3086 transition: transform 0.4s var(--timing-function);
3087 --back-transition: transform 0.4s ease-out;
3088
3089 &:is(:empty, :has(> a:empty)) {
3090 display: none;
3091 }
3092 }
3093 .timeline:not(.flat) > li > a {
3094 border-radius: inherit;
3095 }
3096 .timeline:not(.flat) > li:not(:has(.status-carousel)) {
3097 transform: translate3d(0, 0, 0);
3098 }
3099 .timeline:not(.flat)
3100 > li:not(.timeline-item-container-end, .timeline-item-container-middle):has(
3101 .status-badge:not(:empty)
3102 ) {
3103 border-start-end-radius: 8px;
3104 }
3105 .timeline:not(.flat) > li:has(.status-link.is-active) {
3106 transition: var(--back-transition);
3107 transform: translate3d(-2.5vw, 0, 0);
3108 &:dir(rtl) {
3109 transform: translate3d(2.5vw, 0, 0);
3110 }
3111 }
3112 .timeline:not(.flat)
3113 > li.timeline-item-container:has(.status-link.is-active) {
3114 border-start-start-radius: var(--item-radius);
3115 border-end-start-radius: var(--item-radius);
3116 }
3117 .timeline:not(.flat)
3118 > li:not(:has(.status-carousel)):has(+ li .status-link.is-active),
3119 .timeline:not(.flat)
3120 > li:not(:has(.status-carousel)):has(.status-link.is-active)
3121 + li {
3122 transition: var(--back-transition);
3123 transform: translate3d(-1.25vw, 0, 0);
3124 &:dir(rtl) {
3125 transform: translate3d(1.25vw, 0, 0);
3126 }
3127 }
3128 .timeline:not(.flat)
3129 > li.timeline-item-container:not(:has(.status-carousel)):has(
3130 + li .status-link.is-active
3131 ) {
3132 border-start-start-radius: var(--item-radius);
3133 }
3134 .timeline:not(.flat)
3135 > li.timeline-item-container:not(:has(.status-carousel)):has(
3136 .status-link.is-active
3137 )
3138 + li.timeline-item-container {
3139 border-end-start-radius: var(--item-radius);
3140 }
3141 .box {
3142 padding: 32px;
3143 }
3144 /* :is(.carousel-top-controls, .carousel-controls) {
3145 padding: 32px;
3146 } */
3147 li.timeline-item-carousel {
3148 width: 95vw;
3149 max-width: calc(320px * 3.3);
3150 transform: translateX(calc(-50% + var(--main-width) / 2));
3151 &:dir(rtl) {
3152 transform: translateX(calc(50% - var(--main-width) / 2));
3153 }
3154 }
3155}
3156
3157/* LANG SELECTOR */
3158
3159.lang-selector {
3160 display: inline-flex;
3161 gap: 4px;
3162 align-items: center;
3163
3164 select {
3165 width: 10em;
3166 }
3167}
3168
3169/* DEBUG */
3170
3171.debug-info {
3172 font-size: smaller;
3173 summary {
3174 height: 1em;
3175 width: 100%;
3176 list-style: none;
3177 display: inline-block;
3178 }
3179 summary::-webkit-details-marker {
3180 display: none;
3181 }
3182
3183 .side {
3184 float: var(--forward);
3185 }
3186
3187 p,
3188 ol,
3189 ul {
3190 margin-block-start: 0;
3191 padding-block-start: 0;
3192 }
3193}