@rmdes/indiekit-endpoint-activitypub 3.9.0 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/assets/reader.css +3428 -19
  2. package/package.json +1 -1
package/assets/reader.css CHANGED
@@ -1,22 +1,3431 @@
1
- /* ActivityPub Reader — CSS Bundle
2
- * Split into feature-scoped files for maintainability.
3
- * Each file covers one UI domain.
1
+ /**
2
+ * ActivityPub Reader Styles GENERATED FILE
4
3
  *
5
- * Source files live in assets/css/ — edit there, not here.
4
+ * Do not edit this file directly. Edit the source files in assets/css/
5
+ * and regenerate with: cat assets/css/*.css > assets/reader.css
6
+ * (file order matters — see assets/css/ for the canonical source)
7
+ *
8
+ * Card-based layout inspired by Phanpy/Elk
9
+ * Uses Indiekit CSS custom properties for automatic dark mode support
6
10
  */
7
11
 
8
- @import url("css/base.css");
9
- @import url("css/card.css");
10
- @import url("css/media.css");
11
- @import url("css/interactions.css");
12
- @import url("css/compose.css");
13
- @import url("css/notifications.css");
14
- @import url("css/messages.css");
15
- @import url("css/profile.css");
16
- @import url("css/moderation.css");
17
- @import url("css/skeleton.css");
18
- @import url("css/responsive.css");
19
- @import url("css/features.css");
20
- @import url("css/explore.css");
21
- @import url("css/dark-mode.css");
22
- @import url("css/federation.css");
12
+ /* ==========================================================================
13
+ Breadcrumb Navigation
14
+ ========================================================================== */
15
+
16
+ .ap-breadcrumb {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--space-xs);
20
+ margin-bottom: var(--space-m);
21
+ font-size: var(--font-size-s);
22
+ color: var(--color-on-offset);
23
+ }
24
+
25
+ .ap-breadcrumb a {
26
+ color: var(--color-primary-on-background);
27
+ text-decoration: none;
28
+ }
29
+
30
+ .ap-breadcrumb a:hover {
31
+ text-decoration: underline;
32
+ }
33
+
34
+ .ap-breadcrumb__separator {
35
+ color: var(--color-on-offset);
36
+ }
37
+
38
+ .ap-breadcrumb__current {
39
+ color: var(--color-on-background);
40
+ font-weight: 600;
41
+ }
42
+
43
+ /* ==========================================================================
44
+ Fediverse Lookup
45
+ ========================================================================== */
46
+
47
+ .ap-lookup {
48
+ display: flex;
49
+ gap: var(--space-xs);
50
+ margin-bottom: var(--space-m);
51
+ }
52
+
53
+ .ap-lookup__input {
54
+ border: var(--border-width-thin) solid var(--color-outline);
55
+ border-radius: var(--border-radius-small);
56
+ background: var(--color-offset);
57
+ box-sizing: border-box;
58
+ color: var(--color-on-background);
59
+ font-family: inherit;
60
+ font-size: var(--font-size-m);
61
+ padding: var(--space-s) var(--space-m);
62
+ width: 100%;
63
+ }
64
+
65
+ .ap-lookup__input::placeholder {
66
+ color: var(--color-on-offset);
67
+ }
68
+
69
+ .ap-lookup__input:focus {
70
+ outline: 2px solid var(--color-primary);
71
+ outline-offset: -1px;
72
+ border-color: var(--color-primary);
73
+ }
74
+
75
+ .ap-lookup__btn {
76
+ padding: var(--space-s) var(--space-m);
77
+ border: var(--border-width-thin) solid var(--color-primary);
78
+ border-radius: var(--border-radius-small);
79
+ background: var(--color-primary);
80
+ color: var(--color-on-primary);
81
+ font-size: var(--font-size-m);
82
+ font-family: inherit;
83
+ font-weight: 600;
84
+ cursor: pointer;
85
+ white-space: nowrap;
86
+ }
87
+
88
+ .ap-lookup__btn:hover {
89
+ opacity: 0.9;
90
+ }
91
+
92
+ /* ==========================================================================
93
+ Tab Navigation
94
+ ========================================================================== */
95
+
96
+ .ap-tabs {
97
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
98
+ display: flex;
99
+ gap: var(--space-xs);
100
+ margin-bottom: var(--space-m);
101
+ overflow-x: auto;
102
+ -webkit-overflow-scrolling: touch;
103
+ }
104
+
105
+ .ap-tab {
106
+ border-bottom: var(--border-width-thick) solid transparent;
107
+ color: var(--color-on-offset);
108
+ font-size: var(--font-size-m);
109
+ padding: var(--space-s) var(--space-m);
110
+ text-decoration: none;
111
+ transition:
112
+ color 0.2s ease,
113
+ border-color 0.2s ease;
114
+ white-space: nowrap;
115
+ }
116
+
117
+ .ap-tab:hover {
118
+ color: var(--color-on-background);
119
+ }
120
+
121
+ .ap-tab--active {
122
+ border-bottom-color: var(--color-primary);
123
+ color: var(--color-primary-on-background);
124
+ font-weight: 600;
125
+ }
126
+
127
+ .ap-tab__count {
128
+ background: var(--color-offset-variant);
129
+ border-radius: var(--border-radius-large);
130
+ font-size: var(--font-size-xs);
131
+ font-weight: 600;
132
+ margin-left: var(--space-xs);
133
+ padding: 1px 6px;
134
+ }
135
+
136
+ .ap-tab--active .ap-tab__count {
137
+ background: var(--color-primary);
138
+ color: var(--color-on-primary, var(--color-neutral99));
139
+ }
140
+
141
+ /* ==========================================================================
142
+ Timeline Layout
143
+ ========================================================================== */
144
+
145
+ .ap-timeline {
146
+ display: flex;
147
+ flex-direction: column;
148
+ gap: var(--space-m);
149
+ }
150
+ /* ==========================================================================
151
+ Item Card — Base
152
+ ========================================================================== */
153
+
154
+ .ap-card {
155
+ background: var(--color-offset);
156
+ border: var(--border-width-thin) solid var(--color-outline);
157
+ border-left: 3px solid var(--color-outline);
158
+ border-radius: var(--border-radius-small);
159
+ overflow: hidden;
160
+ padding: var(--space-m);
161
+ box-shadow: 0 1px 2px hsl(var(--tint-neutral) 10% / 0.04);
162
+ transition:
163
+ box-shadow 0.2s ease,
164
+ border-color 0.2s ease;
165
+ }
166
+
167
+ .ap-card:hover {
168
+ border-color: var(--color-outline-variant);
169
+ border-left-color: var(--color-outline-variant);
170
+ box-shadow: 0 2px 8px hsl(var(--tint-neutral) 10% / 0.08);
171
+ }
172
+
173
+ /* ==========================================================================
174
+ Item Card — Post Type Differentiation
175
+ ========================================================================== */
176
+
177
+ /* Notes: default purple-ish accent (the most common type) */
178
+ .ap-card--note {
179
+ border-left-color: var(--color-purple45);
180
+ }
181
+
182
+ .ap-card--note:hover {
183
+ border-left-color: var(--color-purple45);
184
+ }
185
+
186
+ /* Articles: green accent (long-form content stands out) */
187
+ .ap-card--article {
188
+ border-left-color: var(--color-green50);
189
+ }
190
+
191
+ .ap-card--article:hover {
192
+ border-left-color: var(--color-green50);
193
+ }
194
+
195
+ /* Boosts: yellow accent (shared content) */
196
+ .ap-card--boost {
197
+ border-left-color: var(--color-yellow50);
198
+ }
199
+
200
+ .ap-card--boost:hover {
201
+ border-left-color: var(--color-yellow50);
202
+ }
203
+
204
+ /* Replies: blue accent (via primary color) */
205
+ .ap-card--reply {
206
+ border-left-color: var(--color-primary);
207
+ }
208
+
209
+ .ap-card--reply:hover {
210
+ border-left-color: var(--color-primary);
211
+ }
212
+
213
+ /* ==========================================================================
214
+ Boost Header
215
+ ========================================================================== */
216
+
217
+ .ap-card__boost {
218
+ color: var(--color-on-offset);
219
+ font-size: var(--font-size-s);
220
+ margin-bottom: var(--space-s);
221
+ padding-bottom: var(--space-xs);
222
+ }
223
+
224
+ .ap-card__boost a {
225
+ color: var(--color-on-offset);
226
+ font-weight: 600;
227
+ text-decoration: none;
228
+ }
229
+
230
+ .ap-card__boost a:hover {
231
+ color: var(--color-on-background);
232
+ text-decoration: underline;
233
+ }
234
+
235
+ /* ==========================================================================
236
+ Reply Context
237
+ ========================================================================== */
238
+
239
+ .ap-card__reply-to {
240
+ color: var(--color-on-offset);
241
+ font-size: var(--font-size-s);
242
+ margin-bottom: var(--space-s);
243
+ overflow: hidden;
244
+ text-overflow: ellipsis;
245
+ white-space: nowrap;
246
+ }
247
+
248
+ .ap-card__reply-to a {
249
+ color: var(--color-primary-on-background);
250
+ text-decoration: none;
251
+ }
252
+
253
+ .ap-card__reply-to a:hover {
254
+ text-decoration: underline;
255
+ }
256
+
257
+ /* ==========================================================================
258
+ Author Header
259
+ ========================================================================== */
260
+
261
+ .ap-card__author {
262
+ align-items: center;
263
+ display: flex;
264
+ gap: var(--space-s);
265
+ margin-bottom: var(--space-s);
266
+ }
267
+
268
+ .ap-card__avatar-wrap {
269
+ flex-shrink: 0;
270
+ height: 44px;
271
+ position: relative;
272
+ width: 44px;
273
+ }
274
+
275
+ .ap-card__avatar {
276
+ border: var(--border-width-thin) solid var(--color-outline);
277
+ border-radius: 50%;
278
+ height: 44px;
279
+ object-fit: cover;
280
+ width: 44px;
281
+ }
282
+
283
+ .ap-card__avatar-wrap > img {
284
+ position: absolute;
285
+ inset: 0;
286
+ z-index: 1;
287
+ }
288
+
289
+ .ap-card__avatar--default {
290
+ align-items: center;
291
+ background: var(--color-offset-variant);
292
+ color: var(--color-on-offset);
293
+ display: inline-flex;
294
+ font-size: 1.1em;
295
+ font-weight: 600;
296
+ justify-content: center;
297
+ }
298
+
299
+ .ap-card__author-info {
300
+ display: flex;
301
+ flex-direction: column;
302
+ flex: 1;
303
+ gap: 1px;
304
+ min-width: 0;
305
+ }
306
+
307
+ .ap-card__author-name {
308
+ font-size: 0.95em;
309
+ font-weight: 600;
310
+ overflow: hidden;
311
+ text-overflow: ellipsis;
312
+ white-space: nowrap;
313
+ }
314
+
315
+ .ap-card__author-name a {
316
+ color: inherit;
317
+ text-decoration: none;
318
+ }
319
+
320
+ .ap-card__author-name a:hover {
321
+ text-decoration: underline;
322
+ }
323
+
324
+ .ap-card__bot-badge {
325
+ display: inline-block;
326
+ font-size: 0.6rem;
327
+ font-weight: 700;
328
+ line-height: 1;
329
+ padding: 0.15em 0.35em;
330
+ margin-left: 0.3em;
331
+ border: var(--border-width-thin) solid var(--color-on-offset);
332
+ border-radius: var(--border-radius-small);
333
+ color: var(--color-on-offset);
334
+ vertical-align: middle;
335
+ text-transform: uppercase;
336
+ letter-spacing: 0.03em;
337
+ }
338
+
339
+ .ap-card__author-handle {
340
+ color: var(--color-on-offset);
341
+ font-size: var(--font-size-s);
342
+ overflow: hidden;
343
+ text-overflow: ellipsis;
344
+ white-space: nowrap;
345
+ }
346
+
347
+ .ap-card__timestamp {
348
+ color: var(--color-on-offset);
349
+ flex-shrink: 0;
350
+ font-size: var(--font-size-s);
351
+ }
352
+
353
+ .ap-card__edited {
354
+ font-size: var(--font-size-xs);
355
+ margin-left: 0.2em;
356
+ }
357
+
358
+ .ap-card__visibility {
359
+ font-size: var(--font-size-xs);
360
+ margin-left: 0.3em;
361
+ opacity: 0.7;
362
+ }
363
+
364
+ .ap-card__timestamp-link {
365
+ color: inherit;
366
+ text-decoration: none;
367
+ display: flex;
368
+ align-items: center;
369
+ gap: 0;
370
+ }
371
+
372
+ .ap-card__timestamp-link:hover {
373
+ text-decoration: underline;
374
+ color: var(--color-primary-on-background);
375
+ }
376
+
377
+ /* ==========================================================================
378
+ Post Title (Articles)
379
+ ========================================================================== */
380
+
381
+ .ap-card__title {
382
+ font-size: var(--font-size-l);
383
+ font-weight: 600;
384
+ line-height: var(--line-height-tight);
385
+ margin-bottom: var(--space-s);
386
+ }
387
+
388
+ .ap-card__title a {
389
+ color: inherit;
390
+ text-decoration: none;
391
+ }
392
+
393
+ .ap-card__title a:hover {
394
+ text-decoration: underline;
395
+ }
396
+
397
+ /* ==========================================================================
398
+ Content
399
+ ========================================================================== */
400
+
401
+ .ap-card__content {
402
+ color: var(--color-on-background);
403
+ line-height: calc(4 / 3 * 1em);
404
+ margin-bottom: var(--space-s);
405
+ overflow-wrap: break-word;
406
+ word-break: break-word;
407
+ }
408
+
409
+ .ap-card__content a {
410
+ color: var(--color-primary-on-background);
411
+ }
412
+
413
+ .ap-card__content p {
414
+ margin-bottom: var(--space-xs);
415
+ }
416
+
417
+ .ap-card__content p:last-child {
418
+ margin-bottom: 0;
419
+ }
420
+
421
+ .ap-card__content blockquote {
422
+ border-left: var(--border-width-thickest) solid var(--color-outline);
423
+ margin: var(--space-s) 0;
424
+ padding-left: var(--space-m);
425
+ }
426
+
427
+ .ap-card__content pre {
428
+ background: var(--color-offset-variant);
429
+ border-radius: var(--border-radius-small);
430
+ overflow-x: auto;
431
+ padding: var(--space-s);
432
+ }
433
+
434
+ .ap-card__content code {
435
+ background: var(--color-offset-variant);
436
+ border-radius: var(--border-radius-small);
437
+ font-size: 0.9em;
438
+ padding: 1px 4px;
439
+ }
440
+
441
+ .ap-card__content pre code {
442
+ background: none;
443
+ padding: 0;
444
+ }
445
+
446
+ .ap-card__content img {
447
+ border-radius: var(--border-radius-small);
448
+ height: auto;
449
+ max-width: 100%;
450
+ }
451
+
452
+ /* @mentions — keep inline, style as subtle links */
453
+ .ap-card__content .h-card {
454
+ display: inline;
455
+ }
456
+
457
+ .ap-card__content .h-card a,
458
+ .ap-card__content a.u-url.mention {
459
+ display: inline;
460
+ color: var(--color-on-offset);
461
+ text-decoration: none;
462
+ white-space: nowrap;
463
+ }
464
+
465
+ .ap-card__content .h-card a span,
466
+ .ap-card__content a.u-url.mention span {
467
+ display: inline;
468
+ }
469
+
470
+ .ap-card__content .h-card a:hover,
471
+ .ap-card__content a.u-url.mention:hover {
472
+ color: var(--color-primary-on-background);
473
+ text-decoration: underline;
474
+ }
475
+
476
+ /* Hashtag mentions — keep inline, subtle styling */
477
+ .ap-card__content a.mention.hashtag {
478
+ display: inline;
479
+ color: var(--color-on-offset);
480
+ text-decoration: none;
481
+ white-space: nowrap;
482
+ }
483
+
484
+ .ap-card__content a.mention.hashtag span {
485
+ display: inline;
486
+ }
487
+
488
+ .ap-card__content a.mention.hashtag:hover {
489
+ color: var(--color-primary-on-background);
490
+ text-decoration: underline;
491
+ }
492
+
493
+ /* Mastodon's invisible/ellipsis spans for long URLs */
494
+ .ap-card__content .invisible {
495
+ display: none;
496
+ }
497
+
498
+ .ap-card__content .ellipsis::after {
499
+ content: "…";
500
+ }
501
+
502
+ /* ==========================================================================
503
+ Content Warning
504
+ ========================================================================== */
505
+
506
+ .ap-card__cw {
507
+ margin-bottom: var(--space-s);
508
+ }
509
+
510
+ .ap-card__cw-toggle {
511
+ background: var(--color-offset-variant);
512
+ border: var(--border-width-thin) solid var(--color-outline);
513
+ border-radius: var(--border-radius-small);
514
+ color: var(--color-on-background);
515
+ cursor: pointer;
516
+ display: block;
517
+ font-size: var(--font-size-s);
518
+ padding: var(--space-s) var(--space-m);
519
+ text-align: left;
520
+ transition: background 0.2s ease;
521
+ width: 100%;
522
+ }
523
+
524
+ .ap-card__cw-toggle:hover {
525
+ background: var(--color-offset-variant-darker);
526
+ }
527
+ /* ==========================================================================
528
+ Photo Gallery
529
+ ========================================================================== */
530
+
531
+ .ap-card__gallery {
532
+ border-radius: var(--border-radius-small);
533
+ display: grid;
534
+ gap: 2px;
535
+ margin-bottom: var(--space-s);
536
+ overflow: hidden;
537
+ }
538
+
539
+ .ap-card__gallery-link {
540
+ appearance: none;
541
+ background: none;
542
+ border: 0;
543
+ cursor: pointer;
544
+ display: block;
545
+ padding: 0;
546
+ position: relative;
547
+ }
548
+
549
+ .ap-card__gallery img {
550
+ background: var(--color-offset-variant);
551
+ display: block;
552
+ height: 280px;
553
+ object-fit: cover;
554
+ width: 100%;
555
+ transition: filter 0.2s ease;
556
+ }
557
+
558
+ @media (max-width: 480px) {
559
+ .ap-card__gallery img {
560
+ height: 180px;
561
+ }
562
+ }
563
+
564
+ .ap-card__gallery-link:hover img {
565
+ filter: brightness(0.92);
566
+ }
567
+
568
+ .ap-card__gallery-link--more::after {
569
+ background: hsl(var(--tint-neutral) 10% / 0.5);
570
+ bottom: 0;
571
+ content: "";
572
+ left: 0;
573
+ position: absolute;
574
+ right: 0;
575
+ top: 0;
576
+ }
577
+
578
+ .ap-card__gallery-more {
579
+ color: var(--color-neutral99);
580
+ font-size: 1.5em;
581
+ font-weight: 600;
582
+ left: 50%;
583
+ position: absolute;
584
+ top: 50%;
585
+ transform: translate(-50%, -50%);
586
+ z-index: 1;
587
+ }
588
+
589
+ /* 1 photo */
590
+ .ap-card__gallery--1 {
591
+ grid-template-columns: 1fr;
592
+ }
593
+
594
+ .ap-card__gallery--1 img {
595
+ height: auto;
596
+ max-height: 500px;
597
+ }
598
+
599
+ /* 2 photos — side by side */
600
+ .ap-card__gallery--2 {
601
+ grid-template-columns: 1fr 1fr;
602
+ }
603
+
604
+ /* 3 photos — one large, two small */
605
+ .ap-card__gallery--3 {
606
+ grid-template-columns: 2fr 1fr;
607
+ grid-template-rows: 1fr 1fr;
608
+ }
609
+
610
+ .ap-card__gallery--3 img:first-child {
611
+ grid-row: 1 / 3;
612
+ height: 100%;
613
+ }
614
+
615
+ /* 4+ photos — 2x2 grid */
616
+ .ap-card__gallery--4 {
617
+ grid-template-columns: 1fr 1fr;
618
+ grid-template-rows: 1fr 1fr;
619
+ }
620
+
621
+ /* ==========================================================================
622
+ Photo Lightbox
623
+ ========================================================================== */
624
+
625
+ [x-cloak] {
626
+ display: none !important;
627
+ }
628
+
629
+ .ap-lightbox {
630
+ align-items: center;
631
+ background: hsl(var(--tint-neutral) 10% / 0.92);
632
+ display: flex;
633
+ inset: 0;
634
+ justify-content: center;
635
+ position: fixed;
636
+ z-index: 9999;
637
+ }
638
+
639
+ .ap-lightbox__img {
640
+ max-height: 90vh;
641
+ max-width: 95vw;
642
+ object-fit: contain;
643
+ }
644
+
645
+ .ap-lightbox__close {
646
+ background: none;
647
+ border: 0;
648
+ color: white;
649
+ cursor: pointer;
650
+ font-size: 2rem;
651
+ line-height: 1;
652
+ padding: var(--space-s);
653
+ position: absolute;
654
+ right: var(--space-m);
655
+ top: var(--space-m);
656
+ }
657
+
658
+ .ap-lightbox__close:hover {
659
+ opacity: 0.7;
660
+ }
661
+
662
+ .ap-lightbox__prev,
663
+ .ap-lightbox__next {
664
+ background: none;
665
+ border: 0;
666
+ color: white;
667
+ cursor: pointer;
668
+ font-size: 3rem;
669
+ line-height: 1;
670
+ padding: var(--space-m);
671
+ position: absolute;
672
+ top: 50%;
673
+ transform: translateY(-50%);
674
+ }
675
+
676
+ .ap-lightbox__prev {
677
+ left: var(--space-s);
678
+ }
679
+
680
+ .ap-lightbox__next {
681
+ right: var(--space-s);
682
+ }
683
+
684
+ .ap-lightbox__prev:hover,
685
+ .ap-lightbox__next:hover {
686
+ opacity: 0.7;
687
+ }
688
+
689
+ .ap-lightbox__counter {
690
+ bottom: var(--space-m);
691
+ color: white;
692
+ font-size: var(--font-size-s);
693
+ left: 50%;
694
+ position: absolute;
695
+ transform: translateX(-50%);
696
+ }
697
+
698
+ /* ==========================================================================
699
+ Link Preview Card
700
+ ========================================================================== */
701
+
702
+ .ap-link-previews {
703
+ margin-bottom: var(--space-s);
704
+ }
705
+
706
+ .ap-link-preview {
707
+ display: flex;
708
+ border: var(--border-width-thin) solid var(--color-outline);
709
+ border-radius: var(--border-radius-small);
710
+ overflow: hidden;
711
+ text-decoration: none;
712
+ color: inherit;
713
+ transition: border-color 0.2s ease;
714
+ }
715
+
716
+ .ap-link-preview:hover {
717
+ border-color: var(--color-primary);
718
+ }
719
+
720
+ .ap-link-preview__text {
721
+ flex: 1;
722
+ min-width: 0;
723
+ padding: var(--space-s) var(--space-m);
724
+ display: flex;
725
+ flex-direction: column;
726
+ justify-content: center;
727
+ gap: 0.2em;
728
+ }
729
+
730
+ .ap-link-preview__title {
731
+ font-weight: 600;
732
+ font-size: var(--font-size-s);
733
+ margin: 0;
734
+ overflow: hidden;
735
+ text-overflow: ellipsis;
736
+ white-space: nowrap;
737
+ }
738
+
739
+ .ap-link-preview__desc {
740
+ font-size: var(--font-size-s);
741
+ color: var(--color-on-offset);
742
+ margin: 0;
743
+ display: -webkit-box;
744
+ -webkit-line-clamp: 2;
745
+ -webkit-box-orient: vertical;
746
+ overflow: hidden;
747
+ }
748
+
749
+ .ap-link-preview__domain {
750
+ font-size: var(--font-size-xs);
751
+ color: var(--color-on-offset);
752
+ margin: 0;
753
+ display: flex;
754
+ align-items: center;
755
+ gap: 0.3em;
756
+ }
757
+
758
+ .ap-link-preview__favicon {
759
+ width: 14px;
760
+ height: 14px;
761
+ }
762
+
763
+ .ap-link-preview__image {
764
+ flex-shrink: 0;
765
+ width: 120px;
766
+ }
767
+
768
+ .ap-link-preview__image img {
769
+ display: block;
770
+ width: 100%;
771
+ height: 100%;
772
+ object-fit: cover;
773
+ }
774
+
775
+ /* ==========================================================================
776
+ Video Embed
777
+ ========================================================================== */
778
+
779
+ .ap-card__video {
780
+ margin-bottom: var(--space-s);
781
+ }
782
+
783
+ .ap-card__video video {
784
+ border-radius: var(--border-radius-small);
785
+ max-height: 400px;
786
+ width: 100%;
787
+ }
788
+
789
+ /* ==========================================================================
790
+ Audio Player
791
+ ========================================================================== */
792
+
793
+ .ap-card__audio {
794
+ margin-bottom: var(--space-s);
795
+ }
796
+
797
+ .ap-card__audio audio {
798
+ width: 100%;
799
+ }
800
+
801
+ /* Gallery items — positioned for ALT badge overlay */
802
+ .ap-card__gallery-item {
803
+ position: relative;
804
+ }
805
+
806
+ /* ALT text badges */
807
+ .ap-media__alt-badge {
808
+ position: absolute;
809
+ bottom: 0.5rem;
810
+ left: 0.5rem;
811
+ background: hsl(var(--tint-neutral) 10% / 0.7);
812
+ color: var(--color-neutral99);
813
+ font-size: 0.65rem;
814
+ font-weight: 700;
815
+ padding: 0.15rem 0.35rem;
816
+ border-radius: var(--border-radius-small);
817
+ border: none;
818
+ cursor: pointer;
819
+ text-transform: uppercase;
820
+ letter-spacing: 0.03em;
821
+ z-index: 1;
822
+ }
823
+
824
+ .ap-media__alt-badge:hover {
825
+ background: hsl(var(--tint-neutral) 10% / 0.9);
826
+ }
827
+
828
+ .ap-media__alt-text {
829
+ position: absolute;
830
+ bottom: 2.2rem;
831
+ left: 0.5rem;
832
+ right: 0.5rem;
833
+ background: hsl(var(--tint-neutral) 10% / 0.85);
834
+ color: var(--color-neutral99);
835
+ font-size: var(--font-size-s);
836
+ padding: 0.5rem;
837
+ border-radius: var(--border-radius-small);
838
+ max-height: 8rem;
839
+ overflow-y: auto;
840
+ z-index: 2;
841
+ }
842
+ /* ==========================================================================
843
+ Tags
844
+ ========================================================================== */
845
+
846
+ .ap-card__tags {
847
+ display: flex;
848
+ flex-wrap: wrap;
849
+ gap: var(--space-xs);
850
+ margin-bottom: var(--space-s);
851
+ }
852
+
853
+ .ap-card__tag {
854
+ background: var(--color-offset-variant);
855
+ border-radius: var(--border-radius-large);
856
+ color: var(--color-on-offset);
857
+ font-size: var(--font-size-s);
858
+ padding: 2px var(--space-xs);
859
+ text-decoration: none;
860
+ }
861
+
862
+ .ap-card__tag:hover {
863
+ background: var(--color-offset-variant-darker);
864
+ color: var(--color-on-background);
865
+ }
866
+
867
+ .ap-card__mention {
868
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
869
+ border-radius: var(--border-radius-large);
870
+ color: var(--color-primary-on-background);
871
+ font-size: var(--font-size-s);
872
+ padding: 2px var(--space-xs);
873
+ text-decoration: none;
874
+ }
875
+
876
+ .ap-card__mention:hover {
877
+ background: color-mix(in srgb, var(--color-primary) 22%, transparent);
878
+ color: var(--color-primary-on-background);
879
+ }
880
+
881
+ .ap-card__mention--legacy {
882
+ cursor: default;
883
+ opacity: 0.7;
884
+ }
885
+
886
+ /* Hashtag stuffing collapse */
887
+ .ap-hashtag-overflow {
888
+ margin: var(--space-xs) 0;
889
+ font-size: var(--font-size-s);
890
+ }
891
+
892
+ .ap-hashtag-overflow summary {
893
+ cursor: pointer;
894
+ color: var(--color-on-offset);
895
+ list-style: none;
896
+ }
897
+
898
+ .ap-hashtag-overflow summary::before {
899
+ content: "▸ ";
900
+ }
901
+
902
+ .ap-hashtag-overflow[open] summary::before {
903
+ content: "▾ ";
904
+ }
905
+
906
+ .ap-hashtag-overflow p {
907
+ margin-top: var(--space-xs);
908
+ }
909
+
910
+ /* ==========================================================================
911
+ Interaction Buttons
912
+ ========================================================================== */
913
+
914
+ .ap-card__actions {
915
+ border-top: var(--border-width-thin) solid var(--color-outline);
916
+ display: flex;
917
+ flex-wrap: wrap;
918
+ gap: 2px;
919
+ padding-top: var(--space-s);
920
+ }
921
+
922
+ .ap-card__action {
923
+ align-items: center;
924
+ background: transparent;
925
+ border: 0;
926
+ border-radius: var(--border-radius-small);
927
+ color: var(--color-on-offset);
928
+ cursor: pointer;
929
+ display: inline-flex;
930
+ font-size: var(--font-size-s);
931
+ gap: 0.3em;
932
+ min-height: 36px;
933
+ padding: 0.25em 0.6em;
934
+ text-decoration: none;
935
+ transition:
936
+ background-color 0.15s ease,
937
+ color 0.15s ease;
938
+ }
939
+
940
+ .ap-card__action:hover {
941
+ background: var(--color-offset-variant);
942
+ color: var(--color-on-background);
943
+ }
944
+
945
+ /* Color-coded hover states per action type */
946
+ .ap-card__action--reply:hover {
947
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
948
+ color: var(--color-primary);
949
+ }
950
+
951
+ .ap-card__action--boost:hover {
952
+ background: color-mix(in srgb, var(--color-green50) 12%, transparent);
953
+ color: var(--color-green50);
954
+ }
955
+
956
+ .ap-card__action--like:hover {
957
+ background: color-mix(in srgb, var(--color-red45) 12%, transparent);
958
+ color: var(--color-red45);
959
+ }
960
+
961
+ .ap-card__action--link:hover {
962
+ background: var(--color-offset-variant);
963
+ color: var(--color-on-background);
964
+ }
965
+
966
+ .ap-card__action--save:hover {
967
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
968
+ color: var(--color-primary);
969
+ }
970
+
971
+ /* Active interaction states */
972
+ .ap-card__action--like.ap-card__action--active {
973
+ background: color-mix(in srgb, var(--color-red45) 12%, transparent);
974
+ color: var(--color-red45);
975
+ }
976
+
977
+ .ap-card__action--boost.ap-card__action--active {
978
+ background: color-mix(in srgb, var(--color-green50) 12%, transparent);
979
+ color: var(--color-green50);
980
+ }
981
+
982
+ .ap-card__action--save.ap-card__action--active {
983
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
984
+ color: var(--color-primary);
985
+ }
986
+
987
+ .ap-card__action:disabled {
988
+ cursor: wait;
989
+ opacity: 0.5;
990
+ }
991
+
992
+ /* Interaction counts */
993
+ .ap-card__count {
994
+ font-size: var(--font-size-xs);
995
+ color: inherit;
996
+ opacity: 0.7;
997
+ margin-left: 0.1em;
998
+ font-variant-numeric: tabular-nums;
999
+ }
1000
+
1001
+ /* Error message */
1002
+ .ap-card__action-error {
1003
+ color: var(--color-error);
1004
+ font-size: var(--font-size-s);
1005
+ width: 100%;
1006
+ }
1007
+
1008
+ /* ==========================================================================
1009
+ Pagination
1010
+ ========================================================================== */
1011
+
1012
+ .ap-pagination {
1013
+ border-top: var(--border-width-thin) solid var(--color-outline);
1014
+ display: flex;
1015
+ gap: var(--space-m);
1016
+ justify-content: space-between;
1017
+ margin-top: var(--space-m);
1018
+ padding-top: var(--space-m);
1019
+ }
1020
+
1021
+ .ap-pagination a {
1022
+ color: var(--color-primary-on-background);
1023
+ text-decoration: none;
1024
+ }
1025
+
1026
+ .ap-pagination a:hover {
1027
+ text-decoration: underline;
1028
+ }
1029
+
1030
+ /* Hidden once Alpine is active (JS replaces with infinite scroll) */
1031
+ .ap-pagination--js-hidden {
1032
+ /* Shown by default for no-JS fallback — Alpine hides via display:none */
1033
+ }
1034
+
1035
+ /* ==========================================================================
1036
+ Infinite Scroll / Load More
1037
+ ========================================================================== */
1038
+
1039
+ .ap-load-more {
1040
+ display: flex;
1041
+ flex-direction: column;
1042
+ align-items: center;
1043
+ gap: var(--space-s);
1044
+ padding: var(--space-m) 0;
1045
+ }
1046
+
1047
+ .ap-load-more__sentinel {
1048
+ height: 1px;
1049
+ width: 100%;
1050
+ }
1051
+
1052
+ .ap-load-more__btn {
1053
+ background: var(--color-offset);
1054
+ border: var(--border-width-thin) solid var(--color-outline);
1055
+ border-radius: var(--border-radius-small);
1056
+ color: var(--color-on-background);
1057
+ cursor: pointer;
1058
+ font-size: var(--font-size-s);
1059
+ padding: var(--space-xs) var(--space-m);
1060
+ transition: background 0.15s;
1061
+ }
1062
+
1063
+ .ap-load-more__btn:hover:not(:disabled) {
1064
+ background: var(--color-offset-variant);
1065
+ }
1066
+
1067
+ .ap-load-more__btn:disabled {
1068
+ cursor: wait;
1069
+ opacity: 0.6;
1070
+ }
1071
+
1072
+ .ap-load-more__done {
1073
+ color: var(--color-on-offset);
1074
+ font-size: var(--font-size-s);
1075
+ margin: 0;
1076
+ text-align: center;
1077
+ }
1078
+ /* ==========================================================================
1079
+ Compose Form
1080
+ ========================================================================== */
1081
+
1082
+ .ap-compose__context {
1083
+ background: var(--color-offset);
1084
+ border-left: var(--border-width-thickest) solid var(--color-primary);
1085
+ border-radius: var(--border-radius-small);
1086
+ margin-bottom: var(--space-m);
1087
+ padding: var(--space-m);
1088
+ }
1089
+
1090
+ .ap-compose__context-label {
1091
+ color: var(--color-on-offset);
1092
+ font-size: var(--font-size-s);
1093
+ margin-bottom: var(--space-xs);
1094
+ }
1095
+
1096
+ .ap-compose__context-author a {
1097
+ font-weight: 600;
1098
+ text-decoration: none;
1099
+ }
1100
+
1101
+ .ap-compose__context-text {
1102
+ border: 0;
1103
+ font-size: var(--font-size-s);
1104
+ line-height: var(--line-height-loose);
1105
+ margin: var(--space-xs) 0;
1106
+ padding: 0;
1107
+ }
1108
+
1109
+ .ap-compose__context-link {
1110
+ color: var(--color-on-offset);
1111
+ font-size: var(--font-size-s);
1112
+ overflow: hidden;
1113
+ text-overflow: ellipsis;
1114
+ white-space: nowrap;
1115
+ }
1116
+
1117
+ .ap-compose__form {
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ gap: var(--space-m);
1121
+ }
1122
+
1123
+ .ap-compose__editor {
1124
+ position: relative;
1125
+ }
1126
+
1127
+ .ap-compose__textarea {
1128
+ background: var(--color-background);
1129
+ border: var(--border-width-thick) solid var(--color-outline);
1130
+ border-radius: var(--border-radius-small);
1131
+ color: var(--color-on-background);
1132
+ font-family: inherit;
1133
+ font-size: var(--font-size-m);
1134
+ line-height: var(--line-height-prose);
1135
+ padding: var(--space-s);
1136
+ resize: vertical;
1137
+ width: 100%;
1138
+ }
1139
+
1140
+ .ap-compose__textarea:focus {
1141
+ border-color: var(--color-primary);
1142
+ outline: var(--border-width-thick) solid var(--color-primary);
1143
+ outline-offset: -2px;
1144
+ }
1145
+
1146
+ .ap-compose__cw {
1147
+ display: flex;
1148
+ flex-direction: column;
1149
+ gap: var(--space-xs);
1150
+ }
1151
+
1152
+ .ap-compose__cw-toggle {
1153
+ cursor: pointer;
1154
+ display: flex;
1155
+ align-items: center;
1156
+ gap: var(--space-xs);
1157
+ font-size: var(--font-size-s);
1158
+ color: var(--color-on-offset);
1159
+ }
1160
+
1161
+ .ap-compose__cw-input {
1162
+ border: var(--border-width-thin) solid var(--color-outline);
1163
+ border-radius: var(--border-radius-small);
1164
+ background: var(--color-offset);
1165
+ color: var(--color-on-background);
1166
+ font: inherit;
1167
+ font-size: var(--font-size-s);
1168
+ padding: var(--space-s);
1169
+ width: 100%;
1170
+ }
1171
+
1172
+ .ap-compose__cw-input:focus {
1173
+ border-color: var(--color-primary);
1174
+ outline: none;
1175
+ }
1176
+
1177
+ .ap-compose__visibility {
1178
+ border: var(--border-width-thin) solid var(--color-outline);
1179
+ border-radius: var(--border-radius-small);
1180
+ display: flex;
1181
+ flex-wrap: wrap;
1182
+ gap: var(--space-s) var(--space-m);
1183
+ padding: var(--space-m);
1184
+ }
1185
+
1186
+ .ap-compose__visibility legend {
1187
+ font-weight: 600;
1188
+ }
1189
+
1190
+ .ap-compose__visibility-option {
1191
+ cursor: pointer;
1192
+ display: flex;
1193
+ align-items: center;
1194
+ gap: var(--space-xs);
1195
+ font-size: var(--font-size-s);
1196
+ }
1197
+
1198
+ .ap-compose__syndication {
1199
+ border: var(--border-width-thin) solid var(--color-outline);
1200
+ border-radius: var(--border-radius-small);
1201
+ display: flex;
1202
+ flex-direction: column;
1203
+ gap: var(--space-xs);
1204
+ padding: var(--space-m);
1205
+ }
1206
+
1207
+ .ap-compose__syndication legend {
1208
+ font-weight: 600;
1209
+ }
1210
+
1211
+ .ap-compose__syndication-target {
1212
+ cursor: pointer;
1213
+ display: flex;
1214
+ gap: var(--space-xs);
1215
+ }
1216
+
1217
+ .ap-compose__actions {
1218
+ align-items: center;
1219
+ display: flex;
1220
+ gap: var(--space-m);
1221
+ }
1222
+
1223
+ .ap-compose__submit {
1224
+ background: var(--color-primary);
1225
+ border: 0;
1226
+ border-radius: var(--border-radius-small);
1227
+ color: var(--color-on-primary, var(--color-neutral99));
1228
+ cursor: pointer;
1229
+ font-size: var(--font-size-m);
1230
+ font-weight: 600;
1231
+ padding: var(--space-s) var(--space-l);
1232
+ }
1233
+
1234
+ .ap-compose__submit:hover {
1235
+ opacity: 0.9;
1236
+ }
1237
+
1238
+ .ap-compose__cancel {
1239
+ color: var(--color-on-offset);
1240
+ text-decoration: none;
1241
+ }
1242
+
1243
+ .ap-compose__cancel:hover {
1244
+ color: var(--color-on-background);
1245
+ text-decoration: underline;
1246
+ }
1247
+ /* ==========================================================================
1248
+ Notifications
1249
+ ========================================================================== */
1250
+
1251
+ /* Notifications Toolbar */
1252
+ .ap-notifications__toolbar {
1253
+ display: flex;
1254
+ gap: var(--space-s);
1255
+ margin-bottom: var(--space-m);
1256
+ }
1257
+
1258
+ .ap-notifications__btn {
1259
+ background: var(--color-offset);
1260
+ border: var(--border-width-thin) solid var(--color-outline);
1261
+ border-radius: var(--border-radius-small);
1262
+ color: var(--color-on-background);
1263
+ cursor: pointer;
1264
+ font-size: var(--font-size-s);
1265
+ padding: var(--space-xs) var(--space-m);
1266
+ transition: all 0.2s ease;
1267
+ }
1268
+
1269
+ .ap-notifications__btn:hover {
1270
+ background: var(--color-offset-variant);
1271
+ border-color: var(--color-outline-variant);
1272
+ }
1273
+
1274
+ .ap-notifications__btn--danger {
1275
+ color: var(--color-error);
1276
+ }
1277
+
1278
+ .ap-notifications__btn--danger:hover {
1279
+ border-color: var(--color-error);
1280
+ }
1281
+
1282
+ .ap-notification {
1283
+ align-items: flex-start;
1284
+ background: var(--color-offset);
1285
+ border: var(--border-width-thin) solid var(--color-outline);
1286
+ border-radius: var(--border-radius-small);
1287
+ display: flex;
1288
+ gap: var(--space-s);
1289
+ padding: var(--space-m);
1290
+ position: relative;
1291
+ }
1292
+
1293
+ .ap-notification--unread {
1294
+ border-color: var(--color-yellow50);
1295
+ box-shadow: 0 0 8px 0 hsl(var(--tint-yellow) 50% / 0.3);
1296
+ }
1297
+
1298
+ .ap-notification__avatar-wrap {
1299
+ flex-shrink: 0;
1300
+ position: relative;
1301
+ }
1302
+
1303
+ .ap-notification__avatar-wrap {
1304
+ height: 40px;
1305
+ width: 40px;
1306
+ }
1307
+
1308
+ .ap-notification__avatar {
1309
+ border: var(--border-width-thin) solid var(--color-outline);
1310
+ border-radius: 50%;
1311
+ height: 40px;
1312
+ object-fit: cover;
1313
+ width: 40px;
1314
+ }
1315
+
1316
+ .ap-notification__avatar-wrap > img {
1317
+ position: absolute;
1318
+ inset: 0;
1319
+ z-index: 1;
1320
+ }
1321
+
1322
+ .ap-notification__avatar--default {
1323
+ align-items: center;
1324
+ background: var(--color-offset-variant);
1325
+ color: var(--color-on-offset);
1326
+ display: inline-flex;
1327
+ font-size: 1.1em;
1328
+ font-weight: 600;
1329
+ justify-content: center;
1330
+ }
1331
+
1332
+ .ap-notification__type-badge {
1333
+ bottom: -2px;
1334
+ font-size: 0.75em;
1335
+ position: absolute;
1336
+ right: -4px;
1337
+ }
1338
+
1339
+ .ap-notification__body {
1340
+ flex: 1;
1341
+ min-width: 0;
1342
+ }
1343
+
1344
+ .ap-notification__actor {
1345
+ font-weight: 600;
1346
+ }
1347
+
1348
+ .ap-notification__action {
1349
+ color: var(--color-on-offset);
1350
+ }
1351
+
1352
+ .ap-notification__target {
1353
+ color: var(--color-on-offset);
1354
+ display: block;
1355
+ font-size: var(--font-size-s);
1356
+ margin-top: var(--space-xs);
1357
+ overflow: hidden;
1358
+ text-overflow: ellipsis;
1359
+ white-space: nowrap;
1360
+ }
1361
+
1362
+ .ap-notification__excerpt {
1363
+ background: var(--color-offset-variant);
1364
+ border-radius: var(--border-radius-small);
1365
+ font-size: var(--font-size-s);
1366
+ margin-top: var(--space-xs);
1367
+ padding: var(--space-xs) var(--space-s);
1368
+ }
1369
+
1370
+ .ap-notification__time {
1371
+ color: var(--color-on-offset);
1372
+ flex-shrink: 0;
1373
+ font-size: var(--font-size-xs);
1374
+ }
1375
+
1376
+ .ap-notification__dismiss {
1377
+ position: absolute;
1378
+ right: var(--space-xs);
1379
+ top: var(--space-xs);
1380
+ }
1381
+
1382
+ .ap-notification__dismiss-btn {
1383
+ background: transparent;
1384
+ border: 0;
1385
+ border-radius: var(--border-radius-small);
1386
+ color: var(--color-on-offset);
1387
+ cursor: pointer;
1388
+ font-size: var(--font-size-m);
1389
+ line-height: 1;
1390
+ padding: 2px 6px;
1391
+ transition: all 0.2s ease;
1392
+ }
1393
+
1394
+ .ap-notification__dismiss-btn:hover {
1395
+ background: var(--color-offset-variant);
1396
+ color: var(--color-error);
1397
+ }
1398
+
1399
+ .ap-notification__actions {
1400
+ display: flex;
1401
+ gap: var(--space-s);
1402
+ margin-top: var(--space-s);
1403
+ }
1404
+
1405
+ .ap-notification__reply-btn,
1406
+ .ap-notification__thread-btn {
1407
+ border: var(--border-width-thin) solid var(--color-outline);
1408
+ border-radius: var(--border-radius-small);
1409
+ color: var(--color-on-offset);
1410
+ font-size: var(--font-size-s);
1411
+ padding: var(--space-xs) var(--space-s);
1412
+ text-decoration: none;
1413
+ transition: all 0.2s ease;
1414
+ }
1415
+
1416
+ .ap-notification__reply-btn:hover,
1417
+ .ap-notification__thread-btn:hover {
1418
+ background: var(--color-offset-variant);
1419
+ border-color: var(--color-outline-variant);
1420
+ color: var(--color-on-background);
1421
+ }
1422
+
1423
+ .ap-notification__handle {
1424
+ color: var(--color-on-offset);
1425
+ font-size: var(--font-size-s);
1426
+ margin-left: var(--space-xs);
1427
+ }
1428
+
1429
+ .ap-notifications__btn--primary {
1430
+ background: var(--color-primary);
1431
+ color: var(--color-on-primary, #fff);
1432
+ text-decoration: none;
1433
+ }
1434
+
1435
+ .ap-notifications__btn--primary:hover {
1436
+ opacity: 0.9;
1437
+ }
1438
+ /* ==========================================================================
1439
+ Messages
1440
+ ========================================================================== */
1441
+
1442
+ .ap-messages__layout {
1443
+ display: grid;
1444
+ grid-template-columns: 240px 1fr;
1445
+ gap: var(--space-m);
1446
+ min-height: 300px;
1447
+ }
1448
+
1449
+ .ap-messages__sidebar {
1450
+ border-right: var(--border-width-thin) solid var(--color-outline);
1451
+ display: flex;
1452
+ flex-direction: column;
1453
+ gap: 2px;
1454
+ padding-right: var(--space-m);
1455
+ overflow-y: auto;
1456
+ max-height: 70vh;
1457
+ }
1458
+
1459
+ .ap-messages__partner {
1460
+ align-items: center;
1461
+ border-radius: var(--border-radius-small);
1462
+ color: var(--color-on-background);
1463
+ display: flex;
1464
+ gap: var(--space-s);
1465
+ padding: var(--space-s);
1466
+ text-decoration: none;
1467
+ transition: background 0.15s ease;
1468
+ }
1469
+
1470
+ .ap-messages__partner:hover {
1471
+ background: var(--color-offset);
1472
+ }
1473
+
1474
+ .ap-messages__partner--active {
1475
+ background: var(--color-offset);
1476
+ border-left: 3px solid var(--color-primary);
1477
+ font-weight: var(--font-weight-bold);
1478
+ }
1479
+
1480
+ .ap-messages__partner-avatar {
1481
+ flex-shrink: 0;
1482
+ height: 32px;
1483
+ position: relative;
1484
+ width: 32px;
1485
+ }
1486
+
1487
+ .ap-messages__partner-avatar img {
1488
+ border-radius: 50%;
1489
+ height: 100%;
1490
+ object-fit: cover;
1491
+ position: absolute;
1492
+ inset: 0;
1493
+ width: 100%;
1494
+ z-index: 1;
1495
+ }
1496
+
1497
+ .ap-messages__partner-initial {
1498
+ align-items: center;
1499
+ background: var(--color-offset-variant);
1500
+ border-radius: 50%;
1501
+ color: var(--color-on-offset);
1502
+ display: flex;
1503
+ font-size: var(--font-size-s);
1504
+ height: 100%;
1505
+ justify-content: center;
1506
+ width: 100%;
1507
+ }
1508
+
1509
+ .ap-messages__partner-info {
1510
+ display: flex;
1511
+ flex-direction: column;
1512
+ min-width: 0;
1513
+ overflow: hidden;
1514
+ }
1515
+
1516
+ .ap-messages__partner-name {
1517
+ font-size: var(--font-size-s);
1518
+ overflow: hidden;
1519
+ text-overflow: ellipsis;
1520
+ white-space: nowrap;
1521
+ }
1522
+
1523
+ .ap-messages__partner-handle {
1524
+ color: var(--color-on-offset);
1525
+ font-size: var(--font-size-xs);
1526
+ overflow: hidden;
1527
+ text-overflow: ellipsis;
1528
+ white-space: nowrap;
1529
+ }
1530
+
1531
+ .ap-messages__content {
1532
+ min-width: 0;
1533
+ }
1534
+
1535
+ .ap-message--outbound {
1536
+ border-left: 3px solid var(--color-primary);
1537
+ }
1538
+
1539
+ .ap-message .ap-notification__time {
1540
+ padding-right: var(--space-l);
1541
+ }
1542
+
1543
+ .ap-message__direction {
1544
+ color: var(--color-on-offset);
1545
+ font-size: var(--font-size-s);
1546
+ margin-right: var(--space-xs);
1547
+ }
1548
+
1549
+ .ap-message__content {
1550
+ color: var(--color-on-background);
1551
+ font-size: var(--font-size-s);
1552
+ line-height: 1.5;
1553
+ margin-top: var(--space-xs);
1554
+ }
1555
+
1556
+ .ap-message__content p {
1557
+ margin: 0 0 var(--space-xs);
1558
+ }
1559
+
1560
+ .ap-message__content p:last-child {
1561
+ margin-bottom: 0;
1562
+ }
1563
+
1564
+ /* Inline mention links in DM content (Mastodon wraps @user in span inside a link) */
1565
+ .ap-message__content .h-card,
1566
+ .ap-message__content a.mention,
1567
+ .ap-message__content a span {
1568
+ display: inline;
1569
+ }
1570
+
1571
+ .ap-message__content a {
1572
+ overflow-wrap: break-word;
1573
+ }
1574
+
1575
+ @media (max-width: 640px) {
1576
+ .ap-messages__layout {
1577
+ grid-template-columns: 1fr;
1578
+ }
1579
+
1580
+ .ap-messages__sidebar {
1581
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
1582
+ border-right: none;
1583
+ flex-direction: row;
1584
+ max-height: none;
1585
+ overflow-x: auto;
1586
+ padding-bottom: var(--space-s);
1587
+ padding-right: 0;
1588
+ -webkit-overflow-scrolling: touch;
1589
+ }
1590
+
1591
+ .ap-messages__partner {
1592
+ flex-shrink: 0;
1593
+ white-space: nowrap;
1594
+ }
1595
+ }
1596
+ /* ==========================================================================
1597
+ Remote Profile
1598
+ ========================================================================== */
1599
+
1600
+ .ap-profile__header {
1601
+ border-radius: var(--border-radius-small);
1602
+ height: 200px;
1603
+ margin-bottom: var(--space-m);
1604
+ overflow: hidden;
1605
+ }
1606
+
1607
+ .ap-profile__header-img {
1608
+ height: 100%;
1609
+ object-fit: cover;
1610
+ width: 100%;
1611
+ }
1612
+
1613
+ .ap-profile__info {
1614
+ margin-bottom: var(--space-l);
1615
+ }
1616
+
1617
+ .ap-profile__avatar-wrap {
1618
+ height: 80px;
1619
+ margin-bottom: var(--space-s);
1620
+ position: relative;
1621
+ width: 80px;
1622
+ }
1623
+
1624
+ .ap-profile__avatar-wrap > img {
1625
+ position: absolute;
1626
+ inset: 0;
1627
+ z-index: 1;
1628
+ }
1629
+
1630
+ .ap-profile__avatar {
1631
+ border: var(--border-width-thickest) solid var(--color-background);
1632
+ border-radius: 50%;
1633
+ height: 80px;
1634
+ object-fit: cover;
1635
+ width: 80px;
1636
+ }
1637
+
1638
+ .ap-profile__avatar--placeholder {
1639
+ align-items: center;
1640
+ background: var(--color-offset-variant);
1641
+ color: var(--color-on-offset);
1642
+ display: flex;
1643
+ font-size: 2em;
1644
+ font-weight: 600;
1645
+ justify-content: center;
1646
+ }
1647
+
1648
+ .ap-profile__name {
1649
+ font-size: var(--font-size-xl);
1650
+ margin-bottom: var(--space-xs);
1651
+ }
1652
+
1653
+ .ap-profile__handle {
1654
+ color: var(--color-on-offset);
1655
+ margin-bottom: var(--space-s);
1656
+ }
1657
+
1658
+ .ap-profile__bio {
1659
+ line-height: var(--line-height-prose);
1660
+ margin-bottom: var(--space-s);
1661
+ }
1662
+
1663
+ .ap-profile__bio a {
1664
+ color: var(--color-primary-on-background);
1665
+ }
1666
+
1667
+ /* Override upstream .mention { display: grid } for bio content */
1668
+ .ap-profile__bio .h-card {
1669
+ display: inline;
1670
+ }
1671
+
1672
+ .ap-profile__bio .h-card a,
1673
+ .ap-profile__bio a.u-url.mention {
1674
+ display: inline;
1675
+ white-space: nowrap;
1676
+ }
1677
+
1678
+ .ap-profile__bio .h-card a span,
1679
+ .ap-profile__bio a.u-url.mention span {
1680
+ display: inline;
1681
+ }
1682
+
1683
+ .ap-profile__bio a.mention.hashtag {
1684
+ display: inline;
1685
+ white-space: nowrap;
1686
+ }
1687
+
1688
+ .ap-profile__bio a.mention.hashtag span {
1689
+ display: inline;
1690
+ }
1691
+
1692
+ /* Mastodon invisible/ellipsis spans for long URLs in bios */
1693
+ .ap-profile__bio .invisible {
1694
+ display: none;
1695
+ }
1696
+
1697
+ .ap-profile__bio .ellipsis::after {
1698
+ content: "…";
1699
+ }
1700
+
1701
+ .ap-profile__actions {
1702
+ display: flex;
1703
+ flex-wrap: wrap;
1704
+ gap: var(--space-s);
1705
+ margin-top: var(--space-m);
1706
+ }
1707
+
1708
+ .ap-profile__action {
1709
+ background: transparent;
1710
+ border: var(--border-width-thin) solid var(--color-outline);
1711
+ border-radius: var(--border-radius-small);
1712
+ color: var(--color-on-background);
1713
+ cursor: pointer;
1714
+ font-size: var(--font-size-s);
1715
+ padding: var(--space-xs) var(--space-m);
1716
+ text-decoration: none;
1717
+ }
1718
+
1719
+ .ap-profile__action:hover {
1720
+ background: var(--color-offset);
1721
+ }
1722
+
1723
+ .ap-profile__action--follow.ap-profile__action--active {
1724
+ background: var(--color-primary);
1725
+ border-color: var(--color-primary);
1726
+ color: var(--color-on-primary, var(--color-neutral99));
1727
+ }
1728
+
1729
+ .ap-profile__action--danger:hover {
1730
+ border-color: var(--color-error);
1731
+ color: var(--color-error);
1732
+ }
1733
+
1734
+ .ap-profile__posts {
1735
+ margin-top: var(--space-l);
1736
+ }
1737
+
1738
+ .ap-profile__posts h3 {
1739
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
1740
+ font-size: var(--font-size-l);
1741
+ margin-bottom: var(--space-m);
1742
+ padding-bottom: var(--space-s);
1743
+ }
1744
+
1745
+ /* ==========================================================================
1746
+ My Profile — Admin Profile Header
1747
+ ========================================================================== */
1748
+
1749
+ .ap-my-profile {
1750
+ border: var(--border-width-thin) solid var(--color-outline);
1751
+ border-radius: var(--border-radius-small);
1752
+ margin-bottom: var(--space-m);
1753
+ overflow: hidden;
1754
+ }
1755
+
1756
+ .ap-my-profile__header {
1757
+ height: 160px;
1758
+ overflow: hidden;
1759
+ }
1760
+
1761
+ .ap-my-profile__header-img {
1762
+ height: 100%;
1763
+ object-fit: cover;
1764
+ width: 100%;
1765
+ }
1766
+
1767
+ .ap-my-profile__info {
1768
+ padding: var(--space-m);
1769
+ }
1770
+
1771
+ .ap-my-profile__avatar-wrap {
1772
+ margin-bottom: var(--space-s);
1773
+ margin-top: -40px;
1774
+ }
1775
+
1776
+ .ap-my-profile__avatar {
1777
+ border: 3px solid var(--color-background);
1778
+ border-radius: 50%;
1779
+ height: 72px;
1780
+ object-fit: cover;
1781
+ width: 72px;
1782
+ }
1783
+
1784
+ .ap-my-profile__avatar--placeholder {
1785
+ align-items: center;
1786
+ background: var(--color-offset-variant);
1787
+ color: var(--color-on-offset);
1788
+ display: flex;
1789
+ font-size: 1.8em;
1790
+ font-weight: 600;
1791
+ justify-content: center;
1792
+ }
1793
+
1794
+ .ap-my-profile__name {
1795
+ font-size: var(--font-size-xl);
1796
+ margin-bottom: 0;
1797
+ }
1798
+
1799
+ .ap-my-profile__handle {
1800
+ color: var(--color-on-offset);
1801
+ font-size: var(--font-size-s);
1802
+ margin-bottom: var(--space-s);
1803
+ }
1804
+
1805
+ .ap-my-profile__bio {
1806
+ line-height: var(--line-height-prose);
1807
+ margin-bottom: var(--space-s);
1808
+ }
1809
+
1810
+ .ap-my-profile__bio a {
1811
+ color: var(--color-primary-on-background);
1812
+ }
1813
+
1814
+ /* Override upstream .mention { display: grid } for bio content */
1815
+ .ap-my-profile__bio .h-card { display: inline; }
1816
+ .ap-my-profile__bio .h-card a,
1817
+ .ap-my-profile__bio a.u-url.mention { display: inline; white-space: nowrap; }
1818
+ .ap-my-profile__bio .h-card a span,
1819
+ .ap-my-profile__bio a.u-url.mention span { display: inline; }
1820
+ .ap-my-profile__bio a.mention.hashtag { display: inline; white-space: nowrap; }
1821
+ .ap-my-profile__bio a.mention.hashtag span { display: inline; }
1822
+ .ap-my-profile__bio .invisible { display: none; }
1823
+ .ap-my-profile__bio .ellipsis::after { content: "…"; }
1824
+
1825
+ .ap-my-profile__fields {
1826
+ border: var(--border-width-thin) solid var(--color-outline);
1827
+ border-radius: var(--border-radius-small);
1828
+ margin: var(--space-s) 0;
1829
+ overflow: hidden;
1830
+ }
1831
+
1832
+ .ap-my-profile__field {
1833
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
1834
+ display: grid;
1835
+ grid-template-columns: 120px 1fr;
1836
+ }
1837
+
1838
+ .ap-my-profile__field:last-child {
1839
+ border-bottom: 0;
1840
+ }
1841
+
1842
+ .ap-my-profile__field-name {
1843
+ background: var(--color-offset);
1844
+ color: var(--color-on-offset);
1845
+ font-size: var(--font-size-s);
1846
+ font-weight: 600;
1847
+ padding: var(--space-xs) var(--space-s);
1848
+ text-transform: uppercase;
1849
+ letter-spacing: 0.03em;
1850
+ }
1851
+
1852
+ .ap-my-profile__field-value {
1853
+ font-size: var(--font-size-s);
1854
+ overflow: hidden;
1855
+ padding: var(--space-xs) var(--space-s);
1856
+ text-overflow: ellipsis;
1857
+ white-space: nowrap;
1858
+ }
1859
+
1860
+ .ap-my-profile__field-value a {
1861
+ color: var(--color-primary-on-background);
1862
+ }
1863
+
1864
+ .ap-my-profile__stats {
1865
+ display: flex;
1866
+ gap: var(--space-m);
1867
+ margin-bottom: var(--space-s);
1868
+ }
1869
+
1870
+ .ap-my-profile__stat {
1871
+ color: var(--color-on-offset);
1872
+ font-size: var(--font-size-s);
1873
+ text-decoration: none;
1874
+ }
1875
+
1876
+ .ap-my-profile__stat:hover {
1877
+ color: var(--color-on-background);
1878
+ }
1879
+
1880
+ .ap-my-profile__stat strong {
1881
+ color: var(--color-on-background);
1882
+ font-weight: 600;
1883
+ }
1884
+
1885
+ .ap-my-profile__edit {
1886
+ border: var(--border-width-thin) solid var(--color-outline);
1887
+ border-radius: var(--border-radius-small);
1888
+ color: var(--color-on-background);
1889
+ display: inline-block;
1890
+ font-size: var(--font-size-s);
1891
+ padding: var(--space-xs) var(--space-m);
1892
+ text-decoration: none;
1893
+ }
1894
+
1895
+ .ap-my-profile__edit:hover {
1896
+ background: var(--color-offset);
1897
+ border-color: var(--color-outline-variant);
1898
+ }
1899
+
1900
+ /* When no header image, don't offset avatar */
1901
+ .ap-my-profile__info:first-child .ap-my-profile__avatar-wrap {
1902
+ margin-top: 0;
1903
+ }
1904
+ /* ==========================================================================
1905
+ Moderation
1906
+ ========================================================================== */
1907
+
1908
+ .ap-moderation__section {
1909
+ margin-bottom: var(--space-l);
1910
+ }
1911
+
1912
+ .ap-moderation__section h2 {
1913
+ font-size: var(--font-size-l);
1914
+ margin-bottom: var(--space-s);
1915
+ }
1916
+
1917
+ .ap-moderation__list {
1918
+ list-style: none;
1919
+ margin: 0;
1920
+ padding: 0;
1921
+ }
1922
+
1923
+ .ap-moderation__entry {
1924
+ align-items: center;
1925
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
1926
+ display: flex;
1927
+ gap: var(--space-s);
1928
+ justify-content: space-between;
1929
+ padding: var(--space-s) 0;
1930
+ }
1931
+
1932
+ .ap-moderation__entry a {
1933
+ min-width: 0;
1934
+ overflow: hidden;
1935
+ text-overflow: ellipsis;
1936
+ white-space: nowrap;
1937
+ }
1938
+
1939
+ .ap-moderation__remove {
1940
+ background: transparent;
1941
+ border: var(--border-width-thin) solid var(--color-outline);
1942
+ border-radius: var(--border-radius-small);
1943
+ color: var(--color-on-offset);
1944
+ cursor: pointer;
1945
+ flex-shrink: 0;
1946
+ font-size: var(--font-size-s);
1947
+ padding: var(--space-xs) var(--space-s);
1948
+ }
1949
+
1950
+ .ap-moderation__remove:hover {
1951
+ border-color: var(--color-error);
1952
+ color: var(--color-error);
1953
+ }
1954
+
1955
+ .ap-moderation__add-form {
1956
+ display: flex;
1957
+ gap: var(--space-s);
1958
+ }
1959
+
1960
+ .ap-moderation__input {
1961
+ background: var(--color-background);
1962
+ border: var(--border-width-thick) solid var(--color-outline);
1963
+ border-radius: var(--border-radius-small);
1964
+ color: var(--color-on-background);
1965
+ flex: 1;
1966
+ font-size: var(--font-size-m);
1967
+ padding: var(--space-xs) var(--space-s);
1968
+ }
1969
+
1970
+ .ap-moderation__add-btn {
1971
+ background: var(--color-offset);
1972
+ border: var(--border-width-thin) solid var(--color-outline);
1973
+ border-radius: var(--border-radius-small);
1974
+ color: var(--color-on-background);
1975
+ cursor: pointer;
1976
+ font-size: var(--font-size-m);
1977
+ padding: var(--space-xs) var(--space-m);
1978
+ }
1979
+
1980
+ .ap-moderation__add-btn:hover {
1981
+ background: var(--color-offset-variant);
1982
+ }
1983
+
1984
+ .ap-moderation__add-btn:disabled {
1985
+ cursor: not-allowed;
1986
+ opacity: 0.5;
1987
+ }
1988
+
1989
+ .ap-moderation__error {
1990
+ color: var(--color-error);
1991
+ font-size: var(--font-size-s);
1992
+ margin-top: var(--space-xs);
1993
+ }
1994
+
1995
+ .ap-moderation__empty {
1996
+ color: var(--color-on-offset);
1997
+ font-size: var(--font-size-s);
1998
+ font-style: italic;
1999
+ }
2000
+
2001
+ .ap-moderation__hint {
2002
+ color: var(--color-on-offset);
2003
+ font-size: var(--font-size-s);
2004
+ margin-bottom: var(--space-s);
2005
+ }
2006
+
2007
+ .ap-moderation__filter-toggle {
2008
+ display: flex;
2009
+ gap: var(--space-m);
2010
+ }
2011
+
2012
+ .ap-moderation__radio {
2013
+ align-items: center;
2014
+ cursor: pointer;
2015
+ display: flex;
2016
+ gap: var(--space-xs);
2017
+ }
2018
+
2019
+ .ap-moderation__radio input {
2020
+ accent-color: var(--color-primary);
2021
+ cursor: pointer;
2022
+ }
2023
+ /* ==========================================================================
2024
+ Skeleton Loaders
2025
+ ========================================================================== */
2026
+
2027
+ @keyframes ap-skeleton-shimmer {
2028
+ 0% { background-position: 200% 0; }
2029
+ 100% { background-position: -200% 0; }
2030
+ }
2031
+
2032
+ .ap-skeleton {
2033
+ background: linear-gradient(90deg,
2034
+ var(--color-offset) 25%,
2035
+ var(--color-background) 50%,
2036
+ var(--color-offset) 75%);
2037
+ background-size: 200% 100%;
2038
+ animation: ap-skeleton-shimmer 1.5s ease-in-out infinite;
2039
+ border-radius: var(--border-radius-small);
2040
+ }
2041
+
2042
+ .ap-card--skeleton {
2043
+ pointer-events: none;
2044
+ }
2045
+
2046
+ .ap-card--skeleton .ap-card__author {
2047
+ display: flex;
2048
+ align-items: center;
2049
+ gap: var(--space-s);
2050
+ }
2051
+
2052
+ .ap-skeleton--avatar {
2053
+ width: 2.5rem;
2054
+ height: 2.5rem;
2055
+ border-radius: 50%;
2056
+ flex-shrink: 0;
2057
+ }
2058
+
2059
+ .ap-skeleton-lines {
2060
+ flex: 1;
2061
+ display: flex;
2062
+ flex-direction: column;
2063
+ gap: 0.4rem;
2064
+ }
2065
+
2066
+ .ap-skeleton--name {
2067
+ height: 0.85rem;
2068
+ width: 40%;
2069
+ }
2070
+
2071
+ .ap-skeleton--handle {
2072
+ height: 0.7rem;
2073
+ width: 25%;
2074
+ }
2075
+
2076
+ .ap-skeleton-body {
2077
+ display: flex;
2078
+ flex-direction: column;
2079
+ gap: 0.5rem;
2080
+ margin-top: var(--space-s);
2081
+ }
2082
+
2083
+ .ap-skeleton--line {
2084
+ height: 0.75rem;
2085
+ width: 100%;
2086
+ }
2087
+
2088
+ .ap-skeleton--short {
2089
+ width: 60%;
2090
+ }
2091
+
2092
+ .ap-skeleton-group {
2093
+ display: flex;
2094
+ flex-direction: column;
2095
+ gap: var(--space-m);
2096
+ }
2097
+ /* ==========================================================================
2098
+ Responsive
2099
+ ========================================================================== */
2100
+
2101
+ @media (max-width: 640px) {
2102
+ .ap-tabs {
2103
+ gap: 0;
2104
+ }
2105
+
2106
+ .ap-tab {
2107
+ padding: var(--space-xs) var(--space-s);
2108
+ }
2109
+
2110
+ .ap-card__gallery--3 {
2111
+ grid-template-columns: 1fr 1fr;
2112
+ grid-template-rows: auto auto;
2113
+ }
2114
+
2115
+ .ap-card__gallery--3 img:first-child {
2116
+ grid-column: 1 / 3;
2117
+ grid-row: 1;
2118
+ height: 200px;
2119
+ }
2120
+
2121
+ .ap-card__actions {
2122
+ gap: var(--space-xs);
2123
+ }
2124
+
2125
+ .ap-card__action {
2126
+ font-size: 0.75rem;
2127
+ padding: var(--space-xs);
2128
+ }
2129
+ }
2130
+ /* ==========================================================================
2131
+ Post Detail View — Thread Layout
2132
+ ========================================================================== */
2133
+
2134
+ .ap-post-detail__back {
2135
+ margin-bottom: var(--space-m);
2136
+ }
2137
+
2138
+ .ap-post-detail__back-link {
2139
+ color: var(--color-primary-on-background);
2140
+ font-size: var(--font-size-s);
2141
+ text-decoration: none;
2142
+ }
2143
+
2144
+ .ap-post-detail__back-link:hover {
2145
+ text-decoration: underline;
2146
+ }
2147
+
2148
+ .ap-post-detail__not-found {
2149
+ background: var(--color-offset);
2150
+ border-radius: var(--border-radius-small);
2151
+ color: var(--color-on-offset);
2152
+ padding: var(--space-l);
2153
+ text-align: center;
2154
+ }
2155
+
2156
+ .ap-post-detail__section-title {
2157
+ color: var(--color-on-offset);
2158
+ font-size: var(--font-size-s);
2159
+ font-weight: 600;
2160
+ margin: var(--space-m) 0 var(--space-s);
2161
+ padding-bottom: var(--space-xs);
2162
+ text-transform: uppercase;
2163
+ letter-spacing: 0.05em;
2164
+ }
2165
+
2166
+ /* Parent posts — indented with left border to show thread chain */
2167
+ .ap-post-detail__parents {
2168
+ border-left: 3px solid var(--color-outline);
2169
+ margin-bottom: var(--space-s);
2170
+ padding-left: var(--space-m);
2171
+ }
2172
+
2173
+ .ap-post-detail__parent-item .ap-card {
2174
+ opacity: 0.85;
2175
+ }
2176
+
2177
+ /* Main post — highlighted */
2178
+ .ap-post-detail__main {
2179
+ margin-bottom: var(--space-m);
2180
+ }
2181
+
2182
+ .ap-post-detail__main .ap-card {
2183
+ border-color: var(--color-primary);
2184
+ box-shadow: 0 0 0 1px var(--color-primary);
2185
+ }
2186
+
2187
+ /* Replies — indented from the other side */
2188
+ .ap-post-detail__replies {
2189
+ margin-left: var(--space-l);
2190
+ }
2191
+
2192
+ .ap-post-detail__reply-item {
2193
+ border-left: 2px solid var(--color-outline);
2194
+ padding-left: var(--space-m);
2195
+ margin-bottom: var(--space-xs);
2196
+ }
2197
+
2198
+ /* ==========================================================================
2199
+ Tag Timeline Header
2200
+ ========================================================================== */
2201
+
2202
+ .ap-tag-header {
2203
+ align-items: flex-start;
2204
+ background: var(--color-offset);
2205
+ border-bottom: var(--border-width-thin) solid var(--color-outline);
2206
+ border-radius: var(--border-radius-small);
2207
+ display: flex;
2208
+ gap: var(--space-m);
2209
+ justify-content: space-between;
2210
+ margin-bottom: var(--space-m);
2211
+ padding: var(--space-m);
2212
+ }
2213
+
2214
+ .ap-tag-header__title {
2215
+ font-size: var(--font-size-xl);
2216
+ font-weight: 600;
2217
+ margin: 0 0 var(--space-xs);
2218
+ }
2219
+
2220
+ .ap-tag-header__count {
2221
+ color: var(--color-on-offset);
2222
+ font-size: var(--font-size-s);
2223
+ margin: 0;
2224
+ }
2225
+
2226
+ .ap-tag-header__actions {
2227
+ align-items: center;
2228
+ display: flex;
2229
+ flex-shrink: 0;
2230
+ gap: var(--space-s);
2231
+ }
2232
+
2233
+ .ap-tag-header__follow-btn {
2234
+ background: var(--color-primary);
2235
+ border: none;
2236
+ border-radius: var(--border-radius-small);
2237
+ color: var(--color-on-primary, var(--color-neutral99));
2238
+ cursor: pointer;
2239
+ font-size: var(--font-size-s);
2240
+ padding: var(--space-xs) var(--space-s);
2241
+ }
2242
+
2243
+ .ap-tag-header__follow-btn:hover {
2244
+ opacity: 0.85;
2245
+ }
2246
+
2247
+ .ap-tag-header__unfollow-btn {
2248
+ background: transparent;
2249
+ border: var(--border-width-thin) solid var(--color-outline);
2250
+ border-radius: var(--border-radius-small);
2251
+ color: var(--color-on-background);
2252
+ cursor: pointer;
2253
+ font-size: var(--font-size-s);
2254
+ padding: var(--space-xs) var(--space-s);
2255
+ }
2256
+
2257
+ .ap-tag-header__unfollow-btn:hover {
2258
+ border-color: var(--color-on-background);
2259
+ }
2260
+
2261
+ .ap-tag-header__back {
2262
+ color: var(--color-on-offset);
2263
+ font-size: var(--font-size-s);
2264
+ text-decoration: none;
2265
+ }
2266
+
2267
+ .ap-tag-header__back:hover {
2268
+ color: var(--color-on-background);
2269
+ text-decoration: underline;
2270
+ }
2271
+
2272
+ @media (max-width: 640px) {
2273
+ .ap-tag-header {
2274
+ flex-direction: column;
2275
+ gap: var(--space-s);
2276
+ }
2277
+
2278
+ .ap-tag-header__actions {
2279
+ flex-wrap: wrap;
2280
+ }
2281
+ }
2282
+
2283
+ /* ==========================================================================
2284
+ Reader Tools Bar (Explore link, etc.)
2285
+ ========================================================================== */
2286
+
2287
+ .ap-reader-tools {
2288
+ display: flex;
2289
+ gap: var(--space-s);
2290
+ justify-content: flex-end;
2291
+ margin-bottom: var(--space-s);
2292
+ }
2293
+
2294
+ .ap-reader-tools__explore {
2295
+ color: var(--color-on-offset);
2296
+ font-size: var(--font-size-s);
2297
+ text-decoration: none;
2298
+ }
2299
+
2300
+ .ap-reader-tools__explore:hover {
2301
+ color: var(--color-on-background);
2302
+ text-decoration: underline;
2303
+ }
2304
+
2305
+ /* Followed tags bar */
2306
+ .ap-followed-tags {
2307
+ display: flex;
2308
+ flex-wrap: wrap;
2309
+ align-items: center;
2310
+ gap: var(--space-xs);
2311
+ padding: var(--space-xs) 0;
2312
+ margin-bottom: var(--space-s);
2313
+ font-size: var(--font-size-s);
2314
+ }
2315
+
2316
+ .ap-followed-tags__label {
2317
+ color: var(--color-on-offset);
2318
+ font-weight: 600;
2319
+ }
2320
+
2321
+ /* ==========================================================================
2322
+ New Posts Banner
2323
+ ========================================================================== */
2324
+
2325
+ .ap-new-posts-banner {
2326
+ left: 0;
2327
+ position: sticky;
2328
+ right: 0;
2329
+ top: 0;
2330
+ z-index: 10;
2331
+ }
2332
+
2333
+ .ap-new-posts-banner__btn {
2334
+ background: var(--color-primary);
2335
+ border: none;
2336
+ border-radius: var(--border-radius-small);
2337
+ color: var(--color-on-primary);
2338
+ cursor: pointer;
2339
+ display: block;
2340
+ font-family: inherit;
2341
+ font-size: var(--font-size-s);
2342
+ margin: 0 auto var(--space-s);
2343
+ padding: var(--space-xs) var(--space-m);
2344
+ text-align: center;
2345
+ width: auto;
2346
+ }
2347
+
2348
+ .ap-new-posts-banner__btn:hover {
2349
+ opacity: 0.9;
2350
+ }
2351
+
2352
+ /* ==========================================================================
2353
+ Read State
2354
+ ========================================================================== */
2355
+
2356
+ .ap-card--read {
2357
+ opacity: 0.7;
2358
+ transition: opacity 0.3s ease;
2359
+ }
2360
+
2361
+ .ap-card--read:hover {
2362
+ opacity: 1;
2363
+ }
2364
+
2365
+ /* ==========================================================================
2366
+ Unread Toggle
2367
+ ========================================================================== */
2368
+
2369
+ .ap-unread-toggle {
2370
+ margin-left: auto;
2371
+ }
2372
+
2373
+ .ap-unread-toggle--active {
2374
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
2375
+ font-weight: 600;
2376
+ }
2377
+
2378
+ /* ==========================================================================
2379
+ Quote Embeds
2380
+ ========================================================================== */
2381
+
2382
+ .ap-quote-embed {
2383
+ border: var(--border-width-thin) solid var(--color-outline);
2384
+ border-radius: var(--border-radius-small);
2385
+ margin-top: var(--space-s);
2386
+ overflow: hidden;
2387
+ transition: border-color 0.15s ease;
2388
+ }
2389
+
2390
+ .ap-quote-embed:hover {
2391
+ border-color: var(--color-outline-variant);
2392
+ }
2393
+
2394
+ .ap-quote-embed--pending {
2395
+ border-style: dashed;
2396
+ }
2397
+
2398
+ .ap-quote-embed__link {
2399
+ color: inherit;
2400
+ display: block;
2401
+ padding: var(--space-s) var(--space-m);
2402
+ text-decoration: none;
2403
+ }
2404
+
2405
+ .ap-quote-embed__link:hover {
2406
+ background: color-mix(in srgb, var(--color-offset) 50%, transparent);
2407
+ }
2408
+
2409
+ .ap-quote-embed__author {
2410
+ align-items: center;
2411
+ display: flex;
2412
+ gap: var(--space-xs);
2413
+ margin-bottom: var(--space-xs);
2414
+ }
2415
+
2416
+ .ap-quote-embed__avatar {
2417
+ border-radius: 50%;
2418
+ flex-shrink: 0;
2419
+ height: 24px;
2420
+ object-fit: cover;
2421
+ width: 24px;
2422
+ }
2423
+
2424
+ .ap-quote-embed__avatar--default {
2425
+ align-items: center;
2426
+ background: var(--color-offset);
2427
+ color: var(--color-on-offset);
2428
+ display: inline-flex;
2429
+ font-size: var(--font-size-xs);
2430
+ font-weight: 600;
2431
+ justify-content: center;
2432
+ }
2433
+
2434
+ .ap-quote-embed__author-info {
2435
+ flex: 1;
2436
+ min-width: 0;
2437
+ }
2438
+
2439
+ .ap-quote-embed__name {
2440
+ font-size: var(--font-size-s);
2441
+ font-weight: 600;
2442
+ overflow: hidden;
2443
+ text-overflow: ellipsis;
2444
+ white-space: nowrap;
2445
+ }
2446
+
2447
+ .ap-quote-embed__handle {
2448
+ color: var(--color-on-offset);
2449
+ font-size: var(--font-size-xs);
2450
+ overflow: hidden;
2451
+ text-overflow: ellipsis;
2452
+ white-space: nowrap;
2453
+ }
2454
+
2455
+ .ap-quote-embed__time {
2456
+ color: var(--color-on-offset);
2457
+ flex-shrink: 0;
2458
+ font-size: var(--font-size-xs);
2459
+ white-space: nowrap;
2460
+ }
2461
+
2462
+ .ap-quote-embed__title {
2463
+ font-size: var(--font-size-s);
2464
+ font-weight: 600;
2465
+ margin: 0 0 var(--space-xs);
2466
+ }
2467
+
2468
+ .ap-quote-embed__content {
2469
+ color: var(--color-on-background);
2470
+ font-size: var(--font-size-s);
2471
+ line-height: calc(4 / 3 * 1em);
2472
+ max-height: calc(1.333em * 6);
2473
+ overflow: hidden;
2474
+ }
2475
+
2476
+ .ap-quote-embed__content a {
2477
+ display: inline;
2478
+ }
2479
+
2480
+ .ap-quote-embed__content a span {
2481
+ display: inline;
2482
+ }
2483
+
2484
+ .ap-quote-embed__content p {
2485
+ margin: 0 0 var(--space-xs);
2486
+ }
2487
+
2488
+ .ap-quote-embed__content p:last-child {
2489
+ margin-bottom: 0;
2490
+ }
2491
+
2492
+ .ap-quote-embed__media {
2493
+ margin-top: var(--space-xs);
2494
+ }
2495
+
2496
+ .ap-quote-embed__photo {
2497
+ border-radius: var(--border-radius-small);
2498
+ max-height: 160px;
2499
+ max-width: 100%;
2500
+ object-fit: cover;
2501
+ }
2502
+
2503
+ /* ==========================================================================
2504
+ Poll / Question
2505
+ ========================================================================== */
2506
+
2507
+ .ap-poll {
2508
+ margin-top: var(--space-s);
2509
+ }
2510
+
2511
+ .ap-poll__option {
2512
+ position: relative;
2513
+ padding: var(--space-xs) var(--space-s);
2514
+ margin-bottom: var(--space-xs);
2515
+ border-radius: var(--border-radius-small);
2516
+ background: var(--color-offset);
2517
+ overflow: hidden;
2518
+ }
2519
+
2520
+ .ap-poll__bar {
2521
+ position: absolute;
2522
+ top: 0;
2523
+ left: 0;
2524
+ bottom: 0;
2525
+ background: var(--color-primary);
2526
+ opacity: 0.15;
2527
+ border-radius: var(--border-radius-small);
2528
+ }
2529
+
2530
+ .ap-poll__label {
2531
+ position: relative;
2532
+ font-size: var(--font-size-s);
2533
+ color: var(--color-on-background);
2534
+ }
2535
+
2536
+ .ap-poll__votes {
2537
+ position: relative;
2538
+ float: right;
2539
+ font-size: var(--font-size-s);
2540
+ font-weight: 600;
2541
+ color: var(--color-on-offset);
2542
+ }
2543
+
2544
+ .ap-poll__footer {
2545
+ font-size: var(--font-size-xs);
2546
+ color: var(--color-on-offset);
2547
+ margin-top: var(--space-xs);
2548
+ }
2549
+
2550
+ /* Hashtag tab sources info line */
2551
+ .ap-hashtag-sources {
2552
+ color: var(--color-on-offset);
2553
+ font-size: var(--font-size-s);
2554
+ margin: 0;
2555
+ padding: var(--space-s) 0 var(--space-xs);
2556
+ }
2557
+
2558
+ /* Custom emoji */
2559
+ .ap-custom-emoji {
2560
+ height: 1.2em;
2561
+ width: auto;
2562
+ vertical-align: middle;
2563
+ display: inline;
2564
+ margin: 0 0.05em;
2565
+ }
2566
+ /* ==========================================================================
2567
+ Explore Page
2568
+ ========================================================================== */
2569
+
2570
+ .ap-explore-header {
2571
+ margin-bottom: var(--space-m);
2572
+ }
2573
+
2574
+ .ap-explore-header__title {
2575
+ font-size: var(--font-size-xl);
2576
+ margin: 0 0 var(--space-xs);
2577
+ }
2578
+
2579
+ .ap-explore-header__desc {
2580
+ color: var(--color-on-offset);
2581
+ font-size: var(--font-size-s);
2582
+ margin: 0;
2583
+ }
2584
+
2585
+ .ap-explore-form {
2586
+ background: var(--color-offset);
2587
+ border: var(--border-width-thin) solid var(--color-outline);
2588
+ border-radius: var(--border-radius-small);
2589
+ margin-bottom: var(--space-m);
2590
+ padding: var(--space-m);
2591
+ }
2592
+
2593
+ .ap-explore-form__row {
2594
+ align-items: center;
2595
+ display: flex;
2596
+ gap: var(--space-s);
2597
+ flex-wrap: wrap;
2598
+ }
2599
+
2600
+ .ap-explore-form__input {
2601
+ border: var(--border-width-thin) solid var(--color-outline);
2602
+ border-radius: var(--border-radius-small);
2603
+ box-sizing: border-box;
2604
+ font-size: var(--font-size-m);
2605
+ min-width: 0;
2606
+ padding: var(--space-xs) var(--space-s);
2607
+ width: 100%;
2608
+ }
2609
+
2610
+ .ap-explore-form__scope {
2611
+ display: flex;
2612
+ gap: var(--space-s);
2613
+ }
2614
+
2615
+ .ap-explore-form__scope-label {
2616
+ align-items: center;
2617
+ cursor: pointer;
2618
+ display: flex;
2619
+ font-size: var(--font-size-s);
2620
+ gap: var(--space-xs);
2621
+ }
2622
+
2623
+ .ap-explore-form__btn {
2624
+ background: var(--color-primary);
2625
+ border: none;
2626
+ border-radius: var(--border-radius-small);
2627
+ color: var(--color-on-primary);
2628
+ cursor: pointer;
2629
+ font-size: var(--font-size-s);
2630
+ padding: var(--space-xs) var(--space-m);
2631
+ white-space: nowrap;
2632
+ }
2633
+
2634
+ .ap-explore-form__btn:hover {
2635
+ opacity: 0.85;
2636
+ }
2637
+
2638
+ .ap-explore-error {
2639
+ background: color-mix(in srgb, var(--color-error) 10%, transparent);
2640
+ border: var(--border-width-thin) solid var(--color-error);
2641
+ border-radius: var(--border-radius-small);
2642
+ color: var(--color-error);
2643
+ margin-bottom: var(--space-m);
2644
+ padding: var(--space-s) var(--space-m);
2645
+ }
2646
+
2647
+ @media (max-width: 640px) {
2648
+ .ap-explore-form__row {
2649
+ flex-direction: column;
2650
+ align-items: stretch;
2651
+ }
2652
+
2653
+ .ap-explore-form__btn {
2654
+ width: 100%;
2655
+ }
2656
+ }
2657
+
2658
+ /* ---------- Autocomplete dropdown ---------- */
2659
+
2660
+ .ap-explore-autocomplete {
2661
+ flex: 1;
2662
+ min-width: 0;
2663
+ position: relative;
2664
+ }
2665
+
2666
+ .ap-explore-autocomplete__dropdown {
2667
+ background: var(--color-background);
2668
+ border: var(--border-width-thin) solid var(--color-outline);
2669
+ border-radius: var(--border-radius-small);
2670
+ box-shadow: 0 4px 12px hsl(var(--tint-neutral) 10% / 0.15);
2671
+ left: 0;
2672
+ max-height: 320px;
2673
+ overflow-y: auto;
2674
+ position: absolute;
2675
+ right: 0;
2676
+ top: 100%;
2677
+ z-index: 100;
2678
+ }
2679
+
2680
+ .ap-explore-autocomplete__item {
2681
+ align-items: center;
2682
+ background: none;
2683
+ border: none;
2684
+ color: var(--color-on-background);
2685
+ cursor: pointer;
2686
+ display: flex;
2687
+ font-family: inherit;
2688
+ font-size: var(--font-size-s);
2689
+ gap: var(--space-s);
2690
+ padding: var(--space-s) var(--space-m);
2691
+ text-align: left;
2692
+ width: 100%;
2693
+ }
2694
+
2695
+ .ap-explore-autocomplete__item:hover,
2696
+ .ap-explore-autocomplete__item--highlighted {
2697
+ background: var(--color-offset);
2698
+ }
2699
+
2700
+ .ap-explore-autocomplete__domain {
2701
+ flex-shrink: 0;
2702
+ font-weight: 600;
2703
+ }
2704
+
2705
+ .ap-explore-autocomplete__meta {
2706
+ color: var(--color-on-offset);
2707
+ display: flex;
2708
+ flex: 1;
2709
+ gap: var(--space-xs);
2710
+ min-width: 0;
2711
+ }
2712
+
2713
+ .ap-explore-autocomplete__software {
2714
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
2715
+ border-radius: var(--border-radius-small);
2716
+ font-size: var(--font-size-xs);
2717
+ padding: 1px 6px;
2718
+ white-space: nowrap;
2719
+ }
2720
+
2721
+ .ap-explore-autocomplete__mau {
2722
+ font-size: var(--font-size-xs);
2723
+ white-space: nowrap;
2724
+ }
2725
+
2726
+ .ap-explore-autocomplete__status {
2727
+ flex-shrink: 0;
2728
+ font-size: var(--font-size-s);
2729
+ }
2730
+
2731
+ .ap-explore-autocomplete__checking {
2732
+ opacity: 0.5;
2733
+ }
2734
+
2735
+ /* ---------- Popular accounts autocomplete ---------- */
2736
+
2737
+ .ap-lookup-autocomplete {
2738
+ flex: 1;
2739
+ min-width: 0;
2740
+ position: relative;
2741
+ }
2742
+
2743
+ .ap-lookup-autocomplete__dropdown {
2744
+ background: var(--color-background);
2745
+ border: var(--border-width-thin) solid var(--color-outline);
2746
+ border-radius: var(--border-radius-small);
2747
+ box-shadow: 0 4px 12px hsl(var(--tint-neutral) 10% / 0.15);
2748
+ left: 0;
2749
+ max-height: 320px;
2750
+ overflow-y: auto;
2751
+ position: absolute;
2752
+ right: 0;
2753
+ top: 100%;
2754
+ z-index: 100;
2755
+ }
2756
+
2757
+ .ap-lookup-autocomplete__item {
2758
+ align-items: center;
2759
+ background: none;
2760
+ border: none;
2761
+ color: var(--color-on-background);
2762
+ cursor: pointer;
2763
+ display: flex;
2764
+ font-family: inherit;
2765
+ font-size: var(--font-size-s);
2766
+ gap: var(--space-s);
2767
+ padding: var(--space-s) var(--space-m);
2768
+ text-align: left;
2769
+ width: 100%;
2770
+ }
2771
+
2772
+ .ap-lookup-autocomplete__item:hover,
2773
+ .ap-lookup-autocomplete__item--highlighted {
2774
+ background: var(--color-offset);
2775
+ }
2776
+
2777
+ .ap-lookup-autocomplete__avatar {
2778
+ border-radius: 50%;
2779
+ flex-shrink: 0;
2780
+ height: 28px;
2781
+ object-fit: cover;
2782
+ width: 28px;
2783
+ }
2784
+
2785
+ .ap-lookup-autocomplete__info {
2786
+ display: flex;
2787
+ flex: 1;
2788
+ flex-direction: column;
2789
+ min-width: 0;
2790
+ }
2791
+
2792
+ .ap-lookup-autocomplete__name {
2793
+ font-weight: 600;
2794
+ overflow: hidden;
2795
+ text-overflow: ellipsis;
2796
+ white-space: nowrap;
2797
+ }
2798
+
2799
+ .ap-lookup-autocomplete__handle {
2800
+ color: var(--color-on-offset);
2801
+ font-size: var(--font-size-xs);
2802
+ overflow: hidden;
2803
+ text-overflow: ellipsis;
2804
+ white-space: nowrap;
2805
+ }
2806
+
2807
+ .ap-lookup-autocomplete__followers {
2808
+ color: var(--color-on-offset);
2809
+ flex-shrink: 0;
2810
+ font-size: var(--font-size-xs);
2811
+ white-space: nowrap;
2812
+ }
2813
+
2814
+ /* ==========================================================================
2815
+ Explore: Tabbed Design
2816
+ ========================================================================== */
2817
+
2818
+ /* Tab bar wrapper: enables position:relative for fade gradient overlay */
2819
+ .ap-explore-tabs-container {
2820
+ position: relative;
2821
+ }
2822
+
2823
+ /* Tab bar with right-edge fade to indicate horizontal overflow */
2824
+ .ap-explore-tabs-nav {
2825
+ padding-right: var(--space-l);
2826
+ position: relative;
2827
+ }
2828
+
2829
+ .ap-explore-tabs-nav::after {
2830
+ background: linear-gradient(to right, transparent, var(--color-background) 80%);
2831
+ content: "";
2832
+ height: 100%;
2833
+ pointer-events: none;
2834
+ position: absolute;
2835
+ right: 0;
2836
+ top: 0;
2837
+ width: 40px;
2838
+ }
2839
+
2840
+ /* Tab wrapper: holds tab button + reorder/close controls together */
2841
+ .ap-tab-wrapper {
2842
+ align-items: stretch;
2843
+ display: inline-flex;
2844
+ position: relative;
2845
+ }
2846
+
2847
+ /* Show controls on hover or when the tab is active */
2848
+ .ap-tab-controls {
2849
+ align-items: center;
2850
+ display: none;
2851
+ gap: 1px;
2852
+ }
2853
+
2854
+ .ap-tab-wrapper:hover .ap-tab-controls,
2855
+ .ap-tab-wrapper:focus-within .ap-tab-controls {
2856
+ display: flex;
2857
+ }
2858
+
2859
+ /* Individual control buttons (↑ ↓ ×) */
2860
+ .ap-tab-control {
2861
+ background: none;
2862
+ border: none;
2863
+ color: var(--color-on-offset);
2864
+ cursor: pointer;
2865
+ font-size: var(--font-size-xs);
2866
+ line-height: 1;
2867
+ padding: 2px 4px;
2868
+ }
2869
+
2870
+ .ap-tab-control:hover {
2871
+ color: var(--color-on-background);
2872
+ }
2873
+
2874
+ .ap-tab-control:disabled {
2875
+ cursor: default;
2876
+ opacity: 0.3;
2877
+ }
2878
+
2879
+ .ap-tab-control--remove {
2880
+ color: var(--color-on-offset);
2881
+ font-size: var(--font-size-s);
2882
+ }
2883
+
2884
+ .ap-tab-control--remove:hover {
2885
+ color: var(--color-error);
2886
+ }
2887
+
2888
+ /* Truncate long domain names in tab labels */
2889
+ .ap-tab__label {
2890
+ display: inline-block;
2891
+ max-width: 150px;
2892
+ overflow: hidden;
2893
+ text-overflow: ellipsis;
2894
+ white-space: nowrap;
2895
+ }
2896
+
2897
+ /* Scope badges on instance tabs */
2898
+ .ap-tab__badge {
2899
+ border-radius: var(--border-radius-small);
2900
+ font-size: 0.65em;
2901
+ font-weight: 700;
2902
+ letter-spacing: 0.02em;
2903
+ margin-left: var(--space-xs);
2904
+ padding: 1px 4px;
2905
+ text-transform: uppercase;
2906
+ vertical-align: middle;
2907
+ }
2908
+
2909
+ .ap-tab__badge--local {
2910
+ background: color-mix(in srgb, var(--color-primary) 15%, transparent);
2911
+ color: var(--color-primary-on-background);
2912
+ }
2913
+
2914
+ .ap-tab__badge--federated {
2915
+ background: color-mix(in srgb, var(--color-purple45) 15%, transparent);
2916
+ color: var(--color-purple45);
2917
+ }
2918
+
2919
+ /* +# button for adding hashtag tabs */
2920
+ .ap-tab--add {
2921
+ font-family: monospace;
2922
+ font-weight: 700;
2923
+ letter-spacing: -0.05em;
2924
+ }
2925
+
2926
+ /* Inline hashtag form that appears when +# is clicked */
2927
+ .ap-tab-add-hashtag {
2928
+ align-items: center;
2929
+ display: inline-flex;
2930
+ gap: var(--space-xs);
2931
+ }
2932
+
2933
+ .ap-tab-hashtag-form {
2934
+ align-items: center;
2935
+ display: flex;
2936
+ gap: var(--space-xs);
2937
+ }
2938
+
2939
+ .ap-tab-hashtag-form__prefix {
2940
+ color: var(--color-on-offset);
2941
+ font-weight: 600;
2942
+ }
2943
+
2944
+ .ap-tab-hashtag-form__input {
2945
+ border: var(--border-width-thin) solid var(--color-outline);
2946
+ border-radius: var(--border-radius-small);
2947
+ font-family: inherit;
2948
+ font-size: var(--font-size-s);
2949
+ padding: 2px var(--space-s);
2950
+ width: 8em;
2951
+ }
2952
+
2953
+ .ap-tab-hashtag-form__input:focus {
2954
+ border-color: var(--color-primary);
2955
+ outline: 2px solid var(--color-primary);
2956
+ outline-offset: -1px;
2957
+ }
2958
+
2959
+ .ap-tab-hashtag-form__btn {
2960
+ background: var(--color-primary);
2961
+ border: none;
2962
+ border-radius: var(--border-radius-small);
2963
+ color: var(--color-on-primary);
2964
+ cursor: pointer;
2965
+ font-family: inherit;
2966
+ font-size: var(--font-size-s);
2967
+ padding: 2px var(--space-s);
2968
+ white-space: nowrap;
2969
+ }
2970
+
2971
+ .ap-tab-hashtag-form__btn:hover {
2972
+ opacity: 0.85;
2973
+ }
2974
+
2975
+ /* "Pin as tab" button in search results area */
2976
+ .ap-explore-pin-bar {
2977
+ margin-bottom: var(--space-s);
2978
+ }
2979
+
2980
+ .ap-explore-pin-btn {
2981
+ background: none;
2982
+ border: var(--border-width-thin) solid var(--color-primary-on-background);
2983
+ border-radius: var(--border-radius-small);
2984
+ color: var(--color-primary-on-background);
2985
+ cursor: pointer;
2986
+ font-family: inherit;
2987
+ font-size: var(--font-size-s);
2988
+ padding: var(--space-xs) var(--space-m);
2989
+ }
2990
+
2991
+ .ap-explore-pin-btn:hover {
2992
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
2993
+ }
2994
+
2995
+ .ap-explore-pin-btn:disabled {
2996
+ cursor: default;
2997
+ opacity: 0.6;
2998
+ }
2999
+
3000
+ /* Hashtag form row inside the search form */
3001
+ .ap-explore-form__hashtag-row {
3002
+ align-items: center;
3003
+ display: flex;
3004
+ flex-wrap: wrap;
3005
+ gap: var(--space-xs);
3006
+ margin-top: var(--space-s);
3007
+ }
3008
+
3009
+ .ap-explore-form__hashtag-label {
3010
+ color: var(--color-on-offset);
3011
+ font-size: var(--font-size-s);
3012
+ white-space: nowrap;
3013
+ }
3014
+
3015
+ .ap-explore-form__hashtag-prefix {
3016
+ color: var(--color-on-offset);
3017
+ font-weight: 600;
3018
+ }
3019
+
3020
+ .ap-explore-form__hashtag-hint {
3021
+ color: var(--color-on-offset);
3022
+ font-size: var(--font-size-xs);
3023
+ flex-basis: 100%;
3024
+ }
3025
+
3026
+ .ap-explore-form__input--hashtag {
3027
+ max-width: 200px;
3028
+ width: auto;
3029
+ }
3030
+
3031
+ /* Tab panel containers */
3032
+ .ap-explore-instance-panel,
3033
+ .ap-explore-hashtag-panel {
3034
+ min-height: 120px;
3035
+ }
3036
+
3037
+ /* Loading state */
3038
+ .ap-explore-tab-loading {
3039
+ align-items: center;
3040
+ color: var(--color-on-offset);
3041
+ display: flex;
3042
+ justify-content: center;
3043
+ padding: var(--space-xl);
3044
+ }
3045
+
3046
+ .ap-explore-tab-loading--more {
3047
+ padding-block: var(--space-m);
3048
+ }
3049
+
3050
+ .ap-explore-tab-loading__text {
3051
+ font-size: var(--font-size-s);
3052
+ }
3053
+
3054
+ /* Error state */
3055
+ .ap-explore-tab-error {
3056
+ align-items: center;
3057
+ display: flex;
3058
+ flex-direction: column;
3059
+ gap: var(--space-s);
3060
+ padding: var(--space-xl);
3061
+ }
3062
+
3063
+ .ap-explore-tab-error__message {
3064
+ color: var(--color-error);
3065
+ font-size: var(--font-size-s);
3066
+ margin: 0;
3067
+ }
3068
+
3069
+ .ap-explore-tab-error__retry {
3070
+ background: none;
3071
+ border: var(--border-width-thin) solid var(--color-primary-on-background);
3072
+ border-radius: var(--border-radius-small);
3073
+ color: var(--color-primary-on-background);
3074
+ cursor: pointer;
3075
+ font-size: var(--font-size-s);
3076
+ padding: var(--space-xs) var(--space-s);
3077
+ }
3078
+
3079
+ .ap-explore-tab-error__retry:hover {
3080
+ background: color-mix(in srgb, var(--color-primary) 10%, transparent);
3081
+ }
3082
+
3083
+ /* Empty state */
3084
+ .ap-explore-tab-empty {
3085
+ color: var(--color-on-offset);
3086
+ font-size: var(--font-size-s);
3087
+ padding: var(--space-xl);
3088
+ text-align: center;
3089
+ }
3090
+
3091
+ /* Infinite scroll sentinel — zero height, invisible */
3092
+ .ap-tab-sentinel {
3093
+ height: 1px;
3094
+ visibility: hidden;
3095
+ }
3096
+ /* ==========================================================================
3097
+ Dark Mode Overrides
3098
+ Softens saturated colors that are uncomfortable on dark backgrounds.
3099
+ Uses Indiekit's existing light-variant tokens (red80, green90, yellow90)
3100
+ which are designed for dark surfaces.
3101
+ ========================================================================== */
3102
+
3103
+ @media (prefers-color-scheme: dark) {
3104
+
3105
+ /* --- Action button hover states: softer colors, more visible tinted backgrounds --- */
3106
+ .ap-card__action--reply:hover {
3107
+ background: color-mix(in srgb, var(--color-primary) 18%, transparent);
3108
+ color: var(--color-primary-on-background);
3109
+ }
3110
+
3111
+ .ap-card__action--boost:hover {
3112
+ background: color-mix(in srgb, var(--color-green50) 18%, transparent);
3113
+ color: var(--color-green90);
3114
+ }
3115
+
3116
+ .ap-card__action--like:hover {
3117
+ background: color-mix(in srgb, var(--color-red45) 18%, transparent);
3118
+ color: var(--color-red80);
3119
+ }
3120
+
3121
+ .ap-card__action--save:hover {
3122
+ background: color-mix(in srgb, var(--color-primary) 18%, transparent);
3123
+ color: var(--color-primary-on-background);
3124
+ }
3125
+
3126
+ /* --- Active interaction states --- */
3127
+ .ap-card__action--like.ap-card__action--active {
3128
+ background: color-mix(in srgb, var(--color-red45) 18%, transparent);
3129
+ color: var(--color-red80);
3130
+ }
3131
+
3132
+ .ap-card__action--boost.ap-card__action--active {
3133
+ background: color-mix(in srgb, var(--color-green50) 18%, transparent);
3134
+ color: var(--color-green90);
3135
+ }
3136
+
3137
+ .ap-card__action--save.ap-card__action--active {
3138
+ background: color-mix(in srgb, var(--color-primary) 18%, transparent);
3139
+ color: var(--color-primary-on-background);
3140
+ }
3141
+
3142
+ /* --- Post-type left border accents: desaturated for dark surfaces --- */
3143
+ .ap-card--note,
3144
+ .ap-card--note:hover {
3145
+ border-left-color: var(--color-purple90);
3146
+ }
3147
+
3148
+ .ap-card--article,
3149
+ .ap-card--article:hover {
3150
+ border-left-color: var(--color-green90);
3151
+ }
3152
+
3153
+ .ap-card--boost,
3154
+ .ap-card--boost:hover {
3155
+ border-left-color: var(--color-yellow90);
3156
+ }
3157
+
3158
+ .ap-card--reply,
3159
+ .ap-card--reply:hover {
3160
+ border-left-color: var(--color-primary-on-background);
3161
+ }
3162
+
3163
+ /* --- Notification unread glow: toned down --- */
3164
+ .ap-notification--unread {
3165
+ border-color: var(--color-yellow90);
3166
+ box-shadow: 0 0 6px 0 color-mix(in srgb, var(--color-yellow50) 15%, transparent);
3167
+ }
3168
+
3169
+ /* --- Post detail highlight ring: softened --- */
3170
+ .ap-post-detail__main .ap-card {
3171
+ border-color: color-mix(in srgb, var(--color-primary) 50%, transparent);
3172
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--color-primary) 50%, transparent);
3173
+ }
3174
+
3175
+ /* --- Card shadows: use light tint instead of black --- */
3176
+ .ap-card {
3177
+ box-shadow: 0 1px 2px hsl(var(--tint-neutral) 90% / 0.04);
3178
+ }
3179
+
3180
+ .ap-card:hover {
3181
+ box-shadow: 0 2px 8px hsl(var(--tint-neutral) 90% / 0.06);
3182
+ }
3183
+
3184
+ /* --- Tab badge federated: soften purple --- */
3185
+ .ap-tab__badge--federated {
3186
+ color: var(--color-purple90);
3187
+ background: color-mix(in srgb, var(--color-purple45) 18%, transparent);
3188
+ }
3189
+ }
3190
+ /* ==========================================================================
3191
+ Federation Management
3192
+ ========================================================================== */
3193
+
3194
+ .ap-federation__section {
3195
+ margin-block-end: var(--space-l);
3196
+ }
3197
+
3198
+ .ap-federation__section h2 {
3199
+ margin-block-end: var(--space-s);
3200
+ }
3201
+
3202
+ .ap-federation__stats-grid {
3203
+ display: grid;
3204
+ grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
3205
+ gap: var(--space-s);
3206
+ }
3207
+
3208
+ .ap-federation__stat-card {
3209
+ display: flex;
3210
+ flex-direction: column;
3211
+ align-items: center;
3212
+ gap: var(--space-xs);
3213
+ padding: var(--space-s);
3214
+ background: var(--color-offset);
3215
+ border-radius: var(--border-radius-small);
3216
+ text-align: center;
3217
+ }
3218
+
3219
+ .ap-federation__stat-count {
3220
+ font-size: var(--font-size-xl);
3221
+ font-weight: 600;
3222
+ color: var(--color-on-background);
3223
+ }
3224
+
3225
+ .ap-federation__stat-label {
3226
+ font-size: var(--font-size-s);
3227
+ color: var(--color-on-offset);
3228
+ word-break: break-word;
3229
+ }
3230
+
3231
+ .ap-federation__actions-row {
3232
+ display: flex;
3233
+ flex-wrap: wrap;
3234
+ gap: var(--space-s);
3235
+ align-items: center;
3236
+ }
3237
+
3238
+ .ap-federation__result {
3239
+ margin-block-start: var(--space-xs);
3240
+ color: var(--color-green50);
3241
+ font-size: var(--font-size-s);
3242
+ }
3243
+
3244
+ .ap-federation__error {
3245
+ margin-block-start: var(--space-xs);
3246
+ color: var(--color-red45);
3247
+ font-size: var(--font-size-s);
3248
+ }
3249
+
3250
+ .ap-federation__lookup-form {
3251
+ display: flex;
3252
+ gap: var(--space-s);
3253
+ }
3254
+
3255
+ .ap-federation__lookup-input {
3256
+ flex: 1;
3257
+ min-width: 0;
3258
+ padding: 0.5rem 0.75rem;
3259
+ border: var(--border-width-thin) solid var(--color-outline);
3260
+ border-radius: var(--border-radius-small);
3261
+ font: inherit;
3262
+ color: var(--color-on-background);
3263
+ background: var(--color-background);
3264
+ }
3265
+
3266
+ .ap-federation__json-view {
3267
+ margin-block-start: var(--space-s);
3268
+ padding: var(--space-m);
3269
+ background: var(--color-offset);
3270
+ border-radius: var(--border-radius-small);
3271
+ font-family: monospace;
3272
+ font-size: var(--font-size-s);
3273
+ color: var(--color-on-background);
3274
+ max-height: 24rem;
3275
+ overflow: auto;
3276
+ white-space: pre-wrap;
3277
+ word-break: break-word;
3278
+ }
3279
+
3280
+ .ap-federation__posts-list {
3281
+ display: flex;
3282
+ flex-direction: column;
3283
+ gap: var(--space-xs);
3284
+ }
3285
+
3286
+ .ap-federation__post-row {
3287
+ display: flex;
3288
+ justify-content: space-between;
3289
+ align-items: center;
3290
+ gap: var(--space-m);
3291
+ padding: var(--space-s);
3292
+ background: var(--color-offset);
3293
+ border-radius: var(--border-radius-small);
3294
+ }
3295
+
3296
+ .ap-federation__post-info {
3297
+ display: flex;
3298
+ flex-direction: column;
3299
+ gap: var(--space-xs);
3300
+ min-width: 0;
3301
+ }
3302
+
3303
+ .ap-federation__post-title {
3304
+ font-weight: 500;
3305
+ white-space: nowrap;
3306
+ overflow: hidden;
3307
+ text-overflow: ellipsis;
3308
+ }
3309
+
3310
+ .ap-federation__post-meta {
3311
+ display: flex;
3312
+ align-items: center;
3313
+ gap: var(--space-xs);
3314
+ font-size: var(--font-size-s);
3315
+ color: var(--color-on-offset);
3316
+ }
3317
+
3318
+ .ap-federation__post-actions {
3319
+ display: flex;
3320
+ gap: var(--space-xs);
3321
+ flex-shrink: 0;
3322
+ }
3323
+
3324
+ .ap-federation__post-btn {
3325
+ padding: var(--space-xs) var(--space-s);
3326
+ font-size: var(--font-size-s);
3327
+ border: var(--border-width-thin) solid var(--color-outline);
3328
+ border-radius: var(--border-radius-small);
3329
+ background: var(--color-background);
3330
+ color: var(--color-on-background);
3331
+ cursor: pointer;
3332
+ }
3333
+
3334
+ .ap-federation__post-btn:hover {
3335
+ background: var(--color-offset);
3336
+ }
3337
+
3338
+ .ap-federation__post-btn--danger {
3339
+ color: var(--color-red45);
3340
+ border-color: var(--color-red45);
3341
+ }
3342
+
3343
+ .ap-federation__post-btn--danger:hover {
3344
+ background: color-mix(in srgb, var(--color-red45) 10%, transparent);
3345
+ }
3346
+
3347
+ .ap-federation__modal-overlay {
3348
+ position: fixed;
3349
+ inset: 0;
3350
+ z-index: 1000;
3351
+ display: flex;
3352
+ align-items: center;
3353
+ justify-content: center;
3354
+ background: hsl(var(--tint-neutral) 10% / 0.5);
3355
+ }
3356
+
3357
+ .ap-federation__modal {
3358
+ width: min(90vw, 48rem);
3359
+ max-height: 80vh;
3360
+ display: flex;
3361
+ flex-direction: column;
3362
+ background: var(--color-background);
3363
+ border-radius: var(--border-radius-small);
3364
+ box-shadow: 0 4px 24px hsl(var(--tint-neutral) 10% / 0.2);
3365
+ }
3366
+
3367
+ .ap-federation__modal-header {
3368
+ display: flex;
3369
+ justify-content: space-between;
3370
+ align-items: center;
3371
+ padding: var(--space-s) var(--space-m);
3372
+ border-block-end: var(--border-width-thin) solid var(--color-outline);
3373
+ }
3374
+
3375
+ .ap-federation__modal-header h3 {
3376
+ margin: 0;
3377
+ font-size: var(--font-size-m);
3378
+ }
3379
+
3380
+ .ap-federation__modal-close {
3381
+ font-size: var(--font-size-xl);
3382
+ line-height: 1;
3383
+ padding: 0 var(--space-xs);
3384
+ border: none;
3385
+ background: none;
3386
+ color: var(--color-on-offset);
3387
+ cursor: pointer;
3388
+ }
3389
+
3390
+ .ap-federation__modal .ap-federation__json-view {
3391
+ margin: 0;
3392
+ border-radius: 0 0 var(--border-radius-small) var(--border-radius-small);
3393
+ flex: 1;
3394
+ overflow: auto;
3395
+ }
3396
+
3397
+ @media (max-width: 40rem) {
3398
+ .ap-federation__post-row {
3399
+ flex-direction: column;
3400
+ align-items: flex-start;
3401
+ }
3402
+
3403
+ .ap-federation__lookup-form {
3404
+ flex-direction: column;
3405
+ }
3406
+ }
3407
+
3408
+ /* Follow request approve/reject actions */
3409
+ .ap-follow-request {
3410
+ margin-block-end: var(--space-m);
3411
+ }
3412
+
3413
+ .ap-follow-request__actions {
3414
+ display: flex;
3415
+ gap: var(--space-s);
3416
+ margin-block-start: var(--space-xs);
3417
+ padding-inline-start: var(--space-l);
3418
+ }
3419
+
3420
+ .ap-follow-request__form {
3421
+ display: inline;
3422
+ }
3423
+
3424
+ .button--danger {
3425
+ background-color: var(--color-red45);
3426
+ color: white;
3427
+ }
3428
+
3429
+ .button--danger:hover {
3430
+ background-color: var(--color-red35, #c0392b);
3431
+ }