@okjavis/nodebb-theme-javis 1.5.0 → 1.5.1

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.5.0",
3
+ "version": "1.5.1",
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
@@ -122,9 +122,17 @@ h6 {
122
122
  a {
123
123
  color: $jv-primary;
124
124
  text-decoration: none;
125
- transition: color 0.15s ease;
125
+ transition: color $jv-transition-fast; // Modern transition
126
126
 
127
127
  &:hover {
128
128
  color: $jv-primary-hover;
129
129
  }
130
+
131
+ // Focus state for accessibility
132
+ &:focus-visible {
133
+ outline: none;
134
+ text-decoration: underline;
135
+ text-decoration-thickness: 2px;
136
+ text-underline-offset: 2px;
137
+ }
130
138
  }
@@ -26,7 +26,7 @@ $jv-info-hover: #2563eb;
26
26
  font-size: 14px;
27
27
  font-weight: 500;
28
28
  line-height: 1.4;
29
- transition: all 0.2s ease;
29
+ transition: background-color $jv-transition-fast, border-color $jv-transition-fast, color $jv-transition-fast; // Modern specific transitions
30
30
  border: 1px solid transparent;
31
31
  cursor: pointer;
32
32
  text-decoration: none;
@@ -35,7 +35,7 @@ $jv-info-hover: #2563eb;
35
35
  // Focus ring for accessibility
36
36
  &:focus {
37
37
  outline: none;
38
- box-shadow: 0 0 0 3px rgba(0, 81, 255, 0.2);
38
+ box-shadow: $jv-focus-ring;
39
39
  }
40
40
 
41
41
  &:focus:not(:focus-visible) {
@@ -43,7 +43,8 @@ $jv-info-hover: #2563eb;
43
43
  }
44
44
 
45
45
  &:focus-visible {
46
- box-shadow: 0 0 0 3px rgba(0, 81, 255, 0.3);
46
+ outline: none;
47
+ box-shadow: $jv-focus-ring;
47
48
  }
48
49
 
49
50
  // Disabled state
@@ -74,12 +75,10 @@ $jv-info-hover: #2563eb;
74
75
  background-color: $jv-primary-hover;
75
76
  border-color: $jv-primary-hover;
76
77
  box-shadow: $jv-shadow-button-hover;
77
- transform: translateY(-1px);
78
78
  color: #fff;
79
79
  }
80
80
 
81
81
  &:active {
82
- transform: translateY(0);
83
82
  box-shadow: $jv-shadow-button;
84
83
  }
85
84
  }
@@ -105,7 +104,7 @@ $jv-info-hover: #2563eb;
105
104
  color: $jv-text-main;
106
105
 
107
106
  &:hover {
108
- background-color: rgba(0, 0, 0, 0.04);
107
+ background-color: $jv-hover-bg; // Consistent hover state
109
108
  border-color: $jv-border-strong;
110
109
  color: $jv-text-main;
111
110
  }
@@ -155,11 +154,6 @@ $jv-info-hover: #2563eb;
155
154
  background-color: $jv-success-hover;
156
155
  border-color: $jv-success-hover;
157
156
  color: #fff;
158
- transform: translateY(-1px);
159
- }
160
-
161
- &:active {
162
- transform: translateY(0);
163
157
  }
164
158
  }
165
159
 
@@ -172,11 +166,6 @@ $jv-info-hover: #2563eb;
172
166
  background-color: $jv-danger-hover;
173
167
  border-color: $jv-danger-hover;
174
168
  color: #fff;
175
- transform: translateY(-1px);
176
- }
177
-
178
- &:active {
179
- transform: translateY(0);
180
169
  }
181
170
  }
182
171
 
@@ -189,11 +178,6 @@ $jv-info-hover: #2563eb;
189
178
  background-color: $jv-warning-hover;
190
179
  border-color: $jv-warning-hover;
191
180
  color: #fff;
192
- transform: translateY(-1px);
193
- }
194
-
195
- &:active {
196
- transform: translateY(0);
197
181
  }
198
182
  }
199
183
 
@@ -206,11 +190,6 @@ $jv-info-hover: #2563eb;
206
190
  background-color: $jv-info-hover;
207
191
  border-color: $jv-info-hover;
208
192
  color: #fff;
209
- transform: translateY(-1px);
210
- }
211
-
212
- &:active {
213
- transform: translateY(0);
214
193
  }
215
194
  }
216
195
 
@@ -218,12 +197,12 @@ $jv-info-hover: #2563eb;
218
197
  // LIGHT/SUBTLE BUTTON
219
198
  // ===========================================================
220
199
  .btn-light {
221
- background-color: rgba(0, 0, 0, 0.04);
200
+ background-color: $jv-hover-bg; // Consistent with hover state
222
201
  border-color: transparent;
223
202
  color: $jv-text-main;
224
203
 
225
204
  &:hover {
226
- background-color: rgba(0, 0, 0, 0.08);
205
+ background-color: $jv-active-bg; // Consistent active state
227
206
  color: $jv-text-main;
228
207
  }
229
208
  }
@@ -237,7 +216,7 @@ $jv-info-hover: #2563eb;
237
216
  color: $jv-text-muted;
238
217
 
239
218
  &:hover {
240
- background-color: rgba(0, 0, 0, 0.05);
219
+ background-color: $jv-hover-bg; // Consistent hover state
241
220
  color: $jv-text-main;
242
221
  }
243
222
  }
@@ -353,11 +332,12 @@ $jv-info-hover: #2563eb;
353
332
  height: 56px;
354
333
  border-radius: 50%;
355
334
  padding: 0;
356
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
335
+ box-shadow: $jv-shadow-lg; // shadcn large shadow
336
+ transition: $jv-transition-shadow, transform $jv-transition-fast; // Modern transitions
357
337
 
358
338
  &:hover {
359
- box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
360
- transform: translateY(-2px);
339
+ box-shadow: $jv-shadow-xl; // shadcn extra large shadow
340
+ transform: translateY(-2px); // FABs are meant to lift on hover
361
341
  }
362
342
 
363
343
  i {
package/scss/_cards.scss CHANGED
@@ -7,15 +7,22 @@
7
7
  .topic-card {
8
8
  display: flex;
9
9
  background: $jv-surface;
10
- border-radius: $jv-radius-lg;
10
+ border-radius: $jv-radius-sm; // 8px - shadcn standard
11
11
  border: 1px solid $jv-border-subtle;
12
- margin-bottom: $jv-space-4;
13
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
12
+ margin-bottom: $jv-space-2; // 8dp grid
13
+ box-shadow: $jv-shadow-sm; // shadcn subtle shadow
14
+ transition: $jv-transition-shadow, border-color $jv-transition-fast; // Modern smooth transitions
14
15
  overflow: hidden;
15
16
 
16
17
  &:hover {
17
- border-color: $jv-border-strong;
18
- box-shadow: $jv-shadow-soft;
18
+ box-shadow: $jv-shadow-md; // shadcn hover shadow
19
+ border-color: $jv-border-strong; // Subtle border darkening
20
+ }
21
+
22
+ // Focus state for accessibility
23
+ &:focus-within {
24
+ outline: none;
25
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
19
26
  }
20
27
 
21
28
  // Deleted/scheduled states
@@ -36,10 +43,10 @@
36
43
  flex-direction: column;
37
44
  align-items: center;
38
45
  justify-content: flex-start;
39
- padding: $jv-space-6 $jv-space-4;
46
+ padding: $jv-space-6 $jv-space-4; // 24dp vertical, 16dp horizontal - Material grid
40
47
  background: rgba(0, 0, 0, 0.02);
41
48
  min-width: 44px;
42
- gap: 2px;
49
+ gap: $jv-space-1; // 4dp - Material grid
43
50
  }
44
51
 
45
52
  .vote-btn {
@@ -93,10 +100,10 @@
93
100
  // ===========================================================
94
101
  .topic-content {
95
102
  flex: 1;
96
- padding: $jv-space-6;
103
+ padding: $jv-space-3; // 12dp - Material grid
97
104
  display: flex;
98
105
  flex-direction: column;
99
- gap: $jv-space-4;
106
+ gap: $jv-space-3; // 12dp - Material grid
100
107
  min-width: 0; // Allow text truncation
101
108
  }
102
109
 
@@ -105,27 +112,27 @@
105
112
  display: flex;
106
113
  align-items: center;
107
114
  flex-wrap: wrap;
108
- gap: $jv-space-2;
109
- font-size: $jv-font-size-xs;
110
- color: $jv-text-muted;
115
+ gap: $jv-space-3; // 12dp - Material grid
116
+ font-size: 14px; // Slightly larger for readability
117
+ color: $jv-text-soft; // More subtle
111
118
 
112
119
  .meta-separator {
113
120
  color: $jv-text-soft;
114
121
  }
115
122
 
116
123
  .author-link {
117
- color: $jv-text-muted;
124
+ color: $jv-text-soft; // More subtle - not competing with title
118
125
  text-decoration: none;
119
- font-weight: 500;
126
+ font-weight: 400; // Normal weight
120
127
 
121
128
  &:hover {
122
129
  color: $jv-primary;
123
- text-decoration: underline;
124
130
  }
125
131
  }
126
132
 
127
133
  .meta-time {
128
134
  color: $jv-text-soft;
135
+ font-size: 13px;
129
136
  }
130
137
 
131
138
  // Category badge override
@@ -140,10 +147,10 @@
140
147
  // Topic Title
141
148
  .topic-card .topic-title {
142
149
  margin: 0;
143
- font-size: $jv-font-size-lg;
144
- font-weight: 600;
145
- line-height: $jv-line-height-tight;
146
- letter-spacing: -0.01em;
150
+ font-size: 20px; // Larger for prominence - consistent with feed
151
+ font-weight: 700; // Bolder for better hierarchy
152
+ line-height: 1.4; // Better readability
153
+ letter-spacing: -0.02em; // Tighter for modern feel
147
154
 
148
155
  a {
149
156
  color: $jv-text-main;
@@ -159,7 +166,7 @@
159
166
  .topic-labels {
160
167
  display: flex;
161
168
  flex-wrap: wrap;
162
- gap: $jv-space-2;
169
+ gap: $jv-space-2; // 8dp - Material grid
163
170
 
164
171
  .topic-badge {
165
172
  display: inline-flex;
@@ -197,7 +204,7 @@
197
204
  .topic-tags {
198
205
  display: flex;
199
206
  flex-wrap: wrap;
200
- gap: $jv-space-2;
207
+ gap: $jv-space-2; // 8dp - Material grid
201
208
 
202
209
  .topic-tag {
203
210
  font-size: 11px;
@@ -222,7 +229,7 @@
222
229
  position: relative;
223
230
  width: fit-content;
224
231
  max-width: 100%;
225
- border-radius: $jv-radius-md;
232
+ border-radius: $jv-radius-sm; // 8px - Material Design standard
226
233
  overflow: hidden;
227
234
 
228
235
  img {
@@ -231,7 +238,7 @@
231
238
  max-width: 100%;
232
239
  width: auto;
233
240
  object-fit: cover;
234
- border-radius: $jv-radius-md;
241
+ border-radius: $jv-radius-sm; // 8px - Material Design standard
235
242
  }
236
243
 
237
244
  .thumb-count {
@@ -269,40 +276,51 @@
269
276
  .topic-actions {
270
277
  display: flex;
271
278
  align-items: center;
272
- gap: $jv-space-4;
273
- padding-top: $jv-space-2;
279
+ gap: $jv-space-3; // 12dp - Material grid
280
+ padding-top: $jv-space-3; // 12dp - Material grid
274
281
  margin-top: auto;
275
282
  }
276
283
 
277
284
  .action-btn {
278
285
  display: inline-flex;
279
286
  align-items: center;
280
- gap: 6px;
281
- padding: 6px 10px;
282
- font-size: $jv-font-size-xs;
283
- font-weight: 500;
287
+ gap: $jv-space-2; // 8dp grid
288
+ padding: $jv-space-2 $jv-space-3; // 8dp vertical, 12dp horizontal
289
+ font-size: 14px;
290
+ font-weight: 600;
284
291
  color: $jv-text-muted;
285
292
  background: transparent;
286
293
  border: none;
287
- border-radius: $jv-radius-xs;
294
+ border-radius: $jv-radius-sm; // 8px shadcn standard
288
295
  cursor: pointer;
289
296
  text-decoration: none;
290
- transition: background-color 0.15s ease, color 0.15s ease;
297
+ transition: background-color $jv-transition-fast, color $jv-transition-fast; // Modern transitions
291
298
 
292
299
  &:hover {
293
- background: rgba(0, 0, 0, 0.05);
300
+ background: $jv-hover-bg; // Consistent hover state
294
301
  color: $jv-text-main;
295
302
  }
296
303
 
304
+ // Focus state for accessibility
305
+ &:focus-visible {
306
+ outline: none;
307
+ box-shadow: $jv-focus-ring;
308
+ }
309
+
297
310
  i {
298
- font-size: 14px;
311
+ font-size: 18px; // Larger icons
312
+ }
313
+
314
+ // Make numbers bold
315
+ span {
316
+ font-weight: 700;
299
317
  }
300
318
  }
301
319
 
302
320
  .action-stat {
303
321
  display: inline-flex;
304
322
  align-items: center;
305
- gap: 4px;
323
+ gap: $jv-space-1; // 4dp - Material grid
306
324
  font-size: $jv-font-size-xs;
307
325
  color: $jv-text-soft;
308
326
  margin-left: auto;
@@ -334,7 +352,7 @@
334
352
 
335
353
  .topic-actions {
336
354
  flex-wrap: wrap;
337
- gap: $jv-space-2;
355
+ gap: $jv-space-2; // 8dp - Material grid
338
356
  }
339
357
 
340
358
  .action-btn span {
@@ -351,23 +369,32 @@
351
369
  // ===========================================================
352
370
  li[component="post"].posts-list-item {
353
371
  background: $jv-surface;
354
- border-radius: $jv-radius-lg;
372
+ border-radius: $jv-radius-sm; // 8px - shadcn standard
355
373
  border: 1px solid $jv-border-subtle;
356
- padding: $jv-space-8;
357
- margin-bottom: $jv-space-4;
358
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
374
+ padding: $jv-space-4 $jv-space-3; // 16dp vertical, 12dp horizontal
375
+ margin-bottom: $jv-space-2; // 8dp grid
376
+ box-shadow: $jv-shadow-sm; // shadcn subtle shadow
377
+ transition: $jv-transition-shadow, border-color $jv-transition-fast; // Modern transitions
359
378
 
360
379
  &:hover {
380
+ box-shadow: $jv-shadow-md; // shadcn hover shadow
361
381
  border-color: $jv-border-strong;
362
- box-shadow: $jv-shadow-soft;
382
+ }
383
+
384
+ // Focus state for accessibility
385
+ &:focus-within {
386
+ outline: none;
387
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
363
388
  }
364
389
  }
365
390
 
366
391
  li[component="post"] {
367
392
  .topic-title {
368
- font-size: $jv-font-size-lg;
369
- font-weight: 600;
370
- margin-bottom: $jv-space-4;
393
+ font-size: 20px; // Larger for prominence
394
+ font-weight: 700; // Bolder for better hierarchy
395
+ line-height: 1.4; // Better readability
396
+ margin-bottom: $jv-space-3; // 12dp - Material grid
397
+ letter-spacing: -0.02em; // Tighter for modern feel
371
398
 
372
399
  a {
373
400
  color: $jv-text-main;
@@ -382,18 +409,27 @@ li[component="post"] {
382
409
  .post-body {
383
410
  display: flex;
384
411
  flex-direction: column;
385
- gap: $jv-space-4;
412
+ gap: $jv-space-2; // 8dp - Material grid
386
413
  }
387
414
 
388
415
  .post-info {
389
- font-size: $jv-font-size-xs;
390
- color: $jv-text-muted;
416
+ font-size: 14px; // Slightly larger for readability
417
+ color: $jv-text-soft; // More subtle
418
+
419
+ a {
420
+ color: $jv-text-soft; // More subtle
421
+ font-weight: 400; // Normal weight
422
+
423
+ &:hover {
424
+ color: $jv-primary;
425
+ }
426
+ }
391
427
  }
392
428
 
393
429
  .content {
394
- font-size: $jv-font-size-sm;
395
- line-height: $jv-line-height-base;
396
- color: $jv-text-main;
430
+ font-size: 15px; // Slightly larger for better readability
431
+ line-height: 1.6;
432
+ color: $jv-text-muted;
397
433
 
398
434
  p {
399
435
  margin-bottom: $jv-space-4;
@@ -402,6 +438,7 @@ li[component="post"] {
402
438
 
403
439
  .timeago {
404
440
  color: $jv-text-soft;
441
+ font-size: 13px;
405
442
  }
406
443
  }
407
444
 
@@ -416,15 +453,22 @@ li[component="post"] {
416
453
  // Category/Topic List Item (fallback for other templates)
417
454
  .category-item {
418
455
  background: $jv-surface;
419
- border-radius: $jv-radius-lg;
456
+ border-radius: $jv-radius-sm; // 8px - shadcn standard
420
457
  border: 1px solid $jv-border-subtle;
421
- padding: $jv-space-6;
422
- margin-bottom: $jv-space-4;
423
- transition: border-color 0.15s ease, box-shadow 0.15s ease;
458
+ padding: $jv-space-3; // 12dp grid
459
+ margin-bottom: $jv-space-2; // 8dp grid
460
+ box-shadow: $jv-shadow-sm; // shadcn subtle shadow
461
+ transition: $jv-transition-shadow, border-color $jv-transition-fast; // Modern transitions
424
462
 
425
463
  &:hover {
464
+ box-shadow: $jv-shadow-md; // shadcn hover shadow
426
465
  border-color: $jv-border-strong;
427
- box-shadow: $jv-shadow-soft;
466
+ }
467
+
468
+ // Focus state for accessibility
469
+ &:focus-within {
470
+ outline: none;
471
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
428
472
  }
429
473
 
430
474
  // Override default border-bottom
@@ -6,7 +6,7 @@
6
6
  .feed h2 {
7
7
  font-size: 16px;
8
8
  font-weight: 600;
9
- margin: 0 0 $jv-space-6 0;
9
+ margin: 0 0 $jv-space-6 0; // 24dp - Material grid
10
10
  padding: 0;
11
11
  color: $jv-text-main;
12
12
  letter-spacing: -0.2px;
@@ -26,16 +26,22 @@ ul.categories-list.list-unstyled {
26
26
  // ===========================================================
27
27
 
28
28
  li[component="categories/category"] {
29
- padding: 16px 0;
29
+ padding: $jv-space-4 0; // 16dp grid
30
30
  border-bottom: 1px solid #f1f1f1;
31
- transition: background 120ms ease;
31
+ transition: background $jv-transition-fast; // Modern transition
32
32
 
33
33
  &:last-child {
34
34
  border-bottom: none;
35
35
  }
36
36
 
37
37
  &:hover {
38
- background: rgba(0, 0, 0, 0.02);
38
+ background: $jv-hover-bg; // Consistent hover state
39
+ }
40
+
41
+ // Focus state for accessibility
42
+ &:focus-within {
43
+ outline: none;
44
+ background: $jv-hover-bg;
39
45
  }
40
46
 
41
47
  // Parent title
@@ -43,10 +49,10 @@ li[component="categories/category"] {
43
49
  font-size: $jv-font-size-base;
44
50
  font-weight: 600;
45
51
  color: $jv-text-main;
46
- margin-bottom: 4px;
52
+ margin-bottom: $jv-space-1; // 4dp - Material grid
47
53
  display: flex;
48
54
  align-items: center;
49
- gap: 6px;
55
+ gap: $jv-space-2; // 8dp - Material grid
50
56
 
51
57
  a {
52
58
  text-decoration: none;
@@ -68,7 +74,7 @@ li[component="categories/category"] {
68
74
  font-size: $jv-font-size-sm;
69
75
  color: $jv-text-muted;
70
76
  line-height: 1.45;
71
- margin-bottom: 10px;
77
+ margin-bottom: $jv-space-2; // 8dp - Material grid
72
78
  max-width: 92%;
73
79
  }
74
80
  }
@@ -80,15 +86,15 @@ li[component="categories/category"] {
80
86
  li[component="categories/category"] .category-children {
81
87
  display: flex;
82
88
  flex-direction: column;
83
- gap: 6px;
84
- margin-top: 4px;
89
+ gap: $jv-space-2; // 8dp - Material grid
90
+ margin-top: $jv-space-1; // 4dp - Material grid
85
91
  }
86
92
 
87
93
  .category-children-item {
88
94
  small > .d-flex {
89
95
  display: flex;
90
96
  align-items: center;
91
- gap: 6px;
97
+ gap: $jv-space-2; // 8dp - Material grid
92
98
  font-size: 14px;
93
99
  color: #333;
94
100
  }
@@ -105,7 +111,16 @@ li[component="categories/category"] .category-children {
105
111
  text-decoration: none;
106
112
  font-size: 14px;
107
113
  color: #333;
108
- transition: color 120ms ease, transform 80ms ease;
114
+ transition: color $jv-transition-fast; // Modern transition
115
+
116
+ // Focus state for accessibility
117
+ &:focus-visible {
118
+ outline: none;
119
+ color: $jv-primary;
120
+ text-decoration: underline;
121
+ text-decoration-thickness: 2px;
122
+ text-underline-offset: 2px;
123
+ }
109
124
  }
110
125
 
111
126
  // Hover state: blue dot + blue text