nodebb-theme-harmony 1.0.0-beta.7 → 1.0.0-beta.71

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 (137) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +5 -1
  3. package/library.js +21 -7
  4. package/package.json +1 -1
  5. package/public/harmony.js +148 -9
  6. package/public/settings.js +1 -0
  7. package/screenshots/categories.png +0 -0
  8. package/screenshots/recent.png +0 -0
  9. package/screenshots/topic.png +0 -0
  10. package/scss/account.scss +1 -1
  11. package/scss/chats.scss +53 -25
  12. package/scss/common.scss +60 -8
  13. package/scss/flags.scss +5 -0
  14. package/scss/harmony.scss +3 -0
  15. package/scss/mixins.scss +7 -3
  16. package/scss/modals.scss +6 -1
  17. package/scss/modules/bottom-sheet.scss +1 -1
  18. package/scss/modules/composer.scss +0 -4
  19. package/scss/modules/cover.scss +1 -11
  20. package/scss/modules/filters.scss +8 -0
  21. package/scss/modules/paginator.scss +24 -0
  22. package/scss/modules/topic-navigator.scss +14 -42
  23. package/scss/modules/topics-list.scss +6 -0
  24. package/scss/overrides.scss +4 -1
  25. package/scss/search.scss +0 -0
  26. package/scss/sidebar.scss +20 -10
  27. package/scss/topic.scss +26 -13
  28. package/templates/account/blocks.tpl +35 -41
  29. package/templates/account/categories.tpl +26 -29
  30. package/templates/account/consent.tpl +66 -10
  31. package/templates/account/edit/password.tpl +25 -30
  32. package/templates/account/edit/username.tpl +21 -26
  33. package/templates/account/edit.tpl +105 -116
  34. package/templates/account/followers.tpl +12 -19
  35. package/templates/account/following.tpl +12 -18
  36. package/templates/account/groups.tpl +12 -17
  37. package/templates/account/info.tpl +178 -206
  38. package/templates/account/posts.tpl +31 -36
  39. package/templates/account/profile.tpl +66 -73
  40. package/templates/account/sessions.tpl +8 -30
  41. package/templates/account/settings.tpl +193 -198
  42. package/templates/account/theme.tpl +35 -26
  43. package/templates/account/topics.tpl +33 -38
  44. package/templates/account/uploads.tpl +33 -40
  45. package/templates/admin/plugins/harmony.tpl +17 -3
  46. package/templates/categories.tpl +1 -1
  47. package/templates/category.tpl +12 -13
  48. package/templates/chats.tpl +7 -8
  49. package/templates/flags/detail.tpl +160 -193
  50. package/templates/flags/list.tpl +4 -70
  51. package/templates/footer.tpl +2 -2
  52. package/templates/groups/details.tpl +21 -18
  53. package/templates/groups/list.tpl +1 -1
  54. package/templates/groups/members.tpl +0 -2
  55. package/templates/header.tpl +1 -1
  56. package/templates/login.tpl +2 -2
  57. package/templates/notifications.tpl +1 -1
  58. package/templates/partials/account/category-item.tpl +4 -4
  59. package/templates/partials/account/footer.tpl +3 -0
  60. package/templates/partials/account/header.tpl +78 -81
  61. package/templates/partials/account/session-list.tpl +18 -0
  62. package/templates/partials/account/sidebar-left.tpl +6 -0
  63. package/templates/partials/breadcrumbs.tpl +6 -6
  64. package/templates/partials/categories/item.tpl +20 -19
  65. package/templates/partials/categories/lastpost.tpl +2 -2
  66. package/templates/partials/{category-filter-content.tpl → category/filter-dropdown-content.tpl} +8 -6
  67. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +3 -3
  68. package/templates/partials/category/subcategory.tpl +1 -1
  69. package/templates/partials/category/tags.tpl +0 -2
  70. package/templates/partials/category/watch.tpl +28 -4
  71. package/templates/partials/chats/message-window.tpl +10 -7
  72. package/templates/partials/chats/message.tpl +4 -6
  73. package/templates/partials/chats/recent_room.tpl +41 -32
  74. package/templates/partials/cookie-consent.tpl +5 -5
  75. package/templates/partials/flags/filters.tpl +142 -85
  76. package/templates/partials/flags/results.tpl +38 -0
  77. package/templates/partials/groups/admin.tpl +4 -4
  78. package/templates/partials/groups/badge.tpl +1 -1
  79. package/templates/partials/groups/memberlist.tpl +1 -1
  80. package/templates/partials/groups/sidebar-left.tpl +1 -1
  81. package/templates/partials/header/brand.tpl +1 -1
  82. package/templates/partials/mobile-footer.tpl +69 -64
  83. package/templates/partials/notifications_list.tpl +1 -1
  84. package/templates/partials/paginator.tpl +11 -9
  85. package/templates/partials/post_bar.tpl +26 -24
  86. package/templates/partials/posts_list_item.tpl +5 -5
  87. package/templates/partials/quick-search-results.tpl +3 -3
  88. package/templates/partials/search-filters.tpl +184 -0
  89. package/templates/partials/search-results.tpl +28 -32
  90. package/templates/partials/sidebar/chats.tpl +22 -33
  91. package/templates/partials/sidebar/drafts.tpl +42 -34
  92. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  93. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  94. package/templates/partials/sidebar/notifications.tpl +29 -8
  95. package/templates/partials/sidebar/search.tpl +1 -1
  96. package/templates/partials/sidebar/user-menu.tpl +6 -6
  97. package/templates/partials/sidebar-left.tpl +13 -10
  98. package/templates/partials/sidebar-right.tpl +1 -3
  99. package/templates/partials/skin-switcher.tpl +2 -2
  100. package/templates/partials/tags/filter-dropdown-content.tpl +31 -0
  101. package/templates/partials/tags_list.tpl +4 -4
  102. package/templates/partials/topic/browsing-users.tpl +0 -2
  103. package/templates/partials/topic/event.tpl +1 -1
  104. package/templates/partials/topic/navigation-post.tpl +5 -9
  105. package/templates/partials/topic/navigator-mobile.tpl +62 -0
  106. package/templates/partials/topic/navigator.tpl +21 -17
  107. package/templates/partials/topic/post-editor.tpl +0 -2
  108. package/templates/partials/topic/post-menu-list.tpl +36 -38
  109. package/templates/partials/topic/post-menu.tpl +15 -10
  110. package/templates/partials/topic/post.tpl +35 -17
  111. package/templates/partials/topic/quickreply.tpl +6 -6
  112. package/templates/partials/topic/reply-button.tpl +1 -1
  113. package/templates/partials/topic/topic-menu-list.tpl +16 -18
  114. package/templates/partials/topic/watch.tpl +28 -4
  115. package/templates/partials/topic-list-bar.tpl +50 -46
  116. package/templates/partials/topics_list.tpl +40 -38
  117. package/templates/partials/userFilter-placeholders.tpl +5 -0
  118. package/templates/partials/users/filter-dropdown-content.tpl +20 -0
  119. package/templates/partials/users/item.tpl +24 -26
  120. package/templates/partials/users_list.tpl +1 -1
  121. package/templates/popular.tpl +3 -1
  122. package/templates/post-queue.tpl +120 -0
  123. package/templates/recent.tpl +3 -2
  124. package/templates/register.tpl +2 -2
  125. package/templates/search.tpl +39 -177
  126. package/templates/tags.tpl +3 -3
  127. package/templates/top.tpl +3 -1
  128. package/templates/topic.tpl +74 -68
  129. package/templates/unread.tpl +3 -1
  130. package/templates/users.tpl +2 -2
  131. package/templates/modules/usercard.tpl +0 -39
  132. package/templates/partials/acceptTos.tpl +0 -11
  133. package/templates/partials/category-filter-right.tpl +0 -5
  134. package/templates/partials/category-filter.tpl +0 -3
  135. package/templates/partials/category-selector-right.tpl +0 -5
  136. package/templates/partials/category-selector.tpl +0 -3
  137. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,27 +1,29 @@
1
- <nav class="{{{ if config.stickyToolbar }}}sticky-tools{{{ end }}} navbar navbar-expand mt-4 p-0 border-0 rounded topic-main-buttons">
2
- <div class="card card-header flex-row p-2 border rounded ff-secondary w-100">
3
- <ul class="navbar-nav me-auto gap-2 align-items-center">
4
- {{{ if loggedIn }}}
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
- </button>
9
- {{{ end }}}
1
+ <div class="{{{ if config.theme.stickyToolbar }}}sticky-tools{{{ end }}}">
2
+ <nav class="navbar navbar-expand my-2 p-0 border-0 rounded topic-main-buttons">
3
+ <div class="card card-header flex-row p-2 border rounded w-100">
4
+ <ul class="navbar-nav me-auto gap-2 align-items-center">
5
+ {{{ if loggedIn }}}
6
+ <button component="topic/mark-unread" class="btn-ghost-sm d-flex gap-2 align-items-center">
7
+ <i class="fa fa-fw fa-inbox text-primary"></i>
8
+ <span class="d-none d-md-inline fw-semibold">[[topic:mark_unread]]</span>
9
+ </button>
10
+ {{{ end }}}
10
11
 
11
- <!-- IMPORT partials/topic/watch.tpl -->
12
- <!-- IMPORT partials/topic/sort.tpl -->
13
- <!-- IMPORT partials/topic/tools.tpl -->
12
+ <!-- IMPORT partials/topic/watch.tpl -->
13
+ <!-- IMPORT partials/topic/sort.tpl -->
14
+ <!-- IMPORT partials/topic/tools.tpl -->
14
15
 
15
- {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
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
- {{{ end }}}
16
+ {{{ if (!feeds:disableRSS && rssFeedUrl) }}}
17
+ <a class="btn-ghost-sm d-none d-lg-flex align-self-stretch" target="_blank" href="{rssFeedUrl}"><i class="fa fa-rss text-primary"></i></a>
18
+ {{{ end }}}
18
19
 
19
- <span class="loading-indicator btn float-start text-muted navbar-text hidden" done="0">
20
- <i class="fa fa-refresh fa-spin"></i>
21
- <span class="hidden-xs">[[topic:loading_more_posts]]</span>
22
- </span>
23
- </ul>
24
- <!-- IMPORT partials/topic/reply-button.tpl -->
25
- </div>
26
-
27
- </nav>
20
+ {{{ if browsingUsers }}}
21
+ <div class="hidden-xs">
22
+ <!-- IMPORT partials/topic/browsing-users.tpl -->
23
+ </div>
24
+ {{{ end }}}
25
+ </ul>
26
+ <!-- IMPORT partials/topic/reply-button.tpl -->
27
+ </div>
28
+ </nav>
29
+ </div>
@@ -1,19 +1,19 @@
1
1
  <hr/>
2
- <a class="topic-title fw-semibold fs-5 text-reset" href="{config.relative_path}/post/{./pid}">
2
+ <a class="d-inline-block topic-title fw-semibold fs-5 mb-3 text-reset text-break" href="{config.relative_path}/post/{./pid}">
3
3
  {{{ if !./isMainPost }}}RE: {{{ end }}}{./topic.title}
4
4
  </a>
5
5
  <li component="post" class="posts-list-item {{{ if ./deleted }}} deleted{{{ else }}}{{{ if ./topic.deleted }}} deleted{{{ end }}}{{{ end }}}{{{ if ./topic.scheduled }}} scheduled{{{ end }}}" data-pid="{./pid}" data-uid="{./uid}">
6
6
  <div class="post-body d-flex flex-column gap-1">
7
7
  <div class="d-flex gap-3 post-info">
8
8
  <div class="post-author d-flex gap-1">
9
- <a class="lh-1" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
9
+ <a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
10
10
  <a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
11
11
  </div>
12
- <span class="timeago text-sm text-muted" title="{../timestampISO}"></span>
12
+ <span class="timeago text-sm text-muted" title="{./timestampISO}"></span>
13
13
  </div>
14
14
 
15
- <div component="post/content" class="content text-sm">
16
- {../content}
15
+ <div component="post/content" class="content text-sm text-break">
16
+ {./content}
17
17
  </div>
18
18
  </div>
19
19
  </li>
@@ -9,12 +9,12 @@
9
9
  </div>
10
10
  {{{ end }}}
11
11
 
12
- <ul id="quick-search-results" class="quick-search-results list-unstyled mb-0 p-0 overflow-auto" style="max-width:400px; max-height: 500px;">
12
+ <ul id="quick-search-results" class="quick-search-results list-unstyled mb-0 p-0 pe-1 overflow-auto overscroll-behavior-contain ff-base" style="max-width: 400px; max-height: 500px;">
13
13
  <li role="separator" class="dropdown-divider d-none d-md-block"></li>
14
14
  {{{ each posts }}}
15
15
  <li data-tid="{posts.topic.tid}" data-pid="{posts.pid}" class="d-flex flex-column gap-1">
16
16
  <a href="{config.relative_path}/post/{posts.pid}"
17
- class="dropdown-item rounded-1 text-reset d-block text-truncate px-2 py-1">
17
+ class="btn-ghost-sm rounded-1 text-reset d-block text-truncate px-2 py-1">
18
18
  <span class="quick-search-title fw-semibold text-sm">{posts.topic.title}</span>
19
19
  <br/>
20
20
  <p class="snippet text-xs text-break text-wrap mb-0">
@@ -22,7 +22,7 @@
22
22
  </p>
23
23
  </a>
24
24
  <div class="d-flex gap-1 post-info px-2 text-xs">
25
- <div class="category-item d-inline-block">
25
+ <div class="category-item d-inline-block ff-secondary">
26
26
  <span>{function.buildCategoryLabel, posts.category}</span>
27
27
  </div>
28
28
  <span class="timeago text-muted" title="{posts.timestampISO}"></span>
@@ -0,0 +1,184 @@
1
+ <div class="d-flex flex-wrap gap-2 align-items-center" component="search/filters">
2
+ <!-- category filter -->
3
+ <div class="post-search-item">
4
+ <div component="category/filter" class="dropdown" data-filter-name="category">
5
+ <a component="category/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.categories.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
6
+ <span class="filter-label">{{{ if filters.categories.active }}}{filters.categories.label}{{{ else }}}[[search:categories]]{{{ end }}}</span>
7
+ <span class="caret"></span>
8
+ </a>
9
+
10
+ <ul class="dropdown-menu">
11
+ <li class="px-3 py-1 mb-2 d-flex flex-column gap-2">
12
+ <div component="category-selector-search">
13
+ <input type="text" class="form-control" component="category/filter/search" placeholder="[[search:type-a-category]]">
14
+ </div>
15
+ </li>
16
+ <div component="category/list" class="overflow-auto" style="max-height: 350px;"></div>
17
+ <div class="px-3 py-1">
18
+ <div class="form-check">
19
+ <input id="search-children" class="form-check-input" type="checkbox"/>
20
+ <label class="form-check-label" for="search-children">[[search:search-child-categories]]</label>
21
+ </div>
22
+ </div>
23
+ </ul>
24
+ </div>
25
+ </div>
26
+
27
+
28
+ <!-- tag filter -->
29
+ <div class="post-search-item">
30
+ <div component="tag/filter" class="dropdown" data-filter-name="tag">
31
+ <a component="tag/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.tags.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
32
+ <span class="filter-label">{{{ if filters.tags.active }}}{filters.tags.label}{{{ else }}}[[search:tags]]{{{ end }}}</span>
33
+ <span class="caret"></span>
34
+ </a>
35
+
36
+ <ul class="dropdown-menu" style="width: 350px;">
37
+ <li class="px-3 py-1 d-flex flex-column gap-2">
38
+ <input type="text" class="form-control" component="tag/filter/search" placeholder="[[search:type-a-tag]]">
39
+ <div component="tag/filter/selected" class="d-flex flex-wrap gap-2">
40
+ {{{ each tagFilterSelected }}}
41
+ <div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
42
+ <div>{./valueEscaped}</div>
43
+ <button component="tag/filter/delete" data-tag="{./valueEscaped}" class="btn btn-primary btn-sm py-0"><i class="fa fa-times fa-xs"></i></button>
44
+ </div>
45
+ {{{ end }}}
46
+ </div>
47
+ <hr/>
48
+ <div component="tag/filter/results" class="d-flex flex-wrap gap-2">
49
+ {{{ each tagFilterResults }}}
50
+ <button class="btn btn-light btn-sm border" data-tag="{./valueEscaped}">{./valueEscaped}</button>
51
+ {{{ end }}}
52
+ </div>
53
+ </li>
54
+ </ul>
55
+ </div>
56
+ </div>
57
+
58
+ <!-- user name filter -->
59
+ <div class="post-search-item">
60
+ <div component="user/filter" class="dropdown" data-filter-name="user">
61
+ <a component="user/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.users.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
62
+ <span class="filter-label">{{{ if filters.users.active }}}{filters.users.label}{{{ else }}}[[search:posted-by]]{{{ end }}}</span>
63
+ <span class="caret"></span>
64
+ </a>
65
+
66
+ <ul class="dropdown-menu" style="width: 350px;">
67
+ <li class="px-3 py-1 d-flex flex-column gap-2">
68
+ <input type="text" class="form-control" component="user/filter/search" placeholder="[[search:type-a-username]]">
69
+ <div component="user/filter/selected" class="d-flex flex-wrap gap-2">
70
+ {{{ each userFilterSelected }}}
71
+ <div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
72
+ {buildAvatar(@value, "16px", true)} {./username}
73
+ <button component="user/filter/delete" data-uid="{./uid}" class="btn btn-primary btn-sm py-0"><i class="fa fa-times fa-xs"></i></button>
74
+ </div>
75
+ {{{ end }}}
76
+ </div>
77
+ <hr/>
78
+ <div component="user/filter/results" class="d-flex flex-wrap gap-2">
79
+ {{{ each userFilterResults }}}
80
+ <button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
81
+ {{{ end }}}
82
+ </div>
83
+ </li>
84
+ </ul>
85
+ </div>
86
+ </div>
87
+
88
+
89
+ <!-- reply count filter -->
90
+ <div class="post-search-item">
91
+ <div class="dropdown" data-filter-name="replies">
92
+ <a id="reply-count-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.replies.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
93
+ <span class="filter-label">{{{ if filters.replies.active }}}{filters.replies.label}{{{ else }}}[[search:replies]]{{{ end }}}</span>
94
+ <span class="caret"></span>
95
+ </a>
96
+
97
+ <ul class="dropdown-menu" style="width: 300px;">
98
+ <li class="px-3 py-1 d-flex flex-nowrap gap-2">
99
+ <select id="reply-count-filter" class="form-select py-2 ps-2 pe-3">
100
+ <option value="atleast">[[search:at-least]]</option>
101
+ <option value="atmost">[[search:at-most]]</option>
102
+ </select>
103
+ <input id="reply-count" type="number" min="0" class="form-control py-2 ps-2 pe-3" />
104
+ </li>
105
+ </ul>
106
+ </div>
107
+ </div>
108
+
109
+ <!-- time filter -->
110
+ <div class="post-search-item">
111
+ <div class="dropdown" data-filter-name="time">
112
+ <a id="post-time-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.time.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
113
+ <span class="filter-label">{{{ if filters.time.active }}}{filters.time.label}{{{ else }}}[[search:time]]{{{ end }}}</span>
114
+ <span class="caret"></span>
115
+ </a>
116
+
117
+ <ul class="dropdown-menu" style="width: 350px;">
118
+ <li class="px-3 py-1 d-flex flex-nowrap gap-2">
119
+ <select id="post-time-filter" class="form-select py-2 ps-2 pe-3">
120
+ <option value="newer">[[search:newer-than]]</option>
121
+ <option value="older">[[search:older-than]]</option>
122
+ </select>
123
+ <select id="post-time-range" class="form-select py-2 ps-2 pe-3">
124
+ <option value="">[[search:any-date]]</option>
125
+ <option value="86400">[[search:yesterday]]</option>
126
+ <option value="604800">[[search:one-week]]</option>
127
+ <option value="1209600">[[search:two-weeks]]</option>
128
+ <option value="2592000">[[search:one-month]]</option>
129
+ <option value="7776000">[[search:three-months]]</option>
130
+ <option value="15552000">[[search:six-months]]</option>
131
+ <option value="31104000">[[search:one-year]]</option>
132
+ </select>
133
+ </li>
134
+ </ul>
135
+ </div>
136
+ </div>
137
+
138
+ <!-- sort filter -->
139
+ <div class="post-search-item">
140
+ <div class="dropdown" data-filter-name="sort">
141
+ <a id="sort-by-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.sort.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
142
+ <span class="filter-label">{{{ if filters.sort.active }}}{filters.sort.label}{{{ else }}}[[search:sort]]{{{ end }}}</span>
143
+ <span class="caret"></span>
144
+ </a>
145
+
146
+ <ul class="dropdown-menu" style="width: 250px;">
147
+ <li class="px-3 py-1 d-flex flex-column gap-2">
148
+ <select id="post-sort-by" class="form-select py-2 ps-2 pe-3">
149
+ <option value="relevance">[[search:relevance]]</option>
150
+ <option value="timestamp">[[search:post-time]]</option>
151
+ <option value="votes">[[search:votes]]</option>
152
+ <option value="topic.lastposttime">[[search:last-reply-time]]</option>
153
+ <option value="topic.title">[[search:topic-title]]</option>
154
+ <option value="topic.postcount">[[search:number-of-replies]]</option>
155
+ <option value="topic.viewcount">[[search:number-of-views]]</option>
156
+ <option value="topic.votes">[[search:topic-votes]]</option>
157
+ <option value="topic.timestamp">[[search:topic-start-date]]</option>
158
+ <option value="user.username">[[search:username]]</option>
159
+ <option value="category.name">[[search:category]]</option>
160
+ </select>
161
+ <select id="post-sort-direction" class="form-select py-2 ps-2 pe-3">
162
+ <option value="desc">[[search:descending]]</option>
163
+ <option value="asc">[[search:ascending]]</option>
164
+ </select>
165
+ </li>
166
+ </ul>
167
+ </div>
168
+ </div>
169
+
170
+ <!-- save & reset preferences -->
171
+ <div class="post-search-item">
172
+ <div class="dropdown">
173
+ <a class="btn btn-light btn-sm border border-gray-300 dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">[[search:save]] <span class="caret"></span>
174
+ </a>
175
+
176
+ <ul class="dropdown-menu" style="width: 300px;">
177
+ <li class="px-3 py-1 d-flex flex-column gap-2">
178
+ <button id="save-preferences" class="btn btn-primary">[[search:save-preferences]]</button>
179
+ <button id="clear-preferences" class="btn-outline border">[[search:clear-preferences]]</button>
180
+ </li>
181
+ </ul>
182
+ </div>
183
+ </div>
184
+ </div>
@@ -1,41 +1,37 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div id="results" class="search-results col-md-12" data-search-query="{search_query}">
4
- {{{ if matchCount }}}
5
- <div class="alert alert-info">[[search:results_matching, {matchCount}, {search_query}, {time}]] </div>
6
- {{{ else }}}
7
- {{{ if search_query }}}
8
- <div class="alert alert-warning">[[search:no-matches]]</div>
1
+ {{{ if matchCount }}}
2
+ <div class="card card-header text-xs px-2 py-1 fw-semibold border-0 align-self-start">[[search:results_matching, {matchCount}, {search_query}, {time}]] </div>
3
+ {{{ else }}}
4
+ {{{ if search_query }}}
5
+ <div class="badge text-bg-warning align-self-start">[[search:no-matches]]</div>
6
+ {{{ end }}}
7
+ {{{ end }}}
8
+
9
+ <div id="results" class="search-results" data-search-query="{search_query}">
10
+ {{{ if showAsPosts }}}
11
+ {{{ if posts.length }}}
12
+ <!-- IMPORT partials/posts_list.tpl -->
9
13
  {{{ end }}}
10
14
  {{{ end }}}
11
15
 
12
- {{{each posts}}}
13
- <div class="topic-row card clearfix mb-3">
14
- <div class="card-body">
15
- <div>
16
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "24px", true)}</a>
17
- <span class="search-result-text search-result-title"><a href="{config.relative_path}/post/{posts.pid}">{./topic.title}</a></span>
18
- </div>
19
-
20
- {{{ if showAsPosts }}}
21
- <div class="search-result-text">
22
- {./content}
23
- <p class="fade-out"></p>
16
+ {{{ if showAsTopics }}}
17
+ {{{ each posts }}}
18
+ <hr/>
19
+ <div class="topic-row mb-3">
20
+ <a class="topic-title fw-semibold fs-5 text-reset text-break" href="{config.relative_path}/post/{./pid}">
21
+ {{{ if !./isMainPost }}}RE: {{{ end }}}{./topic.title}
22
+ </a>
23
+ <div class="post-body d-flex flex-column gap-1">
24
+ <div class="d-flex gap-3 post-info">
25
+ <div class="post-author d-flex gap-1">
26
+ <a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
27
+ <a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
28
+ </div>
29
+ <span class="timeago text-sm text-muted" title="{./timestampISO}"></span>
24
30
  </div>
25
- {{{ end }}}
26
-
27
- <small class="post-info float-end">
28
- <a href="{config.relative_path}/category/{./category.slug}">
29
- <div class="category-item d-inline-block">
30
- {buildCategoryIcon(./category, "24px", "rounded-circle")}
31
- {./category.name}
32
- </div>
33
- </a> &bull;
34
- <span class="timeago" title="{./timestampISO}"></span>
35
- </small>
36
31
  </div>
37
32
  </div>
38
- {{{end}}}
33
+ {{{ end }}}
34
+ {{{ end }}}
39
35
 
40
36
  {{{ if users.length }}}
41
37
  <!-- IMPORT partials/users_list.tpl -->
@@ -1,4 +1,4 @@
1
- <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative" title="[[global:header.chats]]" component="chat/dropdown">
1
+ <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative" component="chat/dropdown">
2
2
  <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
3
3
  <span class="position-relative">
4
4
  <i component="chat/icon" class="fa fa-fw {{{ if unreadCount.chat}}}fa-comment{{{ else }}}fa-comment-o{{{ end }}} unread-count" data-content="{unreadCount.chat}"></i>
@@ -10,41 +10,30 @@
10
10
  </a>
11
11
  <ul class="chats-dropdown dropdown-menu p-1 shadow">
12
12
  <li>
13
- <ul component="chat/list" class="chat-list chats-list list-unstyled p-0 pe-1">
14
- <li class="dropdown-item rounded-1 p-2 d-flex gap-2 placeholder-wave">
15
- <div class="main-avatar">
16
- <div class="placeholder" style="width: 32px; height: 32px;"></div>
13
+ <div component="chat/list" class="list-container chats-list overscroll-behavior-contain p-0 pe-1 ff-base">
14
+ <div class="rounded-1">
15
+ <div class="d-flex gap-1 justify-content-between">
16
+ <div class="dropdown-item p-2 d-flex gap-2 placeholder-wave">
17
+ <div class="main-avatar">
18
+ <div class="placeholder" style="width: 32px; height: 32px;"></div>
19
+ </div>
20
+ <div class="d-flex flex-grow-1 flex-column w-100">
21
+ <div class="text-xs"><div class="placeholder col-3"></div></div>
22
+ <div class="text-sm"><div class="placeholder col-11"></div></div>
23
+ <div class="text-xs"><div class="placeholder col-4"></div></div>
24
+ </div>
25
+ </div>
26
+ <div>
27
+ <button class="mark-read btn-ghost-sm" style="width: 1.5rem; height: 1.5rem;">
28
+ <i class="unread fa fa-2xs fa-circle text-primary"></i>
29
+ </button>
30
+ </div>
17
31
  </div>
18
- <div class="d-flex flex-grow-1 flex-column w-100">
19
- <div class="text-xs placeholder col-3">&nbsp;</div>
20
- <div class="text-sm placeholder col-11">&nbsp;</div>
21
- <div class="text-xs placeholder col-4">&nbsp;</div>
22
- </div>
23
- </li>
24
- <li class="dropdown-item rounded-1 p-2 d-flex gap-2 placeholder-wave">
25
- <div class="main-avatar">
26
- <div class="placeholder" style="width: 32px; height: 32px;"></div>
27
- </div>
28
- <div class="d-flex flex-grow-1 flex-column w-100">
29
- <div class="text-xs placeholder col-3">&nbsp;</div>
30
- <div class="text-sm placeholder col-11">&nbsp;</div>
31
- <div class="text-xs placeholder col-4">&nbsp;</div>
32
- </div>
33
- </li>
34
- <li class="dropdown-item rounded-1 p-2 d-flex gap-2 placeholder-wave">
35
- <div class="main-avatar">
36
- <div class="placeholder" style="width: 32px; height: 32px;"></div>
37
- </div>
38
- <div class="d-flex flex-grow-1 flex-column w-100">
39
- <div class="text-xs placeholder col-3">&nbsp;</div>
40
- <div class="text-sm placeholder col-11">&nbsp;</div>
41
- <div class="text-xs placeholder col-4">&nbsp;</div>
42
- </div>
43
- </li>
44
- </ul>
32
+ </div>
33
+ </div>
45
34
  </li>
46
35
  <li class="dropdown-divider"></li>
47
- <li class="notif-dropdown-link">
36
+ <li>
48
37
  <div class="d-flex justify-content-center gap-1 flex-wrap">
49
38
  <a component="chats/mark-all-read" role="button" href="#" class="btn btn-sm btn-light mark-all-read flex-fill text-nowrap text-truncate ff-secondary"><i class="fa fa-check-double"></i> [[modules:chat.mark_all_read]]</a>
50
39
  <!-- on md and up see all chats button goes to last room -->
@@ -1,4 +1,4 @@
1
- <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative" title="[[global:header.drafts]]">
1
+ <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative">
2
2
  <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
3
3
  <span class="position-relative">
4
4
  <i component="drafts/icon" class="fa fa-fw fa-pen-to-square unread-count"></i>
@@ -10,43 +10,51 @@
10
10
  </a>
11
11
  <ul class="drafts-dropdown dropdown-menu p-1 shadow">
12
12
  <li>
13
- <ul component="drafts/list" class="draft-list list-unstyled d-flex flex-column gap-1 pe-1">
14
- <li class="no-drafts text-center p-2">[[modules:composer.no-drafts]]</li>
15
-
16
- {{{ each drafts }}}
17
- {{{ if !@first}}}
18
- <hr class="m-0"/>
19
- {{{ end }}}
20
- <li class="" data-save-id="{./save_id}">
21
- <div class="d-flex gap-1 justify-content-between ff-base">
22
- <div class="dropdown-item rounded-1 p-2 d-flex flex-column gap-2 pointer" component="drafts/open" data-save-id="{./save_id}">
23
- {{{ if (./action == "topics.post") }}}
24
- {{{ if ./title}}}
25
- <div class="text text-xs fw-semibold line-clamp-2 text-break">{./title}</div>
26
- {{{ end }}}
27
- {{{ end }}}
13
+ <div component="drafts/list" class="list-container draft-list list-unstyled d-flex flex-column overscroll-behavior-contain gap-1 pe-1">
14
+ <div class="dropdown-item rounded-1 p-2 d-flex gap-2 placeholder-wave">
15
+ <div class="d-flex flex-grow-1 flex-column w-100">
16
+ <div class="text-xs placeholder col-3">&nbsp;</div>
17
+ <div class="text-sm placeholder col-11">&nbsp;</div>
18
+ <div class="text-xs placeholder col-4">&nbsp;</div>
19
+ </div>
20
+ </div>
21
+ <div class="hidden no-drafts text-center p-2">[[modules:composer.no-drafts]]</div>
22
+ <div class="draft-item-container">
23
+ {{{ each drafts }}}
24
+ {{{ if !@first}}}
25
+ <hr class="my-1"/>
26
+ {{{ end }}}
27
+ <div data-save-id="{./save_id}">
28
+ <div class="d-flex gap-1 justify-content-between ff-base">
29
+ <div class="dropdown-item rounded-1 p-2 d-flex flex-column gap-2 pointer" component="drafts/open" data-save-id="{./save_id}">
30
+ {{{ if (./action == "topics.post") }}}
31
+ {{{ if ./title}}}
32
+ <div class="text text-xs fw-semibold line-clamp-2 text-break">{./title}</div>
33
+ {{{ end }}}
34
+ {{{ end }}}
28
35
 
29
- {{{ if (./action == "posts.reply") }}}
30
- <div class="text text-xs fw-semibold line-clamp-2 text-break">[[topic:composer.replying_to, "{./title}"]]</div>
31
- {{{ end }}}
36
+ {{{ if (./action == "posts.reply") }}}
37
+ <div class="text text-xs fw-semibold line-clamp-2 text-break">[[topic:composer.replying_to, "{./title}"]]</div>
38
+ {{{ end }}}
32
39
 
33
- {{{ if (./action == "posts.edit") }}}
34
- <div class="text text-xs fw-semibold line-clamp-2">[[topic:composer.editing]]</div>
35
- {{{ end }}}
40
+ {{{ if (./action == "posts.edit") }}}
41
+ <div class="text text-xs fw-semibold line-clamp-2">[[topic:composer.editing]]</div>
42
+ {{{ end }}}
36
43
 
37
- {{{ if ./text }}}
38
- <div class="text text-sm line-clamp-3">{./text}</div>
39
- {{{ end }}}
40
- <div class="timeago text-xs text-muted" title="{./timestampISO}"></div>
41
- </div>
42
- <div class="">
43
- <button component="drafts/delete" data-save-id="{./save_id}" class="btn btn-light btn-sm">
44
- <i class="unread fa fa-xs fa-trash text-secondary"></i>
45
- </button>
44
+ {{{ if ./text }}}
45
+ <div class="text text-sm line-clamp-3 text-break">{./text}</div>
46
+ {{{ end }}}
47
+ <div class="timeago text-xs text-muted" title="{./timestampISO}"></div>
48
+ </div>
49
+ <div>
50
+ <button component="drafts/delete" data-save-id="{./save_id}" class="btn btn-light btn-sm">
51
+ <i class="unread fa fa-xs fa-trash text-secondary"></i>
52
+ </button>
53
+ </div>
46
54
  </div>
47
55
  </div>
48
- </li>
49
- {{{ end }}}
50
- </ul>
56
+ {{{ end }}}
57
+ </div>
58
+ </div>
51
59
  </li>
52
60
  </ul>
@@ -1,23 +1,23 @@
1
- <li id="user_label" class="nav-item mx-2 dropstart usermenu" title="[[global:header.profile]]">
1
+ <li id="user_label" class="nav-item mx-2 dropstart usermenu" title="{user.username}">
2
2
  <!-- IMPORT partials/sidebar/user-menu.tpl -->
3
3
  </li>
4
4
 
5
5
  {{{ if config.searchEnabled }}}
6
- <li component="sidebar/search" class="nav-item mx-2 search dropstart position-relative">
6
+ <li component="sidebar/search" class="nav-item mx-2 search dropstart position-relative" title="[[global:header.search]]">
7
7
  <!-- IMPORT partials/sidebar/search.tpl -->
8
8
  </li>
9
9
  {{{ end }}}
10
10
 
11
- <li component="notifications" class="nav-item mx-2 notifications dropstart">
11
+ <li component="notifications" class="nav-item mx-2 notifications dropstart" title="[[global:header.notifications]]">
12
12
  <!-- IMPORT partials/sidebar/notifications.tpl -->
13
13
  </li>
14
14
 
15
15
  {{{ if canChat }}}
16
- <li class="nav-item mx-2 chats dropstart">
16
+ <li class="nav-item mx-2 chats dropstart" title="[[global:header.chats]]">
17
17
  <!-- IMPORT partials/sidebar/chats.tpl -->
18
18
  </li>
19
19
  {{{ end }}}
20
20
 
21
- <li component="sidebar/drafts" class="nav-item mx-2 drafts dropstart">
21
+ <li component="sidebar/drafts" class="nav-item mx-2 drafts dropstart" title="[[global:header.drafts]]">
22
22
  <!-- IMPORT partials/sidebar/drafts.tpl -->
23
23
  </li>
@@ -1,5 +1,5 @@
1
1
 
2
- <li class="nav-item mx-2" title="[[global:login]]">
2
+ <li class="nav-item mx-2 order-last order-md-first" title="[[global:login]]">
3
3
  <a class="nav-link nav-btn" href="{relative_path}/login">
4
4
  <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
5
5
  <span class="position-relative">
@@ -1,25 +1,46 @@
1
- <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative" title="[[global:header.notifications]]">
1
+ <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn d-flex gap-2 justify-content-between align-items-center position-relative">
2
2
  <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
3
3
  <span class="position-relative">
4
4
  <i component="notifications/icon" class="fa fa-fw {{{ if unreadCount.notification}}}fa-bell{{{ else }}}fa-bell-o{{{ end }}} unread-count" data-content="{unreadCount.notification}"></i>
5
5
  <span component="notifications/count" class="visible-closed position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !unreadCount.notification }}}hidden{{{ end }}}">{unreadCount.notification}</span>
6
6
  </span>
7
- <span class="nav-text small visible-open fw-semibold">[[global:header.notifications]]</span>
7
+ <span class="nav-text small visible-open fw-semibold truncate-text">[[global:header.notifications]]</span>
8
8
  </span>
9
9
  <span component="notifications/count" class="visible-open badge rounded-1 bg-primary {{{ if !unreadCount.notification }}}hidden{{{ end }}}">{unreadCount.notification}</span>
10
10
  </a>
11
11
  <ul class="notifications-dropdown dropdown-menu p-1 shadow">
12
12
  <li>
13
- <ul component="notifications/list" class="notification-list list-unstyled">
14
- <li class="mb-2 placeholder-wave">
15
- <div class="text-sm placeholder col-11">&nbsp;</div>
16
- <div class="text-sm placeholder col-5">&nbsp;</div><br />
17
- <div class="text-xs placeholder col-3">&nbsp;</div>
13
+ <ul component="notifications/list" class="list-container notification-list list-unstyled overscroll-behavior-contain ff-base">
14
+ <li class="mb-2 p-1">
15
+ <div class="d-flex gap-1 justify-content-between">
16
+ <div class="d-flex gap-2 flex-grow-1 placeholder-wave">
17
+ <div class="placeholder" style="width: 32px; height: 32px;"></div>
18
+ <div class="flex-grow-1">
19
+ <div class="d-flex flex-column">
20
+ <div class="text-sm">
21
+ <span class="placeholder placeholder-sm col-4"></span>
22
+ <span class="placeholder placeholder-sm col-6"></span>
23
+ <span class="placeholder placeholder-sm col-7"></span>
24
+ <span class="placeholder placeholder-sm col-2"></span>
25
+ <span class="placeholder placeholder-sm col-5"></span>
26
+ </div>
27
+ <div class="text-xs">
28
+ <div class="placeholder placeholder-xs col-6"></div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+ </div>
33
+ <div>
34
+ <button class="mark-read btn-ghost-sm" style="width: 1.5rem; height: 1.5rem;">
35
+ <i class="unread fa fa-2xs fa-circle text-primary"></i>
36
+ </button>
37
+ </div>
38
+ </div>
18
39
  </li>
19
40
  </ul>
20
41
  </li>
21
42
  <li class="dropdown-divider"></li>
22
- <li class="notif-dropdown-link">
43
+ <li>
23
44
  <div class="d-flex justify-content-center gap-1 flex-wrap">
24
45
  <a role="button" href="#" class="btn btn-sm btn-light mark-all-read flex-fill text-nowrap text-truncate ff-secondary"><i class="fa fa-check-double"></i> [[notifications:mark_all_read]]</a>
25
46
  <a class="btn btn-sm btn-primary flex-fill text-nowrap text-truncate ff-secondary" href="{relative_path}/notifications"><i class="fa fa-list"></i> [[notifications:see_all]]</a>
@@ -1,4 +1,4 @@
1
- <a component="search/button" id="search-button" href="#" role="button" class="nav-link nav-btn d-flex gap-2 align-items-center text-truncate" data-bs-toggle="dropdown" title="[[global:header.search]]">
1
+ <a component="search/button" id="search-button" href="#" role="button" class="nav-link nav-btn d-flex gap-2 align-items-center text-truncate" data-bs-toggle="dropdown">
2
2
  <span>
3
3
  <i class="fa fa-search fa-fw"></i>
4
4
  </span>