nodebb-theme-harmony 2.2.72 → 3.0.0-beta.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 (60) hide show
  1. package/package.json +3 -3
  2. package/public/harmony.js +9 -11
  3. package/scss/harmony.scss +0 -2
  4. package/templates/account/blocks.tpl +1 -1
  5. package/templates/account/categories.tpl +1 -1
  6. package/templates/account/consent.tpl +3 -1
  7. package/templates/account/info.tpl +7 -7
  8. package/templates/account/profile.tpl +4 -4
  9. package/templates/account/settings.tpl +6 -6
  10. package/templates/account/tags.tpl +1 -1
  11. package/templates/account/uploads.tpl +1 -1
  12. package/templates/category.tpl +5 -5
  13. package/templates/header.tpl +2 -2
  14. package/templates/notifications.tpl +1 -1
  15. package/templates/partials/account/category-item.tpl +2 -2
  16. package/templates/partials/account/header.tpl +2 -2
  17. package/templates/partials/account/session-list.tpl +1 -1
  18. package/templates/partials/account/sidebar-left.tpl +1 -1
  19. package/templates/partials/breadcrumbs-json-ld.tpl +1 -1
  20. package/templates/partials/breadcrumbs.tpl +1 -1
  21. package/templates/partials/buttons/newTopic.tpl +1 -1
  22. package/templates/partials/categories/item.tpl +2 -2
  23. package/templates/partials/categories/lastpost.tpl +2 -2
  24. package/templates/partials/categories/link.tpl +2 -2
  25. package/templates/partials/cookie-consent.tpl +2 -2
  26. package/templates/partials/mobile-nav.tpl +3 -3
  27. package/templates/partials/notifications_list.tpl +3 -3
  28. package/templates/partials/posts_list_item.tpl +3 -3
  29. package/templates/partials/quick-category-search-results.tpl +2 -2
  30. package/templates/partials/quick-search-results.tpl +1 -1
  31. package/templates/partials/search-filters.tpl +2 -2
  32. package/templates/partials/search-results.tpl +3 -4
  33. package/templates/partials/sidebar/drafts.tpl +8 -3
  34. package/templates/partials/sidebar/user-menu.tpl +1 -1
  35. package/templates/partials/sidebar-left.tpl +4 -4
  36. package/templates/partials/tags_list.tpl +3 -3
  37. package/templates/partials/topic/event.tpl +2 -2
  38. package/templates/partials/topic/navigation-post.tpl +2 -2
  39. package/templates/partials/topic/necro-post.tpl +1 -1
  40. package/templates/partials/topic/post.tpl +12 -15
  41. package/templates/partials/topic/quickreply.tpl +1 -1
  42. package/templates/partials/topic/sort.tpl +1 -1
  43. package/templates/partials/topic-list-bar.tpl +1 -1
  44. package/templates/partials/topics_list.tpl +5 -5
  45. package/templates/partials/users/item.tpl +1 -1
  46. package/templates/topic.tpl +2 -18
  47. package/templates/world.tpl +5 -5
  48. package/scss/groups.scss +0 -20
  49. package/scss/modules/cover.scss +0 -104
  50. package/templates/groups/details.tpl +0 -92
  51. package/templates/groups/list.tpl +0 -58
  52. package/templates/groups/members.tpl +0 -10
  53. package/templates/partials/groups/admin.tpl +0 -90
  54. package/templates/partials/groups/badge.tpl +0 -1
  55. package/templates/partials/groups/invited.tpl +0 -33
  56. package/templates/partials/groups/list.tpl +0 -17
  57. package/templates/partials/groups/memberlist.tpl +0 -47
  58. package/templates/partials/groups/pending.tpl +0 -29
  59. package/templates/partials/groups/sidebar-left.tpl +0 -27
  60. package/templates/partials/toast.tpl +0 -19
@@ -1,6 +1,5 @@
1
1
  {{{ if matchCount }}}
2
- <div class="card card-header text-xs px-2 py-1 fw-semibold border-0 align-self-start">[[search:results-matching, {matchCount}, {txEscape(search_query)}, {time}]]
3
- </div>
2
+ <div class="card card-header text-xs px-2 py-1 fw-semibold border-0 align-self-start">{{tx("search:results-matching", matchCount, txEscape(search_query), time)}}</div>
4
3
  {{{ else }}}
5
4
  {{{ if search_query }}}
6
5
  <div class="badge text-bg-warning align-self-start">[[search:no-matches]]</div>
@@ -24,8 +23,8 @@
24
23
  <div class="post-body d-flex flex-column gap-1">
25
24
  <div class="d-flex gap-3 post-info">
26
25
  <div class="post-author d-flex gap-1">
27
- <a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(./user, "16px", true, "not-responsive")}</a>
28
- <a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{../user.displayname}</a>
26
+ <a class="lh-1 text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{{buildAvatar(./user, "16px", true, "not-responsive")}}</a>
27
+ <a class="fw-semibold text-sm" href="{config.relative_path}/user/{./user.userslug}">{./user.displayname}</a>
29
28
  </div>
30
29
  <span class="timeago text-sm text-muted" title="{./timestampISO}"></span>
31
30
  </div>
@@ -35,17 +35,22 @@
35
35
  {{{ end }}}
36
36
 
37
37
  {{{ if (./action == "posts.reply") }}}
38
- <div class="text text-xs fw-semibold line-clamp-2 text-break">[[topic:composer.replying-to, "{txEscape(./title)}"]]</div>
38
+ <div class="text text-xs fw-semibold line-clamp-2 text-break">{{tx("topic:composer.replying-to", txEscape(quote(./title)))}}</div>
39
39
  {{{ end }}}
40
40
 
41
41
  {{{ if (./action == "posts.edit") }}}
42
- <div class="text text-xs fw-semibold line-clamp-2">[[topic:composer.editing-in, "{txEscape(./title)}"]]</div>
42
+ <div class="text text-xs fw-semibold line-clamp-2">{{tx("topic:composer.editing-in", txEscape(quote(./title)))}}</div>
43
43
  {{{ end }}}
44
44
 
45
45
  {{{ if ./text }}}
46
46
  <div class="text text-sm line-clamp-3 text-break">{./text}</div>
47
47
  {{{ end }}}
48
- <div class="timeago text-xs text-muted" title="{./timestampISO}"></div>
48
+ <div class="d-flex align-items-baseline gap-2">
49
+ {{{ if (./action == "topics.post") }}}
50
+ {{buildCategoryLabel(./category, "span", "border")}}
51
+ {{{ end }}}
52
+ <div class="timeago text-xs text-muted" title="{./timestampISO}"></div>
53
+ </div>
49
54
  </a>
50
55
  <div>
51
56
  <button component="drafts/delete" data-save-id="{./save_id}" class="btn btn-light btn-sm">
@@ -1,5 +1,5 @@
1
1
  <a component="header/avatar" id="user_dropdown" href="#" role="button" class="nav-link d-flex gap-2 align-items-center text-truncate" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[user:user-menu]]" style="padding: 2px 4px;">
2
- {buildAvatar(user, "28px", true)}
2
+ {{buildAvatar(user, "28px", true)}}
3
3
  <span id="user-header-name" class="nav-text small visible-open fw-semibold">{user.username}</span>
4
4
  </a>
5
5
  <ul id="user-control-list" component="header/usercontrol" class="overscroll-behavior-contain user-dropdown dropdown-menu shadow p-1 text-sm ff-base" role="menu">
@@ -2,8 +2,8 @@
2
2
  <ul id="main-nav" class="list-unstyled d-flex flex-column w-100 gap-2 mt-2 overflow-y-auto">
3
3
  {{{ each navigation }}}
4
4
  {{{ if displayMenuItem(@root, @index) }}}
5
- <li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{./title}">
6
- <a class="nav-link navigation-link d-flex gap-2 justify-content-between align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ 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 }}} {{{ if ./text }}}aria-label="{./text}"{{{ end }}}>
5
+ <li class="nav-item mx-2 {./class}{{{ if ./dropdown }}} dropend{{{ end }}}" title="{tx(./title)}">
6
+ <a class="nav-link navigation-link d-flex gap-2 justify-content-between align-items-center {{{ if ./dropdown }}}dropdown-toggle{{{ end }}}" {{{ 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 }}} {{{ if ./text }}}aria-label="{tx(./text)}"{{{ end }}}>
7
7
  <span class="d-flex gap-2 align-items-center text-nowrap truncate-open">
8
8
  <span class="position-relative">
9
9
  {{{ if ./iconClass }}}
@@ -11,13 +11,13 @@
11
11
  <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>
12
12
  {{{ end }}}
13
13
  </span>
14
- {{{ if ./text }}}<span class="nav-text small visible-open fw-semibold text-truncate">{./text}</span>{{{ end }}}
14
+ {{{ if ./text }}}<span class="nav-text small visible-open fw-semibold text-truncate">{tx(./text)}</span>{{{ end }}}
15
15
  </span>
16
16
  <span component="navigation/count" class="visible-open badge rounded-1 bg-primary {{{ if !./content }}}hidden{{{ end }}}">{./content}</span>
17
17
  </a>
18
18
  {{{ if ./dropdown }}}
19
19
  <ul class="dropdown-menu p-1 shadow" role="menu">
20
- {./dropdownContent}
20
+ {{./dropdownContent}}
21
21
  </ul>
22
22
  {{{ end }}}
23
23
  </li>
@@ -1,8 +1,8 @@
1
1
  {{{each tags}}}
2
2
  <div>
3
- <a href="{config.relative_path}/tags/{./valueEncoded}" data-tag="{./valueEscaped}" class="btn btn-ghost ff-base d-flex flex-column gap-1 align-items-start justify-content-start text-truncate p-2">
4
- <div class="fw-semibold text-nowrap tag-item w-100 text-start text-truncate">{./valueEscaped}</div>
5
- <div class="text-xs text-muted text-nowrap tag-topic-count">[[global:x-topics, {txEscape(formattedNumber(./score))}]]</div>
3
+ <a href="{config.relative_path}/tags/{./valueEncoded}" data-tag="{./value}" class="btn btn-ghost ff-base d-flex flex-column gap-1 align-items-start justify-content-start text-truncate p-2">
4
+ <div class="fw-semibold text-nowrap tag-item w-100 text-start text-truncate">{./value}</div>
5
+ <div class="text-xs text-muted text-nowrap tag-topic-count">{tx("global:x-topics", formattedNumber(./score))}</div>
6
6
  </a>
7
7
  </div>
8
8
  {{{end}}}
@@ -12,7 +12,7 @@
12
12
  {{{ each ./items }}}
13
13
  <div class="d-flex gap-2 pt-3 pt-lg-2" data-topic-event-id="{./id}" data-topic-event-type="{./type}">
14
14
  <span class="timeline-text small d-flex align-items-center gap-1 flex-wrap flex-grow-1 flex-lg-grow-0">
15
- {./text}
15
+ {{./text}}
16
16
  </span>
17
17
  {{{ if (privileges.isAdminOrMod && ./id) }}}
18
18
  <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>
@@ -30,7 +30,7 @@
30
30
  <i class="fa fa-fw {{{ if ./icon }}}{./icon}{{{ else }}}fa-circle{{{ end }}} small"></i>
31
31
  </div>
32
32
  <span class="timeline-text small d-flex align-items-center gap-1 flex-wrap flex-grow-1 flex-lg-grow-0">
33
- {./text}
33
+ {{./text}}
34
34
  </span>
35
35
  {{{ if (privileges.isAdminOrMod && ./id) }}}
36
36
  <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>
@@ -1,6 +1,6 @@
1
1
  <div class="d-flex gap-2 mb-2 align-items-center flex-nowrap text-sm">
2
2
  <div>
3
- {buildAvatar(post.user, "24px", true)}
3
+ {{buildAvatar(post.user, "24px", true)}}
4
4
  </div>
5
5
  <div class="text-truncate">
6
6
  <a href="{{{ if post.user.userslug }}}{config.relative_path}/user/{post.user.userslug}{{{else }}}#{{{ end }}}">{post.user.displayname}</a>
@@ -8,4 +8,4 @@
8
8
  <span class="timeago text-nowrap text-muted" title="{post.timestampISO}"></span>
9
9
  </div>
10
10
 
11
- <div class="text-sm">{post.content}</div>
11
+ <div class="text-sm">{{post.content}}</div>
@@ -2,5 +2,5 @@
2
2
  <div class="timeline-badge">
3
3
  <i class="fa fa-clock small"></i>
4
4
  </div>
5
- <span class="timeline-text small fw-semibold">{text}</span>
5
+ <span class="timeline-text small fw-semibold">{tx(text)}</span>
6
6
  </li>
@@ -11,13 +11,13 @@
11
11
  <div class="d-flex align-items-start gap-3 post-container-parent">
12
12
  <div class="bg-body d-none d-sm-block rounded-circle" style="box-shadow: 0 0 0 3px var(--bs-body-bg);">
13
13
  <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" aria-label="[[aria:profile-page-for, {./user.displayname}]]">
14
- {buildAvatar(posts.user, "48px", true, "", "user/picture")}
14
+ {{buildAvatar(posts.user, "48px", true, "", "user/picture")}}
15
15
  {{{ if ./user.isLocal }}}
16
16
  <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
17
17
  {{{ else }}}
18
18
  <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
19
19
  <span class="visually-hidden">[[global:remote-user]]</span>
20
- <i class="fa fa-globe"></i>
20
+ <i class="fa fa-globe fa-width-auto"></i>
21
21
  </span>
22
22
  {{{ end }}}
23
23
  </a>
@@ -31,13 +31,13 @@
31
31
  <div class="d-flex flex-nowrap gap-1 align-items-center text-truncate">
32
32
  <div class="d-sm-none">
33
33
  <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
34
- {buildAvatar(posts.user, "20px", true, "", "user/picture")}
34
+ {{buildAvatar(posts.user, "20px", true, "", "user/picture")}}
35
35
  {{{ if ./user.isLocal }}}
36
36
  <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
37
37
  {{{ else }}}
38
38
  <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
39
39
  <span class="visually-hidden">[[global:remote-user]]</span>
40
- <i class="fa fa-globe"></i>
40
+ <i class="fa fa-globe fa-width-auto"></i>
41
41
  </span>
42
42
  {{{ end }}}
43
43
  </a>
@@ -57,20 +57,17 @@
57
57
  {{{ end }}}
58
58
 
59
59
  <div class="d-flex gap-1 align-items-center">
60
- <span class="text-muted">{generateWrote(@value, config.timeagoCutoff)}</span>
60
+ <span class="text-muted">{{generateWrote(@value, config.timeagoCutoff)}}</span>
61
61
 
62
62
  <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, {isoTimeToLocaleString(./editedISO, config.userLang)}]]"></i>
63
63
  <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">[[global:last-edited-by, {posts.editor.username}]] <span class="timeago" title="{isoTimeToLocaleString(posts.editedISO, config.userLang)}"></span></span>
64
64
  </div>
65
65
 
66
66
  {{{ if posts.user.custom_profile_info.length }}}
67
- <div>
68
- <span>
69
-
70
- {{{ each posts.user.custom_profile_info }}}
71
- {posts.user.custom_profile_info.content}
72
- {{{ end }}}
73
- </span>
67
+ <div class="d-flex gap-1 align-items-center">
68
+ {{{ each posts.user.custom_profile_info }}}
69
+ {{posts.user.custom_profile_info.content}}
70
+ {{{ end }}}
74
71
  </div>
75
72
  {{{ end }}}
76
73
  </div>
@@ -81,12 +78,12 @@
81
78
  </div>
82
79
 
83
80
  <div class="content text-break" component="post/content" itemprop="text">
84
- {posts.content}
81
+ {{posts.content}}
85
82
  </div>
86
83
 
87
84
  <div component="post/footer" class="post-footer border-bottom pb-2">
88
85
  {{{ if posts.user.signature }}}
89
- <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{posts.user.signature}</div>
86
+ <div component="post/signature" data-uid="{posts.user.uid}" class="text-xs text-muted mt-2">{{txEscape(posts.user.signature)}}</div>
90
87
  {{{ end }}}
91
88
 
92
89
  <div class="d-flex flex-wrap-reverse gap-2 {{{ if (hideReplies || !posts.replies.count) }}}justify-content-end{{{ else }}}justify-content-between{{{ end }}}">
@@ -94,7 +91,7 @@
94
91
  <a component="post/reply-count" data-target-component="post/replies/container" href="#" class="d-flex gap-2 align-items-center btn btn-ghost ff-secondary border rounded-1 p-1 text-muted text-decoration-none text-xs {{{ if (!./replies || shouldHideReplyContainer(@value)) }}}hidden{{{ end }}}">
95
92
  <span component="post/reply-count/avatars" class="d-flex gap-1 {{{ if posts.replies.hasMore }}}hasMore{{{ end }}}">
96
93
  {{{each posts.replies.users}}}
97
- <span>{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}</span>
94
+ <span>{{buildAvatar(posts.replies.users, "20px", true, "avatar-tooltip")}}</span>
98
95
  {{{end}}}
99
96
  {{{ if posts.replies.hasMore}}}
100
97
  <span style="height: 20px; line-height: 20px;"><i class="fa fa-ellipsis"></i></span>
@@ -2,7 +2,7 @@
2
2
  <div component="topic/quickreply/container" class="quick-reply d-flex gap-3 mb-4">
3
3
  <div class="icon hidden-xs">
4
4
  <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
- {buildAvatar(loggedInUser, "48px", true, "", "user/picture")}
5
+ {{buildAvatar(loggedInUser, "48px", true, "", "user/picture")}}
6
6
  {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute top-100 start-100 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>
@@ -1,7 +1,7 @@
1
1
  <div class="dropdown bottom-sheet" component="thread/sort">
2
2
  <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[aria:post-sort-option, {sortOptionLabel}]]">
3
3
  <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
4
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{sortOptionLabel}</span>
4
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{tx(sortOptionLabel)}</span>
5
5
  </button>
6
6
 
7
7
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
@@ -54,7 +54,7 @@
54
54
 
55
55
  <!-- IMPORT partials/category/tools-dropdown-left.tpl -->
56
56
 
57
- <a href="{{{ if (template.category || template.world) }}}{escape(url)}{{{ else }}}{config.relative_path}/{selectedFilter.url}{querystring}{{{ end }}}" class="btn btn-secondary fw-semibold position-absolute top-100 translate-middle-x start-50 mt-1 hide" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;" id="new-topics-alert">
57
+ <a href="{{{ if (template.category || template.world) }}}{url}{{{ else }}}{config.relative_path}/{selectedFilter.url}{querystring}{{{ end }}}" class="btn btn-secondary fw-semibold position-absolute top-100 translate-middle-x start-50 mt-1 hide" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;" id="new-topics-alert">
58
58
  <i class="fa fa-fw fa-arrow-up"></i> [[recent:load-new-posts]]
59
59
  </a>
60
60
  </div>
@@ -3,7 +3,7 @@
3
3
  {{{ each topics }}}
4
4
  <li component="category/topic" class="category-item hover-parent border-bottom py-3 py-lg-4 d-flex flex-column flex-lg-row align-items-start {generateTopicClass(@value)}" <!-- IMPORT partials/data/category.tpl -->>
5
5
  <link itemprop="url" content="{config.relative_path}/topic/{./slug}" />
6
- <meta itemprop="name" content="{stripTags(./title)}" />
6
+ <meta itemprop="name" content="{./title}" />
7
7
  <meta itemprop="itemListOrder" content="descending" />
8
8
  <meta itemprop="position" content="{increment(./index, "1")}" />
9
9
  <a id="{./index}" data-index="{./index}" component="topic/anchor"></a>
@@ -11,7 +11,7 @@
11
11
  <div class="d-flex p-0 col-12 col-lg-7 gap-2 gap-lg-3 pe-2 align-items-start {{{ if config.theme.mobileTopicTeasers }}}mb-2 mb-lg-0{{{ end }}}">
12
12
  <div class="flex-shrink-0 position-relative">
13
13
  <a class="d-inline-block text-decoration-none avatar-tooltip" title="{./user.displayname}" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
14
- {buildAvatar(./user, "40px", true)}
14
+ {{buildAvatar(./user, "40px", true)}}
15
15
  </a>
16
16
  {{{ if showSelect }}}
17
17
  <div class="checkbox position-absolute top-100 start-50 translate-middle-x pt-2 m-0 d-none d-lg-flex" style="max-width:max-content">
@@ -51,7 +51,7 @@
51
51
  {{{each ./icons}}}<span class="lh-1">{@value}</span>{{{end}}}
52
52
 
53
53
  {{{ if (!template.category || (cid != ./cid)) }}}
54
- {buildCategoryLabel(./category, "a", "border")}
54
+ {{buildCategoryLabel(./category, "a", "border")}}
55
55
  {{{ end }}}
56
56
 
57
57
  <span data-tid="{./tid}" component="topic/tags" class="lh-1 tag-list d-flex flex-wrap gap-1 {{{ if !./tags.length }}}hidden{{{ end }}}">
@@ -114,12 +114,12 @@
114
114
  {{{ else }}}
115
115
  {{{ if ./teaser.pid }}}
116
116
  <div class="ps-2">
117
- <a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{buildAvatar(./teaser.user, "18px", true)}</a>
117
+ <a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{{buildAvatar(./teaser.user, "18px", true)}}</a>
118
118
  <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}" aria-label="[[global:lastpost]]"></a>
119
119
  </div>
120
120
  <div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break position-relative flex-fill">
121
121
  <a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" aria-label="[[global:lastpost]]"></a>
122
- {./teaser.content}
122
+ {{./teaser.content}}
123
123
  </div>
124
124
  {{{ end }}}
125
125
  {{{ end }}}
@@ -1,6 +1,6 @@
1
1
  <div>
2
2
  <a href="{config.relative_path}/user/{./userslug}" class="btn btn-ghost gap-2 ff-base d-flex align-items-start justify-content-start p-2 text-start">
3
- {buildAvatar(@value, "48px", true, "flex-shrink-0")}
3
+ {{buildAvatar(@value, "48px", true, "flex-shrink-0")}}
4
4
  <div class="d-flex flex-column gap-1 text-truncate">
5
5
  <div class="fw-semibold text-truncate" title="{./displayname}">{./displayname}</div>
6
6
  <div class="text-xs text-muted text-truncate">@{./username}</div>
@@ -11,23 +11,7 @@
11
11
  {{{ end }}}
12
12
 
13
13
  <div class="flex-fill" itemid="{url}" itemscope itemtype="https://schema.org/DiscussionForumPosting">
14
- <meta itemprop="headline" content="{escape(titleRaw)}">
15
- <meta itemprop="text" content="{escape(titleRaw)}">
16
- <meta itemprop="url" content="{url}">
17
- <meta itemprop="datePublished" content="{timestampISO}">
18
- <meta itemprop="dateModified" content="{lastposttimeISO}">
19
- <div itemprop="author" itemscope itemtype="https://schema.org/Person">
20
- <meta itemprop="name" content="{author.username}">
21
- {{{ if author.userslug }}}<meta itemprop="url" content="{config.relative_path}/user/{author.userslug}">{{{ end }}}
22
- </div>
23
- <div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter">
24
- <meta itemprop="interactionType" content="https://schema.org/CommentAction">
25
- <meta itemprop="userInteractionCount" content="{increment(postcount, "-1")}">
26
- </div>
27
- <div itemprop="interactionStatistic" itemscope itemtype="https://schema.org/InteractionCounter">
28
- <meta itemprop="interactionType" content="https://schema.org/LikeAction">
29
- <meta itemprop="userInteractionCount" content="{upvotes}">
30
- </div>
14
+ <!-- IMPORT partials/topic/meta-tags.tpl -->
31
15
 
32
16
  <div class="d-flex flex-column gap-3">
33
17
  <div class="d-flex gap-2 flex-wrap flex-column flex-md-row {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ else }}}justify-content-between{{{ end }}}">
@@ -52,7 +36,7 @@
52
36
  </a>
53
37
  {{{each icons}}}<span class="lh-1">{@value}</span>{{{end}}}
54
38
  </span>
55
- {buildCategoryLabel(category, "a", "border")}
39
+ {{buildCategoryLabel(category, "a", "border")}}
56
40
  <div data-tid="{./tid}" component="topic/tags" class="lh-1 tags tag-list d-flex flex-wrap hidden-xs hidden-empty gap-2"><!-- IMPORT partials/topic/tags.tpl --></div>
57
41
  <div class="d-flex gap-2" component="topic/stats"><!-- IMPORT partials/topic/stats.tpl --></div>
58
42
 
@@ -13,12 +13,12 @@
13
13
 
14
14
  <div class="category-header d-flex flex-column gap-2">
15
15
  <div class="d-flex gap-2 align-items-center mb-1 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
16
- {buildCategoryIcon(@value, "40px", "rounded-1 flex-shrink-0")}
16
+ {{buildCategoryIcon(@value, "40px", "rounded-1 flex-shrink-0")}}
17
17
  <h1 class="tracking-tight fs-2 fw-semibold mb-0 text-center">[[world:name]]</h1>
18
18
  </div>
19
19
  {{{ if ./descriptionParsed }}}
20
20
  <p class="description text-secondary text-sm w-100 {{{ if config.theme.centerHeaderElements }}}text-center{{{ end }}}">
21
- {./descriptionParsed}
21
+ {{./descriptionParsed}}
22
22
  </p>
23
23
  {{{ end }}}
24
24
  </div>
@@ -39,14 +39,14 @@
39
39
  {{{ each categories }}}
40
40
  <li class="flex-grow-1 align-items-start d-flex gap-2 p-1 mb-2 position-relative">
41
41
  <div>
42
- {buildCategoryIcon(@value, "24px", "rounded-1")}
42
+ {{buildCategoryIcon(@value, "24px", "rounded-1")}}
43
43
  </div>
44
44
  <div class="d-grid gap-0">
45
45
  <div class="title fw-semibold">
46
- <a class="text-reset stretched-link" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{../name}</a>
46
+ <a class="text-reset stretched-link" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{./name}</a>
47
47
  </div>
48
48
  {{{ if ./descriptionParsed }}}
49
- <div class="description text-muted text-xs w-100 line-clamp-sm-5">{./descriptionParsed}</div>
49
+ <div class="description text-muted text-xs w-100 line-clamp-sm-5">{{./descriptionParsed}}</div>
50
50
  {{{ end }}}
51
51
  </div>
52
52
  </li>
package/scss/groups.scss DELETED
@@ -1,20 +0,0 @@
1
- .template-groups-details #panel {
2
- margin-top: 0px!important;
3
- }
4
-
5
- .group-hover-bg {
6
- $hover-color: mix($body-bg, $body-color, 90%);
7
- $border-color: mix($body-bg, $body-color, 90%);
8
- border-color: $border-color!important;
9
- &:hover {
10
- background-color: $hover-color;
11
- }
12
- }
13
-
14
- .groups.details {
15
- margin-top: 200px;
16
-
17
- @include media-breakpoint-up(md) {
18
- margin-top: 300px;
19
- }
20
- }
@@ -1,104 +0,0 @@
1
- // used in group and account pages
2
- .cover {
3
- background-size: cover;
4
- background-repeat: no-repeat;
5
- height: 200px;
6
- position: absolute;
7
- background-origin: content-box;
8
- width: 100%;
9
- top: var(--panel-offset)!important;
10
- left: auto;
11
- right: 0px;
12
-
13
- &:hover .controls, .controls:focus-within {
14
- opacity: 1;
15
- }
16
-
17
- .controls {
18
- height: 200px;
19
- line-height: 200px;
20
- opacity: 0;
21
- @include transition(opacity .15s linear);
22
- cursor: pointer;
23
- pointer-events: none;
24
-
25
- > * {
26
- pointer-events: all;
27
- }
28
- }
29
-
30
- &.active {
31
- &:hover {
32
- cursor: move;
33
- }
34
-
35
- .controls {
36
- > * {
37
- display: none;
38
- }
39
- }
40
-
41
- .save {
42
- display: inline-block;
43
- }
44
- }
45
-
46
- &.saving {
47
- .save {
48
- display: none;
49
- }
50
-
51
- .indicator {
52
- display: inline-block;
53
- }
54
- }
55
-
56
- .save, .indicator {
57
- display: inline-block;
58
- position: absolute;
59
- bottom: 1em;
60
- left: 50%;
61
- transform: translateX(-50%);
62
- opacity: 1;
63
- padding: 0.5em;
64
- font-weight: bold;
65
-
66
- &:hover {
67
- cursor: pointer;
68
- }
69
- }
70
-
71
- .save {
72
- display: none;
73
- }
74
-
75
- .indicator {
76
- display: none;
77
- }
78
- }
79
-
80
- .cover > .container {
81
- height: 200px;
82
- position: relative;
83
- pointer-events: none;
84
- .save {
85
- pointer-events: all;
86
- }
87
- .controls {
88
- pointer-events: none;
89
- > * {
90
- pointer-events: all;
91
- }
92
- }
93
- }
94
-
95
- @include media-breakpoint-up(md) {
96
- .cover, .cover > .container {
97
- height: 300px;
98
-
99
- .controls {
100
- height: 300px;
101
- line-height: 300px;
102
- }
103
- }
104
- }
@@ -1,92 +0,0 @@
1
- <div component="groups/container" class="groups details flex-fill">
2
- <div class="cover position-absolute start-0 top-0" component="groups/cover" style="background-image: url({escape(group.cover:url)}?{config.cache-buster}); background-position: {group.cover:position};">
3
- <div class="container">
4
- {{{ if group.isOwner }}}
5
- <div class="controls text-center">
6
- <span class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></span>
7
- <span class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></span>
8
- <span class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></span>
9
- </div>
10
- <a href="#" class="save btn btn-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></a>
11
- <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
12
- {{{ end }}}
13
- </div>
14
- </div>
15
-
16
- <div class="d-flex flex-column flex-md-row justify-content-md-between pb-4 mb-4 mt-2 border-bottom gap-3">
17
- <div class="d-flex flex-column mt-1 gap-2">
18
- <div class="d-flex flex-column flex-md-row align-items-md-center gap-2">
19
- <h3 class="mb-0 text-capitalize">{generateGroupDisplayName(group)}</h3>
20
- <div>
21
- {{{ if group.private }}}<span class="badge text-bg-light border border-1">[[groups:details.private]]</span>{{{ end }}}
22
- {{{ if group.hidden }}}<span class="badge text-bg-light border border-1">[[groups:details.hidden]]</span>{{{ end }}}
23
- </div>
24
- </div>
25
- <div>
26
- {group.descriptionParsed}
27
- </div>
28
- </div>
29
- <div class="d-flex gap-2 align-items-start">
30
- {{{ if loggedIn }}}
31
- {membershipBtn(group)}
32
- {{{ end }}}
33
- {{{ if isAdmin }}}
34
- <a href="{config.relative_path}/admin/manage/groups/{group.slug}" target="_blank" class="btn btn-light text-nowrap"><i class="fa fa-gear"></i> [[user:edit]]</a>
35
- {{{ end }}}
36
- </div>
37
- </div>
38
-
39
- <div class="d-flex flex-column flex-md-row">
40
- <div data-widget-area="left">
41
- {{{each widgets.left}}}
42
- {{widgets.left.html}}
43
- {{{end}}}
44
- </div>
45
- <!-- IMPORT partials/groups/sidebar-left.tpl -->
46
-
47
- <div class="flex-grow-1 ps-md-2 ps-lg-5" style="min-width:0;">
48
- <div class="tab-content">
49
- <div class="tab-pane fade show active" id="groups-posts" role="tabpanel">
50
- <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
51
- {{{ if !posts.length }}}
52
- <div class="alert alert-info my-2">[[groups:details.has-no-posts]]</div>
53
- {{{ end }}}
54
- <!-- IMPORT partials/posts_list.tpl -->
55
- </div>
56
- <div class="tab-pane fade" id="groups-members" role="tabpanel">
57
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.members]]</h3>
58
-
59
- <!-- IMPORT partials/groups/memberlist.tpl -->
60
- </div>
61
- {{{ if group.isOwner }}}
62
- <div class="tab-pane fade" id="groups-pending" role="tabpanel">
63
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.pending]]</h3>
64
- <!-- IMPORT partials/groups/pending.tpl -->
65
- </div>
66
-
67
- <div class="tab-pane fade" id="groups-invited" role="tabpanel">
68
- <h3 class="fw-semibold fs-5 mb-3">[[groups:details.invited]]</h3>
69
- <!-- IMPORT partials/groups/invited.tpl -->
70
- </div>
71
-
72
- <div class="tab-pane fade" id="groups-admin" role="tabpanel">
73
- <div class="d-flex align-items-center gap-1 justify-content-between mb-3 flex-wrap">
74
- <h3 class="fw-semibold fs-5">[[groups:details.owner-options]]</h3>
75
- <div class="d-flex justify-content-end gap-2">
76
- <button class="btn btn-link btn-sm text-danger border-danger" type="button" data-action="delete">[[groups:details.delete-group]]</button>
77
- <button class="btn btn-primary btn-sm" type="button" data-action="update">[[global:save-changes]]</button>
78
- </div>
79
- </div>
80
- <!-- IMPORT partials/groups/admin.tpl -->
81
- </div>
82
- {{{ end }}}
83
- </div>
84
- </div>
85
-
86
- <div data-widget-area="right">
87
- {{{each widgets.right}}}
88
- {{widgets.right.html}}
89
- {{{end}}}
90
- </div>
91
- </div>
92
- </div>