nodebb-theme-harmony 1.0.0-beta.11 → 1.0.0-beta.110

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 (151) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +6 -1
  3. package/library.js +27 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +133 -9
  7. package/public/settings.js +1 -0
  8. package/screenshots/categories.png +0 -0
  9. package/screenshots/recent.png +0 -0
  10. package/screenshots/topic.png +0 -0
  11. package/scss/account.scss +1 -1
  12. package/scss/chats.scss +53 -25
  13. package/scss/common.scss +84 -10
  14. package/scss/flags.scss +5 -0
  15. package/scss/groups.scss +2 -2
  16. package/scss/harmony.scss +3 -0
  17. package/scss/mixins.scss +7 -3
  18. package/scss/modals.scss +5 -3
  19. package/scss/modules/bottom-sheet.scss +1 -1
  20. package/scss/modules/composer.scss +0 -4
  21. package/scss/modules/cover.scss +1 -11
  22. package/scss/modules/filters.scss +8 -0
  23. package/scss/modules/paginator.scss +24 -0
  24. package/scss/modules/topic-navigator.scss +18 -42
  25. package/scss/modules/topics-list.scss +32 -17
  26. package/scss/modules/user-menu.scss +6 -0
  27. package/scss/overrides.scss +4 -1
  28. package/scss/sidebar.scss +39 -11
  29. package/scss/topic.scss +19 -13
  30. package/templates/account/blocks.tpl +35 -40
  31. package/templates/account/categories.tpl +47 -29
  32. package/templates/account/consent.tpl +66 -10
  33. package/templates/account/edit/password.tpl +25 -30
  34. package/templates/account/edit/username.tpl +21 -26
  35. package/templates/account/edit.tpl +105 -116
  36. package/templates/account/followers.tpl +12 -19
  37. package/templates/account/following.tpl +12 -18
  38. package/templates/account/groups.tpl +12 -17
  39. package/templates/account/info.tpl +178 -206
  40. package/templates/account/posts.tpl +31 -36
  41. package/templates/account/profile.tpl +66 -73
  42. package/templates/account/sessions.tpl +8 -30
  43. package/templates/account/settings.tpl +222 -203
  44. package/templates/account/theme.tpl +39 -25
  45. package/templates/account/topics.tpl +36 -38
  46. package/templates/account/uploads.tpl +33 -40
  47. package/templates/admin/plugins/harmony.tpl +21 -3
  48. package/templates/categories.tpl +3 -6
  49. package/templates/category.tpl +13 -14
  50. package/templates/chats.tpl +9 -10
  51. package/templates/flags/detail.tpl +160 -193
  52. package/templates/flags/list.tpl +3 -70
  53. package/templates/footer.tpl +2 -2
  54. package/templates/groups/details.tpl +22 -19
  55. package/templates/groups/list.tpl +1 -1
  56. package/templates/groups/members.tpl +0 -2
  57. package/templates/header.tpl +2 -2
  58. package/templates/login.tpl +4 -4
  59. package/templates/notifications.tpl +5 -5
  60. package/templates/partials/account/admin-menu.tpl +9 -9
  61. package/templates/partials/account/category-item.tpl +14 -17
  62. package/templates/partials/account/footer.tpl +3 -0
  63. package/templates/partials/account/header.tpl +78 -81
  64. package/templates/partials/account/session-list.tpl +18 -0
  65. package/templates/partials/account/sidebar-left.tpl +31 -25
  66. package/templates/partials/breadcrumbs.tpl +6 -6
  67. package/templates/partials/buttons/newTopic.tpl +1 -1
  68. package/templates/partials/categories/item.tpl +31 -27
  69. package/templates/partials/categories/lastpost.tpl +7 -7
  70. package/templates/partials/category/filter-dropdown-content.tpl +37 -0
  71. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +7 -7
  72. package/templates/partials/category/sort.tpl +22 -7
  73. package/templates/partials/category/subcategory.tpl +2 -3
  74. package/templates/partials/category/tags.tpl +0 -2
  75. package/templates/partials/category/tools.tpl +28 -25
  76. package/templates/partials/category/watch.tpl +39 -6
  77. package/templates/partials/chats/dropdown.tpl +4 -1
  78. package/templates/partials/chats/message-window.tpl +10 -9
  79. package/templates/partials/chats/message.tpl +4 -6
  80. package/templates/partials/chats/options.tpl +14 -6
  81. package/templates/partials/chats/recent_room.tpl +41 -32
  82. package/templates/partials/cookie-consent.tpl +5 -5
  83. package/templates/partials/flags/bulk-actions.tpl +9 -0
  84. package/templates/partials/flags/filters.tpl +165 -78
  85. package/templates/partials/flags/results.tpl +38 -0
  86. package/templates/partials/groups/admin.tpl +4 -4
  87. package/templates/partials/groups/badge.tpl +1 -1
  88. package/templates/partials/groups/list.tpl +2 -2
  89. package/templates/partials/groups/memberlist.tpl +1 -1
  90. package/templates/partials/groups/sidebar-left.tpl +10 -10
  91. package/templates/partials/header/brand.tpl +9 -2
  92. package/templates/partials/mobile-footer.tpl +13 -13
  93. package/templates/partials/notifications_list.tpl +11 -8
  94. package/templates/partials/paginator.tpl +11 -9
  95. package/templates/partials/post_bar.tpl +26 -25
  96. package/templates/partials/posts_list_item.tpl +5 -5
  97. package/templates/partials/quick-search-results.tpl +3 -3
  98. package/templates/partials/search-filters.tpl +184 -0
  99. package/templates/partials/search-results.tpl +28 -35
  100. package/templates/partials/sidebar/chats.tpl +22 -33
  101. package/templates/partials/sidebar/drafts.tpl +45 -34
  102. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  103. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  104. package/templates/partials/sidebar/notifications.tpl +28 -7
  105. package/templates/partials/sidebar/search.tpl +1 -1
  106. package/templates/partials/sidebar/user-menu.tpl +38 -29
  107. package/templates/partials/sidebar-left.tpl +11 -11
  108. package/templates/partials/sidebar-right.tpl +1 -3
  109. package/templates/partials/skin-switcher.tpl +3 -3
  110. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  111. package/templates/partials/tags_list.tpl +4 -4
  112. package/templates/partials/topic/browsing-users.tpl +0 -2
  113. package/templates/partials/topic/event.tpl +1 -1
  114. package/templates/partials/topic/navigator-mobile.tpl +30 -11
  115. package/templates/partials/topic/navigator.tpl +23 -17
  116. package/templates/partials/topic/post-editor.tpl +0 -2
  117. package/templates/partials/topic/post-menu-list.tpl +60 -62
  118. package/templates/partials/topic/post-menu.tpl +16 -11
  119. package/templates/partials/topic/post.tpl +45 -27
  120. package/templates/partials/topic/quickreply.tpl +5 -5
  121. package/templates/partials/topic/reply-button.tpl +3 -3
  122. package/templates/partials/topic/sort.tpl +17 -5
  123. package/templates/partials/topic/tools.tpl +2 -2
  124. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  125. package/templates/partials/topic/watch.tpl +42 -9
  126. package/templates/partials/topic-filters.tpl +6 -3
  127. package/templates/partials/topic-list-bar.tpl +50 -46
  128. package/templates/partials/topic-terms.tpl +6 -3
  129. package/templates/partials/topics_list.tpl +88 -93
  130. package/templates/partials/userFilter-placeholders.tpl +5 -0
  131. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  132. package/templates/partials/users/item.tpl +25 -27
  133. package/templates/partials/users_list.tpl +1 -1
  134. package/templates/popular.tpl +3 -1
  135. package/templates/post-queue.tpl +166 -0
  136. package/templates/recent.tpl +3 -2
  137. package/templates/register.tpl +4 -4
  138. package/templates/search.tpl +39 -177
  139. package/templates/tags.tpl +3 -3
  140. package/templates/top.tpl +3 -1
  141. package/templates/topic.tpl +74 -68
  142. package/templates/unread.tpl +3 -1
  143. package/templates/users.tpl +7 -3
  144. package/templates/modules/usercard.tpl +0 -39
  145. package/templates/partials/acceptTos.tpl +0 -11
  146. package/templates/partials/category-filter-content.tpl +0 -30
  147. package/templates/partials/category-filter-right.tpl +0 -5
  148. package/templates/partials/category-filter.tpl +0 -3
  149. package/templates/partials/category-selector-right.tpl +0 -5
  150. package/templates/partials/category-selector.tpl +0 -3
  151. package/templates/partials/slideout-menu.tpl +0 -6
package/README.md CHANGED
@@ -5,4 +5,15 @@ The Harmony theme is the default theme for NodeBB for versions spanning v3.0.0 o
5
5
 
6
6
  ## Issues
7
7
 
8
- Issues are tracked in [the main project issue tracker](https://github.com/NodeBB/NodeBB/issues?q=is%3Aopen+is%3Aissue+label%3Athemes).
8
+ Issues are tracked in [the main project issue tracker](https://github.com/NodeBB/NodeBB/issues?q=is%3Aopen+is%3Aissue+label%3Athemes).
9
+
10
+ ## Screenshots
11
+
12
+ ### Categories
13
+ <img height="450" src="screenshots/categories.png">
14
+
15
+ ### Recent
16
+ <img height="450" src="screenshots/recent.png">
17
+
18
+ ### Topic
19
+ <img height="450" src="screenshots/topic.png">
@@ -1,9 +1,14 @@
1
1
  {
2
2
  "skins": "Skins",
3
3
  "collapse": "Collapse",
4
+ "expand": "Expand",
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.mobileTopicTeasers": "Show topic teasers on mobile",
10
+ "settings.stickyToolbar": "Sticky toolbar",
11
+ "settings.stickyToolbar.help": "The toolbar on topic and category pages will stick to the top of the page",
12
+ "settings.autohideBottombar": "Auto hide bottom bar",
13
+ "settings.autohideBottombar.help": "The bottom bar on mobile view will be hidden when the page is scrolled down"
9
14
  }
package/library.js CHANGED
@@ -11,7 +11,9 @@ const library = module.exports;
11
11
  const defaults = {
12
12
  enableQuickReply: 'on',
13
13
  centerHeaderElements: 'off',
14
+ mobileTopicTeasers: 'off',
14
15
  stickyToolbar: 'on',
16
+ autohideBottombar: 'off',
15
17
  openSidebars: 'off',
16
18
  };
17
19
 
@@ -77,11 +79,26 @@ library.defineWidgetAreas = async function (areas) {
77
79
  });
78
80
 
79
81
  areas = areas.concat([
82
+ {
83
+ name: 'Main post header',
84
+ template: 'topic.tpl',
85
+ location: 'mainpost-header',
86
+ },
87
+ {
88
+ name: 'Main post footer',
89
+ template: 'topic.tpl',
90
+ location: 'mainpost-footer',
91
+ },
80
92
  {
81
93
  name: 'Sidebar Footer',
82
94
  template: 'global',
83
95
  location: 'sidebar-footer',
84
96
  },
97
+ {
98
+ name: 'Brand Header',
99
+ template: 'global',
100
+ location: 'brand-header',
101
+ },
85
102
  ]);
86
103
 
87
104
  return areas;
@@ -92,15 +109,19 @@ async function loadThemeConfig(uid) {
92
109
  meta.settings.get('harmony'),
93
110
  user.getSettings(uid),
94
111
  ]);
95
- return { ...defaults, ...themeConfig, ...userConfig };
112
+
113
+ const config = { ...defaults, ...themeConfig, ...(_.pick(userConfig, Object.keys(defaults))) };
114
+ config.enableQuickReply = config.enableQuickReply === 'on';
115
+ config.centerHeaderElements = config.centerHeaderElements === 'on';
116
+ config.mobileTopicTeasers = config.mobileTopicTeasers === 'on';
117
+ config.stickyToolbar = config.stickyToolbar === 'on';
118
+ config.autohideBottombar = config.autohideBottombar === 'on';
119
+ config.openSidebars = config.openSidebars === 'on';
120
+ return config;
96
121
  }
97
122
 
98
123
  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';
124
+ config.theme = await loadThemeConfig(config.uid);;
104
125
  config.openDraftsOnPageLoad = false;
105
126
  return config;
106
127
  };
@@ -124,25 +145,6 @@ library.saveUserSettings = async function (hookData) {
124
145
  return hookData;
125
146
  };
126
147
 
127
- library.addUserToTopic = async function (hookData) {
128
- const { enableQuickReply } = await loadThemeConfig(hookData.req.uid);
129
- if (enableQuickReply === 'on') {
130
- if (hookData.req.user) {
131
- const userData = await user.getUserData(hookData.req.uid);
132
- hookData.templateData.loggedInUser = userData;
133
- } else {
134
- hookData.templateData.loggedInUser = {
135
- uid: 0,
136
- username: '[[global:guest]]',
137
- picture: user.getDefaultAvatar(),
138
- 'icon:text': '?',
139
- 'icon:bgColor': '#aaa',
140
- };
141
- }
142
- }
143
- return hookData;
144
- };
145
-
146
148
  library.filterMiddlewareRenderHeader = async function (hookData) {
147
149
  const userSettings = await user.getSettings(hookData.req.uid);
148
150
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-theme-harmony",
3
- "version": "1.0.0-beta.11",
3
+ "version": "1.0.0-beta.110",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.0.0"
6
6
  },
package/plugin.json CHANGED
@@ -8,7 +8,6 @@
8
8
  { "hook": "filter:settings.get", "method": "getAdminSettings"},
9
9
  { "hook": "filter:user.saveSettings", "method": "saveUserSettings" },
10
10
  { "hook": "filter:user.profileMenu", "method": "addProfileItem" },
11
- { "hook": "filter:topic.build", "method": "addUserToTopic" },
12
11
  { "hook": "filter:middleware.renderHeader", "method": "filterMiddlewareRenderHeader" },
13
12
  { "hook": "filter:middleware.render", "method": "removeFinalBreadcrumb" }
14
13
  ],
package/public/harmony.js CHANGED
@@ -6,6 +6,8 @@ $(document).ready(function () {
6
6
  setupSearch();
7
7
  setupDrafts();
8
8
  handleMobileNavigator();
9
+ setupNavTooltips();
10
+ fixPlaceholders();
9
11
 
10
12
  $('[component="skinSwitcher"]').on('click', '.dropdown-item', function () {
11
13
  const skin = $(this).attr('data-value');
@@ -37,7 +39,7 @@ $(document).ready(function () {
37
39
  });
38
40
 
39
41
  function setupMobileMenu() {
40
- require(['api'], function (api) {
42
+ require(['hooks', 'api', 'navigator'], function (hooks, api, navigator) {
41
43
  $('[component="sidebar/toggle"]').on('click', async function () {
42
44
  const sidebarEl = $('.sidebar');
43
45
  sidebarEl.toggleClass('open');
@@ -49,6 +51,70 @@ $(document).ready(function () {
49
51
  });
50
52
  }
51
53
  $(window).trigger('action:sidebar.toggle');
54
+ if (ajaxify.data.template.topic) {
55
+ hooks.fire('action:navigator.update', { newIndex: navigator.getIndex() });
56
+ }
57
+ });
58
+
59
+ const bottomBar = $('[component="bottombar"]');
60
+ const $body = $('body');
61
+ const $window = $(window);
62
+ $body.on('shown.bs.dropdown', '.sticky-tools', function () {
63
+ bottomBar.addClass('hidden');
64
+ });
65
+ $body.on('hidden.bs.dropdown', '.sticky-tools', function () {
66
+ bottomBar.removeClass('hidden');
67
+ });
68
+
69
+ let lastScrollTop = 0;
70
+ let newPostsLoaded = false;
71
+
72
+ function onWindowScroll() {
73
+ const st = $window.scrollTop();
74
+ if (newPostsLoaded) {
75
+ newPostsLoaded = false;
76
+ lastScrollTop = st;
77
+ return;
78
+ }
79
+ if (st !== lastScrollTop && !navigator.scrollActive) {
80
+ const diff = Math.abs(st - lastScrollTop);
81
+ const scrolledDown = st > lastScrollTop;
82
+ const scrolledUp = st < lastScrollTop;
83
+ if (diff > 5) {
84
+ bottomBar.css({
85
+ bottom: !scrolledUp && scrolledDown ?
86
+ -bottomBar.find('.bottombar-nav').outerHeight(true) :
87
+ 0,
88
+ });
89
+ }
90
+ }
91
+ lastScrollTop = st;
92
+ }
93
+
94
+ const delayedScroll = utils.throttle(onWindowScroll, 250);
95
+ function enableAutohide() {
96
+ $window.off('scroll', delayedScroll);
97
+ if (config.theme.autohideBottombar) {
98
+ lastScrollTop = $window.scrollTop();
99
+ $window.on('scroll', delayedScroll);
100
+ }
101
+ }
102
+
103
+ hooks.on('action:posts.loading', function () {
104
+ $window.off('scroll', delayedScroll);
105
+ });
106
+ hooks.on('action:posts.loaded', function () {
107
+ newPostsLoaded = true;
108
+ setTimeout(enableAutohide, 250);
109
+ });
110
+ hooks.on('action:ajaxify.end', function () {
111
+ $window.off('scroll', delayedScroll);
112
+ $body.removeClass('chat-loaded');
113
+ bottomBar.css({ bottom: 0 });
114
+ setTimeout(enableAutohide, 250);
115
+ });
116
+ hooks.on('action:chat.loaded', function () {
117
+ $body.toggleClass('chat-loaded', !!(ajaxify.data.template.chats && ajaxify.data.roomId));
52
118
  });
53
119
  });
54
120
  }
@@ -60,33 +126,41 @@ $(document).ready(function () {
60
126
  }
61
127
 
62
128
  function setupDrafts() {
63
- require(['composer/drafts'], function (drafts) {
129
+ require(['composer/drafts', 'bootbox'], function (drafts, bootbox) {
130
+ const draftsEl = $('[component="sidebar/drafts"]');
131
+
64
132
  function updateBadgeCount() {
65
133
  const count = drafts.getAvailableCount();
134
+ if (count > 0) {
135
+ draftsEl.removeClass('hidden');
136
+ }
66
137
  $('[component="drafts/count"]').toggleClass('hidden', count <= 0).text(count);
67
138
  }
68
139
 
69
140
  async function renderDraftList() {
70
141
  const draftListEl = $('[component="drafts/list"]');
71
- draftListEl.children(':not(.no-drafts)').remove();
72
-
73
142
  const draftItems = drafts.listAvailable();
74
143
  if (!draftItems.length) {
75
144
  draftListEl.find('.no-drafts').removeClass('hidden');
145
+ draftListEl.find('.placeholder-wave').addClass('hidden');
146
+ draftListEl.find('.draft-item-container').html('');
76
147
  return;
77
148
  }
78
149
  draftItems.reverse().forEach((draft) => {
79
150
  if (draft) {
80
- draft.text = draft.text.replace(/(?:\r\n|\r|\n)/g, '<br>');
151
+ draft.text = utils.escapeHTML(
152
+ draft.text
153
+ ).replace(/(?:\r\n|\r|\n)/g, '<br>');
81
154
  }
82
155
  });
83
156
 
84
157
  const html = await app.parseAndTranslate('partials/sidebar/drafts', 'drafts', { drafts: draftItems });
85
158
  draftListEl.find('.no-drafts').addClass('hidden');
86
- draftListEl.append(html).find('.timeago').timeago();
159
+ draftListEl.find('.placeholder-wave').addClass('hidden');
160
+ draftListEl.find('.draft-item-container').html(html).find('.timeago').timeago();
87
161
  }
88
162
 
89
- const draftsEl = $('[component="sidebar/drafts"]');
163
+
90
164
  draftsEl.on('shown.bs.dropdown', renderDraftList);
91
165
 
92
166
  draftsEl.on('click', '[component="drafts/open"]', function () {
@@ -94,8 +168,13 @@ $(document).ready(function () {
94
168
  });
95
169
 
96
170
  draftsEl.on('click', '[component="drafts/delete"]', function () {
97
- drafts.removeDraft($(this).attr('data-save-id'));
98
- renderDraftList();
171
+ const save_id = $(this).attr('data-save-id');
172
+ bootbox.confirm('[[modules:composer.discard-draft-confirm]]', function (ok) {
173
+ if (ok) {
174
+ drafts.removeDraft(save_id);
175
+ renderDraftList();
176
+ }
177
+ });
99
178
  return false;
100
179
  });
101
180
 
@@ -132,4 +211,49 @@ $(document).ready(function () {
132
211
  });
133
212
  });
134
213
  }
214
+
215
+ function setupNavTooltips() {
216
+ // remove title from user icon in sidebar to prevent double tooltip
217
+ $('.sidebar [component="header/avatar"] .avatar').removeAttr('title');
218
+ const tooltipEls = $('.sidebar [title]');
219
+ tooltipEls.tooltip({
220
+ trigger: 'manual',
221
+ animation: false,
222
+ });
223
+
224
+ tooltipEls.on('mouseenter', function (ev) {
225
+ const target = $(ev.target);
226
+ const isDropdown = target.hasClass('dropdown-menu') || !!target.parents('.dropdown-menu').length;
227
+ if (!$('.sidebar').hasClass('open') && !isDropdown) {
228
+ $(this).tooltip('show');
229
+ }
230
+ });
231
+ tooltipEls.on('click mouseleave', function () {
232
+ $(this).tooltip('hide');
233
+ });
234
+ }
235
+
236
+ function fixPlaceholders() {
237
+ if (!config.loggedIn) {
238
+ return;
239
+ }
240
+ ['notifications', 'chat'].forEach((type) => {
241
+ const countEl = document.querySelector(`[component="${type}/count"]`);
242
+ if (!countEl) {
243
+ return;
244
+ }
245
+ const count = parseInt(countEl.innerText, 10);
246
+ if (count > 1) {
247
+ const listEls = document.querySelectorAll(`[component="${type}/list"]`);
248
+ listEls.forEach((listEl) => {
249
+ const placeholder = listEl.querySelector('li');
250
+
251
+ for (let x = 0; x < count - 1; x++) {
252
+ const cloneEl = placeholder.cloneNode(true);
253
+ listEl.insertBefore(cloneEl, placeholder);
254
+ }
255
+ });
256
+ }
257
+ });
258
+ }
135
259
  });
@@ -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
  }
Binary file
Binary file
Binary file
package/scss/account.scss CHANGED
@@ -1,4 +1,4 @@
1
- .page-user #panel {
1
+ .page-user.page-status-200 #panel {
2
2
  margin-top: 0px!important;
3
3
  }
4
4
  .account {
package/scss/chats.scss CHANGED
@@ -3,37 +3,64 @@
3
3
  .page-user-chats #content {
4
4
  max-width: 100%;
5
5
  }
6
+
6
7
  body.page-user-chats {
7
8
  overflow: hidden;
9
+ [data-widget-area="footer"] {
10
+ display: none;
11
+ }
12
+ height: 100%;
13
+ > .layout-container {
14
+ height: 100%;
15
+ > #panel {
16
+ height: 100%;
17
+ > .container {
18
+ height: 100%;
19
+ }
20
+ }
21
+ }
22
+ }
23
+
24
+ [component="chat/recent"] {
25
+ .active .chat-room-btn {
26
+ background-color: $btn-ghost-hover-color;
27
+ }
8
28
  }
29
+
9
30
  [component="chat/nav-wrapper"] {
10
31
  width: 300px;
11
32
  }
33
+
12
34
  .expanded-chat {
13
35
  // no taskbar so hide minimize button
14
36
  [data-action="minimize"] {
15
37
  display: none!important;
16
38
  }
17
- .chat-content .chat-message {
18
- .message-body-wrapper .controls {
19
- [data-action="restore"] {
20
- display: none;
39
+
40
+ .chat-content {
41
+ @include fix-lists;
42
+
43
+ .chat-message {
44
+ .message-body-wrapper .controls {
45
+ [data-action="restore"] {
46
+ display: none;
47
+ }
21
48
  }
22
49
  }
23
- }
24
- .chat-content .chat-message.deleted {
25
- .message-body-wrapper .controls {
26
- [data-action] {
27
- display: none;
28
- }
50
+ .chat-message.deleted {
51
+ .message-body-wrapper .controls {
52
+ [data-action] {
53
+ display: none;
54
+ }
29
55
 
30
- [data-action="restore"] {
31
- display: inline;
56
+ [data-action="restore"] {
57
+ display: inline;
58
+ }
32
59
  }
33
- }
34
60
 
35
- .message-body {
36
- opacity: 0.3;
61
+ .message-body {
62
+ opacity: 0.3;
63
+ }
37
64
  }
38
65
  }
39
66
  }
@@ -43,17 +70,18 @@ body.page-user-chats {
43
70
  [component="chat/nav-wrapper"] {
44
71
  width: 100%;
45
72
  }
46
- .page-user-chats {
47
- .chats-full {
48
- padding-bottom: 8rem!important;
49
- }
50
73
 
51
- [component="chat/nav-wrapper"][data-loaded="1"] {
52
- display: none!important;
53
- }
54
74
 
55
- [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] {
56
- display: none!important;
57
- }
75
+ .page-user-chats.chat-loaded .bottombar {
76
+ display: none!important;
58
77
  }
78
+
79
+ [component="chat/nav-wrapper"][data-loaded="1"] {
80
+ display: none!important;
81
+ }
82
+
83
+ [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] {
84
+ display: none!important;
85
+ }
86
+
59
87
  }
package/scss/common.scss CHANGED
@@ -1,27 +1,88 @@
1
1
 
2
2
  body {
3
3
  overflow-y: scroll;
4
+ -webkit-font-smoothing: antialiased;
5
+ -moz-osx-font-smoothing: grayscale;
6
+ text-rendering: optimizeLegibility;
4
7
  }
8
+
9
+ // fixes chrome font boosting :/ https://stackoverflow.com/questions/13430897/how-to-override-font-boosting-in-mobile-chrome
10
+ body * {
11
+ max-height:1000000px;
12
+ text-size-adjust: none;
13
+ -webkit-text-size-adjust: none;
14
+ -moz-text-size-adjust: none;
15
+ }
16
+
17
+ hr {
18
+ border-top-color: $border-color;
19
+ opacity: 1;
20
+ }
21
+
5
22
  .ff-base {
6
- font-family: $font-family-base;
23
+ font-family: $font-family-base !important;
24
+ }
25
+ .ff-sans {
26
+ font-family: $font-family-sans-serif !important;
7
27
  }
8
28
  .ff-secondary {
9
29
  font-family: $font-family-secondary;
10
30
  }
11
- .tracking-tight { letter-spacing: -0.025em; }
31
+ .tracking-tight { letter-spacing: -0.02em; }
32
+
33
+ .caret {
34
+ &::after {
35
+ border: none;
36
+ font-family: "FontAwesome";
37
+ content: "\f078";
38
+ color: tint-color($primary, 40%);
39
+ }
40
+ }
41
+
42
+ .placeholder-wave {
43
+ opacity: 0.5;
44
+ }
45
+
46
+ .bg-card-cap {
47
+ --bs-bg-opacity: 1;
48
+ background-color: $card-cap-bg!important;
49
+ }
12
50
 
13
- .text-md { font-size: 1.125rem!important; } // 18px
14
- .text-sm { font-size: 0.875rem!important; } // 14px
15
- .text-xs { font-size: 0.75rem!important; } // 12px
51
+ blockquote {
52
+ background-color: $light;
53
+ font-style: normal;
54
+ border-left: 2px solid $border-color;
55
+ padding: 1rem;
56
+ p:last-child {
57
+ margin-bottom: 0;
58
+ }
59
+ }
16
60
 
17
- .btn-link:hover {
18
- text-decoration: none;
61
+ body:not(.page-user) {
62
+ #content {
63
+ transition: opacity 150ms linear;
64
+ &.ajaxifying {
65
+ -moz-opacity: 0;
66
+ opacity: 0;
67
+ }
68
+ }
69
+ }
70
+ .page-user {
71
+ #content {
72
+ transition: opacity 150ms linear;
73
+ &.ajaxifying .account-content {
74
+ transition: opacity 150ms linear;
75
+ -moz-opacity: 0;
76
+ opacity: 0;
77
+ }
78
+ }
19
79
  }
20
80
 
21
81
  .sticky-tools {
22
82
  position: sticky;
23
83
  z-index: 3;
24
- top: calc($spacer * 0.5);
84
+ top: 0;
85
+ padding: 0.25rem 0;
25
86
  background-color: $body-bg;
26
87
  }
27
88
  // quartz doesn't need body-bg for tool background
@@ -35,6 +96,13 @@ body {
35
96
  }
36
97
  }
37
98
 
99
+ .btn-link {
100
+ &:hover, &.active {
101
+ background-color: $btn-ghost-hover-color;
102
+ text-decoration: none;
103
+ }
104
+ }
105
+
38
106
  @mixin btn-ghost-base {
39
107
  display: flex;
40
108
  align-items: center;
@@ -48,10 +116,10 @@ body {
48
116
  text-align: left;
49
117
  --bs-text-opacity: 1;
50
118
  color: inherit !important;
51
- $hover-color: mix($light, $dark, 90);
119
+ font-family: $font-family-secondary;
52
120
  cursor: pointer;
53
121
  &:hover, &.active {
54
- background-color: $hover-color;
122
+ background-color: $btn-ghost-hover-color;
55
123
  text-decoration: none;
56
124
  }
57
125
  }
@@ -59,12 +127,18 @@ body {
59
127
  .btn-ghost {
60
128
  @include btn-ghost-base();
61
129
  line-height: 1.5rem;
130
+ > i {
131
+ line-height: 1.5rem;
132
+ }
62
133
  }
63
134
 
64
135
  .btn-ghost-sm {
65
136
  @include btn-ghost-base();
66
137
  font-size: 0.875rem;
67
138
  line-height: 1.25rem;
139
+ > i {
140
+ line-height: 1.25rem;
141
+ }
68
142
  }
69
143
 
70
144
  .btn-outline {
@@ -0,0 +1,5 @@
1
+ .page-flags {
2
+ [component="flag/history"] {
3
+ max-height: 30rem;
4
+ }
5
+ }
package/scss/groups.scss CHANGED
@@ -3,8 +3,8 @@
3
3
  }
4
4
 
5
5
  .group-hover-bg {
6
- $hover-color: mix($light, $dark, 97);
7
- $border-color: mix($light, $dark, 90);
6
+ $hover-color: mix($light, $dark, 97%);
7
+ $border-color: mix($light, $dark, 90%);
8
8
  .card-body {
9
9
  border-color: $border-color!important;
10
10
  }
package/scss/harmony.scss CHANGED
@@ -9,6 +9,7 @@
9
9
  @import "status";
10
10
  @import "account";
11
11
  @import "groups";
12
+ @import "flags";
12
13
  @import "modals";
13
14
 
14
15
  @import "modules/breadcrumbs";
@@ -20,5 +21,7 @@
20
21
  @import "modules/topics-list";
21
22
  @import "modules/cover";
22
23
  @import "modules/nprogress";
24
+ @import "modules/paginator";
25
+ @import "modules/filters";
23
26
 
24
27
  @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,6 @@
1
1
  .tool-modal {
2
- bottom: $spacer * 3;
3
- right: $spacer * 4;
4
- }
2
+ @include media-breakpoint-up(md) {
3
+ bottom: $spacer * 3;
4
+ right: $spacer * 4;
5
+ }
6
+ }
@@ -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: $spacer * 0.25 !important;
12
12
  max-height: 60%;
13
13
 
14
14
  box-shadow: 0 2px 6px rgba(0,0,0,0.35);