@okjavis/nodebb-theme-javis 1.0.0 → 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.
package/package.json CHANGED
@@ -1,23 +1,10 @@
1
1
  {
2
2
  "name": "@okjavis/nodebb-theme-javis",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Modern, premium NodeBB theme for JAVIS Community - Extends Harmony with custom styling",
5
5
  "main": "theme.js",
6
6
  "scripts": {
7
- "build": "npm run build:less",
8
- "build:less": "lessc less/theme.less static/lib/theme.css --clean-css",
9
- "watch": "npm-watch",
10
- "dev": "npm run watch",
11
- "prepublishOnly": "npm run build"
12
- },
13
- "watch": {
14
- "build:less": {
15
- "patterns": [
16
- "less"
17
- ],
18
- "extensions": "less",
19
- "quiet": false
20
- }
7
+ "test": "echo \"No tests configured\""
21
8
  },
22
9
  "repository": {
23
10
  "type": "git",
@@ -38,21 +25,18 @@
38
25
  "author": "Chirag Dugar",
39
26
  "license": "MIT",
40
27
  "peerDependencies": {
41
- "nodebb-theme-harmony": "^1.0.0"
42
- },
43
- "devDependencies": {
44
- "less": "^4.2.0",
45
- "less-plugin-clean-css": "^1.5.1",
46
- "npm-watch": "^0.11.0"
28
+ "nodebb-theme-harmony": "^2.0.0"
47
29
  },
48
30
  "nbbpm": {
49
- "compatibility": "^3.0.0"
31
+ "compatibility": "^4.0.0"
50
32
  },
51
33
  "files": [
52
- "less/",
34
+ "scss/",
53
35
  "static/",
54
36
  "templates/",
55
37
  "theme.js",
38
+ "theme.scss",
39
+ "theme.json",
56
40
  "plugin.json"
57
41
  ]
58
42
  }
package/plugin.json CHANGED
@@ -5,19 +5,20 @@
5
5
  "url": "https://github.com/javis-admin/nodebb-community-theme",
6
6
  "library": "./theme.js",
7
7
  "baseTheme": "nodebb-theme-harmony",
8
+ "hooks": [
9
+ { "hook": "filter:widgets.getAreas", "method": "defineWidgetAreas" },
10
+ { "hook": "filter:admin.header.build", "method": "addAdminNavigation" }
11
+ ],
8
12
  "staticDirs": {
9
13
  "static": "./static"
10
14
  },
11
- "less": [
12
- "less/theme.less"
13
- ],
14
15
  "scripts": [
15
16
  "static/lib/theme.js"
16
17
  ],
17
18
  "templates": "templates",
18
19
  "screenshot": "screenshot.png",
19
- "version": "1.0.0",
20
+ "version": "1.0.1",
20
21
  "nbbpm": {
21
- "compatibility": "^3.0.0"
22
+ "compatibility": "^4.0.0"
22
23
  }
23
24
  }
@@ -0,0 +1,71 @@
1
+ // ============================================
2
+ // BASE STYLES – Core Layout + Typography
3
+ // ============================================
4
+
5
+ // Hide right sidebar completely (user profile moved to left sidebar)
6
+ .sidebar-right,
7
+ nav[component="sidebar/right"] {
8
+ display: none !important;
9
+ }
10
+
11
+ body {
12
+ font-family: $jv-font-sans;
13
+ font-size: $jv-font-size-base;
14
+ line-height: $jv-line-height-base;
15
+ color: $jv-text-main;
16
+ background-color: $jv-bg;
17
+ -webkit-font-smoothing: antialiased;
18
+ -moz-osx-font-smoothing: grayscale;
19
+ }
20
+
21
+ // Typography Reset
22
+ h1, h2, h3, h4, h5, h6 {
23
+ color: $jv-text-main;
24
+ font-weight: 600;
25
+ line-height: $jv-line-height-tight;
26
+ }
27
+
28
+ h1 {
29
+ font-size: $jv-font-size-xxl;
30
+ margin-bottom: $jv-space-8;
31
+ }
32
+
33
+ h2 {
34
+ font-size: 26px;
35
+ margin-bottom: $jv-space-8;
36
+ }
37
+
38
+ h3 {
39
+ font-size: $jv-font-size-xl;
40
+ font-weight: 600;
41
+ margin-bottom: $jv-space-6;
42
+ }
43
+
44
+ h4 {
45
+ font-size: 20px;
46
+ font-weight: 600;
47
+ margin-bottom: $jv-space-6;
48
+ }
49
+
50
+ h5 {
51
+ font-size: 17px;
52
+ font-weight: 600;
53
+ margin-bottom: $jv-space-6;
54
+ }
55
+
56
+ h6 {
57
+ font-size: $jv-font-size-base;
58
+ font-weight: 600;
59
+ margin-bottom: $jv-space-4;
60
+ }
61
+
62
+ // Links
63
+ a {
64
+ color: $jv-primary;
65
+ text-decoration: none;
66
+ transition: color 0.15s ease;
67
+
68
+ &:hover {
69
+ color: $jv-primary-hover;
70
+ }
71
+ }
@@ -0,0 +1,410 @@
1
+ // ===========================================================
2
+ // BUTTON SYSTEM – JAVIS Design System
3
+ // Modern, clean buttons with smooth interactions
4
+ // ===========================================================
5
+
6
+ // Semantic colors
7
+ $jv-success: #10b981;
8
+ $jv-success-hover: #059669;
9
+ $jv-danger: #ef4444;
10
+ $jv-danger-hover: #dc2626;
11
+ $jv-warning: #f59e0b;
12
+ $jv-warning-hover: #d97706;
13
+ $jv-info: #3b82f6;
14
+ $jv-info-hover: #2563eb;
15
+
16
+ // ===========================================================
17
+ // BASE BUTTON
18
+ // ===========================================================
19
+ .btn {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ gap: 6px;
24
+ border-radius: $jv-radius-pill;
25
+ padding: 8px 18px;
26
+ font-size: 14px;
27
+ font-weight: 500;
28
+ line-height: 1.4;
29
+ transition: all 0.2s ease;
30
+ border: 1px solid transparent;
31
+ cursor: pointer;
32
+ text-decoration: none;
33
+ white-space: nowrap;
34
+
35
+ // Focus ring for accessibility
36
+ &:focus {
37
+ outline: none;
38
+ box-shadow: 0 0 0 3px rgba(0, 81, 255, 0.2);
39
+ }
40
+
41
+ &:focus:not(:focus-visible) {
42
+ box-shadow: none;
43
+ }
44
+
45
+ &:focus-visible {
46
+ box-shadow: 0 0 0 3px rgba(0, 81, 255, 0.3);
47
+ }
48
+
49
+ // Disabled state
50
+ &:disabled,
51
+ &.disabled {
52
+ opacity: 0.5;
53
+ cursor: not-allowed;
54
+ pointer-events: none;
55
+ }
56
+
57
+ // Icon inside button
58
+ i, .fa, .fas, .far, .fab {
59
+ font-size: 14px;
60
+ line-height: 1;
61
+ }
62
+ }
63
+
64
+ // ===========================================================
65
+ // PRIMARY BUTTON
66
+ // ===========================================================
67
+ .btn-primary {
68
+ background-color: $jv-primary;
69
+ border-color: $jv-primary;
70
+ color: #fff;
71
+ box-shadow: $jv-shadow-button;
72
+
73
+ &:hover {
74
+ background-color: $jv-primary-hover;
75
+ border-color: $jv-primary-hover;
76
+ box-shadow: $jv-shadow-button-hover;
77
+ transform: translateY(-1px);
78
+ color: #fff;
79
+ }
80
+
81
+ &:active {
82
+ transform: translateY(0);
83
+ box-shadow: $jv-shadow-button;
84
+ }
85
+ }
86
+
87
+ // ===========================================================
88
+ // OUTLINE BUTTONS
89
+ // ===========================================================
90
+ .btn-outline-primary {
91
+ background-color: transparent;
92
+ border-color: $jv-primary;
93
+ color: $jv-primary;
94
+
95
+ &:hover {
96
+ background-color: $jv-primary-soft;
97
+ border-color: $jv-primary;
98
+ color: $jv-primary;
99
+ }
100
+ }
101
+
102
+ .btn-outline-secondary {
103
+ background-color: transparent;
104
+ border-color: $jv-border-strong;
105
+ color: $jv-text-main;
106
+
107
+ &:hover {
108
+ background-color: rgba(0, 0, 0, 0.04);
109
+ border-color: $jv-border-strong;
110
+ color: $jv-text-main;
111
+ }
112
+ }
113
+
114
+ .btn-outline-danger {
115
+ background-color: transparent;
116
+ border-color: $jv-danger;
117
+ color: $jv-danger;
118
+
119
+ &:hover {
120
+ background-color: rgba(239, 68, 68, 0.1);
121
+ border-color: $jv-danger;
122
+ color: $jv-danger;
123
+ }
124
+ }
125
+
126
+ // ===========================================================
127
+ // SECONDARY/DEFAULT BUTTON
128
+ // ===========================================================
129
+ .btn-secondary,
130
+ .btn-default {
131
+ background-color: #f7f8fa;
132
+ border-color: $jv-border-subtle;
133
+ color: $jv-text-main;
134
+
135
+ &:hover {
136
+ background-color: #eef0f3;
137
+ border-color: $jv-border-strong;
138
+ color: $jv-text-main;
139
+ }
140
+
141
+ &:active {
142
+ background-color: #e5e7eb;
143
+ }
144
+ }
145
+
146
+ // ===========================================================
147
+ // SEMANTIC BUTTONS (Success, Danger, Warning, Info)
148
+ // ===========================================================
149
+ .btn-success {
150
+ background-color: $jv-success;
151
+ border-color: $jv-success;
152
+ color: #fff;
153
+
154
+ &:hover {
155
+ background-color: $jv-success-hover;
156
+ border-color: $jv-success-hover;
157
+ color: #fff;
158
+ transform: translateY(-1px);
159
+ }
160
+
161
+ &:active {
162
+ transform: translateY(0);
163
+ }
164
+ }
165
+
166
+ .btn-danger {
167
+ background-color: $jv-danger;
168
+ border-color: $jv-danger;
169
+ color: #fff;
170
+
171
+ &:hover {
172
+ background-color: $jv-danger-hover;
173
+ border-color: $jv-danger-hover;
174
+ color: #fff;
175
+ transform: translateY(-1px);
176
+ }
177
+
178
+ &:active {
179
+ transform: translateY(0);
180
+ }
181
+ }
182
+
183
+ .btn-warning {
184
+ background-color: $jv-warning;
185
+ border-color: $jv-warning;
186
+ color: #fff;
187
+
188
+ &:hover {
189
+ background-color: $jv-warning-hover;
190
+ border-color: $jv-warning-hover;
191
+ color: #fff;
192
+ transform: translateY(-1px);
193
+ }
194
+
195
+ &:active {
196
+ transform: translateY(0);
197
+ }
198
+ }
199
+
200
+ .btn-info {
201
+ background-color: $jv-info;
202
+ border-color: $jv-info;
203
+ color: #fff;
204
+
205
+ &:hover {
206
+ background-color: $jv-info-hover;
207
+ border-color: $jv-info-hover;
208
+ color: #fff;
209
+ transform: translateY(-1px);
210
+ }
211
+
212
+ &:active {
213
+ transform: translateY(0);
214
+ }
215
+ }
216
+
217
+ // ===========================================================
218
+ // LIGHT/SUBTLE BUTTON
219
+ // ===========================================================
220
+ .btn-light {
221
+ background-color: rgba(0, 0, 0, 0.04);
222
+ border-color: transparent;
223
+ color: $jv-text-main;
224
+
225
+ &:hover {
226
+ background-color: rgba(0, 0, 0, 0.08);
227
+ color: $jv-text-main;
228
+ }
229
+ }
230
+
231
+ // ===========================================================
232
+ // GHOST BUTTON (No background, just text)
233
+ // ===========================================================
234
+ .btn-ghost {
235
+ background-color: transparent;
236
+ border-color: transparent;
237
+ color: $jv-text-muted;
238
+
239
+ &:hover {
240
+ background-color: rgba(0, 0, 0, 0.05);
241
+ color: $jv-text-main;
242
+ }
243
+ }
244
+
245
+ // ===========================================================
246
+ // LINK-STYLE BUTTON
247
+ // ===========================================================
248
+ .btn-link {
249
+ background: transparent;
250
+ border-color: transparent;
251
+ color: $jv-primary;
252
+ font-weight: 500;
253
+ padding: 0;
254
+ box-shadow: none;
255
+
256
+ &:hover {
257
+ text-decoration: underline;
258
+ color: $jv-primary-hover;
259
+ background: transparent;
260
+ box-shadow: none;
261
+ }
262
+
263
+ &:focus {
264
+ box-shadow: none;
265
+ }
266
+ }
267
+
268
+ // ===========================================================
269
+ // BUTTON SIZES
270
+ // ===========================================================
271
+ .btn-sm {
272
+ padding: 5px 12px;
273
+ font-size: $jv-font-size-xs;
274
+ gap: 4px;
275
+
276
+ i, .fa, .fas, .far, .fab {
277
+ font-size: 12px;
278
+ }
279
+ }
280
+
281
+ .btn-lg {
282
+ padding: 12px 24px;
283
+ font-size: $jv-font-size-base;
284
+ border-radius: $jv-radius-pill;
285
+ gap: 8px;
286
+
287
+ i, .fa, .fas, .far, .fab {
288
+ font-size: 16px;
289
+ }
290
+ }
291
+
292
+ .btn-xs {
293
+ padding: 3px 8px;
294
+ font-size: 11px;
295
+ gap: 3px;
296
+
297
+ i, .fa, .fas, .far, .fab {
298
+ font-size: 11px;
299
+ }
300
+ }
301
+
302
+ // ===========================================================
303
+ // ICON-ONLY BUTTONS
304
+ // ===========================================================
305
+ .btn-icon {
306
+ padding: 8px;
307
+ min-width: 36px;
308
+ min-height: 36px;
309
+
310
+ &.btn-sm {
311
+ padding: 6px;
312
+ min-width: 28px;
313
+ min-height: 28px;
314
+ }
315
+
316
+ &.btn-lg {
317
+ padding: 12px;
318
+ min-width: 44px;
319
+ min-height: 44px;
320
+ }
321
+ }
322
+
323
+ // ===========================================================
324
+ // BUTTON GROUPS
325
+ // ===========================================================
326
+ .btn-group {
327
+ display: inline-flex;
328
+
329
+ .btn {
330
+ border-radius: 0;
331
+
332
+ &:first-child {
333
+ border-top-left-radius: $jv-radius-pill;
334
+ border-bottom-left-radius: $jv-radius-pill;
335
+ }
336
+
337
+ &:last-child {
338
+ border-top-right-radius: $jv-radius-pill;
339
+ border-bottom-right-radius: $jv-radius-pill;
340
+ }
341
+
342
+ &:not(:first-child) {
343
+ margin-left: -1px;
344
+ }
345
+ }
346
+ }
347
+
348
+ // ===========================================================
349
+ // FLOATING ACTION BUTTON (FAB)
350
+ // ===========================================================
351
+ .btn-fab {
352
+ width: 56px;
353
+ height: 56px;
354
+ border-radius: 50%;
355
+ padding: 0;
356
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
357
+
358
+ &:hover {
359
+ box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
360
+ transform: translateY(-2px);
361
+ }
362
+
363
+ i {
364
+ font-size: 20px;
365
+ }
366
+ }
367
+
368
+ // ===========================================================
369
+ // DROPDOWN TOGGLE
370
+ // ===========================================================
371
+ .dropdown-toggle {
372
+ &::after {
373
+ margin-left: 6px;
374
+ vertical-align: middle;
375
+ }
376
+ }
377
+
378
+ // ===========================================================
379
+ // NODEBB SPECIFIC BUTTONS
380
+ // ===========================================================
381
+
382
+ // Post action buttons (reply, quote, etc.)
383
+ [component="post/reply"],
384
+ [component="post/quote"],
385
+ [component="post/bookmark"],
386
+ [component="post/upvote"],
387
+ [component="post/downvote"] {
388
+ @extend .btn-ghost;
389
+ padding: 6px 10px;
390
+ font-size: $jv-font-size-xs;
391
+ border-radius: $jv-radius-sm;
392
+ }
393
+
394
+ // Composer buttons
395
+ .composer .btn {
396
+ border-radius: $jv-radius-sm;
397
+ }
398
+
399
+ // Topic tools dropdown
400
+ .topic-main-buttons {
401
+ .btn {
402
+ margin-left: 4px;
403
+ }
404
+ }
405
+
406
+ // Category selection buttons
407
+ .category-selector .btn {
408
+ text-align: left;
409
+ justify-content: flex-start;
410
+ }