nodebb-theme-harmony 0.0.9 → 0.0.11

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 (72) hide show
  1. package/languages/en-GB/harmony.json +5 -1
  2. package/lib/controllers.js +15 -0
  3. package/library.js +63 -6
  4. package/package.json +1 -1
  5. package/plugin.json +5 -1
  6. package/public/settings.js +28 -0
  7. package/scss/account.scss +0 -3
  8. package/scss/common.scss +6 -0
  9. package/scss/modules/bottom-sheet.scss +1 -1
  10. package/scss/modules/topic-navigator.scss +0 -6
  11. package/scss/sidebar.scss +18 -16
  12. package/templates/account/blocks.tpl +2 -2
  13. package/templates/account/categories.tpl +27 -21
  14. package/templates/account/consent.tpl +10 -64
  15. package/templates/account/edit/password.tpl +29 -24
  16. package/templates/account/edit/username.tpl +25 -20
  17. package/templates/account/edit.tpl +110 -115
  18. package/templates/account/followers.tpl +2 -3
  19. package/templates/account/following.tpl +2 -3
  20. package/templates/account/groups.tpl +2 -3
  21. package/templates/account/info.tpl +206 -204
  22. package/templates/account/posts.tpl +4 -4
  23. package/templates/account/profile.tpl +9 -9
  24. package/templates/account/sessions.tpl +3 -6
  25. package/templates/account/settings.tpl +193 -206
  26. package/templates/account/theme.tpl +25 -21
  27. package/templates/account/topics.tpl +17 -16
  28. package/templates/account/uploads.tpl +4 -8
  29. package/templates/admin/plugins/harmony.tpl +4 -0
  30. package/templates/groups/details.tpl +3 -20
  31. package/templates/groups/list.tpl +10 -9
  32. package/templates/header.tpl +3 -21
  33. package/templates/login.tpl +1 -1
  34. package/templates/notifications.tpl +4 -4
  35. package/templates/partials/account/header.tpl +58 -47
  36. package/templates/partials/account/sidebar-left.tpl +19 -12
  37. package/templates/partials/buttons/newTopic.tpl +1 -3
  38. package/templates/partials/categories/item.tpl +1 -8
  39. package/templates/partials/category/sort.tpl +3 -3
  40. package/templates/partials/category/subcategory.tpl +1 -1
  41. package/templates/partials/category/tools.tpl +3 -3
  42. package/templates/partials/category/watch.tpl +7 -7
  43. package/templates/partials/category-filter-content.tpl +4 -4
  44. package/templates/partials/category-selector-content.tpl +10 -9
  45. package/templates/partials/chats/message-window.tpl +9 -7
  46. package/templates/partials/groups/admin.tpl +3 -5
  47. package/templates/partials/groups/sidebar-left.tpl +1 -1
  48. package/templates/partials/header/brand.tpl +19 -0
  49. package/templates/partials/notifications_list.tpl +5 -5
  50. package/templates/partials/post_bar.tpl +5 -5
  51. package/templates/partials/sidebar/logged-in-menu.tpl +23 -0
  52. package/templates/partials/sidebar/user-menu.tpl +1 -1
  53. package/templates/partials/sidebar-left.tpl +1 -1
  54. package/templates/partials/sidebar-right.tpl +1 -23
  55. package/templates/partials/tags_list.tpl +3 -2
  56. package/templates/partials/topic/navigator.tpl +2 -2
  57. package/templates/partials/topic/post-menu.tpl +2 -4
  58. package/templates/partials/topic/post.tpl +13 -13
  59. package/templates/partials/topic/reply-button.tpl +3 -3
  60. package/templates/partials/topic/sort.tpl +3 -3
  61. package/templates/partials/topic/tools.tpl +3 -3
  62. package/templates/partials/topic/watch.tpl +17 -16
  63. package/templates/partials/topic-filters.tpl +3 -3
  64. package/templates/partials/topic-list-bar.tpl +8 -12
  65. package/templates/partials/topic-terms.tpl +3 -3
  66. package/templates/partials/topics_list.tpl +4 -4
  67. package/templates/partials/users/item.tpl +27 -25
  68. package/templates/partials/users_list_menu.tpl +1 -1
  69. package/templates/search.tpl +0 -2
  70. package/templates/tags.tpl +12 -8
  71. package/templates/topic.tpl +1 -3
  72. package/templates/users.tpl +4 -5
@@ -1,4 +1,3 @@
1
- <!-- IMPORT partials/breadcrumbs.tpl -->
2
1
  <div data-widget-area="header">
3
2
  {{{each widgets.header}}}
4
3
  {{widgets.header.html}}
@@ -6,20 +5,22 @@
6
5
  </div>
7
6
  <div class="groups list">
8
7
  <h2 class="fw-semibold">[[pages:groups]]</h2>
9
- <div class="row justify-content-between">
10
- <div class="col-lg-6">
11
- <div class="text-sm d-flex align-items-center gap-2">
8
+ <div class="d-flex flex-wrap justify-content-between">
9
+ <div class="mb-2 mb-md-0">
10
+ <div class="text-sm d-flex flex-wrap align-items-center gap-2">
12
11
  [[topic:sort_by]]
13
- <a href="?sort=alpha" class="btn-ghost fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group_name]]</a>
14
- <a href="?sort=count" class="btn-ghost fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member_count]]</a>
15
- <a href="?sort=date" class="btn-ghost fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation_date]]</a>
12
+ <div class="d-flex gap-2">
13
+ <a href="?sort=alpha" class="btn-ghost fw-semibold {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group_name]]</a>
14
+ <a href="?sort=count" class="btn-ghost fw-semibold {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member_count]]</a>
15
+ <a href="?sort=date" class="btn-ghost fw-semibold {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation_date]]</a>
16
+ </div>
16
17
  </div>
17
18
  </div>
18
- <div class="col-lg-6">
19
+ <div class="">
19
20
  <div class="d-flex justify-content-end gap-2">
20
21
  <div class="">
21
22
  {{{ if allowGroupCreation }}}
22
- <button class="btn btn-primary btn-sm" data-action="new"><i class="fa fa-plus"></i> [[groups:new_group]]</button>
23
+ <button class="btn btn-primary btn-sm text-nowrap" data-action="new"><i class="fa fa-users"></i> [[groups:new_group]]</button>
23
24
  {{{ end }}}
24
25
  <select class="form-select hidden" id="search-sort">
25
26
  <option value="alpha">[[groups:details.group_name]]</option>
@@ -27,26 +27,8 @@
27
27
  <div class="d-flex justify-content-between pb-4 pb-md-0">
28
28
  <!-- IMPORT partials/sidebar-left.tpl -->
29
29
 
30
- <main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3">
31
- {{{ if (brand:logo || config.showSiteTitle)}}}
32
- <div class="container brand-container">
33
- <div class="col-12 d-flex border-bottom pb-3 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
34
- <div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
35
- {{{ if brand:logo }}}
36
- <a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}">
37
- <img component="brand/logo" alt="{brand:logo:alt}" class="{brand:logo:display}" src="{brand:logo}?{config.cache-buster}" />
38
- </a>
39
- {{{ end }}}
40
-
41
- {{{ if config.showSiteTitle }}}
42
- <a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
43
- <h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
44
- </a>
45
- {{{ end }}}
46
- </div>
47
- </div>
48
- </div>
49
- {{{ end }}}
30
+ <main id="panel" class="d-flex flex-column gap-3 flex-grow-1 mt-3" style="min-width: 0;">
31
+ <!-- IMPORT partials/header/brand.tpl -->
50
32
  <script>
51
33
  const headerEl = document.getElementById('header-menu');
52
34
  if (headerEl) {
@@ -57,6 +39,6 @@
57
39
  document.documentElement.style.setProperty('--panel-offset', `0px`);
58
40
  }
59
41
  </script>
60
- <div class="container d-flex flex-column gap-2" id="content">
42
+ <div class="container d-flex flex-column gap-3" id="content">
61
43
  <!-- IMPORT partials/noscript/warning.tpl -->
62
44
  <!-- IMPORT partials/noscript/message.tpl -->
@@ -27,7 +27,7 @@
27
27
  <div class="d-flex justify-content-between align-items-center">
28
28
  <label for="password">[[user:password]]</label>
29
29
  {{{ if allowPasswordReset }}}
30
- <a id="reset-link" class="text-sm text-reset text-decoration-underline" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
30
+ <a id="reset-link" tabindex="-1" class="text-sm text-reset text-decoration-underline" href="{config.relative_path}/reset">[[login:forgot_password]]</a>
31
31
  {{{ end }}}
32
32
  </div>
33
33
  <div>
@@ -5,8 +5,8 @@
5
5
 
6
6
  <hr class="text-muted opacity-25"/>
7
7
 
8
- <div class="row">
9
- <div class="col-12 col-md-3 col-lg-2 border-end-md text-sm mb-3">
8
+ <div class="d-flex flex-column flex-md-row">
9
+ <div class="flex-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
10
10
  <div class="nav sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
11
11
  {{{ each filters }}}
12
12
  {{{ if ./separator }}}
@@ -20,8 +20,8 @@
20
20
  {{{ end }}}
21
21
  </div>
22
22
  </div>
23
- <div class="col-12 col-md-9 col-lg-10">
24
- <ul class="notifications-list list-unstyled" data-nextstart="{nextStart}">
23
+ <div class="flex-1 ps-md-2 ps-lg-5">
24
+ <ul component="notifications/list" class="notifications-list list-unstyled" data-nextstart="{nextStart}">
25
25
  <!-- IMPORT partials/notifications_list.tpl -->
26
26
  </ul>
27
27
  <!-- IMPORT partials/paginator.tpl -->
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  </div>
22
22
 
23
- <div class="d-flex gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
23
+ <div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
24
24
  <div class="avatar-wrapper border-4 position-relative align-self-start d-none d-md-block" style="margin-top: -75px;">
25
25
  {{{ if picture }}}
26
26
  <img src="{picture}" class="avatar avatar-rounded" style="--avatar-size: 142px;" />
@@ -28,62 +28,73 @@
28
28
  <div class="avatar avatar-rounded" style="background-color: {icon:bgColor}; --avatar-size: 142px;" title="{username}">{icon:text}</div>
29
29
  {{{ end }}}
30
30
  </div>
31
- <div class="d-flex flex-1 flex-column gap-2">
32
- <div class="d-grid gap-1">
33
- <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
34
- <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
35
- <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
36
- <div class="d-flex align-items-center gap-1 p-1">
37
- {{{ if selectedGroup.length }}}
38
- {{{ each selectedGroup }}}
39
- {{{ if ./slug }}}
40
- <!-- IMPORT partials/groups/badge.tpl -->
41
- {{{ end }}}
42
- {{{ end }}}
31
+
32
+ <div class="avatar-wrapper border-4 position-relative align-self-center d-block d-md-none" style="margin-top: -75px;">
33
+ {{{ if picture }}}
34
+ <img src="{picture}" class="avatar avatar-rounded" style="--avatar-size: 142px;" />
35
+ {{{ else }}}
36
+ <div class="avatar avatar-rounded" style="background-color: {icon:bgColor}; --avatar-size: 142px;" title="{username}">{icon:text}</div>
37
+ {{{ end }}}
38
+ </div>
39
+
40
+ <div class="d-flex flex-column flex-md-row mt-1 justify-content-between w-100 gap-2">
41
+ <div class="d-flex flex-1 flex-row gap-2">
42
+ <div class="d-flex flex-column">
43
+ <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
44
+ <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
45
+ <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
46
+ <div class="d-flex align-items-center gap-1 p-1">
47
+ {{{ if selectedGroup.length }}}
48
+ {{{ each selectedGroup }}}
49
+ {{{ if ./slug }}}
50
+ <!-- IMPORT partials/groups/badge.tpl -->
51
+ {{{ end }}}
52
+ {{{ end }}}
53
+ {{{ end }}}
54
+ </div>
55
+ </div>
56
+
57
+ {{{ if isAdminOrGlobalModeratorOrModerator }}}
58
+ {{{ if banned }}}
59
+ <div class="text-xm text-muted">
60
+ {{{ if banned_until }}}
61
+ [[user:info.banned-until, {banned_until_readable}]]
62
+ {{{ else }}}
63
+ [[user:info.banned-permanently]]
43
64
  {{{ end }}}
44
65
  </div>
66
+ {{{ end }}}
67
+ {{{ end }}}
45
68
  </div>
69
+ </div>
70
+
71
+ <div class="d-flex gap-1 align-self-stretch align-self-md-start justify-content-end">
72
+ {{{ if loggedIn }}}
73
+ {{{ if !isSelf }}}
74
+ <a component="account/unfollow" href="#" class="btn btn-info flex-fill{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
75
+ <a component="account/follow" href="#" class="btn btn-primary flex-fill{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
76
+ {{{ end }}}
77
+ {{{ end }}}
46
78
 
47
- {{{ if isAdminOrGlobalModeratorOrModerator }}}
48
- {{{ if banned }}}
49
- <div class="text-xm text-muted">
50
- {{{ if banned_until }}}
51
- [[user:info.banned-until, {banned_until_readable}]]
52
- {{{ else }}}
53
- [[user:info.banned-permanently]]
79
+ {{{ if (loggedIn && (!isSelf && (!banned && !config.disableChat))) }}}
80
+ <div class="btn-group flex-fill">
81
+ <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
82
+ {{{ if hasPrivateChat}}}
83
+ <button type="button" class="btn btn-light dropdown-toggle flex-0" data-bs-toggle="dropdown">
84
+ <i class="fa fa-caret-down"></i>
85
+ </button>
86
+ <ul class="dropdown-menu dropdown-menu-end" role="menu">
87
+ <li><a class="dropdown-item" href="#" component="account/new-chat">[[user:new_chat_with, {username}]]</a></li>
88
+ </ul>
54
89
  {{{ end }}}
55
90
  </div>
56
91
  {{{ end }}}
92
+ {{{ if !isSelf }}}
93
+ {{{ if (isAdmin || (canBan || canMute ))}}}
94
+ <!-- IMPORT partials/account/admin-menu.tpl -->
57
95
  {{{ end }}}
58
- </div>
59
- </div>
60
-
61
- <div class="d-flex gap-1 align-self-start">
62
- {{{ if loggedIn }}}
63
- {{{ if !isSelf }}}
64
- <a component="account/unfollow" href="#" class="btn btn-info{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
65
- <a component="account/follow" href="#" class="btn btn-primary{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
66
- {{{ end }}}
67
- {{{ end }}}
68
-
69
- {{{ if (loggedIn && (!isSelf && (!banned && !config.disableChat))) }}}
70
- <div class="btn-group">
71
- <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
72
- {{{ if hasPrivateChat}}}
73
- <button type="button" class="btn btn-light dropdown-toggle" data-bs-toggle="dropdown">
74
- <i class="fa fa-caret-down"></i>
75
- </button>
76
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
77
- <li><a class="dropdown-item" href="#" component="account/new-chat">[[user:new_chat_with, {username}]]</a></li>
78
- </ul>
79
96
  {{{ end }}}
80
97
  </div>
81
- {{{ end }}}
82
- {{{ if !isSelf }}}
83
- {{{ if (isAdmin || (canBan || canMute ))}}}
84
- <!-- IMPORT partials/account/admin-menu.tpl -->
85
- {{{ end }}}
86
- {{{ end }}}
87
98
  </div>
88
99
  </div>
89
100
 
@@ -1,5 +1,5 @@
1
- <div class="col-12 col-md-3 col-lg-2 border-end-md text-sm mb-3">
2
- <div class="sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
1
+ <div class="flex-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
3
  <a href="{config.relative_path}/user/{userslug}" class="btn-ghost fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
4
4
  <div class="flex-1">[[global:about]]</div>
5
5
  </a>
@@ -20,34 +20,39 @@
20
20
  <div class="flex-1">[[global:topics]]</div>
21
21
  <span class="text-xs human-readable-number" title="{counts.topics}">{counts.topics}</span>
22
22
  </a>
23
- <a href="{config.relative_path}/user/{userslug}/groups" class="btn-ghost fw-semibold">
23
+ <a href="{config.relative_path}/user/{userslug}/groups" class="btn-ghost fw-semibold
24
+ {{{ if template.account/groups }}}active{{{ end }}}">
24
25
  <div class="flex-1">[[global:header.groups]]</div>
25
26
  <span class="text-xs human-readable-number" title="{counts.groups}">{counts.groups}</span>
26
27
  </a>
27
28
 
28
- <a href="{config.relative_path}/user/{userslug}/followers" class="btn-ghost fw-semibold">
29
+ <a href="{config.relative_path}/user/{userslug}/followers" class="btn-ghost fw-semibold
30
+ {{{ if template.account/followers }}}active{{{ end }}}">
29
31
  <div class="flex-1">[[user:followers]]</div>
30
32
  <span class="text-xs human-readable-number" title="{counts.followers}">{counts.followers}</span>
31
33
  </a>
32
34
 
33
- <a href="{config.relative_path}/user/{userslug}/following" class="btn-ghost fw-semibold">
35
+ <a href="{config.relative_path}/user/{userslug}/following" class="btn-ghost fw-semibold
36
+ {{{ if template.account/following }}}active{{{ end }}}">
34
37
  <div class="flex-1">[[user:following]]</div>
35
38
  <span class="text-xs human-readable-number" title="{counts.following}">{counts.following}</span>
36
39
  </a>
37
40
 
38
41
  {{{ if canEdit }}}
39
- <a href="{config.relative_path}/user/{userslug}/blocks" class="btn-ghost fw-semibold">
42
+ <a href="{config.relative_path}/user/{userslug}/blocks" class="btn-ghost fw-semibold
43
+ {{{ if template.account/blocks }}}active{{{ end }}}">
40
44
  <div class="flex-1">[[user:blocked-users]]</div>
41
45
  <span class="text-xs human-readable-number" title="{counts.blocks}">{counts.blocks}</span>
42
46
  </a>
43
47
 
44
- <a href="{config.relative_path}/user/{userslug}/uploads" class="btn-ghost fw-semibold">
48
+ <a href="{config.relative_path}/user/{userslug}/uploads" class="btn-ghost fw-semibold
49
+ {{{ if template.account/uploads }}}active{{{ end }}}">
45
50
  <div class="flex-1">[[global:uploads]]</div>
46
51
  <span class="text-xs human-readable-number" title="{counts.uploaded}">{counts.uploaded}</span>
47
52
  </a>
48
53
  {{{ end }}}
49
54
 
50
- <hr/>
55
+ <hr class="w-100 my-2"/>
51
56
  {{{ if (loggedIn && (!isSelf && !banned)) }}}
52
57
  <a href="#" component="account/flag" class="btn-ghost-sm">
53
58
  <i class="fa-solid fa-flag text-danger"></i>
@@ -61,20 +66,22 @@
61
66
  <i class="fa-solid fa-ban text-danger"></i>
62
67
  <div class="flex-1 text-nowrap">[[user:unblock_user]]</div>
63
68
  </a>
64
- <hr/>
69
+ <hr class="w-100 my-2"/>
65
70
  {{{ end }}}
66
71
 
67
72
  {{{ if canEdit }}}
68
- <a href="{config.relative_path}/user/{userslug}/edit" class="btn-ghost-sm text-xs">
73
+ <a href="{config.relative_path}/user/{userslug}/edit" class="btn-ghost-sm text-xs
74
+ {{{ if template.account/edit }}}active{{{ end }}}">
69
75
  <div class="flex-1">[[user:edit-profile]]</div>
70
76
  </a>
71
- <a href="{config.relative_path}/user/{userslug}/settings" class="btn-ghost-sm text-xs">
77
+ <a href="{config.relative_path}/user/{userslug}/settings" class="btn-ghost-sm text-xs
78
+ {{{ if template.account/settings }}}active{{{ end }}}">
72
79
  <div class="flex-1">[[user:settings]]</div>
73
80
  </a>
74
81
  {{{ end }}}
75
82
 
76
83
  {{{ each profile_links }}}
77
- <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn-ghost-sm text-xs plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}}" id="{./id}">
84
+ <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn-ghost-sm text-xs plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}} {{{ if (url == ./url) }}}active{{{ end }}}" id="{./id}">
78
85
  <div class="flex-1">{./name}</div>
79
86
  </a>
80
87
  {{{end}}}
@@ -1,7 +1,5 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <noscript><div class="dropdown" component="category-selector"></noscript>
4
- <button component="category/post" for="category-dropdown-check" class="btn btn-primary text-nowrap" id="new_topic" role="button">
2
+ <button component="category/post" for="category-dropdown-check" class="btn btn-primary btn-sm text-nowrap" id="new_topic" role="button">
5
3
  [[category:new_topic_button]]
6
4
  </button>
7
5
  <noscript>
@@ -16,7 +16,7 @@
16
16
  {{{ end }}}
17
17
  {{{ if !config.hideSubCategories }}}
18
18
  {{{ if ./children.length }}}
19
- <div class="category-children d-flex gap-3">
19
+ <div class="category-children row row-cols-2 g-2">
20
20
  {{{ each ./children }}}
21
21
  {{{ if !./isSection }}}
22
22
  <span class="category-children-item small">
@@ -31,13 +31,6 @@
31
31
  </div>
32
32
  {{{ end }}}
33
33
  {{{ end }}}
34
- <span class="d-block d-sm-none">
35
- {{{ if ./teaser.timestampISO }}}
36
- <a class="permalink" href="{./teaser.url}">
37
- <small class="timeago" title="{./teaser.timestampISO}"></small>
38
- </a>
39
- {{{ end }}}
40
- </span>
41
34
  </div>
42
35
  </div>
43
36
 
@@ -1,7 +1,7 @@
1
1
  <div class="btn-group bottom-sheet" component="thread/sort">
2
- <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
- <i class="fa fa-fw fa-arrow-down-wide-short small link-primary"></i>
4
- <span class="visible-md-inline visible-lg-inline small">[[topic:sort_by]]</span>
2
+ <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
+ <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
4
+ <span class="visible-md-inline visible-lg-inline fw-semibold">[[topic:sort_by]]</span>
5
5
  </button>
6
6
 
7
7
  <ul class="dropdown-menu">
@@ -14,7 +14,7 @@
14
14
  {{{end}}}
15
15
  </ul>
16
16
  {{{ if hasMoreSubCategories}}}
17
- <button class="btn btn-link mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
17
+ <button class="btn-ghost-sm mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
18
18
  {{{ end }}}
19
19
  </div>
20
20
  {{{ end }}}
@@ -1,8 +1,8 @@
1
1
  {{{ if showTopicTools }}}
2
2
  <div class="btn-group thread-tools bottom-sheet">
3
- <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
- <i class="fa fa-fw fa-gear small link-primary"></i>
5
- <span class="visible-md-inline visible-lg-inline small">[[topic:thread_tools.title]]</span>
3
+ <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <i class="fa fa-fw fa-gear text-primary"></i>
5
+ <span class="visible-md-inline visible-lg-inline fw-semibold">[[topic:thread_tools.title]]</span>
6
6
  </button>
7
7
  <ul class="dropdown-menu">
8
8
  <li>
@@ -1,19 +1,19 @@
1
1
  {{{ if config.loggedIn }}}
2
2
  <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch">
3
- <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
- <span component="category/watching/menu" <!-- IF !../isWatched -->class="hidden"<!-- ENDIF !../isWatched -->><i class="fa fa-fw fa-inbox small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:watching]]</span></span>
3
+ <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <span component="category/watching/menu" {{{ if !./isWatched }}}class="hidden"{{{ end }}}><i class="fa fa-fw fa-inbox text-primary"></i><span class="visible-md-inline visible-lg-inline fw-semibold"> [[category:watching]]</span></span>
5
5
 
6
- <span component="category/notwatching/menu" <!-- IF !../isNotWatched -->class="hidden"<!-- ENDIF !../isNotWatched -->><i class="fa fa-fw fa-clock-o small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:not-watching]]</span></span>
6
+ <span component="category/notwatching/menu" {{{ if !./isNotWatched }}}class="hidden"{{{ end }}}><i class="fa fa-fw fa-clock-o text-primary"></i><span class="visible-md-inline visible-lg-inline fw-semibold"> [[category:not-watching]]</span></span>
7
7
 
8
- <span component="category/ignoring/menu" <!-- IF !../isIgnored -->class="hidden"<!-- ENDIF !../isIgnored -->><i class="fa fa-fw fa-eye-slash small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:ignoring]]</span></span>
8
+ <span component="category/ignoring/menu" {{{ if !./isIgnored }}}class="hidden"{{{ end }}}><i class="fa fa-fw fa-eye-slash text-primary"></i><span class="visible-md-inline visible-lg-inline fw-semibold"> [[category:ignoring]]</span></span>
9
9
  </button>
10
10
 
11
11
  <ul class="dropdown-menu">
12
- <li><a class="dropdown-item" href="#" component="category/watching" data-state="watching"><i component="category/watching/check" class="fa fa-fw <!-- IF ../isWatched -->fa-check<!-- ENDIF ../isWatched -->"></i><i class="fa fa-fw fa-inbox"></i> [[category:watching]]<p class="help-text"><small>[[category:watching.description]]</small></p></a></li>
12
+ <li><a class="dropdown-item" href="#" component="category/watching" data-state="watching"><i component="category/watching/check" class="fa fa-fw {{{ if ./isWatched }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-inbox"></i> [[category:watching]]<p class="help-text text-muted"><small>[[category:watching.description]]</small></p></a></li>
13
13
 
14
- <li><a class="dropdown-item" href="#" component="category/notwatching" data-state="notwatching"><i component="category/notwatching/check" class="fa fa-fw <!-- IF ../isNotWatched -->fa-check<!-- ENDIF ../isNotWatched -->"></i><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]<p class="help-text"><small>[[category:not-watching.description]]</small></p></a></li>
14
+ <li><a class="dropdown-item" href="#" component="category/notwatching" data-state="notwatching"><i component="category/notwatching/check" class="fa fa-fw {{{ if ./isNotWatched }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]<p class="help-text text-muted"><small>[[category:not-watching.description]]</small></p></a></li>
15
15
 
16
- <li><a class="dropdown-item" href="#" component="category/ignoring" data-state="ignoring"><i component="category/ignoring/check" class="fa fa-fw <!-- IF ../isIgnored -->fa-check<!-- ENDIF ../isIgnored -->"></i><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]<p class="help-text"><small>[[category:ignoring.description]]</small></p></a></li>
16
+ <li><a class="dropdown-item" href="#" component="category/ignoring" data-state="ignoring"><i component="category/ignoring/check" class="fa fa-fw {{{ if ./isIgnored }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]<p class="help-text text-muted"><small>[[category:ignoring.description]]</small></p></a></li>
17
17
  </ul>
18
18
  </div>
19
19
  {{{ end }}}
@@ -1,12 +1,12 @@
1
- <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
1
+ <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
2
  {{{ if selectedCategory }}}
3
3
  <span class="category-item">
4
4
  {buildCategoryIcon(selectedCategory, "20px", "rounded-circle")}
5
- <span class="visible-md-inline visible-lg-inline small">{selectedCategory.name}</span>
5
+ <span class="visible-md-inline visible-lg-inline fw-semibold">{selectedCategory.name}</span>
6
6
  </span>
7
7
  {{{ else }}}
8
- <i class="fa fa-fw fa-list small link-primary"></i>
9
- <span class="visible-md-inline visible-lg-inline small">[[unread:all_categories]]</span>{{{ end }}}
8
+ <i class="fa fa-fw fa-list link-primary"></i>
9
+ <span class="visible-md-inline visible-lg-inline fw-semibold">[[unread:all_categories]]</span>{{{ end }}}
10
10
  </button>
11
11
  <div component="category-selector-search" class="hidden position-absolute">
12
12
  <input type="text" class="form-control" autocomplete="off">
@@ -1,14 +1,15 @@
1
- <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
1
+ <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
2
  <span component="category-selector-selected">
3
3
  {{{ if (selectedCategory && !showCategorySelectLabel) }}}
4
4
  <span class="category-item">
5
5
  {buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}
6
- {selectedCategory.name}
6
+ <span class="fw-semibold">{selectedCategory.name}</span>
7
7
  </span>
8
8
  {{{ else }}}
9
- <i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}} link-primary small"></i>
10
- <span class="visible-md-inline visible-lg-inline small">{{{ if selectCategoryLabel }}}{selectCategoryLabel}{{{ else }}}[[topic:thread_tools.select_category]]{{{ end }}}</span>
11
- {{{ end }}}</span>
9
+ <i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}} text-primary"></i>
10
+ <span class="visible-md-inline visible-lg-inline fw-semibold">{{{ if selectCategoryLabel }}}{selectCategoryLabel}{{{ else }}}[[topic:thread_tools.select_category]]{{{ end }}}</span>
11
+ {{{ end }}}
12
+ </span>
12
13
  </button>
13
14
  <div component="category-selector-search" class="hidden position-absolute">
14
15
  <input type="text" class="form-control" autocomplete="off">
@@ -17,10 +18,10 @@
17
18
  <li component="category/no-matches" role="presentation" class="category hidden">
18
19
  <a class="dropdown-item" role="menu-item">[[search:no-matches]]</a>
19
20
  </li>
20
- {{{each categoryItems}}}
21
- <li role="presentation" class="category {{{ if ../disabledClass }}}disabled {{{ end }}}" data-cid="{../cid}" data-name="{../name}" data-parent-cid="{../parentCid}">
22
- <a class="dropdown-item" role="menu-item">{../level}
23
- <span component="category-markup" style="{{{ if ../match }}}font-weight: bold;{{{end}}}">
21
+ {{{ each categoryItems }}}
22
+ <li role="presentation" class="category {{{ if ./disabledClass }}}disabled {{{ end }}}" data-cid="{./cid}" data-name="{./name}" data-parent-cid="{./parentCid}">
23
+ <a class="dropdown-item" role="menu-item">{./level}
24
+ <span component="category-markup" style="{{{ if ./match }}}font-weight: bold;{{{end}}}">
24
25
  <div class="category-item d-inline-block">
25
26
  {{{ if ./icon }}}
26
27
  {buildCategoryIcon(@value, "24px", "rounded-circle")}
@@ -1,4 +1,10 @@
1
- <!-- IF roomId -->
1
+ {{{ if !roomId }}}
2
+ <div class="text-center p-2">
3
+ [[modules:chat.no_active]]
4
+ </div>
5
+ {{{ end }}}
6
+
7
+ {{{ if roomId }}}
2
8
  <div component="chat/messages" class="expanded-chat d-flex flex-column h-100" data-roomid="{roomId}">
3
9
  <div component="chat/header" class="d-flex align-items-center px-3 gap-1">
4
10
  <h5 class="members flex-1 fw-semibold tracking-tight">
@@ -9,7 +15,7 @@
9
15
  </div>
10
16
  <hr class="text-muted opacity-25"/>
11
17
  <div class="position-relative">
12
- <div component="chat/messages/scroll-up-alert" class="position-absolute me-4 end-0 text-sm scroll-up-alert alert alert-info hidden w-25" role="button" style="z-index: 1;">[[modules:chat.scroll-up-alert]]</div>
18
+ <div component="chat/messages/scroll-up-alert" class="position-absolute me-md-4 end-0 text-sm scroll-up-alert alert alert-info hidden w-25 d-none d-md-block" role="button" style="z-index: 1;">[[modules:chat.scroll-up-alert]]</div>
13
19
  </div>
14
20
  <ul class="chat-content p-0 m-0 list-unstyled overflow-auto flex-grow-1">
15
21
  <!-- IMPORT partials/chats/messages.tpl -->
@@ -25,8 +31,4 @@
25
31
  </form>
26
32
  </div>
27
33
  </div>
28
- <!-- ELSE -->
29
- <div class="alert alert-info me-3">
30
- [[modules:chat.no-messages]]
31
- </div>
32
- <!-- ENDIF roomId -->
34
+ {{{ end }}}
@@ -80,13 +80,11 @@
80
80
 
81
81
  <div class="mb-3">
82
82
  <label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
83
- <div class="row">
84
- <div class="col-md-6">
85
- <input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
86
- </div>
87
- <div class="col-md-6 member-post-cids-selector">
83
+ <div class="d-flex gap-1">
84
+ <div class="member-post-cids-selector">
88
85
  <!-- IMPORT partials/category-selector.tpl -->
89
86
  </div>
87
+ <input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
90
88
  </div>
91
89
  </div>
92
90
 
@@ -1,4 +1,4 @@
1
- <div class="col-12 col-md-3 col-lg-2 border-end-md text-sm mb-3">
1
+ <div class="flex-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
2
  <div class="nav sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
3
3
  <button data-bs-toggle="tab" data-bs-target="#groups-posts" class="btn-ghost fw-semibold {{{ if template.groups/details }}}active{{{ end }}}">
4
4
  <div class="flex-1">[[global:posts]]</div>
@@ -0,0 +1,19 @@
1
+ {{{ if (brand:logo || config.showSiteTitle)}}}
2
+ <div class="container brand-container">
3
+ <div class="col-12 d-flex border-bottom pb-3 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
4
+ <div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
5
+ {{{ if brand:logo }}}
6
+ <a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}">
7
+ <img component="brand/logo" alt="{brand:logo:alt}" class="{brand:logo:display}" src="{brand:logo}?{config.cache-buster}" />
8
+ </a>
9
+ {{{ end }}}
10
+
11
+ {{{ if config.showSiteTitle }}}
12
+ <a component="siteTitle" class="text-truncate align-self-stretch align-items-center d-flex" href="{{{ if title:url }}}{title:url}{{{ else }}}{relative_path}/{{{ end }}}">
13
+ <h1 class="fs-6 fw-bold text-body mb-0">{config.siteTitle}</h1>
14
+ </a>
15
+ {{{ end }}}
16
+ </div>
17
+ </div>
18
+ </div>
19
+ {{{ end }}}
@@ -14,17 +14,17 @@
14
14
  <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}"><div class="avatar avatar-rounded" style="--avatar-size: 32px; background-color: {./user.icon:bgColor};">{./user.icon:text}</div></a>
15
15
  {{{ end }}}
16
16
  <div class=" d-flex flex-column">
17
- <a href="{./path}" class="text-decoration-none notification-chat-content text-reset text text-sm">
17
+ <a href="{./path}" class="text-decoration-none text-reset text text-sm">
18
18
  {./bodyShort}
19
19
  </a>
20
20
  <div class="text-xs text-muted">{{{ if ./timeagoLong }}}{./timeagoLong}{{{ else }}}<span class="timeago" title="{./datetimeISO}"></span>{{{ end }}}</div>
21
21
  </div>
22
22
  </div>
23
- <div class="notification-chat-controls">
23
+ <div class="">
24
24
  {{{ if ./nid }}}
25
- <button class="mark-read btn btn-light btn-sm">
26
- <i class="unread fa fa-xs fa-circle text-primary {{{ if ./read }}}hidden{{{ end }}}"></i>
27
- <i class="read fa fa-xs fa-circle-o text-secondary {{{ if !./read }}}hidden{{{ end }}}"></i>
25
+ <button class="mark-read btn-ghost-sm" style="width: 1.5rem; height: 1.5rem;">
26
+ <i class="unread fa fa-2xs fa-circle text-primary {{{ if ./read }}}hidden{{{ end }}}"></i>
27
+ <i class="read fa fa-2xs fa-circle-o text-secondary {{{ if !./read }}}hidden{{{ end }}}"></i>
28
28
  </button>
29
29
  {{{ end }}}
30
30
  </div>
@@ -1,10 +1,10 @@
1
- <nav class="sticky-tools navbar navbar-expand mt-4 p-0 border-0 rounded topic-main-buttons">
1
+ <nav class="{{{ if config.stickyToolbar }}}sticky-tools{{{ end }}} navbar navbar-expand mt-4 p-0 border-0 rounded topic-main-buttons">
2
2
  <div class="card card-header flex-row p-2 border rounded ff-secondary w-100">
3
3
  <ul class="navbar-nav me-auto gap-2 align-items-center">
4
4
  {{{ if loggedIn }}}
5
- <button component="topic/mark-unread" class="btn btn-link d-flex gap-2 align-items-center">
6
- <i class="fa fa-fw fa-inbox small link-primary"></i>
7
- <span class="d-none d-md-inline small">[[topic:mark_unread]]</span>
5
+ <button component="topic/mark-unread" class="btn-ghost-sm d-flex gap-2 align-items-center">
6
+ <i class="fa fa-fw fa-inbox text-primary"></i>
7
+ <span class="d-none d-md-inline fw-semibold">[[topic:mark_unread]]</span>
8
8
  </button>
9
9
  {{{ end }}}
10
10
 
@@ -13,7 +13,7 @@
13
13
  <!-- IMPORT partials/topic/tools.tpl -->
14
14
 
15
15
  {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
16
- <a class="btn btn-link link-primary hidden-xs" target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss"></i></a>
16
+ <a class="btn-ghost-sm d-none d-lg-flex align-self-stretch" target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss text-primary"></i></a>
17
17
  {{{ end }}}
18
18
 
19
19
  <span class="loading-indicator btn float-start text-muted navbar-text hidden" done="0">