nodebb-theme-harmony 0.0.1 → 0.0.2

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 +76 -62
  51. package/templates/groups/list.tpl +16 -11
  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 -175
  77. package/templates/partials/groups/badge.tpl +1 -3
  78. package/templates/partials/groups/invited.tpl +31 -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 +28 -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
@@ -1,168 +1,85 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="account">
1
+ <div class="account mx-auto">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
3
 
6
- <div class="profile row">
7
- <h1 class="fullname"><!-- IF fullname -->{fullname}<!-- ELSE -->{username}<!-- ENDIF fullname --></h1>
8
- <h2 class="username"><!-- IF !banned -->@{username}<!-- ELSE -->[[user:banned]]<!-- ENDIF !banned --></h2>
9
- <!-- IF isAdminOrGlobalModeratorOrModerator -->
10
- <!-- IF banned -->
11
- <div class="text-center">
12
- <!-- IF banned_until -->
13
- [[user:info.banned-until, {banned_until_readable}]]
14
- <!-- ELSE -->
15
- [[user:info.banned-permanently]]
16
- <!-- ENDIF banned_until -->
17
- </div>
18
- <!-- ENDIF banned -->
19
- <!-- ENDIF isAdminOrGlobalModeratorOrModerator -->
20
-
21
- <!-- IF selectedGroup.length -->
22
- <div class="text-center">
23
- {{{each selectedGroup}}}
24
- <!-- IF selectedGroup.slug -->
25
- <!-- IMPORT partials/groups/badge.tpl -->
26
- <!-- ENDIF selectedGroup.slug -->
27
- {{{end}}}
28
- </div>
29
- <br/>
30
- <!-- ENDIF selectedGroup.length -->
31
-
32
- <!-- IF aboutme -->
33
- <span component="aboutme" class="text-center aboutme">{aboutmeParsed}</span>
34
- <!-- ENDIF aboutme -->
35
-
36
- <div class="account-stats">
37
- <!-- IF !reputation:disabled -->
38
- <div class="stat">
39
- <div class="human-readable-number" title="{reputation}">{reputation}</div>
40
- <span class="stat-label">[[global:reputation]]</span>
41
- </div>
42
- <!-- ENDIF !reputation:disabled -->
43
-
44
- <div class="stat">
45
- <div class="human-readable-number" title="{profileviews}">{profileviews}</div>
46
- <span class="stat-label">[[user:profile_views]]</span>
47
- </div>
48
-
49
- <div class="stat">
50
- <div><a class="human-readable-number" title="{counts.posts}" href="{config.relative_path}/user/{userslug}/posts">{counts.posts}</a></div>
51
- <span class="stat-label">[[global:posts]]</span>
52
- </div>
4
+ <div class="row gx-5">
5
+ <!-- IMPORT partials/account/sidebar-left.tpl -->
53
6
 
54
- <div class="stat">
55
- <div><a class="human-readable-number" title="{counts.followers}" href="{config.relative_path}/user/{userslug}/followers">{counts.followers}</a></div>
56
- <span class="stat-label">[[user:followers]]</span>
7
+ <div class="col-12 col-md-9 col-lg-10 ps-md-5">
8
+ {{{ if aboutme }}}
9
+ <div component="aboutme" class="text-sm">
10
+ {aboutmeParsed}
57
11
  </div>
58
-
59
- <div class="stat">
60
- <div><a class="human-readable-number" title="{counts.following}" href="{config.relative_path}/user/{userslug}/following">{counts.following}</a></div>
61
- <span class="stat-label">[[user:following]]</span>
62
- </div>
63
- </div>
64
-
65
- <div class="text-center profile-meta">
66
- <span>[[user:joined]]</span>
67
- <strong class="timeago" title="{joindateISO}"></strong>
68
-
69
- <span>[[user:lastonline]]</span>
70
- <strong class="timeago" title="{lastonlineISO}"></strong><br />
71
-
72
- <!-- IF email -->
73
- <span>[[user:email]]</span>
74
- <strong><i class="fa fa-eye-slash {emailClass}" title="[[user:email_hidden]]"></i> {email}</strong>
75
- <!-- ENDIF email -->
76
-
77
- <!-- IF websiteName -->
78
- <span>[[user:website]]</span>
79
- <strong><a href="{websiteLink}" rel="nofollow noopener noreferrer">{websiteName}</a></strong>
80
- <!-- ENDIF websiteName -->
81
-
82
- <!-- IF location -->
83
- <span>[[user:location]]</span>
84
- <strong>{location}</strong>
85
- <!-- ENDIF location -->
86
-
87
- <!-- IF age -->
88
- <span>[[user:age]]</span>
89
- <strong>{age}</strong>
90
- <!-- ENDIF age -->
91
- </div>
92
- </div>
93
-
94
-
95
- <hr />
96
-
97
- <div class="row">
98
- <div class="col-12 account-block hidden">
99
- <div class="account-picture-block text-center">
100
- <span>
101
- <span class="account-username"> {username}</span>
102
- </span>
103
-
104
- <!-- IF !isSelf -->
105
- <a component="account/unfollow" href="#" class="btn btn-outline-secondary{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
106
- <a component="account/follow" href="#" class="btn btn-primary{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
107
- <!-- ENDIF !isSelf -->
108
- </div>
109
- </div>
110
- </div>
111
-
112
- <!-- IF groups.length -->
113
- <div class="row">
114
- <div class="col-12 hidden">
115
- {{{each groups}}}
116
- <a href="{config.relative_path}/groups/{groups.slug}"><span class="label group-label inline-block" style="background-color: {groups.labelColor};"><!-- IF groups.icon --><i class="fa {groups.icon}"></i> <!-- ENDIF groups.icon -->{groups.userTitle}</span></a>
117
- {{{end}}}
118
- </div>
119
- </div>
120
- <!-- ENDIF groups.length -->
121
-
122
- <!-- IF ips.length -->
123
- <div class="row">
124
- <div class="col-12 hidden">
125
- <div class="card">
126
- <h5 class="card-header">
127
- [[global:recentips]]
128
- </h5>
129
- <div class="card-body">
130
- {{{each ips}}}
131
- <div>{ips}</div>
132
- {{{end}}}
12
+ {{{ end }}}
13
+
14
+ <div class="account-stats container">
15
+ <div class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
16
+ {{{ if !reputation:disabled }}}
17
+ <div class="stat">
18
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
19
+ <span class="stat-label text-xs fw-semibold">[[global:reputation]]</span>
20
+ <span class="human-readable-number fs-2 ff-secondary" title="{reputation}">{reputation}</span>
21
+ </div>
22
+ </div>
23
+ {{{ end }}}
24
+ <div class="stat">
25
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
26
+ <span class="stat-label text-xs fw-semibold">[[user:profile_views]]</span>
27
+ <span class="human-readable-number fs-2 ff-secondary" title="
28
+ {profileviews}">{profileviews}</span>
29
+ </div>
30
+ </div>
31
+
32
+ <div class="stat">
33
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
34
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-cake-candles"></i> <span>[[user:joined]]</span></span>
35
+ <span class="timeago fs-6 ff-secondary" title="{joindateISO}"></span>
36
+ </div>
37
+ </div>
38
+
39
+ <div class="stat">
40
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
41
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-clock"></i> <span>[[user:lastonline]]</span></span>
42
+ <span class="timeago fs-6 ff-secondary" title="{lastonlineISO}"></span>
43
+ </div>
44
+ </div>
45
+
46
+ {{{ if email }}}
47
+ <div class="stat">
48
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
49
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-envelope"></i> <span>[[user:email]]</span> {{{ if emailHidden}}}<span class="text-lowercase">([[global:hidden]])</span>{{{ end }}}</span>
50
+ <span class="text-sm text-break ff-secondary">{email}</span>
51
+ </div>
52
+ </div>
53
+ {{{ end }}}
54
+
55
+ {{{ if websiteName }}}
56
+ <div class="stat">
57
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
58
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-globe"></i> <span>[[user:website]]</span></span>
59
+ <a class="text-sm text-break ff-secondary text-underline text-reset" href="{websiteLink}" rel="nofollow noopener noreferrer">{websiteName}</a>
60
+ </div>
61
+ </div>
62
+ {{{ end }}}
63
+
64
+ {{{ if location }}}
65
+ <div class="stat">
66
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
67
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-map-pin"></i> <span>[[user:location]]</span></span>
68
+ <span class="fs-6 ff-secondary">{location}</span>
69
+ </div>
70
+ </div>
71
+ {{{ end }}}
72
+
73
+ {{{ if age }}}
74
+ <div class="stat">
75
+ <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
76
+ <span class="stat-label text-xs fw-semibold"><span>[[user:age]]</span></span>
77
+ <span class="fs-6 ff-secondary">{age}</span>
78
+ </div>
79
+ </div>
80
+ {{{ end }}}
133
81
  </div>
134
82
  </div>
135
83
  </div>
136
84
  </div>
137
- <!-- ENDIF ips.length -->
138
-
139
- <div class="row">
140
- {{{ if bestPosts.length }}}
141
- <div class="col-lg-12 col-12">
142
- <h1>[[pages:account/best, {username}]]</h1>
143
-
144
- <div class="col-12">
145
- <ul component="posts" class="posts-list list-unstyled">
146
- {{{each bestPosts}}}
147
- <!-- IMPORT partials/posts_list_item.tpl -->
148
- {{{end}}}
149
- </ul>
150
- </div>
151
- </div>
152
- {{{ end }}}
153
- {{{ if latestPosts.length}}}
154
- <div class="col-lg-12 col-12">
155
- <h1>[[pages:account/latest-posts, {username}]]</h1>
156
- <div class="col-12">
157
- <ul component="posts" class="posts-list list-unstyled">
158
- {{{each latestPosts}}}
159
- <!-- IMPORT partials/posts_list_item.tpl -->
160
- {{{end}}}
161
- </ul>
162
- </div>
163
- </div>
164
- {{{ end }}}
165
- </div>
166
-
167
- <div id="user-action-alert" class="alert alert-success hide"></div>
168
85
  </div>
@@ -1,32 +1,43 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="account">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
3
 
6
- <div class="row">
7
- <h1>{title}</h1>
8
- <!-- IF showSort -->
9
- <div class="btn-toolbar justify-content-end mb-2">
10
- <div class="btn-group bottom-sheet" component="thread/sort">
11
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button"><span>[[topic:sort_by]]</span> <span class="caret"></span></button>
12
- <ul class="dropdown-menu dropdown-menu-end">
13
- {{{each sortOptions }}}
14
- <li><a class="dropdown-item" href="{config.relative_path}{sortOptions.url}"><i class="fa fa-fw {{{if sortOptions.selected}}}fa-check{{{end}}}"></i>{sortOptions.name}</a></li>
15
- {{{end}}}
16
- </ul>
4
+ <div class="row gx-5">
5
+ <!-- IMPORT partials/account/sidebar-left.tpl -->
6
+ <div class="col-12 col-md-9 col-lg-10 ps-md-5">
7
+ <div class="d-flex justify-content-between align-items-center mb-3">
8
+ <h3 class="fw-semibold fs-5 mb-0">[[global:topics]]</h3>
9
+ <div class="d-flex gap-1">
10
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost-sm fw-semibold {{{ if template.account/topics }}}active{{{ end }}}">[[global:header.recent]]</a>
11
+ {{{ if canEdit }}}
12
+ <a href="{config.relative_path}/user/{userslug}/watched"class="btn-ghost-sm fw-semibold {{{ if template.account/watched }}}active{{{ end }}}">[[user:watched]]</a>
13
+ <a href="{config.relative_path}/user/{userslug}/ignored" class="btn-ghost-sm fw-semibold {{{ if template.account/ignored }}}active{{{ end }}}">[[user:ignored]]</a>
14
+ {{{ end }}}
15
+ </div>
17
16
  </div>
18
- </div>
19
- <!-- ENDIF showSort -->
20
17
 
21
- <!-- IF !topics.length -->
18
+ {{{ if showSort }}}
19
+ <div class="btn-toolbar justify-content-end mb-2">
20
+ <div class="btn-group bottom-sheet" component="thread/sort">
21
+ <button class="btn-ghost-sm dropdown-toggle" data-bs-toggle="dropdown" type="button"><span>[[topic:sort_by]]</span></button>
22
+ <ul class="dropdown-menu dropdown-menu-end">
23
+ {{{each sortOptions }}}
24
+ <li><a class="dropdown-item" href="{config.relative_path}{sortOptions.url}"><i class="fa fa-fw {{{if sortOptions.selected}}}fa-check{{{end}}}"></i>{sortOptions.name}</a></li>
25
+ {{{end}}}
26
+ </ul>
27
+ </div>
28
+ </div>
29
+ {{{ end }}}
30
+
31
+ {{{ if !topics.length }}}
22
32
  <div class="alert alert-warning text-center">{noItemsFoundKey}</div>
23
- <!-- ENDIF !topics.length -->
33
+ {{{ end }}}
24
34
 
25
- <div class="category">
26
- <!-- IMPORT partials/topics_list.tpl -->
27
- <!-- IF config.usePagination -->
35
+ <div class="category">
36
+ <!-- IMPORT partials/topics_list.tpl -->
37
+ {{{ if config.usePagination }}}
28
38
  <!-- IMPORT partials/paginator.tpl -->
29
- <!-- ENDIF config.usePagination -->
39
+ {{{ end }}}
40
+ </div>
30
41
  </div>
31
42
  </div>
32
43
  </div>
@@ -1,43 +1,46 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="account">
4
2
  <!-- IMPORT partials/account/header.tpl -->
5
- <div class="row">
6
- <h1>{title}</h1>
3
+ <div class="row gx-5">
4
+ <!-- IMPORT partials/account/sidebar-left.tpl -->
5
+
6
+
7
7
 
8
- <!-- IF privateUploads -->
9
- <div class="alert alert-info text-center">[[uploads:private-uploads-info]]</div>
10
- <!-- ELSE -->
11
- <div class="alert alert-info text-center">[[uploads:public-uploads-info]]</div>
12
- <!-- ENDIF privateUploads -->
8
+ <div class="col-12 col-md-9 col-lg-10 ps-md-5">
13
9
 
14
- <!-- IF !uploads.length -->
10
+ <h3 class="fw-semibold fs-5">{title}</h3>
11
+
12
+ <!-- IF privateUploads -->
13
+ <div class="alert alert-info text-center">[[uploads:private-uploads-info]]</div>
14
+ <!-- ELSE -->
15
+ <div class="alert alert-info text-center">[[uploads:public-uploads-info]]</div>
16
+ <!-- ENDIF privateUploads -->
17
+
18
+ <!-- IF !uploads.length -->
15
19
  <div class="alert alert-warning text-center">[[uploads:no-uploads-found]]</div>
16
- <!-- ENDIF !uploads.length -->
17
-
18
- <div class="col-12">
19
- <table class="table table-striped">
20
- <thead>
21
- <tr>
22
- <th></th>
23
- <th></th>
24
- </tr>
25
- </thead>
26
- <tbody>
27
- {{{each uploads}}}
28
- <tr data-name="{uploads.name}">
29
- <td>
30
- <a href="{config.relative_path}{uploads.url}">{uploads.url}</a>
31
- </td>
32
- <td>
33
- <div class="btn-group ">
34
- <button class="btn btn-danger btn-sm" data-action="delete"><i class="fa fa-trash"></i></button>
35
- </div>
36
- </td>
37
- </tr>
38
- {{{end}}}
39
- </tbody>
40
- </table>
20
+ <!-- ENDIF !uploads.length -->
21
+
22
+ <table class="table table-striped">
23
+ <thead>
24
+ <tr>
25
+ <th></th>
26
+ <th></th>
27
+ </tr>
28
+ </thead>
29
+ <tbody>
30
+ {{{each uploads}}}
31
+ <tr data-name="{uploads.name}">
32
+ <td>
33
+ <a href="{config.relative_path}{uploads.url}">{uploads.url}</a>
34
+ </td>
35
+ <td>
36
+ <div class="btn-group ">
37
+ <button class="btn btn-danger btn-sm" data-action="delete"><i class="fa fa-trash"></i></button>
38
+ </div>
39
+ </td>
40
+ </tr>
41
+ {{{end}}}
42
+ </tbody>
43
+ </table>
41
44
 
42
45
  <!-- IMPORT partials/paginator.tpl -->
43
46
  </div>
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IMPORT account/posts.tpl -->
@@ -1,3 +1 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IMPORT account/topics.tpl -->
@@ -0,0 +1,17 @@
1
+ <div class="row">
2
+ <div class="col-sm-2 col-12 settings-header">Settings</div>
3
+ <div class="col-sm-10 col-12">
4
+ <form role="form" class="harmony-settings">
5
+ <div class="form-check form-switch">
6
+ <input type="checkbox" class="form-check-input" id="enableQuickReply" name="enableQuickReply" />
7
+ <label for="enableQuickReply" class="form-check-label">Enable quick reply</label>
8
+ </div>
9
+ <div class="form-check form-switch">
10
+ <input type="checkbox" class="form-check-input" id="centerHeaderElements" name="centerHeaderElements" />
11
+ <label for="centerHeaderElements" class="form-check-label">Center header elements</label>
12
+ </div>
13
+ </form>
14
+ </div>
15
+ </div>
16
+
17
+ <!-- IMPORT admin/partials/save_button.tpl -->
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IMPORT partials/breadcrumbs.tpl -->
4
2
  <div data-widget-area="header">
5
3
  {{{ each widgets.header }}}
@@ -10,14 +8,16 @@
10
8
  <div class="{{{ if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
11
9
  {{{ if pagination.pages.length }}}
12
10
  <div><!-- IMPORT partials/category-selector.tpl --></div>
13
- {{{ else }}}
14
- <h1 class="categories-title">[[pages:categories]]</h1>
15
11
  {{{ end }}}
16
- <ul class="categories" itemscope itemtype="http://www.schema.org/ItemList">
12
+ <ul class="categories list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
17
13
  {{{ each categories }}}
14
+ {{{ if !@first }}}
15
+ <hr class="text-muted opacity-25"/>
16
+ {{{ end }}}
18
17
  <!-- IMPORT partials/categories/item.tpl -->
19
18
  {{{ end }}}
20
19
  </ul>
20
+
21
21
  <!-- IMPORT partials/paginator.tpl -->
22
22
  </div>
23
23
  <div data-widget-area="sidebar" class="col-lg-3 col-sm-12 {{{ if !widgets.sidebar.length }}}hidden{{{ end }}}">
@@ -1,35 +1,35 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IMPORT partials/breadcrumbs.tpl -->
2
+
3
+ {{{ if widgets.header.length }}}
4
4
  <div data-widget-area="header">
5
5
  {{{ each widgets.header }}}
6
6
  {{widgets.header.html}}
7
7
  {{{ end }}}
8
8
  </div>
9
- <div class="row">
10
- <div class="category {{{if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
11
- <!-- IMPORT partials/category/subcategory.tpl -->
9
+ {{{ end }}}
12
10
 
13
- <div class="topic-list-header sticky-top btn-toolbar justify-content-between py-2 mb-2 flex-nowrap">
14
- <div class="d-flex gap-1 align-items-stretch">
15
- {{{ if privileges.topics:create }}}
16
- <a href="{config.relative_path}/compose?cid={cid}" component="category/post" id="new_topic" class="btn btn-primary text-nowrap" data-ajaxify="false" role="button">[[category:new_topic_button]]</a>
17
- {{{ else }}}
18
- {{{ if !loggedIn }}}
19
- <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-primary">[[category:guest-login-post]]</a>
20
- {{{ end }}}
21
- {{{ end }}}
11
+ <div class="d-flex flex-column gap-2">
12
+ <div class="d-flex gap-2 align-items-center mb-1 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
13
+ {buildCategoryIcon(@value, "40px", "rounded-1 flex-shrink-0")}
14
+ <h2 class="fs-2 fw-semibold mb-0 text-center">{./name}</h2>
15
+ </div>
16
+ <div class="d-flex flex-wrap gap-2 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
17
+ <span class="badge text-body border border-gray-300 stats text-xs">
18
+ <span title="{totalTopicCount}" class="human-readable-number fw-bold">{totalTopicCount}</span>
19
+ <span class="text-lowercase fw-normal">[[global:topics]]</span>
20
+ </span>
21
+ <span class="badge text-body border border-gray-300 stats text-xs">
22
+ <span title="{totalPostCount}" class="human-readable-number fw-bold">{totalPostCount}</span>
23
+ <span class="text-lowercase fw-normal">[[global:posts]]</span>
24
+ </span>
25
+ </div>
26
+ </div>
22
27
 
23
- <a href="{config.relative_path}/{selectedFilter.url}{querystring}" class="d-inline-block">
24
- <div class="alert alert-warning h-100 m-0 px-2 py-1 d-flex align-items-center hide" id="new-topics-alert"></div>
25
- </a>
26
- </div>
27
- <div class="d-flex gap-1 align-items-stretch">
28
- <!-- IMPORT partials/category/watch.tpl -->
29
- <!-- IMPORT partials/category/sort.tpl -->
30
- <!-- IMPORT partials/category/tools.tpl -->
31
- </div>
32
- </div>
28
+ <div class="row mt-3">
29
+ <div class="category d-flex flex-column {{{if widgets.sidebar.length }}}col-lg-9 col-sm-12{{{ else }}}col-lg-12{{{ end }}}">
30
+ <!-- IMPORT partials/category/subcategory.tpl -->
31
+
32
+ <!-- IMPORT partials/topic-list-bar.tpl -->
33
33
 
34
34
  {{{ if !topics.length }}}
35
35
  {{{ if privileges.topics:create }}}
@@ -58,8 +58,8 @@
58
58
  {{{end}}}
59
59
  </div>
60
60
 
61
- <!-- IF !config.usePagination -->
61
+ {{{ if !config.usePagination }}}
62
62
  <noscript>
63
63
  <!-- IMPORT partials/paginator.tpl -->
64
64
  </noscript>
65
- <!-- ENDIF !config.usePagination -->
65
+ {{{ end }}}
@@ -1,10 +1,8 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div id="chat-modal" class="chat-modal modal hide" tabindex="-1" role="dialog" aria-labelledby="Chat" aria-hidden="true" data-backdrop="none">
1
+ <div id="chat-modal" class="chat-modal d-flex flex-nowrap modal hide" tabindex="-1" role="dialog" aria-labelledby="Chat" aria-hidden="true" data-backdrop="none">
4
2
  <div class="modal-dialog">
5
3
  <div class="modal-content">
6
4
  <div class="modal-header d-flex">
7
- <div class="fs-5 flex-grow-1" component="chat/room/name">{{{ if roomName }}}{roomName}{{{ else }}}{usernames}{{{ end }}}</div>
5
+ <div class="fs-5 flex-grow-1" component="chat/room/name"><!-- IF roomName -->{roomName}<!-- ELSE -->{usernames}<!-- ENDIF roomName --></div>
8
6
  <button type="button" class="btn btn-link d-none d-md-block p-2 text-muted align-text-top" data-action="maximize">
9
7
  <span aria-hidden="true"><i class="fa fa-fw fa-expand"></i></span>
10
8
  <span class="sr-only">[[modules:chat.maximize]]</span>
@@ -18,18 +16,20 @@
18
16
  <button id="chat-close-btn" type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
19
17
  </div>
20
18
 
21
- <div class="modal-body">
19
+ <div class="modal-body d-flex flex-column" style="height: 500px;">
22
20
  <div class="position-relative">
23
21
  <div component="chat/messages/scroll-up-alert" class="position-absolute scroll-up-alert alert alert-info hidden w-100" role="button" style="z-index: 1;">[[modules:chat.scroll-up-alert]]</div>
24
22
  </div>
25
- <ul class="chat-content" component="chat/messages">
23
+ <ul class="chat-content p-0 m-0 list-unstyled d-flex flex-column overflow-auto flex-grow-1" component="chat/messages">
26
24
  <!-- IMPORT partials/chats/messages.tpl -->
27
25
  </ul>
28
26
 
29
- <div component="chat/composer">
30
- <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="1"></textarea>
27
+ <div component="chat/composer" class="d-flex">
28
+ <div class="flex-grow-1 position-relative">
29
+ <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2"></textarea>
30
+ <span component="chat/message/remaining" class="text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
31
+ </div>
31
32
  <button class="btn btn-primary" type="button" data-action="send"><i class="fa fa-fw fa-2x fa-paper-plane"></i></button>
32
- <span component="chat/message/remaining">{maximumChatMessageLength}</span>
33
33
  <form component="chat/upload" method="post" enctype="multipart/form-data">
34
34
  <input type="file" name="files[]" multiple class="hidden"/>
35
35
  </form>
@@ -1,20 +1,18 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="chats-full">
4
- <div component="chat/nav-wrapper" data-loaded="{{{ if roomId }}}1{{{ else }}}0{{{ end }}}">
5
- <div class="chat-search dropdown">
1
+ <div class="chats-full d-flex gap-1 vh-100 py-3">
2
+ <div class="d-flex flex-column h-100" component="chat/nav-wrapper" data-loaded="{{{ if roomId }}}1{{{ else }}}0{{{ end }}}">
3
+ <div class="chat-search dropdown mb-2">
6
4
  <input class="form-control" type="text" component="chat/search" placeholder="[[users:search-user-for-chat]]" data-bs-toggle="dropdown" />
7
5
  <ul component="chat/search/list" class="dropdown-menu">
8
6
  <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
9
7
  </ul>
10
8
  </div>
11
- <ul component="chat/recent" class="chats-list list-unstyled" data-nextstart="{nextStart}">
9
+ <ul component="chat/recent" class="chats-list list-unstyled overflow-auto mb-0 pe-2" data-nextstart="{nextStart}">
12
10
  {{{each rooms}}}
13
11
  <!-- IMPORT partials/chats/recent_room.tpl -->
14
12
  {{{end}}}
15
13
  </ul>
16
14
  </div>
17
- <div component="chat/main-wrapper">
15
+ <div class="flex-1 ms-md-2 ps-md-2 border-1 border-start-md" component="chat/main-wrapper">
18
16
  <!-- IMPORT partials/chats/message-window.tpl -->
19
17
  </div>
20
18
  <div class="imagedrop"><div>[[topic:composer.drag_and_drop_images]]</div></div>
@@ -1,12 +1,16 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
1
 
3
- </div><!-- /.container#content -->
4
- </main>
2
+ </div><!-- /.container#content -->
3
+ </main>
4
+ <!-- IMPORT partials/sidebar-right.tpl -->
5
+ </div>
6
+ <!-- IMPORT partials/mobile-footer.tpl -->
5
7
  {{{ if !isSpider }}}
6
- <div component="toaster/tray" class="alert-window">
7
- <div id="reconnect-alert" class="alert alert-dismissible alert-warning clearfix hide" component="toaster/toast">
8
- <button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-hidden="true"></button>
9
- <p>[[global:reconnecting-message, {config.siteTitle}]]</p>
8
+ <div class="row">
9
+ <div component="toaster/tray" class="col-12 col-md-3 alert-window fixed-bottom pb-3 mb-5 mb-md-2 me-md-5 ms-auto">
10
+ <div id="reconnect-alert" class="alert alert-dismissible alert-warning clearfix hide" component="toaster/toast">
11
+ <button type="button" class="btn-close float-end" data-bs-dismiss="alert" aria-hidden="true"></button>
12
+ <p>[[global:reconnecting-message, {config.siteTitle}]]</p>
13
+ </div>
10
14
  </div>
11
15
  </div>
12
16
  {{{ end }}}