nodebb-theme-flawless-rp 1.0.3 → 1.0.5

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.
@@ -1,27 +1,27 @@
1
- // NodeBB 1.19 / Bootstrap LESS compatibility variables.
2
- // Required by default NodeBB plugins such as composer-default.
3
-
4
- @zindex-navbar: 1000;
5
- @zindex-dropdown: 1000;
6
- @zindex-popover: 1060;
7
- @zindex-tooltip: 1070;
8
- @zindex-navbar-fixed: 1030;
9
- @zindex-modal-background: 1040;
10
- @zindex-modal: 1050;
11
-
12
- @modal-backdrop-bg: #000;
13
- @modal-backdrop-opacity: 0.5;
14
-
15
- @screen-xs: 480px;
16
- @screen-sm: 768px;
17
- @screen-md: 992px;
18
- @screen-lg: 1200px;
19
-
20
- @screen-xs-min: @screen-xs;
21
- @screen-sm-min: @screen-sm;
22
- @screen-md-min: @screen-md;
23
- @screen-lg-min: @screen-lg;
24
-
25
- @screen-xs-max: (@screen-sm-min - 1);
26
- @screen-sm-max: (@screen-md-min - 1);
27
- @screen-md-max: (@screen-lg-min - 1);
1
+ // NodeBB 1.19 / Bootstrap LESS compatibility variables.
2
+ // Required by default NodeBB plugins such as composer-default.
3
+
4
+ @zindex-navbar: 1000;
5
+ @zindex-dropdown: 1000;
6
+ @zindex-popover: 1060;
7
+ @zindex-tooltip: 1070;
8
+ @zindex-navbar-fixed: 1030;
9
+ @zindex-modal-background: 1040;
10
+ @zindex-modal: 1050;
11
+
12
+ @modal-backdrop-bg: #000;
13
+ @modal-backdrop-opacity: 0.5;
14
+
15
+ @screen-xs: 480px;
16
+ @screen-sm: 768px;
17
+ @screen-md: 992px;
18
+ @screen-lg: 1200px;
19
+
20
+ @screen-xs-min: @screen-xs;
21
+ @screen-sm-min: @screen-sm;
22
+ @screen-md-min: @screen-md;
23
+ @screen-lg-min: @screen-lg;
24
+
25
+ @screen-xs-max: (@screen-sm-min - 1);
26
+ @screen-sm-max: (@screen-md-min - 1);
27
+ @screen-md-max: (@screen-lg-min - 1);
@@ -0,0 +1,1021 @@
1
+ /* ============================================
2
+ FLAWLESS ROLEPLAY — Underground Criminal Empire
3
+ NodeBB Theme Override
4
+ ============================================ */
5
+
6
+
7
+ :root {
8
+ /* ---- Backgrounds ---- */
9
+ --bs-body-bg: #0a0a0b;
10
+ --bs-body-color: #e5e7eb;
11
+ --bs-secondary-bg: #111114;
12
+ --bs-tertiary-bg: #18181c;
13
+
14
+ /* ---- Surfaces ---- */
15
+ --frp-surface: #111114;
16
+ --frp-surface-hover: #18181c;
17
+ --frp-surface-active: #1e1e24;
18
+ --frp-surface-elevated: #1a1a1f;
19
+
20
+ /* ---- Borders ---- */
21
+ --frp-border: #1e1e24;
22
+ --frp-border-subtle: #161619;
23
+ --frp-border-strong: #2a2a32;
24
+
25
+ /* ---- Primary — Gold/Amber (power, money, authority) ---- */
26
+ --frp-primary: #F59E0B;
27
+ --frp-primary-hover: #D97706;
28
+ --frp-primary-light: rgba(245, 158, 11, 0.15);
29
+ --frp-primary-glow: 0 0 20px rgba(245, 158, 11, 0.3);
30
+ --bs-primary: #F59E0B;
31
+ --bs-primary-rgb: 245, 158, 11;
32
+ --bs-link-color: #F59E0B;
33
+ --bs-link-hover-color: #D97706;
34
+
35
+ /* ---- Danger — Red ---- */
36
+ --frp-danger: #EF4444;
37
+ --frp-danger-light: rgba(239, 68, 68, 0.15);
38
+
39
+ /* ---- Success — Green ---- */
40
+ --frp-success: #22C55E;
41
+ --frp-success-light: rgba(34, 197, 94, 0.15);
42
+
43
+ /* ---- Info — Blue (law enforcement) ---- */
44
+ --frp-info: #3B82F6;
45
+ --frp-info-light: rgba(59, 130, 246, 0.15);
46
+
47
+ /* ---- Warning ---- */
48
+ --frp-warning: #F59E0B;
49
+ --frp-warning-light: rgba(245, 158, 11, 0.15);
50
+
51
+ /* ---- Muted ---- */
52
+ --frp-muted: #6B7280;
53
+ --frp-muted-light: #9CA3AF;
54
+
55
+ /* ---- Faction Colors ---- */
56
+ --frp-faction-lspd: #3B82F6;
57
+ --frp-faction-fbi: #1D4ED8;
58
+ --frp-faction-sasd: #92400E;
59
+ --frp-faction-ares: #7C3AED;
60
+ --frp-faction-sanews: #06B6D4;
61
+ --frp-faction-gov: #059669;
62
+ --frp-faction-hitman: #DC2626;
63
+ --frp-faction-medic: #F43F5E;
64
+ --frp-faction-ng: #4B5563;
65
+
66
+ /* ---- Gang Colors (from bandana hex) ---- */
67
+ --frp-gang-ghouls: #F58216;
68
+ --frp-gang-velvet: #636363;
69
+ --frp-gang-baba: #22C55E;
70
+ --frp-gang-rifa: #3B82F6;
71
+ --frp-gang-grove: #16A34A;
72
+ --frp-gang-lcn: #1F2937;
73
+
74
+ /* ---- Typography ---- */
75
+ --frp-font-display: 'Barlow Condensed', sans-serif;
76
+ --frp-font-body: 'Barlow', sans-serif;
77
+ --frp-font-mono: 'JetBrains Mono', monospace;
78
+ --bs-body-font-family: 'Barlow', sans-serif;
79
+ }
80
+
81
+ /* ============================================
82
+ GLOBAL OVERRIDES
83
+ ============================================ */
84
+
85
+ body {
86
+ background-color: #0a0a0b !important;
87
+ color: #e5e7eb;
88
+ font-family: var(--frp-font-body);
89
+ -webkit-font-smoothing: antialiased;
90
+ -moz-osx-font-smoothing: grayscale;
91
+ }
92
+
93
+ a {
94
+ color: var(--frp-primary);
95
+ text-decoration: none;
96
+ transition: color 0.15s ease;
97
+ }
98
+
99
+ a:hover {
100
+ color: var(--frp-primary-hover);
101
+ }
102
+
103
+ h1, h2, h3, h4, h5, h6 {
104
+ font-family: var(--frp-font-display);
105
+ font-weight: 700;
106
+ text-transform: uppercase;
107
+ letter-spacing: 0.5px;
108
+ color: #f3f4f6;
109
+ }
110
+
111
+ code, pre, .monospace {
112
+ font-family: var(--frp-font-mono);
113
+ }
114
+
115
+ ::selection {
116
+ background: rgba(245, 158, 11, 0.3);
117
+ color: #fff;
118
+ }
119
+
120
+ /* Scrollbar */
121
+ ::-webkit-scrollbar {
122
+ width: 8px;
123
+ height: 8px;
124
+ }
125
+
126
+ ::-webkit-scrollbar-track {
127
+ background: #0a0a0b;
128
+ }
129
+
130
+ ::-webkit-scrollbar-thumb {
131
+ background: #2a2a32;
132
+ border-radius: 4px;
133
+ }
134
+
135
+ ::-webkit-scrollbar-thumb:hover {
136
+ background: #3a3a44;
137
+ }
138
+
139
+ /* ============================================
140
+ HEADER / NAVBAR
141
+ ============================================ */
142
+
143
+ .navbar,
144
+ [component="navbar"],
145
+ header .navbar {
146
+ background: #111114 !important;
147
+ border-bottom: 1px solid var(--frp-border) !important;
148
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
149
+ backdrop-filter: blur(12px);
150
+ }
151
+
152
+ .navbar .navbar-brand,
153
+ [component="navbar"] .navbar-brand {
154
+ font-family: var(--frp-font-display) !important;
155
+ font-weight: 700 !important;
156
+ color: var(--frp-primary) !important;
157
+ text-transform: uppercase;
158
+ letter-spacing: 2px;
159
+ font-size: 1.3rem;
160
+ }
161
+
162
+ .navbar .nav-link,
163
+ [component="navbar"] .nav-link {
164
+ color: #9CA3AF !important;
165
+ font-family: var(--frp-font-body);
166
+ font-weight: 500;
167
+ transition: color 0.15s ease;
168
+ }
169
+
170
+ .navbar .nav-link:hover,
171
+ .navbar .nav-link.active,
172
+ [component="navbar"] .nav-link:hover,
173
+ [component="navbar"] .nav-link.active {
174
+ color: var(--frp-primary) !important;
175
+ }
176
+
177
+ .navbar .dropdown-menu,
178
+ [component="navbar"] .dropdown-menu {
179
+ background: var(--frp-surface) !important;
180
+ border: 1px solid var(--frp-border) !important;
181
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
182
+ }
183
+
184
+ .navbar .dropdown-item,
185
+ [component="navbar"] .dropdown-item {
186
+ color: #e5e7eb !important;
187
+ }
188
+
189
+ .navbar .dropdown-item:hover,
190
+ [component="navbar"] .dropdown-item:hover {
191
+ background: var(--frp-surface-hover) !important;
192
+ color: var(--frp-primary) !important;
193
+ }
194
+
195
+ /* ============================================
196
+ CATEGORY LIST
197
+ ============================================ */
198
+
199
+ [component="categories/category"] {
200
+ background: var(--frp-surface) !important;
201
+ border: 1px solid var(--frp-border) !important;
202
+ border-left: 3px solid var(--frp-primary) !important;
203
+ border-radius: 4px !important;
204
+ margin-bottom: 8px !important;
205
+ transition: all 0.2s ease;
206
+ }
207
+
208
+ [component="categories/category"]:hover {
209
+ border-left-color: var(--frp-primary-hover) !important;
210
+ background: var(--frp-surface-hover) !important;
211
+ box-shadow: var(--frp-primary-glow);
212
+ }
213
+
214
+ /* Category Headers / Section Headers */
215
+ .category-header,
216
+ .section-header {
217
+ font-family: var(--frp-font-display);
218
+ font-weight: 700;
219
+ text-transform: uppercase;
220
+ letter-spacing: 2px;
221
+ color: var(--frp-primary);
222
+ border-bottom: 2px solid var(--frp-primary);
223
+ padding-bottom: 8px;
224
+ margin-bottom: 16px;
225
+ font-size: 1.1rem;
226
+ }
227
+
228
+ /* Category icons */
229
+ [component="categories/category"] .category-icon {
230
+ color: var(--frp-primary);
231
+ }
232
+
233
+ /* Category stats */
234
+ [component="categories/category"] .category-stat {
235
+ color: var(--frp-muted);
236
+ font-family: var(--frp-font-mono);
237
+ font-size: 0.8rem;
238
+ }
239
+
240
+ /* Category description */
241
+ [component="categories/category"] .category-description {
242
+ color: var(--frp-muted-light);
243
+ font-size: 0.85rem;
244
+ }
245
+
246
+ /* ============================================
247
+ TOPIC LIST
248
+ ============================================ */
249
+
250
+ component="category/topic",
251
+ [component="category"] .topic-row,
252
+ .topics-list .topic-row {
253
+ background: var(--frp-surface) !important;
254
+ border: 1px solid var(--frp-border) !important;
255
+ border-radius: 4px !important;
256
+ margin-bottom: 4px !important;
257
+ transition: all 0.15s ease;
258
+ }
259
+
260
+ .topics-list .topic-row:hover {
261
+ background: var(--frp-surface-hover) !important;
262
+ border-color: var(--frp-border-strong) !important;
263
+ }
264
+
265
+ component="category/topic" .title,
266
+ .topics-list .topic-title a {
267
+ color: #e5e7eb !important;
268
+ font-weight: 500;
269
+ }
270
+
271
+ component="category/topic" .title:hover,
272
+ .topics-list .topic-title a:hover {
273
+ color: var(--frp-primary) !important;
274
+ }
275
+
276
+ /* Pinned topics */
277
+ component="category/topic".pinned {
278
+ border-left: 3px solid var(--frp-primary) !important;
279
+ }
280
+
281
+ /* Locked topics */
282
+ component="category/topic".locked {
283
+ opacity: 0.7;
284
+ }
285
+
286
+ /* ============================================
287
+ TOPIC VIEW / POST CONTENT
288
+ ============================================ */
289
+
290
+ [component="post"],
291
+ .post-container {
292
+ background: var(--frp-surface) !important;
293
+ border: 1px solid var(--frp-border) !important;
294
+ border-radius: 4px !important;
295
+ margin-bottom: 12px !important;
296
+ }
297
+
298
+ [component="post"] .post-header {
299
+ border-bottom: 1px solid var(--frp-border);
300
+ padding-bottom: 8px;
301
+ }
302
+
303
+ [component="post"] .content,
304
+ .post-content {
305
+ color: #d1d5db;
306
+ line-height: 1.7;
307
+ }
308
+
309
+ [component="post"] .content blockquote {
310
+ border-left: 3px solid var(--frp-primary);
311
+ background: var(--frp-primary-light);
312
+ padding: 12px 16px;
313
+ border-radius: 0 4px 4px 0;
314
+ color: #e5e7eb;
315
+ }
316
+
317
+ [component="post"] .content code {
318
+ background: rgba(245, 158, 11, 0.1);
319
+ color: var(--frp-primary);
320
+ padding: 2px 6px;
321
+ border-radius: 3px;
322
+ font-family: var(--frp-font-mono);
323
+ }
324
+
325
+ [component="post"] .content pre {
326
+ background: #0d0d0f !important;
327
+ border: 1px solid var(--frp-border);
328
+ border-radius: 4px;
329
+ padding: 16px;
330
+ }
331
+
332
+ /* Post actions */
333
+ [component="post"] .post-footer .btn,
334
+ [component="post"] .actions .btn {
335
+ color: var(--frp-muted) !important;
336
+ transition: color 0.15s ease;
337
+ }
338
+
339
+ [component="post"] .post-footer .btn:hover,
340
+ [component="post"] .actions .btn:hover {
341
+ color: var(--frp-primary) !important;
342
+ }
343
+
344
+ /* ============================================
345
+ USER PROFILE / AVATAR
346
+ ============================================ */
347
+
348
+ .avatar {
349
+ border: 2px solid var(--frp-border);
350
+ border-radius: 50%;
351
+ }
352
+
353
+ /* Donator glow effects */
354
+ .avatar.donator-daisy {
355
+ border-color: #A3E635;
356
+ box-shadow: 0 0 8px rgba(163, 230, 53, 0.3);
357
+ }
358
+
359
+ .avatar.donator-rose {
360
+ border-color: #F59E0B;
361
+ box-shadow: 0 0 8px rgba(245, 158, 11, 0.3);
362
+ }
363
+
364
+ .avatar.donator-ivy {
365
+ border-color: #EF4444;
366
+ box-shadow: 0 0 12px rgba(239, 68, 68, 0.4);
367
+ animation: ivyGlow 2s ease-in-out infinite alternate;
368
+ }
369
+
370
+ @keyframes ivyGlow {
371
+ from { box-shadow: 0 0 8px rgba(239, 68, 68, 0.3); }
372
+ to { box-shadow: 0 0 16px rgba(245, 158, 11, 0.5); }
373
+ }
374
+
375
+ /* User profile page */
376
+ [component="account/profile"] {
377
+ background: var(--frp-surface) !important;
378
+ }
379
+
380
+ .profile-header {
381
+ background: linear-gradient(135deg, #111114 0%, #1a1a1f 100%);
382
+ border-bottom: 2px solid var(--frp-primary);
383
+ }
384
+
385
+ /* ============================================
386
+ SIDEBAR & WIDGETS
387
+ ============================================ */
388
+
389
+ .sidebar .widget,
390
+ [widget-area] .widget {
391
+ background: var(--frp-surface) !important;
392
+ border: 1px solid var(--frp-border) !important;
393
+ border-radius: 4px !important;
394
+ margin-bottom: 12px !important;
395
+ }
396
+
397
+ .sidebar .widget .widget-header,
398
+ [widget-area] .widget .widget-header {
399
+ font-family: var(--frp-font-display);
400
+ font-weight: 700;
401
+ text-transform: uppercase;
402
+ letter-spacing: 1px;
403
+ color: var(--frp-primary);
404
+ border-bottom: 2px solid var(--frp-primary);
405
+ padding-bottom: 8px;
406
+ margin-bottom: 12px;
407
+ font-size: 0.95rem;
408
+ }
409
+
410
+ /* ============================================
411
+ BUTTONS
412
+ ============================================ */
413
+
414
+ .btn-primary,
415
+ .btn-primary:focus {
416
+ background-color: var(--frp-primary) !important;
417
+ border-color: var(--frp-primary) !important;
418
+ color: #000 !important;
419
+ font-family: var(--frp-font-display);
420
+ font-weight: 600;
421
+ text-transform: uppercase;
422
+ letter-spacing: 1px;
423
+ transition: all 0.2s ease;
424
+ }
425
+
426
+ .btn-primary:hover {
427
+ background-color: var(--frp-primary-hover) !important;
428
+ border-color: var(--frp-primary-hover) !important;
429
+ box-shadow: var(--frp-primary-glow);
430
+ }
431
+
432
+ .btn-outline-primary {
433
+ border-color: var(--frp-primary) !important;
434
+ color: var(--frp-primary) !important;
435
+ }
436
+
437
+ .btn-outline-primary:hover {
438
+ background-color: var(--frp-primary) !important;
439
+ color: #000 !important;
440
+ }
441
+
442
+ .btn-secondary {
443
+ background-color: var(--frp-surface-active) !important;
444
+ border-color: var(--frp-border) !important;
445
+ color: #e5e7eb !important;
446
+ }
447
+
448
+ .btn-secondary:hover {
449
+ background-color: var(--frp-surface-hover) !important;
450
+ border-color: var(--frp-border-strong) !important;
451
+ }
452
+
453
+ .btn-danger {
454
+ background-color: var(--frp-danger) !important;
455
+ border-color: var(--frp-danger) !important;
456
+ }
457
+
458
+ .btn-success {
459
+ background-color: var(--frp-success) !important;
460
+ border-color: var(--frp-success) !important;
461
+ }
462
+
463
+ /* ============================================
464
+ FORMS & INPUTS
465
+ ============================================ */
466
+
467
+ .form-control,
468
+ .form-select,
469
+ input[type="text"],
470
+ input[type="email"],
471
+ input[type="password"],
472
+ textarea,
473
+ select {
474
+ background-color: #0d0d0f !important;
475
+ border: 1px solid var(--frp-border) !important;
476
+ color: #e5e7eb !important;
477
+ font-family: var(--frp-font-body);
478
+ border-radius: 4px;
479
+ transition: border-color 0.15s ease;
480
+ }
481
+
482
+ .form-control:focus,
483
+ .form-select:focus,
484
+ input:focus,
485
+ textarea:focus,
486
+ select:focus {
487
+ border-color: var(--frp-primary) !important;
488
+ box-shadow: 0 0 0 3px var(--frp-primary-light) !important;
489
+ outline: none;
490
+ }
491
+
492
+ .form-control::placeholder {
493
+ color: var(--frp-muted) !important;
494
+ }
495
+
496
+ /* ============================================
497
+ CARDS & PANELS
498
+ ============================================ */
499
+
500
+ .card {
501
+ background: var(--frp-surface) !important;
502
+ border: 1px solid var(--frp-border) !important;
503
+ border-radius: 4px !important;
504
+ }
505
+
506
+ .card-header {
507
+ background: var(--frp-surface-hover) !important;
508
+ border-bottom: 1px solid var(--frp-border) !important;
509
+ font-family: var(--frp-font-display);
510
+ font-weight: 600;
511
+ text-transform: uppercase;
512
+ letter-spacing: 1px;
513
+ }
514
+
515
+ .card-footer {
516
+ background: var(--frp-surface-hover) !important;
517
+ border-top: 1px solid var(--frp-border) !important;
518
+ }
519
+
520
+ /* ============================================
521
+ MODALS
522
+ ============================================ */
523
+
524
+ .modal-content {
525
+ background: var(--frp-surface) !important;
526
+ border: 1px solid var(--frp-border) !important;
527
+ }
528
+
529
+ .modal-header {
530
+ border-bottom: 1px solid var(--frp-border) !important;
531
+ }
532
+
533
+ .modal-footer {
534
+ border-top: 1px solid var(--frp-border) !important;
535
+ }
536
+
537
+ /* ============================================
538
+ PAGINATION
539
+ ============================================ */
540
+
541
+ .pagination .page-link {
542
+ background: var(--frp-surface) !important;
543
+ border-color: var(--frp-border) !important;
544
+ color: #e5e7eb !important;
545
+ }
546
+
547
+ .pagination .page-link:hover {
548
+ background: var(--frp-surface-hover) !important;
549
+ color: var(--frp-primary) !important;
550
+ }
551
+
552
+ .pagination .page-item.active .page-link {
553
+ background: var(--frp-primary) !important;
554
+ border-color: var(--frp-primary) !important;
555
+ color: #000 !important;
556
+ }
557
+
558
+ /* ============================================
559
+ BREADCRUMBS
560
+ ============================================ */
561
+
562
+ .breadcrumb {
563
+ background: transparent !important;
564
+ padding: 8px 0;
565
+ }
566
+
567
+ .breadcrumb-item a {
568
+ color: var(--frp-muted-light) !important;
569
+ }
570
+
571
+ .breadcrumb-item a:hover {
572
+ color: var(--frp-primary) !important;
573
+ }
574
+
575
+ .breadcrumb-item.active {
576
+ color: var(--frp-primary) !important;
577
+ }
578
+
579
+ .breadcrumb-item + .breadcrumb-item::before {
580
+ color: var(--frp-muted) !important;
581
+ }
582
+
583
+ /* ============================================
584
+ ALERTS & NOTIFICATIONS
585
+ ============================================ */
586
+
587
+ .alert-success {
588
+ background: var(--frp-success-light) !important;
589
+ border-color: var(--frp-success) !important;
590
+ color: var(--frp-success) !important;
591
+ }
592
+
593
+ .alert-danger {
594
+ background: var(--frp-danger-light) !important;
595
+ border-color: var(--frp-danger) !important;
596
+ color: var(--frp-danger) !important;
597
+ }
598
+
599
+ .alert-warning {
600
+ background: var(--frp-warning-light) !important;
601
+ border-color: var(--frp-warning) !important;
602
+ color: var(--frp-warning) !important;
603
+ }
604
+
605
+ .alert-info {
606
+ background: var(--frp-info-light) !important;
607
+ border-color: var(--frp-info) !important;
608
+ color: var(--frp-info) !important;
609
+ }
610
+
611
+ /* ============================================
612
+ BADGES & LABELS
613
+ ============================================ */
614
+
615
+ .badge {
616
+ font-family: var(--frp-font-display);
617
+ font-weight: 600;
618
+ text-transform: uppercase;
619
+ letter-spacing: 0.5px;
620
+ }
621
+
622
+ .badge.badge-primary,
623
+ .badge.bg-primary {
624
+ background: var(--frp-primary) !important;
625
+ color: #000 !important;
626
+ }
627
+
628
+ /* Faction badges */
629
+ .badge-faction-lspd { background: var(--frp-faction-lspd) !important; }
630
+ .badge-faction-fbi { background: var(--frp-faction-fbi) !important; }
631
+ .badge-faction-sasd { background: var(--frp-faction-sasd) !important; }
632
+ .badge-faction-ares { background: var(--frp-faction-ares) !important; }
633
+ .badge-faction-sanews { background: var(--frp-faction-sanews) !important; }
634
+ .badge-faction-gov { background: var(--frp-faction-gov) !important; }
635
+ .badge-faction-hitman { background: var(--frp-faction-hitman) !important; }
636
+ .badge-faction-medic { background: var(--frp-faction-medic) !important; }
637
+ .badge-faction-ng { background: var(--frp-faction-ng) !important; }
638
+
639
+ /* Gang badges */
640
+ .badge-gang-ghouls { background: var(--frp-gang-ghouls) !important; }
641
+ .badge-gang-velvet { background: var(--frp-gang-velvet) !important; }
642
+ .badge-gang-baba { background: var(--frp-gang-baba) !important; }
643
+ .badge-gang-rifa { background: var(--frp-gang-rifa) !important; }
644
+ .badge-gang-grove { background: var(--frp-gang-grove) !important; }
645
+ .badge-gang-lcn { background: var(--frp-gang-lcn) !important; }
646
+
647
+ /* VIP badges */
648
+ .badge-vip-daisy {
649
+ background: linear-gradient(135deg, #A3E635, #65A30D) !important;
650
+ color: #000 !important;
651
+ }
652
+
653
+ .badge-vip-rose {
654
+ background: linear-gradient(135deg, #F59E0B, #D97706) !important;
655
+ color: #000 !important;
656
+ }
657
+
658
+ .badge-vip-ivy {
659
+ background: linear-gradient(135deg, #EF4444, #DC2626) !important;
660
+ color: #fff !important;
661
+ animation: ivyBadgeGlow 2s ease-in-out infinite alternate;
662
+ }
663
+
664
+ @keyframes ivyBadgeGlow {
665
+ from { box-shadow: 0 0 4px rgba(239, 68, 68, 0.3); }
666
+ to { box-shadow: 0 0 12px rgba(245, 158, 11, 0.5); }
667
+ }
668
+
669
+ /* ============================================
670
+ TABLES
671
+ ============================================ */
672
+
673
+ .table,
674
+ table {
675
+ --bs-table-bg: var(--frp-surface);
676
+ --bs-table-border-color: var(--frp-border);
677
+ color: #e5e7eb;
678
+ }
679
+
680
+ .table thead th {
681
+ background: var(--frp-surface-hover) !important;
682
+ border-bottom: 2px solid var(--frp-primary) !important;
683
+ font-family: var(--frp-font-display);
684
+ font-weight: 600;
685
+ text-transform: uppercase;
686
+ letter-spacing: 0.5px;
687
+ color: var(--frp-primary);
688
+ font-size: 0.85rem;
689
+ }
690
+
691
+ .table tbody tr {
692
+ border-bottom: 1px solid var(--frp-border);
693
+ }
694
+
695
+ .table tbody tr:hover {
696
+ background: var(--frp-surface-hover) !important;
697
+ }
698
+
699
+ .table-striped tbody tr:nth-of-type(odd) {
700
+ background: rgba(17, 17, 20, 0.5) !important;
701
+ }
702
+
703
+ /* ============================================
704
+ FOOTER
705
+ ============================================ */
706
+
707
+ footer,
708
+ [component="footer"] {
709
+ background: #0a0a0b !important;
710
+ border-top: 1px solid var(--frp-border) !important;
711
+ color: var(--frp-muted);
712
+ }
713
+
714
+ footer a {
715
+ color: var(--frp-muted-light) !important;
716
+ }
717
+
718
+ footer a:hover {
719
+ color: var(--frp-primary) !important;
720
+ }
721
+
722
+ /* ============================================
723
+ COMPOSER (Post Editor)
724
+ ============================================ */
725
+
726
+ .composer {
727
+ background: var(--frp-surface) !important;
728
+ border: 1px solid var(--frp-border) !important;
729
+ }
730
+
731
+ .composer .title-container input {
732
+ background: #0d0d0f !important;
733
+ border: 1px solid var(--frp-border) !important;
734
+ color: #e5e7eb !important;
735
+ }
736
+
737
+ .composer .write-container textarea,
738
+ .composer .preview-container {
739
+ background: #0d0d0f !important;
740
+ color: #e5e7eb !important;
741
+ }
742
+
743
+ .composer .formatting-bar {
744
+ background: var(--frp-surface-hover) !important;
745
+ border-bottom: 1px solid var(--frp-border) !important;
746
+ }
747
+
748
+ .composer .formatting-bar .btn {
749
+ color: var(--frp-muted-light) !important;
750
+ }
751
+
752
+ .composer .formatting-bar .btn:hover {
753
+ color: var(--frp-primary) !important;
754
+ }
755
+
756
+ /* ============================================
757
+ CHAT
758
+ ============================================ */
759
+
760
+ [component="chat"] {
761
+ background: var(--frp-surface) !important;
762
+ }
763
+
764
+ [component="chat/message"] {
765
+ border-bottom: 1px solid var(--frp-border);
766
+ }
767
+
768
+ /* ============================================
769
+ SEARCH
770
+ ============================================ */
771
+
772
+ .search-results .search-result {
773
+ background: var(--frp-surface) !important;
774
+ border: 1px solid var(--frp-border) !important;
775
+ border-radius: 4px;
776
+ margin-bottom: 8px;
777
+ }
778
+
779
+ .search-results .search-result:hover {
780
+ border-color: var(--frp-primary) !important;
781
+ }
782
+
783
+ /* ============================================
784
+ ADMIN CONTROL PANEL (ACP) — Minimal overrides
785
+ ============================================ */
786
+
787
+ .acp-page {
788
+ background: #0a0a0b;
789
+ }
790
+
791
+ /* ============================================
792
+ LOADING / SPINNER
793
+ ============================================ */
794
+
795
+ .loading-indicator {
796
+ border-color: var(--frp-primary) transparent transparent transparent !important;
797
+ }
798
+
799
+ /* ============================================
800
+ TOOLTIPS & POPOVERS
801
+ ============================================ */
802
+
803
+ .tooltip-inner {
804
+ background: var(--frp-surface-elevated) !important;
805
+ border: 1px solid var(--frp-border);
806
+ color: #e5e7eb;
807
+ }
808
+
809
+ .popover {
810
+ background: var(--frp-surface) !important;
811
+ border: 1px solid var(--frp-border) !important;
812
+ }
813
+
814
+ /* ============================================
815
+ CUSTOM: SERVER STATUS WIDGET
816
+ ============================================ */
817
+
818
+ .frp-server-status {
819
+ background: var(--frp-surface) !important;
820
+ border: 1px solid var(--frp-border) !important;
821
+ border-radius: 4px;
822
+ }
823
+
824
+ .frp-server-status .status-online {
825
+ color: var(--frp-success);
826
+ }
827
+
828
+ .frp-server-status .status-offline {
829
+ color: var(--frp-danger);
830
+ }
831
+
832
+ @keyframes pulse {
833
+ 0%, 100% { opacity: 1; }
834
+ 50% { opacity: 0.5; }
835
+ }
836
+
837
+ /* ============================================
838
+ CUSTOM: GAME STATS PROFILE CARD
839
+ ============================================ */
840
+
841
+ .frp-game-stats {
842
+ background: var(--frp-surface) !important;
843
+ border: 1px solid var(--frp-border) !important;
844
+ border-radius: 4px;
845
+ }
846
+
847
+ .frp-game-stats .card-header {
848
+ font-family: var(--frp-font-display);
849
+ color: var(--frp-primary);
850
+ text-transform: uppercase;
851
+ letter-spacing: 1px;
852
+ }
853
+
854
+ .frp-game-stats .stat-item {
855
+ padding: 8px 0;
856
+ border-bottom: 1px solid var(--frp-border);
857
+ }
858
+
859
+ .frp-game-stats .stat-item:last-child {
860
+ border-bottom: none;
861
+ }
862
+
863
+ .frp-game-stats .stat-label {
864
+ color: var(--frp-muted);
865
+ font-size: 0.8rem;
866
+ text-transform: uppercase;
867
+ letter-spacing: 0.5px;
868
+ display: block;
869
+ }
870
+
871
+ .frp-game-stats .stat-value {
872
+ color: #e5e7eb;
873
+ font-family: var(--frp-font-mono);
874
+ font-size: 1rem;
875
+ font-weight: 500;
876
+ }
877
+
878
+ /* ============================================
879
+ CUSTOM: DONATION STORE
880
+ ============================================ */
881
+
882
+ .frp-store-item {
883
+ background: var(--frp-surface);
884
+ border: 1px solid var(--frp-border);
885
+ border-radius: 4px;
886
+ padding: 20px;
887
+ transition: all 0.2s ease;
888
+ position: relative;
889
+ overflow: hidden;
890
+ }
891
+
892
+ .frp-store-item:hover {
893
+ border-color: var(--frp-primary);
894
+ box-shadow: var(--frp-primary-glow);
895
+ transform: translateY(-2px);
896
+ }
897
+
898
+ .frp-store-item.tier-daisy {
899
+ border-top: 3px solid #A3E635;
900
+ }
901
+
902
+ .frp-store-item.tier-rose {
903
+ border-top: 3px solid #F59E0B;
904
+ }
905
+
906
+ .frp-store-item.tier-ivy {
907
+ border-top: 3px solid #EF4444;
908
+ }
909
+
910
+ .frp-store-item .price {
911
+ font-family: var(--frp-font-display);
912
+ font-size: 1.5rem;
913
+ font-weight: 700;
914
+ color: var(--frp-primary);
915
+ }
916
+
917
+ .frp-store-item .price .currency {
918
+ font-size: 0.9rem;
919
+ color: var(--frp-muted);
920
+ }
921
+
922
+ /* ============================================
923
+ CUSTOM: RECENT THREADS WIDGET
924
+ ============================================ */
925
+
926
+ .frp-latest-widget {
927
+ background: var(--frp-surface);
928
+ border: 1px solid var(--frp-border);
929
+ border-radius: 4px;
930
+ padding: 16px;
931
+ }
932
+
933
+ .frp-latest-widget h4 {
934
+ font-family: var(--frp-font-display);
935
+ color: var(--frp-primary);
936
+ text-transform: uppercase;
937
+ letter-spacing: 1px;
938
+ border-bottom: 2px solid var(--frp-primary);
939
+ padding-bottom: 8px;
940
+ margin-bottom: 12px;
941
+ font-size: 0.95rem;
942
+ }
943
+
944
+ .frp-latest-widget .topic-item {
945
+ padding: 8px 0;
946
+ border-bottom: 1px solid var(--frp-border);
947
+ }
948
+
949
+ .frp-latest-widget .topic-item:last-child {
950
+ border-bottom: none;
951
+ }
952
+
953
+ .frp-latest-widget .topic-item a {
954
+ color: #e5e7eb;
955
+ font-size: 0.9rem;
956
+ }
957
+
958
+ .frp-latest-widget .topic-item a:hover {
959
+ color: var(--frp-primary);
960
+ }
961
+
962
+ .frp-latest-widget .topic-meta {
963
+ font-size: 0.75rem;
964
+ color: var(--frp-muted);
965
+ margin-top: 2px;
966
+ }
967
+
968
+ /* ============================================
969
+ RESPONSIVE ADJUSTMENTS
970
+ ============================================ */
971
+
972
+ @media (max-width: 768px) {
973
+ .navbar .navbar-brand {
974
+ font-size: 1rem;
975
+ letter-spacing: 1px;
976
+ }
977
+
978
+ [component="categories/category"] {
979
+ border-left-width: 2px !important;
980
+ }
981
+
982
+ .frp-store-item {
983
+ padding: 12px;
984
+ }
985
+
986
+ .frp-game-stats .row {
987
+ flex-direction: column;
988
+ }
989
+ }
990
+
991
+ @media (max-width: 480px) {
992
+ h1, h2 {
993
+ font-size: 1.2rem;
994
+ }
995
+
996
+ .frp-store-item .price {
997
+ font-size: 1.2rem;
998
+ }
999
+ }
1000
+
1001
+ /* ============================================
1002
+ UTILITY CLASSES
1003
+ ============================================ */
1004
+
1005
+ .text-gold { color: var(--frp-primary) !important; }
1006
+ .text-danger-frp { color: var(--frp-danger) !important; }
1007
+ .text-success-frp { color: var(--frp-success) !important; }
1008
+ .text-info-frp { color: var(--frp-info) !important; }
1009
+ .text-muted-frp { color: var(--frp-muted) !important; }
1010
+
1011
+ .bg-surface { background: var(--frp-surface) !important; }
1012
+ .bg-surface-hover { background: var(--frp-surface-hover) !important; }
1013
+
1014
+ .border-gold { border-color: var(--frp-primary) !important; }
1015
+ .border-frp { border-color: var(--frp-border) !important; }
1016
+
1017
+ .glow-gold { box-shadow: var(--frp-primary-glow); }
1018
+
1019
+ .font-display { font-family: var(--frp-font-display) !important; }
1020
+ .font-body { font-family: var(--frp-font-body) !important; }
1021
+ .font-mono { font-family: var(--frp-font-mono) !important; }
package/package.json CHANGED
@@ -1,27 +1,39 @@
1
- {
2
- "name": "nodebb-theme-flawless-rp",
3
- "type": "theme",
4
- "version": "1.0.3",
5
- "description": "Flawless Roleplay — Underground Criminal Empire theme for NodeBB. Dark obsidian backgrounds, gold/amber accents, Barlow Condensed typography.",
6
- "author": "Flawless Roleplay Team",
7
- "license": "MIT",
8
- "keywords": [
9
- "nodebb-theme",
10
- "samp",
11
- "roleplay",
12
- "dark-theme",
13
- "gaming"
14
- ],
15
- "nbbpm": {
16
- "compatibility": "^1.19.0 || ^2.0.0 || ^3.0.0 || ^4.0.0"
17
- },
18
- "theme": {
19
- "id": "nodebb-theme-flawless-rp",
20
- "name": "Flawless Roleplay",
21
- "baseTheme": "nodebb-theme-persona",
22
- "templates": "./templates",
23
- "screenshot": "./screenshot.png"
24
- },
25
- "scripts": {},
26
- "dependencies": {}
27
- }
1
+ {
2
+ "name": "nodebb-theme-flawless-rp",
3
+ "type": "theme",
4
+ "version": "1.0.5",
5
+ "description": "Flawless Roleplay — Underground Criminal Empire theme for NodeBB. Dark obsidian backgrounds, gold/amber accents, Barlow Condensed typography.",
6
+ "author": "Flawless Roleplay Team",
7
+ "license": "MIT",
8
+ "keywords": [
9
+ "nodebb-theme",
10
+ "samp",
11
+ "roleplay",
12
+ "dark-theme",
13
+ "gaming"
14
+ ],
15
+ "nbbpm": {
16
+ "compatibility": "^1.19.0 || ^2.0.0 || ^3.0.0 || ^4.0.0"
17
+ },
18
+ "theme": {
19
+ "id": "nodebb-theme-flawless-rp",
20
+ "name": "Flawless Roleplay",
21
+ "baseTheme": "nodebb-theme-persona",
22
+ "templates": "./templates",
23
+ "screenshot": "./screenshot.png"
24
+ },
25
+ "files": [
26
+ "theme.json",
27
+ "plugin.json",
28
+ "theme.less",
29
+ "theme.scss",
30
+ "less",
31
+ "scss",
32
+ "templates",
33
+ "public",
34
+ "static",
35
+ "library.js"
36
+ ],
37
+ "scripts": {},
38
+ "dependencies": {}
39
+ }
package/plugin.json CHANGED
@@ -1,27 +1,27 @@
1
- {
2
- "id": "nodebb-theme-flawless-rp",
3
- "name": "Flawless Roleplay Theme",
4
- "description": "Underground Criminal Empire — Dark theme with gold/amber accents for SA-MP Roleplay",
5
- "url": "https://github.com/omerbeqiri1989-beep/NodeBB",
6
- "library": "./library.js",
7
- "hooks": [
8
- {
9
- "hook": "filter:config.get",
10
- "method": "onConfigGet"
11
- },
12
- {
13
- "hook": "filter:header.build",
14
- "method": "addCustomCSS"
15
- }
16
- ],
17
- "staticDirs": {
18
- "static": "./static"
19
- },
20
- "css": [
21
- "static/styles/flawless.css"
22
- ],
23
- "templates": "./templates",
24
- "less": [
25
- "theme.less"
26
- ]
27
- }
1
+ {
2
+ "id": "nodebb-theme-flawless-rp",
3
+ "name": "Flawless Roleplay Theme",
4
+ "description": "Underground Criminal Empire — Dark theme with gold/amber accents for SA-MP Roleplay",
5
+ "url": "https://github.com/omerbeqiri1989-beep/NodeBB",
6
+ "library": "./library.js",
7
+ "hooks": [
8
+ {
9
+ "hook": "filter:config.get",
10
+ "method": "onConfigGet"
11
+ },
12
+ {
13
+ "hook": "filter:header.build",
14
+ "method": "addCustomCSS"
15
+ }
16
+ ],
17
+ "staticDirs": {
18
+ "static": "./static"
19
+ },
20
+ "css": [
21
+ "static/styles/flawless.css"
22
+ ],
23
+ "templates": "./templates",
24
+ "less": [
25
+ "theme.less"
26
+ ]
27
+ }
package/theme.json CHANGED
@@ -1,10 +1,8 @@
1
- {
2
- "id": "nodebb-theme-flawless-rp",
3
- "name": "Flawless Roleplay",
4
- "description": "Dark SA-MP roleplay theme with obsidian surfaces and amber/gold accents.",
5
- "url": "https://github.com/tsarchghs/213112321",
6
- "screenshot": "screenshot.png",
7
- "templates": "templates",
8
- "staticDir": "static",
9
- "baseTheme": "nodebb-theme-persona"
10
- }
1
+ {
2
+ "id": "nodebb-theme-flawless-rp",
3
+ "name": "Flawless Roleplay",
4
+ "description": "Flawless Roleplay Underground Criminal Empire theme for NodeBB.",
5
+ "url": "https://www.npmjs.com/package/nodebb-theme-flawless-rp",
6
+ "baseTheme": "nodebb-theme-persona",
7
+ "templates": "templates"
8
+ }
package/theme.less CHANGED
@@ -1,3 +0,0 @@
1
- @import "less/flawless-nodebb119-compat.less";
2
- /* Flawless Roleplay theme entrypoint for NodeBB 1.x/2.x LESS builds. */
3
- @import (inline) "static/styles/flawless.css";
package/theme.scss CHANGED
@@ -1,2 +1,2 @@
1
- /* Flawless Roleplay theme entrypoint for NodeBB SCSS builds. */
2
- @import "static/styles/flawless.css";
1
+ /* Flawless Roleplay theme entrypoint for NodeBB SCSS builds. */
2
+ @import "static/styles/flawless.css";
package/screenshot.png DELETED
Binary file
package/theme.less.bak DELETED
@@ -1,2 +0,0 @@
1
- /* Flawless Roleplay theme entrypoint for NodeBB 1.x/2.x LESS builds. */
2
- @import (inline) "static/styles/flawless.css";