nodebb-theme-harmony 2.0.21 → 2.0.23
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/library.js +2 -0
- package/package.json +1 -1
- package/public/harmony.js +9 -2
- package/scss/harmony.scss +1 -0
- package/scss/mobilebar.scss +63 -0
- package/scss/modules/cover.scss +1 -1
- package/scss/sidebar.scss +0 -65
- package/templates/account/theme.tpl +7 -0
- package/templates/admin/plugins/harmony.tpl +6 -0
- package/templates/footer.tpl +7 -0
- package/templates/header.tpl +6 -12
- package/templates/partials/categories/item.tpl +2 -0
- package/templates/partials/mobile-footer.tpl +3 -95
- package/templates/partials/mobile-header.tpl +14 -0
- package/templates/partials/mobile-nav.tpl +91 -0
- package/templates/partials/post_bar.tpl +1 -1
- package/templates/partials/quick-search-results.tpl +8 -7
- package/templates/partials/sidebar/search-mobile.tpl +1 -1
- package/templates/partials/topic/navigation-post.tpl +1 -1
- package/templates/partials/topic-list-bar.tpl +1 -1
package/library.js
CHANGED
|
@@ -16,6 +16,7 @@ const defaults = {
|
|
|
16
16
|
mobileTopicTeasers: 'off',
|
|
17
17
|
stickyToolbar: 'on',
|
|
18
18
|
topicSidebarTools: 'on',
|
|
19
|
+
topMobilebar: 'off',
|
|
19
20
|
autohideBottombar: 'on',
|
|
20
21
|
openSidebars: 'off',
|
|
21
22
|
chatModals: 'off',
|
|
@@ -150,6 +151,7 @@ library.loadThemeConfig = async function (uid) {
|
|
|
150
151
|
config.stickyToolbar = config.stickyToolbar === 'on';
|
|
151
152
|
config.topicSidebarTools = config.topicSidebarTools === 'on';
|
|
152
153
|
config.autohideBottombar = config.autohideBottombar === 'on';
|
|
154
|
+
config.topMobilebar = config.topMobilebar === 'on';
|
|
153
155
|
config.openSidebars = config.openSidebars === 'on';
|
|
154
156
|
config.chatModals = config.chatModals === 'on';
|
|
155
157
|
return config;
|
package/package.json
CHANGED
package/public/harmony.js
CHANGED
|
@@ -63,6 +63,7 @@ $(document).ready(function () {
|
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
const bottomBar = $('[component="bottombar"]');
|
|
66
|
+
const location = config.theme.topMobilebar ? 'top' : 'bottom';
|
|
66
67
|
const $body = $('body');
|
|
67
68
|
const $window = $(window);
|
|
68
69
|
$body.on('shown.bs.dropdown hidden.bs.dropdown', '.sticky-tools', function () {
|
|
@@ -86,12 +87,18 @@ $(document).ready(function () {
|
|
|
86
87
|
const diff = Math.abs(st - lastScrollTop);
|
|
87
88
|
const scrolledDown = st > lastScrollTop;
|
|
88
89
|
const scrolledUp = st < lastScrollTop;
|
|
90
|
+
const isHiding = !scrolledUp && scrolledDown;
|
|
89
91
|
if (diff > 10) {
|
|
90
92
|
bottomBar.css({
|
|
91
|
-
|
|
93
|
+
[location]: isHiding ?
|
|
92
94
|
-bottomBar.find('.bottombar-nav').outerHeight(true) :
|
|
93
95
|
0,
|
|
94
96
|
});
|
|
97
|
+
if (config.theme.topMobilebar && config.theme.autohideBottombar) {
|
|
98
|
+
$('.sticky-tools').css({
|
|
99
|
+
top: isHiding ? 0 : 'var(--panel-offset)',
|
|
100
|
+
});
|
|
101
|
+
}
|
|
95
102
|
}
|
|
96
103
|
}
|
|
97
104
|
lastScrollTop = st;
|
|
@@ -116,7 +123,7 @@ $(document).ready(function () {
|
|
|
116
123
|
hooks.on('action:ajaxify.end', function () {
|
|
117
124
|
$window.off('scroll', delayedScroll);
|
|
118
125
|
if (config.theme.autohideBottombar) {
|
|
119
|
-
bottomBar.css({
|
|
126
|
+
bottomBar.css({ [location]: 0 });
|
|
120
127
|
setTimeout(enableAutohide, 250);
|
|
121
128
|
}
|
|
122
129
|
});
|
package/scss/harmony.scss
CHANGED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
.navigator-mobile {
|
|
2
|
+
.pagination-block {
|
|
3
|
+
.scroller-container {
|
|
4
|
+
border-right: 3px solid;
|
|
5
|
+
margin-right: 5.5px;
|
|
6
|
+
.scroller-thumb {
|
|
7
|
+
right: -6px;
|
|
8
|
+
padding-right: 15px;
|
|
9
|
+
margin-right: -15px;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.bottombar-nav {
|
|
16
|
+
#user_dropdown .avatar {
|
|
17
|
+
margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar
|
|
18
|
+
}
|
|
19
|
+
.nav-text {
|
|
20
|
+
font-size: 1rem;
|
|
21
|
+
color: $body-color;
|
|
22
|
+
}
|
|
23
|
+
.nav-link {
|
|
24
|
+
padding: 8px;
|
|
25
|
+
border-radius: $border-radius-sm;
|
|
26
|
+
}
|
|
27
|
+
.usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu {
|
|
28
|
+
.visible-open { display: none; }
|
|
29
|
+
}
|
|
30
|
+
.badge {
|
|
31
|
+
font-size: 9px;
|
|
32
|
+
line-height: 12px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.dropdown-menu {
|
|
36
|
+
left: 0!important;
|
|
37
|
+
right: 0!important;
|
|
38
|
+
box-shadow: none!important;
|
|
39
|
+
border-left: 0;
|
|
40
|
+
border-right: 0;
|
|
41
|
+
border-radius: 0;
|
|
42
|
+
.list-container {
|
|
43
|
+
max-height: 60vh!important;
|
|
44
|
+
overflow-y: auto!important;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.navigation-dropdown, .user-dropdown {
|
|
49
|
+
> li {
|
|
50
|
+
> a, .dropdown-item {
|
|
51
|
+
padding: 10px 20px!important;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
max-height: 60vh!important;
|
|
56
|
+
overflow: auto!important;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.search-dropdown .quick-search-results {
|
|
60
|
+
max-height: 225px!important;
|
|
61
|
+
overflow-y: auto!important;
|
|
62
|
+
}
|
|
63
|
+
}
|
package/scss/modules/cover.scss
CHANGED
package/scss/sidebar.scss
CHANGED
|
@@ -121,68 +121,3 @@
|
|
|
121
121
|
}
|
|
122
122
|
/*rtl:end:ignore*/
|
|
123
123
|
|
|
124
|
-
.bottombar {
|
|
125
|
-
transition: bottom 150ms linear;
|
|
126
|
-
|
|
127
|
-
.pagination-block {
|
|
128
|
-
.scroller-container {
|
|
129
|
-
border-right: 3px solid;
|
|
130
|
-
margin-right: 5.5px;
|
|
131
|
-
.scroller-thumb {
|
|
132
|
-
right: -6px;
|
|
133
|
-
padding-right: 15px;
|
|
134
|
-
margin-right: -15px;
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
.bottombar-nav {
|
|
141
|
-
#user_dropdown .avatar {
|
|
142
|
-
margin: 2px 0; // fixes the avatar so its height is same as the icons on right sidebar
|
|
143
|
-
}
|
|
144
|
-
.nav-text {
|
|
145
|
-
font-size: 1rem;
|
|
146
|
-
color: $body-color;
|
|
147
|
-
}
|
|
148
|
-
.nav-link {
|
|
149
|
-
padding: 8px;
|
|
150
|
-
border-radius: $border-radius-sm;
|
|
151
|
-
}
|
|
152
|
-
.usermenu, .chats, .notifications, .drafts, .search, .logged-out-menu {
|
|
153
|
-
.visible-open { display: none; }
|
|
154
|
-
}
|
|
155
|
-
.badge {
|
|
156
|
-
font-size: 9px;
|
|
157
|
-
line-height: 12px;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.dropdown-menu {
|
|
161
|
-
left: 0!important;
|
|
162
|
-
right: 0!important;
|
|
163
|
-
box-shadow: none!important;
|
|
164
|
-
border-left: 0;
|
|
165
|
-
border-right: 0;
|
|
166
|
-
border-radius: 0;
|
|
167
|
-
.list-container {
|
|
168
|
-
max-height: 60vh!important;
|
|
169
|
-
overflow-y: auto!important;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
.navigation-dropdown, .user-dropdown {
|
|
174
|
-
> li {
|
|
175
|
-
> a, .dropdown-item {
|
|
176
|
-
padding: 10px 20px!important;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
max-height: 60vh!important;
|
|
181
|
-
overflow: auto!important;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
.search-dropdown .quick-search-results {
|
|
185
|
-
max-height: 225px!important;
|
|
186
|
-
overflow-y: auto!important;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
@@ -58,6 +58,13 @@
|
|
|
58
58
|
</label>
|
|
59
59
|
</div>
|
|
60
60
|
|
|
61
|
+
<div class="form-check form-switch mb-3">
|
|
62
|
+
<input class="form-check-input" type="checkbox" role="switch" id="topMobilebar" name="topMobilebar" {{{ if theme.topMobilebar }}}checked{{{ end }}}>
|
|
63
|
+
<label class="form-check-label" for="topMobilebar">
|
|
64
|
+
[[themes/harmony:settings.topMobilebar]]
|
|
65
|
+
</label>
|
|
66
|
+
</div>
|
|
67
|
+
|
|
61
68
|
<div class="form-check form-switch mb-3">
|
|
62
69
|
<input class="form-check-input" type="checkbox" role="switch" id="openSidebars" name="openSidebars" {{{ if theme.openSidebars }}}checked{{{ end }}}>
|
|
63
70
|
<label class="form-check-label" for="openSidebars">[[themes/harmony:settings.openSidebars]]</label>
|
|
@@ -48,6 +48,12 @@
|
|
|
48
48
|
</p>
|
|
49
49
|
</div>
|
|
50
50
|
</div>
|
|
51
|
+
<div class="form-check form-switch">
|
|
52
|
+
<input type="checkbox" class="form-check-input" id="topMobilebar" name="topMobilebar" />
|
|
53
|
+
<div for="topMobilebar" class="form-check-label">
|
|
54
|
+
[[themes/harmony:settings.topMobilebar]]
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
51
57
|
<div class="form-check form-switch">
|
|
52
58
|
<input type="checkbox" class="form-check-input" id="openSidebars" name="openSidebars" />
|
|
53
59
|
<label for="openSidebars" class="form-check-label">[[themes/harmony:settings.openSidebars]]</label>
|
package/templates/footer.tpl
CHANGED
|
@@ -3,7 +3,14 @@
|
|
|
3
3
|
</main>
|
|
4
4
|
<!-- IMPORT partials/sidebar-right.tpl -->
|
|
5
5
|
</div>
|
|
6
|
+
{{{ if !config.theme.topMobilebar }}}
|
|
6
7
|
<!-- IMPORT partials/mobile-footer.tpl -->
|
|
8
|
+
{{{ else }}}
|
|
9
|
+
<div class="fixed-bottom navigator-mobile">
|
|
10
|
+
<!-- IMPORT partials/topic/navigator-mobile.tpl -->
|
|
11
|
+
</div>
|
|
12
|
+
{{{ end }}}
|
|
13
|
+
|
|
7
14
|
{{{ if !isSpider }}}
|
|
8
15
|
<div>
|
|
9
16
|
<div component="toaster/tray" class="alert-window fixed-bottom mb-5 mb-md-2 me-2 me-md-5 ms-auto" style="width:300px; z-index: 1090;">
|
package/templates/header.tpl
CHANGED
|
@@ -11,8 +11,7 @@
|
|
|
11
11
|
var app = {
|
|
12
12
|
user: JSON.parse('{{userJSON}}')
|
|
13
13
|
};
|
|
14
|
-
|
|
15
|
-
document.documentElement.style.setProperty('--panel-offset', `${localStorage.getItem('panelOffset') || 0}px`);
|
|
14
|
+
document.documentElement.style.setProperty('--panel-offset', `0px`);
|
|
16
15
|
</script>
|
|
17
16
|
|
|
18
17
|
{{{if useCustomHTML}}}
|
|
@@ -25,21 +24,16 @@
|
|
|
25
24
|
|
|
26
25
|
<body class="{bodyClass} skin-{{{if bootswatchSkin}}}{bootswatchSkin}{{{else}}}noskin{{{end}}}">
|
|
27
26
|
<a class="visually-hidden-focusable position-absolute top-0 start-0 p-3 m-3 bg-body" style="z-index: 1021;" href="#content">[[global:skip-to-content]]</a>
|
|
27
|
+
|
|
28
|
+
{{{ if config.theme.topMobilebar }}}
|
|
29
|
+
<!-- IMPORT partials/mobile-header.tpl -->
|
|
30
|
+
{{{ end }}}
|
|
31
|
+
|
|
28
32
|
<div class="layout-container d-flex justify-content-between pb-4 pb-md-0">
|
|
29
33
|
<!-- IMPORT partials/sidebar-left.tpl -->
|
|
30
34
|
|
|
31
35
|
<main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3" style="min-width: 0;">
|
|
32
36
|
<!-- IMPORT partials/header/brand.tpl -->
|
|
33
|
-
<script>
|
|
34
|
-
const headerEl = document.getElementById('header-menu');
|
|
35
|
-
if (headerEl) {
|
|
36
|
-
const rect = headerEl.getBoundingClientRect();
|
|
37
|
-
const offset = Math.max(0, rect.bottom);
|
|
38
|
-
document.documentElement.style.setProperty('--panel-offset', offset + `px`);
|
|
39
|
-
} else {
|
|
40
|
-
document.documentElement.style.setProperty('--panel-offset', `0px`);
|
|
41
|
-
}
|
|
42
|
-
</script>
|
|
43
37
|
<div class="container-lg px-md-4 d-flex flex-column gap-3 h-100 mb-5 mb-lg-0" id="content">
|
|
44
38
|
<!-- IMPORT partials/noscript/warning.tpl -->
|
|
45
39
|
<!-- IMPORT partials/noscript/message.tpl -->
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
{./descriptionParsed}
|
|
15
15
|
</div>
|
|
16
16
|
{{{ end }}}
|
|
17
|
+
{{{ if !./link }}}
|
|
17
18
|
<div class="d-flex gap-1 d-block d-lg-none w-100">
|
|
18
19
|
<span class="badge text-body border stats text-xs text-muted">
|
|
19
20
|
<i class="fa fa-fw fa-list"></i>
|
|
@@ -27,6 +28,7 @@
|
|
|
27
28
|
<a href="{config.relative_path}{./teaser.url}" class="border badge bg-transparent text-muted fw-normal timeago {{{ if (!./teaser.timestampISO || config.theme.mobileTopicTeasers) }}}hidden{{{ end }}}" title="{./teaser.timestampISO}"></a>
|
|
28
29
|
{{{ end }}}
|
|
29
30
|
</div>
|
|
31
|
+
{{{ end }}}
|
|
30
32
|
{{{ if !config.hideSubCategories }}}
|
|
31
33
|
{{{ if ./children.length }}}
|
|
32
34
|
<ul class="list-unstyled category-children row row-cols-1 row-cols-md-2 g-2 my-1 w-100">
|
|
@@ -1,96 +1,4 @@
|
|
|
1
|
-
<div component="bottombar" class="bottombar d-flex flex-column d-lg-none
|
|
2
|
-
|
|
1
|
+
<div component="bottombar" class="bottombar d-flex flex-column d-lg-none ff-secondary gap-1 align-items-center fixed-bottom" style="transition: bottom 150ms linear;">
|
|
3
2
|
<!-- IMPORT partials/topic/navigator-mobile.tpl -->
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
<div class="bottombar-nav-left d-flex gap-3 align-items-center">
|
|
7
|
-
<div>
|
|
8
|
-
<a href="#" role="button" class="nav-link d-flex justify-content-between align-items-center position-relative" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
9
|
-
<span class="position-relative">
|
|
10
|
-
<i class="fa fa-fw fa-lg fa-bars"></i>
|
|
11
|
-
<span component="unread/count" data-unread-url="{unreadCount.unreadUrl}" class="position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !unreadCount.mobileUnread }}}hidden{{{ end }}}">{unreadCount.mobileUnread}</span>
|
|
12
|
-
</span>
|
|
13
|
-
</a>
|
|
14
|
-
<ul class="navigation-dropdown dropdown-menu" role="menu">
|
|
15
|
-
{{{ each navigation }}}
|
|
16
|
-
{{{ if displayMenuItem(@root, @index) }}}
|
|
17
|
-
<li class="nav-item {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
|
|
18
|
-
<a class="nav-link navigation-link px-3 py-2 {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="collapse" data-bs-target="#collapse-target-{@index}" onclick="event.stopPropagation();" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}}>
|
|
19
|
-
<span class="d-inline-flex justify-content-between align-items-center w-100">
|
|
20
|
-
<span class="text-nowrap">
|
|
21
|
-
{{{ if ./iconClass }}}
|
|
22
|
-
<i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
|
|
23
|
-
{{{ end }}}
|
|
24
|
-
{{{ if ./text }}}<span class="nav-text px-2 fw-semibold">{./text}</span>{{{ end }}}
|
|
25
|
-
</span>
|
|
26
|
-
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
27
|
-
</span>
|
|
28
|
-
</a>
|
|
29
|
-
{{{ if ./dropdown }}}
|
|
30
|
-
<div class="ps-3">
|
|
31
|
-
<ul id="collapse-target-{@index}" class="collapse list-unstyled ps-3">
|
|
32
|
-
{./dropdownContent}
|
|
33
|
-
</ul>
|
|
34
|
-
</div>
|
|
35
|
-
{{{ end }}}
|
|
36
|
-
</li>
|
|
37
|
-
{{{ end }}}
|
|
38
|
-
{{{ end }}}
|
|
39
|
-
</ul>
|
|
40
|
-
</div>
|
|
41
|
-
</div>
|
|
42
|
-
<div class="bottombar-nav-right d-flex gap-3 align-items-center">
|
|
43
|
-
<div>
|
|
44
|
-
{{{ if config.loggedIn }}}
|
|
45
|
-
<ul id="logged-in-menu" class="list-unstyled d-flex align-items-center w-100 gap-3 mb-0">
|
|
46
|
-
{{{ if config.searchEnabled }}}
|
|
47
|
-
<li component="sidebar/search" class="nav-item m-0 search">
|
|
48
|
-
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
49
|
-
</li>
|
|
50
|
-
{{{ end }}}
|
|
51
|
-
|
|
52
|
-
<li component="notifications" class="nav-item m-0 notifications">
|
|
53
|
-
<!-- IMPORT partials/sidebar/notifications.tpl -->
|
|
54
|
-
</li>
|
|
55
|
-
|
|
56
|
-
{{{ if canChat }}}
|
|
57
|
-
<li class="nav-item m-0 chats">
|
|
58
|
-
<!-- IMPORT partials/sidebar/chats.tpl -->
|
|
59
|
-
</li>
|
|
60
|
-
{{{ end }}}
|
|
61
|
-
|
|
62
|
-
<li component="sidebar/drafts" class="hidden nav-item m-0 drafts">
|
|
63
|
-
<!-- IMPORT partials/sidebar/drafts.tpl -->
|
|
64
|
-
</li>
|
|
65
|
-
|
|
66
|
-
<li id="user_label" class="nav-item m-0 usermenu">
|
|
67
|
-
<!-- IMPORT partials/sidebar/user-menu.tpl -->
|
|
68
|
-
</li>
|
|
69
|
-
</ul>
|
|
70
|
-
{{{ else }}}
|
|
71
|
-
<ul id="logged-out-menu" class="list-unstyled d-flex w-100 gap-3 mb-0 logged-out-menu">
|
|
72
|
-
{{{ if (config.searchEnabled && user.privileges.search:content) }}}
|
|
73
|
-
<li component="sidebar/search" class="nav-item mx-2 search">
|
|
74
|
-
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
75
|
-
</li>
|
|
76
|
-
{{{ end }}}
|
|
77
|
-
|
|
78
|
-
{{{ if allowRegistration }}}
|
|
79
|
-
<li class="nav-item mx-2" title="[[global:register]]">
|
|
80
|
-
<a class="nav-link" href="{relative_path}/register">
|
|
81
|
-
<i class="fa fa-fw fa-user-plus"></i>
|
|
82
|
-
</a>
|
|
83
|
-
</li>
|
|
84
|
-
{{{ end }}}
|
|
85
|
-
|
|
86
|
-
<li class="nav-item mx-2" title="[[global:login]]">
|
|
87
|
-
<a class="nav-link" href="{relative_path}/login">
|
|
88
|
-
<i class="fa fa-fw fa-sign-in"></i>
|
|
89
|
-
</a>
|
|
90
|
-
</li>
|
|
91
|
-
</ul>
|
|
92
|
-
{{{ end }}}
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
</div>
|
|
3
|
+
<!-- IMPORT partials/mobile-nav.tpl -->
|
|
4
|
+
</div>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<div component="bottombar" class="bottombar d-flex flex-column d-lg-none ff-secondary gap-1 align-items-center sticky-top" style="transition: top 150ms linear;">
|
|
2
|
+
<!-- IMPORT partials/mobile-nav.tpl -->
|
|
3
|
+
</div>
|
|
4
|
+
|
|
5
|
+
<script>
|
|
6
|
+
const headerEl = document.querySelector('[component="bottombar"]');
|
|
7
|
+
if (headerEl && headerEl.classList.contains('sticky-top')) {
|
|
8
|
+
const rect = headerEl.getBoundingClientRect();
|
|
9
|
+
const offset = Math.max(0, rect.bottom);
|
|
10
|
+
document.documentElement.style.setProperty('--panel-offset', offset + `px`);
|
|
11
|
+
} else {
|
|
12
|
+
document.documentElement.style.setProperty('--panel-offset', `0px`);
|
|
13
|
+
}
|
|
14
|
+
</script>
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
<div class="bottombar-nav p-2 text-dark bg-light d-flex justify-content-between align-items-center w-100">
|
|
2
|
+
<div class="bottombar-nav-left d-flex gap-3 align-items-center">
|
|
3
|
+
<div>
|
|
4
|
+
<a href="#" role="button" class="nav-link d-flex justify-content-between align-items-center position-relative" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
5
|
+
<span class="position-relative">
|
|
6
|
+
<i class="fa fa-fw fa-lg fa-bars"></i>
|
|
7
|
+
<span component="unread/count" data-unread-url="{unreadCount.unreadUrl}" class="position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !unreadCount.mobileUnread }}}hidden{{{ end }}}">{unreadCount.mobileUnread}</span>
|
|
8
|
+
</span>
|
|
9
|
+
</a>
|
|
10
|
+
<ul class="navigation-dropdown dropdown-menu" role="menu">
|
|
11
|
+
{{{ each navigation }}}
|
|
12
|
+
{{{ if displayMenuItem(@root, @index) }}}
|
|
13
|
+
<li class="nav-item {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
|
|
14
|
+
<a class="nav-link navigation-link px-3 py-2 {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="collapse" data-bs-target="#collapse-target-{@index}" onclick="event.stopPropagation();" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}}>
|
|
15
|
+
<span class="d-inline-flex justify-content-between align-items-center w-100">
|
|
16
|
+
<span class="text-nowrap">
|
|
17
|
+
{{{ if ./iconClass }}}
|
|
18
|
+
<i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
|
|
19
|
+
{{{ end }}}
|
|
20
|
+
{{{ if ./text }}}<span class="nav-text px-2 fw-semibold">{./text}</span>{{{ end }}}
|
|
21
|
+
</span>
|
|
22
|
+
<span component="navigation/count" class="badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
|
|
23
|
+
</span>
|
|
24
|
+
</a>
|
|
25
|
+
{{{ if ./dropdown }}}
|
|
26
|
+
<div class="ps-3">
|
|
27
|
+
<ul id="collapse-target-{@index}" class="collapse list-unstyled ps-3">
|
|
28
|
+
{./dropdownContent}
|
|
29
|
+
</ul>
|
|
30
|
+
</div>
|
|
31
|
+
{{{ end }}}
|
|
32
|
+
</li>
|
|
33
|
+
{{{ end }}}
|
|
34
|
+
{{{ end }}}
|
|
35
|
+
</ul>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
<div class="bottombar-nav-right d-flex gap-3 align-items-center">
|
|
39
|
+
<div>
|
|
40
|
+
{{{ if config.loggedIn }}}
|
|
41
|
+
<ul id="logged-in-menu" class="list-unstyled d-flex align-items-center w-100 gap-3 mb-0">
|
|
42
|
+
{{{ if config.searchEnabled }}}
|
|
43
|
+
<li component="sidebar/search" class="nav-item m-0 search">
|
|
44
|
+
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
45
|
+
</li>
|
|
46
|
+
{{{ end }}}
|
|
47
|
+
|
|
48
|
+
<li component="notifications" class="nav-item m-0 notifications">
|
|
49
|
+
<!-- IMPORT partials/sidebar/notifications.tpl -->
|
|
50
|
+
</li>
|
|
51
|
+
|
|
52
|
+
{{{ if canChat }}}
|
|
53
|
+
<li class="nav-item m-0 chats">
|
|
54
|
+
<!-- IMPORT partials/sidebar/chats.tpl -->
|
|
55
|
+
</li>
|
|
56
|
+
{{{ end }}}
|
|
57
|
+
|
|
58
|
+
<li component="sidebar/drafts" class="hidden nav-item m-0 drafts">
|
|
59
|
+
<!-- IMPORT partials/sidebar/drafts.tpl -->
|
|
60
|
+
</li>
|
|
61
|
+
|
|
62
|
+
<li id="user_label" class="nav-item m-0 usermenu">
|
|
63
|
+
<!-- IMPORT partials/sidebar/user-menu.tpl -->
|
|
64
|
+
</li>
|
|
65
|
+
</ul>
|
|
66
|
+
{{{ else }}}
|
|
67
|
+
<ul id="logged-out-menu" class="list-unstyled d-flex w-100 gap-3 mb-0 logged-out-menu">
|
|
68
|
+
{{{ if (config.searchEnabled && user.privileges.search:content) }}}
|
|
69
|
+
<li component="sidebar/search" class="nav-item mx-2 search">
|
|
70
|
+
<!-- IMPORT partials/sidebar/search-mobile.tpl -->
|
|
71
|
+
</li>
|
|
72
|
+
{{{ end }}}
|
|
73
|
+
|
|
74
|
+
{{{ if allowRegistration }}}
|
|
75
|
+
<li class="nav-item mx-2" title="[[global:register]]">
|
|
76
|
+
<a class="nav-link" href="{relative_path}/register">
|
|
77
|
+
<i class="fa fa-fw fa-user-plus"></i>
|
|
78
|
+
</a>
|
|
79
|
+
</li>
|
|
80
|
+
{{{ end }}}
|
|
81
|
+
|
|
82
|
+
<li class="nav-item mx-2" title="[[global:login]]">
|
|
83
|
+
<a class="nav-link" href="{relative_path}/login">
|
|
84
|
+
<i class="fa fa-fw fa-sign-in"></i>
|
|
85
|
+
</a>
|
|
86
|
+
</li>
|
|
87
|
+
</ul>
|
|
88
|
+
{{{ end }}}
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}} {{{ if config.theme.topicSidebarTools }}}d-block d-lg-none{{{ end }}}">
|
|
1
|
+
<div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}} {{{ if config.theme.topicSidebarTools }}}d-block d-lg-none{{{ end }}}" style="top: {{{ if (config.theme.topMobilebar && !config.theme.autohideBottombar) }}}var(--panel-offset){{{ else }}}0{{{ end }}};">
|
|
2
2
|
<nav class="d-flex flex-nowrap my-2 p-0 border-0 rounded topic-main-buttons">
|
|
3
3
|
<div class="d-flex flex-row p-2 text-bg-light border rounded w-100 align-items-center">
|
|
4
4
|
<div class="d-flex me-auto mb-0 gap-2 align-items-center flex-wrap">
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
{{{ if multiplePages }}}
|
|
1
|
+
{{{ if (multiplePages && !config.theme.topMobilebar) }}}
|
|
2
2
|
<div class="show-more-container">
|
|
3
3
|
<div class="text-center d-block d-md-none">
|
|
4
|
-
<a href="{url}" class="btn btn-sm btn-primary">
|
|
5
|
-
[[search:see-more-results, {matchCount}]]
|
|
6
|
-
</a>
|
|
4
|
+
<a href="{url}" class="btn btn-sm btn-primary">[[search:see-more-results, {matchCount}]]</a>
|
|
7
5
|
</div>
|
|
8
6
|
<li role="separator" class="dropdown-divider d-block d-md-none"></li>
|
|
9
7
|
</div>
|
|
@@ -35,9 +33,12 @@
|
|
|
35
33
|
|
|
36
34
|
{{{ if multiplePages }}}
|
|
37
35
|
<div class="text-center mt-2 d-none d-md-block">
|
|
38
|
-
<a href="{url}" class="btn btn-sm btn-primary">
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
<a href="{url}" class="btn btn-sm btn-primary">[[search:see-more-results, {matchCount}]]</a>
|
|
37
|
+
</div>
|
|
38
|
+
{{{ end }}}
|
|
39
|
+
{{{ if (multiplePages && config.theme.topMobilebar) }}}
|
|
40
|
+
<div class="text-center mt-2 d-block d-md-none">
|
|
41
|
+
<a href="{url}" class="btn btn-sm btn-primary">[[search:see-more-results, {matchCount}]]</a>
|
|
41
42
|
</div>
|
|
42
43
|
{{{ end }}}
|
|
43
44
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
</a>
|
|
5
5
|
<div class="search-dropdown dropdown-menu p-2 shadow" role="menu">
|
|
6
6
|
<form component="search/form" id="search-form" class="d-flex justify-content-end align-items-center" role="search" method="GET">
|
|
7
|
-
<div component="search/fields" class="w-100" id="search-fields">
|
|
7
|
+
<div component="search/fields" class="d-flex flex-column w-100 {{{ if config.theme.topMobilebar }}}flex-column-reverse gap-2{{{ end }}}" id="search-fields">
|
|
8
8
|
<div id="quick-search-container" class="quick-search-container d-block hidden">
|
|
9
9
|
<div class="form-check filter-category mb-2 ms-2">
|
|
10
10
|
<input class="form-check-input" type="checkbox" checked>
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
{buildAvatar(post.user, "24px", true)} {post.user.username}
|
|
5
5
|
</a>
|
|
6
6
|
</div>
|
|
7
|
-
<span class="timeago text-nowrap text-sm" title="{post.timestampISO}"></span>
|
|
7
|
+
<span class="timeago text-nowrap text-sm text-muted" title="{post.timestampISO}"></span>
|
|
8
8
|
</div>
|
|
9
9
|
|
|
10
10
|
<div>{post.content}</div>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}} mb-3">
|
|
1
|
+
<div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}} mb-3" style="top: {{{ if (config.theme.topMobilebar && !config.theme.autohideBottombar) }}}var(--panel-offset){{{ else }}}0{{{ end }}};">
|
|
2
2
|
<nav class="topic-list-header d-flex flex-nowrap my-2 p-0 border-0 rounded">
|
|
3
3
|
<div class="d-flex flex-row p-2 text-bg-light gap-1 border rounded w-100">
|
|
4
4
|
<div component="category/controls" class="d-flex me-auto mb-0 gap-2 flex-wrap">
|