@okjavis/nodebb-theme-javis 1.5.0 → 1.6.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.
@@ -75,7 +75,7 @@
75
75
  font-size: $jv-font-size-sm;
76
76
  font-weight: 500;
77
77
  border-radius: $jv-radius-sm;
78
- transition: all 0.15s ease;
78
+ transition: background-color $jv-transition-fast, color $jv-transition-fast; // Modern transitions
79
79
 
80
80
  i {
81
81
  width: 18px;
@@ -93,6 +93,12 @@
93
93
  color: $jv-primary;
94
94
  font-weight: 600;
95
95
  }
96
+
97
+ // Focus state for accessibility
98
+ &:focus-visible {
99
+ outline: none;
100
+ box-shadow: $jv-focus-ring;
101
+ }
96
102
  }
97
103
 
98
104
  // Sidebar section headers
@@ -118,10 +124,16 @@
118
124
  color: $jv-text-main;
119
125
  font-size: $jv-font-size-sm;
120
126
  border-radius: $jv-radius-sm;
121
- transition: background-color 0.15s ease;
127
+ transition: background-color $jv-transition-fast; // Modern transition
122
128
 
123
129
  &:hover {
124
- background: rgba(0, 0, 0, 0.03);
130
+ background: $jv-hover-bg; // Consistent hover state
131
+ }
132
+
133
+ // Focus state for accessibility
134
+ &:focus-within {
135
+ outline: none;
136
+ background: $jv-hover-bg;
125
137
  }
126
138
 
127
139
  .category-icon {
@@ -144,7 +156,6 @@
144
156
  div[data-widget-area] {
145
157
  display: flex;
146
158
  flex-direction: column;
147
- gap: $jv-space-6;
148
159
  }
149
160
 
150
161
  // Individual widget card
@@ -153,10 +164,16 @@ div[data-widget-area] {
153
164
  border: 1px solid $jv-border-subtle;
154
165
  border-radius: $jv-radius-lg;
155
166
  padding: $jv-space-8;
156
- transition: box-shadow 0.15s ease;
167
+ transition: $jv-transition-shadow; // Modern transition
157
168
 
158
169
  &:hover {
159
- box-shadow: $jv-shadow-soft;
170
+ box-shadow: $jv-shadow-sm; // shadcn subtle shadow
171
+ }
172
+
173
+ // Focus state for accessibility
174
+ &:focus-within {
175
+ outline: none;
176
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
160
177
  }
161
178
  }
162
179
 
@@ -192,11 +209,17 @@ div[data-widget-area="right"] h8 {
192
209
  flex-direction: column;
193
210
  gap: 2px;
194
211
  cursor: pointer;
195
- transition: border-color 0.15s ease, background 0.15s ease;
212
+ transition: border-color $jv-transition-fast, background-color $jv-transition-fast; // Modern transitions
196
213
 
197
214
  &:hover {
198
- border-color: rgba(0,0,0,0.12);
199
- background: rgba(0,0,0,0.03);
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;
200
223
  }
201
224
 
202
225
  small {
@@ -224,11 +247,17 @@ div[data-widget-area="right"] h8 {
224
247
  display: flex;
225
248
  flex-direction: column;
226
249
  gap: $jv-space-4;
227
- transition: box-shadow 0.15s ease, border 0.15s ease;
250
+ transition: $jv-transition-shadow, border-color $jv-transition-fast; // Modern transitions
228
251
 
229
252
  &:hover {
230
- border-color: rgba(0,0,0,0.08);
231
- box-shadow: $jv-shadow-soft;
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;
232
261
  }
233
262
 
234
263
  // Meta info
@@ -304,12 +333,18 @@ div[data-widget-area="right"] h8 {
304
333
  border-radius: 50%;
305
334
  object-fit: cover;
306
335
  border: 2px solid $jv-surface;
307
- transition: transform 0.15s ease;
336
+ transition: transform $jv-transition-fast; // Modern transition
308
337
 
309
338
  &:hover {
310
339
  transform: scale(1.1);
311
340
  z-index: 10;
312
341
  }
342
+
343
+ // Focus state for accessibility
344
+ &:focus {
345
+ outline: none;
346
+ box-shadow: $jv-focus-ring;
347
+ }
313
348
  }
314
349
 
315
350
  .avatar-stack {
@@ -337,20 +372,26 @@ div[data-widget-area="right"] h8 {
337
372
  gap: $jv-space-4;
338
373
  padding: $jv-space-4 0;
339
374
  border-bottom: 1px solid $jv-border-subtle;
340
- transition: background-color 0.15s ease;
375
+ transition: background-color $jv-transition-fast; // Modern transition
341
376
 
342
377
  &:last-child {
343
378
  border-bottom: none;
344
379
  }
345
380
 
346
381
  &:hover {
347
- background: rgba(0, 0, 0, 0.02);
382
+ background: $jv-hover-bg; // Consistent hover state
348
383
  margin: 0 (-$jv-space-4);
349
384
  padding-left: $jv-space-4;
350
385
  padding-right: $jv-space-4;
351
386
  border-radius: $jv-radius-sm;
352
387
  }
353
388
 
389
+ // Focus state for accessibility
390
+ &:focus-within {
391
+ outline: none;
392
+ background: $jv-hover-bg;
393
+ }
394
+
354
395
  .category-icon {
355
396
  width: 24px;
356
397
  height: 24px;
@@ -565,8 +606,8 @@ div[data-widget-area="right"] h8 {
565
606
  width: 280px;
566
607
  z-index: 1050;
567
608
  transform: translateX(-100%);
568
- transition: transform 0.3s ease;
569
- box-shadow: 4px 0 20px rgba(0, 0, 0, 0.15);
609
+ transition: transform $jv-transition-slow; // Modern transition
610
+ box-shadow: $jv-shadow-lg; // shadcn drawer shadow
570
611
 
571
612
  &.open {
572
613
  transform: translateX(0);
@@ -583,7 +624,7 @@ div[data-widget-area="right"] h8 {
583
624
  z-index: 1040;
584
625
  opacity: 0;
585
626
  visibility: hidden;
586
- transition: opacity 0.3s ease, visibility 0.3s ease;
627
+ transition: opacity $jv-transition-slow, visibility $jv-transition-slow; // Modern transitions
587
628
 
588
629
  &.show {
589
630
  opacity: 1;
@@ -595,11 +636,35 @@ div[data-widget-area="right"] h8 {
595
636
  // ===========================================================
596
637
  // RIGHT SIDEBAR WIDGET AREA (Reddit-style)
597
638
  // ===========================================================
598
- div[data-widget-area="sidebar"],
599
- .col-lg-3[data-widget-area="sidebar"] {
639
+ div[data-widget-area="right"],
640
+ .col-lg-3.col-sm-12 {
600
641
  display: flex;
601
642
  flex-direction: column;
602
- gap: $jv-space-6;
643
+
644
+ // Sticky positioning - stays visible when scrolling
645
+ position: sticky;
646
+ top: 80px; // Adjust based on your header height
647
+ align-self: flex-start;
648
+ max-height: calc(100vh - 100px); // Account for header + padding
649
+ overflow-y: auto; // Allow scrolling if content is too tall
650
+
651
+ // Smooth scrollbar styling (webkit browsers)
652
+ &::-webkit-scrollbar {
653
+ width: 6px;
654
+ }
655
+
656
+ &::-webkit-scrollbar-track {
657
+ background: transparent;
658
+ }
659
+
660
+ &::-webkit-scrollbar-thumb {
661
+ background: rgba(0, 0, 0, 0.15);
662
+ border-radius: 3px;
663
+
664
+ &:hover {
665
+ background: rgba(0, 0, 0, 0.25);
666
+ }
667
+ }
603
668
 
604
669
  // Widget card container
605
670
  > div {
@@ -609,207 +674,155 @@ div[data-widget-area="sidebar"],
609
674
  overflow: hidden;
610
675
  }
611
676
 
612
- // Widget header/title
677
+ // Widget header/title - clean and simple
613
678
  h5, h6, .widget-title {
614
- font-size: 12px !important;
679
+ font-size: 11px !important;
615
680
  font-weight: 700 !important;
616
681
  text-transform: uppercase;
617
682
  letter-spacing: 0.5px;
618
683
  color: $jv-text-soft;
619
- padding: $jv-space-6 $jv-space-6 $jv-space-4;
620
- margin: 0 !important;
684
+ padding: $jv-space-4 $jv-space-4;
685
+ margin: 0 0 $jv-space-4 0 !important;
621
686
  border-bottom: 1px solid $jv-border-subtle;
622
- background: rgba(0, 0, 0, 0.015);
687
+ }
688
+
689
+ // Add spacing between widgets
690
+ > div + div {
691
+ margin-top: $jv-space-4;
623
692
  }
624
693
  }
625
694
 
626
695
  // ===========================================================
627
- // POPULAR TAGS WIDGET (Sidebar)
696
+ // POPULAR TAGS WIDGET (Sidebar) - Reddit-style vertical list
628
697
  // ===========================================================
629
- div[data-widget-area="sidebar"] {
630
- .popular-tags,
631
- [class*="tag"] {
632
- padding: $jv-space-4;
698
+ div[data-widget-area="right"] {
699
+ .popular-tags {
700
+ width: 100% !important;
701
+ }
633
702
 
634
- // Tag items grid
635
- .tag-list,
636
- > div {
637
- display: flex;
638
- flex-direction: column;
639
- gap: $jv-space-2;
703
+ .tag-list {
704
+ padding: 0 !important;
705
+ 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
+
712
+ // Remove any grid/row styling
713
+ &.row {
714
+ --bs-gutter-x: 0 !important;
715
+ --bs-gutter-y: 0 !important;
716
+ margin: 0 !important;
717
+ }
718
+
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;
724
+ padding: 0 !important;
725
+ }
726
+
727
+ .btn-ghost,
728
+ 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;
640
740
 
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;
741
+ &:hover {
742
+ background: $jv-hover-bg !important;
743
+ }
656
744
 
657
- &:hover {
658
- background: rgba(0, 81, 255, 0.06);
659
- color: $jv-primary;
660
- }
745
+ .tag-item {
746
+ font-size: 14px !important;
747
+ font-weight: 600 !important;
748
+ color: $jv-text-main !important;
749
+ margin-bottom: $jv-space-1 !important;
750
+ }
661
751
 
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
- }
752
+ .tag-topic-count {
753
+ font-size: 12px !important;
754
+ font-weight: 400 !important;
755
+ color: $jv-text-soft !important;
670
756
  }
671
757
  }
672
758
  }
759
+
673
760
  }
674
761
 
675
762
  // ===========================================================
676
- // RECENT/TRENDING POSTS WIDGET (Sidebar)
763
+ // RECENT/TRENDING POSTS WIDGET (Sidebar) - Widget Essentials Specific
677
764
  // ===========================================================
678
- div[data-widget-area="sidebar"] {
765
+ div[data-widget-area="right"] {
766
+ // Recent posts container with scrolling
679
767
  #recent_posts,
680
- .recent-posts,
681
- ul {
682
- list-style: none;
768
+ ul[id*="recent"] {
769
+ max-height: 400px;
770
+ overflow-y: auto;
683
771
  padding: 0;
684
772
  margin: 0;
685
773
 
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
- }
774
+ // Smooth scrollbar
775
+ &::-webkit-scrollbar {
776
+ width: 4px;
777
+ }
714
778
 
715
- // Username
716
- a:first-of-type {
717
- font-size: 12px;
718
- font-weight: 600;
719
- color: $jv-text-main;
720
- text-decoration: none;
779
+ &::-webkit-scrollbar-track {
780
+ background: transparent;
781
+ }
721
782
 
722
- &:hover {
723
- color: $jv-primary;
724
- }
725
- }
783
+ &::-webkit-scrollbar-thumb {
784
+ background: rgba(0, 0, 0, 0.15);
785
+ border-radius: 2px;
726
786
 
727
- // Timeago
728
- .timeago {
729
- font-size: 11px;
730
- color: $jv-text-soft;
731
- }
787
+ &:hover {
788
+ background: rgba(0, 0, 0, 0.25);
732
789
  }
790
+ }
791
+ }
733
792
 
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
- }
793
+ // Style the actual widget-posts items
794
+ .widget-posts {
795
+ 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;
756
798
 
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
- }
799
+ &:last-child {
800
+ border-bottom: none !important;
801
+ }
769
802
 
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;
803
+ &:hover {
804
+ background: $jv-hover-bg !important;
805
+ }
779
806
 
780
- &:hover {
781
- text-decoration: underline;
782
- }
783
- }
807
+ .post-author a {
808
+ font-size: 12px !important;
809
+ font-weight: 500 !important;
810
+ color: $jv-text-main !important;
784
811
  }
785
- }
786
- }
787
812
 
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;
813
+ .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;
818
+ }
796
819
 
797
- i {
798
- font-size: 14px;
799
- color: $jv-text-soft;
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;
800
825
  }
801
826
  }
802
827
  }
803
828
 
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
- }
@@ -10,8 +10,8 @@ $jv-primary-soft: rgba(0, 81, 255, 0.12);
10
10
  // Neutrals
11
11
  $jv-bg: #f5f6f8; // app background
12
12
  $jv-surface: #ffffff; // cards, panels
13
- $jv-border-subtle: rgba(0,0,0,0.06);
14
- $jv-border-strong: rgba(0,0,0,0.12);
13
+ $jv-border-subtle: rgba(0,0,0,0.1); // More visible than Material (was 0.06) - shadcn style
14
+ $jv-border-strong: rgba(0,0,0,0.15); // Stronger borders (was 0.12)
15
15
 
16
16
  // Text
17
17
  $jv-text-main: #111111;
@@ -25,19 +25,39 @@ $jv-radius-md: 12px;
25
25
  $jv-radius-lg: 16px;
26
26
  $jv-radius-pill: 999px;
27
27
 
28
- // Shadows
29
- $jv-shadow-soft: 0 2px 8px rgba(0,0,0,0.04);
30
- $jv-shadow-card: 0 4px 10px rgba(0,0,0,0.05);
28
+ // shadcn-Style Shadow System (Compact, Grounded, Notion/Linear-like)
29
+ // Subtle shadows that let borders do the heavy lifting
30
+ $jv-shadow-none: none;
31
+ $jv-shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.05); // Barely visible
32
+ $jv-shadow-sm: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1); // Card resting - SUBTLE
33
+ $jv-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); // Card hover
34
+ $jv-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); // Modals/Dropdowns
35
+ $jv-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); // Popovers
36
+
37
+ // Legacy compatibility - map old names to new system
38
+ $jv-shadow-soft: $jv-shadow-sm;
39
+ $jv-shadow-card: $jv-shadow-sm;
40
+ $jv-elevation-0: $jv-shadow-none;
41
+ $jv-elevation-1: $jv-shadow-sm;
42
+ $jv-elevation-2: $jv-shadow-sm;
43
+ $jv-elevation-4: $jv-shadow-md;
44
+ $jv-elevation-6: $jv-shadow-md;
45
+ $jv-elevation-8: $jv-shadow-md;
46
+
47
+ // Button shadows (keep branded)
31
48
  $jv-shadow-button: 0 4px 12px rgba(0, 81, 255, 0.25);
32
49
  $jv-shadow-button-hover: 0 6px 16px rgba(0, 81, 255, 0.35);
33
50
 
34
- // Spacing (8pt-ish scale)
35
- $jv-space-2: 4px;
36
- $jv-space-4: 8px;
37
- $jv-space-6: 12px;
38
- $jv-space-8: 16px;
39
- $jv-space-10: 20px;
40
- $jv-space-12: 24px;
51
+ // Spacing (8dp baseline grid - shadcn/Tailwind compatible)
52
+ $jv-space-1: 4px; // 4dp
53
+ $jv-space-2: 8px; // 8dp (1 unit)
54
+ $jv-space-3: 12px; // 12dp (1.5 units)
55
+ $jv-space-4: 16px; // 16dp (2 units)
56
+ $jv-space-5: 20px; // 20dp (2.5 units)
57
+ $jv-space-6: 24px; // 24dp (3 units)
58
+ $jv-space-8: 32px; // 32dp (4 units)
59
+ $jv-space-10: 40px; // 40dp (5 units)
60
+ $jv-space-12: 48px; // 48dp (6 units)
41
61
 
42
62
  // Typography
43
63
  $jv-font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, "Helvetica Neue", Arial, sans-serif;
@@ -52,3 +72,18 @@ $jv-font-size-xxl: 32px;
52
72
  $jv-line-height-base: 1.52;
53
73
  $jv-line-height-tight: 1.4;
54
74
  $jv-line-height-relaxed: 1.6;
75
+
76
+ // Modern Polish - Transitions & Interactions (2025 standard)
77
+ $jv-transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
78
+ $jv-transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);
79
+ $jv-transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);
80
+ $jv-transition-shadow: box-shadow 200ms cubic-bezier(0.4, 0, 0.2, 1);
81
+
82
+ // Focus States (Accessibility + Modern Look)
83
+ $jv-focus-ring: 0 0 0 3px rgba(0, 81, 255, 0.12);
84
+ $jv-focus-ring-offset: 0 0 0 2px $jv-surface, 0 0 0 4px $jv-primary;
85
+
86
+ // Interactive States
87
+ $jv-hover-bg: rgba(0, 0, 0, 0.04);
88
+ $jv-active-bg: rgba(0, 0, 0, 0.08);
89
+ $jv-selected-bg: rgba(0, 81, 255, 0.08);