@okjavis/nodebb-theme-javis 2.0.0 → 2.1.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okjavis/nodebb-theme-javis",
3
- "version": "2.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "Modern, premium NodeBB theme for JAVIS Community - Extends Harmony with custom styling",
5
5
  "main": "theme.js",
6
6
  "scripts": {
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-4;
50
37
 
51
- // Topic title
52
38
  h1,
53
- [component="topic/title"] {
54
- font-size: 28px;
55
- font-weight: 700;
56
- line-height: $jv-line-height-tight;
57
- letter-spacing: -0.02em;
39
+ [component="topic/title"],
40
+ .topic-title {
41
+ font-size: 32px;
42
+ font-weight: 800;
43
+ line-height: 1.2;
44
+ letter-spacing: -0.03em;
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: 32px !important;
53
+ font-weight: 800 !important;
54
+ line-height: 1.2 !important;
55
+ letter-spacing: -0.03em !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,22 +111,20 @@ body.template-topic {
105
111
  width: 100%;
106
112
  }
107
113
 
108
- // Individual post
109
114
  [component="post"] {
110
115
  background: $jv-surface;
111
116
  border-radius: $jv-radius-md;
112
117
  margin-bottom: $jv-space-4;
113
- border: none; // Borderless as per theme
114
- box-shadow: none; // No shadow for cleaner look
118
+ border: 1px solid $jv-border-subtle;
119
+ box-shadow: none;
115
120
 
116
- // Post container inner
117
121
  .post-container {
118
122
  padding: $jv-space-6;
123
+ padding-top: 0 !important;
119
124
  border: none;
120
125
  background: transparent;
121
126
  }
122
127
 
123
- // Selected state (when linked directly)
124
128
  &.selected .post-container {
125
129
  background: $jv-selected-bg;
126
130
  border-radius: $jv-radius-md;
@@ -138,7 +142,6 @@ body.template-topic {
138
142
  margin-bottom: $jv-space-4;
139
143
  font-size: $jv-font-size-sm;
140
144
 
141
- // Avatar
142
145
  .avatar {
143
146
  width: 40px;
144
147
  height: 40px;
@@ -147,14 +150,12 @@ body.template-topic {
147
150
  flex-shrink: 0;
148
151
  }
149
152
 
150
- // User info container
151
153
  .user-info {
152
154
  display: flex;
153
155
  flex-direction: column;
154
156
  gap: 2px;
155
157
  }
156
158
 
157
- // Username
158
159
  .username,
159
160
  [component="post/header/username"] {
160
161
  font-weight: 600;
@@ -166,27 +167,20 @@ body.template-topic {
166
167
  }
167
168
  }
168
169
 
169
- // Timestamp
170
170
  .timeago,
171
171
  [component="post/timestamp"] {
172
172
  color: $jv-text-soft;
173
173
  font-size: $jv-font-size-xs;
174
174
  }
175
175
 
176
- // Post index/number - Subtle
177
176
  .post-index,
178
177
  [component="post/header/index"] {
179
178
  color: $jv-text-soft;
180
179
  font-size: $jv-font-size-xs;
181
180
  font-weight: 400;
182
- opacity: 0.6;
183
-
184
- &::before {
185
- content: "#";
186
- }
181
+ opacity: 0.5;
187
182
  }
188
183
 
189
- // Bookmarked indicator
190
184
  .bookmarked {
191
185
  color: $jv-warning;
192
186
  }
@@ -202,34 +196,26 @@ body.template-topic {
202
196
 
203
197
  p {
204
198
  margin-bottom: $jv-space-4;
205
-
206
- &:last-child {
207
- margin-bottom: 0;
208
- }
199
+ &:last-child { margin-bottom: 0; }
209
200
  }
210
201
 
211
- // Code blocks
212
202
  pre, code {
213
203
  background: rgba(0, 0, 0, 0.04);
214
204
  border-radius: $jv-radius-sm;
215
205
  font-size: $jv-font-size-sm;
216
206
  }
217
207
 
218
- code {
219
- padding: 2px 6px;
220
- }
208
+ code { padding: 2px 6px; }
221
209
 
222
210
  pre {
223
211
  padding: $jv-space-4;
224
212
  overflow-x: auto;
225
-
226
213
  code {
227
214
  padding: 0;
228
215
  background: transparent;
229
216
  }
230
217
  }
231
218
 
232
- // Blockquotes
233
219
  blockquote {
234
220
  border-left: 3px solid $jv-border-strong;
235
221
  padding-left: $jv-space-4;
@@ -238,42 +224,34 @@ body.template-topic {
238
224
  font-style: italic;
239
225
  }
240
226
 
241
- // Images
242
227
  img {
243
228
  max-width: 100%;
244
229
  border-radius: $jv-radius-sm;
245
230
  }
246
231
 
247
- // Links
248
232
  a {
249
233
  color: $jv-primary;
250
-
251
- &:hover {
252
- text-decoration: underline;
253
- }
234
+ &:hover { text-decoration: underline; }
254
235
  }
255
236
  }
256
237
 
257
238
  // ===========================================================
258
- // POST FOOTER Action Bar
239
+ // POST FOOTER & ACTIONS
259
240
  // ===========================================================
260
241
  [component="post/footer"],
261
242
  .post-footer {
262
- padding-top: $jv-space-4;
243
+ padding-top: 0 !important;
244
+ padding-bottom: 0 !important;
263
245
  margin-top: $jv-space-4;
264
246
  border-top: 1px solid $jv-border-subtle;
265
247
  }
266
248
 
267
- // ===========================================================
268
- // ACTION ICONS – Ghost Button Style
269
- // ===========================================================
270
249
  [component="post/actions"] {
271
250
  display: flex;
272
251
  align-items: center;
273
252
  gap: $jv-space-2;
274
253
  flex-wrap: wrap;
275
254
 
276
- // All action buttons - Ghost style
277
255
  .btn,
278
256
  [component="post/reply"],
279
257
  [component="post/quote"],
@@ -293,9 +271,7 @@ body.template-topic {
293
271
  align-items: center;
294
272
  gap: $jv-space-2;
295
273
 
296
- i {
297
- font-size: 16px;
298
- }
274
+ i { font-size: 16px; }
299
275
 
300
276
  &:hover {
301
277
  background: $jv-hover-bg !important;
@@ -307,7 +283,6 @@ body.template-topic {
307
283
  box-shadow: $jv-focus-ring;
308
284
  }
309
285
 
310
- // Active states (voted, bookmarked)
311
286
  &.active,
312
287
  &.upvoted,
313
288
  &.downvoted,
@@ -317,7 +292,6 @@ body.template-topic {
317
292
  }
318
293
  }
319
294
 
320
- // Vote counts
321
295
  [component="post/vote-count"] {
322
296
  font-weight: 600;
323
297
  color: $jv-text-muted;
@@ -326,71 +300,244 @@ body.template-topic {
326
300
  }
327
301
  }
328
302
 
303
+ // Always visible post actions (override Harmony's hover behavior)
304
+ .topic .posts [component="post"] [component="post/actions"] {
305
+ opacity: 1 !important;
306
+ visibility: visible !important;
307
+ }
308
+
329
309
  // ===========================================================
330
- // RIGHT SIDEBAR ACTIONS Ghost Buttons
310
+ // GHOST BUTTONShared Style
331
311
  // ===========================================================
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;
312
+ .btn-ghost {
313
+ background: transparent !important;
314
+ border: 1px solid transparent !important;
315
+ color: $jv-text-muted;
316
+ padding: $jv-space-2 $jv-space-3;
317
+ border-radius: $jv-radius-sm;
318
+ font-size: $jv-font-size-sm;
319
+ font-weight: 500;
320
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
321
+ display: inline-flex;
322
+ align-items: center;
323
+ gap: $jv-space-2;
324
+
325
+ i {
326
+ font-size: 16px;
327
+ color: $jv-primary;
328
+ }
329
+
330
+ &:hover {
331
+ background: $jv-hover-bg !important;
332
+ color: $jv-text-main;
333
+ }
334
+
335
+ &:focus-visible {
336
+ outline: none;
337
+ box-shadow: $jv-focus-ring;
338
+ }
339
+ }
340
+
341
+ // ===========================================================
342
+ // PRIMARY BUTTON – Reply
343
+ // ===========================================================
344
+ .btn-primary {
345
+ background: $jv-primary !important;
346
+ border-color: $jv-primary !important;
347
+ color: #fff !important;
348
+
349
+ &:hover {
350
+ background: $jv-primary-hover !important;
351
+ border-color: $jv-primary-hover !important;
352
+ }
353
+ }
354
+
355
+ // ===========================================================
356
+ // PAGINATION / TIMELINE NAVIGATOR – Shared
357
+ // ===========================================================
358
+ .pagination-block {
359
+ .scroller-content {
360
+ min-width: 180px;
361
+ }
362
+
363
+ .scroller-thumb-icon {
364
+ background: $jv-primary !important;
365
+ border-radius: $jv-radius-xs;
366
+ transition: transform $jv-transition-fast;
367
+ }
368
+
369
+ .pagetop,
370
+ .pagebottom {
371
+ background: transparent;
372
+ border: none;
338
373
  color: $jv-text-muted;
339
- padding: $jv-space-2 $jv-space-4;
374
+ padding: $jv-space-2 $jv-space-3;
340
375
  border-radius: $jv-radius-sm;
341
376
  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
377
 
357
378
  &:hover {
358
- background: $jv-hover-bg !important;
379
+ background: $jv-hover-bg;
359
380
  color: $jv-text-main;
360
381
  }
361
382
 
362
- &:focus-visible {
363
- outline: none;
364
- box-shadow: $jv-focus-ring;
383
+ i { color: $jv-primary; }
384
+ }
385
+
386
+ .thumb-text {
387
+ color: $jv-text-main;
388
+ font-weight: 600;
389
+ font-size: $jv-font-size-sm;
390
+ }
391
+
392
+ .thumb-timestamp {
393
+ color: $jv-text-soft;
394
+ font-size: $jv-font-size-xs;
395
+ }
396
+ }
397
+
398
+ // ===========================================================
399
+ // TOPIC SIDEBAR – Right Column
400
+ // ===========================================================
401
+ .topic-sidebar-container {
402
+ position: sticky;
403
+ top: 80px;
404
+ height: fit-content;
405
+ align-self: flex-start;
406
+ z-index: 100;
407
+ pointer-events: auto;
408
+ }
409
+
410
+ .topic-sidebar {
411
+ background: $jv-surface;
412
+ border: 1px solid $jv-border-subtle;
413
+ border-radius: $jv-radius-md;
414
+ padding: $jv-space-4;
415
+ position: relative;
416
+ pointer-events: auto;
417
+
418
+ button, a, .btn, .dropdown-toggle, [role="button"] {
419
+ pointer-events: auto;
420
+ cursor: pointer;
421
+ }
422
+
423
+ .topic-sidebar-actions {
424
+ position: relative;
425
+ z-index: 10;
426
+
427
+ .btn,
428
+ [component="topic/reply/container"],
429
+ .btn-group,
430
+ .thread-tools {
431
+ width: 100%;
432
+ position: relative;
433
+ z-index: 10;
434
+ }
435
+
436
+ [component="topic/reply/container"] {
437
+ display: flex;
438
+ flex-direction: column;
439
+ gap: $jv-space-2;
440
+
441
+ .btn-primary {
442
+ flex: 1;
443
+ border-radius: $jv-radius-sm;
444
+ font-weight: 600;
445
+ padding: $jv-space-3 $jv-space-4;
446
+ }
447
+
448
+ .dropdown-toggle { display: none; }
365
449
  }
366
450
 
367
- // Primary action (Reply)
368
- &.btn-primary {
369
- background: $jv-primary !important;
370
- color: #fff;
451
+ // Consistent ghost button styling for all sidebar action buttons
452
+ .btn-ghost,
453
+ .bottom-sheet > .btn,
454
+ .thread-tools > .dropdown-toggle {
455
+ background: transparent !important;
456
+ border: 1px solid transparent !important;
457
+ color: $jv-text-muted;
458
+ padding: $jv-space-2 $jv-space-3;
459
+ border-radius: $jv-radius-sm;
460
+ font-size: $jv-font-size-sm;
461
+ font-weight: 500;
462
+ text-align: left;
463
+ width: 100%;
464
+ justify-content: flex-start;
465
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
466
+
467
+ i {
468
+ width: 16px;
469
+ color: $jv-primary;
470
+ }
371
471
 
372
472
  &:hover {
373
- background: $jv-primary-hover !important;
374
- color: #fff;
473
+ background: $jv-hover-bg !important;
474
+ color: $jv-text-main;
375
475
  }
376
476
  }
477
+
478
+ .bottom-sheet {
479
+ width: 100%;
480
+ .dropdown-menu { width: 100%; }
481
+ }
482
+
483
+ .thread-tools {
484
+ .dropdown-menu { min-width: 100%; }
485
+ }
486
+ }
487
+
488
+ .pagination-block {
489
+ margin-top: $jv-space-4;
490
+ padding-top: $jv-space-4;
491
+ border-top: 1px solid $jv-border-subtle;
492
+
493
+ .scroller-content { gap: $jv-space-2; }
494
+
495
+ .scroller-container {
496
+ padding: $jv-space-2 $jv-space-3;
497
+ position: relative !important;
498
+ left: auto !important;
499
+ height: auto !important;
500
+ border-left: none !important;
501
+ }
377
502
  }
378
503
  }
379
504
 
380
- // Sidebar action list
381
- .topic-actions-list,
382
- .topic-tools {
383
- display: flex;
384
- flex-direction: column;
385
- gap: $jv-space-1;
505
+ // ===========================================================
506
+ // WIDGET AREA
507
+ // ===========================================================
508
+ [data-widget-area="sidebar"] {
509
+ .btn {
510
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
511
+ &:focus-visible {
512
+ outline: none;
513
+ box-shadow: $jv-focus-ring;
514
+ }
515
+ }
386
516
 
387
- .dropdown-item,
388
- .action-item {
389
- padding: $jv-space-2 $jv-space-4;
390
- border-radius: $jv-radius-sm;
517
+ .widget {
518
+ background: $jv-surface;
519
+ border: 1px solid $jv-border-subtle;
520
+ border-radius: $jv-radius-md;
521
+ padding: $jv-space-4;
522
+ }
523
+ }
524
+
525
+ // ===========================================================
526
+ // TOPIC NAVIGATOR (Floating)
527
+ // ===========================================================
528
+ [component="topic/navigator"] {
529
+ background: $jv-surface;
530
+ border-radius: $jv-radius-md;
531
+ box-shadow: $jv-shadow-lg;
532
+ border: 1px solid $jv-border-subtle;
533
+ padding: $jv-space-3;
534
+
535
+ .btn {
536
+ background: transparent;
537
+ border: none;
391
538
  color: $jv-text-muted;
392
- font-size: $jv-font-size-sm;
393
- transition: background-color $jv-transition-fast, color $jv-transition-fast;
539
+ padding: $jv-space-2;
540
+ border-radius: $jv-radius-sm;
394
541
 
395
542
  &:hover {
396
543
  background: $jv-hover-bg;
@@ -410,14 +557,12 @@ body.template-topic {
410
557
  margin-top: $jv-space-6;
411
558
  border: 1px solid $jv-border-subtle;
412
559
 
413
- // Quick reply header
414
560
  .quick-reply-header {
415
561
  margin-bottom: $jv-space-4;
416
562
  font-weight: 600;
417
563
  color: $jv-text-main;
418
564
  }
419
565
 
420
- // Textarea
421
566
  textarea,
422
567
  .form-control {
423
568
  border: 1px solid $jv-border-subtle;
@@ -435,12 +580,9 @@ body.template-topic {
435
580
  box-shadow: $jv-focus-ring;
436
581
  }
437
582
 
438
- &::placeholder {
439
- color: $jv-text-soft;
440
- }
583
+ &::placeholder { color: $jv-text-soft; }
441
584
  }
442
585
 
443
- // Quick reply footer with buttons
444
586
  .quick-reply-footer,
445
587
  .composer-actions {
446
588
  display: flex;
@@ -451,7 +593,7 @@ body.template-topic {
451
593
  }
452
594
 
453
595
  // ===========================================================
454
- // REPLY CONTAINER (Nested replies)
596
+ // NESTED REPLIES
455
597
  // ===========================================================
456
598
  [component="post/replies/container"] {
457
599
  margin-top: $jv-space-4;
@@ -464,33 +606,29 @@ body.template-topic {
464
606
  background: rgba(0, 0, 0, 0.02);
465
607
  border-radius: $jv-radius-sm;
466
608
 
467
- .post-container {
468
- padding: 0;
469
- }
609
+ .post-container { padding: 0; }
470
610
  }
471
611
  }
472
612
 
473
613
  // ===========================================================
474
- // TOPIC NAVIGATOR (Floating scroll helper)
614
+ // REPLY COUNT ACCORDION
475
615
  // ===========================================================
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;
616
+ [component="post/reply-count"] {
617
+ color: $jv-text-muted;
618
+ font-size: $jv-font-size-sm;
619
+ padding: $jv-space-2 $jv-space-3;
620
+ border-radius: $jv-radius-sm;
621
+ cursor: pointer;
622
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
482
623
 
483
- .btn {
484
- background: transparent;
485
- border: none;
486
- color: $jv-text-muted;
487
- padding: $jv-space-2;
488
- border-radius: $jv-radius-sm;
624
+ &:hover {
625
+ background: $jv-hover-bg;
626
+ color: $jv-text-main;
627
+ }
489
628
 
490
- &:hover {
491
- background: $jv-hover-bg;
492
- color: $jv-text-main;
493
- }
629
+ .replies-count {
630
+ color: $jv-text-main;
631
+ font-weight: 600;
494
632
  }
495
633
  }
496
634
  }
@@ -518,11 +656,7 @@ body.template-topic {
518
656
  [component="post/upvote"],
519
657
  [component="post/downvote"] {
520
658
  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
- }
659
+ span:not(.fa):not(.fas):not(.far):not(.fab) { display: none; }
526
660
  }
527
661
  }
528
662
  }
@@ -544,4 +678,4 @@ body.template-topic {
544
678
  padding-left: $jv-space-4;
545
679
  }
546
680
  }
547
- }
681
+ }
@@ -0,0 +1,48 @@
1
+ <div id="topic-sidebar" class="topic-sidebar">
2
+ <div class="d-flex flex-column gap-2">
3
+ <div class="topic-sidebar-actions d-flex flex-column gap-2 mb-3">
4
+ <!-- Reply Button -->
5
+ <!-- IMPORT partials/topic/reply-button.tpl -->
6
+
7
+ <!-- Mark Unread Button -->
8
+ {{{ if loggedIn }}}
9
+ <button component="topic/mark-unread" class="btn btn-ghost btn-sm d-flex gap-2 align-items-center w-100 justify-content-start">
10
+ <i class="fa fa-fw fa-inbox"></i>
11
+ <span class="fw-semibold text-nowrap">[[topic:mark-unread]]</span>
12
+ </button>
13
+ {{{ end }}}
14
+
15
+ <!-- Watching/Not Watching -->
16
+ <!-- IMPORT partials/topic/watch.tpl -->
17
+
18
+ <!-- Sort Options -->
19
+ <!-- IMPORT partials/topic/sort.tpl -->
20
+
21
+ <!-- Topic Tools (for mods/admins) -->
22
+ <!-- IMPORT partials/topic/tools.tpl -->
23
+ </div>
24
+
25
+ <!-- Post Navigator / Timeline -->
26
+ <div class="pagination-block flex-grow-1">
27
+ <div class="scroller-content d-flex gap-2 flex-column align-items-start">
28
+ <button class="btn btn-ghost btn-sm d-flex gap-2 align-items-center pagetop w-100 justify-content-start">
29
+ <i class="fa fa-fw fa-angle-up"></i>
30
+ <span class="timeago text-xs text-muted text-nowrap" title="{./timestampISO}"></span>
31
+ </button>
32
+ <div class="scroller-container position-relative w-100">
33
+ <div class="scroller-thumb d-flex gap-2 text-nowrap position-relative" style="height: 40px;">
34
+ <div class="scroller-thumb-icon rounded d-inline-block" style="width: 4px; height: 40px;"></div>
35
+ <div class="d-flex flex-column">
36
+ <span class="thumb-text small fw-semibold mb-0"></span>
37
+ <span class="thumb-timestamp timeago text-xs text-muted mb-0"></span>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ <button class="btn btn-ghost btn-sm d-flex gap-2 align-items-center pagebottom w-100 justify-content-start">
42
+ <i class="fa fa-fw fa-angle-down"></i>
43
+ <span class="timeago text-xs text-muted text-nowrap" title="{./lastposttimeISO}"></span>
44
+ </button>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ </div>
@@ -0,0 +1,133 @@
1
+ <!-- IMPORT partials/breadcrumbs-json-ld.tpl -->
2
+ {{{ if config.theme.enableBreadcrumbs }}}
3
+ <!-- IMPORT partials/breadcrumbs.tpl -->
4
+ {{{ end }}}
5
+ {{{ if widgets.header.length }}}
6
+ <div data-widget-area="header">
7
+ {{{each widgets.header}}}
8
+ {{widgets.header.html}}
9
+ {{{end}}}
10
+ </div>
11
+ {{{ end }}}
12
+
13
+ <div itemid="{url}" itemscope itemtype="https://schema.org/DiscussionForumPosting">
14
+ <meta itemprop="headline" content="{escape(titleRaw)}">
15
+ <meta itemprop="text" content="{escape(titleRaw)}">
16
+ <meta itemprop="url" content="{url}">
17
+ <meta itemprop="datePublished" content="{timestampISO}">
18
+ <meta itemprop="dateModified" content="{lastposttimeISO}">
19
+ <div itemprop="author" itemscope itemtype="https://schema.org/Person">
20
+ <meta itemprop="name" content="{author.username}">
21
+ {{{ if author.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{author.userslug}">{{{ end }}}
22
+ </div>
23
+
24
+ <div class="d-flex flex-column gap-3">
25
+ <div class="d-flex flex-wrap">
26
+ <div class="d-flex flex-column gap-3 flex-grow-1">
27
+ <div class="topic-header d-flex align-items-start gap-3">
28
+ <a href="#" onclick="history.back(); return false;" class="topic-back-btn" title="Go back">
29
+ <i class="fa fa-arrow-left"></i>
30
+ </a>
31
+ <h1 component="post/header" class="tracking-tight fw-semibold fs-3 mb-0 text-break {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}}">
32
+ <span class="topic-title" component="topic/title">{title}</span>
33
+ </h1>
34
+ </div>
35
+
36
+ <div class="topic-info d-flex gap-2 align-items-center flex-wrap {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
37
+ <span component="topic/labels" class="d-flex gap-2 {{{ if (!scheduled && (!pinned && (!locked && (!oldCid && !icons.length)))) }}}hidden{{{ end }}}">
38
+ <span component="topic/scheduled" class="badge badge border border-gray-300 text-body {{{ if !scheduled }}}hidden{{{ end }}}">
39
+ <i class="fa fa-clock-o"></i> [[topic:scheduled]]
40
+ </span>
41
+ <span component="topic/pinned" class="badge badge border border-gray-300 text-body {{{ if (scheduled || !pinned) }}}hidden{{{ end }}}">
42
+ <i class="fa fa-thumb-tack"></i> {{{ if !pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}}
43
+ </span>
44
+ <span component="topic/locked" class="badge badge border border-gray-300 text-body {{{ if !locked }}}hidden{{{ end }}}">
45
+ <i class="fa fa-lock"></i> [[topic:locked]]
46
+ </span>
47
+ <a component="topic/moved" href="{config.relative_path}/category/{oldCid}" class="badge badge border border-gray-300 text-body text-decoration-none {{{ if !oldCid }}}hidden{{{ end }}}">
48
+ <i class="fa fa-arrow-circle-right"></i> {{{ if privileges.isAdminOrMod }}}[[topic:moved-from, {oldCategory.name}]]{{{ else }}}[[topic:moved]]{{{ end }}}
49
+ </a>
50
+ {{{each icons}}}<span class="lh-1">{@value}</span>{{{end}}}
51
+ </span>
52
+ {function.buildCategoryLabel, category, "a", "border"}
53
+ <div data-tid="{./tid}" component="topic/tags" class="lh-1 tags tag-list d-flex flex-wrap hidden-xs hidden-empty gap-2"><!-- IMPORT partials/topic/tags.tpl --></div>
54
+ <div class="d-flex hidden-xs gap-2"><!-- IMPORT partials/topic/stats.tpl --></div>
55
+ </div>
56
+ </div>
57
+ <div class="d-flex gap-2 align-items-center mt-2 hidden-empty" component="topic/thumb/list"><!-- IMPORT partials/topic/thumbs.tpl --></div>
58
+ </div>
59
+
60
+ <div class="topic-layout d-flex gap-4 mb-4 mb-lg-0">
61
+ <!-- Main Content Area -->
62
+ <div class="topic flex-grow-1" style="min-width: 0;">
63
+ {{{ if merger }}}
64
+ <!-- IMPORT partials/topic/merged-message.tpl -->
65
+ {{{ end }}}
66
+ {{{ if forker }}}
67
+ <!-- IMPORT partials/topic/forked-message.tpl -->
68
+ {{{ end }}}
69
+ {{{ if !scheduled }}}
70
+ <!-- IMPORT partials/topic/deleted-message.tpl -->
71
+ {{{ end }}}
72
+
73
+ <div class="posts-container" style="min-width: 0;">
74
+ <ul component="topic" class="posts timeline list-unstyled mt-sm-2 p-0 py-3" style="min-width: 0;" data-tid="{tid}" data-cid="{cid}">
75
+ {{{ each posts }}}
76
+ <li component="post" class="pt-4 {{{ if posts.deleted }}}deleted{{{ end }}} {{{ if posts.selfPost }}}self-post{{{ end }}} {{{ if posts.topicOwnerPost }}}topic-owner-post{{{ end }}}" <!-- IMPORT partials/data/topic.tpl -->>
77
+ <a component="post/anchor" data-index="{./index}" id="{increment(./index, "1")}"></a>
78
+ <meta itemprop="datePublished" content="{./timestampISO}">
79
+ {{{ if ./editedISO }}}
80
+ <meta itemprop="dateModified" content="{./editedISO}">
81
+ {{{ end }}}
82
+
83
+ <!-- IMPORT partials/topic/post.tpl -->
84
+ </li>
85
+ {{{ if (config.topicPostSort != "most_votes") }}}
86
+ {{{ each ./events}}}<!-- IMPORT partials/topic/event.tpl -->{{{ end }}}
87
+ {{{ end }}}
88
+ {{{ end }}}
89
+ </ul>
90
+ {{{ if browsingUsers }}}
91
+ <div class="visible-xs">
92
+ <!-- IMPORT partials/topic/browsing-users.tpl -->
93
+ <hr/>
94
+ </div>
95
+ {{{ end }}}
96
+ {{{ if config.theme.enableQuickReply }}}
97
+ <!-- IMPORT partials/topic/quickreply.tpl -->
98
+ {{{ end }}}
99
+ </div>
100
+
101
+ {{{ if config.usePagination }}}
102
+ <!-- IMPORT partials/paginator.tpl -->
103
+ {{{ end }}}
104
+ </div>
105
+
106
+ <!-- Right Sidebar with Topic Actions -->
107
+ <div class="topic-sidebar-container d-none d-lg-block" style="width: 200px; flex-shrink: 0;">
108
+ <!-- IMPORT partials/topic/sidebar.tpl -->
109
+
110
+ <!-- Additional Widgets (if any) -->
111
+ {{{ if widgets.sidebar.length }}}
112
+ <div data-widget-area="sidebar" class="mt-4">
113
+ {{{each widgets.sidebar}}}
114
+ {{widgets.sidebar.html}}
115
+ {{{end}}}
116
+ </div>
117
+ {{{ end }}}
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+
123
+ <div data-widget-area="footer">
124
+ {{{each widgets.footer}}}
125
+ {{widgets.footer.html}}
126
+ {{{end}}}
127
+ </div>
128
+
129
+ {{{ if !config.usePagination }}}
130
+ <noscript>
131
+ <!-- IMPORT partials/paginator.tpl -->
132
+ </noscript>
133
+ {{{ end }}}