@okjavis/nodebb-theme-javis 1.0.1 → 1.1.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.
@@ -0,0 +1,502 @@
1
+ // ===========================================================
2
+ // INPUT SYSTEM – Global Form Controls
3
+ // ===========================================================
4
+
5
+ .form-control,
6
+ input[type="text"],
7
+ input[type="search"],
8
+ input[type="email"],
9
+ input[type="password"],
10
+ textarea,
11
+ .form-select {
12
+ background: $jv-surface;
13
+ border: 1px solid $jv-border-subtle;
14
+ border-radius: $jv-radius-pill;
15
+ padding: 10px 16px;
16
+ font-size: $jv-font-size-base;
17
+ color: $jv-text-main;
18
+ line-height: $jv-line-height-tight;
19
+ box-shadow: none;
20
+ transition: all 0.15s ease;
21
+
22
+ &::placeholder {
23
+ color: $jv-text-muted;
24
+ }
25
+
26
+ &:focus {
27
+ outline: none;
28
+ border-color: $jv-primary;
29
+ box-shadow: 0 0 0 3px $jv-primary-soft;
30
+ }
31
+ }
32
+
33
+ // Textarea specific
34
+ textarea {
35
+ border-radius: $jv-radius-md;
36
+ resize: vertical;
37
+ min-height: 100px;
38
+ }
39
+
40
+ // ===========================================================
41
+ // SEARCH BAR
42
+ // ===========================================================
43
+
44
+ .search-widget .input-group {
45
+ .form-control {
46
+ border-top-right-radius: 0;
47
+ border-bottom-right-radius: 0;
48
+ }
49
+
50
+ .btn-primary {
51
+ border-top-left-radius: 0;
52
+ border-bottom-left-radius: 0;
53
+ padding: 0 18px;
54
+ }
55
+ }
56
+
57
+ // ===========================================================
58
+ // COMPOSER TRIGGER (Write a Post…)
59
+ // ===========================================================
60
+
61
+ .jlc-trigger {
62
+ width: 100%;
63
+ background: $jv-surface;
64
+ border: 1px solid $jv-border-subtle;
65
+ border-radius: $jv-radius-pill;
66
+ padding: 12px 18px;
67
+ font-size: $jv-font-size-base;
68
+ font-weight: 400;
69
+ text-align: left;
70
+ color: $jv-text-muted;
71
+ box-shadow: $jv-shadow-soft;
72
+ transition: all 0.15s ease;
73
+
74
+ &:hover,
75
+ &:focus {
76
+ background: $jv-surface;
77
+ border-color: $jv-primary;
78
+ color: $jv-primary;
79
+ box-shadow: $jv-shadow-soft;
80
+ outline: none;
81
+ }
82
+
83
+ &:active {
84
+ transform: scale(0.99);
85
+ }
86
+
87
+ // Override Bootstrap button states
88
+ &.btn,
89
+ &.btn:focus,
90
+ &.btn:hover,
91
+ &.btn:active {
92
+ background: $jv-surface;
93
+ border-radius: $jv-radius-pill;
94
+ box-shadow: $jv-shadow-soft;
95
+ border-color: $jv-border-subtle;
96
+ outline: none;
97
+ }
98
+
99
+ &.btn:hover,
100
+ &.btn:focus {
101
+ border-color: $jv-primary;
102
+ color: $jv-primary;
103
+ }
104
+ }
105
+
106
+ // ===========================================================
107
+ // DROPDOWN MENUS
108
+ // ===========================================================
109
+ .dropdown-menu {
110
+ border: 1px solid $jv-border-subtle;
111
+ border-radius: $jv-radius-md;
112
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
113
+ padding: $jv-space-2 0;
114
+ min-width: 180px;
115
+ background: $jv-surface;
116
+ animation: dropdownFade 0.15s ease;
117
+
118
+ @keyframes dropdownFade {
119
+ from {
120
+ opacity: 0;
121
+ transform: translateY(-4px);
122
+ }
123
+ to {
124
+ opacity: 1;
125
+ transform: translateY(0);
126
+ }
127
+ }
128
+
129
+ .dropdown-item {
130
+ padding: $jv-space-4 $jv-space-8;
131
+ font-size: $jv-font-size-sm;
132
+ color: $jv-text-main;
133
+ transition: background-color 0.15s ease;
134
+ display: flex;
135
+ align-items: center;
136
+ gap: $jv-space-4;
137
+
138
+ i {
139
+ width: 16px;
140
+ color: $jv-text-muted;
141
+ }
142
+
143
+ &:hover {
144
+ background: rgba(0, 81, 255, 0.06);
145
+ color: $jv-primary;
146
+
147
+ i {
148
+ color: $jv-primary;
149
+ }
150
+ }
151
+
152
+ &:active {
153
+ background: rgba(0, 81, 255, 0.1);
154
+ }
155
+
156
+ &.active {
157
+ background: $jv-primary-soft;
158
+ color: $jv-primary;
159
+ font-weight: 500;
160
+ }
161
+ }
162
+
163
+ .dropdown-divider {
164
+ margin: $jv-space-2 0;
165
+ border-top-color: $jv-border-subtle;
166
+ }
167
+
168
+ .dropdown-header {
169
+ padding: $jv-space-2 $jv-space-8;
170
+ font-size: $jv-font-size-xs;
171
+ font-weight: 600;
172
+ color: $jv-text-soft;
173
+ text-transform: uppercase;
174
+ letter-spacing: 0.5px;
175
+ }
176
+ }
177
+
178
+ // ===========================================================
179
+ // BADGES & LABELS
180
+ // ===========================================================
181
+ .badge {
182
+ font-size: 11px;
183
+ font-weight: 600;
184
+ padding: 3px 8px;
185
+ border-radius: $jv-radius-pill;
186
+ line-height: 1.2;
187
+ }
188
+
189
+ .badge-primary,
190
+ .bg-primary {
191
+ background-color: $jv-primary !important;
192
+ color: #fff;
193
+ }
194
+
195
+ .badge-secondary,
196
+ .bg-secondary {
197
+ background-color: #6b7280 !important;
198
+ color: #fff;
199
+ }
200
+
201
+ .badge-success,
202
+ .bg-success {
203
+ background-color: #10b981 !important;
204
+ color: #fff;
205
+ }
206
+
207
+ .badge-danger,
208
+ .bg-danger {
209
+ background-color: #ef4444 !important;
210
+ color: #fff;
211
+ }
212
+
213
+ .badge-warning,
214
+ .bg-warning {
215
+ background-color: #f59e0b !important;
216
+ color: #fff;
217
+ }
218
+
219
+ .badge-info,
220
+ .bg-info {
221
+ background-color: #3b82f6 !important;
222
+ color: #fff;
223
+ }
224
+
225
+ .badge-light,
226
+ .bg-light {
227
+ background-color: rgba(0, 0, 0, 0.06) !important;
228
+ color: $jv-text-main;
229
+ }
230
+
231
+ // ===========================================================
232
+ // ALERTS
233
+ // ===========================================================
234
+ .alert {
235
+ border-radius: $jv-radius-md;
236
+ border: none;
237
+ padding: $jv-space-8;
238
+ font-size: $jv-font-size-sm;
239
+
240
+ .alert-link {
241
+ font-weight: 600;
242
+ }
243
+ }
244
+
245
+ .alert-primary {
246
+ background: rgba(0, 81, 255, 0.1);
247
+ color: #0044dd;
248
+ }
249
+
250
+ .alert-success {
251
+ background: rgba(16, 185, 129, 0.1);
252
+ color: #059669;
253
+ }
254
+
255
+ .alert-danger {
256
+ background: rgba(239, 68, 68, 0.1);
257
+ color: #dc2626;
258
+ }
259
+
260
+ .alert-warning {
261
+ background: rgba(245, 158, 11, 0.1);
262
+ color: #d97706;
263
+ }
264
+
265
+ .alert-info {
266
+ background: rgba(59, 130, 246, 0.1);
267
+ color: #2563eb;
268
+ }
269
+
270
+ // ===========================================================
271
+ // TOOLTIPS
272
+ // ===========================================================
273
+ .tooltip {
274
+ font-size: $jv-font-size-xs;
275
+
276
+ .tooltip-inner {
277
+ background: #1f2937;
278
+ border-radius: $jv-radius-xs;
279
+ padding: 4px 8px;
280
+ max-width: 240px;
281
+ }
282
+
283
+ .tooltip-arrow::before {
284
+ border-top-color: #1f2937;
285
+ }
286
+ }
287
+
288
+ // ===========================================================
289
+ // MODALS
290
+ // ===========================================================
291
+ .modal-content {
292
+ border: none;
293
+ border-radius: $jv-radius-lg;
294
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);
295
+ }
296
+
297
+ .modal-header {
298
+ border-bottom: 1px solid $jv-border-subtle;
299
+ padding: $jv-space-8 $jv-space-10;
300
+
301
+ .modal-title {
302
+ font-weight: 600;
303
+ font-size: $jv-font-size-lg;
304
+ }
305
+
306
+ .btn-close {
307
+ opacity: 0.5;
308
+ transition: opacity 0.15s ease;
309
+
310
+ &:hover {
311
+ opacity: 1;
312
+ }
313
+ }
314
+ }
315
+
316
+ .modal-body {
317
+ padding: $jv-space-10;
318
+ }
319
+
320
+ .modal-footer {
321
+ border-top: 1px solid $jv-border-subtle;
322
+ padding: $jv-space-8 $jv-space-10;
323
+ gap: $jv-space-4;
324
+ }
325
+
326
+ // ===========================================================
327
+ // CHECKBOX & RADIO
328
+ // ===========================================================
329
+ .form-check-input {
330
+ width: 18px;
331
+ height: 18px;
332
+ margin-top: 0;
333
+ border: 2px solid $jv-border-strong;
334
+ transition: all 0.15s ease;
335
+
336
+ &:checked {
337
+ background-color: $jv-primary;
338
+ border-color: $jv-primary;
339
+ }
340
+
341
+ &:focus {
342
+ box-shadow: 0 0 0 3px $jv-primary-soft;
343
+ border-color: $jv-primary;
344
+ }
345
+ }
346
+
347
+ .form-check-label {
348
+ margin-left: $jv-space-2;
349
+ font-size: $jv-font-size-sm;
350
+ cursor: pointer;
351
+ }
352
+
353
+ // ===========================================================
354
+ // TOGGLE SWITCH
355
+ // ===========================================================
356
+ .form-switch {
357
+ .form-check-input {
358
+ width: 40px;
359
+ height: 22px;
360
+ border-radius: $jv-radius-pill;
361
+ background-color: #d1d5db;
362
+ border: none;
363
+
364
+ &:checked {
365
+ background-color: $jv-primary;
366
+ }
367
+ }
368
+ }
369
+
370
+ // ===========================================================
371
+ // LIST GROUPS
372
+ // ===========================================================
373
+ .list-group-item {
374
+ border: none;
375
+ border-bottom: 1px solid $jv-border-subtle;
376
+ padding: $jv-space-6 $jv-space-8;
377
+ transition: background-color 0.15s ease;
378
+
379
+ &:last-child {
380
+ border-bottom: none;
381
+ }
382
+
383
+ &:hover {
384
+ background: rgba(0, 0, 0, 0.02);
385
+ }
386
+
387
+ &.active {
388
+ background: $jv-primary-soft;
389
+ border-color: transparent;
390
+ color: $jv-primary;
391
+ }
392
+ }
393
+
394
+ // ===========================================================
395
+ // TABLES
396
+ // ===========================================================
397
+ .table {
398
+ th {
399
+ font-weight: 600;
400
+ font-size: $jv-font-size-xs;
401
+ text-transform: uppercase;
402
+ letter-spacing: 0.5px;
403
+ color: $jv-text-muted;
404
+ border-bottom-width: 1px;
405
+ }
406
+
407
+ td {
408
+ vertical-align: middle;
409
+ }
410
+
411
+ &.table-hover tbody tr:hover {
412
+ background: rgba(0, 0, 0, 0.02);
413
+ }
414
+ }
415
+
416
+ // ===========================================================
417
+ // PAGINATION
418
+ // ===========================================================
419
+ .pagination {
420
+ gap: 4px;
421
+
422
+ .page-link {
423
+ border: none;
424
+ border-radius: $jv-radius-sm;
425
+ padding: 6px 12px;
426
+ font-size: $jv-font-size-sm;
427
+ color: $jv-text-main;
428
+ background: transparent;
429
+ transition: all 0.15s ease;
430
+
431
+ &:hover {
432
+ background: rgba(0, 0, 0, 0.05);
433
+ color: $jv-primary;
434
+ }
435
+ }
436
+
437
+ .page-item.active .page-link {
438
+ background: $jv-primary;
439
+ color: #fff;
440
+ }
441
+
442
+ .page-item.disabled .page-link {
443
+ color: $jv-text-soft;
444
+ background: transparent;
445
+ }
446
+ }
447
+
448
+ // ===========================================================
449
+ // NAV TABS
450
+ // ===========================================================
451
+ .nav-tabs {
452
+ border-bottom: 1px solid $jv-border-subtle;
453
+ gap: 4px;
454
+
455
+ .nav-link {
456
+ border: none;
457
+ border-bottom: 2px solid transparent;
458
+ border-radius: 0;
459
+ padding: $jv-space-4 $jv-space-6;
460
+ font-size: $jv-font-size-sm;
461
+ font-weight: 500;
462
+ color: $jv-text-muted;
463
+ transition: all 0.15s ease;
464
+
465
+ &:hover {
466
+ color: $jv-text-main;
467
+ border-bottom-color: $jv-border-strong;
468
+ }
469
+
470
+ &.active {
471
+ color: $jv-primary;
472
+ border-bottom-color: $jv-primary;
473
+ background: transparent;
474
+ }
475
+ }
476
+ }
477
+
478
+ // ===========================================================
479
+ // NAV PILLS
480
+ // ===========================================================
481
+ .nav-pills {
482
+ gap: 4px;
483
+
484
+ .nav-link {
485
+ border-radius: $jv-radius-pill;
486
+ padding: $jv-space-4 $jv-space-8;
487
+ font-size: $jv-font-size-sm;
488
+ font-weight: 500;
489
+ color: $jv-text-muted;
490
+ transition: all 0.15s ease;
491
+
492
+ &:hover {
493
+ background: rgba(0, 0, 0, 0.04);
494
+ color: $jv-text-main;
495
+ }
496
+
497
+ &.active {
498
+ background: $jv-primary;
499
+ color: #fff;
500
+ }
501
+ }
502
+ }
@@ -0,0 +1,150 @@
1
+ // ===========================================================
2
+ // SIDEBAR USER SECTION
3
+ // User profile in left sidebar - collapsed/expanded states
4
+ // ===========================================================
5
+
6
+ // User section container
7
+ .sidebar-user-section {
8
+ border-top: 1px solid $jv-border-subtle;
9
+ padding-top: $jv-space-4;
10
+ margin-top: auto;
11
+ }
12
+
13
+ // User trigger button
14
+ .sidebar-user-trigger {
15
+ padding: $jv-space-4 $jv-space-4;
16
+ border-radius: $jv-radius-sm;
17
+ transition: background-color 0.15s ease;
18
+
19
+ &:hover {
20
+ background-color: rgba(0, 0, 0, 0.04);
21
+ }
22
+ }
23
+
24
+ // Avatar wrapper with status indicator
25
+ .sidebar-avatar-wrapper {
26
+ flex-shrink: 0;
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: center;
30
+
31
+ // The avatar image
32
+ .avatar {
33
+ width: 32px;
34
+ height: 32px;
35
+ border-radius: 50%;
36
+ object-fit: cover;
37
+ }
38
+
39
+ // Status dot positioning
40
+ .sidebar-status-dot {
41
+ width: 10px;
42
+ height: 10px;
43
+ bottom: 0;
44
+ right: 0;
45
+
46
+ &.online {
47
+ background-color: #22c55e;
48
+ }
49
+ &.away {
50
+ background-color: #f59e0b;
51
+ }
52
+ &.dnd {
53
+ background-color: #ef4444;
54
+ }
55
+ &.offline {
56
+ background-color: #9ca3af;
57
+ }
58
+ }
59
+ }
60
+
61
+ // Collapsed state - just show avatar
62
+ .sidebar-left:not(.open) {
63
+ .sidebar-user-section {
64
+ .sidebar-user-trigger {
65
+ justify-content: center;
66
+ padding: $jv-space-4 0;
67
+ }
68
+ }
69
+
70
+ .sidebar-avatar-wrapper .avatar {
71
+ width: 28px;
72
+ height: 28px;
73
+ }
74
+ }
75
+
76
+ // Expanded state - show avatar + name
77
+ .sidebar-left.open {
78
+ .sidebar-user-section {
79
+ .sidebar-user-trigger {
80
+ padding: $jv-space-4 $jv-space-6;
81
+ }
82
+ }
83
+
84
+ .sidebar-avatar-wrapper .avatar {
85
+ width: 32px;
86
+ height: 32px;
87
+ }
88
+ }
89
+
90
+ // Auth section for logged-out users
91
+ .sidebar-auth-section {
92
+ border-top: 1px solid $jv-border-subtle;
93
+ padding-top: $jv-space-4;
94
+ margin-top: auto;
95
+
96
+ .nav-link {
97
+ padding: $jv-space-2 $jv-space-4;
98
+ border-radius: $jv-radius-sm;
99
+ font-size: $jv-font-size-sm;
100
+ color: $jv-text-main;
101
+
102
+ &:hover {
103
+ background-color: rgba(0, 0, 0, 0.04);
104
+ color: $jv-primary;
105
+ }
106
+
107
+ i {
108
+ color: $jv-text-muted;
109
+ }
110
+ }
111
+ }
112
+
113
+ // Bottom section layout
114
+ .sidebar-bottom-section {
115
+ display: flex;
116
+ flex-direction: column;
117
+ margin-top: auto;
118
+ }
119
+
120
+ // User dropdown menu styling
121
+ .sidebar-user-section .dropdown-menu {
122
+ min-width: 220px;
123
+ padding: $jv-space-2;
124
+ border-radius: $jv-radius-md;
125
+ border: 1px solid $jv-border-subtle;
126
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
127
+
128
+ .dropdown-item {
129
+ padding: $jv-space-2 $jv-space-4;
130
+ font-size: $jv-font-size-sm;
131
+ border-radius: $jv-radius-sm;
132
+
133
+ &:hover {
134
+ background-color: rgba(0, 0, 0, 0.04);
135
+ }
136
+ }
137
+
138
+ .dropdown-header {
139
+ font-size: $jv-font-size-xs;
140
+ color: $jv-text-muted;
141
+ text-transform: uppercase;
142
+ letter-spacing: 0.5px;
143
+ padding: $jv-space-2 $jv-space-4;
144
+ }
145
+
146
+ .dropdown-divider {
147
+ margin: $jv-space-2 0;
148
+ border-color: $jv-border-subtle;
149
+ }
150
+ }