@okjavis/nodebb-theme-javis 1.1.0 → 1.3.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": "1.1.0",
3
+ "version": "1.3.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/_base.scss CHANGED
@@ -2,9 +2,10 @@
2
2
  // BASE STYLES – Core Layout + Typography
3
3
  // ============================================
4
4
 
5
- // Hide right sidebar completely (user profile moved to left sidebar)
6
- .sidebar-right,
7
- nav[component="sidebar/right"] {
5
+ // Hide Harmony's right navigation sidebar (user profile moved to left sidebar)
6
+ // Note: This targets the nav sidebar, NOT the widget area sidebar
7
+ nav[component="sidebar/right"],
8
+ .sidebar-right:not([data-widget-area]) {
8
9
  display: none !important;
9
10
  }
10
11
 
@@ -0,0 +1,610 @@
1
+ // ===========================================================
2
+ // FEED PLUGIN – Reddit-Style Post Cards
3
+ // Styles for nodebb-plugin-feed (/feed route)
4
+ // ===========================================================
5
+
6
+ // ===========================================================
7
+ // FEED CONTAINER
8
+ // ===========================================================
9
+ .feed {
10
+ // Header controls row
11
+ .d-flex.justify-content-between.py-2.mb-2 {
12
+ padding: $jv-space-4 0 !important;
13
+ margin-bottom: $jv-space-6 !important;
14
+
15
+ // New Topic button
16
+ #new_topic,
17
+ .btn-primary {
18
+ font-weight: 600;
19
+ padding: 10px 20px;
20
+ border-radius: $jv-radius-sm;
21
+ }
22
+
23
+ // Settings dropdown button
24
+ #options-dropdown {
25
+ .btn-ghost {
26
+ background: $jv-surface;
27
+ border: 1px solid $jv-border-subtle;
28
+ border-radius: $jv-radius-sm;
29
+ padding: 8px 12px;
30
+
31
+ &:hover {
32
+ background: rgba(0, 0, 0, 0.02);
33
+ border-color: $jv-border-strong;
34
+ }
35
+ }
36
+
37
+ .dropdown-menu {
38
+ background: $jv-surface;
39
+ border: 1px solid $jv-border-subtle;
40
+ border-radius: $jv-radius-md;
41
+ box-shadow: $jv-shadow-card;
42
+ padding: $jv-space-2;
43
+ }
44
+ }
45
+ }
46
+
47
+ // Empty state alert
48
+ .alert-warning {
49
+ background: $jv-surface;
50
+ border: 1px solid $jv-border-subtle;
51
+ border-radius: $jv-radius-lg;
52
+ color: $jv-text-muted;
53
+ padding: $jv-space-12;
54
+ }
55
+ }
56
+
57
+ // ===========================================================
58
+ // POSTS LIST
59
+ // ===========================================================
60
+ .feed ul[component="posts"] {
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: 0;
64
+ padding: 0;
65
+ margin: 0;
66
+ list-style: none;
67
+ }
68
+
69
+ // ===========================================================
70
+ // POST CARD – Main Styling
71
+ // ===========================================================
72
+ .feed li[component="post"].posts-list-item {
73
+ background: $jv-surface !important;
74
+ border: 1px solid $jv-border-subtle !important;
75
+ border-radius: $jv-radius-lg !important;
76
+ margin-bottom: $jv-space-4 !important;
77
+ box-shadow: none !important;
78
+ overflow: hidden;
79
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
80
+
81
+ &:hover {
82
+ border-color: $jv-border-strong !important;
83
+ box-shadow: $jv-shadow-soft !important;
84
+ }
85
+
86
+ // Deleted state
87
+ &.deleted {
88
+ opacity: 0.5;
89
+ }
90
+
91
+ // Scheduled state
92
+ &.scheduled {
93
+ border-left: 3px solid #f59e0b;
94
+ }
95
+ }
96
+
97
+ // ===========================================================
98
+ // THUMBNAIL IMAGE
99
+ // ===========================================================
100
+ .feed li[component="post"].posts-list-item {
101
+ > .p-1.position-relative {
102
+ padding: 0 !important;
103
+
104
+ .overflow-hidden {
105
+ border-radius: $jv-radius-lg $jv-radius-lg 0 0 !important;
106
+ max-height: 350px !important;
107
+
108
+ img {
109
+ width: 100%;
110
+ object-fit: cover;
111
+ }
112
+ }
113
+
114
+ // Additional thumbnails
115
+ .position-absolute {
116
+ padding: $jv-space-4 !important;
117
+
118
+ img {
119
+ border: 2px solid $jv-surface;
120
+ box-shadow: $jv-shadow-soft;
121
+ }
122
+ }
123
+ }
124
+ }
125
+
126
+ // ===========================================================
127
+ // POST CONTENT AREA
128
+ // ===========================================================
129
+ .feed li[component="post"].posts-list-item {
130
+ > .d-flex.gap-2.p-3 {
131
+ padding: $jv-space-6 !important;
132
+ gap: $jv-space-4 !important;
133
+ }
134
+
135
+ // Avatar
136
+ .d-none.d-lg-block {
137
+ .avatar,
138
+ img[class*="avatar"] {
139
+ width: 44px !important;
140
+ height: 44px !important;
141
+ border-radius: 50% !important;
142
+ object-fit: cover;
143
+ border: 2px solid rgba(0, 0, 0, 0.05);
144
+ }
145
+ }
146
+
147
+ // Post body
148
+ .post-body {
149
+ gap: $jv-space-4 !important;
150
+ }
151
+ }
152
+
153
+ // ===========================================================
154
+ // TOPIC TITLE
155
+ // ===========================================================
156
+ .feed li[component="post"].posts-list-item {
157
+ .topic-title {
158
+ font-size: 18px !important;
159
+ font-weight: 600 !important;
160
+ line-height: 1.35 !important;
161
+ color: $jv-text-main !important;
162
+ margin-bottom: $jv-space-2;
163
+
164
+ &:hover {
165
+ color: $jv-primary !important;
166
+ }
167
+ }
168
+ }
169
+
170
+ // ===========================================================
171
+ // POST META (Author, Time)
172
+ // ===========================================================
173
+ .feed li[component="post"].posts-list-item {
174
+ .post-info {
175
+ font-size: 13px !important;
176
+ color: $jv-text-muted;
177
+ gap: $jv-space-2 !important;
178
+
179
+ .post-author {
180
+ a {
181
+ color: $jv-text-main;
182
+ font-weight: 600;
183
+
184
+ &:hover {
185
+ color: $jv-primary;
186
+ }
187
+ }
188
+
189
+ // Mobile avatar
190
+ .avatar,
191
+ img[class*="avatar"] {
192
+ width: 18px !important;
193
+ height: 18px !important;
194
+ border-radius: 50% !important;
195
+ }
196
+ }
197
+
198
+ .timeago {
199
+ color: $jv-text-soft !important;
200
+ }
201
+ }
202
+ }
203
+
204
+ // ===========================================================
205
+ // POST CONTENT
206
+ // ===========================================================
207
+ .feed li[component="post"].posts-list-item {
208
+ .content[component="post/content"] {
209
+ font-size: 14px !important;
210
+ line-height: 1.6 !important;
211
+ color: $jv-text-muted;
212
+
213
+ // Truncation styles (from plugin)
214
+ &.truncate-post-content {
215
+ max-height: 150px;
216
+ overflow: hidden;
217
+ position: relative;
218
+
219
+ &::after {
220
+ content: '';
221
+ position: absolute;
222
+ bottom: 0;
223
+ left: 0;
224
+ right: 0;
225
+ height: 40px;
226
+ background: linear-gradient(transparent, $jv-surface);
227
+ pointer-events: none;
228
+ }
229
+ }
230
+
231
+ // Links in content
232
+ a:not(.stretched-link) {
233
+ color: $jv-primary;
234
+
235
+ &:hover {
236
+ text-decoration: underline;
237
+ }
238
+ }
239
+
240
+ // Images in content
241
+ img {
242
+ max-width: 100%;
243
+ border-radius: $jv-radius-sm;
244
+ }
245
+
246
+ // Code blocks
247
+ pre, code {
248
+ background: rgba(0, 0, 0, 0.03);
249
+ border-radius: $jv-radius-xs;
250
+ font-size: 13px;
251
+ }
252
+
253
+ pre {
254
+ padding: $jv-space-4;
255
+ }
256
+
257
+ code {
258
+ padding: 2px 6px;
259
+ }
260
+ }
261
+
262
+ // See more button
263
+ [component="show/more"] {
264
+ background: $jv-surface !important;
265
+ border: 1px solid $jv-border-subtle !important;
266
+ color: $jv-primary !important;
267
+ font-weight: 600;
268
+ padding: 6px 16px;
269
+ box-shadow: $jv-shadow-soft;
270
+
271
+ &:hover {
272
+ background: $jv-primary-soft !important;
273
+ border-color: $jv-primary !important;
274
+ }
275
+ }
276
+ }
277
+
278
+ // ===========================================================
279
+ // DIVIDER
280
+ // ===========================================================
281
+ .feed li[component="post"].posts-list-item {
282
+ hr {
283
+ border-color: $jv-border-subtle !important;
284
+ margin: $jv-space-4 0 !important;
285
+ opacity: 1;
286
+ }
287
+ }
288
+
289
+ // ===========================================================
290
+ // ACTION BAR (Comments, Bookmark, Upvote, Reply)
291
+ // ===========================================================
292
+ .feed li[component="post"].posts-list-item {
293
+ .d-flex.justify-content-between:last-child {
294
+ margin: 0 (-$jv-space-2);
295
+
296
+ .btn-link {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ gap: 6px;
300
+ padding: 8px 12px !important;
301
+ font-size: 13px !important;
302
+ font-weight: 600 !important;
303
+ color: $jv-text-muted !important;
304
+ background: transparent;
305
+ border: none;
306
+ border-radius: $jv-radius-sm;
307
+ text-decoration: none !important;
308
+ transition: background-color 0.15s ease, color 0.15s ease;
309
+
310
+ &:hover {
311
+ background: rgba(0, 0, 0, 0.04);
312
+ color: $jv-text-main !important;
313
+ }
314
+
315
+ i {
316
+ font-size: 16px;
317
+ }
318
+
319
+ // Comments button
320
+ &[href*="post"]:first-child {
321
+ i {
322
+ color: $jv-text-soft;
323
+ }
324
+
325
+ &:hover i {
326
+ color: $jv-primary;
327
+ }
328
+ }
329
+
330
+ // Bookmark button
331
+ &[data-action="bookmark"] {
332
+ &[data-bookmarked="true"] {
333
+ color: $jv-primary !important;
334
+
335
+ i {
336
+ color: $jv-primary !important;
337
+ }
338
+ }
339
+
340
+ &:hover {
341
+ background: rgba(0, 81, 255, 0.06);
342
+ }
343
+ }
344
+
345
+ // Upvote button
346
+ &[data-action="upvote"] {
347
+ &[data-upvoted="true"] {
348
+ color: #ef4444 !important;
349
+
350
+ i {
351
+ color: #ef4444 !important;
352
+ }
353
+ }
354
+
355
+ &:hover {
356
+ background: rgba(239, 68, 68, 0.06);
357
+
358
+ i {
359
+ color: #ef4444;
360
+ }
361
+ }
362
+ }
363
+
364
+ // Reply button
365
+ &[data-action="reply"] {
366
+ &:hover {
367
+ background: rgba(0, 81, 255, 0.06);
368
+
369
+ i {
370
+ color: $jv-primary;
371
+ }
372
+ }
373
+ }
374
+ }
375
+ }
376
+ }
377
+
378
+ // ===========================================================
379
+ // RESPONSIVE
380
+ // ===========================================================
381
+ @media (max-width: 992px) {
382
+ .feed li[component="post"].posts-list-item {
383
+ border-radius: $jv-radius-md !important;
384
+ margin-bottom: $jv-space-2 !important;
385
+
386
+ > .d-flex.gap-2.p-3 {
387
+ padding: $jv-space-4 !important;
388
+ }
389
+
390
+ .topic-title {
391
+ font-size: 16px !important;
392
+ }
393
+
394
+ .d-flex.justify-content-between:last-child {
395
+ .btn-link {
396
+ padding: 6px 8px !important;
397
+ font-size: 12px !important;
398
+
399
+ span {
400
+ display: none;
401
+ }
402
+ }
403
+ }
404
+ }
405
+ }
406
+
407
+ @media (max-width: 576px) {
408
+ .feed li[component="post"].posts-list-item {
409
+ .topic-title {
410
+ font-size: 15px !important;
411
+ }
412
+
413
+ .content[component="post/content"] {
414
+ font-size: 13px !important;
415
+ }
416
+
417
+ .d-flex.justify-content-between:last-child {
418
+ .btn-link {
419
+ padding: 6px !important;
420
+
421
+ i {
422
+ font-size: 14px;
423
+ }
424
+ }
425
+ }
426
+ }
427
+ }
428
+
429
+ // ===========================================================
430
+ // CATEGORIES LIST – Reddit-Style Category Cards
431
+ // Styles for world.tpl (/categories route)
432
+ // ===========================================================
433
+
434
+ // ===========================================================
435
+ // CATEGORIES LIST CONTAINER
436
+ // ===========================================================
437
+ ul.categories-list {
438
+ display: flex !important;
439
+ flex-direction: column;
440
+ gap: 0;
441
+ padding: 0 !important;
442
+ margin: 0;
443
+ list-style: none;
444
+ }
445
+
446
+ // ===========================================================
447
+ // CATEGORY CARD – Main Styling
448
+ // ===========================================================
449
+ .categories-list > li[component="categories/category"] {
450
+ background: $jv-surface !important;
451
+ border: 1px solid $jv-border-subtle !important;
452
+ border-radius: $jv-radius-lg !important;
453
+ margin-bottom: $jv-space-4 !important;
454
+ padding: $jv-space-6 !important;
455
+ overflow: hidden;
456
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
457
+
458
+ &:hover {
459
+ border-color: $jv-border-strong !important;
460
+ box-shadow: $jv-shadow-soft !important;
461
+ }
462
+
463
+ // Category icon
464
+ .category-icon {
465
+ width: 48px !important;
466
+ height: 48px !important;
467
+ border-radius: $jv-radius-md !important;
468
+ display: flex;
469
+ align-items: center;
470
+ justify-content: center;
471
+ font-size: 20px;
472
+ flex-shrink: 0;
473
+ }
474
+
475
+ // Category header with icon and title
476
+ .category-header {
477
+ display: flex;
478
+ align-items: flex-start;
479
+ gap: $jv-space-4;
480
+ }
481
+
482
+ // Category title
483
+ .category-name,
484
+ h2 a,
485
+ .title a {
486
+ font-size: 18px !important;
487
+ font-weight: 600 !important;
488
+ line-height: 1.35 !important;
489
+ color: $jv-text-main !important;
490
+ text-decoration: none !important;
491
+
492
+ &:hover {
493
+ color: $jv-primary !important;
494
+ }
495
+ }
496
+
497
+ // Category description
498
+ .category-description,
499
+ .description {
500
+ font-size: 14px !important;
501
+ line-height: 1.5 !important;
502
+ color: $jv-text-muted;
503
+ margin-top: $jv-space-2;
504
+ margin-bottom: 0;
505
+ }
506
+
507
+ // Stats row (topics, posts count)
508
+ .category-stat,
509
+ .stat {
510
+ font-size: 13px !important;
511
+ color: $jv-text-soft;
512
+
513
+ strong,
514
+ .human-readable-number {
515
+ color: $jv-text-muted;
516
+ font-weight: 600;
517
+ }
518
+ }
519
+
520
+ // Teaser (latest post preview)
521
+ .category-teaser,
522
+ .teaser {
523
+ margin-top: $jv-space-4;
524
+ padding-top: $jv-space-4;
525
+ border-top: 1px solid $jv-border-subtle;
526
+
527
+ .avatar {
528
+ width: 24px !important;
529
+ height: 24px !important;
530
+ border-radius: 50% !important;
531
+ }
532
+
533
+ .timeago {
534
+ font-size: 12px !important;
535
+ color: $jv-text-soft;
536
+ }
537
+
538
+ a {
539
+ color: $jv-text-muted;
540
+ font-size: 13px;
541
+
542
+ &:hover {
543
+ color: $jv-primary;
544
+ }
545
+ }
546
+ }
547
+
548
+ // Children categories
549
+ .category-children {
550
+ margin-top: $jv-space-4;
551
+ padding-top: $jv-space-4;
552
+ border-top: 1px solid $jv-border-subtle;
553
+
554
+ .category-children-item {
555
+ display: inline-flex;
556
+ align-items: center;
557
+ gap: $jv-space-2;
558
+ padding: $jv-space-2 $jv-space-4;
559
+ background: rgba(0, 0, 0, 0.02);
560
+ border-radius: $jv-radius-sm;
561
+ margin-right: $jv-space-2;
562
+ margin-bottom: $jv-space-2;
563
+ font-size: 13px;
564
+ color: $jv-text-muted;
565
+
566
+ &:hover {
567
+ background: rgba(0, 0, 0, 0.04);
568
+ color: $jv-primary;
569
+ }
570
+ }
571
+ }
572
+ }
573
+
574
+ // ===========================================================
575
+ // CATEGORIES RESPONSIVE
576
+ // ===========================================================
577
+ @media (max-width: 992px) {
578
+ .categories-list > li[component="categories/category"] {
579
+ border-radius: $jv-radius-md !important;
580
+ margin-bottom: $jv-space-2 !important;
581
+ padding: $jv-space-4 !important;
582
+
583
+ .category-icon {
584
+ width: 40px !important;
585
+ height: 40px !important;
586
+ font-size: 18px;
587
+ }
588
+
589
+ .category-name,
590
+ h2 a,
591
+ .title a {
592
+ font-size: 16px !important;
593
+ }
594
+ }
595
+ }
596
+
597
+ @media (max-width: 576px) {
598
+ .categories-list > li[component="categories/category"] {
599
+ .category-name,
600
+ h2 a,
601
+ .title a {
602
+ font-size: 15px !important;
603
+ }
604
+
605
+ .category-description,
606
+ .description {
607
+ font-size: 13px !important;
608
+ }
609
+ }
610
+ }
@@ -3,12 +3,67 @@
3
3
  // Modern, clean sidebar with card-based widgets
4
4
  // ===========================================================
5
5
 
6
+ // ===========================================================
7
+ // JAVIS SIDEBAR LOGO
8
+ // ===========================================================
9
+ .javis-sidebar-logo {
10
+ display: flex;
11
+ align-items: center;
12
+ justify-content: center;
13
+ padding: $jv-space-6 $jv-space-4; // 12px top/bottom, 8px left/right
14
+ margin-bottom: $jv-space-4; // 8px gap before nav - industry standard
15
+ border-bottom: 1px solid $jv-border-subtle;
16
+ flex-shrink: 0;
17
+
18
+ .javis-logo-link {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ text-decoration: none;
23
+ }
24
+
25
+ // Icon logo (collapsed state) - 32x32px
26
+ .javis-logo-icon {
27
+ width: 32px;
28
+ height: 32px;
29
+ object-fit: contain;
30
+ }
31
+
32
+ // Full logo (expanded state) - max 140px width
33
+ .javis-logo-full {
34
+ max-width: 140px;
35
+ height: 32px;
36
+ object-fit: contain;
37
+ }
38
+ }
39
+
40
+ // Adjust when sidebar is open
41
+ .sidebar-left.open .javis-sidebar-logo {
42
+ padding: $jv-space-6 $jv-space-10; // 12px vertical, 20px horizontal when expanded
43
+ justify-content: flex-start;
44
+ }
45
+
6
46
  // ===========================================================
7
47
  // LEFT SIDEBAR (Main Navigation)
8
48
  // ===========================================================
9
49
  .sidebar {
10
50
  background: $jv-surface;
11
51
  border-right: 1px solid $jv-border-subtle;
52
+ padding-top: 0 !important; // Remove top padding so logo sits at top edge
53
+
54
+ // Main navigation list
55
+ #main-nav {
56
+ // No gap class - we control spacing per nav-item instead
57
+ }
58
+
59
+ // Nav items - proper spacing between items
60
+ .nav-item {
61
+ margin-bottom: $jv-space-2; // 4px between nav items - compact like Slack/Discord
62
+
63
+ &:last-child {
64
+ margin-bottom: 0; // No margin on last item
65
+ }
66
+ }
12
67
 
13
68
  // Sidebar navigation links
14
69
  .nav-link {
@@ -21,7 +76,6 @@
21
76
  font-weight: 500;
22
77
  border-radius: $jv-radius-sm;
23
78
  transition: all 0.15s ease;
24
- margin: 2px 0;
25
79
 
26
80
  i {
27
81
  width: 18px;
@@ -537,3 +591,225 @@ div[data-widget-area="right"] h8 {
537
591
  }
538
592
  }
539
593
  }
594
+
595
+ // ===========================================================
596
+ // RIGHT SIDEBAR WIDGET AREA (Reddit-style)
597
+ // ===========================================================
598
+ div[data-widget-area="sidebar"],
599
+ .col-lg-3[data-widget-area="sidebar"] {
600
+ display: flex;
601
+ flex-direction: column;
602
+ gap: $jv-space-6;
603
+
604
+ // Widget card container
605
+ > div {
606
+ background: $jv-surface;
607
+ border: 1px solid $jv-border-subtle;
608
+ border-radius: $jv-radius-lg;
609
+ overflow: hidden;
610
+ }
611
+
612
+ // Widget header/title
613
+ h5, h6, .widget-title {
614
+ font-size: 12px !important;
615
+ font-weight: 700 !important;
616
+ text-transform: uppercase;
617
+ letter-spacing: 0.5px;
618
+ color: $jv-text-soft;
619
+ padding: $jv-space-6 $jv-space-6 $jv-space-4;
620
+ margin: 0 !important;
621
+ border-bottom: 1px solid $jv-border-subtle;
622
+ background: rgba(0, 0, 0, 0.015);
623
+ }
624
+ }
625
+
626
+ // ===========================================================
627
+ // POPULAR TAGS WIDGET (Sidebar)
628
+ // ===========================================================
629
+ div[data-widget-area="sidebar"] {
630
+ .popular-tags,
631
+ [class*="tag"] {
632
+ padding: $jv-space-4;
633
+
634
+ // Tag items grid
635
+ .tag-list,
636
+ > div {
637
+ display: flex;
638
+ flex-direction: column;
639
+ gap: $jv-space-2;
640
+
641
+ > div,
642
+ > a {
643
+ display: flex;
644
+ align-items: center;
645
+ justify-content: space-between;
646
+ padding: $jv-space-4 $jv-space-4;
647
+ background: transparent;
648
+ border: none;
649
+ border-radius: $jv-radius-sm;
650
+ color: $jv-text-main;
651
+ font-size: 14px;
652
+ font-weight: 500;
653
+ text-decoration: none;
654
+ transition: background-color 0.15s ease;
655
+ cursor: pointer;
656
+
657
+ &:hover {
658
+ background: rgba(0, 81, 255, 0.06);
659
+ color: $jv-primary;
660
+ }
661
+
662
+ // Topic count
663
+ small,
664
+ .count,
665
+ span:last-child {
666
+ font-size: 12px;
667
+ color: $jv-text-soft;
668
+ font-weight: 400;
669
+ }
670
+ }
671
+ }
672
+ }
673
+ }
674
+
675
+ // ===========================================================
676
+ // RECENT/TRENDING POSTS WIDGET (Sidebar)
677
+ // ===========================================================
678
+ div[data-widget-area="sidebar"] {
679
+ #recent_posts,
680
+ .recent-posts,
681
+ ul {
682
+ list-style: none;
683
+ padding: 0;
684
+ margin: 0;
685
+
686
+ li {
687
+ padding: $jv-space-4 $jv-space-6;
688
+ border-bottom: 1px solid $jv-border-subtle;
689
+ transition: background-color 0.15s ease;
690
+
691
+ &:last-child {
692
+ border-bottom: none;
693
+ }
694
+
695
+ &:hover {
696
+ background: rgba(0, 0, 0, 0.02);
697
+ }
698
+
699
+ // Post header with avatar
700
+ .d-flex {
701
+ display: flex;
702
+ align-items: center;
703
+ gap: $jv-space-2;
704
+ margin-bottom: $jv-space-2;
705
+
706
+ // Avatar
707
+ .avatar,
708
+ img[class*="avatar"] {
709
+ width: 20px !important;
710
+ height: 20px !important;
711
+ border-radius: 50%;
712
+ flex-shrink: 0;
713
+ }
714
+
715
+ // Username
716
+ a:first-of-type {
717
+ font-size: 12px;
718
+ font-weight: 600;
719
+ color: $jv-text-main;
720
+ text-decoration: none;
721
+
722
+ &:hover {
723
+ color: $jv-primary;
724
+ }
725
+ }
726
+
727
+ // Timeago
728
+ .timeago {
729
+ font-size: 11px;
730
+ color: $jv-text-soft;
731
+ }
732
+ }
733
+
734
+ // Post title/content
735
+ > a,
736
+ .post-content a,
737
+ p {
738
+ display: block;
739
+ font-size: 13px;
740
+ font-weight: 500;
741
+ color: $jv-text-main;
742
+ text-decoration: none;
743
+ line-height: 1.4;
744
+ margin-bottom: $jv-space-2;
745
+
746
+ // Line clamp
747
+ display: -webkit-box;
748
+ -webkit-line-clamp: 2;
749
+ -webkit-box-orient: vertical;
750
+ overflow: hidden;
751
+
752
+ &:hover {
753
+ color: $jv-primary;
754
+ }
755
+ }
756
+
757
+ // Content preview text
758
+ .post-content,
759
+ .content,
760
+ .text-xs {
761
+ font-size: 12px;
762
+ color: $jv-text-muted;
763
+ line-height: 1.45;
764
+ display: -webkit-box;
765
+ -webkit-line-clamp: 2;
766
+ -webkit-box-orient: vertical;
767
+ overflow: hidden;
768
+ }
769
+
770
+ // Read more link
771
+ a.stretched-link,
772
+ .read-more {
773
+ font-size: 12px;
774
+ font-weight: 600;
775
+ color: $jv-primary;
776
+ text-decoration: none;
777
+ margin-top: $jv-space-2;
778
+ display: inline-block;
779
+
780
+ &:hover {
781
+ text-decoration: underline;
782
+ }
783
+ }
784
+ }
785
+ }
786
+ }
787
+
788
+ // ===========================================================
789
+ // WIDGET HEADER ICONS
790
+ // ===========================================================
791
+ div[data-widget-area="sidebar"] {
792
+ h5, h6, .widget-title {
793
+ display: flex;
794
+ align-items: center;
795
+ gap: $jv-space-2;
796
+
797
+ i {
798
+ font-size: 14px;
799
+ color: $jv-text-soft;
800
+ }
801
+ }
802
+ }
803
+
804
+ // ===========================================================
805
+ // EMPTY STATE
806
+ // ===========================================================
807
+ div[data-widget-area="sidebar"] {
808
+ .empty,
809
+ .no-content {
810
+ padding: $jv-space-8;
811
+ text-align: center;
812
+ color: $jv-text-soft;
813
+ font-size: $jv-font-size-sm;
814
+ }
815
+ }
Binary file
Binary file
@@ -0,0 +1,11 @@
1
+ {{{ if widgets.brand-header.length }}}
2
+ <div class="container-lg px-md-4 brand-container">
3
+ <div class="col-12 d-flex border-bottom pb-3 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
4
+ <div data-widget-area="brand-header" class="flex-fill gap-3 p-2 align-self-center">
5
+ {{{each widgets.brand-header}}}
6
+ {{./html}}
7
+ {{{end}}}
8
+ </div>
9
+ </div>
10
+ </div>
11
+ {{{ end }}}
@@ -1,5 +1,15 @@
1
1
  <nav component="sidebar/left" class="{{{ if config.theme.openSidebars}}}open{{{ end }}} text-dark bg-light sidebar sidebar-left start-0 border-end vh-100 d-none d-lg-flex flex-column justify-content-between sticky-top">
2
- <ul id="main-nav" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2 overflow-y-auto">
2
+ <!-- JAVIS Logo Section -->
3
+ <div class="javis-sidebar-logo">
4
+ <a href="{relative_path}/" class="javis-logo-link" title="JAVIS Community">
5
+ <!-- Icon logo (shown when collapsed) -->
6
+ <img src="{relative_path}/plugins/@okjavis/nodebb-theme-javis/static/images/logo-icon.png" alt="JAVIS" class="javis-logo-icon visible-closed" />
7
+ <!-- Full logo (shown when expanded) -->
8
+ <img src="{relative_path}/plugins/@okjavis/nodebb-theme-javis/static/images/logo-full.png" alt="JAVIS Community" class="javis-logo-full visible-open" />
9
+ </a>
10
+ </div>
11
+
12
+ <ul id="main-nav" class="list-unstyled d-flex flex-column w-100 overflow-y-auto">
3
13
  {{{ each navigation }}}
4
14
  {{{ if displayMenuItem(@root, @index) }}}
5
15
  <li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
package/theme.scss CHANGED
@@ -18,3 +18,4 @@
18
18
  @import "./scss/sidebar";
19
19
  @import "./scss/sidebar-user";
20
20
  @import "./scss/categories";
21
+ @import "./scss/feed";