nodebb-theme-harmony 1.0.0 → 1.0.1

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 (155) hide show
  1. package/README.md +12 -1
  2. package/languages/en-GB/harmony.json +6 -1
  3. package/library.js +56 -25
  4. package/package.json +1 -1
  5. package/plugin.json +0 -1
  6. package/public/harmony.js +165 -41
  7. package/public/settings.js +1 -0
  8. package/screenshots/categories.png +0 -0
  9. package/screenshots/recent.png +0 -0
  10. package/screenshots/topic.png +0 -0
  11. package/scss/account.scss +1 -1
  12. package/scss/chats.scss +81 -26
  13. package/scss/common.scss +84 -10
  14. package/scss/flags.scss +5 -0
  15. package/scss/groups.scss +2 -2
  16. package/scss/harmony.scss +3 -0
  17. package/scss/mixins.scss +7 -3
  18. package/scss/modals.scss +5 -3
  19. package/scss/modules/bottom-sheet.scss +1 -1
  20. package/scss/modules/composer.scss +0 -4
  21. package/scss/modules/cover.scss +1 -11
  22. package/scss/modules/filters.scss +8 -0
  23. package/scss/modules/paginator.scss +24 -0
  24. package/scss/modules/tags.scss +2 -2
  25. package/scss/modules/topic-navigator.scss +18 -42
  26. package/scss/modules/topics-list.scss +32 -17
  27. package/scss/modules/user-menu.scss +6 -0
  28. package/scss/overrides.scss +4 -1
  29. package/scss/sidebar.scss +61 -8
  30. package/scss/topic.scss +36 -13
  31. package/templates/account/blocks.tpl +35 -40
  32. package/templates/account/categories.tpl +47 -29
  33. package/templates/account/consent.tpl +66 -10
  34. package/templates/account/edit/password.tpl +25 -30
  35. package/templates/account/edit/username.tpl +21 -26
  36. package/templates/account/edit.tpl +105 -116
  37. package/templates/account/followers.tpl +12 -19
  38. package/templates/account/following.tpl +12 -18
  39. package/templates/account/groups.tpl +12 -17
  40. package/templates/account/info.tpl +178 -206
  41. package/templates/account/posts.tpl +31 -36
  42. package/templates/account/profile.tpl +82 -72
  43. package/templates/account/sessions.tpl +8 -30
  44. package/templates/account/settings.tpl +222 -203
  45. package/templates/account/theme.tpl +39 -25
  46. package/templates/account/topics.tpl +36 -38
  47. package/templates/account/uploads.tpl +33 -40
  48. package/templates/admin/plugins/harmony.tpl +21 -3
  49. package/templates/categories.tpl +3 -6
  50. package/templates/category.tpl +13 -14
  51. package/templates/chats.tpl +9 -10
  52. package/templates/flags/detail.tpl +160 -193
  53. package/templates/flags/list.tpl +3 -70
  54. package/templates/footer.tpl +2 -2
  55. package/templates/groups/details.tpl +22 -19
  56. package/templates/groups/list.tpl +1 -1
  57. package/templates/groups/members.tpl +0 -2
  58. package/templates/header.tpl +2 -2
  59. package/templates/login.tpl +4 -4
  60. package/templates/notifications.tpl +5 -5
  61. package/templates/partials/account/admin-menu.tpl +9 -9
  62. package/templates/partials/account/category-item.tpl +14 -17
  63. package/templates/partials/account/footer.tpl +3 -0
  64. package/templates/partials/account/header.tpl +78 -81
  65. package/templates/partials/account/session-list.tpl +18 -0
  66. package/templates/partials/account/sidebar-left.tpl +31 -25
  67. package/templates/partials/breadcrumbs.tpl +6 -6
  68. package/templates/partials/buttons/newTopic.tpl +1 -1
  69. package/templates/partials/categories/item.tpl +31 -27
  70. package/templates/partials/categories/lastpost.tpl +7 -7
  71. package/templates/partials/category/filter-dropdown-content.tpl +37 -0
  72. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +7 -7
  73. package/templates/partials/category/sort.tpl +22 -7
  74. package/templates/partials/category/subcategory.tpl +2 -3
  75. package/templates/partials/category/tags.tpl +0 -2
  76. package/templates/partials/category/tools.tpl +28 -25
  77. package/templates/partials/category/watch.tpl +39 -6
  78. package/templates/partials/chats/dropdown.tpl +4 -1
  79. package/templates/partials/chats/message-window.tpl +12 -8
  80. package/templates/partials/chats/message.tpl +8 -10
  81. package/templates/partials/chats/options.tpl +14 -6
  82. package/templates/partials/chats/recent_room.tpl +41 -32
  83. package/templates/partials/cookie-consent.tpl +5 -5
  84. package/templates/partials/flags/bulk-actions.tpl +9 -0
  85. package/templates/partials/flags/filters.tpl +165 -78
  86. package/templates/partials/flags/results.tpl +38 -0
  87. package/templates/partials/groups/admin.tpl +4 -4
  88. package/templates/partials/groups/badge.tpl +1 -1
  89. package/templates/partials/groups/invited.tpl +1 -1
  90. package/templates/partials/groups/list.tpl +2 -2
  91. package/templates/partials/groups/memberlist.tpl +2 -2
  92. package/templates/partials/groups/sidebar-left.tpl +10 -10
  93. package/templates/partials/header/brand.tpl +9 -2
  94. package/templates/partials/mobile-footer.tpl +69 -61
  95. package/templates/partials/notifications_list.tpl +11 -8
  96. package/templates/partials/paginator.tpl +11 -9
  97. package/templates/partials/post_bar.tpl +26 -24
  98. package/templates/partials/posts_list_item.tpl +5 -5
  99. package/templates/partials/quick-search-results.tpl +3 -3
  100. package/templates/partials/search-filters.tpl +184 -0
  101. package/templates/partials/search-results.tpl +28 -35
  102. package/templates/partials/sidebar/chats.tpl +26 -34
  103. package/templates/partials/sidebar/drafts.tpl +45 -34
  104. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  105. package/templates/partials/sidebar/logged-out-menu.tpl +1 -1
  106. package/templates/partials/sidebar/notifications.tpl +30 -9
  107. package/templates/partials/sidebar/search-mobile.tpl +1 -1
  108. package/templates/partials/sidebar/search.tpl +1 -1
  109. package/templates/partials/sidebar/user-menu.tpl +38 -29
  110. package/templates/partials/sidebar-left.tpl +14 -11
  111. package/templates/partials/sidebar-right.tpl +1 -3
  112. package/templates/partials/skin-switcher.tpl +3 -3
  113. package/templates/partials/tags/filter-dropdown-content.tpl +34 -0
  114. package/templates/partials/tags_list.tpl +4 -4
  115. package/templates/partials/topic/browsing-users.tpl +0 -2
  116. package/templates/partials/topic/event.tpl +1 -1
  117. package/templates/partials/topic/navigation-post.tpl +5 -9
  118. package/templates/partials/topic/navigator-mobile.tpl +62 -0
  119. package/templates/partials/topic/navigator.tpl +23 -17
  120. package/templates/partials/topic/post-editor.tpl +0 -2
  121. package/templates/partials/topic/post-menu-list.tpl +60 -62
  122. package/templates/partials/topic/post-menu.tpl +16 -11
  123. package/templates/partials/topic/post.tpl +45 -27
  124. package/templates/partials/topic/quickreply.tpl +8 -8
  125. package/templates/partials/topic/reply-button.tpl +7 -7
  126. package/templates/partials/topic/sort.tpl +17 -5
  127. package/templates/partials/topic/tools.tpl +2 -2
  128. package/templates/partials/topic/topic-menu-list.tpl +22 -24
  129. package/templates/partials/topic/watch.tpl +42 -9
  130. package/templates/partials/topic-filters.tpl +6 -3
  131. package/templates/partials/topic-list-bar.tpl +50 -46
  132. package/templates/partials/topic-terms.tpl +6 -3
  133. package/templates/partials/topics_list.tpl +88 -93
  134. package/templates/partials/userFilter-placeholders.tpl +5 -0
  135. package/templates/partials/users/filter-dropdown-content.tpl +23 -0
  136. package/templates/partials/users/item.tpl +25 -27
  137. package/templates/partials/users_list.tpl +1 -1
  138. package/templates/popular.tpl +3 -1
  139. package/templates/post-queue.tpl +166 -0
  140. package/templates/recent.tpl +3 -2
  141. package/templates/register.tpl +4 -4
  142. package/templates/search.tpl +39 -177
  143. package/templates/tags.tpl +3 -3
  144. package/templates/top.tpl +3 -1
  145. package/templates/topic.tpl +74 -68
  146. package/templates/unread.tpl +3 -1
  147. package/templates/users.tpl +7 -3
  148. package/templates/modules/usercard.tpl +0 -39
  149. package/templates/partials/acceptTos.tpl +0 -11
  150. package/templates/partials/category-filter-content.tpl +0 -30
  151. package/templates/partials/category-filter-right.tpl +0 -5
  152. package/templates/partials/category-filter.tpl +0 -3
  153. package/templates/partials/category-selector-right.tpl +0 -5
  154. package/templates/partials/category-selector.tpl +0 -3
  155. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,6 +1,6 @@
1
1
  {{{each tags}}}
2
- <h5 class="tag-container fw-bold d-flex">
3
- <a class="text-truncate" href="{config.relative_path}/tags/{tags.valueEncoded}" data-tag="{tags.valueEscaped}"><span class="tag-item text-muted text-uppercase text-nowrap tag-class-{tags.class} me-2" data-tag="{tags.valueEscaped}">{tags.valueEscaped}</span></a>
4
- <span class="tag-topic-count text-primary text-nowrap human-readable-number" title="{tags.score}">{tags.score}</span>
5
- </h5>
2
+ <a href="{config.relative_path}/tags/{./valueEncoded}" data-tag="{./valueEscaped}" class="btn-ghost flex-column gap-0 align-items-start justify-content-start text-truncate p-2 ff-base">
3
+ <div class="fw-semibold text-nowrap tag-item w-100 text-truncate">{./valueEscaped}</div>
4
+ <div class="text-xs text-muted text-nowrap tag-topic-count">[[global:x-topics, {./score}]]</div>
5
+ </a>
6
6
  {{{end}}}
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- This partial intentionally left blank; overwritten by nodebb-plugin-browsing-users -->
@@ -2,7 +2,7 @@
2
2
  <div class="timeline-badge">
3
3
  <i class="fa {{{ if ./icon }}}{./icon}{{{ else }}}fa-circle{{{ end }}} small"></i>
4
4
  </div>
5
- <span class="timeline-text small">
5
+ <span class="timeline-text small d-flex align-items-center gap-1 flex-wrap">
6
6
  {./text}
7
7
  </span>
8
8
  {{{ if privileges.isAdminOrMod }}}
@@ -1,14 +1,10 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="clearfix">
4
- <div class="icon float-start">
5
- <a href="<!-- IF post.user.userslug -->{config.relative_path}/user/{post.user.userslug}<!-- ELSE -->#<!-- ENDIF post.user.userslug -->">
6
- {buildAvatar(post.user, "24px", true, "", "user/picture")} {post.user.username}
1
+ <div class="d-flex gap-2 mb-2 justify-content-between align-items-center flex-nowrap">
2
+ <div class="icon text-truncate">
3
+ <a href="{{{ if post.user.userslug }}}{config.relative_path}/user/{post.user.userslug}{{{else }}}#{{{ end }}}">
4
+ {buildAvatar(post.user, "24px", true)} {post.user.username}
7
5
  </a>
8
6
  </div>
9
- <small class="float-end">
10
- <span class="timeago" title="{post.timestampISO}"></span>
11
- </small>
7
+ <span class="timeago text-nowrap text-sm" title="{post.timestampISO}"></span>
12
8
  </div>
13
9
 
14
10
  <div>{post.content}</div>
@@ -0,0 +1,62 @@
1
+ <div class="d-flex w-100">
2
+ <div class="pagination-block text-bg-light m-2 rounded-1 border border-gray-300 w-100" style="height:30px;">
3
+ <div class="position-relative">
4
+ <div class="progress-bar rounded-1 bg-info d-block position-absolute" style="height:28px;"></div>
5
+ </div>
6
+ <div class="wrapper dropup-center d-flex align-items-center justify-content-between w-100 h-100" style="padding: 5px 0px;">
7
+ <div class="d-flex">
8
+ <div class="lh-1 px-2">
9
+ <i class="fa fa-angles-left pointer fa-fw pagetop fs-5" style="z-index: 1;"></i>
10
+ </div>
11
+ {{{ if config.usePagination }}}
12
+ <div class="lh-1 px-2">
13
+ <i class="fa fa-angle-left pointer fa-fw pageprev fs-5" style="z-index: 1;"></i>
14
+ </div>
15
+ {{{ end }}}
16
+ </div>
17
+
18
+ <a href="#" class="text-reset dropdown-toggle d-inline-block px-3 text-decoration-none" data-bs-toggle="dropdown">
19
+ <span class="d-inline-flex gap-2 align-items-center pagination-text position-relative fw-bold"></span>
20
+ </a>
21
+
22
+ <div class="d-flex">
23
+ {{{ if config.usePagination }}}
24
+ <div class="lh-1 px-2">
25
+ <i class="fa fa-angle-right pointer fa-fw pagenext fs-5" style="z-index: 1;"></i>
26
+ </div>
27
+ {{{ end }}}
28
+ <div class="lh-1 px-2">
29
+ <i class="fa fa-angles-right pointer fa-fw pagebottom fs-5" style="z-index: 1;"></i>
30
+ </div>
31
+ </div>
32
+
33
+ <ul class="dropdown-menu p-0" role="menu" style="width: 100%;">
34
+ <li class="p-3">
35
+ <div class="row">
36
+ <div class="col-8 post-content overflow-hidden mb-3" style="height: 350px;"></div>
37
+ <div class="col-4 ps-0 text-end">
38
+ <div class="scroller-content">
39
+ <span class="pointer pagetop">[[topic:first-post]] <i class="fa fa-angle-double-up"></i></span>
40
+ <div class="scroller-container border-gray-200" style="height: 300px;">
41
+ <div class="scroller-thumb position-relative text-nowrap" style="height: 40px;">
42
+ <span class="thumb-text text-sm fw-bold user-select-none position-relative pe-2" style="top: -15px;"></span>
43
+ <div class="rounded-2 scroller-thumb-icon bg-primary d-inline-block position-relative" style="width: 9px; height:40px;"></div>
44
+ </div>
45
+ </div>
46
+ <span class="pointer pagebottom">[[topic:last-post]] <i class="fa fa-angle-double-down"></i></span>
47
+ </div>
48
+ </div>
49
+ </div>
50
+ <div class="row">
51
+ <div class="col-6">
52
+ <button id="myNextPostBtn" class="btn btn-outline-secondary form-control text-truncate" disabled>[[topic:go-to-my-next-post]]</button>
53
+ </div>
54
+ <div class="col-6">
55
+ <input type="number" class="form-control" id="indexInput" placeholder="[[global:pagination.enter_index]]">
56
+ </div>
57
+ </div>
58
+ </li>
59
+ </ul>
60
+ </div>
61
+ </div>
62
+ </div>
@@ -1,20 +1,26 @@
1
- <div class="d-sm-flex flex-column flex-grow-1 align-items-center mb-2 mx-2 mt-auto" component="topic/navigator">
2
- <a href="#" class="nav-link border-0 p-2" data-action="toTop"><i class="fa fa-fw fa-angles-up"></i></a>
3
- <a href="#" class="nav-link border-0 p-2" data-action="scrollUp"><i class="fa fa-fw fa-angle-up"></i></a>
4
- <div class="track d-inline-block flex-grow-1 position-relative">
5
- <div class="unread d-inline-block position-absolute">
6
- <div class="visible-open meta small position-absolute top-50 translate-middle-y text-nowrap fw-semibold">
7
- <a href="{url}"></a>
8
- </div>
9
- </div>
10
- <div class="handle d-inline-block position-absolute">
11
- <div class="knob d-inline-block rounded-circle translate-middle"></div>
12
- <div class="visible-open meta small position-absolute text-nowrap fw-semibold">
13
- <p class="index text-body mb-0"></p>
14
- <p class="timestamp text-secondary timeago mb-0"></p>
1
+ <div class="pagination-block d-none d-lg-block flex-grow-1 mb-2">
2
+ <div class="d-flex justify-content-end sticky-top mt-4" style="top:6rem;z-index:1;">
3
+ <div class="ps-1 ps-md-0 d-inline-block">
4
+ <div class="scroller-content d-flex gap-2 flex-column align-items-start">
5
+ <div class="pointer pagetop btn-ghost-sm d-inline-flex" style="padding: 4px;"><i class="fa fa-chevron-up"></i> <span class="timeago text-xs text-muted text-nowrap" title="{./timestampISO}"></span></div>
6
+ <div class="scroller-container position-relative">
7
+ <div class="scroller-thumb d-flex gap-2 text-nowrap position-relative" style="height: 40px;">
8
+ <div class="scroller-thumb-icon bg-primary rounded d-inline-block" style="width:9px; height: 40px;"></div>
9
+ <div>
10
+ <p class="small thumb-text d-none d-md-inline-block ff-secondary fw-semibold user-select-none mb-0"></p>
11
+ <p class="meta thumb-timestamp timeago text-xs text-muted ff-secondary fw-semibold mb-0 user-select-none"></p>
12
+ </div>
13
+ </div>
14
+
15
+ <div class="unread d-inline-block position-absolute bottom-0">
16
+ <div class="meta small position-absolute top-50 translate-middle-y text-nowrap fw-semibold ms-2">
17
+ <a class="text-decoration-none" href="{url}"></a>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ <div class="pointer pagebottom btn-ghost-sm d-inline-flex" style="padding: 4px;"><i class="fa fa-chevron-down"></i> <span class="timeago text-xs text-muted text-nowrap" title="{./lastposttimeISO}"></span></div>
15
22
  </div>
16
23
  </div>
17
24
  </div>
18
- <a href="#" class="nav-link border-0 p-2" data-action="scrollDown"><i class="fa fa-fw fa-angle-down"></i></a>
19
- <a href="#" class="nav-link border-0 p-2" data-action="toBottom"><i class="fa fa-fw fa-angles-down"></i></a>
20
- </div>
25
+ </div>
26
+
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <small data-editor="{editor.userslug}" component="post/editor" class="hidden">[[global:last_edited_by, {editor.username}]] <span class="timeago" title="{editedISO}"></span></small>
@@ -1,134 +1,132 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <!-- IF posts.display_moderator_tools -->
1
+ {{{ if posts.display_moderator_tools }}}
4
2
  <li>
5
- <a class="dropdown-item" component="post/edit" role="menuitem" tabindex="-1" href="#">
6
- <span class="menu-icon"><i class="fa fa-fw fa-pencil"></i></span> [[topic:edit]]
3
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/edit" role="menuitem" tabindex="-1" href="#">
4
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-pencil"></i></span> [[topic:edit]]
7
5
  </a>
8
6
  </li>
9
- <li <!-- IF posts.deleted -->hidden<!-- ENDIF posts.deleted -->>
10
- <a class="dropdown-item" component="post/delete" role="menuitem" tabindex="-1" href="#" class="<!-- IF posts.deleted -->hidden<!-- ENDIF posts.deleted -->">
11
- <span class="menu-icon"><i class="fa fa-fw fa-trash-o"></i><span> [[topic:delete]]
7
+ <li {{{ if posts.deleted }}}hidden{{{ end }}}>
8
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/delete" role="menuitem" tabindex="-1" href="#" class="{{{ if posts.deleted }}}hidden{{{ end }}}">
9
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-trash-o"></i></span> [[topic:delete]]
12
10
  </a>
13
11
  </li>
14
- <li <!-- IF !posts.deleted -->hidden<!-- ENDIF !posts.deleted -->>
15
- <a class="dropdown-item" component="post/restore" role="menuitem" tabindex="-1" href="#" class="<!-- IF !posts.deleted -->hidden<!-- ENDIF !posts.deleted -->">
16
- <span class="menu-icon"><i class="fa fa-fw fa-history"></i><span> [[topic:restore]]
12
+ <li {{{ if !posts.deleted }}}hidden{{{ end }}}>
13
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/restore" role="menuitem" tabindex="-1" href="#" class="{{{ if !posts.deleted }}}hidden{{{ end }}}">
14
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-history"></i></span> [[topic:restore]]
17
15
  </a>
18
16
  </li>
19
- <!-- IF posts.display_purge_tools -->
20
- <li <!-- IF !posts.deleted -->hidden<!-- ENDIF !posts.deleted -->>
21
- <a class="dropdown-item" component="post/purge" role="menuitem" tabindex="-1" href="#" class="<!-- IF !posts.deleted -->hidden<!-- ENDIF !posts.deleted -->">
22
- <span class="menu-icon"><i class="fa fa-fw fa-eraser"></i></span> [[topic:purge]]
17
+ {{{ if posts.display_purge_tools }}}
18
+ <li {{{ if !posts.deleted }}}hidden{{{ end }}}>
19
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/purge" role="menuitem" tabindex="-1" href="#" class="{{{ if !posts.deleted }}}hidden{{{ end }}}">
20
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-eraser"></i></span> [[topic:purge]]
23
21
  </a>
24
22
  </li>
25
- <!-- END -->
23
+ {{{ end }}}
26
24
 
27
- <!-- IF posts.display_move_tools -->
25
+ {{{ if posts.display_move_tools }}}
28
26
  <li>
29
- <a class="dropdown-item" component="post/move" role="menuitem" tabindex="-1" href="#">
30
- <span class="menu-icon"><i class="fa fa-fw fa-arrows"></i></span> [[topic:move]]
27
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/move" role="menuitem" tabindex="-1" href="#">
28
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-arrows"></i></span> [[topic:move]]
31
29
  </a>
32
30
  </li>
33
- <!-- ENDIF posts.display_move_tools -->
31
+ {{{ end }}}
34
32
 
35
- <!-- IF posts.display_change_owner_tools -->
33
+ {{{ if posts.display_change_owner_tools }}}
36
34
  <li>
37
- <a class="dropdown-item" component="post/change-owner" role="menuitem" tabindex="-1" href="#">
38
- <span class="menu-icon"><i class="fa fa-fw fa-user"></i></span> [[topic:change-owner]]
35
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/change-owner" role="menuitem" tabindex="-1" href="#">
36
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-user"></i></span> [[topic:change-owner]]
39
37
  </a>
40
38
  </li>
41
- <!-- ENDIF posts.display_change_owner_tools -->
39
+ {{{ end }}}
42
40
 
43
- <!-- IF posts.ip -->
41
+ {{{ if posts.ip }}}
44
42
  <li>
45
- <a class="dropdown-item" component="post/copy-ip" role="menuitem" tabindex="-1" href="#" data-clipboard-text="{posts.ip}">
46
- <span class="menu-icon" ><i class="fa fa-fw fa-copy"></i></span> [[topic:copy-ip]] {posts.ip}
43
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/copy-ip" role="menuitem" tabindex="-1" href="#" data-clipboard-text="{posts.ip}">
44
+ <span class="menu-icon" ><i class="fa fa-fw text-muted fa-copy"></i></span> [[topic:copy-ip]] {posts.ip}
47
45
  </a>
48
46
  </li>
49
- <!-- IF posts.display_ip_ban -->
47
+ {{{ if posts.display_ip_ban }}}
50
48
  <li>
51
- <a class="dropdown-item" component="post/ban-ip" role="menuitem" tabindex="-1" href="#" data-ip="{posts.ip}">
52
- <span class="menu-icon"><i class="fa fa-fw fa-ban"></i></span> [[topic:ban-ip]] {posts.ip}
49
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/ban-ip" role="menuitem" tabindex="-1" href="#" data-ip="{posts.ip}">
50
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-ban"></i></span> [[topic:ban-ip]] {posts.ip}
53
51
  </a>
54
52
  </li>
55
- <!-- ENDIF posts.display_ip_ban -->
56
- <!-- ENDIF posts.ip -->
57
- <!-- ENDIF posts.display_moderator_tools -->
53
+ {{{ end }}}
54
+ {{{ end }}}
55
+ {{{ end }}}
58
56
 
59
- {{{each posts.tools}}}
57
+ {{{ each posts.tools }}}
60
58
  <li {{{ if ./disabled }}}class="disabled" {{{ end }}}>
61
- <a class="dropdown-item" {{{ if ./action}}}component="{./action}"{{{ end }}} role="menuitem" tabindex="-1" href="{{{ if ./href }}}{./href}{{{ else }}}#{{{ end }}}">
62
- <span class="menu-icon"><i class="fa fa-fw {posts.tools.icon}"></i></span> {{posts.tools.html}}
59
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" {{{ if ./action}}}component="{./action}"{{{ end }}} role="menuitem" tabindex="-1" href="{{{ if ./href }}}{./href}{{{ else }}}#{{{ end }}}">
60
+ <span class="menu-icon"><i class="fa fa-fw text-muted {./icon}"></i></span> {{./html}}
63
61
  </a>
64
62
  </li>
65
- {{{end}}}
63
+ {{{ end }}}
66
64
 
67
- <!-- IF !posts.deleted -->
68
- <!-- IF posts.display_history -->
65
+ {{{ if !posts.deleted }}}
66
+ {{{ if (posts.display_history && privileges.posts:history)}}}
69
67
  <li>
70
- <a class="dropdown-item" component="post/view-history" role="menuitem" tabindex="-1" href="#">
71
- <span class="menu-icon"><i class="fa fa-fw fa-history"></i></span> [[topic:view-history]]
68
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/view-history" role="menuitem" tabindex="-1" href="#">
69
+ <span class="menu-icon"><i class="fa fa-fw text-muted fa-history"></i></span> [[topic:view-history]]
72
70
  </a>
73
71
  </li>
74
- <!-- END -->
72
+ {{{ end }}}
75
73
 
76
74
  {{{ if config.loggedIn }}}
77
75
  <li>
78
- <a class="dropdown-item" component="post/bookmark" role="menuitem" tabindex="-1" href="#" data-bookmarked="{posts.bookmarked}">
76
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/bookmark" role="menuitem" tabindex="-1" href="#" data-bookmarked="{posts.bookmarked}">
79
77
  <span class="menu-icon">
80
- <i component="post/bookmark/on" class="fa fa-fw fa-heart <!-- IF !posts.bookmarked -->hidden<!-- ENDIF !posts.bookmarked -->"></i>
81
- <i component="post/bookmark/off" class="fa fa-fw fa-heart-o <!-- IF posts.bookmarked -->hidden<!-- ENDIF posts.bookmarked -->"></i>
78
+ <i component="post/bookmark/on" class="fa fa-fw text-muted fa-bookmark {{{ if !posts.bookmarked }}}hidden{{{ end }}}"></i>
79
+ <i component="post/bookmark/off" class="fa fa-fw text-muted fa-bookmark-o {{{ if posts.bookmarked }}}hidden{{{ end }}}"></i>
82
80
  </span>
83
81
  <span class="bookmark-text">[[topic:bookmark]]</span>
84
- <span component="post/bookmark-count" class="bookmarkCount badge" data-bookmarks="{posts.bookmarks}">{posts.bookmarks}</span>&nbsp;
82
+ <span component="post/bookmark-count" class="bookmarkCount badge bg-secondary" data-bookmarks="{posts.bookmarks}">{posts.bookmarks}</span>&nbsp;
85
83
  </a>
86
84
  </li>
87
85
  {{{ end }}}
88
86
 
89
87
  <li>
90
- <a class="dropdown-item" role="menuitem" tabindex="-1" href="#" data-clipboard-text="{posts.absolute_url}">
91
- <i class="fa fa-fw fa-link"></i> [[topic:copy-permalink]]
88
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" tabindex="-1" href="#" data-clipboard-text="{posts.absolute_url}">
89
+ <i class="fa fa-fw text-muted fa-link"></i> [[topic:copy-permalink]]
92
90
  </a>
93
91
  </li>
94
92
 
95
- <!-- IF postSharing.length -->
96
- <!-- IF config.loggedIn --><li class="dropdown-divider"></li><!-- ENDIF config.loggedIn -->
93
+ {{{ if postSharing.length }}}
94
+ {{{ if config.loggedIn }}}<li class="dropdown-divider"></li>{{{ end }}}
97
95
  <li class="dropdown-header">[[topic:share_this_post]]</li>
98
- <!-- ENDIF postSharing.length -->
99
- {{{each postSharing}}}
96
+ {{{ end }}}
97
+ {{{ each postSharing }}}
100
98
  <li>
101
- <a class="dropdown-item" role="menuitem" component="share/{postSharing.id}" tabindex="-1" href="#"><span class="menu-icon"><i class="fa fa-fw {postSharing.class}"></i></span> {postSharing.name}</a>
99
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" component="share/{./id}" tabindex="-1" href="#"><span class="menu-icon"><i class="fa fa-fw text-muted {./class}"></i></span> {./name}</a>
102
100
  </li>
103
- {{{end}}}
104
- <!-- ENDIF !posts.deleted -->
101
+ {{{ end }}}
102
+ {{{ end }}}
105
103
 
106
104
  {{{ if posts.display_flag_tools }}}
107
105
  <li class="dropdown-divider"></li>
108
106
 
109
107
  <li {{{ if posts.flags.flagged }}}hidden{{{ end }}}>
110
- <a class="dropdown-item" component="post/flag" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw fa-flag"></i> [[topic:flag-post]]</a>
108
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/flag" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw text-muted fa-flag"></i> [[topic:flag-post]]</a>
111
109
  </li>
112
110
  <li {{{ if !posts.flags.flagged }}}hidden{{{ end }}} class="disabled text-muted">
113
- <a class="dropdown-item" component="post/already-flagged" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw fa-flag"></i> [[topic:already-flagged]]</a>
111
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/already-flagged" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw text-muted fa-flag"></i> [[topic:already-flagged]]</a>
114
112
  </li>
115
113
 
116
114
  {{{ if (!posts.selfPost && posts.uid) }}}
117
115
  <li>
118
- <a class="dropdown-item" component="post/flagUser" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw fa-flag"></i> [[topic:flag-user]]</a>
116
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/flagUser" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw text-muted fa-flag"></i> [[topic:flag-user]]</a>
119
117
  </li>
120
118
  {{{ end }}}
121
119
  {{{ end }}}
122
120
 
123
- <!-- IF posts.display_moderator_tools -->
121
+ {{{ if posts.display_moderator_tools }}}
124
122
  {{{ if posts.flags.exists }}}
125
123
  <li>
126
- <a class="dropdown-item" role="menuitem" tabindex="-1" href="{config.relative_path}/flags/{posts.flags.flagId}"><i class="fa fa-fw fa-exclamation-circle"></i> [[topic:view-flag-report]]</a>
124
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" role="menuitem" tabindex="-1" href="{config.relative_path}/flags/{posts.flags.flagId}"><i class="fa fa-fw text-muted fa-exclamation-circle"></i> [[topic:view-flag-report]]</a>
127
125
  </li>
128
126
  {{{ if (posts.flags.state == "open") }}}
129
127
  <li>
130
- <a class="dropdown-item" component="post/flagResolve" data-flagId="{posts.flags.flagId}" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw fa-check"></i> [[topic:resolve-flag]]</a>
128
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/flagResolve" data-flagId="{posts.flags.flagId}" role="menuitem" tabindex="-1" href="#"><i class="fa fa-fw text-muted fa-check"></i> [[topic:resolve-flag]]</a>
131
129
  </li>
132
130
  {{{ end }}}
133
131
  {{{ end }}}
134
- <!-- ENDIF posts.display_moderator_tools -->
132
+ {{{ end }}}
@@ -1,25 +1,30 @@
1
1
  <span component="post/tools" class="dropdown moderator-tools bottom-sheet d-inline-block {{{ if !./display_post_menu }}}hidden{{{ end }}}">
2
2
  <a class="btn-ghost-sm dropdown-toggle d-block" href="#" data-bs-toggle="dropdown"><i class="fa fa-fw fa-ellipsis-v text-primary"></i></a>
3
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
3
+ <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
4
4
  <li class="dropdown-item placeholder-wave">
5
- <div class="placeholder" style="width: 20px;">&nbsp;</div>
6
- <div class="placeholder col-3">&nbsp;</div>
5
+ <div class="placeholder" style="width: 20px;"></div>
6
+ <div class="placeholder col-3"></div>
7
7
  </li>
8
8
  <li class="dropdown-item placeholder-wave">
9
- <div class="placeholder" style="width: 20px;">&nbsp;</div>
10
- <div class="placeholder col-5">&nbsp;</div>
9
+ <div class="placeholder" style="width: 20px;"></div>
10
+ <div class="placeholder col-5"></div>
11
11
  </li>
12
12
  <li class="dropdown-item placeholder-wave">
13
- <div class="placeholder" style="width: 20px;">&nbsp;</div>
14
- <div class="placeholder col-11">&nbsp;</div>
13
+ <div class="placeholder" style="width: 20px;"></div>
14
+ <div class="placeholder col-9"></div>
15
15
  </li>
16
16
  <li class="dropdown-item placeholder-wave">
17
- <div class="placeholder" style="width: 20px;">&nbsp;</div>
18
- <div class="placeholder col-7">&nbsp;</div>
17
+ <div class="placeholder" style="width: 20px;"></div>
18
+ <div class="placeholder col-7"></div>
19
19
  </li>
20
20
  <li class="dropdown-item placeholder-wave">
21
- <div class="placeholder" style="width: 20px;">&nbsp;</div>
22
- <div class="placeholder col-12">&nbsp;</div>
21
+ <div class="placeholder" style="width: 20px;"></div>
22
+ <div class="placeholder col-10"></div>
23
+ </li>
24
+ <li class="dropdown-divider"></li>
25
+ <li class="dropdown-item placeholder-wave">
26
+ <div class="placeholder" style="width: 20px;"></div>
27
+ <div class="placeholder col-10"></div>
23
28
  </li>
24
29
  </ul>
25
30
  </span>
@@ -1,22 +1,30 @@
1
+ {{{ if (!./index && widgets.mainpost-header.length) }}}
2
+ <div data-widget-area="mainpost-header">
3
+ {{{ each widgets.mainpost-header }}}
4
+ {widgets.mainpost-header.html}
5
+ {{{ end }}}
6
+ </div>
7
+ {{{ end }}}
8
+
1
9
  <div class="d-flex align-items-start gap-3">
2
10
  <div class="icon py-1 bg-body d-none d-sm-block">
3
11
  <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
4
12
  {buildAvatar(posts.user, "48px", true, "", "user/picture")}
5
- <span component="user/status" class="position-absolute translate-middle-y badge border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
13
+ <span component="user/status" class="position-absolute translate-middle-y border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
6
14
  </a>
7
15
  </div>
8
16
 
9
- <div class="d-flex flex-grow-1 flex-column w-100" style="min-width: 0;">
10
- <div class="d-flex align-items-center gap-1 flex-wrap w-100 post-header mt-1">
17
+ <div class="post-container d-flex flex-grow-1 flex-column w-100" style="min-width: 0;">
18
+ <div class="d-flex align-items-center gap-1 flex-wrap w-100 post-header mt-1" itemprop="author" itemscope itemtype="https://schema.org/Person">
11
19
  <div class="icon bg-body d-sm-none">
12
20
  <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
13
21
  {buildAvatar(posts.user, "20px", true, "", "user/picture")}
14
- <span component="user/status" class="position-absolute translate-middle-y badge border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
22
+ <span component="user/status" class="position-absolute translate-middle-y border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
15
23
  </a>
16
24
  </div>
17
25
 
18
26
  <span class="text-nowrap">
19
- <a class="fw-bold" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="author" data-username="{posts.user.username}" data-uid="{posts.user.uid}">{posts.user.displayname}</a>
27
+ <a class="fw-bold" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" itemprop="name" data-username="{posts.user.username}" data-uid="{posts.user.uid}">{posts.user.displayname}</a>
20
28
  </span>
21
29
 
22
30
  {{{ each posts.user.selectedGroups }}}
@@ -25,19 +33,18 @@
25
33
  {{{ end }}}
26
34
  {{{ end }}}
27
35
 
28
- <!-- IF posts.user.banned -->
36
+ {{{ if posts.user.banned }}}
29
37
  <span class="badge bg-danger rounded-1">[[user:banned]]</span>
30
- <!-- ENDIF posts.user.banned -->
31
-
32
- <div class="d-flex gap-1 hidden-xs align-items-center">
33
- {{{ if posts.toPid }}}
34
- <span class="text-muted">replied to</span><!-- FIX THIS, DOES NOT l10n PROPERLY -->
35
- <a component="post/parent" data-topid="{posts.toPid}" href="{config.relative_path}/post/{posts.toPid}"><!-- IF posts.parent.username -->{posts.parent.username}<!-- ELSE -->[[global:guest]]<!-- ENDIF posts.parent.username --></a>
36
- {{{ else }}}
37
- <span class="text-muted">wrote</span><!-- FIX THIS, DOES NOT l10n PROPERLY -->
38
- {{{ end }}}
38
+ {{{ end }}}
39
39
 
40
- <a class="permalink text-muted" href="{config.relative_path}/post/{posts.pid}"><span class="timeago" title="{posts.timestampISO}"></span></a>
40
+ <div class="d-flex gap-1 align-items-center">
41
+ <span class="text-muted">
42
+ {{{ if posts.toPid }}}
43
+ {generateRepliedTo(@value, config.timeagoCutoff)}
44
+ {{{ else }}}
45
+ {generateWrote(@value, config.timeagoCutoff)}
46
+ {{{ end }}}
47
+ </span>
41
48
 
42
49
  <i component="post/edit-indicator" class="fa fa-edit text-muted{{{ if privileges.posts:history }}} pointer{{{ end }}} edit-icon {{{ if !posts.editor.username }}}hidden{{{ end }}}" title="[[global:edited-timestamp, {./editedISO}]]"></i>
43
50
  <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">[[global:last_edited_by, {posts.editor.username}]] <span class="timeago" title="{posts.editedISO}"></span></span>
@@ -45,16 +52,17 @@
45
52
 
46
53
  <div>
47
54
  <span>
48
- <!-- IF posts.user.custom_profile_info.length -->
55
+ {{{ if posts.user.custom_profile_info.length }}}
49
56
  &#124;
50
- {{{each posts.user.custom_profile_info}}}
57
+ {{{ each posts.user.custom_profile_info }}}
51
58
  {posts.user.custom_profile_info.content}
52
- {{{end}}}
53
- <!-- ENDIF posts.user.custom_profile_info.length -->
59
+ {{{ end }}}
60
+ {{{ end }}}
54
61
  </span>
55
62
  </div>
56
63
  <div class="d-flex align-items-center gap-1 flex-grow-1 justify-content-end">
57
64
  <span class="bookmarked opacity-0 text-primary"><i class="fa fa-bookmark-o"></i></span>
65
+ <a href="{config.relative_path}/post/{./pid}" class="post-index text-muted d-none d-md-inline">#{increment(./index, "1")}</a>
58
66
  </div>
59
67
  </div>
60
68
 
@@ -74,7 +82,7 @@
74
82
  <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center mt-2 btn-outline border rounded-1 p-1 threaded-replies user-select-none float-start text-muted text-decoration-none {{{ if !posts.replies.count }}}hidden{{{ end }}}">
75
83
  <span component="post/reply-count/avatars" class="avatars d-inline-flex gap-1 align-items-top {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
76
84
  {{{each posts.replies.users}}}
77
- <span>{buildAvatar(posts.replies.users, "20px", true, "")}</span>
85
+ <span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
78
86
  {{{end}}}
79
87
  {{{ if posts.replies.hasMore}}}
80
88
  <span><i class="fa fa-ellipsis"></i></span>
@@ -95,20 +103,22 @@
95
103
 
96
104
  <div component="post/actions" class="d-flex justify-content-end gap-1 post-tools">
97
105
  <!-- IMPORT partials/topic/reactions.tpl -->
98
- <a component="post/reply" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-reply text-primary"></i></a>
99
- <a component="post/quote" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-quote-right text-primary"></i></a>
106
+ <a component="post/reply" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-fw fa-reply text-primary"></i></a>
107
+ <a component="post/quote" href="#" class="btn-ghost-sm user-select-none {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
100
108
 
101
109
  {{{ if !reputation:disabled }}}
102
110
  <div class="d-flex votes align-items-stretch">
103
111
  <a component="post/upvote" href="#" class="btn-ghost-sm {{{ if posts.upvoted }}}upvoted{{{ end }}}">
104
- <i class="fa fa-chevron-up text-primary"></i>
112
+ <i class="fa fa-fw fa-chevron-up text-primary"></i>
105
113
  </a>
106
114
 
107
- <div class="d-inline-block px-3 btn-ghost-sm" component="post/vote-count" data-votes="{posts.votes}">{posts.votes}</div>
115
+ <meta itemprop="upvoteCount" content="{posts.upvotes}">
116
+ <meta itemprop="downvoteCount" content="{posts.downvotes}">
117
+ <div class="d-inline-block px-2 mx-1 btn-ghost-sm" component="post/vote-count" data-votes="{posts.votes}">{posts.votes}</div>
108
118
 
109
119
  {{{ if !downvote:disabled }}}
110
120
  <a component="post/downvote" href="#" class="btn-ghost-sm {{{ if posts.downvoted }}}downvoted{{{ end }}}">
111
- <i class="fa fa-chevron-down text-primary"></i>
121
+ <i class="fa fa-fw fa-chevron-down text-primary"></i>
112
122
  </a>
113
123
  {{{ end }}}
114
124
  </div>
@@ -116,4 +126,12 @@
116
126
 
117
127
  <!-- IMPORT partials/topic/post-menu.tpl -->
118
128
  </div>
119
- </div>
129
+ </div>
130
+
131
+ {{{ if (!./index && widgets.mainpost-footer.length) }}}
132
+ <div data-widget-area="mainpost-footer">
133
+ {{{ each widgets.mainpost-footer }}}
134
+ {widgets.mainpost-footer.html}
135
+ {{{ end }}}
136
+ </div>
137
+ {{{ end }}}
@@ -1,22 +1,22 @@
1
- <!-- IF privileges.topics:reply -->
2
- <div component="topic/quickreply/container" class="quick-reply d-flex gap-3">
1
+ {{{ if privileges.topics:reply }}}
2
+ <div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
3
3
  <div class="icon hidden-xs">
4
- <a class="d-inline-block position-relative" href="<!-- IF loggedInUser.userslug -->{config.relative_path}/user/{loggedInUser.userslug}<!-- ELSE -->#<!-- ENDIF loggedInUser.userslug -->">
4
+ <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
5
  {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
6
- {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute translate-middle-y badge border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
6
+ {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute translate-middle-y border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
7
7
  </a>
8
8
  </div>
9
9
  <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
10
10
  <input type="hidden" name="tid" value="{tid}" />
11
11
  <input type="hidden" name="_csrf" value="{config.csrf_token}" />
12
- <div class="quickreply-message">
12
+ <div class="quickreply-message position-relative">
13
13
  <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
14
14
  <div class="imagedrop"><div>[[topic:composer.drag_and_drop_images]]</div></div>
15
15
  </div>
16
16
  <div>
17
- <div class="btn-group">
17
+ <div class="d-flex justify-content-end gap-2">
18
+ <button type="submit" component="topic/quickreply/expand" class="btn btn-sm btn-outline" formmethod="get"><i class="fa fa-expand"></i></button>
18
19
  <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">[[topic:post-quick-reply]]</button>
19
- <button type="submit" component="topic/quickreply/expand" class="btn btn-sm btn-primary" formmethod="get"><i class="fa fa-expand"></i></button>
20
20
  </div>
21
21
  </div>
22
22
  </form>
@@ -25,4 +25,4 @@
25
25
  </form>
26
26
 
27
27
  </div>
28
- <!-- ENDIF privileges.topics:reply -->
28
+ {{{ end }}}