@okjavis/nodebb-theme-javis 3.0.0 → 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": "3.0.0",
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
+ }
package/scss/_cards.scss CHANGED
@@ -43,10 +43,10 @@
43
43
  flex-direction: column;
44
44
  align-items: center;
45
45
  justify-content: flex-start;
46
- padding: $jv-space-4 $jv-space-3; // Tighter padding
46
+ padding: $jv-space-6 $jv-space-4; // 24dp vertical, 16dp horizontal - Material grid
47
47
  background: rgba(0, 0, 0, 0.02);
48
- min-width: 40px;
49
- gap: 2px; // Minimal gap
48
+ min-width: 44px;
49
+ gap: $jv-space-1; // 4dp - Material grid
50
50
  }
51
51
 
52
52
  .vote-btn {
@@ -100,10 +100,10 @@
100
100
  // ===========================================================
101
101
  .topic-content {
102
102
  flex: 1;
103
- padding: $jv-space-3;
103
+ padding: $jv-space-3; // 12dp - Material grid
104
104
  display: flex;
105
105
  flex-direction: column;
106
- gap: $jv-space-2; // Tighter gap between elements
106
+ gap: $jv-space-3; // 12dp - Material grid
107
107
  min-width: 0; // Allow text truncation
108
108
  }
109
109
 
@@ -147,10 +147,10 @@
147
147
  // Topic Title
148
148
  .topic-card .topic-title {
149
149
  margin: 0;
150
- font-size: $jv-font-size-lg; // 18px - clear hierarchy
151
- font-weight: 600; // Semi-bold
152
- line-height: $jv-line-height-tight;
153
- letter-spacing: -0.02em;
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
154
154
 
155
155
  a {
156
156
  color: $jv-text-main;
@@ -260,7 +260,7 @@
260
260
  color: $jv-text-muted;
261
261
  line-height: $jv-line-height-base;
262
262
  display: -webkit-box;
263
- -webkit-line-clamp: 2; // Reduced from 3 to 2 lines
263
+ -webkit-line-clamp: 3;
264
264
  -webkit-box-orient: vertical;
265
265
  overflow: hidden;
266
266
 
@@ -270,54 +270,6 @@
270
270
  }
271
271
  }
272
272
 
273
- // ===========================================================
274
- // MEDIA ROW (Image + Text side by side)
275
- // ===========================================================
276
- .topic-media-row {
277
- display: flex;
278
- gap: $jv-space-4;
279
- align-items: flex-start;
280
-
281
- .topic-media-text {
282
- flex: 1;
283
- min-width: 0; // Allow text truncation
284
-
285
- .topic-teaser {
286
- -webkit-line-clamp: 3; // Allow more lines when beside image
287
- }
288
- }
289
-
290
- .topic-thumbnail {
291
- flex-shrink: 0;
292
- width: 140px;
293
- height: 100px;
294
-
295
- img {
296
- width: 100%;
297
- height: 100%;
298
- object-fit: cover;
299
- }
300
- }
301
- }
302
-
303
- @media (max-width: 576px) {
304
- .topic-media-row {
305
- flex-direction: column-reverse;
306
- gap: $jv-space-3;
307
-
308
- .topic-thumbnail {
309
- width: 100%;
310
- height: auto;
311
- max-height: 180px;
312
-
313
- img {
314
- max-height: 180px;
315
- width: 100%;
316
- }
317
- }
318
- }
319
- }
320
-
321
273
  // ===========================================================
322
274
  // ACTION BAR (Bottom - Reddit style)
323
275
  // ===========================================================
@@ -346,21 +298,21 @@ li[component="post"] hr,
346
298
  .action-btn {
347
299
  display: inline-flex;
348
300
  align-items: center;
349
- gap: $jv-space-1; // Tighter gap
350
- padding: $jv-space-1 $jv-space-2; // Smaller padding
351
- font-size: $jv-font-size-xs; // Smaller font
352
- font-weight: 500; // Lighter weight
353
- color: $jv-text-soft; // More subtle color
301
+ gap: $jv-space-2; // 8dp grid
302
+ padding: $jv-space-2 $jv-space-3; // 8dp vertical, 12dp horizontal
303
+ font-size: 14px;
304
+ font-weight: 600;
305
+ color: $jv-text-muted;
354
306
  background: transparent;
355
307
  border: none;
356
- border-radius: $jv-radius-xs;
308
+ border-radius: $jv-radius-sm; // 8px shadcn standard
357
309
  cursor: pointer;
358
310
  text-decoration: none;
359
- transition: background-color $jv-transition-fast, color $jv-transition-fast;
311
+ transition: background-color $jv-transition-fast, color $jv-transition-fast; // Modern transitions
360
312
 
361
313
  &:hover {
362
- background: $jv-hover-bg;
363
- color: $jv-text-muted;
314
+ background: $jv-hover-bg; // Consistent hover state
315
+ color: $jv-text-main;
364
316
  }
365
317
 
366
318
  // Focus state for accessibility
@@ -370,11 +322,12 @@ li[component="post"] hr,
370
322
  }
371
323
 
372
324
  i {
373
- font-size: 14px; // Smaller icons
325
+ font-size: 18px; // Larger icons
374
326
  }
375
327
 
328
+ // Make numbers bold
376
329
  span {
377
- font-weight: 500; // Normal weight, not bold
330
+ font-weight: 700;
378
331
  }
379
332
  }
380
333
 
@@ -97,7 +97,7 @@ html.composing .composer .title-container {
97
97
  border-radius: $jv-radius-lg $jv-radius-lg 0 0 !important;
98
98
  }
99
99
 
100
- // Category selector
100
+ // Category selector button
101
101
  html.composing .composer .category-list-container {
102
102
  flex-shrink: 0 !important;
103
103
  display: block !important;
@@ -116,53 +116,152 @@ html.composing .composer .category-list-container {
116
116
  background: $jv-hover-bg !important;
117
117
  }
118
118
  }
119
+ }
120
+ }
119
121
 
120
- .dropdown-menu {
121
- min-width: 280px !important;
122
- max-height: 320px !important;
123
- overflow-y: auto !important;
124
- padding: $jv-space-2 !important;
122
+ // ===========================================================
123
+ // CATEGORY DROPDOWN - Clean flat list (like reference image)
124
+ // Targeting exact DOM structure from DevTools
125
+ // ===========================================================
125
126
 
126
- // Fix category list spacing
127
- .category-dropdown-menu {
128
- margin: 0 !important;
129
- padding: 0 !important;
130
- }
127
+ // The dropdown container
128
+ div.dropdown-menu.p-1.show {
129
+ min-width: 280px !important;
130
+ max-width: 320px !important;
131
+ padding: $jv-space-2 0 !important;
132
+ border: 1px solid $jv-border-subtle !important;
133
+ border-radius: $jv-radius-sm !important;
134
+ box-shadow: $jv-shadow-lg !important;
135
+ background: $jv-surface !important;
136
+ }
131
137
 
132
- // Category items inside dropdown
133
- li.category {
134
- margin: 0 !important;
135
- padding: 0 !important;
136
-
137
- a.dropdown-item {
138
- display: flex !important;
139
- align-items: center !important;
140
- gap: $jv-space-2 !important;
141
- padding: $jv-space-2 $jv-space-3 !important;
142
- margin: 2px 0 !important;
143
- font-size: $jv-font-size-sm !important;
144
- color: $jv-text-main !important;
145
- border-radius: $jv-radius-xs !important;
146
- white-space: nowrap !important;
147
- overflow: hidden !important;
148
- text-overflow: ellipsis !important;
149
-
150
- &:hover {
151
- background: $jv-hover-bg !important;
152
- }
153
-
154
- // Category icon
155
- .category-item {
156
- display: inline-flex !important;
157
- align-items: center !important;
158
- gap: $jv-space-2 !important;
159
- }
160
- }
161
- }
138
+ // Search input section
139
+ div[component="category-selector-search"] {
140
+ padding: $jv-space-2 $jv-space-3 $jv-space-3 $jv-space-3 !important;
141
+ margin: 0 !important;
142
+ border-bottom: none !important;
143
+
144
+ .form-control {
145
+ width: 100% !important;
146
+ height: 36px !important;
147
+ padding: 0 $jv-space-3 !important;
148
+ font-size: $jv-font-size-sm !important;
149
+ font-weight: 400 !important;
150
+ color: $jv-text-main !important;
151
+ border: 1px solid $jv-border-subtle !important;
152
+ border-radius: $jv-radius-xs !important;
153
+ background: $jv-surface !important;
154
+
155
+ &:focus {
156
+ border-color: $jv-primary !important;
157
+ box-shadow: $jv-focus-ring !important;
158
+ outline: none !important;
162
159
  }
160
+
161
+ &::placeholder {
162
+ color: $jv-text-soft !important;
163
+ }
164
+ }
165
+
166
+ hr {
167
+ display: none !important;
163
168
  }
164
169
  }
165
170
 
171
+ // The category list UL - exact class from DOM
172
+ ul.category-dropdown-menu.ghost-scrollbar {
173
+ margin: 0 !important;
174
+ padding: 0 !important;
175
+ max-height: 320px !important;
176
+ overflow-y: auto !important;
177
+ overflow-x: hidden !important;
178
+ list-style: none !important;
179
+
180
+ // Scrollbar
181
+ &::-webkit-scrollbar {
182
+ width: 6px;
183
+ }
184
+ &::-webkit-scrollbar-track {
185
+ background: transparent;
186
+ }
187
+ &::-webkit-scrollbar-thumb {
188
+ background: rgba(0, 0, 0, 0.15);
189
+ border-radius: 3px;
190
+ }
191
+ }
192
+
193
+ // Each category LI - exact structure: li.category with role="presentation"
194
+ li[role="presentation"].category {
195
+ margin: 0 !important;
196
+ padding: 0 !important;
197
+ list-style: none !important;
198
+ border: none !important;
199
+ background: none !important;
200
+ background-color: transparent !important;
201
+ box-shadow: none !important;
202
+ }
203
+
204
+ // The anchor - reduce spacing and remove border/card styling
205
+ li.category > a.dropdown-item,
206
+ li.category > a.dropdown-item.rounded-1 {
207
+ padding: $jv-space-1 $jv-space-3 !important;
208
+ margin: 2px $jv-space-2 !important;
209
+ border: none !important;
210
+ border-radius: $jv-radius-xs !important;
211
+ background: transparent !important;
212
+ box-shadow: none !important;
213
+
214
+ &:hover {
215
+ background: $jv-hover-bg !important;
216
+ }
217
+ }
218
+
219
+ // Sub-categories indentation
220
+ li.category[data-parent-cid]:not([data-parent-cid="0"]) > a.dropdown-item {
221
+ padding-left: 36px !important;
222
+ }
223
+
224
+ // Category icon
225
+ li.category a.dropdown-item [component="category/icon"] {
226
+ width: 24px !important;
227
+ height: 24px !important;
228
+ min-width: 24px !important;
229
+ border-radius: 50% !important;
230
+ display: flex !important;
231
+ align-items: center !important;
232
+ justify-content: center !important;
233
+ font-size: $jv-font-size-xs !important;
234
+ flex-shrink: 0 !important;
235
+ box-shadow: none !important;
236
+ }
237
+
238
+ // Category name text
239
+ li.category a.dropdown-item > span:last-child {
240
+ font-size: $jv-font-size-sm !important;
241
+ font-weight: 400 !important;
242
+ color: $jv-text-main !important;
243
+ white-space: nowrap !important;
244
+ overflow: hidden !important;
245
+ text-overflow: ellipsis !important;
246
+ }
247
+
248
+ // Disabled categories
249
+ li.category.disabled > a.dropdown-item > span:last-child {
250
+ color: $jv-text-soft !important;
251
+ }
252
+
253
+ // No matches message
254
+ li[component="category/no-matches"].hidden {
255
+ display: none !important;
256
+ }
257
+
258
+ li[component="category/no-matches"]:not(.hidden) {
259
+ padding: $jv-space-4 !important;
260
+ text-align: center !important;
261
+ color: $jv-text-soft !important;
262
+ font-size: $jv-font-size-sm !important;
263
+ }
264
+
166
265
  // Title input
167
266
  html.composing .composer [data-component="composer/title"] {
168
267
  flex: 1 !important;