@okjavis/nodebb-theme-javis 2.5.3 → 3.0.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": "2.5.3",
3
+ "version": "3.0.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
@@ -138,3 +138,117 @@ a {
138
138
  text-underline-offset: 2px;
139
139
  }
140
140
  }
141
+
142
+ // ===========================================================
143
+ // LOGIN PAGE ONLY - Hide search bar
144
+ // ===========================================================
145
+ .template-login {
146
+ .brand-container {
147
+ display: none !important;
148
+ }
149
+ }
150
+
151
+ // ===========================================================
152
+ // LOGIN & REGISTER PAGES - Center aligned forms
153
+ // ===========================================================
154
+ .login,
155
+ .register {
156
+ // Center the main content area
157
+ #content {
158
+ display: flex;
159
+ justify-content: center;
160
+ align-items: flex-start;
161
+ padding-top: $jv-space-12;
162
+ }
163
+
164
+ // The form container
165
+ .row {
166
+ justify-content: center !important;
167
+ width: 100%;
168
+ max-width: 480px;
169
+ margin: 0 auto !important;
170
+ }
171
+
172
+ // Make sure columns don't offset
173
+ .col-12,
174
+ .col-md-6,
175
+ .col-lg-4,
176
+ [class*="col-"] {
177
+ margin-left: 0 !important;
178
+ margin-right: 0 !important;
179
+ flex: 0 0 100% !important;
180
+ max-width: 100% !important;
181
+ }
182
+
183
+ // Card styling for the form
184
+ .card,
185
+ .login-card,
186
+ .register-card {
187
+ background: $jv-surface;
188
+ border: 1px solid $jv-border-subtle;
189
+ border-radius: $jv-radius-lg;
190
+ box-shadow: $jv-shadow-md;
191
+ padding: $jv-space-8;
192
+ width: 100%;
193
+ max-width: 420px;
194
+ margin: 0 auto;
195
+ }
196
+
197
+ // Page title
198
+ h1,
199
+ .page-title {
200
+ text-align: center;
201
+ margin-bottom: $jv-space-8;
202
+ }
203
+
204
+ // Form labels
205
+ label {
206
+ font-weight: 500;
207
+ color: $jv-text-main;
208
+ margin-bottom: $jv-space-2;
209
+ }
210
+
211
+ // Form inputs
212
+ .form-control {
213
+ border-radius: $jv-radius-sm;
214
+ border: 1px solid $jv-border-subtle;
215
+ padding: $jv-space-3 $jv-space-4;
216
+ font-size: $jv-font-size-base;
217
+ transition: border-color $jv-transition-fast, box-shadow $jv-transition-fast;
218
+
219
+ &:focus {
220
+ border-color: $jv-primary;
221
+ box-shadow: $jv-focus-ring;
222
+ outline: none;
223
+ }
224
+ }
225
+
226
+ // Login/Register button
227
+ .btn-primary {
228
+ width: 100%;
229
+ padding: $jv-space-3 $jv-space-6;
230
+ font-weight: 600;
231
+ border-radius: $jv-radius-sm;
232
+ margin-top: $jv-space-4;
233
+ }
234
+
235
+ // Forgot password and other links
236
+ .forgot-password,
237
+ a.text-muted {
238
+ font-size: $jv-font-size-sm;
239
+ color: $jv-text-muted;
240
+
241
+ &:hover {
242
+ color: $jv-primary;
243
+ }
244
+ }
245
+
246
+ // Register link section
247
+ .register-link,
248
+ .login-link {
249
+ text-align: center;
250
+ margin-top: $jv-space-6;
251
+ padding-top: $jv-space-6;
252
+ border-top: 1px solid $jv-border-subtle;
253
+ }
254
+ }
@@ -1,58 +1,93 @@
1
1
  // ===========================================================
2
- // CATEGORIES – Enterprise Clean Style (Linear-inspired)
2
+ // CATEGORIES – Reddit/Community Style Cards
3
+ // Matches topic-card design for visual consistency
3
4
  // ===========================================================
4
5
 
5
6
  // Category Header
6
7
  .feed h2 {
7
- font-size: 16px;
8
+ font-size: $jv-font-size-base;
8
9
  font-weight: 600;
9
- margin: 0 0 $jv-space-6 0; // 24dp - Material grid
10
+ margin: 0 0 $jv-space-6 0;
10
11
  padding: 0;
11
12
  color: $jv-text-main;
12
13
  letter-spacing: -0.2px;
13
14
  }
14
15
 
15
- // Wrapper list spacing
16
+ // Wrapper list spacing - cards with gaps
16
17
  ul.categories-list.list-unstyled {
17
18
  margin: 0;
18
19
  padding: 0;
19
20
  display: flex;
20
21
  flex-direction: column;
21
- gap: 0;
22
+ gap: $jv-space-3;
23
+
24
+ // First category gets subtle featured treatment
25
+ > li[component="categories/category"]:first-child {
26
+ background: linear-gradient(135deg, rgba($jv-primary, 0.04) 0%, rgba($jv-primary, 0.01) 100%);
27
+ border-color: rgba($jv-primary, 0.2);
28
+
29
+ &:hover {
30
+ border-color: rgba($jv-primary, 0.35);
31
+ }
32
+ }
22
33
  }
23
34
 
24
35
  // ===========================================================
25
- // PARENT CATEGORY BLOCK
36
+ // PARENT CATEGORY CARD (Consolidated selector)
26
37
  // ===========================================================
27
38
 
28
39
  li[component="categories/category"] {
29
- padding: $jv-space-4 0; // 16dp grid
30
- border-bottom: 1px solid #f1f1f1;
31
- transition: background $jv-transition-fast; // Modern transition
32
-
33
- &:last-child {
34
- border-bottom: none;
35
- }
40
+ position: relative;
41
+ background: $jv-surface;
42
+ border-radius: $jv-radius-sm;
43
+ border: 1px solid $jv-border-subtle;
44
+ box-shadow: $jv-shadow-sm;
45
+ padding: $jv-space-5;
46
+ transition: box-shadow $jv-transition-base, border-color $jv-transition-fast, transform $jv-transition-fast;
36
47
 
37
48
  &:hover {
38
- background: $jv-hover-bg; // Consistent hover state
49
+ box-shadow: $jv-shadow-md;
50
+ border-color: $jv-border-strong;
51
+ transform: translateY(-1px);
52
+
53
+ .subcategory-pill {
54
+ background: $jv-surface;
55
+ }
39
56
  }
40
57
 
41
- // Focus state for accessibility
42
58
  &:focus-within {
43
59
  outline: none;
44
- background: $jv-hover-bg;
60
+ box-shadow: $jv-shadow-md, $jv-focus-ring;
61
+ }
62
+
63
+ // Unread state
64
+ &.unread {
65
+ border-left: 3px solid $jv-primary;
66
+
67
+ .title a {
68
+ font-weight: 700;
69
+ }
70
+ }
71
+
72
+ // New posts indicator
73
+ &.new-posts {
74
+ .activity-badge.active {
75
+ animation: pulse 2s ease-in-out infinite;
76
+ }
45
77
  }
46
78
 
47
- // Parent title
79
+ // ------------------------------------
80
+ // Title
81
+ // ------------------------------------
48
82
  .title {
49
- font-size: $jv-font-size-base;
83
+ font-size: $jv-font-size-lg;
50
84
  font-weight: 600;
51
85
  color: $jv-text-main;
52
- margin-bottom: $jv-space-1; // 4dp - Material grid
86
+ margin-bottom: $jv-space-1; // Tighter spacing to description
53
87
  display: flex;
54
88
  align-items: center;
55
- gap: $jv-space-2; // 8dp - Material grid
89
+ gap: $jv-space-3;
90
+ letter-spacing: -0.02em;
56
91
 
57
92
  a {
58
93
  text-decoration: none;
@@ -69,51 +104,173 @@ li[component="categories/category"] {
69
104
  }
70
105
  }
71
106
 
72
- // Category description
107
+ // ------------------------------------
108
+ // Description
109
+ // ------------------------------------
73
110
  .description {
74
111
  font-size: $jv-font-size-sm;
75
112
  color: $jv-text-muted;
76
- line-height: 1.45;
77
- margin-bottom: $jv-space-2; // 8dp - Material grid
78
- max-width: 92%;
113
+ line-height: $jv-line-height-base;
114
+ margin-bottom: $jv-space-3;
115
+ max-width: 100%;
116
+ }
117
+
118
+ // ------------------------------------
119
+ // Category Icon
120
+ // ------------------------------------
121
+ .category-icon,
122
+ [component="category/icon"] {
123
+ width: 48px !important;
124
+ height: 48px !important;
125
+ border-radius: $jv-radius-sm !important;
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ font-size: $jv-font-size-lg !important;
130
+ flex-shrink: 0;
131
+ box-shadow: $jv-shadow-xs;
132
+ }
133
+
134
+ // ------------------------------------
135
+ // Stats - Minimal inline design
136
+ // ------------------------------------
137
+ .stats-minimal {
138
+ .stat-item {
139
+ display: flex;
140
+ flex-direction: column;
141
+ align-items: center;
142
+ gap: 2px;
143
+ }
144
+
145
+ .stat-number {
146
+ font-size: $jv-font-size-lg;
147
+ font-weight: 600;
148
+ color: $jv-text-main;
149
+ line-height: 1;
150
+ }
151
+
152
+ .stat-label {
153
+ font-size: $jv-font-size-xs;
154
+ color: $jv-text-soft;
155
+ text-transform: uppercase;
156
+ letter-spacing: 0.3px;
157
+ font-weight: 500;
158
+ }
159
+ }
160
+
161
+ // ------------------------------------
162
+ // Last Post Teaser
163
+ // ------------------------------------
164
+ .teaser {
165
+ // Reset inherited spacing from NodeBB
166
+ padding-top: 0 !important;
167
+ margin-top: 0 !important;
168
+ border-top: none !important;
169
+
170
+ .teaser-enhanced {
171
+ border-left: 3px solid var(--teaser-color, $jv-primary);
172
+ height: auto !important;
173
+ border-radius: 0 $jv-radius-sm $jv-radius-sm 0;
174
+ background: $jv-bg;
175
+ padding: $jv-space-3;
176
+ transition: background $jv-transition-fast;
177
+
178
+ &:hover {
179
+ background: darken($jv-bg, 2%);
180
+ }
181
+
182
+ .teaser-header {
183
+ .avatar-tooltip img,
184
+ [component="user/picture"] {
185
+ width: 24px !important;
186
+ height: 24px !important;
187
+ border-radius: $jv-radius-pill;
188
+ }
189
+
190
+ .teaser-meta {
191
+ display: flex;
192
+ flex-direction: column;
193
+ gap: 0;
194
+ line-height: 1.2;
195
+
196
+ .teaser-user {
197
+ font-size: $jv-font-size-xs;
198
+ font-weight: 600;
199
+ color: $jv-text-main;
200
+ }
201
+
202
+ .teaser-time {
203
+ font-size: $jv-font-size-xs;
204
+ color: $jv-text-soft;
205
+ text-decoration: none;
206
+ }
207
+ }
208
+ }
209
+
210
+ .teaser-content-wrapper {
211
+ display: flex;
212
+ flex-direction: column;
213
+ gap: $jv-space-1;
214
+ }
215
+
216
+ .teaser-content {
217
+ font-size: $jv-font-size-sm;
218
+ color: $jv-text-muted;
219
+ line-height: $jv-line-height-base;
220
+ display: -webkit-box;
221
+ -webkit-line-clamp: 2;
222
+ -webkit-box-orient: vertical;
223
+ overflow: hidden;
224
+ }
225
+
226
+ .teaser-read-more {
227
+ font-size: $jv-font-size-xs;
228
+ font-weight: 500;
229
+ color: $jv-primary;
230
+ text-decoration: none;
231
+ transition: color $jv-transition-fast;
232
+
233
+ &:hover {
234
+ color: darken($jv-primary, 10%);
235
+ text-decoration: underline;
236
+ }
237
+ }
238
+ }
79
239
  }
80
240
  }
81
241
 
82
242
  // ===========================================================
83
- // CHILD CATEGORY ITEMS – Linear-style tiny dot list
243
+ // CHILD CATEGORY ITEMS – Subcategory pills
84
244
  // ===========================================================
85
245
 
86
- li[component="categories/category"] .category-children {
246
+ .category-children {
87
247
  display: flex;
88
248
  flex-direction: column;
89
- gap: $jv-space-2; // 8dp - Material grid
90
- margin-top: $jv-space-1; // 4dp - Material grid
249
+ gap: $jv-space-2;
250
+ margin-top: $jv-space-1;
91
251
  }
92
252
 
93
253
  .category-children-item {
94
254
  small > .d-flex {
95
255
  display: flex;
96
256
  align-items: center;
97
- gap: $jv-space-2; // 8dp - Material grid
98
- font-size: 14px;
99
- color: #333;
257
+ gap: $jv-space-2;
258
+ font-size: $jv-font-size-sm;
259
+ color: $jv-text-main;
100
260
  }
101
261
 
102
- // Dot (neutral by default)
103
262
  i {
104
263
  font-size: 6px;
105
- color: #999;
264
+ color: $jv-text-soft;
106
265
  margin-top: 1px;
107
266
  }
108
267
 
109
- // Child link
110
268
  a {
111
269
  text-decoration: none;
112
- font-size: 14px;
113
- color: #333;
114
- transition: color $jv-transition-fast; // Modern transition
270
+ font-size: $jv-font-size-sm;
271
+ color: $jv-text-main;
272
+ transition: color $jv-transition-fast;
115
273
 
116
- // Focus state for accessibility
117
274
  &:focus-visible {
118
275
  outline: none;
119
276
  color: $jv-primary;
@@ -123,7 +280,6 @@ li[component="categories/category"] .category-children {
123
280
  }
124
281
  }
125
282
 
126
- // Hover state: blue dot + blue text
127
283
  &:hover {
128
284
  i {
129
285
  color: $jv-primary;
@@ -134,3 +290,232 @@ li[component="categories/category"] .category-children {
134
290
  }
135
291
  }
136
292
  }
293
+
294
+ // ===========================================================
295
+ // ACTIVITY BADGES
296
+ // ===========================================================
297
+
298
+ .category-activity-row {
299
+ margin-top: $jv-space-1;
300
+ }
301
+
302
+ .activity-badge {
303
+ display: inline-flex;
304
+ align-items: center;
305
+ gap: $jv-space-1;
306
+ padding: $jv-space-1 $jv-space-2;
307
+ font-size: $jv-font-size-xs;
308
+ font-weight: 500;
309
+ color: $jv-text-soft;
310
+ background: $jv-bg;
311
+ border-radius: $jv-radius-pill;
312
+ transition: all $jv-transition-fast;
313
+ cursor: default;
314
+
315
+ i {
316
+ font-size: $jv-font-size-xs;
317
+ }
318
+
319
+ &:hover {
320
+ transform: scale(1.02);
321
+ }
322
+
323
+ // Removed .active green styling - now uses default muted style for time badge
324
+
325
+ &.hot {
326
+ background: rgba($jv-warning, 0.12);
327
+ color: $jv-warning;
328
+
329
+ i {
330
+ color: $jv-warning;
331
+ }
332
+ }
333
+
334
+ &.new {
335
+ background: $jv-primary-soft;
336
+ color: $jv-primary;
337
+
338
+ i {
339
+ color: $jv-primary;
340
+ }
341
+ }
342
+ }
343
+
344
+ // ===========================================================
345
+ // CATEGORY ICON ENHANCED (with glow effect)
346
+ // ===========================================================
347
+
348
+ .category-icon-enhanced {
349
+ position: relative;
350
+
351
+ &::after {
352
+ content: '';
353
+ position: absolute;
354
+ inset: -2px;
355
+ border-radius: inherit;
356
+ background: inherit;
357
+ opacity: 0.2;
358
+ z-index: -1;
359
+ filter: blur(4px);
360
+ }
361
+ }
362
+
363
+ // ===========================================================
364
+ // EMPTY STATE
365
+ // ===========================================================
366
+
367
+ .empty-state {
368
+ color: $jv-text-soft !important;
369
+ font-style: italic;
370
+ }
371
+
372
+ .empty-category-state {
373
+ display: flex;
374
+ align-items: center;
375
+ height: 100%;
376
+
377
+ .empty-icon {
378
+ display: flex;
379
+ align-items: center;
380
+ justify-content: center;
381
+ width: 28px;
382
+ height: 28px;
383
+ border-radius: $jv-radius-pill;
384
+ background: $jv-bg;
385
+ color: $jv-text-soft;
386
+ font-size: $jv-font-size-sm;
387
+ }
388
+
389
+ .empty-text {
390
+ font-size: $jv-font-size-xs;
391
+ color: $jv-text-soft;
392
+ font-weight: 500;
393
+ }
394
+ }
395
+
396
+ // ===========================================================
397
+ // SUBCATEGORY PILLS
398
+ // ===========================================================
399
+
400
+ .subcategory-pills {
401
+ margin-top: $jv-space-2;
402
+ }
403
+
404
+ .subcategory-pill {
405
+ display: inline-flex;
406
+ align-items: center;
407
+ gap: $jv-space-2;
408
+ padding: $jv-space-1 $jv-space-3 $jv-space-1 $jv-space-1;
409
+ background: $jv-bg;
410
+ border: 1px solid transparent;
411
+ border-radius: $jv-radius-pill;
412
+ text-decoration: none;
413
+ transition: all $jv-transition-fast;
414
+
415
+ .pill-icon {
416
+ display: flex;
417
+ align-items: center;
418
+ justify-content: center;
419
+ width: 22px;
420
+ height: 22px;
421
+ border-radius: $jv-radius-pill;
422
+ color: white;
423
+ font-size: $jv-font-size-xs;
424
+ flex-shrink: 0;
425
+
426
+ i {
427
+ line-height: 1;
428
+ }
429
+ }
430
+
431
+ .pill-name {
432
+ font-size: $jv-font-size-xs;
433
+ font-weight: 500;
434
+ color: $jv-text-main;
435
+ white-space: nowrap;
436
+ }
437
+
438
+ &:hover {
439
+ background: $jv-surface;
440
+ border-color: var(--pill-color, $jv-border-subtle);
441
+ box-shadow: $jv-shadow-sm;
442
+ transform: translateY(-1px);
443
+
444
+ .pill-name {
445
+ color: var(--pill-color, $jv-primary);
446
+ }
447
+ }
448
+
449
+ &:focus-visible {
450
+ outline: none;
451
+ box-shadow: $jv-focus-ring;
452
+ }
453
+ }
454
+
455
+ // ===========================================================
456
+ // ANIMATIONS
457
+ // ===========================================================
458
+
459
+ @keyframes pulse {
460
+ 0%, 100% {
461
+ opacity: 1;
462
+ }
463
+ 50% {
464
+ opacity: 0.6;
465
+ }
466
+ }
467
+
468
+ // ===========================================================
469
+ // RESPONSIVE ADJUSTMENTS
470
+ // ===========================================================
471
+
472
+ @media (max-width: 991px) {
473
+ li[component="categories/category"] {
474
+ padding: $jv-space-4;
475
+
476
+ .teaser {
477
+ margin-top: $jv-space-3;
478
+ }
479
+ }
480
+ }
481
+
482
+ @media (max-width: 576px) {
483
+ ul.categories-list.list-unstyled {
484
+ gap: $jv-space-2;
485
+ }
486
+
487
+ li[component="categories/category"] {
488
+ padding: $jv-space-4;
489
+ border-radius: $jv-radius-sm;
490
+
491
+ .title {
492
+ font-size: $jv-font-size-base;
493
+ }
494
+
495
+ .description {
496
+ font-size: $jv-font-size-xs;
497
+ }
498
+
499
+ .category-activity-row {
500
+ flex-wrap: wrap;
501
+ }
502
+ }
503
+
504
+ .subcategory-pills {
505
+ gap: $jv-space-1 !important;
506
+ }
507
+
508
+ .subcategory-pill {
509
+ padding: $jv-space-1 $jv-space-2 $jv-space-1 $jv-space-1;
510
+
511
+ .pill-icon {
512
+ width: 18px;
513
+ height: 18px;
514
+ font-size: $jv-font-size-xs;
515
+ }
516
+
517
+ .pill-name {
518
+ font-size: $jv-font-size-xs;
519
+ }
520
+ }
521
+ }