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,58 +0,0 @@
1
- <div data-widget-area="header">
2
- {{{each widgets.header}}}
3
- {{widgets.header.html}}
4
- {{{end}}}
5
- </div>
6
- <div class="groups list flex-fill">
7
- <h3 class="fw-semibold">[[pages:groups]]</h3>
8
- <div class="d-flex flex-wrap justify-content-between">
9
- <div class="mb-2 mb-md-0">
10
- <div class="text-sm d-flex flex-wrap align-items-center gap-2">
11
- [[topic:sort-by]]
12
- <div class="d-flex flex-wrap gap-2">
13
- <a href="?sort=alpha" class="btn btn-ghost btn-sm ff-secondary fw-semibold text-nowrap {{{ if (sort == "alpha") }}}active{{{ end }}}">[[groups:details.group-name]]</a>
14
- <a href="?sort=count" class="btn btn-ghost btn-sm ff-secondary fw-semibold text-nowrap {{{ if (sort == "count") }}}active{{{ end }}}">[[groups:details.member-count]]</a>
15
- <a href="?sort=date" class="btn btn-ghost btn-sm ff-secondary fw-semibold text-nowrap {{{ if (sort == "date") }}}active{{{ end }}}">[[groups:details.creation-date]]</a>
16
- </div>
17
- </div>
18
- </div>
19
- <div>
20
- <div class="d-flex justify-content-end gap-2">
21
- <div>
22
- {{{ if allowGroupCreation }}}
23
- <button class="btn btn-primary btn-sm text-nowrap" data-action="new"><i class="fa fa-users"></i> [[groups:new-group]]</button>
24
- {{{ end }}}
25
- <select class="form-select hidden" id="search-sort">
26
- <option value="alpha">[[groups:details.group-name]]</option>
27
- <option value="count">[[groups:details.member-count]]</option>
28
- <option value="date">[[groups:details.creation-date]]</option>
29
- </select>
30
- </div>
31
- <div>
32
- <div class="input-group">
33
- <input type="text" class="form-control form-control-sm" placeholder="[[global:search]]" name="query" id="search-text">
34
- <button id="search-button" class="btn btn-primary btn-sm" aria-label="[[global:search]]">
35
- <i class="fa fa-search"></i>
36
- </button>
37
- </div>
38
- </div>
39
- </div>
40
- </div>
41
- </div>
42
-
43
- <hr />
44
-
45
- <div component="groups/container" class="row" id="groups-list">
46
- {{{ if groups.length }}}
47
- <!-- IMPORT partials/groups/list.tpl -->
48
- {{{ else }}}
49
- <div class="col-12">
50
- <div class="alert alert-warning">
51
- [[groups:no-groups-found]]
52
- </div>
53
- </div>
54
- {{{ end }}}
55
- </div>
56
-
57
- <!-- IMPORT partials/paginator.tpl -->
58
- </div>
@@ -1,10 +0,0 @@
1
- <!-- IMPORT partials/breadcrumbs.tpl -->
2
- <div class="users flex-fill">
3
- <div id="users-container" class="users-container row row-cols-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5 g-4">
4
- {{{ each users }}}
5
- <!-- IMPORT partials/users/item.tpl -->
6
- {{{ end }}}
7
- </div>
8
-
9
- <!-- IMPORT partials/paginator.tpl -->
10
- </div>
@@ -1,90 +0,0 @@
1
- <div class="options mb-5">
2
- <form component="groups/settings" role="form">
3
- <div class="row">
4
- <div class="col-12 col-lg-6">
5
- <div class="mb-3">
6
- <label class="form-label" for="name">[[groups:details.group-name]]</label>
7
- <input {{{ if group.system }}}readonly{{{ end }}} class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
8
- </div>
9
- <div class="mb-3">
10
- <label class="form-label" for="description">[[groups:details.description]]</label>
11
- <textarea class="form-control" name="description" id="description" type="text" maxlength="255" rows="5">{group.description}</textarea>
12
- </div>
13
-
14
- <div class="form-check mb-3">
15
- <label class="form-check-label" for="private">[[groups:details.private]]</label>
16
- <input class="form-check-input" name="private" id="private" type="checkbox"{{{ if group.private }}} checked{{{ end }}}>
17
- {{{ if !allowPrivateGroups }}}
18
- <p class="form-text">
19
- [[groups:details.private-system-help]]
20
- </p>
21
- {{{ end }}}
22
- <p class="form-text text-xs m-0">
23
- [[groups:details.private-help]]
24
- </p>
25
- </div>
26
- <div class="form-check mb-3">
27
- <label class="form-check-label" for="hidden">[[groups:details.hidden]]</label>
28
- <input class="form-check-input" name="hidden" id="hidden" type="checkbox"{{{ if group.hidden }}} checked{{{ end }}}>
29
- <p class="form-text text-xs m-0">
30
- [[groups:details.hidden-help]]
31
- </p>
32
- </div>
33
-
34
- <div class="form-check mb-3">
35
- <label class="form-check-label" for="disableJoinRequests">[[groups:details.disableJoinRequests]]</label>
36
- <input class="form-check-input" name="disableJoinRequests" id="disableJoinRequests" type="checkbox"{{{ if group.disableJoinRequests }}} checked{{{ end }}}>
37
- </div>
38
- <div class="form-check mb-3">
39
- <label class="form-check-label" for="disableLeave">[[groups:details.disableLeave]]</label>
40
- <input class="form-check-input" name="disableLeave" id="disableLeave" type="checkbox"{{{if group.disableLeave}}} checked{{{end}}}>
41
- </div>
42
-
43
- <div class="mb-3">
44
- <label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
45
- <div class="d-flex gap-1">
46
- <div class="member-post-cids-selector">
47
- <!-- IMPORT partials/category/selector-dropdown-left.tpl -->
48
- </div>
49
- <input id="memberPostCids" type="text" class="form-control form-control-sm" value="{group.memberPostCids}">
50
- </div>
51
- </div>
52
- </div>
53
- <div class="col-12 col-lg-6">
54
- <div class="d-flex gap-2 align-items-center mb-3">
55
- <div class="form-check">
56
- <label class="form-check-label" for="userTitleEnabled">[[groups:details.userTitleEnabled]]</label>
57
- <input class="form-check-input" name="userTitleEnabled" id="userTitleEnabled" type="checkbox"{{{ if group.userTitleEnabled }}} checked{{{ end }}}>
58
- </div>
59
- <span class="badge rounded-1 text-uppercase text-truncate rounded-1 d-flex align-items-center gap-1 {{{ if !group.userTitleEnabled }}} hide{{{ end }}}" style="max-width:150px; color: {group.textColor}; background-color: {group.labelColor}"><i class="fa {{{ if (group.icon && (group.icon != "fa-nbb-none")) }}}{group.icon}{{{ else }}}hidden{{{ end }}}"></i><span class="badge-text">{{{ if group.userTitle }}}{group.userTitle}{{{ end }}}</span></span>
60
- </div>
61
-
62
-
63
- <div class="mb-3">
64
- <label class="form-label" for="userTitle">[[groups:details.badge-text]]</label>
65
- <div class="d-flex gap-1">
66
- <input component="groups/userTitleOption" class="form-control" name="userTitle" id="userTitle" type="text" maxlength="40" value="{group.userTitleEscaped}"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}} />
67
- <button component="groups/userTitleOption" type="button" class="btn btn-outline-secondary text-nowrap" data-action="icon-select"{{{ if !group.userTitleEnabled }}} disabled{{{ end }}}>[[groups:details.change-icon]]</button>
68
- <input type="hidden" name="icon" value="{{{ if group.icon }}}{group.icon}{{{ end }}}" />
69
- <div id="icons" class="hidden">
70
- <div class="icon-container">
71
- <div class="row nbb-fa-icons">
72
- <!-- IMPORT partials/fontawesome.tpl -->
73
- </div>
74
- </div>
75
- </div>
76
- </div>
77
- </div>
78
- <div class="mb-3 d-flex align-items-center justify-content-between gap-5">
79
- <label class="form-label mb-0 text-nowrap" for="labelColor" class="badge-color-label">[[groups:details.change-label-colour]]</label>
80
- <input class="form-control p-1" component="groups/userTitleOption" type="color" name="labelColor" id="labelColor" value="{{{ if group.labelColor }}}{group.labelColor}{{{ end }}}" style="width: 128px;" />
81
- </div>
82
- <div class="d-flex align-items-center justify-content-between gap-5">
83
- <label class="form-label mb-0 text-nowrap" for="textColor" class="badge-color-label">[[groups:details.change-text-colour]]</label>
84
- <input class="form-control p-1" component="groups/userTitleOption" type="color" name="textColor" id="textColor" value="{{{ if group.textColor }}}{group.textColor}{{{ end }}}" style="width: 128px;"/>
85
- </div>
86
- </div>
87
- </div>
88
-
89
- </form>
90
- </div>
@@ -1 +0,0 @@
1
- <a href="{config.relative_path}/groups/{./slug}" class="badge rounded-1 text-uppercase text-truncate text-decoration-none d-flex align-items-center gap-1" style="max-width: 150px; line-height: normal; color:{./textColor};background-color: {./labelColor};"><i class="fa {{{ if (./icon && (./icon != "fa-nbb-none")) }}}{./icon}{{{else}}}hidden{{{ end }}}"></i><span class="badge-text">{{{ if ./userTitle }}}{./userTitle}{{{ end }}}</span></a>
@@ -1,33 +0,0 @@
1
- <label class="text-xs text-muted">[[groups:invited.search]]</label>
2
- <div class="input-group mb-2">
3
- <input class="form-control" type="text" component="groups/members/invite"/>
4
- <span class="input-group-text search-button"><i class="fa fa-search"></i></span>
5
- </div>
6
-
7
- <div class="mb-2">
8
- <label class="text-xs text-muted">[[groups:bulk-invite-instructions]]</label>
9
- <textarea class="form-control" component="groups/members/bulk-invite"></textarea>
10
- </div>
11
-
12
- <div class="mb-2 clearfix">
13
- <button type="button" class="btn btn-primary btn-sm float-end" component="groups/members/bulk-invite-button">[[groups:bulk-invite]]</button>
14
- </div>
15
-
16
- <div style="max-height: 500px; overflow: auto;">
17
- <div component="groups/invited/alert" class="alert alert-info {{{ if group.invited.length }}}hidden{{{ end }}}">[[groups:invited.none]]</div>
18
- <table component="groups/invited" class="table table-hover">
19
- <tbody>
20
- {{{ each group.invited }}}
21
- <tr data-uid="{group.invited.uid}" class="align-middle">
22
- <td class="member-name p-2 d-flex align-items-center justify-content-between">
23
- <div class="d-flex align-items-center gap-2">
24
- <a class="text-decoration-none" href="{config.relative_path}/user/{group.invited.userslug}">{buildAvatar(group.invited, "24px", true)}</a>
25
- <a href="{config.relative_path}/user/{group.invited.userslug}">{group.invited.username}</a>
26
- </div>
27
- <button class="btn btn-outline-secondary btn-sm text-nowrap" data-action="rescindInvite">[[groups:invited.uninvite]]</button>
28
- </td>
29
- </tr>
30
- {{{ end }}}
31
- </tbody>
32
- </table>
33
- </div>
@@ -1,17 +0,0 @@
1
- {{{ each groups }}}
2
- <div class="col-xl-4 col-lg-6 col-sm-12 mb-3" component="groups/summary" data-slug="{./slug}">
3
- <div class="card h-100 group-hover-bg border p-1">
4
- <a href="{config.relative_path}/groups/{./slug}" class="card-header border-0 rounded-1 pointer d-block list-cover" style="{{{ if ./cover:thumb:url }}}background-image: url({./cover:thumb:url});background-size: cover; min-height: 125px; background-position: {./cover:position}{{{ end }}}" aria-label="[[aria:group-page-link-for, {txEscape(./displayName)}]]"></a>
5
- <a href="{config.relative_path}/groups/{./slug}" class="d-block h-100 text-reset text-decoration-none">
6
- <div class="card-body d-flex flex-column gap-2 h-100 pb-2">
7
- <div class="d-flex">
8
- <div class="flex-grow-1 fs-6 fw-semibold text-capitalize">{generateGroupDisplayName(@value)}</div>
9
- <div class="align-self-start flex-shrink-0 badge border border-gray-300 fw-normal text-body"><i class="text-secondary fa-solid fa-users"></i> {formattedNumber(./memberCount)}</div>
10
- </div>
11
- <div class="text-sm line-clamp-3">{./description}</div>
12
- <span class="timeago text-xs text-secondary mt-auto" title="{./createtimeISO}"></span>
13
- </div>
14
- </a>
15
- </div>
16
- </div>
17
- {{{ end }}}
@@ -1,47 +0,0 @@
1
- <div class="d-flex {{{ if group.isOwner }}}justify-content-between{{{ else }}}justify-content-end{{{ end }}} mb-3">
2
- {{{ if isAdmin }}}
3
- <div class="flex-shrink-0">
4
- <button component="groups/members/add" type="button" class="btn btn-primary btn-sm me-3" title="[[groups:details.add-member]]"><i class="fa fa-user-plus"></i> [[groups:details.add-member]]</button>
5
- </div>
6
- {{{ end }}}
7
- <div>
8
- <div class="input-group">
9
- <input class="form-control form-control-sm" type="text" component="groups/members/search" placeholder="[[global:search]]"/>
10
- <button class="btn btn-primary btn-sm search-button" type="button">
11
- <i class="fa fa-search"></i>
12
- </button>
13
- </div>
14
- </div>
15
- </div>
16
-
17
- <div component="groups/members" data-nextstart="{group.membersNextStart}" class="mb-5" style="max-height: 500px; overflow: auto;">
18
- <table class="table table-hover">
19
- <tbody>
20
- {{{each group.members}}}
21
- <tr class="w-100" data-uid="{group.members.uid}" data-isowner="{{{ if group.members.isOwner }}}1{{{ else }}}0{{{ end }}}">
22
- <td class="member-name p-2 w-100 ">
23
- <div class="d-flex align-items-center justify-content-between">
24
- <div class="d-flex align-items-center gap-2">
25
- <a class="text-decoration-none" href="{config.relative_path}/user/{group.members.userslug}">{buildAvatar(group.members, "24px", true)}</a>
26
- <a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
27
- <i component="groups/owner/icon" title="[[groups:owner]]" class="user-owner-icon fa fa-star align-text-top text-warning {{{ if !group.members.isOwner }}}invisible{{{ end }}}"></i>
28
- </div>
29
-
30
- {{{ if group.isOwner }}}
31
- <div class="owner-controls d-flex gap-1">
32
- <a class="btn btn-light btn-sm" href="#" data-action="toggleOwnership" title="[[groups:details.grant]]">
33
- <i class="fa fa-star text-warning"></i>
34
- </a>
35
-
36
- <a class="btn btn-light btn-sm" href="#" data-action="kick" title="[[groups:details.kick]]">
37
- <i class="fa fa-ban text-danger"></i>
38
- </a>
39
- </div>
40
- {{{ end }}}
41
- </div>
42
- </td>
43
- </tr>
44
- {{{end}}}
45
- </tbody>
46
- </table>
47
- </div>
@@ -1,29 +0,0 @@
1
- {{{ if group.pending.length }}}
2
- <div class="d-flex justify-content-end gap-2 mb-3">
3
- <button class="btn btn-danger btn-sm" data-action="rejectAll">[[groups:pending.reject-all]]</button>
4
- <button class="btn btn-success btn-sm" data-action="acceptAll">[[groups:pending.accept-all]]</button>
5
-
6
- </div>
7
- {{{ end }}}
8
-
9
- <div style="max-height: 500px;overflow: auto;">
10
- <div component="groups/pending/alert" class="alert alert-info {{{ if group.pending.length }}}hidden{{{ end }}}">[[groups:pending.none]]</div>
11
- <table component="groups/pending" class="table table-hover">
12
- <tbody>
13
- {{{ each group.pending }}}
14
- <tr data-uid="{group.pending.uid}" class="align-middle">
15
- <td class="member-name p-2 d-flex align-items-center justify-content-between">
16
- <div class="d-flex gap-2">
17
- <a class="text-decoration-none" href="{config.relative_path}/user/{group.pending.userslug}">{buildAvatar(group.pending, "24px", true)}</a>
18
- <a href="{config.relative_path}/user/{group.pending.userslug}">{group.pending.username}</a>
19
- </div>
20
- <div class="d-flex gap-2">
21
- <button class="btn btn-danger btn-sm" data-action="reject">[[groups:pending.reject]]</a></li>
22
- <button class="btn btn-success btn-sm" data-action="accept">[[groups:pending.accept]]</a></li>
23
- </div>
24
- </td>
25
- </tr>
26
- {{{ end }}}
27
- </tbody>
28
- </table>
29
- </div>
@@ -1,27 +0,0 @@
1
- <div class="flex-shrink-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
- <div class="nav sticky-md-top d-flex flex-row flex-md-column flex-wrap gap-1" style="top: 1rem; z-index: 1;">
3
- <button data-bs-toggle="tab" data-bs-target="#groups-posts" class="btn btn-ghost btn-sm text-start d-flex align-items-baseline ff-secondary fw-semibold {{{ if template.groups/details }}}active{{{ end }}}">
4
- <div class="flex-grow-1">[[global:posts]]</div>
5
- </button>
6
- <button data-bs-toggle="tab" data-bs-target="#groups-members" class="btn btn-ghost btn-sm text-start d-flex align-items-baseline ff-secondary fw-semibold gap-2">
7
- <div class="flex-grow-1">[[groups:members]]</div>
8
- <span component="group/member/count" class="flex-shrink-0 text-xs lh-1" title="{formattedNumber(group.memberCount)}">{humanReadableNumber(group.memberCount)}</span>
9
- </button>
10
-
11
- {{{ if group.isOwner }}}
12
- <button data-bs-toggle="tab" data-bs-target="#groups-pending" class="btn btn-ghost btn-sm text-start d-flex align-items-baseline ff-secondary fw-semibold gap-2">
13
- <div class="flex-grow-1">[[groups:details.pending]]</div>
14
- <span component="group/pending/count" class="flex-shrink-0 text-xs lh-1" title="{formattedNumber(group.pending.length)}">{humanReadableNumber(group.pending.length)}</span>
15
- </button>
16
-
17
- <button data-bs-toggle="tab" data-bs-target="#groups-invited" class="btn btn-ghost btn-sm text-start d-flex align-items-baseline ff-secondary fw-semibold gap-2">
18
- <div class="flex-grow-1">[[groups:details.invited]]</div>
19
- <span component="group/invited/count" class="flex-shrink-0 text-xs lh-1" title="{formattedNumber(group.invited.length)}">{humanReadableNumber(group.invited.length)}</span>
20
- </button>
21
-
22
- <button data-bs-toggle="tab" data-bs-target="#groups-admin" class="btn btn-ghost btn-sm text-start d-flex align-items-baseline ff-secondary fw-semibold">
23
- <div class="flex-grow-1">[[global:header.admin]]</div>
24
- </button>
25
- {{{ end }}}
26
- </div>
27
- </div>
@@ -1,19 +0,0 @@
1
- <div id="{alert_id}" role="alert" class="alert alert-dismissible alert-{type} fade show" component="toaster/toast">
2
- <div class="alert-progress position-absolute top-0 start-0 bottom-0 h-100 z-0" style=" opacity:0.1;"></div>
3
- <div class="d-flex flex-wrap gap-2 position-relative">
4
- {{{ if image }}}
5
- <img src="{image}" height="80" style="width: auto;" />
6
- {{{ end }}}
7
- <div class="d-flex flex-column gap-2">
8
- {{{ if title }}}
9
- <strong>{title}</strong>
10
- {{{ end }}}
11
-
12
- {{{ if message }}}
13
- <p class="m-0">{message}</p>
14
- {{{ end }}}
15
- </div>
16
- </div>
17
-
18
- <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="close"></button>
19
- </div>