@okjavis/nodebb-theme-javis 1.6.0 → 1.7.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.6.0",
3
+ "version": "1.7.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
@@ -41,8 +41,8 @@ nav[component="sidebar/left"] {
41
41
  padding: 0 20px; // Reddit-style horizontal padding
42
42
  justify-content: center; // Center the columns
43
43
 
44
- // Equal gap between columns (Reddit uses ~16-20px)
45
- gap: 20px;
44
+ // Gap between columns
45
+ gap: $jv-space-8; // 32px
46
46
 
47
47
  // Adjust column widths for better proportions
48
48
  > [data-widget-area="left"] {
package/scss/_cards.scss CHANGED
@@ -279,6 +279,20 @@
279
279
  gap: $jv-space-3; // 12dp - Material grid
280
280
  padding-top: $jv-space-3; // 12dp - Material grid
281
281
  margin-top: auto;
282
+ border-top: none !important; // Remove any border-top
283
+
284
+ // Hide hr element if present
285
+ hr {
286
+ display: none !important;
287
+ }
288
+ }
289
+
290
+ // Hide hr elements within topic cards globally
291
+ .topic-card hr,
292
+ .topic-content hr,
293
+ li[component="post"] hr,
294
+ [component="post"] hr {
295
+ display: none !important;
282
296
  }
283
297
 
284
298
  .action-btn {
@@ -51,11 +51,6 @@
51
51
  border-right: 1px solid $jv-border-subtle;
52
52
  padding-top: 0 !important; // Remove top padding so logo sits at top edge
53
53
 
54
- // Main navigation list
55
- #main-nav {
56
- // No gap class - we control spacing per nav-item instead
57
- }
58
-
59
54
  // Nav items - proper spacing between items
60
55
  .nav-item {
61
56
  margin-bottom: $jv-space-2; // 4px between nav items - compact like Slack/Discord
@@ -177,129 +172,6 @@ div[data-widget-area] {
177
172
  }
178
173
  }
179
174
 
180
- // Widget titles
181
- .widget-title,
182
- div[data-widget-area] h5,
183
- div[data-widget-area] h6,
184
- div[data-widget-area="right"] h5,
185
- div[data-widget-area="right"] h8 {
186
- font-size: 14px;
187
- font-weight: 700;
188
- margin-bottom: $jv-space-6;
189
- color: $jv-text-main;
190
- text-transform: uppercase;
191
- letter-spacing: 0.3px;
192
- }
193
-
194
- // ===========================================================
195
- // TRENDING TAGS
196
- // ===========================================================
197
-
198
- .popular-tags {
199
- gap: 6px;
200
-
201
- .tag-list > div {
202
- background: $jv-surface;
203
- border: 1px solid $jv-border-subtle;
204
- border-radius: 10px;
205
- padding: 10px 12px;
206
- font-size: 14px;
207
- color: $jv-text-main;
208
- display: flex;
209
- flex-direction: column;
210
- gap: 2px;
211
- cursor: pointer;
212
- transition: border-color $jv-transition-fast, background-color $jv-transition-fast; // Modern transitions
213
-
214
- &:hover {
215
- border-color: $jv-border-strong; // Consistent border
216
- background: $jv-hover-bg; // Consistent hover state
217
- }
218
-
219
- // Focus state for accessibility
220
- &:focus-visible {
221
- outline: none;
222
- box-shadow: $jv-focus-ring;
223
- }
224
-
225
- small {
226
- color: $jv-text-muted;
227
- font-size: $jv-font-size-xs;
228
- }
229
- }
230
- }
231
-
232
- // ===========================================================
233
- // TRENDING NOW
234
- // ===========================================================
235
-
236
- #recent_posts {
237
- display: flex;
238
- flex-direction: column;
239
- gap: 10px;
240
- margin-top: $jv-space-6;
241
-
242
- li.widget-posts {
243
- background: $jv-surface;
244
- border: 1px solid rgba(0,0,0,0.05);
245
- border-radius: $jv-radius-md;
246
- padding: 10px 14px;
247
- display: flex;
248
- flex-direction: column;
249
- gap: $jv-space-4;
250
- transition: $jv-transition-shadow, border-color $jv-transition-fast; // Modern transitions
251
-
252
- &:hover {
253
- border-color: $jv-border-strong; // Consistent border
254
- box-shadow: $jv-shadow-sm; // shadcn subtle shadow
255
- }
256
-
257
- // Focus state for accessibility
258
- &:focus-within {
259
- outline: none;
260
- box-shadow: $jv-shadow-md, $jv-focus-ring;
261
- }
262
-
263
- // Meta info
264
- .d-flex.gap-2,
265
- .timeago {
266
- font-size: $jv-font-size-xs;
267
- color: $jv-text-muted;
268
- }
269
-
270
- // Title inside mini post
271
- a {
272
- font-size: 14px;
273
- font-weight: 500;
274
- color: $jv-text-main;
275
- text-decoration: none;
276
- line-height: $jv-line-height-tight;
277
-
278
- &:hover {
279
- color: $jv-primary;
280
- }
281
- }
282
-
283
- // 2-line clamp for content preview
284
- p,
285
- .content {
286
- display: -webkit-box;
287
- -webkit-line-clamp: 2;
288
- -webkit-box-orient: vertical;
289
- overflow: hidden;
290
- font-size: $jv-font-size-sm;
291
- color: $jv-text-muted;
292
- margin: 0;
293
- }
294
-
295
- // Read more alignment
296
- a.stretched-link {
297
- font-size: $jv-font-size-xs;
298
- color: $jv-primary;
299
- }
300
- }
301
- }
302
-
303
175
  // ===========================================================
304
176
  // SEARCH WIDGET
305
177
  // ===========================================================
@@ -643,7 +515,7 @@ div[data-widget-area="right"],
643
515
 
644
516
  // Sticky positioning - stays visible when scrolling
645
517
  position: sticky;
646
- top: 80px; // Adjust based on your header height
518
+ top: 36px; // Adjust based on your header height
647
519
  align-self: flex-start;
648
520
  max-height: calc(100vh - 100px); // Account for header + padding
649
521
  overflow-y: auto; // Allow scrolling if content is too tall
@@ -681,9 +553,9 @@ div[data-widget-area="right"],
681
553
  text-transform: uppercase;
682
554
  letter-spacing: 0.5px;
683
555
  color: $jv-text-soft;
684
- padding: $jv-space-4 $jv-space-4;
685
- margin: 0 0 $jv-space-4 0 !important;
686
- border-bottom: 1px solid $jv-border-subtle;
556
+ padding: $jv-space-4 $jv-space-4 $jv-space-4 $jv-space-4;
557
+ margin: 0 !important;
558
+ border-bottom: none !important; // Removed border
687
559
  }
688
560
 
689
561
  // Add spacing between widgets
@@ -693,135 +565,290 @@ div[data-widget-area="right"],
693
565
  }
694
566
 
695
567
  // ===========================================================
696
- // POPULAR TAGS WIDGET (Sidebar) - Reddit-style vertical list
568
+ // TRENDING TAGS WIDGET (Sidebar) - Pill-style flowing tags
697
569
  // ===========================================================
698
570
  div[data-widget-area="right"] {
571
+ // Remove outer card for tags widget - let it flow directly
572
+ > div:has(.popular-tags) {
573
+ background: transparent !important;
574
+ border: none !important;
575
+ border-radius: 0 !important;
576
+ overflow: visible !important;
577
+
578
+ // Keep the header styled
579
+ h5 {
580
+ padding: $jv-space-3 0 !important;
581
+ border-bottom: none !important;
582
+ }
583
+ }
584
+
699
585
  .popular-tags {
700
- width: 100% !important;
586
+ padding: 0 !important;
587
+ margin: 0;
701
588
  }
702
589
 
590
+ // Override Bootstrap's grid - make it a flowing wrap layout
703
591
  .tag-list {
592
+ display: flex !important;
593
+ flex-wrap: wrap !important;
594
+ gap: $jv-space-2 !important; // 8px gap between pills
704
595
  padding: 0 !important;
705
596
  margin: 0 !important;
706
- width: 100% !important;
707
-
708
- // Override Bootstrap grid classes to force vertical layout
709
- display: flex !important;
710
- flex-direction: column !important;
711
597
 
712
- // Remove any grid/row styling
598
+ // Reset Bootstrap row/column styles
713
599
  &.row {
714
- --bs-gutter-x: 0 !important;
715
- --bs-gutter-y: 0 !important;
716
600
  margin: 0 !important;
601
+ display: flex !important;
602
+ flex-wrap: wrap !important;
717
603
  }
718
604
 
719
- // Force each tag to be full width (override col classes)
720
- > * {
721
- width: 100% !important;
722
- max-width: 100% !important;
723
- flex: 0 0 100% !important;
605
+ // Reset column divs - let them be inline
606
+ > div {
607
+ flex: none !important;
608
+ width: auto !important;
724
609
  padding: 0 !important;
610
+ margin: 0 !important;
611
+ max-width: none !important;
725
612
  }
726
613
 
614
+ // Style each tag as a compact pill
727
615
  .btn-ghost,
728
616
  a.btn-ghost {
729
- display: flex !important;
730
- flex-direction: column !important;
731
- align-items: flex-start !important;
732
- background: transparent !important;
733
- border: none !important;
734
- border-radius: 0 !important;
735
- padding: $jv-space-3 $jv-space-4 !important;
736
- transition: background-color $jv-transition-fast !important;
737
- text-align: left !important;
738
- width: 100% !important;
739
- margin: 0 !important;
617
+ display: inline-flex !important;
618
+ flex-direction: row !important;
619
+ align-items: center !important;
620
+ gap: $jv-space-1 !important; // 4px between tag name and count
621
+ background: rgba(0, 0, 0, 0.04) !important;
622
+ border: 1px solid transparent !important;
623
+ border-radius: $jv-radius-pill !important;
624
+ // [Enhancement 5] Increased padding for better touch targets
625
+ padding: $jv-space-2 $jv-space-3 !important; // 8px vertical, 12px horizontal
626
+ transition: all $jv-transition-fast !important;
627
+ text-decoration: none !important;
628
+ width: auto !important;
629
+ min-height: auto !important;
740
630
 
741
631
  &:hover {
742
- background: $jv-hover-bg !important;
632
+ background: $jv-primary-soft !important;
633
+ color: $jv-primary !important;
634
+ // [Enhancement 6] Subtle shadow on hover
635
+ box-shadow: $jv-shadow-xs !important;
636
+ transform: translateY(-1px);
637
+
638
+ .tag-item {
639
+ color: $jv-primary !important;
640
+ }
641
+
642
+ .tag-topic-count {
643
+ color: $jv-primary !important;
644
+ opacity: 0.7;
645
+ }
646
+ }
647
+
648
+ &:focus-visible {
649
+ outline: none;
650
+ box-shadow: $jv-focus-ring;
743
651
  }
744
652
 
745
653
  .tag-item {
746
- font-size: 14px !important;
747
- font-weight: 600 !important;
654
+ font-size: $jv-font-size-xs !important; // 12px
655
+ font-weight: 500 !important;
748
656
  color: $jv-text-main !important;
749
- margin-bottom: $jv-space-1 !important;
657
+ line-height: 1.2 !important;
658
+ margin: 0 !important;
659
+
660
+ // [Enhancement 2] Add # icon before tag name
661
+ &::before {
662
+ content: "#";
663
+ color: $jv-text-soft;
664
+ margin-right: 2px;
665
+ font-weight: 400;
666
+ }
750
667
  }
751
668
 
752
669
  .tag-topic-count {
753
- font-size: 12px !important;
670
+ font-size: $jv-font-size-xs !important; // 12px
754
671
  font-weight: 400 !important;
755
672
  color: $jv-text-soft !important;
673
+ line-height: 1 !important;
674
+
675
+ // Show count in parentheses style
676
+ &::before {
677
+ content: "(";
678
+ }
679
+ &::after {
680
+ content: ")";
681
+ }
682
+ }
683
+
684
+ // [Enhancement 3] Color-code tags by popularity
685
+ // Tags with topics get slightly darker background
686
+ &[data-tag]:not([data-count="0"]) {
687
+ background: rgba(0, 0, 0, 0.06) !important;
688
+
689
+ .tag-item {
690
+ font-weight: 600 !important;
691
+ }
756
692
  }
757
693
  }
758
694
  }
759
695
 
760
- }
696
+ // ===========================================================
697
+ // TRENDING POSTS WIDGET - Widget Essentials Specific
698
+ // ===========================================================
761
699
 
762
- // ===========================================================
763
- // RECENT/TRENDING POSTS WIDGET (Sidebar) - Widget Essentials Specific
764
- // ===========================================================
765
- div[data-widget-area="right"] {
766
- // Recent posts container with scrolling
767
- #recent_posts,
768
- ul[id*="recent"] {
769
- max-height: 400px;
770
- overflow-y: auto;
771
- padding: 0;
772
- margin: 0;
700
+ // Override Bootstrap's overflow-hidden on wrapper divs
701
+ .overflow-hidden {
702
+ overflow: visible !important;
703
+ }
773
704
 
774
- // Smooth scrollbar
705
+ // The wrapper div after h5 (Trending Posts header) - make it scrollable
706
+ h5 + div {
707
+ max-height: 420px;
708
+ overflow-y: auto !important;
709
+ overflow-x: hidden !important;
710
+
711
+ // Scrollbar styling
775
712
  &::-webkit-scrollbar {
776
- width: 4px;
713
+ width: 6px;
777
714
  }
778
-
779
715
  &::-webkit-scrollbar-track {
780
716
  background: transparent;
781
717
  }
782
-
783
718
  &::-webkit-scrollbar-thumb {
784
719
  background: rgba(0, 0, 0, 0.15);
785
- border-radius: 2px;
786
-
720
+ border-radius: 3px;
787
721
  &:hover {
788
722
  background: rgba(0, 0, 0, 0.25);
789
723
  }
790
724
  }
791
725
  }
792
726
 
727
+ // Recent posts container - no scroll here, parent wrapper handles it
728
+ #recent_posts,
729
+ ul[id*="recent"] {
730
+ max-height: none !important;
731
+ overflow: visible !important;
732
+ padding: $jv-space-3 !important;
733
+ padding-bottom: $jv-space-5 !important;
734
+ margin: 0;
735
+ list-style: none;
736
+ display: flex !important;
737
+ flex-direction: column !important;
738
+ gap: $jv-space-3 !important;
739
+ }
740
+
793
741
  // Style the actual widget-posts items
794
742
  .widget-posts {
795
743
  padding: $jv-space-3 $jv-space-4 !important;
796
- transition: background-color $jv-transition-fast !important;
797
- border-bottom: 1px solid $jv-border-subtle !important;
744
+ transition: $jv-transition-shadow, border-color $jv-transition-fast !important;
745
+ border: 1px solid rgba(0,0,0,0.05) !important;
746
+ border-radius: $jv-radius-md !important;
747
+ background: $jv-surface !important;
748
+ cursor: pointer;
749
+ flex-shrink: 0 !important;
750
+ display: flex !important;
751
+ flex-direction: column !important;
752
+ gap: $jv-space-3 !important;
798
753
 
799
- &:last-child {
800
- border-bottom: none !important;
754
+ &:hover {
755
+ border-color: $jv-border-strong !important;
756
+ box-shadow: $jv-shadow-sm;
801
757
  }
802
758
 
803
- &:hover {
804
- background: $jv-hover-bg !important;
759
+ &:focus-within {
760
+ outline: none;
761
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
762
+ }
763
+
764
+ // Hide hr elements
765
+ hr {
766
+ display: none !important;
767
+ }
768
+
769
+ // Meta info row (author + timeago)
770
+ .d-flex.gap-2 {
771
+ display: flex !important;
772
+ align-items: center !important;
773
+ gap: $jv-space-2 !important;
774
+ font-size: $jv-font-size-xs;
775
+ color: $jv-text-muted;
776
+ flex-wrap: nowrap;
777
+ }
778
+
779
+ .timeago {
780
+ font-size: $jv-font-size-xs;
781
+ color: $jv-text-soft;
805
782
  }
806
783
 
807
784
  .post-author a {
808
- font-size: 12px !important;
785
+ font-size: $jv-font-size-xs !important;
809
786
  font-weight: 500 !important;
810
787
  color: $jv-text-main !important;
811
788
  }
812
789
 
790
+ // Title link
791
+ a {
792
+ font-size: 14px;
793
+ font-weight: 500;
794
+ color: $jv-text-main;
795
+ text-decoration: none;
796
+ line-height: $jv-line-height-tight;
797
+
798
+ &:hover {
799
+ color: $jv-primary;
800
+ }
801
+ }
802
+
803
+ // Content preview
804
+ p,
805
+ .content,
813
806
  .line-clamp-6 {
814
- font-size: 13px !important;
815
- font-weight: 400 !important;
816
- color: $jv-text-main !important;
817
- line-height: 1.5 !important;
807
+ display: -webkit-box;
808
+ -webkit-line-clamp: 3;
809
+ -webkit-box-orient: vertical;
810
+ overflow: hidden;
811
+ font-size: $jv-font-size-sm !important;
812
+ color: $jv-text-muted !important;
813
+ line-height: $jv-line-height-base !important;
814
+ margin: 0;
818
815
  }
819
816
 
820
- .post-preview-footer a {
821
- font-size: 12px !important;
822
- font-weight: 500 !important;
823
- color: $jv-primary !important;
824
- text-decoration: none !important;
817
+ // Read more link
818
+ a.stretched-link {
819
+ font-size: $jv-font-size-xs;
820
+ color: $jv-primary;
821
+ }
822
+
823
+ // Footer with "read more" link
824
+ .post-preview-footer {
825
+ margin-top: auto;
826
+
827
+ a {
828
+ font-size: $jv-font-size-xs !important;
829
+ font-weight: 600 !important;
830
+ color: $jv-primary !important;
831
+ text-decoration: none !important;
832
+ transition: color $jv-transition-fast !important;
833
+ display: inline-flex;
834
+ align-items: center;
835
+ gap: $jv-space-1;
836
+
837
+ &:hover {
838
+ color: $jv-primary-hover !important;
839
+ text-decoration: underline !important;
840
+ }
841
+
842
+ &::after {
843
+ content: "→";
844
+ font-size: inherit;
845
+ transition: transform $jv-transition-fast;
846
+ }
847
+
848
+ &:hover::after {
849
+ transform: translateX(2px);
850
+ }
851
+ }
825
852
  }
826
853
  }
827
854
  }