nodebb-theme-harmony 1.0.0-beta.4 → 1.0.0-beta.40

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.
Files changed (108) hide show
  1. package/languages/en-GB/harmony.json +5 -1
  2. package/library.js +21 -7
  3. package/package.json +1 -1
  4. package/public/harmony.js +107 -9
  5. package/public/settings.js +1 -0
  6. package/scss/common.scss +46 -4
  7. package/scss/harmony.scss +2 -0
  8. package/scss/mixins.scss +7 -3
  9. package/scss/modals.scss +6 -1
  10. package/scss/modules/bottom-sheet.scss +1 -1
  11. package/scss/modules/composer.scss +0 -4
  12. package/scss/modules/cover.scss +1 -11
  13. package/scss/modules/paginator.scss +24 -0
  14. package/scss/overrides.scss +3 -1
  15. package/scss/search.scss +8 -0
  16. package/scss/sidebar.scss +7 -4
  17. package/scss/topic.scss +22 -12
  18. package/templates/account/blocks.tpl +35 -41
  19. package/templates/account/categories.tpl +23 -30
  20. package/templates/account/consent.tpl +66 -10
  21. package/templates/account/edit/password.tpl +25 -30
  22. package/templates/account/edit/username.tpl +21 -26
  23. package/templates/account/edit.tpl +105 -116
  24. package/templates/account/followers.tpl +12 -19
  25. package/templates/account/following.tpl +12 -18
  26. package/templates/account/groups.tpl +12 -17
  27. package/templates/account/info.tpl +178 -206
  28. package/templates/account/posts.tpl +31 -36
  29. package/templates/account/profile.tpl +66 -73
  30. package/templates/account/sessions.tpl +8 -30
  31. package/templates/account/settings.tpl +193 -198
  32. package/templates/account/theme.tpl +34 -25
  33. package/templates/account/topics.tpl +33 -38
  34. package/templates/account/uploads.tpl +33 -40
  35. package/templates/categories.tpl +1 -1
  36. package/templates/category.tpl +12 -13
  37. package/templates/flags/detail.tpl +24 -25
  38. package/templates/flags/list.tpl +11 -11
  39. package/templates/footer.tpl +2 -2
  40. package/templates/groups/details.tpl +20 -17
  41. package/templates/groups/members.tpl +0 -2
  42. package/templates/partials/account/footer.tpl +3 -0
  43. package/templates/partials/account/header.tpl +78 -81
  44. package/templates/partials/account/session-list.tpl +18 -0
  45. package/templates/partials/breadcrumbs.tpl +6 -6
  46. package/templates/partials/categories/item.tpl +19 -18
  47. package/templates/partials/categories/lastpost.tpl +2 -2
  48. package/templates/partials/{category-filter-content.tpl → category/filter-dropdown-content.tpl} +8 -6
  49. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +3 -3
  50. package/templates/partials/category/subcategory.tpl +1 -1
  51. package/templates/partials/category/tags.tpl +0 -2
  52. package/templates/partials/category/watch.tpl +28 -4
  53. package/templates/partials/chats/message-window.tpl +1 -0
  54. package/templates/partials/chats/message.tpl +4 -6
  55. package/templates/partials/cookie-consent.tpl +5 -5
  56. package/templates/partials/flags/filters.tpl +1 -1
  57. package/templates/partials/groups/admin.tpl +4 -4
  58. package/templates/partials/groups/badge.tpl +1 -1
  59. package/templates/partials/groups/memberlist.tpl +1 -1
  60. package/templates/partials/groups/sidebar-left.tpl +1 -1
  61. package/templates/partials/header/brand.tpl +1 -1
  62. package/templates/partials/mobile-footer.tpl +69 -61
  63. package/templates/partials/paginator.tpl +9 -9
  64. package/templates/partials/post_bar.tpl +6 -5
  65. package/templates/partials/posts_list_item.tpl +5 -5
  66. package/templates/partials/quick-search-results.tpl +1 -1
  67. package/templates/partials/search-filters.tpl +184 -0
  68. package/templates/partials/search-results.tpl +28 -32
  69. package/templates/partials/sidebar/chats.tpl +2 -2
  70. package/templates/partials/sidebar/drafts.tpl +42 -34
  71. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  72. package/templates/partials/sidebar/notifications.tpl +3 -3
  73. package/templates/partials/sidebar/search.tpl +1 -1
  74. package/templates/partials/sidebar/user-menu.tpl +1 -1
  75. package/templates/partials/sidebar-left.tpl +13 -10
  76. package/templates/partials/sidebar-right.tpl +1 -1
  77. package/templates/partials/skin-switcher.tpl +2 -2
  78. package/templates/partials/tags_list.tpl +6 -4
  79. package/templates/partials/topic/browsing-users.tpl +0 -2
  80. package/templates/partials/topic/event.tpl +1 -1
  81. package/templates/partials/topic/navigation-post.tpl +5 -9
  82. package/templates/partials/topic/navigator-mobile.tpl +48 -0
  83. package/templates/partials/topic/post-editor.tpl +0 -2
  84. package/templates/partials/topic/post-menu-list.tpl +35 -37
  85. package/templates/partials/topic/post.tpl +27 -10
  86. package/templates/partials/topic/quickreply.tpl +6 -6
  87. package/templates/partials/topic/reply-button.tpl +1 -1
  88. package/templates/partials/topic/topic-menu-list.tpl +16 -18
  89. package/templates/partials/topic/watch.tpl +28 -4
  90. package/templates/partials/topic-list-bar.tpl +7 -7
  91. package/templates/partials/topics_list.tpl +41 -41
  92. package/templates/partials/users/filter-dropdown-content.tpl +20 -0
  93. package/templates/popular.tpl +1 -1
  94. package/templates/post-queue.tpl +112 -0
  95. package/templates/recent.tpl +1 -1
  96. package/templates/search.tpl +39 -177
  97. package/templates/tags.tpl +1 -1
  98. package/templates/top.tpl +1 -1
  99. package/templates/topic.tpl +4 -4
  100. package/templates/unread.tpl +1 -1
  101. package/templates/users.tpl +1 -1
  102. package/templates/modules/usercard.tpl +0 -39
  103. package/templates/partials/acceptTos.tpl +0 -11
  104. package/templates/partials/category-filter-right.tpl +0 -5
  105. package/templates/partials/category-filter.tpl +0 -3
  106. package/templates/partials/category-selector-right.tpl +0 -5
  107. package/templates/partials/category-selector.tpl +0 -3
  108. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "skins": "Skins",
3
3
  "collapse": "Collapse",
4
+ "toggle-sidebars": "Toggle sidebars",
4
5
  "login-register-to-search": "Login or register to search.",
5
6
  "settings.title": "Theme settings",
6
7
  "settings.enableQuickReply": "Enable quick reply",
7
8
  "settings.centerHeaderElements": "Center header elements",
8
- "settings.stickyToolbar": "Sticky toolbar"
9
+ "settings.stickyToolbar": "Sticky toolbar",
10
+ "settings.stickyToolbar.help": "The toolbar on topic and category pages will stick to the top of the page",
11
+ "settings.autohideBottombar": "Auto hide bottom bar",
12
+ "settings.autohideBottombar.help": "The bottom bar on mobile view will be hidden when the page is scrolled down"
9
13
  }
package/library.js CHANGED
@@ -12,6 +12,7 @@ const defaults = {
12
12
  enableQuickReply: 'on',
13
13
  centerHeaderElements: 'off',
14
14
  stickyToolbar: 'on',
15
+ autohideBottombar: 'off',
15
16
  openSidebars: 'off',
16
17
  };
17
18
 
@@ -77,6 +78,16 @@ library.defineWidgetAreas = async function (areas) {
77
78
  });
78
79
 
79
80
  areas = areas.concat([
81
+ {
82
+ name: 'Main post header',
83
+ template: 'topic.tpl',
84
+ location: 'mainpost-header',
85
+ },
86
+ {
87
+ name: 'Main post footer',
88
+ template: 'topic.tpl',
89
+ location: 'mainpost-footer',
90
+ },
80
91
  {
81
92
  name: 'Sidebar Footer',
82
93
  template: 'global',
@@ -92,15 +103,18 @@ async function loadThemeConfig(uid) {
92
103
  meta.settings.get('harmony'),
93
104
  user.getSettings(uid),
94
105
  ]);
95
- return { ...defaults, ...themeConfig, ...userConfig };
106
+
107
+ const config = { ...defaults, ...themeConfig, ...(_.pick(userConfig, Object.keys(defaults))) };
108
+ config.enableQuickReply = config.enableQuickReply === 'on';
109
+ config.centerHeaderElements = config.centerHeaderElements === 'on';
110
+ config.stickyToolbar = config.stickyToolbar === 'on';
111
+ config.autohideBottombar = config.autohideBottombar === 'on';
112
+ config.openSidebars = config.openSidebars === 'on';
113
+ return config;
96
114
  }
97
115
 
98
116
  library.getThemeConfig = async function (config) {
99
- const themeConfig = await loadThemeConfig(config.uid);
100
- config.enableQuickReply = themeConfig.enableQuickReply === 'on';
101
- config.centerHeaderElements = themeConfig.centerHeaderElements === 'on';
102
- config.stickyToolbar = themeConfig.stickyToolbar === 'on';
103
- config.openSidebars = themeConfig.openSidebars === 'on';
117
+ config.theme = await loadThemeConfig(config.uid);;
104
118
  config.openDraftsOnPageLoad = false;
105
119
  return config;
106
120
  };
@@ -126,7 +140,7 @@ library.saveUserSettings = async function (hookData) {
126
140
 
127
141
  library.addUserToTopic = async function (hookData) {
128
142
  const { enableQuickReply } = await loadThemeConfig(hookData.req.uid);
129
- if (enableQuickReply === 'on') {
143
+ if (enableQuickReply) {
130
144
  if (hookData.req.user) {
131
145
  const userData = await user.getUserData(hookData.req.uid);
132
146
  hookData.templateData.loggedInUser = userData;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-theme-harmony",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.40",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.0.0"
6
6
  },
package/public/harmony.js CHANGED
@@ -5,6 +5,8 @@ $(document).ready(function () {
5
5
  setupMobileMenu();
6
6
  setupSearch();
7
7
  setupDrafts();
8
+ handleMobileNavigator();
9
+ setupNavTooltips();
8
10
 
9
11
  $('[component="skinSwitcher"]').on('click', '.dropdown-item', function () {
10
12
  const skin = $(this).attr('data-value');
@@ -36,7 +38,7 @@ $(document).ready(function () {
36
38
  });
37
39
 
38
40
  function setupMobileMenu() {
39
- require(['api'], function (api) {
41
+ require(['hooks', 'api', 'navigator'], function (hooks, api, navigator) {
40
42
  $('[component="sidebar/toggle"]').on('click', async function () {
41
43
  const sidebarEl = $('.sidebar');
42
44
  sidebarEl.toggleClass('open');
@@ -48,7 +50,55 @@ $(document).ready(function () {
48
50
  });
49
51
  }
50
52
  $(window).trigger('action:sidebar.toggle');
53
+ if (ajaxify.data.template.topic) {
54
+ hooks.fire('action:navigator.update', { newIndex: navigator.getIndex() });
55
+ }
56
+ });
57
+
58
+ const bottomBar = $('[component="bottombar"]');
59
+ $('body').on('shown.bs.dropdown', '.sticky-tools', function () {
60
+ bottomBar.addClass('hidden');
61
+ });
62
+ $('body').on('hidden.bs.dropdown', '.sticky-tools', function () {
63
+ bottomBar.removeClass('hidden');
64
+ });
65
+
66
+ let lastScrollTop = 0;
67
+ const $window = $(window);
68
+ function onWindowScroll() {
69
+ const st = $window.scrollTop();
70
+ if (st !== lastScrollTop) {
71
+ const diff = Math.abs(st - lastScrollTop);
72
+ const scrolledDown = st > lastScrollTop;
73
+ const scrolledUp = st < lastScrollTop;
74
+ if (diff > 5) {
75
+ bottomBar.css({
76
+ bottom: !scrolledUp && scrolledDown ?
77
+ -bottomBar.find('.bottombar-nav').outerHeight(true) :
78
+ 0,
79
+ });
80
+ lastScrollTop = st;
81
+ }
82
+ }
83
+ }
84
+
85
+ const delayedScroll = utils.throttle(onWindowScroll, 250);
86
+ function enableAutohide() {
87
+ if (config.theme.autohideBottombar) {
88
+ lastScrollTop = $window.scrollTop();
89
+ $window.on('scroll', delayedScroll);
90
+ }
91
+ }
92
+
93
+ hooks.on('action:posts.loading', function () {
94
+ $window.off('scroll', delayedScroll);
95
+ });
96
+ hooks.on('action:posts.loaded', enableAutohide);
97
+ hooks.on('action:ajaxify.end', function () {
98
+ $window.off('scroll', delayedScroll);
99
+ enableAutohide();
51
100
  });
101
+ enableAutohide();
52
102
  });
53
103
  }
54
104
 
@@ -59,33 +109,41 @@ $(document).ready(function () {
59
109
  }
60
110
 
61
111
  function setupDrafts() {
62
- require(['composer/drafts'], function (drafts) {
112
+ require(['composer/drafts', 'bootbox'], function (drafts, bootbox) {
113
+ const draftsEl = $('[component="sidebar/drafts"]');
114
+
63
115
  function updateBadgeCount() {
64
116
  const count = drafts.getAvailableCount();
117
+ if (count > 0) {
118
+ draftsEl.removeClass('hidden');
119
+ }
65
120
  $('[component="drafts/count"]').toggleClass('hidden', count <= 0).text(count);
66
121
  }
67
122
 
68
123
  async function renderDraftList() {
69
124
  const draftListEl = $('[component="drafts/list"]');
70
- draftListEl.children(':not(.no-drafts)').remove();
71
-
72
125
  const draftItems = drafts.listAvailable();
73
126
  if (!draftItems.length) {
74
127
  draftListEl.find('.no-drafts').removeClass('hidden');
128
+ draftListEl.find('.placeholder-wave').addClass('hidden');
129
+ draftListEl.find('.draft-item-container').html('');
75
130
  return;
76
131
  }
77
132
  draftItems.reverse().forEach((draft) => {
78
133
  if (draft) {
79
- draft.text = draft.text.replace(/(?:\r\n|\r|\n)/g, '<br>');
134
+ draft.text = utils.escapeHTML(
135
+ draft.text
136
+ ).replace(/(?:\r\n|\r|\n)/g, '<br>');
80
137
  }
81
138
  });
82
139
 
83
140
  const html = await app.parseAndTranslate('partials/sidebar/drafts', 'drafts', { drafts: draftItems });
84
141
  draftListEl.find('.no-drafts').addClass('hidden');
85
- draftListEl.append(html).find('.timeago').timeago();
142
+ draftListEl.find('.placeholder-wave').addClass('hidden');
143
+ draftListEl.find('.draft-item-container').html(html).find('.timeago').timeago();
86
144
  }
87
145
 
88
- const draftsEl = $('[component="sidebar/drafts"]');
146
+
89
147
  draftsEl.on('shown.bs.dropdown', renderDraftList);
90
148
 
91
149
  draftsEl.on('click', '[component="drafts/open"]', function () {
@@ -93,8 +151,13 @@ $(document).ready(function () {
93
151
  });
94
152
 
95
153
  draftsEl.on('click', '[component="drafts/delete"]', function () {
96
- drafts.removeDraft($(this).attr('data-save-id'));
97
- renderDraftList();
154
+ const save_id = $(this).attr('data-save-id');
155
+ bootbox.confirm('[[modules:composer.discard-draft-confirm]]', function (ok) {
156
+ if (ok) {
157
+ drafts.removeDraft(save_id);
158
+ renderDraftList();
159
+ }
160
+ });
98
161
  return false;
99
162
  });
100
163
 
@@ -103,6 +166,7 @@ $(document).ready(function () {
103
166
  updateBadgeCount();
104
167
  });
105
168
  }
169
+
106
170
  function setupNProgress() {
107
171
  require(['nprogress'], function (NProgress) {
108
172
  window.nprogress = NProgress;
@@ -117,4 +181,38 @@ $(document).ready(function () {
117
181
  }
118
182
  });
119
183
  }
184
+
185
+ function handleMobileNavigator() {
186
+ const paginationBlockEl = $('.pagination-block');
187
+ require(['hooks'], function (hooks) {
188
+ hooks.on('action:ajaxify.end', function () {
189
+ paginationBlockEl.find('.dropdown-menu.show').removeClass('show');
190
+ });
191
+ hooks.on('filter:navigator.scroll', function (hookData) {
192
+ paginationBlockEl.find('.dropdown-menu.show').removeClass('show');
193
+ return hookData;
194
+ });
195
+ });
196
+ }
197
+
198
+ function setupNavTooltips() {
199
+ // remove title from user icon in sidebar to prevent double tooltip
200
+ $('.sidebar [component="header/avatar"] .avatar').removeAttr('title');
201
+ const tooltipEls = $('.sidebar [title]');
202
+ tooltipEls.tooltip({
203
+ trigger: 'manual',
204
+ animation: false,
205
+ });
206
+
207
+ tooltipEls.on('mouseenter', function (ev) {
208
+ const target = $(ev.target);
209
+ const isDropdown = target.hasClass('dropdown-menu') || !!target.parents('.dropdown-menu').length;
210
+ if (!$('.sidebar').hasClass('open') && !isDropdown) {
211
+ $(this).tooltip('show');
212
+ }
213
+ });
214
+ tooltipEls.on('click mouseleave', function () {
215
+ $(this).tooltip('hide');
216
+ });
217
+ }
120
218
  });
@@ -19,6 +19,7 @@ define('forum/account/theme', ['forum/account/header', 'api', 'settings', 'alert
19
19
  ...themeSettings,
20
20
  },
21
21
  });
22
+ config.theme = (await api.get('/api/config')).theme;
22
23
  alerts.success('[[success:settings-saved]]');
23
24
  });
24
25
  }
package/scss/common.scss CHANGED
@@ -14,8 +14,43 @@ body {
14
14
  .text-sm { font-size: 0.875rem!important; } // 14px
15
15
  .text-xs { font-size: 0.75rem!important; } // 12px
16
16
 
17
- .btn-link:hover {
18
- text-decoration: none;
17
+ .caret {
18
+ &::after {
19
+ border: none;
20
+ font-family: "FontAwesome";
21
+ content: "\f078";
22
+ color: tint-color($primary, 40%);
23
+ }
24
+ }
25
+
26
+ blockquote {
27
+ background-color: $light;
28
+ font-style: normal;
29
+ border-left: 2px solid $border-color;
30
+ padding: 1rem;
31
+ p:last-child {
32
+ margin-bottom: 0;
33
+ }
34
+ }
35
+
36
+ body:not(.page-user) {
37
+ #content {
38
+ transition: opacity 150ms linear;
39
+ &.ajaxifying {
40
+ -moz-opacity: 0;
41
+ opacity: 0;
42
+ }
43
+ }
44
+ }
45
+ .page-user {
46
+ #content {
47
+ transition: opacity 150ms linear;
48
+ &.ajaxifying .account-content {
49
+ transition: opacity 150ms linear;
50
+ -moz-opacity: 0;
51
+ opacity: 0;
52
+ }
53
+ }
19
54
  }
20
55
 
21
56
  .sticky-tools {
@@ -35,6 +70,13 @@ body {
35
70
  }
36
71
  }
37
72
 
73
+ .btn-link {
74
+ &:hover, &.active {
75
+ background-color: $btn-ghost-hover-color;
76
+ text-decoration: none;
77
+ }
78
+ }
79
+
38
80
  @mixin btn-ghost-base {
39
81
  display: flex;
40
82
  align-items: center;
@@ -48,10 +90,10 @@ body {
48
90
  text-align: left;
49
91
  --bs-text-opacity: 1;
50
92
  color: inherit !important;
51
- $hover-color: mix($light, $dark, 90);
93
+
52
94
  cursor: pointer;
53
95
  &:hover, &.active {
54
- background-color: $hover-color;
96
+ background-color: $btn-ghost-hover-color;
55
97
  text-decoration: none;
56
98
  }
57
99
  }
package/scss/harmony.scss CHANGED
@@ -9,6 +9,7 @@
9
9
  @import "status";
10
10
  @import "account";
11
11
  @import "groups";
12
+ @import "search";
12
13
  @import "modals";
13
14
 
14
15
  @import "modules/breadcrumbs";
@@ -20,5 +21,6 @@
20
21
  @import "modules/topics-list";
21
22
  @import "modules/cover";
22
23
  @import "modules/nprogress";
24
+ @import "modules/paginator";
23
25
 
24
26
  @import "skins";
package/scss/mixins.scss CHANGED
@@ -124,9 +124,13 @@
124
124
  display: none;
125
125
  }
126
126
 
127
- .timeline-event {
128
- .timeline-text.timeago {
129
- display: none;
127
+
128
+ [component="topic/event"], [component="topic/necro-post"] {
129
+ &.timeline-event {
130
+ .timeline-text {
131
+ line-height: 16px;
132
+ font-size: 0.75rem;
133
+ }
130
134
  }
131
135
  }
132
136
  }
package/scss/modals.scss CHANGED
@@ -1,4 +1,9 @@
1
1
  .tool-modal {
2
2
  bottom: $spacer * 3;
3
3
  right: $spacer * 4;
4
- }
4
+
5
+ @include media-breakpoint-down(md) {
6
+ right: $spacer;
7
+ left: $spacer;
8
+ }
9
+ }
@@ -8,7 +8,7 @@
8
8
  inset: auto 0 0 0!important;
9
9
 
10
10
  margin: 0 -1px -1px -1px;
11
- padding: 0 5px 4rem 5px!important;
11
+ padding: 0 5px!important;
12
12
  max-height: 60%;
13
13
 
14
14
  box-shadow: 0 2px 6px rgba(0,0,0,0.35);
@@ -6,10 +6,6 @@ $composer-bg: $body-bg !default;
6
6
  background-color: $bg !important;
7
7
  }
8
8
 
9
- .composer {
10
- z-index: 3 !important;
11
- }
12
-
13
9
  .skin-noskin {
14
10
  // only using colors when there is no bootswatch skin applied
15
11
  $composer-color: $secondary;
@@ -12,12 +12,11 @@
12
12
 
13
13
  &:hover {
14
14
  .controls {
15
- opacity: 0.8;
15
+ opacity: 1;
16
16
  }
17
17
  }
18
18
 
19
19
  .controls {
20
- text-align: center;
21
20
  height: 200px;
22
21
  line-height: 200px;
23
22
  opacity: 0;
@@ -28,15 +27,6 @@
28
27
  > * {
29
28
  pointer-events: all;
30
29
  }
31
-
32
- .fa {
33
- color: white;
34
- background-color: #333;
35
- opacity: 1;
36
- margin: 15px;
37
- padding: 5px;
38
- border-radius: 4px;
39
- }
40
30
  }
41
31
 
42
32
  &.active {
@@ -0,0 +1,24 @@
1
+ .skin-noskin [component="pagination"] {
2
+ .page-item.active:not(.disabled) .page-link {
3
+ color: $body-color;
4
+ background-color: $gray-300;
5
+ border-color: $gray-300;
6
+ }
7
+
8
+ .page-item:not(.disabled):hover .page-link {
9
+ color: $body-color;
10
+ }
11
+ }
12
+
13
+ [component="pagination"] {
14
+ .page-item.active:not(.disabled) .page-link {
15
+ color: $pagination-active-color;
16
+ }
17
+ .page-item:not(.disabled):hover .page-link {
18
+ color: $pagination-hover-color;
19
+ background-color: $pagination-hover-bg;
20
+ }
21
+ .page-item:not(.disabled) .page-link {
22
+ color: $body-color;
23
+ }
24
+ }
@@ -39,6 +39,8 @@ $text-muted: $gray-600 !default;
39
39
  $border-color: $gray-200 !default;
40
40
  $link-color: shade-color($blue, 20%) !default;
41
41
 
42
+ $btn-ghost-hover-color: mix($light, $dark, 90);
43
+
42
44
  // no caret on dropdown-toggle
43
45
  $enable-caret: false;
44
46
 
@@ -53,7 +55,7 @@ $link-hover-decoration: underline;
53
55
 
54
56
  // Custom fonts
55
57
  $font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
56
- $font-family-secondary: "Poppins" !default;
58
+ $font-family-secondary: "Poppins", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji" !default;
57
59
  $font-weight-semibold: 500 !default;
58
60
 
59
61
  $breadcrumb-divider: quote("→");
@@ -0,0 +1,8 @@
1
+ [component="search/filters"] {
2
+ .filter-btn {
3
+ border-color: $gray-300!important;
4
+ &.active-filter {
5
+ border-color: $primary!important;
6
+ }
7
+ }
8
+ }
package/scss/sidebar.scss CHANGED
@@ -1,10 +1,10 @@
1
1
  .skin-noskin {
2
2
  // only using colors when there is no bootswatch skin applied
3
- nav.sidebar, .bottombar {
3
+ nav.sidebar, .bottombar-nav {
4
4
  color: $secondary !important;
5
5
  background-color: $light !important;
6
6
  }
7
- .bottombar {
7
+ .bottombar-nav {
8
8
  .dropdown-menu {
9
9
  color: $secondary !important;
10
10
  background-color: $light !important;
@@ -97,7 +97,10 @@
97
97
  }
98
98
 
99
99
  .bottombar {
100
- z-index: $zindex-dropdown;
100
+ transition: bottom 150ms linear;
101
+ }
102
+
103
+ .bottombar-nav {
101
104
  .nav-text {
102
105
  font-size: 1rem;
103
106
  color: $body-color;
@@ -128,7 +131,7 @@
128
131
  overflow: auto!important;
129
132
  }
130
133
  .search-dropdown .quick-search-results {
131
- max-height: 250px!important;
134
+ max-height: 225px!important;
132
135
  overflow-y: auto!important;
133
136
  }
134
137
  .search-dropdown, .chats-dropdown, .notifications-dropdown, .drafts-dropdown {
package/scss/topic.scss CHANGED
@@ -1,3 +1,5 @@
1
+ .pagination-block { display: none; }
2
+
1
3
  .page-topic {
2
4
  [component="topic/title"] {
3
5
  font-size: 28px;
@@ -14,18 +16,6 @@
14
16
  line-height: 20px;
15
17
  }
16
18
 
17
- .action-bar {
18
- .dropdown-toggle::after {
19
- border: none;
20
- font-family: "FontAwesome";
21
- content: "\f078";
22
- color: tint-color($primary, 40%);
23
-
24
- position: relative;
25
- top: 2px;
26
- }
27
- }
28
-
29
19
  .topic {
30
20
  .posts {
31
21
  max-width: 960px;
@@ -67,6 +57,17 @@
67
57
  [component="post/reply-count"] {
68
58
  font-size: $font-size-base * .75;
69
59
  }
60
+
61
+ [component="post/upvote"], [component="post/downvote"] {
62
+ &.upvoted, &.downvoted {
63
+ background-color: lighten($btn-ghost-hover-color, 5%);
64
+
65
+ &:hover {
66
+ background-color: $btn-ghost-hover-color;
67
+
68
+ }
69
+ }
70
+ }
70
71
  }
71
72
  }
72
73
 
@@ -106,6 +107,15 @@
106
107
  }
107
108
  }
108
109
  }
110
+
111
+ .pagination-block {
112
+ display: block;
113
+ transition: opacity 250ms ease-in;
114
+ opacity: 0;
115
+ &.ready {
116
+ opacity: 1;
117
+ }
118
+ }
109
119
  }
110
120
 
111
121
  @include media-breakpoint-up(sm) {
@@ -1,45 +1,39 @@
1
- <div class="account">
2
- <!-- IMPORT partials/account/header.tpl -->
3
- <div class="d-flex flex-column flex-md-row">
4
- <!-- IMPORT partials/account/sidebar-left.tpl -->
5
- <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
6
- <div class="d-flex justify-content-between mb-3">
7
- <h3 class="fw-semibold fs-5">[[pages:account/blocks, {username}]]</h3>
8
- <div class="justify-content-end">
9
- <div class="dropdown">
10
- <div class="input-group">
11
- <input class="form-control form-control-sm" type="text" id="user-search" placeholder="[[users:enter_username]]" data-bs-toggle="dropdown" autocomplete="off"/>
12
- <button class="btn btn-primary btn-sm" type="button">
13
- <i class="fa fa-search"></i>
14
- </button>
15
- </div>
1
+ <!-- IMPORT partials/account/header.tpl -->
2
+ <div class="d-flex justify-content-between mb-3">
3
+ <h3 class="fw-semibold fs-5">[[pages:account/blocks, {username}]]</h3>
4
+ <div class="justify-content-end">
5
+ <div class="dropdown">
6
+ <div class="input-group">
7
+ <input class="form-control form-control-sm" type="text" id="user-search" placeholder="[[users:enter_username]]" data-bs-toggle="dropdown" autocomplete="off"/>
8
+ <button class="btn btn-primary btn-sm" type="button">
9
+ <i class="fa fa-search"></i>
10
+ </button>
11
+ </div>
16
12
 
17
- <ul component="blocks/search/list" class="dropdown-menu dropdown-menu-end block-edit overflow-auto" style="max-height:300px;">
18
- <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
19
- {{{ each edit }}}
20
- <li class="">
21
- <div class="dropdown-item d-flex flex-nowrap gap-2 justify-content-between">
22
- <div class="text-truncate">
23
- <a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
24
- </div>
25
- <button class="btn btn-sm btn-primary text-nowrap" data-uid="{./uid}" data-action="toggle">[[user:block_toggle]]</button>
26
- </div>
27
- </li>
28
- {{{ end }}}
29
- </ul>
13
+ <ul component="blocks/search/list" class="dropdown-menu dropdown-menu-end block-edit overflow-auto" style="max-height:300px;">
14
+ <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
15
+ {{{ each edit }}}
16
+ <li class="">
17
+ <div class="dropdown-item d-flex flex-nowrap gap-2 justify-content-between">
18
+ <div class="text-truncate">
19
+ <a href="{config.relative_path}/uid/{./uid}" class="text-decoration-none">{buildAvatar(edit, "24px", true)} {./username}</a>
20
+ </div>
21
+ <button class="btn btn-sm btn-primary text-nowrap" data-uid="{./uid}" data-action="toggle">[[user:block_toggle]]</button>
30
22
  </div>
31
- </div>
32
- </div>
33
- <div class="users">
34
- <div id="users-container" class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
35
- {{{ each users }}}
36
- <!-- IMPORT partials/users/item.tpl -->
37
- {{{ end }}}
38
- </div>
39
- <div class="alert alert-warning text-center"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has_no_blocks]]</div>
40
- <!-- IMPORT partials/paginator.tpl -->
41
- </div>
23
+ </li>
24
+ {{{ end }}}
25
+ </ul>
42
26
  </div>
43
-
44
27
  </div>
45
- </div>
28
+ </div>
29
+ <div class="users">
30
+ <div id="users-container" class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
31
+ {{{ each users }}}
32
+ <!-- IMPORT partials/users/item.tpl -->
33
+ {{{ end }}}
34
+ </div>
35
+ <div class="alert alert-warning text-center"{{{ if users.length }}} style="display: none;"{{{ end }}}>[[user:has_no_blocks]]</div>
36
+ <!-- IMPORT partials/paginator.tpl -->
37
+ </div>
38
+
39
+ <!-- IMPORT partials/account/footer.tpl -->