@okjavis/nodebb-theme-javis 2.0.0 → 2.2.0

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.
package/scss/_topic.scss CHANGED
@@ -4,64 +4,59 @@
4
4
  // ===========================================================
5
5
 
6
6
  // ===========================================================
7
- // BREADCRUMB – Softer, More Subtle
7
+ // HIDDEN ELEMENTS
8
8
  // ===========================================================
9
9
  body.template-topic {
10
- .breadcrumb {
11
- background: transparent;
12
- padding: $jv-space-2 0;
13
- margin-bottom: $jv-space-4;
14
- font-size: $jv-font-size-sm;
15
-
16
- .breadcrumb-item {
17
- color: $jv-text-soft;
18
-
19
- a {
20
- color: $jv-text-muted;
21
- text-decoration: none;
22
- transition: color $jv-transition-fast;
23
-
24
- &:hover {
25
- color: $jv-primary;
26
- }
27
- }
10
+ .breadcrumb,
11
+ [component="topic/thumb/list"] {
12
+ display: none !important;
13
+ }
28
14
 
29
- // Separator styling
30
- + .breadcrumb-item::before {
31
- color: $jv-text-soft;
32
- content: "/";
33
- padding: 0 $jv-space-2;
34
- }
15
+ // ===========================================================
16
+ // LAYOUT & CONTAINER
17
+ // ===========================================================
18
+ #content {
19
+ padding-left: 48px !important;
20
+ padding-right: 48px !important;
21
+ }
35
22
 
36
- // Active/current item
37
- &.active {
38
- color: $jv-text-muted;
39
- font-weight: 500;
40
- }
41
- }
23
+ [itemscope][itemtype="https://schema.org/DiscussionForumPosting"] > .d-flex.flex-column.gap-3 {
24
+ margin-top: 24px !important;
42
25
  }
43
26
 
44
27
  // ===========================================================
45
- // TOPIC HEADER – Title and Meta
28
+ // TOPIC HEADER – Title Typography
46
29
  // ===========================================================
47
30
  .topic-header,
48
- [component="topic/header"] {
49
- margin-bottom: $jv-space-6;
31
+ [component="topic/header"],
32
+ [component="post/header"].fs-3 {
33
+ margin-bottom: 0;
34
+ display: flex;
35
+ align-items: flex-start;
36
+ gap: $jv-space-3;
50
37
 
51
- // Topic title
52
38
  h1,
53
- [component="topic/title"] {
54
- font-size: 28px;
39
+ [component="topic/title"],
40
+ .topic-title {
41
+ font-size: $jv-font-size-xl;
55
42
  font-weight: 700;
56
43
  line-height: $jv-line-height-tight;
57
44
  letter-spacing: -0.02em;
58
45
  color: $jv-text-main;
59
- margin-bottom: $jv-space-3;
46
+ margin-bottom: 0;
47
+ flex: 1;
60
48
  }
61
49
  }
62
50
 
51
+ h1.fs-3 {
52
+ font-size: $jv-font-size-xl !important;
53
+ font-weight: 700 !important;
54
+ line-height: $jv-line-height-tight !important;
55
+ letter-spacing: -0.02em !important;
56
+ }
57
+
63
58
  // ===========================================================
64
- // META PILLS – Category, Tags, Stats
59
+ // META PILLS – Tags & Stats
65
60
  // ===========================================================
66
61
  .topic-tags,
67
62
  [component="topic/tags"] {
@@ -88,7 +83,6 @@ body.template-topic {
88
83
  }
89
84
  }
90
85
 
91
- // Category badge in topic
92
86
  .category-badge,
93
87
  [component="category/link"] .badge {
94
88
  background: rgba(0, 0, 0, 0.06);
@@ -96,8 +90,20 @@ body.template-topic {
96
90
  font-weight: 500;
97
91
  }
98
92
 
93
+ .topic-info .stats,
94
+ .badge.stats,
95
+ .topic-stats .badge {
96
+ background: rgba(0, 0, 0, 0.04) !important;
97
+ border: 1px solid $jv-border-subtle !important;
98
+ color: $jv-text-muted !important;
99
+ font-size: $jv-font-size-xs;
100
+ font-weight: 500;
101
+ padding: $jv-space-1 $jv-space-3;
102
+ border-radius: $jv-radius-pill;
103
+ }
104
+
99
105
  // ===========================================================
100
- // POST CONTAINER – Clean, Borderless Design
106
+ // POSTS CONTAINER
101
107
  // ===========================================================
102
108
  .topic {
103
109
  .posts-container {
@@ -105,25 +111,77 @@ body.template-topic {
105
111
  width: 100%;
106
112
  }
107
113
 
108
- // Individual post
114
+ // Remove timeline start/end dots from posts list
115
+ .posts.timeline::before,
116
+ .posts.timeline::after {
117
+ display: none !important;
118
+ }
119
+
109
120
  [component="post"] {
110
- background: $jv-surface;
111
- border-radius: $jv-radius-md;
112
- margin-bottom: $jv-space-4;
113
- border: none; // Borderless as per theme
114
- box-shadow: none; // No shadow for cleaner look
121
+ background: transparent;
122
+ margin-bottom: $jv-space-3;
123
+ border: none;
124
+ box-shadow: none;
125
+
126
+ // Remove timeline vertical line from Harmony theme
127
+ border-left: none !important;
128
+
129
+ // Remove timeline end dot
130
+ &:last-child::after {
131
+ display: none !important;
132
+ }
133
+
134
+ // Remove all timeline pseudo-elements (dots at start/end)
135
+ &::before,
136
+ &::after {
137
+ display: none !important;
138
+ }
139
+
140
+ // Hide user status indicator (green/grey dot below avatar)
141
+ [component="user/status"] {
142
+ display: none !important;
143
+ }
144
+
145
+ // Card styling on the parent container that includes avatar
146
+ .post-container-parent {
147
+ background: $jv-surface;
148
+ border-radius: $jv-radius-md;
149
+ border: 1px solid $jv-border-subtle;
150
+ padding: $jv-space-3;
151
+ gap: $jv-space-2 !important; // Tighter gap
152
+
153
+ // Reduce avatar size from 48px to 36px
154
+ > .bg-body {
155
+ // Align avatar container with the post header (username/timestamp line)
156
+ align-self: flex-start;
157
+ margin-top: 2px; // Fine-tune to vertically center with text
158
+
159
+ [component="user/picture"],
160
+ .avatar {
161
+ width: 36px !important;
162
+ height: 36px !important;
163
+ font-size: $jv-font-size-sm !important;
164
+ line-height: 36px !important;
165
+ }
166
+ }
167
+ }
168
+
169
+ // Align the post header row with avatar
170
+ .post-header {
171
+ min-height: 36px; // Match avatar height
172
+ align-items: center !important;
173
+ margin-bottom: 0 !important;
174
+ }
115
175
 
116
- // Post container inner
117
176
  .post-container {
118
- padding: $jv-space-6;
177
+ padding: 0;
178
+ padding-top: 0 !important;
119
179
  border: none;
120
180
  background: transparent;
121
181
  }
122
182
 
123
- // Selected state (when linked directly)
124
- &.selected .post-container {
183
+ &.selected .post-container-parent {
125
184
  background: $jv-selected-bg;
126
- border-radius: $jv-radius-md;
127
185
  }
128
186
  }
129
187
  }
@@ -134,30 +192,28 @@ body.template-topic {
134
192
  .post-header {
135
193
  display: flex;
136
194
  align-items: center;
137
- gap: $jv-space-3;
138
- margin-bottom: $jv-space-4;
139
- font-size: $jv-font-size-sm;
195
+ gap: $jv-space-2;
196
+ margin-bottom: $jv-space-3;
197
+ font-size: $jv-font-size-xs;
140
198
 
141
- // Avatar
142
199
  .avatar {
143
- width: 40px;
144
- height: 40px;
200
+ width: 32px;
201
+ height: 32px;
145
202
  border-radius: 50%;
146
203
  object-fit: cover;
147
204
  flex-shrink: 0;
148
205
  }
149
206
 
150
- // User info container
151
207
  .user-info {
152
208
  display: flex;
153
209
  flex-direction: column;
154
- gap: 2px;
210
+ gap: $jv-space-1;
155
211
  }
156
212
 
157
- // Username
158
213
  .username,
159
214
  [component="post/header/username"] {
160
215
  font-weight: 600;
216
+ font-size: $jv-font-size-sm;
161
217
  color: $jv-text-main;
162
218
  text-decoration: none;
163
219
 
@@ -166,27 +222,20 @@ body.template-topic {
166
222
  }
167
223
  }
168
224
 
169
- // Timestamp
170
225
  .timeago,
171
226
  [component="post/timestamp"] {
172
227
  color: $jv-text-soft;
173
228
  font-size: $jv-font-size-xs;
174
229
  }
175
230
 
176
- // Post index/number - Subtle
177
231
  .post-index,
178
232
  [component="post/header/index"] {
179
233
  color: $jv-text-soft;
180
234
  font-size: $jv-font-size-xs;
181
235
  font-weight: 400;
182
- opacity: 0.6;
183
-
184
- &::before {
185
- content: "#";
186
- }
236
+ opacity: 0.5;
187
237
  }
188
238
 
189
- // Bookmarked indicator
190
239
  .bookmarked {
191
240
  color: $jv-warning;
192
241
  }
@@ -201,35 +250,27 @@ body.template-topic {
201
250
  color: $jv-text-main;
202
251
 
203
252
  p {
204
- margin-bottom: $jv-space-4;
205
-
206
- &:last-child {
207
- margin-bottom: 0;
208
- }
253
+ margin-bottom: $jv-space-3;
254
+ &:last-child { margin-bottom: 0; }
209
255
  }
210
256
 
211
- // Code blocks
212
257
  pre, code {
213
258
  background: rgba(0, 0, 0, 0.04);
214
259
  border-radius: $jv-radius-sm;
215
- font-size: $jv-font-size-sm;
260
+ font-size: $jv-font-size-xs;
216
261
  }
217
262
 
218
- code {
219
- padding: 2px 6px;
220
- }
263
+ code { padding: 2px 5px; }
221
264
 
222
265
  pre {
223
- padding: $jv-space-4;
266
+ padding: $jv-space-3;
224
267
  overflow-x: auto;
225
-
226
268
  code {
227
269
  padding: 0;
228
270
  background: transparent;
229
271
  }
230
272
  }
231
273
 
232
- // Blockquotes
233
274
  blockquote {
234
275
  border-left: 3px solid $jv-border-strong;
235
276
  padding-left: $jv-space-4;
@@ -238,42 +279,123 @@ body.template-topic {
238
279
  font-style: italic;
239
280
  }
240
281
 
241
- // Images
242
282
  img {
243
283
  max-width: 100%;
244
284
  border-radius: $jv-radius-sm;
245
285
  }
246
286
 
247
- // Links
248
- a {
249
- color: $jv-primary;
287
+ // ===========================================================
288
+ // POST IMAGE CAROUSEL
289
+ // ===========================================================
290
+ .post-image-carousel {
291
+ border-radius: $jv-radius-md;
292
+ overflow: hidden;
293
+ margin: $jv-space-4 0;
294
+ background: rgba(0, 0, 0, 0.03);
295
+
296
+ .carousel-inner {
297
+ border-radius: $jv-radius-md;
298
+ }
299
+
300
+ .carousel-item {
301
+ // Fixed height container to prevent jumping
302
+ height: 400px;
303
+
304
+ img {
305
+ width: 100%;
306
+ height: 100%;
307
+ object-fit: contain;
308
+ background: rgba(0, 0, 0, 0.02);
309
+ }
310
+ }
311
+
312
+ // Navigation arrows
313
+ .carousel-control-prev,
314
+ .carousel-control-next {
315
+ width: 48px;
316
+ height: 48px;
317
+ top: 50%;
318
+ transform: translateY(-50%);
319
+ background: rgba(0, 0, 0, 0.5);
320
+ border-radius: 50%;
321
+ opacity: 0;
322
+ transition: opacity $jv-transition-fast;
323
+
324
+ &:hover {
325
+ background: rgba(0, 0, 0, 0.7);
326
+ }
327
+
328
+ .carousel-control-prev-icon,
329
+ .carousel-control-next-icon {
330
+ width: 20px;
331
+ height: 20px;
332
+ }
333
+ }
334
+
335
+ .carousel-control-prev {
336
+ left: $jv-space-3;
337
+ }
338
+
339
+ .carousel-control-next {
340
+ right: $jv-space-3;
341
+ }
250
342
 
251
343
  &:hover {
252
- text-decoration: underline;
344
+ .carousel-control-prev,
345
+ .carousel-control-next {
346
+ opacity: 1;
347
+ }
253
348
  }
349
+
350
+ // Indicator dots
351
+ .carousel-indicators {
352
+ margin-bottom: $jv-space-3;
353
+ gap: $jv-space-2;
354
+
355
+ button {
356
+ width: 8px;
357
+ height: 8px;
358
+ border-radius: 50%;
359
+ background: rgba(255, 255, 255, 0.5);
360
+ border: none;
361
+ opacity: 1;
362
+ transition: background-color $jv-transition-fast, transform $jv-transition-fast;
363
+
364
+ &.active {
365
+ background: #fff;
366
+ transform: scale(1.2);
367
+ }
368
+
369
+ &:hover {
370
+ background: rgba(255, 255, 255, 0.8);
371
+ }
372
+ }
373
+ }
374
+ }
375
+
376
+ a {
377
+ color: $jv-primary;
378
+ &:hover { text-decoration: underline; }
254
379
  }
255
380
  }
256
381
 
257
382
  // ===========================================================
258
- // POST FOOTER Action Bar
383
+ // POST FOOTER & ACTIONS
259
384
  // ===========================================================
260
385
  [component="post/footer"],
261
386
  .post-footer {
262
- padding-top: $jv-space-4;
387
+ padding-top: 0 !important;
388
+ padding-bottom: 0 !important;
263
389
  margin-top: $jv-space-4;
264
390
  border-top: 1px solid $jv-border-subtle;
265
391
  }
266
392
 
267
- // ===========================================================
268
- // ACTION ICONS – Ghost Button Style
269
- // ===========================================================
270
393
  [component="post/actions"] {
271
394
  display: flex;
272
395
  align-items: center;
273
396
  gap: $jv-space-2;
274
397
  flex-wrap: wrap;
275
398
 
276
- // All action buttons - Ghost style
277
399
  .btn,
278
400
  [component="post/reply"],
279
401
  [component="post/quote"],
@@ -293,9 +415,7 @@ body.template-topic {
293
415
  align-items: center;
294
416
  gap: $jv-space-2;
295
417
 
296
- i {
297
- font-size: 16px;
298
- }
418
+ i { font-size: 16px; }
299
419
 
300
420
  &:hover {
301
421
  background: $jv-hover-bg !important;
@@ -307,7 +427,6 @@ body.template-topic {
307
427
  box-shadow: $jv-focus-ring;
308
428
  }
309
429
 
310
- // Active states (voted, bookmarked)
311
430
  &.active,
312
431
  &.upvoted,
313
432
  &.downvoted,
@@ -317,7 +436,6 @@ body.template-topic {
317
436
  }
318
437
  }
319
438
 
320
- // Vote counts
321
439
  [component="post/vote-count"] {
322
440
  font-weight: 600;
323
441
  color: $jv-text-muted;
@@ -326,71 +444,244 @@ body.template-topic {
326
444
  }
327
445
  }
328
446
 
447
+ // Always visible post actions (override Harmony's hover behavior)
448
+ .topic .posts [component="post"] [component="post/actions"] {
449
+ opacity: 1 !important;
450
+ visibility: visible !important;
451
+ }
452
+
329
453
  // ===========================================================
330
- // RIGHT SIDEBAR ACTIONS Ghost Buttons
454
+ // GHOST BUTTONShared Style
331
455
  // ===========================================================
332
- .topic-main-buttons,
333
- [component="topic/actions"],
334
- .sidebar [data-widget-area] {
335
- .btn {
336
- background: transparent !important;
337
- border: 1px solid transparent !important;
456
+ .btn-ghost {
457
+ background: transparent !important;
458
+ border: 1px solid transparent !important;
459
+ color: $jv-text-muted;
460
+ padding: $jv-space-2 $jv-space-3;
461
+ border-radius: $jv-radius-sm;
462
+ font-size: $jv-font-size-sm;
463
+ font-weight: 500;
464
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
465
+ display: inline-flex;
466
+ align-items: center;
467
+ gap: $jv-space-2;
468
+
469
+ i {
470
+ font-size: 16px;
471
+ color: $jv-primary;
472
+ }
473
+
474
+ &:hover {
475
+ background: $jv-hover-bg !important;
476
+ color: $jv-text-main;
477
+ }
478
+
479
+ &:focus-visible {
480
+ outline: none;
481
+ box-shadow: $jv-focus-ring;
482
+ }
483
+ }
484
+
485
+ // ===========================================================
486
+ // PRIMARY BUTTON – Reply
487
+ // ===========================================================
488
+ .btn-primary {
489
+ background: $jv-primary !important;
490
+ border-color: $jv-primary !important;
491
+ color: #fff !important;
492
+
493
+ &:hover {
494
+ background: $jv-primary-hover !important;
495
+ border-color: $jv-primary-hover !important;
496
+ }
497
+ }
498
+
499
+ // ===========================================================
500
+ // PAGINATION / TIMELINE NAVIGATOR – Shared
501
+ // ===========================================================
502
+ .pagination-block {
503
+ .scroller-content {
504
+ min-width: 180px;
505
+ }
506
+
507
+ .scroller-thumb-icon {
508
+ background: $jv-primary !important;
509
+ border-radius: $jv-radius-xs;
510
+ transition: transform $jv-transition-fast;
511
+ }
512
+
513
+ .pagetop,
514
+ .pagebottom {
515
+ background: transparent;
516
+ border: none;
338
517
  color: $jv-text-muted;
339
- padding: $jv-space-2 $jv-space-4;
518
+ padding: $jv-space-2 $jv-space-3;
340
519
  border-radius: $jv-radius-sm;
341
520
  font-size: $jv-font-size-sm;
342
- font-weight: 500;
343
- transition: background-color $jv-transition-fast, color $jv-transition-fast;
344
- display: inline-flex;
345
- align-items: center;
346
- gap: $jv-space-2;
347
- width: 100%;
348
- justify-content: flex-start;
349
- text-align: left;
350
-
351
- i {
352
- font-size: 16px;
353
- width: 20px;
354
- text-align: center;
355
- }
356
521
 
357
522
  &:hover {
358
- background: $jv-hover-bg !important;
523
+ background: $jv-hover-bg;
359
524
  color: $jv-text-main;
360
525
  }
361
526
 
362
- &:focus-visible {
363
- outline: none;
364
- box-shadow: $jv-focus-ring;
527
+ i { color: $jv-primary; }
528
+ }
529
+
530
+ .thumb-text {
531
+ color: $jv-text-main;
532
+ font-weight: 600;
533
+ font-size: $jv-font-size-sm;
534
+ }
535
+
536
+ .thumb-timestamp {
537
+ color: $jv-text-soft;
538
+ font-size: $jv-font-size-xs;
539
+ }
540
+ }
541
+
542
+ // ===========================================================
543
+ // TOPIC SIDEBAR – Right Column
544
+ // ===========================================================
545
+ .topic-sidebar-container {
546
+ position: sticky;
547
+ top: 80px;
548
+ height: fit-content;
549
+ align-self: flex-start;
550
+ z-index: 100;
551
+ pointer-events: auto;
552
+ }
553
+
554
+ .topic-sidebar {
555
+ background: $jv-surface;
556
+ border: 1px solid $jv-border-subtle;
557
+ border-radius: $jv-radius-md;
558
+ padding: $jv-space-4;
559
+ position: relative;
560
+ pointer-events: auto;
561
+
562
+ button, a, .btn, .dropdown-toggle, [role="button"] {
563
+ pointer-events: auto;
564
+ cursor: pointer;
565
+ }
566
+
567
+ .topic-sidebar-actions {
568
+ position: relative;
569
+ z-index: 10;
570
+
571
+ .btn,
572
+ [component="topic/reply/container"],
573
+ .btn-group,
574
+ .thread-tools {
575
+ width: 100%;
576
+ position: relative;
577
+ z-index: 10;
365
578
  }
366
579
 
367
- // Primary action (Reply)
368
- &.btn-primary {
369
- background: $jv-primary !important;
370
- color: #fff;
580
+ [component="topic/reply/container"] {
581
+ display: flex;
582
+ flex-direction: column;
583
+ gap: $jv-space-2;
584
+
585
+ .btn-primary {
586
+ flex: 1;
587
+ border-radius: $jv-radius-sm;
588
+ font-weight: 600;
589
+ padding: $jv-space-3 $jv-space-4;
590
+ }
591
+
592
+ .dropdown-toggle { display: none; }
593
+ }
594
+
595
+ // Consistent ghost button styling for all sidebar action buttons
596
+ .btn-ghost,
597
+ .bottom-sheet > .btn,
598
+ .thread-tools > .dropdown-toggle {
599
+ background: transparent !important;
600
+ border: 1px solid transparent !important;
601
+ color: $jv-text-muted;
602
+ padding: $jv-space-2 $jv-space-3;
603
+ border-radius: $jv-radius-sm;
604
+ font-size: $jv-font-size-sm;
605
+ font-weight: 500;
606
+ text-align: left;
607
+ width: 100%;
608
+ justify-content: flex-start;
609
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
610
+
611
+ i {
612
+ width: 16px;
613
+ color: $jv-primary;
614
+ }
371
615
 
372
616
  &:hover {
373
- background: $jv-primary-hover !important;
374
- color: #fff;
617
+ background: $jv-hover-bg !important;
618
+ color: $jv-text-main;
375
619
  }
376
620
  }
621
+
622
+ .bottom-sheet {
623
+ width: 100%;
624
+ .dropdown-menu { width: 100%; }
625
+ }
626
+
627
+ .thread-tools {
628
+ .dropdown-menu { min-width: 100%; }
629
+ }
630
+ }
631
+
632
+ .pagination-block {
633
+ margin-top: $jv-space-4;
634
+ padding-top: $jv-space-4;
635
+ border-top: 1px solid $jv-border-subtle;
636
+
637
+ .scroller-content { gap: $jv-space-2; }
638
+
639
+ .scroller-container {
640
+ padding: $jv-space-2 $jv-space-3;
641
+ position: relative !important;
642
+ left: auto !important;
643
+ height: auto !important;
644
+ border-left: none !important;
645
+ }
377
646
  }
378
647
  }
379
648
 
380
- // Sidebar action list
381
- .topic-actions-list,
382
- .topic-tools {
383
- display: flex;
384
- flex-direction: column;
385
- gap: $jv-space-1;
649
+ // ===========================================================
650
+ // WIDGET AREA
651
+ // ===========================================================
652
+ [data-widget-area="sidebar"] {
653
+ .btn {
654
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
655
+ &:focus-visible {
656
+ outline: none;
657
+ box-shadow: $jv-focus-ring;
658
+ }
659
+ }
386
660
 
387
- .dropdown-item,
388
- .action-item {
389
- padding: $jv-space-2 $jv-space-4;
390
- border-radius: $jv-radius-sm;
661
+ .widget {
662
+ background: $jv-surface;
663
+ border: 1px solid $jv-border-subtle;
664
+ border-radius: $jv-radius-md;
665
+ padding: $jv-space-4;
666
+ }
667
+ }
668
+
669
+ // ===========================================================
670
+ // TOPIC NAVIGATOR (Floating)
671
+ // ===========================================================
672
+ [component="topic/navigator"] {
673
+ background: $jv-surface;
674
+ border-radius: $jv-radius-md;
675
+ box-shadow: $jv-shadow-lg;
676
+ border: 1px solid $jv-border-subtle;
677
+ padding: $jv-space-3;
678
+
679
+ .btn {
680
+ background: transparent;
681
+ border: none;
391
682
  color: $jv-text-muted;
392
- font-size: $jv-font-size-sm;
393
- transition: background-color $jv-transition-fast, color $jv-transition-fast;
683
+ padding: $jv-space-2;
684
+ border-radius: $jv-radius-sm;
394
685
 
395
686
  &:hover {
396
687
  background: $jv-hover-bg;
@@ -410,14 +701,12 @@ body.template-topic {
410
701
  margin-top: $jv-space-6;
411
702
  border: 1px solid $jv-border-subtle;
412
703
 
413
- // Quick reply header
414
704
  .quick-reply-header {
415
705
  margin-bottom: $jv-space-4;
416
706
  font-weight: 600;
417
707
  color: $jv-text-main;
418
708
  }
419
709
 
420
- // Textarea
421
710
  textarea,
422
711
  .form-control {
423
712
  border: 1px solid $jv-border-subtle;
@@ -435,12 +724,9 @@ body.template-topic {
435
724
  box-shadow: $jv-focus-ring;
436
725
  }
437
726
 
438
- &::placeholder {
439
- color: $jv-text-soft;
440
- }
727
+ &::placeholder { color: $jv-text-soft; }
441
728
  }
442
729
 
443
- // Quick reply footer with buttons
444
730
  .quick-reply-footer,
445
731
  .composer-actions {
446
732
  display: flex;
@@ -451,45 +737,282 @@ body.template-topic {
451
737
  }
452
738
 
453
739
  // ===========================================================
454
- // REPLY CONTAINER (Nested replies)
740
+ // PARENT POST CONTEXT (shown when viewing a reply)
455
741
  // ===========================================================
456
- [component="post/replies/container"] {
457
- margin-top: $jv-space-4;
458
- padding-left: $jv-space-6;
459
- border-left: 2px solid $jv-border-subtle;
742
+ [component="post/parent"] {
743
+ background: $jv-surface !important;
744
+ border: 1px solid $jv-border-subtle !important;
745
+ border-left: 3px solid $jv-primary !important;
746
+ border-radius: $jv-radius-sm !important;
747
+ padding: $jv-space-3 !important;
748
+ margin-bottom: $jv-space-3 !important;
749
+ transition: background-color $jv-transition-fast, border-color $jv-transition-fast;
750
+
751
+ &:hover {
752
+ background: $jv-hover-bg !important;
753
+ border-color: $jv-border-strong !important;
754
+ border-left-color: $jv-primary-hover !important;
755
+ }
460
756
 
461
- [component="post"] {
462
- margin-bottom: $jv-space-3;
463
- padding: $jv-space-4;
464
- background: rgba(0, 0, 0, 0.02);
465
- border-radius: $jv-radius-sm;
757
+ // Header row with avatar and metadata
758
+ > .d-flex:first-child {
759
+ gap: $jv-space-2 !important;
760
+ margin-bottom: $jv-space-2;
761
+
762
+ // Small avatar
763
+ .avatar,
764
+ [component="user/picture"] {
765
+ width: 20px !important;
766
+ height: 20px !important;
767
+ border-radius: 50%;
768
+ flex-shrink: 0;
769
+ }
466
770
 
467
- .post-container {
468
- padding: 0;
771
+ // Username and time
772
+ .text-nowrap,
773
+ .fw-bold {
774
+ font-size: $jv-font-size-xs !important;
775
+ font-weight: 600;
776
+ color: $jv-text-main;
777
+ }
778
+
779
+ .text-muted {
780
+ font-size: $jv-font-size-xs !important;
781
+ color: $jv-text-soft !important;
782
+ }
783
+ }
784
+
785
+ // Parent content preview
786
+ [component="post/parent/content"] {
787
+ font-size: $jv-font-size-sm !important;
788
+ color: $jv-text-muted !important;
789
+ line-height: $jv-line-height-base;
790
+ display: -webkit-box;
791
+ -webkit-line-clamp: 2;
792
+ -webkit-box-orient: vertical;
793
+ overflow: hidden;
794
+
795
+ p {
796
+ margin: 0;
469
797
  }
470
798
  }
471
799
  }
472
800
 
473
801
  // ===========================================================
474
- // TOPIC NAVIGATOR (Floating scroll helper)
802
+ // REPLY COUNT BUTTON (Accordion trigger)
475
803
  // ===========================================================
476
- [component="topic/navigator"] {
477
- background: $jv-surface;
478
- border-radius: $jv-radius-md;
479
- box-shadow: $jv-shadow-lg;
480
- border: 1px solid $jv-border-subtle;
481
- padding: $jv-space-3;
804
+ [component="post/reply-count"] {
805
+ display: inline-flex !important;
806
+ align-items: center;
807
+ gap: $jv-space-2;
808
+ background: $jv-surface !important;
809
+ border: 1px solid $jv-border-subtle !important;
810
+ border-radius: $jv-radius-pill !important;
811
+ padding: $jv-space-1 $jv-space-3 !important;
812
+ font-size: $jv-font-size-xs !important;
813
+ color: $jv-text-muted !important;
814
+ cursor: pointer;
815
+ transition: all $jv-transition-fast;
816
+
817
+ &:hover {
818
+ background: $jv-hover-bg !important;
819
+ border-color: $jv-border-strong !important;
820
+ color: $jv-text-main !important;
821
+ }
482
822
 
483
- .btn {
484
- background: transparent;
485
- border: none;
486
- color: $jv-text-muted;
487
- padding: $jv-space-2;
488
- border-radius: $jv-radius-sm;
823
+ // Avatar stack
824
+ [component="post/reply-count/avatars"] {
825
+ display: flex;
826
+ align-items: center;
489
827
 
490
- &:hover {
491
- background: $jv-hover-bg;
492
- color: $jv-text-main;
828
+ span {
829
+ margin-left: -4px;
830
+
831
+ &:first-child {
832
+ margin-left: 0;
833
+ }
834
+ }
835
+
836
+ .avatar,
837
+ img {
838
+ width: 18px !important;
839
+ height: 18px !important;
840
+ border-radius: 50%;
841
+ border: 2px solid $jv-surface;
842
+ }
843
+ }
844
+
845
+ // Reply count text
846
+ .replies-count,
847
+ [component="post/reply-count/text"] {
848
+ font-weight: 600;
849
+ color: $jv-text-main;
850
+ }
851
+
852
+ // Last reply time
853
+ .replies-last {
854
+ color: $jv-text-soft;
855
+ font-size: $jv-font-size-xs;
856
+ }
857
+
858
+ // Chevron icon
859
+ .fa-chevron-down {
860
+ font-size: 10px;
861
+ color: $jv-text-soft;
862
+ transition: transform $jv-transition-fast;
863
+ }
864
+
865
+ // Expanded state
866
+ &[aria-expanded="true"] {
867
+ .fa-chevron-down {
868
+ transform: rotate(180deg);
869
+ }
870
+ }
871
+ }
872
+
873
+ // ===========================================================
874
+ // NESTED REPLIES CONTAINER (Threaded style)
875
+ // ===========================================================
876
+ [component="post/replies/container"] {
877
+ margin-top: $jv-space-3 !important;
878
+ margin-bottom: 0 !important;
879
+ margin-left: $jv-space-6;
880
+ padding: 0 !important;
881
+ background: transparent !important;
882
+ border: none !important;
883
+ border-radius: 0 !important;
884
+ position: relative;
885
+
886
+ // Thread line
887
+ &::before {
888
+ content: "";
889
+ position: absolute;
890
+ left: -$jv-space-4;
891
+ top: 0;
892
+ bottom: $jv-space-4;
893
+ width: 2px;
894
+ background: $jv-border-subtle;
895
+ border-radius: 1px;
896
+ }
897
+
898
+ // Replies list
899
+ [component="post/replies"],
900
+ ul.list-unstyled {
901
+ margin: 0;
902
+ padding: 0;
903
+ display: flex;
904
+ flex-direction: column;
905
+ gap: $jv-space-3;
906
+ }
907
+
908
+ // Individual reply posts
909
+ [component="post"] {
910
+ margin: 0 !important;
911
+ padding: 0 !important;
912
+ background: transparent !important;
913
+ position: relative;
914
+
915
+ // Thread connector dot
916
+ &::before {
917
+ content: "";
918
+ position: absolute;
919
+ left: -$jv-space-4 - 3px;
920
+ top: $jv-space-4;
921
+ width: 8px;
922
+ height: 8px;
923
+ background: $jv-surface;
924
+ border: 2px solid $jv-border-strong;
925
+ border-radius: 50%;
926
+ z-index: 1;
927
+ }
928
+
929
+ // Reply card
930
+ .post-container-parent {
931
+ background: $jv-surface !important;
932
+ border: 1px solid $jv-border-subtle !important;
933
+ border-radius: $jv-radius-sm !important;
934
+ padding: $jv-space-3 !important;
935
+ gap: $jv-space-2 !important;
936
+ transition: border-color $jv-transition-fast, box-shadow $jv-transition-fast;
937
+
938
+ &:hover {
939
+ border-color: $jv-border-strong !important;
940
+ box-shadow: $jv-shadow-sm;
941
+ }
942
+
943
+ // Smaller avatar for replies
944
+ > .bg-body,
945
+ > div:first-child {
946
+ .avatar,
947
+ [component="user/picture"] {
948
+ width: 28px !important;
949
+ height: 28px !important;
950
+ }
951
+ }
952
+ }
953
+
954
+ // Post content area
955
+ .post-container {
956
+ padding: 0 !important;
957
+ background: transparent !important;
958
+ border: none !important;
959
+ }
960
+
961
+ // Reply header
962
+ .post-header {
963
+ font-size: $jv-font-size-xs !important;
964
+ min-height: auto !important;
965
+ margin-bottom: $jv-space-1 !important;
966
+
967
+ .fw-bold,
968
+ a[data-username] {
969
+ font-size: $jv-font-size-xs !important;
970
+ font-weight: 600;
971
+ }
972
+
973
+ .text-muted {
974
+ font-size: $jv-font-size-xs !important;
975
+ }
976
+
977
+ // Hide post index in replies
978
+ .post-index {
979
+ display: none !important;
980
+ }
981
+ }
982
+
983
+ // Reply content
984
+ [component="post/content"] {
985
+ font-size: $jv-font-size-sm !important;
986
+ line-height: $jv-line-height-base;
987
+ }
988
+
989
+ // Reply footer/actions
990
+ [component="post/footer"],
991
+ .post-footer {
992
+ margin-top: $jv-space-2 !important;
993
+ padding-top: $jv-space-2 !important;
994
+ padding-bottom: 0 !important;
995
+ border-top: 1px solid $jv-border-subtle !important;
996
+ border-bottom: none !important;
997
+ }
998
+
999
+ [component="post/actions"] {
1000
+ gap: $jv-space-1 !important;
1001
+
1002
+ .btn,
1003
+ .btn-ghost {
1004
+ padding: $jv-space-1 $jv-space-2 !important;
1005
+ font-size: $jv-font-size-xs !important;
1006
+
1007
+ i {
1008
+ font-size: 14px !important;
1009
+ }
1010
+ }
1011
+ }
1012
+
1013
+ // Last reply - no bottom spacing on thread line
1014
+ &:last-child::before {
1015
+ display: block !important;
493
1016
  }
494
1017
  }
495
1018
  }
@@ -518,11 +1041,7 @@ body.template-topic {
518
1041
  [component="post/upvote"],
519
1042
  [component="post/downvote"] {
520
1043
  padding: $jv-space-2;
521
-
522
- // Hide text on smaller screens
523
- span:not(.fa):not(.fas):not(.far):not(.fab) {
524
- display: none;
525
- }
1044
+ span:not(.fa):not(.fas):not(.far):not(.fab) { display: none; }
526
1045
  }
527
1046
  }
528
1047
  }
@@ -532,7 +1051,7 @@ body.template-topic {
532
1051
  body.template-topic {
533
1052
  .topic-header h1,
534
1053
  .topic-header [component="topic/title"] {
535
- font-size: 22px;
1054
+ font-size: $jv-font-size-xl;
536
1055
  }
537
1056
 
538
1057
  .quick-reply,
@@ -540,8 +1059,35 @@ body.template-topic {
540
1059
  padding: $jv-space-4;
541
1060
  }
542
1061
 
1062
+ // Mobile adjustments for threaded replies
543
1063
  [component="post/replies/container"] {
544
- padding-left: $jv-space-4;
1064
+ margin-left: $jv-space-4;
1065
+
1066
+ &::before {
1067
+ left: -$jv-space-3;
1068
+ }
1069
+
1070
+ [component="post"] {
1071
+ &::before {
1072
+ left: -$jv-space-3 - 3px;
1073
+ }
1074
+ }
1075
+ }
1076
+
1077
+ // Mobile adjustments for parent context
1078
+ [component="post/parent"] {
1079
+ padding: $jv-space-2 !important;
1080
+
1081
+ [component="post/parent/content"] {
1082
+ -webkit-line-clamp: 1;
1083
+ }
1084
+ }
1085
+
1086
+ // Mobile reply count button
1087
+ [component="post/reply-count"] {
1088
+ .replies-last {
1089
+ display: none !important;
1090
+ }
545
1091
  }
546
1092
  }
547
- }
1093
+ }