@okjavis/nodebb-theme-javis 1.6.0 → 2.0.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,6 +1,6 @@
1
1
  {
2
2
  "name": "@okjavis/nodebb-theme-javis",
3
- "version": "1.6.0",
3
+ "version": "2.0.0",
4
4
  "description": "Modern, premium NodeBB theme for JAVIS Community - Extends Harmony with custom styling",
5
5
  "main": "theme.js",
6
6
  "scripts": {
package/plugin.json CHANGED
@@ -7,7 +7,8 @@
7
7
  "baseTheme": "nodebb-theme-harmony",
8
8
  "hooks": [
9
9
  { "hook": "filter:widgets.getAreas", "method": "defineWidgetAreas" },
10
- { "hook": "filter:admin.header.build", "method": "addAdminNavigation" }
10
+ { "hook": "filter:admin.header.build", "method": "addAdminNavigation" },
11
+ { "hook": "filter:config.get", "method": "getThemeConfig" }
11
12
  ],
12
13
  "staticDirs": {
13
14
  "static": "./static"
package/scss/_base.scss CHANGED
@@ -11,12 +11,6 @@ nav[component="sidebar/right"],
11
11
 
12
12
  // No custom layout overrides - use Harmony defaults
13
13
 
14
- // Search bar width override
15
- .search-widget .input-group {
16
- max-width: 650px;
17
- margin: 0 auto;
18
- }
19
-
20
14
  // Left sidebar layout - navigation at top, profile/collapse at bottom
21
15
  nav[component="sidebar/left"] {
22
16
  justify-content: flex-start !important; // Remove space-between
@@ -41,8 +35,8 @@ nav[component="sidebar/left"] {
41
35
  padding: 0 20px; // Reddit-style horizontal padding
42
36
  justify-content: center; // Center the columns
43
37
 
44
- // Equal gap between columns (Reddit uses ~16-20px)
45
- gap: 20px;
38
+ // Gap between columns
39
+ gap: $jv-space-8; // 32px
46
40
 
47
41
  // Adjust column widths for better proportions
48
42
  > [data-widget-area="left"] {
@@ -3,16 +3,6 @@
3
3
  // Modern, clean buttons with smooth interactions
4
4
  // ===========================================================
5
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
6
  // ===========================================================
17
7
  // BASE BUTTON
18
8
  // ===========================================================
package/scss/_cards.scss CHANGED
@@ -279,6 +279,20 @@
279
279
  gap: $jv-space-3; // 12dp - Material grid
280
280
  padding-top: $jv-space-3; // 12dp - Material grid
281
281
  margin-top: auto;
282
+ border-top: none !important; // Remove any border-top
283
+
284
+ // Hide hr element if present
285
+ hr {
286
+ display: none !important;
287
+ }
288
+ }
289
+
290
+ // Hide hr elements within topic cards globally
291
+ .topic-card hr,
292
+ .topic-content hr,
293
+ li[component="post"] hr,
294
+ [component="post"] hr {
295
+ display: none !important;
282
296
  }
283
297
 
284
298
  .action-btn {
package/scss/_forms.scss CHANGED
@@ -37,23 +37,6 @@ textarea {
37
37
  min-height: 100px;
38
38
  }
39
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
40
  // ===========================================================
58
41
  // COMPOSER TRIGGER (Write a Post…)
59
42
  // ===========================================================
@@ -0,0 +1,281 @@
1
+ // ============================================
2
+ // HEADER / TOPBAR - Sticky Navigation Bar
3
+ // ============================================
4
+ // Industry-standard sticky header with centered search
5
+ // Inspired by: Slack, Linear, Notion, GitHub
6
+
7
+ // ===========================================================
8
+ // BRAND CONTAINER (Top Bar)
9
+ // ===========================================================
10
+ .brand-container {
11
+ position: sticky;
12
+ top: 0;
13
+ z-index: 1020; // Below modals (1050) but above content
14
+ background: $jv-surface;
15
+ border-bottom: 1px solid $jv-border-subtle;
16
+ margin: 0 !important; // No margins - ever
17
+ padding: $jv-space-3 $jv-space-4 !important; // 12px vertical, 16px horizontal
18
+ min-height: 64px; // 12px top + 40px search + 12px bottom
19
+ max-width: 100% !important; // Override container-lg max-width
20
+ width: 100% !important; // Full width always
21
+ display: flex;
22
+ align-items: center;
23
+ transition: box-shadow $jv-transition-base;
24
+ box-sizing: border-box;
25
+
26
+ // Override Bootstrap container classes
27
+ &.container-lg,
28
+ &.container-md,
29
+ &.container {
30
+ max-width: 100% !important;
31
+ padding-left: $jv-space-4 !important;
32
+ padding-right: $jv-space-4 !important;
33
+ }
34
+
35
+ // Subtle shadow on scroll (added via JS)
36
+ &.scrolled {
37
+ box-shadow: $jv-shadow-sm;
38
+ }
39
+
40
+ // Inner flex container
41
+ > .col-12 {
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: space-between;
45
+ gap: $jv-space-4;
46
+ border-bottom: none !important; // Remove Harmony's border
47
+ padding: 0 $jv-space-4 !important; // Horizontal padding
48
+ margin: 0 !important;
49
+ width: 100% !important; // Ensure full width - no right margin
50
+ }
51
+
52
+ // Brand/Logo wrapper - compact padding
53
+ [component="brand/wrapper"] {
54
+ flex-shrink: 0;
55
+ padding: $jv-space-1 !important; // Minimal padding
56
+ border-radius: $jv-radius-sm;
57
+ transition: background $jv-transition-fast;
58
+ gap: $jv-space-2 !important; // Tighter gap
59
+
60
+ &:hover {
61
+ background: $jv-hover-bg;
62
+ }
63
+ }
64
+
65
+ // Logo sizing - compact
66
+ [component="brand/logo"] {
67
+ max-height: 28px; // Compact logo height - matches sidebar logo
68
+ width: auto;
69
+ }
70
+
71
+ // Site title (if shown)
72
+ [component="siteTitle"] {
73
+ h1 {
74
+ font-size: $jv-font-size-base !important; // Smaller title
75
+ font-weight: 600 !important;
76
+ margin: 0 !important;
77
+ }
78
+ }
79
+ }
80
+
81
+ // ===========================================================
82
+ // SEARCH BAR - Centered, Prominent
83
+ // ===========================================================
84
+ [data-widget-area="brand-header"] {
85
+ flex: 1;
86
+ display: flex;
87
+ justify-content: center;
88
+ align-items: center;
89
+ padding: 0 $jv-space-4 !important;
90
+ }
91
+
92
+ // Search widget in header
93
+ .brand-container .search-widget,
94
+ [data-widget-area="brand-header"] .search-widget {
95
+ width: 100%;
96
+ max-width: 560px;
97
+
98
+ .input-group {
99
+ display: flex;
100
+ align-items: center;
101
+ background: $jv-bg; // Light gray background (matches app bg)
102
+ border-radius: $jv-radius-pill;
103
+ border: 1px solid transparent;
104
+ transition: all $jv-transition-fast;
105
+ padding: 0;
106
+ overflow: hidden;
107
+
108
+ // Hover state
109
+ &:hover {
110
+ background: darken($jv-bg, 2%);
111
+ }
112
+
113
+ // Focus-within state
114
+ &:focus-within {
115
+ background: $jv-surface;
116
+ border-color: $jv-primary;
117
+ box-shadow: $jv-focus-ring;
118
+ }
119
+
120
+ // Search icon button
121
+ .btn-outline-secondary,
122
+ .input-group-text {
123
+ background: transparent !important;
124
+ border: none !important;
125
+ padding: $jv-space-2 $jv-space-3;
126
+ padding-right: 0;
127
+ color: $jv-text-soft !important;
128
+
129
+ i {
130
+ font-size: 14px;
131
+ }
132
+
133
+ &:hover {
134
+ background: transparent !important;
135
+ color: $jv-text-muted !important;
136
+ }
137
+ }
138
+
139
+ // Search input field
140
+ .form-control {
141
+ background: transparent !important;
142
+ border: none !important;
143
+ box-shadow: none !important;
144
+ padding: $jv-space-2 $jv-space-3;
145
+ padding-left: $jv-space-2;
146
+ font-size: $jv-font-size-base;
147
+ color: $jv-text-main;
148
+ height: 40px; // Consistent height
149
+
150
+ // Placeholder styling
151
+ &::placeholder {
152
+ color: $jv-text-soft;
153
+ opacity: 1;
154
+ font-weight: 400;
155
+ }
156
+
157
+ &:focus {
158
+ outline: none;
159
+ box-shadow: none !important;
160
+
161
+ &::placeholder {
162
+ color: $jv-text-muted;
163
+ }
164
+ }
165
+ }
166
+
167
+ // Search submit button (blue button)
168
+ .btn-primary,
169
+ .btn[type="submit"] {
170
+ height: 40px;
171
+ min-width: 40px;
172
+ padding: 0 $jv-space-4;
173
+ border-radius: 0 $jv-radius-pill $jv-radius-pill 0 !important;
174
+ display: flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ }
178
+
179
+ // Keyboard shortcut hint (optional enhancement)
180
+ &::after {
181
+ content: "⌘K";
182
+ display: none; // Enable when JS shortcut is implemented
183
+ padding: $jv-space-1 $jv-space-2;
184
+ margin-right: $jv-space-2;
185
+ background: rgba(0, 0, 0, 0.06);
186
+ border-radius: $jv-radius-xs;
187
+ font-size: $jv-font-size-xs;
188
+ color: $jv-text-soft;
189
+ font-family: $jv-font-sans;
190
+ }
191
+ }
192
+ }
193
+
194
+ // ===========================================================
195
+ // SEARCH DROPDOWN RESULTS
196
+ // ===========================================================
197
+ .brand-container .search-dropdown,
198
+ .search-widget .dropdown-menu {
199
+ width: 100%;
200
+ min-width: 400px;
201
+ max-width: 560px;
202
+ margin-top: $jv-space-2 !important;
203
+ padding: $jv-space-2;
204
+ border-radius: $jv-radius-md;
205
+ border: 1px solid $jv-border-subtle;
206
+ box-shadow: $jv-shadow-lg;
207
+ background: $jv-surface;
208
+
209
+ // Quick search results
210
+ .quick-search-results-container {
211
+ max-height: 400px;
212
+ overflow-y: auto;
213
+
214
+ // Individual result items
215
+ .search-result {
216
+ padding: $jv-space-2 $jv-space-3;
217
+ border-radius: $jv-radius-sm;
218
+ transition: background $jv-transition-fast;
219
+
220
+ &:hover {
221
+ background: $jv-hover-bg;
222
+ }
223
+ }
224
+ }
225
+
226
+ // Advanced search link
227
+ .advanced-search-link {
228
+ color: $jv-text-muted;
229
+ transition: color $jv-transition-fast;
230
+
231
+ &:hover {
232
+ color: $jv-primary;
233
+ }
234
+ }
235
+ }
236
+
237
+ // ===========================================================
238
+ // RESPONSIVE ADJUSTMENTS
239
+ // ===========================================================
240
+ @media (max-width: 991px) {
241
+ .brand-container {
242
+ // On tablet/mobile, maintain proper spacing
243
+ min-height: 56px !important;
244
+ margin: 0 !important;
245
+ padding: $jv-space-2 0 !important;
246
+
247
+ > .col-12 {
248
+ padding: 0 $jv-space-2 !important;
249
+ width: 100% !important;
250
+ }
251
+
252
+ [data-widget-area="brand-header"] {
253
+ padding: 0 $jv-space-2 !important;
254
+ }
255
+
256
+ .search-widget {
257
+ max-width: 100%;
258
+ }
259
+ }
260
+ }
261
+
262
+ @media (max-width: 767px) {
263
+ .brand-container {
264
+ // Hide search in header on mobile (use mobile header instead)
265
+ [data-widget-area="brand-header"] {
266
+ display: none;
267
+ }
268
+
269
+ > .col-12 {
270
+ justify-content: center;
271
+ }
272
+ }
273
+ }
274
+
275
+ // ===========================================================
276
+ // MAIN PANEL - Remove top margin for cohesive layout
277
+ // ===========================================================
278
+ #panel {
279
+ margin-top: 0 !important; // Remove mt-3 class margin
280
+ }
281
+