@okjavis/nodebb-theme-javis 3.0.9 → 4.0.2

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.9",
3
+ "version": "4.0.2",
4
4
  "description": "Modern, premium NodeBB theme for JAVIS Community - Extends Harmony with custom styling",
5
5
  "main": "theme.js",
6
6
  "scripts": {
@@ -406,6 +406,7 @@ html.composing .composer .formatting-bar {
406
406
  margin: 0 !important;
407
407
  flex-shrink: 0 !important;
408
408
  gap: $jv-space-3 !important;
409
+ overflow: visible !important; // Allow dropdowns to show
409
410
  }
410
411
 
411
412
  html.composing .composer .formatting-group {
@@ -413,8 +414,7 @@ html.composing .composer .formatting-group {
413
414
  align-items: center !important;
414
415
  gap: 2px !important;
415
416
  flex-wrap: nowrap !important;
416
- overflow-x: auto !important;
417
- overflow-y: visible !important; // Allow badges to overflow vertically
417
+ overflow: visible !important; // Allow dropdowns to show
418
418
  padding-top: 8px !important; // Space for badges that overflow upward
419
419
 
420
420
  li {
@@ -456,6 +456,22 @@ html.composing .composer .formatting-group {
456
456
  line-height: 16px !important;
457
457
  }
458
458
  }
459
+
460
+ // Dropdown containers (like Heading dropdown)
461
+ &.dropdown,
462
+ &.bottom-sheet {
463
+ overflow: visible !important;
464
+ position: relative !important;
465
+
466
+ .dropdown-menu {
467
+ position: absolute !important;
468
+ top: 100% !important;
469
+ left: 0 !important;
470
+ min-width: 150px !important;
471
+ z-index: 9999 !important;
472
+ margin-top: 2px !important;
473
+ }
474
+ }
459
475
  }
460
476
 
461
477
  .spacer {
package/scss/_feed.scss CHANGED
@@ -315,7 +315,7 @@
315
315
  .feed li[component="post"].posts-list-item {
316
316
  background: $jv-surface !important;
317
317
  border: 1px solid $jv-border-subtle !important;
318
- border-radius: $jv-radius-sm !important;
318
+ border-radius: $jv-radius-lg !important; // Match composer and widgets (16px)
319
319
  margin-bottom: $jv-space-2 !important;
320
320
  box-shadow: $jv-shadow-sm !important;
321
321
  overflow: hidden !important;
@@ -657,7 +657,7 @@
657
657
  // Action bar - now a direct child of the post card
658
658
  .feed-action-bar {
659
659
  background: $jv-surface !important;
660
- border-radius: 0 0 $jv-radius-sm $jv-radius-sm; // Match card's bottom corners
660
+ border-radius: 0 0 $jv-radius-lg $jv-radius-lg; // Match card's bottom corners (16px)
661
661
 
662
662
  .btn-link {
663
663
  display: inline-flex;
package/scss/_forms.scss CHANGED
@@ -116,9 +116,15 @@ textarea {
116
116
 
117
117
  i {
118
118
  width: 16px;
119
+ flex-shrink: 0;
119
120
  color: $jv-text-muted;
120
121
  }
121
122
 
123
+ // Hide bookmark option from dropdown menu
124
+ &[component="post/bookmark"] {
125
+ display: none !important;
126
+ }
127
+
122
128
  &:hover {
123
129
  background: rgba(0, 81, 255, 0.06);
124
130
  color: $jv-primary;
@@ -94,14 +94,13 @@
94
94
  {{{ end }}}
95
95
 
96
96
  <!-- 3. ACTION BAR (third - separated from content) -->
97
+ <!-- Order: Likes, Comments, Share -->
97
98
  <div class="feed-action-bar d-flex justify-content-between px-3 py-2 border-top">
98
- <a href="{config.relative_path}/post/{{{ if ./topic.teaserPid }}}{./topic.teaserPid}{{{ else }}}{./pid}{{{ end }}}" class="btn btn-link btn-sm text-body {{{ if !./isMainPost }}}invisible{{{ end }}}"><i class="fa-fw fa-regular fa-message text-muted"></i> {humanReadableNumber(./topic.postcount)}</a>
99
-
100
- <a href="#" data-pid="{./pid}" data-action="bookmark" data-bookmarked="{./bookmarked}" data-bookmarks="{./bookmarks}" class="btn btn-link btn-sm text-body"><i class="fa-fw fa-bookmark {{{ if ./bookmarked }}}fa text-primary{{{ else }}}fa-regular text-muted{{{ end }}}"></i> <span component="bookmark-count">{humanReadableNumber(./bookmarks)}</span></a>
101
-
102
99
  <a href="#" data-pid="{./pid}" data-action="upvote" data-upvoted="{./upvoted}" data-upvotes="{./upvotes}" class="btn btn-link btn-sm text-body"><i class="fa-fw fa-heart {{{ if ./upvoted }}}fa text-danger{{{ else }}}fa-regular text-muted{{{ end }}}"></i> <span component="upvote-count">{humanReadableNumber(./upvotes)}</span></a>
103
100
 
104
- <a href="#" data-pid="{./pid}" data-is-main="{./isMainPost}" data-tid="{./tid}" data-action="reply" class="btn btn-link btn-sm text-body"><i class="fa-fw fa fa-reply text-muted"></i> [[topic:reply]]</a>
101
+ <a href="{config.relative_path}/post/{{{ if ./topic.teaserPid }}}{./topic.teaserPid}{{{ else }}}{./pid}{{{ end }}}" class="btn btn-link btn-sm text-body {{{ if !./isMainPost }}}invisible{{{ end }}}"><i class="fa-fw fa-regular fa-message text-muted"></i> {humanReadableNumber(./topic.postcount)}</a>
102
+
103
+ <a href="#" data-pid="{./pid}" component="share/linkedin" class="btn btn-link btn-sm text-body"><i class="fa-fw fa-brands fa-linkedin text-muted"></i> [[topic:share]]</a>
105
104
  </div>
106
105
  </li>
107
106
  {{{ end }}}
@@ -121,3 +120,11 @@
121
120
  {{widgets.footer.html}}
122
121
  {{{end}}}
123
122
  </div>
123
+
124
+ <script>
125
+ $(document).ready(function() {
126
+ require(['share'], function(share) {
127
+ share.addShareHandlers('{title}');
128
+ });
129
+ });
130
+ </script>
@@ -0,0 +1,122 @@
1
+ <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
+ <div class="sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem;z-index: 1;">
3
+ <a href="{config.relative_path}/user/{userslug}" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
4
+ <div class="flex-grow-1">[[global:about]]</div>
5
+ </a>
6
+
7
+ <a href="{config.relative_path}/user/{userslug}/posts"class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
8
+ {{{ if template.account/posts }}}active{{{ end }}}
9
+ {{{ if template.account/best }}}active{{{ end }}}
10
+ {{{ if template.account/controversial }}}active{{{ end }}}
11
+ {{{ if template.account/upvoted }}}active{{{ end }}}
12
+ {{{ if template.account/downvoted }}}active{{{ end }}}
13
+ {{{ if template.account/bookmarks }}}active{{{ end }}}">
14
+ <div class="flex-grow-1">[[global:posts]]</div>
15
+ <span class="flex-shrink-0 text-xs" title="{counts.posts}">{humanReadableNumber(counts.posts)}</span>
16
+ </a>
17
+
18
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
19
+ {{{ if template.account/topics }}}active{{{ end }}}
20
+ {{{ if template.account/watched }}}active{{{ end }}}
21
+ {{{ if template.account/ignored }}}active{{{ end }}}">
22
+ <div class="flex-grow-1">[[global:topics]]</div>
23
+ <span class="flex-shrink-0 text-xs" title="{counts.topics}">{humanReadableNumber(counts.topics)}</span>
24
+ </a>
25
+
26
+ <a href="{config.relative_path}/user/{userslug}/shares" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
27
+ {{{ if template.account/shares }}}active{{{ end }}}">
28
+ <div class="flex-grow-1">[[user:shares]]</div>
29
+ <span class="flex-shrink-0 text-xs" title="{counts.shares}">{humanReadableNumber(counts.shares)}</span>
30
+ </a>
31
+
32
+ <a href="{config.relative_path}/user/{userslug}/groups" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
33
+ {{{ if template.account/groups }}}active{{{ end }}}">
34
+ <div class="flex-grow-1">[[global:header.groups]]</div>
35
+ <span class="flex-shrink-0 text-xs" title="{counts.groups}">{humanReadableNumber(counts.groups)}</span>
36
+ </a>
37
+
38
+ <a href="{config.relative_path}/user/{userslug}/followers" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
39
+ {{{ if template.account/followers }}}active{{{ end }}}">
40
+ <div class="flex-grow-1">[[user:followers]]</div>
41
+ <span class="flex-shrink-0 text-xs" title="{counts.followers}">{humanReadableNumber(counts.followers)}</span>
42
+ </a>
43
+
44
+ <a href="{config.relative_path}/user/{userslug}/following" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
45
+ {{{ if template.account/following }}}active{{{ end }}}">
46
+ <div class="flex-grow-1">[[user:following]]</div>
47
+ <span class="flex-shrink-0 text-xs" title="{counts.following}">{humanReadableNumber(counts.following)}</span>
48
+ </a>
49
+
50
+ {{{ if canEdit }}}
51
+ <a href="{config.relative_path}/user/{userslug}/categories" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
52
+ {{{ if template.account/categories }}}active{{{ end }}}">
53
+ <div class="flex-grow-1">[[user:watched-categories]]</div>
54
+ <span class="flex-shrink-0 text-xs" title="{counts.categoriesWatched}">{counts.categoriesWatched}</span>
55
+ </a>
56
+ {{{ if isSelf }}}
57
+ <a href="{config.relative_path}/user/{userslug}/tags" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
58
+ {{{ if template.account/tags }}}active{{{ end }}}">
59
+ <div class="flex-grow-1">[[user:watched-tags]]</div>
60
+ <span class="flex-shrink-0 text-xs" title="{counts.tagsWatched}">{counts.tagsWatched}</span>
61
+ </a>
62
+ {{{ end }}}
63
+
64
+ <a href="{config.relative_path}/user/{userslug}/blocks" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
65
+ {{{ if template.account/blocks }}}active{{{ end }}}">
66
+ <div class="flex-grow-1">[[user:blocked-users]]</div>
67
+ <span class="flex-shrink-0 text-xs" title="{counts.blocks}">{humanReadableNumber(counts.blocks)}</span>
68
+ </a>
69
+
70
+ <a href="{config.relative_path}/user/{userslug}/uploads" class="btn btn-ghost btn-sm text-start ff-secondary fw-semibold d-flex gap-2 align-items-center
71
+ {{{ if template.account/uploads }}}active{{{ end }}}">
72
+ <div class="flex-grow-1">[[global:uploads]]</div>
73
+ <span class="flex-shrink-0 text-xs" title="{counts.uploaded}">{humanReadableNumber(counts.uploaded)}</span>
74
+ </a>
75
+ {{{ end }}}
76
+
77
+ {{{ if remoteUrl }}}
78
+ <hr class="w-100 my-2"/>
79
+
80
+ <a href="{remoteUrl}" target="_self" component="account/view-remote" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start">
81
+ <i class="flex-shrink-0 fa-solid fa-globe"></i>
82
+ <div class="flex-grow-1 text-nowrap">[[user:view-remote]]</div>
83
+ </a>
84
+ {{{ end }}}
85
+
86
+
87
+ {{{ if (loggedIn && (!isSelf && !banned)) }}}
88
+ <hr class="w-100 my-2"/>
89
+
90
+ <a href="#" component="account/flag" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if flagId }}}hidden{{{end}}}">
91
+ <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
92
+ <div class="flex-grow-1 text-nowrap">[[user:flag-profile]]</div>
93
+ </a>
94
+ <a href="#" component="account/already-flagged" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if !flagId }}}hidden{{{end}}}" data-flag-id="{flagId}">
95
+ <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
96
+ <div class="flex-grow-1 text-nowrap">[[user:profile-flagged]]</div>
97
+ </a>
98
+ <a href="#" component="account/block" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{ if isBlocked }}}hidden{{{ end }}}">
99
+ <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
100
+ <div class="flex-grow-1 text-nowrap">[[user:block-user]]</div>
101
+ </a>
102
+ <a href="#" component="account/unblock" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{ if !isBlocked }}}hidden{{{ end }}}">
103
+ <i class="flex-shrink-0 fa-solid fa-ban text-danger"></i>
104
+ <div class="flex-grow-1 text-nowrap">[[user:unblock-user]]</div>
105
+ </a>
106
+ {{{ end }}}
107
+
108
+ {{{ if canEdit }}}
109
+ <hr class="w-100 my-2"/>
110
+ <a href="{config.relative_path}/user/{userslug}/edit" class="btn btn-ghost btn-sm ff-secondary text-xs text-start
111
+ {{{ if template.account/edit }}}active{{{ end }}}">
112
+ <div class="flex-grow-1">[[user:edit-profile]]</div>
113
+ </a>
114
+ {{{ end }}}
115
+
116
+ {{{ each profile_links }}}
117
+ <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn btn-ghost btn-sm ff-secondary text-xs text-start plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}} {{{ if (url == ./url) }}}active{{{ end }}}" id="{./id}">
118
+ <div class="flex-grow-1">{./name}</div>
119
+ </a>
120
+ {{{end}}}
121
+ </div>
122
+ </div>