@okjavis/nodebb-theme-javis 1.7.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.
@@ -0,0 +1,681 @@
1
+ // ===========================================================
2
+ // TOPIC PAGE – Individual Topic/Thread View
3
+ // Clean, cohesive design matching platform theme
4
+ // ===========================================================
5
+
6
+ // ===========================================================
7
+ // HIDDEN ELEMENTS
8
+ // ===========================================================
9
+ body.template-topic {
10
+ .breadcrumb,
11
+ [component="topic/thumb/list"] {
12
+ display: none !important;
13
+ }
14
+
15
+ // ===========================================================
16
+ // LAYOUT & CONTAINER
17
+ // ===========================================================
18
+ #content {
19
+ padding-left: 48px !important;
20
+ padding-right: 48px !important;
21
+ }
22
+
23
+ [itemscope][itemtype="https://schema.org/DiscussionForumPosting"] > .d-flex.flex-column.gap-3 {
24
+ margin-top: 24px !important;
25
+ }
26
+
27
+ // ===========================================================
28
+ // TOPIC HEADER – Title Typography
29
+ // ===========================================================
30
+ .topic-header,
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;
37
+
38
+ h1,
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;
45
+ color: $jv-text-main;
46
+ margin-bottom: 0;
47
+ flex: 1;
48
+ }
49
+ }
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
+
58
+ // ===========================================================
59
+ // META PILLS – Tags & Stats
60
+ // ===========================================================
61
+ .topic-tags,
62
+ [component="topic/tags"] {
63
+ display: flex;
64
+ flex-wrap: wrap;
65
+ gap: $jv-space-2;
66
+ margin-bottom: $jv-space-4;
67
+
68
+ .badge,
69
+ .tag {
70
+ font-size: $jv-font-size-xs;
71
+ font-weight: 500;
72
+ padding: $jv-space-1 $jv-space-3;
73
+ border-radius: $jv-radius-pill;
74
+ background: rgba(0, 0, 0, 0.05);
75
+ color: $jv-text-muted;
76
+ border: none;
77
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
78
+
79
+ &:hover {
80
+ background: $jv-primary-soft;
81
+ color: $jv-primary;
82
+ }
83
+ }
84
+ }
85
+
86
+ .category-badge,
87
+ [component="category/link"] .badge {
88
+ background: rgba(0, 0, 0, 0.06);
89
+ color: $jv-text-muted;
90
+ font-weight: 500;
91
+ }
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
+
105
+ // ===========================================================
106
+ // POSTS CONTAINER
107
+ // ===========================================================
108
+ .topic {
109
+ .posts-container {
110
+ max-width: 100%;
111
+ width: 100%;
112
+ }
113
+
114
+ [component="post"] {
115
+ background: $jv-surface;
116
+ border-radius: $jv-radius-md;
117
+ margin-bottom: $jv-space-4;
118
+ border: 1px solid $jv-border-subtle;
119
+ box-shadow: none;
120
+
121
+ .post-container {
122
+ padding: $jv-space-6;
123
+ padding-top: 0 !important;
124
+ border: none;
125
+ background: transparent;
126
+ }
127
+
128
+ &.selected .post-container {
129
+ background: $jv-selected-bg;
130
+ border-radius: $jv-radius-md;
131
+ }
132
+ }
133
+ }
134
+
135
+ // ===========================================================
136
+ // POST HEADER – Avatar, Username, Time
137
+ // ===========================================================
138
+ .post-header {
139
+ display: flex;
140
+ align-items: center;
141
+ gap: $jv-space-3;
142
+ margin-bottom: $jv-space-4;
143
+ font-size: $jv-font-size-sm;
144
+
145
+ .avatar {
146
+ width: 40px;
147
+ height: 40px;
148
+ border-radius: 50%;
149
+ object-fit: cover;
150
+ flex-shrink: 0;
151
+ }
152
+
153
+ .user-info {
154
+ display: flex;
155
+ flex-direction: column;
156
+ gap: 2px;
157
+ }
158
+
159
+ .username,
160
+ [component="post/header/username"] {
161
+ font-weight: 600;
162
+ color: $jv-text-main;
163
+ text-decoration: none;
164
+
165
+ &:hover {
166
+ color: $jv-primary;
167
+ }
168
+ }
169
+
170
+ .timeago,
171
+ [component="post/timestamp"] {
172
+ color: $jv-text-soft;
173
+ font-size: $jv-font-size-xs;
174
+ }
175
+
176
+ .post-index,
177
+ [component="post/header/index"] {
178
+ color: $jv-text-soft;
179
+ font-size: $jv-font-size-xs;
180
+ font-weight: 400;
181
+ opacity: 0.5;
182
+ }
183
+
184
+ .bookmarked {
185
+ color: $jv-warning;
186
+ }
187
+ }
188
+
189
+ // ===========================================================
190
+ // POST CONTENT – Typography
191
+ // ===========================================================
192
+ [component="post/content"] {
193
+ font-size: $jv-font-size-base;
194
+ line-height: $jv-line-height-relaxed;
195
+ color: $jv-text-main;
196
+
197
+ p {
198
+ margin-bottom: $jv-space-4;
199
+ &:last-child { margin-bottom: 0; }
200
+ }
201
+
202
+ pre, code {
203
+ background: rgba(0, 0, 0, 0.04);
204
+ border-radius: $jv-radius-sm;
205
+ font-size: $jv-font-size-sm;
206
+ }
207
+
208
+ code { padding: 2px 6px; }
209
+
210
+ pre {
211
+ padding: $jv-space-4;
212
+ overflow-x: auto;
213
+ code {
214
+ padding: 0;
215
+ background: transparent;
216
+ }
217
+ }
218
+
219
+ blockquote {
220
+ border-left: 3px solid $jv-border-strong;
221
+ padding-left: $jv-space-4;
222
+ margin: $jv-space-4 0;
223
+ color: $jv-text-muted;
224
+ font-style: italic;
225
+ }
226
+
227
+ img {
228
+ max-width: 100%;
229
+ border-radius: $jv-radius-sm;
230
+ }
231
+
232
+ a {
233
+ color: $jv-primary;
234
+ &:hover { text-decoration: underline; }
235
+ }
236
+ }
237
+
238
+ // ===========================================================
239
+ // POST FOOTER & ACTIONS
240
+ // ===========================================================
241
+ [component="post/footer"],
242
+ .post-footer {
243
+ padding-top: 0 !important;
244
+ padding-bottom: 0 !important;
245
+ margin-top: $jv-space-4;
246
+ border-top: 1px solid $jv-border-subtle;
247
+ }
248
+
249
+ [component="post/actions"] {
250
+ display: flex;
251
+ align-items: center;
252
+ gap: $jv-space-2;
253
+ flex-wrap: wrap;
254
+
255
+ .btn,
256
+ [component="post/reply"],
257
+ [component="post/quote"],
258
+ [component="post/bookmark"],
259
+ [component="post/upvote"],
260
+ [component="post/downvote"],
261
+ [component="post/tools"] {
262
+ background: transparent !important;
263
+ border: none !important;
264
+ color: $jv-text-muted;
265
+ padding: $jv-space-2 $jv-space-3;
266
+ border-radius: $jv-radius-sm;
267
+ font-size: $jv-font-size-sm;
268
+ font-weight: 500;
269
+ transition: background-color $jv-transition-fast, color $jv-transition-fast;
270
+ display: inline-flex;
271
+ align-items: center;
272
+ gap: $jv-space-2;
273
+
274
+ i { font-size: 16px; }
275
+
276
+ &:hover {
277
+ background: $jv-hover-bg !important;
278
+ color: $jv-text-main;
279
+ }
280
+
281
+ &:focus-visible {
282
+ outline: none;
283
+ box-shadow: $jv-focus-ring;
284
+ }
285
+
286
+ &.active,
287
+ &.upvoted,
288
+ &.downvoted,
289
+ &.bookmarked {
290
+ background: $jv-primary-soft !important;
291
+ color: $jv-primary;
292
+ }
293
+ }
294
+
295
+ [component="post/vote-count"] {
296
+ font-weight: 600;
297
+ color: $jv-text-muted;
298
+ min-width: 20px;
299
+ text-align: center;
300
+ }
301
+ }
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
+
309
+ // ===========================================================
310
+ // GHOST BUTTON – Shared Style
311
+ // ===========================================================
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;
373
+ color: $jv-text-muted;
374
+ padding: $jv-space-2 $jv-space-3;
375
+ border-radius: $jv-radius-sm;
376
+ font-size: $jv-font-size-sm;
377
+
378
+ &:hover {
379
+ background: $jv-hover-bg;
380
+ color: $jv-text-main;
381
+ }
382
+
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; }
449
+ }
450
+
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
+ }
471
+
472
+ &:hover {
473
+ background: $jv-hover-bg !important;
474
+ color: $jv-text-main;
475
+ }
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
+ }
502
+ }
503
+ }
504
+
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
+ }
516
+
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;
538
+ color: $jv-text-muted;
539
+ padding: $jv-space-2;
540
+ border-radius: $jv-radius-sm;
541
+
542
+ &:hover {
543
+ background: $jv-hover-bg;
544
+ color: $jv-text-main;
545
+ }
546
+ }
547
+ }
548
+
549
+ // ===========================================================
550
+ // QUICK REPLY BOX
551
+ // ===========================================================
552
+ .quick-reply,
553
+ [component="topic/quickreply"] {
554
+ background: $jv-surface;
555
+ border-radius: $jv-radius-md;
556
+ padding: $jv-space-6;
557
+ margin-top: $jv-space-6;
558
+ border: 1px solid $jv-border-subtle;
559
+
560
+ .quick-reply-header {
561
+ margin-bottom: $jv-space-4;
562
+ font-weight: 600;
563
+ color: $jv-text-main;
564
+ }
565
+
566
+ textarea,
567
+ .form-control {
568
+ border: 1px solid $jv-border-subtle;
569
+ border-radius: $jv-radius-sm;
570
+ padding: $jv-space-4;
571
+ font-size: $jv-font-size-base;
572
+ line-height: $jv-line-height-base;
573
+ resize: vertical;
574
+ min-height: 120px;
575
+ transition: border-color $jv-transition-fast, box-shadow $jv-transition-fast;
576
+
577
+ &:focus {
578
+ outline: none;
579
+ border-color: $jv-primary;
580
+ box-shadow: $jv-focus-ring;
581
+ }
582
+
583
+ &::placeholder { color: $jv-text-soft; }
584
+ }
585
+
586
+ .quick-reply-footer,
587
+ .composer-actions {
588
+ display: flex;
589
+ justify-content: flex-end;
590
+ gap: $jv-space-3;
591
+ margin-top: $jv-space-4;
592
+ }
593
+ }
594
+
595
+ // ===========================================================
596
+ // NESTED REPLIES
597
+ // ===========================================================
598
+ [component="post/replies/container"] {
599
+ margin-top: $jv-space-4;
600
+ padding-left: $jv-space-6;
601
+ border-left: 2px solid $jv-border-subtle;
602
+
603
+ [component="post"] {
604
+ margin-bottom: $jv-space-3;
605
+ padding: $jv-space-4;
606
+ background: rgba(0, 0, 0, 0.02);
607
+ border-radius: $jv-radius-sm;
608
+
609
+ .post-container { padding: 0; }
610
+ }
611
+ }
612
+
613
+ // ===========================================================
614
+ // REPLY COUNT ACCORDION
615
+ // ===========================================================
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;
623
+
624
+ &:hover {
625
+ background: $jv-hover-bg;
626
+ color: $jv-text-main;
627
+ }
628
+
629
+ .replies-count {
630
+ color: $jv-text-main;
631
+ font-weight: 600;
632
+ }
633
+ }
634
+ }
635
+
636
+ // ===========================================================
637
+ // RESPONSIVE ADJUSTMENTS
638
+ // ===========================================================
639
+ @media (max-width: 991px) {
640
+ body.template-topic {
641
+ .topic [component="post"] .post-container {
642
+ padding: $jv-space-4;
643
+ }
644
+
645
+ .post-header {
646
+ flex-wrap: wrap;
647
+ }
648
+
649
+ [component="post/actions"] {
650
+ gap: $jv-space-1;
651
+
652
+ .btn,
653
+ [component="post/reply"],
654
+ [component="post/quote"],
655
+ [component="post/bookmark"],
656
+ [component="post/upvote"],
657
+ [component="post/downvote"] {
658
+ padding: $jv-space-2;
659
+ span:not(.fa):not(.fas):not(.far):not(.fab) { display: none; }
660
+ }
661
+ }
662
+ }
663
+ }
664
+
665
+ @media (max-width: 767px) {
666
+ body.template-topic {
667
+ .topic-header h1,
668
+ .topic-header [component="topic/title"] {
669
+ font-size: 22px;
670
+ }
671
+
672
+ .quick-reply,
673
+ [component="topic/quickreply"] {
674
+ padding: $jv-space-4;
675
+ }
676
+
677
+ [component="post/replies/container"] {
678
+ padding-left: $jv-space-4;
679
+ }
680
+ }
681
+ }
@@ -87,3 +87,13 @@ $jv-focus-ring-offset: 0 0 0 2px $jv-surface, 0 0 0 4px $jv-primary;
87
87
  $jv-hover-bg: rgba(0, 0, 0, 0.04);
88
88
  $jv-active-bg: rgba(0, 0, 0, 0.08);
89
89
  $jv-selected-bg: rgba(0, 81, 255, 0.08);
90
+
91
+ // Semantic Colors
92
+ $jv-success: #10b981;
93
+ $jv-success-hover: #059669;
94
+ $jv-danger: #ef4444;
95
+ $jv-danger-hover: #dc2626;
96
+ $jv-warning: #f59e0b;
97
+ $jv-warning-hover: #d97706;
98
+ $jv-info: #3b82f6;
99
+ $jv-info-hover: #2563eb;