nodebb-theme-harmony 0.0.1 → 0.0.3

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 (139) hide show
  1. package/languages/en-GB/harmony.json +5 -0
  2. package/library.js +101 -26
  3. package/package.json +5 -2
  4. package/plugin.json +14 -2
  5. package/public/harmony.js +101 -0
  6. package/scss/account.scss +38 -0
  7. package/scss/chats.scss +72 -0
  8. package/scss/common.scss +65 -0
  9. package/scss/fonts.scss +17 -0
  10. package/scss/groups.scss +30 -0
  11. package/scss/harmony.scss +23 -3
  12. package/scss/header.scss +16 -0
  13. package/scss/mixins.scss +183 -0
  14. package/scss/modals.scss +4 -0
  15. package/scss/modules/bottom-sheet.scss +52 -0
  16. package/scss/modules/breadcrumbs.scss +16 -0
  17. package/scss/modules/composer.scss +21 -0
  18. package/scss/modules/cover.scss +115 -0
  19. package/scss/modules/tags.scss +6 -0
  20. package/scss/modules/topic-navigator.scss +61 -0
  21. package/scss/modules/topics-list.scss +20 -0
  22. package/scss/modules/user-menu.scss +5 -0
  23. package/scss/overrides.scss +65 -0
  24. package/scss/sidebar.scss +125 -0
  25. package/scss/skins.scss +13 -0
  26. package/scss/status.scss +25 -0
  27. package/scss/topic.scss +128 -0
  28. package/templates/account/best.tpl +0 -2
  29. package/templates/account/blocks.tpl +31 -26
  30. package/templates/account/bookmarks.tpl +0 -2
  31. package/templates/account/categories.tpl +1 -3
  32. package/templates/account/controversial.tpl +0 -2
  33. package/templates/account/downvoted.tpl +0 -2
  34. package/templates/account/followers.tpl +14 -10
  35. package/templates/account/following.tpl +14 -10
  36. package/templates/account/groups.tpl +13 -11
  37. package/templates/account/ignored.tpl +0 -2
  38. package/templates/account/posts.tpl +29 -10
  39. package/templates/account/profile.tpl +76 -159
  40. package/templates/account/topics.tpl +32 -21
  41. package/templates/account/uploads.tpl +38 -35
  42. package/templates/account/upvoted.tpl +0 -2
  43. package/templates/account/watched.tpl +0 -2
  44. package/templates/admin/plugins/harmony.tpl +17 -0
  45. package/templates/categories.tpl +5 -5
  46. package/templates/category.tpl +26 -26
  47. package/templates/chat.tpl +9 -9
  48. package/templates/chats.tpl +5 -7
  49. package/templates/footer.tpl +11 -7
  50. package/templates/groups/details.tpl +74 -64
  51. package/templates/groups/list.tpl +19 -14
  52. package/templates/header.tpl +34 -21
  53. package/templates/login.tpl +51 -45
  54. package/templates/partials/account/admin-menu.tpl +36 -0
  55. package/templates/partials/account/category-item.tpl +17 -17
  56. package/templates/partials/account/header.tpl +77 -35
  57. package/templates/partials/account/sidebar-left.tpl +82 -0
  58. package/templates/partials/breadcrumbs.tpl +4 -12
  59. package/templates/partials/categories/item.tpl +48 -44
  60. package/templates/partials/categories/lastpost.tpl +17 -19
  61. package/templates/partials/categories/link.tpl +5 -13
  62. package/templates/partials/category/sort.tpl +4 -7
  63. package/templates/partials/category/subcategory.tpl +4 -4
  64. package/templates/partials/category/tools.tpl +6 -9
  65. package/templates/partials/category/watch.tpl +7 -11
  66. package/templates/partials/category-filter-content.tpl +5 -6
  67. package/templates/partials/category-filter.tpl +0 -2
  68. package/templates/partials/category-selector-content.tpl +4 -5
  69. package/templates/partials/category-selector.tpl +0 -2
  70. package/templates/partials/chats/dropdown.tpl +24 -32
  71. package/templates/partials/chats/message-window.tpl +7 -7
  72. package/templates/partials/chats/message.tpl +34 -34
  73. package/templates/partials/chats/recent_room.tpl +16 -29
  74. package/templates/partials/chats/system-message.tpl +4 -4
  75. package/templates/partials/chats/user.tpl +1 -3
  76. package/templates/partials/groups/admin.tpl +82 -183
  77. package/templates/partials/groups/badge.tpl +1 -3
  78. package/templates/partials/groups/invited.tpl +33 -0
  79. package/templates/partials/groups/list.tpl +14 -21
  80. package/templates/partials/groups/memberlist.tpl +28 -24
  81. package/templates/partials/groups/pending.tpl +30 -0
  82. package/templates/partials/groups/sidebar-left.tpl +27 -0
  83. package/templates/partials/mobile-footer.tpl +70 -0
  84. package/templates/partials/notifications_list.tpl +19 -27
  85. package/templates/partials/paginator.tpl +22 -24
  86. package/templates/partials/post_bar.tpl +23 -18
  87. package/templates/partials/posts_list.tpl +0 -2
  88. package/templates/partials/posts_list_item.tpl +14 -29
  89. package/templates/partials/quick-search-results.tpl +36 -25
  90. package/templates/partials/search-results.tpl +4 -1
  91. package/templates/partials/sidebar/chats.tpl +53 -0
  92. package/templates/partials/sidebar/drafts.tpl +41 -0
  93. package/templates/partials/sidebar/logged-out-menu.tpl +38 -0
  94. package/templates/partials/sidebar/notifications.tpl +28 -0
  95. package/templates/partials/sidebar/search-mobile.tpl +29 -0
  96. package/templates/partials/sidebar/search.tpl +30 -0
  97. package/templates/partials/sidebar/user-menu.tpl +87 -0
  98. package/templates/partials/sidebar-left.tpl +40 -0
  99. package/templates/partials/sidebar-right.tpl +41 -0
  100. package/templates/partials/skin-switcher.tpl +35 -0
  101. package/templates/partials/tags_list.tpl +0 -2
  102. package/templates/partials/toast.tpl +6 -8
  103. package/templates/partials/topic/event.tpl +4 -20
  104. package/templates/partials/topic/navigator.tpl +20 -41
  105. package/templates/partials/topic/necro-post.tpl +5 -4
  106. package/templates/partials/topic/post-menu.tpl +23 -2
  107. package/templates/partials/topic/post-placeholder.tpl +15 -0
  108. package/templates/partials/topic/post.tpl +67 -64
  109. package/templates/partials/topic/quickreply.tpl +12 -14
  110. package/templates/partials/topic/reactions.tpl +0 -2
  111. package/templates/partials/topic/reply-button.tpl +16 -20
  112. package/templates/partials/topic/selection-tooltip.tpl +0 -2
  113. package/templates/partials/topic/sort.tpl +8 -6
  114. package/templates/partials/topic/stats.tpl +15 -14
  115. package/templates/partials/topic/tag.tpl +1 -3
  116. package/templates/partials/topic/tags.tpl +1 -5
  117. package/templates/partials/topic/tools.tpl +13 -0
  118. package/templates/partials/topic/watch.tpl +15 -13
  119. package/templates/partials/topic-filters.tpl +4 -5
  120. package/templates/partials/topic-list-bar.tpl +54 -0
  121. package/templates/partials/topic-terms.tpl +4 -5
  122. package/templates/partials/topics_list.tpl +109 -100
  123. package/templates/partials/users/item.tpl +7 -0
  124. package/templates/partials/users_list.tpl +11 -60
  125. package/templates/partials/users_list_menu.tpl +10 -18
  126. package/templates/popular.tpl +1 -18
  127. package/templates/recent.tpl +8 -24
  128. package/templates/register.tpl +74 -60
  129. package/templates/tag.tpl +3 -15
  130. package/templates/tags.tpl +3 -4
  131. package/templates/top.tpl +1 -18
  132. package/templates/topic.tpl +39 -43
  133. package/templates/unread.tpl +1 -22
  134. package/templates/users.tpl +17 -17
  135. package/templates/admin/plugins/persona.tpl +0 -29
  136. package/templates/partials/account/menu.tpl +0 -103
  137. package/templates/partials/header/user-menu.tpl +0 -87
  138. package/templates/partials/menu.tpl +0 -188
  139. package/templates/partials/thread_tools.tpl +0 -10
@@ -0,0 +1,30 @@
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]]">
2
+ <span>
3
+ <i class="fa fa-search fa-fw"></i>
4
+ </span>
5
+ <span class="nav-text small visible-open fw-semibold">[[global:search]]</span>
6
+ </a>
7
+ <div class="search-dropdown dropdown-menu p-2 shadow">
8
+ <form component="search/form" id="search-form" class="d-flex justify-content-end align-items-center" role="search" method="GET">
9
+ <div component="search/fields" class="w-100" id="search-fields">
10
+ <div class="d-flex gap-1">
11
+ <input autocomplete="off" type="text" class="form-control" placeholder="[[global:search]]" name="query" value="">
12
+
13
+ <div class="nav-btn d-flex justify-content-center align-items-center advanced-search-link">
14
+ <i class="fa fa-gears fa-fw text-muted"></i>
15
+ </div>
16
+ </div>
17
+
18
+ <div id="quick-search-container" class="quick-search-container d-block mt-2 hidden">
19
+ <div class="form-check filter-category mb-2 ms-2">
20
+ <input class="form-check-input" type="checkbox" checked>
21
+ <label class="form-check-label name text-sm"></label>
22
+ </div>
23
+
24
+ <div class="text-center loading-indicator"><i class="fa fa-spinner fa-spin"></i></div>
25
+ <div class="quick-search-results-container"></div>
26
+ </div>
27
+ <button type="submit" class="btn btn-outline-secondary hide">[[global:search]]</button>
28
+ </div>
29
+ </form>
30
+ </div>
@@ -0,0 +1,87 @@
1
+ <label class="nav-link nav-btn text-truncate d-flex gap-2 align-items-center" data-bs-toggle="dropdown" id="user_dropdown" role="button">
2
+ {buildAvatar(user, "20px", true)}
3
+ <span id="user-header-name" class="nav-text small visible-open fw-semibold">{user.username}</span>
4
+ </label>
5
+ <ul id="user-control-list" component="header/usercontrol" class="dropdown-menu shadow p-1 text-sm" aria-labelledby="user_dropdown">
6
+ <li>
7
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-1" component="header/profilelink" href="{relative_path}/user/{user.userslug}">
8
+ <div class="text-center"><span component="user/status" class="badge border border-white border-2 rounded-circle status {user.status}"><span class="visually-hidden">[[global:{user.status}]]</span></span></div>
9
+ <span class="fw-semibold" component="header/username">{user.username}</span>
10
+ </a>
11
+ </li>
12
+ <li role="presentation" class="dropdown-divider"></li>
13
+ <li><h6 class="dropdown-header text-xs">[[global:status]]</h6></li>
14
+ <li>
15
+ <a href="#" class="dropdown-item rounded-1 user-status d-flex align-items-center gap-1" data-status="online">
16
+ <div class="text-center"><span component="user/status" class="badge border border-white border-2 rounded-circle status online"><span class="visually-hidden">[[global:online]]</span></span></div>
17
+ <span{{{ if user.online }}} class="fw-semibold"{{{ end }}}> [[global:online]]</span>
18
+ </a>
19
+ </li>
20
+ <li>
21
+ <a href="#" class="dropdown-item rounded-1 user-status d-flex align-items-center gap-1" data-status="away">
22
+ <div class="text-center"><span component="user/status" class="badge border border-white border-2 rounded-circle status away"><span class="visually-hidden">[[global:away]]</span></span></div>
23
+ <span{{{ if user.away}}} class="fw-semibold"{{{ end }}}> [[global:away]]</span>
24
+ </a>
25
+ </li>
26
+ <li>
27
+ <a href="#" class="dropdown-item rounded-1 user-status d-flex align-items-center gap-1" data-status="dnd">
28
+ <div class="text-center"><span component="user/status" class="badge border border-white border-2 rounded-circle status dnd"><span class="visually-hidden">[[global:dnd]]</span></span></div>
29
+ <span{{{ if user.dnd}}} class="fw-semibold"{{{ end }}}> [[global:dnd]]</span>
30
+ </a>
31
+ </li>
32
+ <li>
33
+ <a href="#" class="dropdown-item rounded-1 user-status d-flex align-items-center gap-1" data-status="offline">
34
+ <div class="text-center"><span component="user/status" class="badge border border-white border-2 rounded-circle status offline"><span class="visually-hidden">[[global:invisible]]</span></span></div>
35
+ <span{{{ if user.offline}}} class="fw-semibold"{{{ end }}}> [[global:invisible]]</span>
36
+ </a>
37
+ </li>
38
+ <li role="presentation" class="dropdown-divider"></li>
39
+ <li>
40
+ <a class="dropdown-item rounded-1" component="header/profilelink/edit" href="{relative_path}/user/{user.userslug}/edit">
41
+ <i class="fa fa-fw fa-edit"></i> <span>[[user:edit-profile]]</span>
42
+ </a>
43
+ </li>
44
+ <li>
45
+ <a class="dropdown-item rounded-1" component="header/profilelink/settings" href="{relative_path}/user/{user.userslug}/settings">
46
+ <i class="fa fa-fw fa-gear"></i> <span>[[user:settings]]</span>
47
+ </a>
48
+ </li>
49
+ {{{ if showModMenu }}}
50
+ <li role="presentation" class="dropdown-divider"></li>
51
+ <li><h6 class="dropdown-header text-xs">[[pages:moderator-tools]]</h6></li>
52
+ <li>
53
+ <a class="dropdown-item rounded-1" href="{relative_path}/flags">
54
+ <i class="fa fa-fw fa-flag"></i> <span>[[pages:flagged-content]]</span>
55
+ </a>
56
+ </li>
57
+ <li>
58
+ <a class="dropdown-item rounded-1" href="{relative_path}/post-queue">
59
+ <i class="fa fa-fw fa-list-alt"></i> <span>[[pages:post-queue]]</span>
60
+ </a>
61
+ </li>
62
+ <li>
63
+ <a class="dropdown-item rounded-1" href="{relative_path}/ip-blacklist">
64
+ <i class="fa fa-fw fa-ban"></i> <span>[[pages:ip-blacklist]]</span>
65
+ </a>
66
+ </li>
67
+ {{{ else }}}
68
+ {{{ if postQueueEnabled }}}
69
+ <li>
70
+ <a class="dropdown-item rounded-1" href="{relative_path}/post-queue">
71
+ <i class="fa fa-fw fa-list-alt"></i> <span>[[pages:post-queue]]</span>
72
+ </a>
73
+ </li>
74
+ {{{ end }}}
75
+ {{{ end }}}
76
+
77
+ <li role="presentation" class="dropdown-divider"></li>
78
+ <li component="user/logout">
79
+ <form method="post" action="{relative_path}/logout">
80
+ <input type="hidden" name="_csrf" value="{config.csrf_token}">
81
+ <input type="hidden" name="noscript" value="true">
82
+ <button type="submit" class="dropdown-item rounded-1">
83
+ <i class="fa fa-fw fa-sign-out"></i><span> [[global:logout]]</span>
84
+ </button>
85
+ </form>
86
+ </li>
87
+ </ul>
@@ -0,0 +1,40 @@
1
+ <nav class="text-dark bg-light sidebar sidebar-left vh-100 d-none d-md-flex flex-column justify-content-between sticky-top ff-secondary">
2
+ <ul id="main-nav" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2">
3
+ {{{ each navigation }}}
4
+ <!-- IF function.displayMenuItem, @index -->
5
+ <li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
6
+ <a class="nav-link nav-btn navigation-link d-flex gap-2 justify-content-between align-items-center {{{ if navigation.dropdown }}}dropdown-toggle{{{ end }}}"
7
+ {{{ if ./dropdown }}} href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" {{{ else }}} href="{./route}"{{{ end }}} {{{ if ./id }}}id="{./id}"{{{ end }}}{{{ if ./targetBlank }}} target="_blank"{{{ end }}}>
8
+ <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
9
+ <span class="position-relative">
10
+ {{{ if ./iconClass }}}
11
+ <i class="fa fa-fw {./iconClass}" data-content="{./content}"></i>
12
+ <span component="navigation/count" class="visible-closed position-absolute top-0 start-100 translate-middle badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
13
+ {{{ end }}}
14
+ </span>
15
+ {{{ if navigation.text }}}
16
+ <span class="nav-text small visible-open fw-semibold text-truncate">{navigation.text}</span>
17
+ {{{ end }}}
18
+ </span>
19
+ <span component="navigation/count" class="visible-open badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
20
+ </a>
21
+ {{{ if navigation.dropdown }}}
22
+ <ul class="dropdown-menu shadow">
23
+ {navigation.dropdownContent}
24
+ </ul>
25
+ {{{ end }}}
26
+ </li>
27
+ <!-- ENDIF function.displayMenuItem -->
28
+ {{{end}}}
29
+ </ul>
30
+ <div class="w-100">
31
+ <!-- IMPORT partials/skin-switcher.tpl -->
32
+ <div class="sidebar-toggle m-2">
33
+ <a href="#" role="button" component="sidebar/toggle" class="nav-btn d-flex gap-2 align-items-center p-2 pointer nav-link w-100 text-nowrap">
34
+ <i class="fa fa-fw fa-angles-right"></i>
35
+ <i class="fa fa-fw fa-angles-left"></i>
36
+ <span class="nav-text visible-open fw-semibold small lh-1">[[harmony:collapse]]</span>
37
+ </a>
38
+ </div>
39
+ </div>
40
+ </nav>
@@ -0,0 +1,41 @@
1
+ <nav class="text-dark bg-light sidebar sidebar-right vh-100 d-none d-md-flex flex-column sticky-top ff-secondary">
2
+ {{{ if config.loggedIn }}}
3
+ <ul id="logged-in-menu" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2">
4
+ <li id="user_label" class="nav-item mx-2 dropstart usermenu" title="[[global:header.profile]]">
5
+ <!-- IMPORT partials/sidebar/user-menu.tpl -->
6
+ </li>
7
+
8
+ {{{ if config.searchEnabled }}}
9
+ <li component="sidebar/search" class="nav-item mx-2 search dropstart position-relative">
10
+ <!-- IMPORT partials/sidebar/search.tpl -->
11
+ </li>
12
+ {{{ end }}}
13
+
14
+ <li component="notifications" class="nav-item mx-2 notifications dropstart">
15
+ <!-- IMPORT partials/sidebar/notifications.tpl -->
16
+ </li>
17
+
18
+ {{{ if canChat }}}
19
+ <li class="nav-item mx-2 chats dropstart">
20
+ <!-- IMPORT partials/sidebar/chats.tpl -->
21
+ </li>
22
+ {{{ end }}}
23
+
24
+ <li component="sidebar/drafts" class="nav-item mx-2 drafts dropstart">
25
+ <!-- IMPORT partials/sidebar/drafts.tpl -->
26
+ </li>
27
+ </ul>
28
+ {{{ else }}}
29
+ <ul id="logged-out-menu" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2">
30
+ <!-- IMPORT partials/sidebar/logged-out-menu.tpl -->
31
+ </ul>
32
+ {{{ end }}}
33
+
34
+ <!-- IMPORT partials/topic/navigator.tpl -->
35
+
36
+ <div class="visible-open small text-secondary mt-auto" data-widget-area="sidebar-footer">
37
+ {{{each widgets.sidebar-footer}}}
38
+ {{./html}}
39
+ {{{end}}}
40
+ </div>
41
+ </nav>
@@ -0,0 +1,35 @@
1
+ <div class="dropend m-2" component="skinSwitcher">
2
+ <a data-bs-toggle="dropdown" href="#" role="button" class="nav-link nav-btn position-relative" title="[[harmony:skins]]">
3
+ <span class="justify-content-between w-100">
4
+ <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
5
+ <span>
6
+ <i component="skinSwitcher/icon" class="fa fa-fw fa-paintbrush"></i>
7
+ </span>
8
+ <span class="nav-text small visible-open fw-semibold">[[harmony:skins]]</span>
9
+ </span>
10
+ </span>
11
+ </a>
12
+
13
+ <ul class="dropdown-menu overflow-auto">
14
+ <div class="d-flex px-2">
15
+ <div>
16
+ <li class="dropdown-header">Light</li>
17
+ <div class="d-grid" style="grid-template-columns: 1fr 1fr;">
18
+ {{{ each bootswatchSkinOptions.light }}}
19
+ <li>
20
+ <a href="#" class="dropdown-item rounded-1" data-value="{./value}">{./name} <i class="fa fa-fw fa-check {{{ if !./selected }}} invisible {{{ end }}}"></i></a>
21
+ </li>
22
+ {{{ end }}}
23
+ </div>
24
+ </div>
25
+ <div>
26
+ <li class="dropdown-header">Dark</li>
27
+ {{{ each bootswatchSkinOptions.dark }}}
28
+ <li>
29
+ <a href="#" class="dropdown-item rounded-1" data-value="{./value}">{./name} <i class="fa fa-fw fa-check {{{ if !./selected }}} invisible {{{ end }}}"></i></a>
30
+ </li>
31
+ {{{ end }}}
32
+ </div>
33
+ </div>
34
+ </ul>
35
+ </div>
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  {{{each tags}}}
4
2
  <h5 class="float-start tag-container me-4 mb-4 fw-bold">
5
3
  <a 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><span class="tag-topic-count text-primary text-nowrap human-readable-number" title="{tags.score}">{tags.score}</span></a>
@@ -1,16 +1,14 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div id="{alert_id}" role="alert" class="alert alert-dismissible alert-{type}" component="toaster/toast">
4
2
  <button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-label="close"></button>
5
- <!-- IF image -->
3
+ {{{ if image }}}
6
4
  <img src="{image}">
7
- <!-- ENDIF image -->
5
+ {{{ end }}}
8
6
 
9
- <!-- IF title -->
7
+ {{{ if title }}}
10
8
  <strong>{title}</strong>
11
- <!-- ENDIF title -->
9
+ {{{ end }}}
12
10
 
13
- <!-- IF message -->
11
+ {{{ if message }}}
14
12
  <p>{message}</p>
15
- <!-- ENDIF message -->
13
+ {{{ end }}}
16
14
  </div>
@@ -1,28 +1,12 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <li component="topic/event" class="timeline-event text-muted" data-topic-event-id="{./id}" data-topic-event-type="{./type}">
1
+ <li component="topic/event" class="timeline-event text-muted d-flex gap-2 pt-4" data-topic-event-id="{./id}" data-topic-event-type="{./type}">
4
2
  <div class="timeline-badge">
5
- <i class="fa {{{ if ./icon }}}{./icon}{{{ else }}}fa-circle{{{ end }}}"></i>
3
+ <i class="fa {{{ if ./icon }}}{./icon}{{{ else }}}fa-circle{{{ end }}} small"></i>
6
4
  </div>
7
- <span class="timeline-text">
8
- {{{ if ./href}}}
9
- <a href="{config.relative_path}{./href}">{./text}</a>
10
- {{{ else }}}
5
+ <span class="timeline-text small">
11
6
  {./text}
12
- {{{ end }}}
13
- &nbsp;
14
7
  </span>
15
- {{{ if ./user }}}
16
- {{{ if ./user.system }}}
17
- <span class="timeline-text">[[global:system-user]]</span>&nbsp;
18
- {{{ else }}}
19
- <span><a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true)} &nbsp; {./user.username}</a></span>&nbsp;
20
- {{{ end }}}
21
- {{{ end }}}
22
- <span class="timeago timeline-text" title="{./timestampISO}"></span>
23
-
24
8
  {{{ if privileges.isAdminOrMod }}}
25
- &nbsp;<span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
9
+ <span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
26
10
  {{{ end }}}
27
11
  </li>
28
12
 
@@ -1,41 +1,20 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="pagination-block text-center">
4
- <div class="progress-bar"></div>
5
- <div class="wrapper dropup">
6
- <i class="fa fa-2x fa-angle-double-up pointer fa-fw pagetop"></i>
7
-
8
- <a href="#" class="dropdown-toggle d-inline-block" data-bs-toggle="dropdown" data-bs-reference="parent">
9
- <span class="pagination-text"></span>
10
- </a>
11
-
12
- <i class="fa fa-2x fa-angle-double-down pointer fa-fw pagebottom"></i>
13
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
14
- <li>
15
- <div class="row">
16
- <div class="col-8 post-content"></div>
17
- <div class="col-4 text-end">
18
- <div class="scroller-content">
19
- <span class="pointer pagetop">[[topic:first-post]] <i class="fa fa-angle-double-up"></i></span>
20
- <div class="scroller-container">
21
- <div class="scroller-thumb">
22
- <span class="thumb-text"></span>
23
- <div class="scroller-thumb-icon"></div>
24
- </div>
25
- </div>
26
- <span class="pointer pagebottom">[[topic:last-post]] <i class="fa fa-angle-double-down"></i></span>
27
- </div>
28
- </div>
29
- </div>
30
- <div class="row">
31
- <div class="col-6">
32
- <button id="myNextPostBtn" class="btn btn-outline-secondary form-control" disabled>[[topic:go-to-my-next-post]]</button>
33
- </div>
34
- <div class="col-6">
35
- <input type="number" class="form-control" id="indexInput" placeholder="[[global:pagination.enter_index]]">
36
- </div>
37
- </div>
38
- </li>
39
- </ul>
40
- </div>
41
- </div>
1
+ <div class="d-none 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="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="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>
15
+ </div>
16
+ </div>
17
+ </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>
@@ -1,5 +1,6 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <li component="topic/necro-post" class="necro-post text-muted timeline-event">
4
- <span class="timeline-text">{text}</span>
1
+ <li component="topic/necro-post" class="necro-post text-muted timeline-event d-flex gap-2 pt-4">
2
+ <div class="timeline-badge">
3
+ <i class="fa fa-clock small"></i>
4
+ </div>
5
+ <span class="timeline-text small fw-semibold">{text}</span>
5
6
  </li>
@@ -1,6 +1,27 @@
1
1
  <!-- THIS FILE IS STILL PERSONA -->
2
2
 
3
3
  <span component="post/tools" class="dropdown moderator-tools bottom-sheet d-inline-block<!-- IF !posts.display_post_menu -->hidden<!-- ENDIF !posts.display_post_menu -->">
4
- <a class="dropdown-toggle d-block" href="#" data-bs-toggle="dropdown"><i class="fa fa-fw fa-ellipsis-v"></i></a>
5
- <ul class="dropdown-menu dropdown-menu-end" role="menu"></ul>
4
+ <a class="btn btn-link dropdown-toggle d-block" href="#" data-bs-toggle="dropdown"><i class="fa fa-fw fa-ellipsis-v"></i></a>
5
+ <ul class="dropdown-menu dropdown-menu-end" role="menu">
6
+ <li class="dropdown-item placeholder-wave">
7
+ <div class="placeholder" style="width: 20px;">&nbsp;</div>
8
+ <div class="placeholder col-3">&nbsp;</div>
9
+ </li>
10
+ <li class="dropdown-item placeholder-wave">
11
+ <div class="placeholder" style="width: 20px;">&nbsp;</div>
12
+ <div class="placeholder col-5">&nbsp;</div>
13
+ </li>
14
+ <li class="dropdown-item placeholder-wave">
15
+ <div class="placeholder" style="width: 20px;">&nbsp;</div>
16
+ <div class="placeholder col-11">&nbsp;</div>
17
+ </li>
18
+ <li class="dropdown-item placeholder-wave">
19
+ <div class="placeholder" style="width: 20px;">&nbsp;</div>
20
+ <div class="placeholder col-7">&nbsp;</div>
21
+ </li>
22
+ <li class="dropdown-item placeholder-wave">
23
+ <div class="placeholder" style="width: 20px;">&nbsp;</div>
24
+ <div class="placeholder col-12">&nbsp;</div>
25
+ </li>
26
+ </ul>
6
27
  </span>
@@ -0,0 +1,15 @@
1
+ <div class="d-flex align-items-start gap-3">
2
+ <div class="icon py-1 bg-body d-none d-sm-block">
3
+ <div class="placeholder bg-secondary rounded-circle" style="width: 48px; height: 48px;"></div>
4
+ </div>
5
+
6
+ <div class="d-flex flex-grow-1 flex-column placeholder-wave">
7
+ <div class="d-flex align-items-center gap-1 flex-wrap w-100 post-header mt-1">
8
+ <div class="placeholder bg-secondary rounded-1 col-2">&nbsp;</div>
9
+ </div>
10
+
11
+ <div class="content mt-2 placeholder bg-secondary rounded-1 col-5" component="post/content" itemprop="text">
12
+ <p>&nbsp;</p>
13
+ </div>
14
+ </div>
15
+ </div>
@@ -1,18 +1,23 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="clearfix post-header">
4
- <div class="icon float-start">
5
- <a href="<!-- IF posts.user.userslug -->{config.relative_path}/user/{posts.user.userslug}<!-- ELSE -->#<!-- ENDIF posts.user.userslug -->">
1
+ <div class="d-flex align-items-start gap-3">
2
+ <div class="icon py-1 bg-body d-none d-sm-block">
3
+ <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
6
4
  {buildAvatar(posts.user, "48px", true, "", "user/picture")}
7
- <i component="user/status" class="fa fa-circle status {posts.user.status}" title="[[global:{posts.user.status}]]"></i>
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>
8
6
  </a>
9
7
  </div>
10
8
 
11
- <small class="d-flex">
12
- <div class="d-flex align-items-center gap-1 flex-wrap w-100">
13
- <strong class="text-nowrap">
14
- <a href="<!-- IF posts.user.userslug -->{config.relative_path}/user/{posts.user.userslug}<!-- ELSE -->#<!-- ENDIF posts.user.userslug -->" itemprop="author" data-username="{posts.user.username}" data-uid="{posts.user.uid}">{posts.user.displayname}</a>
15
- </strong>
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">
11
+ <div class="icon bg-body d-sm-none">
12
+ <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
13
+ {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>
15
+ </a>
16
+ </div>
17
+
18
+ <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>
20
+ </span>
16
21
 
17
22
  {{{ each posts.user.selectedGroups }}}
18
23
  {{{ if posts.user.selectedGroups.slug }}}
@@ -21,14 +26,24 @@
21
26
  {{{ end }}}
22
27
 
23
28
  <!-- IF posts.user.banned -->
24
- <span class="badge bg-danger">[[user:banned]]</span>
29
+ <span class="badge bg-danger rounded-1">[[user:banned]]</span>
25
30
  <!-- ENDIF posts.user.banned -->
26
31
 
27
- <span class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block">
28
- <!-- IF posts.toPid -->
29
- <a component="post/parent" class="btn btn-sm btn-outline-secondary hidden-xs" data-topid="{posts.toPid}" href="{config.relative_path}/post/{posts.toPid}"><i class="fa fa-reply"></i> @<!-- IF posts.parent.username -->{posts.parent.username}<!-- ELSE -->[[global:guest]]<!-- ENDIF posts.parent.username --></a>
30
- <!-- ENDIF posts.toPid -->
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 }}}
39
+
40
+ <a class="permalink text-muted" href="{config.relative_path}/post/{posts.pid}"><span class="timeago" title="{posts.timestampISO}"></span></a>
41
+
42
+ <i component="post/edit-indicator" class="fa fa-pencil-square<!-- IF privileges.posts:history --> pointer<!-- END --> edit-icon <!-- IF !posts.editor.username -->hidden<!-- ENDIF !posts.editor.username -->"></i>
43
+ <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>
44
+ </div>
31
45
 
46
+ <div>
32
47
  <span>
33
48
  <!-- IF posts.user.custom_profile_info.length -->
34
49
  &#124;
@@ -37,80 +52,68 @@
37
52
  {{{end}}}
38
53
  <!-- ENDIF posts.user.custom_profile_info.length -->
39
54
  </span>
40
- </span>
55
+ </div>
41
56
  <div class="d-flex align-items-center gap-1 flex-grow-1 justify-content-end">
42
- <span>
43
- <i component="post/edit-indicator" class="fa fa-pencil-square<!-- IF privileges.posts:history --> pointer<!-- END --> edit-icon <!-- IF !posts.editor.username -->hidden<!-- ENDIF !posts.editor.username -->"></i>
44
-
45
- <span data-editor="{posts.editor.userslug}" component="post/editor" class="hidden">[[global:last_edited_by, {posts.editor.username}]] <span class="timeago" title="{posts.editedISO}"></span></span>
46
-
47
- <span class="visible-xs-inline-block visible-sm-inline-block visible-md-inline-block visible-lg-inline-block">
48
- <a class="permalink text-muted" href="{config.relative_path}/post/{posts.pid}"><span class="timeago" title="{posts.timestampISO}"></span></a>
49
- </span>
50
- </span>
51
- <span class="bookmarked"><i class="fa fa-bookmark-o"></i></span>
57
+ <span class="bookmarked opacity-0 text-primary"><i class="fa fa-bookmark-o"></i></span>
52
58
  </div>
53
59
  </div>
54
- </small>
55
- </div>
56
-
57
- <br />
58
60
 
59
- <div class="content" component="post/content" itemprop="text">
60
- {posts.content}
61
+ <div class="content mt-2 text-break" component="post/content" itemprop="text">
62
+ {posts.content}
63
+ </div>
64
+ </div>
61
65
  </div>
62
66
 
63
- <div class="post-footer">
67
+ <div component="post/footer" class="post-footer border-bottom pb-2">
64
68
  {{{ if posts.user.signature }}}
65
- <div component="post/signature" data-uid="{posts.user.uid}" class="post-signature">{posts.user.signature}</div>
69
+ <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
66
70
  {{{ end }}}
67
71
 
68
72
  <div class="clearfix">
69
- {{{ if !hideReplies }}}
70
- <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="threaded-replies user-select-none float-start text-muted {{{ if !posts.replies.count }}}hidden{{{ end }}}">
71
- <span component="post/reply-count/avatars" class="avatars d-inline-flex gap-1 align-items-top hidden-xs {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
72
- {{{each posts.replies.users}}}
73
- <span>{buildAvatar(posts.replies.users, "16px", true, "")}</span>
74
- {{{end}}}
75
- {{{ if posts.replies.hasMore}}}
76
- <span><i class="fa fa-ellipsis"></i></span>
77
- {{{ end }}}
78
- </span>
73
+ {{{ if !hideReplies }}}
74
+ <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center mt-2 border rounded-1 p-1 threaded-replies user-select-none float-start text-muted text-decoration-none {{{ if !posts.replies.count }}}hidden{{{ end }}}">
75
+ <span component="post/reply-count/avatars" class="avatars d-inline-flex gap-1 align-items-top {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
76
+ {{{each posts.replies.users}}}
77
+ <span>{buildAvatar(posts.replies.users, "20px", true, "")}</span>
78
+ {{{end}}}
79
+ {{{ if posts.replies.hasMore}}}
80
+ <span><i class="fa fa-ellipsis"></i></span>
81
+ {{{ end }}}
82
+ </span>
79
83
 
80
- <span class="replies-count small" component="post/reply-count/text" data-replies="{posts.replies.count}">{posts.replies.text}</span>
81
- <span class="replies-last hidden-xs small">[[topic:last_reply_time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
84
+ <span class="ms-2 replies-count fw-semibold" component="post/reply-count/text" data-replies="{posts.replies.count}">{posts.replies.text}</span>
85
+ <span class="ms-2 replies-last hidden-xs fw-semibold">[[topic:last_reply_time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
82
86
 
83
- <i class="fa fa-fw fa-chevron-right" component="post/replies/open"></i>
84
- <i class="fa fa-fw fa-chevron-down hidden" component="post/replies/close"></i>
85
- <i class="fa fa-fw fa-spin fa-spinner hidden" component="post/replies/loading"></i>
86
- </a>
87
- {{{ end }}}
87
+ <i class="fa fa-fw fa-chevron-down" component="post/replies/open"></i>
88
+ <i class="fa fa-fw fa-chevron-up hidden" component="post/replies/close"></i>
89
+ <i class="fa fa-fw fa-spin fa-spinner hidden" component="post/replies/loading"></i>
90
+ </a>
91
+ {{{ end }}}
92
+ </div>
93
+
94
+ <div component="post/replies/container" class="mt-2 col-11 border rounded-1 p-3"></div>
88
95
 
89
- <small class="float-end">
96
+ <div component="post/actions" class="d-flex justify-content-end post-tools">
90
97
  <!-- IMPORT partials/topic/reactions.tpl -->
91
- <span class="post-tools">
92
- <a component="post/reply" href="#" class="user-select-none <!-- IF !privileges.topics:reply -->hidden<!-- ENDIF !privileges.topics:reply -->">[[topic:reply]]</a>
93
- <a component="post/quote" href="#" class="user-select-none <!-- IF !privileges.topics:reply -->hidden<!-- ENDIF !privileges.topics:reply -->">[[topic:quote]]</a>
94
- </span>
98
+ <a component="post/reply" href="#" class="btn btn-link user-select-none <!-- IF !privileges.topics:reply -->hidden<!-- ENDIF !privileges.topics:reply -->" title="[[topic:reply]]"><i class="fa fa-reply"></i></a>
99
+ <a component="post/quote" href="#" class="btn btn-link user-select-none <!-- IF !privileges.topics:reply -->hidden<!-- ENDIF !privileges.topics:reply -->" title="[[topic:quote]]"><i class="fa fa-quote-right"></i></a>
95
100
 
96
101
  <!-- IF !reputation:disabled -->
97
- <span class="votes">
98
- <a component="post/upvote" href="#" class="<!-- IF posts.upvoted -->upvoted<!-- ENDIF posts.upvoted -->">
102
+ <div class="d-flex votes align-items-center">
103
+ <a component="post/upvote" href="#" class="btn btn-link text-secondary <!-- IF posts.upvoted -->upvoted<!-- ENDIF posts.upvoted -->">
99
104
  <i class="fa fa-chevron-up"></i>
100
105
  </a>
101
106
 
102
- <span component="post/vote-count" data-votes="{posts.votes}">{posts.votes}</span>
107
+ <div class="d-inline-block px-3" component="post/vote-count" data-votes="{posts.votes}">{posts.votes}</div>
103
108
 
104
109
  <!-- IF !downvote:disabled -->
105
- <a component="post/downvote" href="#" class="<!-- IF posts.downvoted -->downvoted<!-- ENDIF posts.downvoted -->">
110
+ <a component="post/downvote" href="#" class="btn btn-link text-secondary <!-- IF posts.downvoted -->downvoted<!-- ENDIF posts.downvoted -->">
106
111
  <i class="fa fa-chevron-down"></i>
107
112
  </a>
108
113
  <!-- ENDIF !downvote:disabled -->
109
- </span>
114
+ </div>
110
115
  <!-- ENDIF !reputation:disabled -->
111
116
 
112
117
  <!-- IMPORT partials/topic/post-menu.tpl -->
113
- </small>
114
118
  </div>
115
- <div component="post/replies/container"></div>
116
119
  </div>