nodebb-theme-harmony 1.0.0-beta.4 → 1.0.0-beta.41

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 (108) hide show
  1. package/languages/en-GB/harmony.json +5 -1
  2. package/library.js +21 -7
  3. package/package.json +1 -1
  4. package/public/harmony.js +107 -9
  5. package/public/settings.js +1 -0
  6. package/scss/common.scss +46 -4
  7. package/scss/harmony.scss +2 -0
  8. package/scss/mixins.scss +7 -3
  9. package/scss/modals.scss +6 -1
  10. package/scss/modules/bottom-sheet.scss +1 -1
  11. package/scss/modules/composer.scss +0 -4
  12. package/scss/modules/cover.scss +1 -11
  13. package/scss/modules/paginator.scss +24 -0
  14. package/scss/overrides.scss +3 -1
  15. package/scss/search.scss +8 -0
  16. package/scss/sidebar.scss +7 -4
  17. package/scss/topic.scss +22 -12
  18. package/templates/account/blocks.tpl +35 -41
  19. package/templates/account/categories.tpl +23 -30
  20. package/templates/account/consent.tpl +66 -10
  21. package/templates/account/edit/password.tpl +25 -30
  22. package/templates/account/edit/username.tpl +21 -26
  23. package/templates/account/edit.tpl +105 -116
  24. package/templates/account/followers.tpl +12 -19
  25. package/templates/account/following.tpl +12 -18
  26. package/templates/account/groups.tpl +12 -17
  27. package/templates/account/info.tpl +178 -206
  28. package/templates/account/posts.tpl +31 -36
  29. package/templates/account/profile.tpl +66 -73
  30. package/templates/account/sessions.tpl +8 -30
  31. package/templates/account/settings.tpl +193 -198
  32. package/templates/account/theme.tpl +34 -25
  33. package/templates/account/topics.tpl +33 -38
  34. package/templates/account/uploads.tpl +33 -40
  35. package/templates/categories.tpl +1 -1
  36. package/templates/category.tpl +12 -13
  37. package/templates/flags/detail.tpl +24 -25
  38. package/templates/flags/list.tpl +11 -11
  39. package/templates/footer.tpl +2 -2
  40. package/templates/groups/details.tpl +20 -17
  41. package/templates/groups/members.tpl +0 -2
  42. package/templates/partials/account/footer.tpl +3 -0
  43. package/templates/partials/account/header.tpl +78 -81
  44. package/templates/partials/account/session-list.tpl +18 -0
  45. package/templates/partials/breadcrumbs.tpl +6 -6
  46. package/templates/partials/categories/item.tpl +19 -18
  47. package/templates/partials/categories/lastpost.tpl +2 -2
  48. package/templates/partials/{category-filter-content.tpl → category/filter-dropdown-content.tpl} +8 -6
  49. package/templates/partials/{category-selector-content.tpl → category/selector-dropdown-content.tpl} +3 -3
  50. package/templates/partials/category/subcategory.tpl +1 -1
  51. package/templates/partials/category/tags.tpl +0 -2
  52. package/templates/partials/category/watch.tpl +28 -4
  53. package/templates/partials/chats/message-window.tpl +1 -0
  54. package/templates/partials/chats/message.tpl +4 -6
  55. package/templates/partials/cookie-consent.tpl +5 -5
  56. package/templates/partials/flags/filters.tpl +1 -1
  57. package/templates/partials/groups/admin.tpl +4 -4
  58. package/templates/partials/groups/badge.tpl +1 -1
  59. package/templates/partials/groups/memberlist.tpl +1 -1
  60. package/templates/partials/groups/sidebar-left.tpl +1 -1
  61. package/templates/partials/header/brand.tpl +1 -1
  62. package/templates/partials/mobile-footer.tpl +69 -61
  63. package/templates/partials/paginator.tpl +9 -9
  64. package/templates/partials/post_bar.tpl +6 -5
  65. package/templates/partials/posts_list_item.tpl +5 -5
  66. package/templates/partials/quick-search-results.tpl +1 -1
  67. package/templates/partials/search-filters.tpl +184 -0
  68. package/templates/partials/search-results.tpl +28 -32
  69. package/templates/partials/sidebar/chats.tpl +2 -2
  70. package/templates/partials/sidebar/drafts.tpl +42 -34
  71. package/templates/partials/sidebar/logged-in-menu.tpl +5 -5
  72. package/templates/partials/sidebar/notifications.tpl +3 -3
  73. package/templates/partials/sidebar/search.tpl +1 -1
  74. package/templates/partials/sidebar/user-menu.tpl +1 -1
  75. package/templates/partials/sidebar-left.tpl +13 -10
  76. package/templates/partials/sidebar-right.tpl +1 -1
  77. package/templates/partials/skin-switcher.tpl +2 -2
  78. package/templates/partials/tags_list.tpl +6 -4
  79. package/templates/partials/topic/browsing-users.tpl +0 -2
  80. package/templates/partials/topic/event.tpl +1 -1
  81. package/templates/partials/topic/navigation-post.tpl +5 -9
  82. package/templates/partials/topic/navigator-mobile.tpl +48 -0
  83. package/templates/partials/topic/post-editor.tpl +0 -2
  84. package/templates/partials/topic/post-menu-list.tpl +35 -37
  85. package/templates/partials/topic/post.tpl +27 -10
  86. package/templates/partials/topic/quickreply.tpl +6 -6
  87. package/templates/partials/topic/reply-button.tpl +1 -1
  88. package/templates/partials/topic/topic-menu-list.tpl +16 -18
  89. package/templates/partials/topic/watch.tpl +28 -4
  90. package/templates/partials/topic-list-bar.tpl +7 -7
  91. package/templates/partials/topics_list.tpl +41 -41
  92. package/templates/partials/users/filter-dropdown-content.tpl +20 -0
  93. package/templates/popular.tpl +1 -1
  94. package/templates/post-queue.tpl +112 -0
  95. package/templates/recent.tpl +1 -1
  96. package/templates/search.tpl +39 -177
  97. package/templates/tags.tpl +1 -1
  98. package/templates/top.tpl +1 -1
  99. package/templates/topic.tpl +4 -4
  100. package/templates/unread.tpl +1 -1
  101. package/templates/users.tpl +1 -1
  102. package/templates/modules/usercard.tpl +0 -39
  103. package/templates/partials/acceptTos.tpl +0 -11
  104. package/templates/partials/category-filter-right.tpl +0 -5
  105. package/templates/partials/category-filter.tpl +0 -3
  106. package/templates/partials/category-selector-right.tpl +0 -5
  107. package/templates/partials/category-selector.tpl +0 -3
  108. package/templates/partials/slideout-menu.tpl +0 -6
@@ -1,101 +1,98 @@
1
- <div data-widget-area="header">
2
- {{{each widgets.header}}}
3
- {{widgets.header.html}}
4
- {{{end}}}
5
- </div>
1
+ <div class="account">
2
+ <div data-widget-area="header">
3
+ {{{each widgets.header}}}
4
+ {{widgets.header.html}}
5
+ {{{end}}}
6
+ </div>
6
7
 
7
- <div class="cover position-absolute start-0 top-0 w-100" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
8
- <div class="container">
9
- {{{ if allowCoverPicture }}}
10
- {{{ if canEdit }}}
11
- <div class="controls">
12
- <span class="upload"><i class="fa fa-fw fa-2x fa-upload"></i></span>
13
- <span class="resize"><i class="fa fa-fw fa-2x fa-arrows"></i></span>
14
- <span class="remove"><i class="fa fa-fw fa-2x fa-times"></i></span>
8
+ <div class="cover position-absolute start-0 top-0 w-100" component="account/cover" style="background-image: url({cover:url}); background-position: {cover:position};">
9
+ <div class="container">
10
+ {{{ if allowCoverPicture }}}
11
+ {{{ if canEdit }}}
12
+ <div class="controls text-center">
13
+ <span class="upload p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-upload"></i></span>
14
+ <span class="resize p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-arrows"></i></span>
15
+ <span class="remove p-2 m-2 rounded-1 text-bg-light opacity-75"><i class="fa fa-fw fa-times"></i></span>
16
+ </div>
17
+ <div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
18
+ <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
19
+ {{{ end }}}
20
+ {{{ end }}}
15
21
  </div>
16
- <div class="save text-bg-primary">[[groups:cover-save]] <i class="fa fa-fw fa-floppy-o"></i></div>
17
- <div class="indicator text-bg-primary">[[groups:cover-saving]] <i class="fa fa-fw fa-refresh fa-spin"></i></div>
18
- {{{ end }}}
19
- {{{ end }}}
20
22
  </div>
21
- </div>
22
23
 
23
- <div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
24
- <div class="avatar-wrapper border-4 position-relative align-self-start d-none d-md-block" style="margin-top: -75px;">
25
- {{{ if picture }}}
26
- <img src="{picture}" class="avatar avatar-rounded" style="--avatar-size: 142px;" />
27
- {{{ else }}}
28
- <div class="avatar avatar-rounded" style="background-color: {icon:bgColor}; --avatar-size: 142px;" title="{username}">{icon:text}</div>
29
- {{{ end }}}
30
- </div>
24
+ <div class="d-flex flex-column flex-md-row gap-2 w-100 pb-4 mb-4 mt-2 border-bottom">
25
+ <div {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}component="profile/change/picture"{{{ end }}} class="avatar-wrapper border-4 position-relative align-self-center align-self-md-start hover-parent" style="margin-top: -75px;">
26
+ {buildAvatar(@value, "142px", true)}
27
+ {{{ if (allowProfilePicture && isSelfOrAdminOrGlobalModerator)}}}
28
+ <div component="profile/change/picture" class="d-none d-md-block pointer p-2 rounded-1 opacity-75 text-bg-light position-absolute top-50 start-50 translate-middle hover-visible">
29
+ <span class="upload"><i class="fa fa-fw fa-upload"></i></span>
30
+ </div>
31
+ {{{ end }}}
32
+ </div>
31
33
 
32
- <div class="avatar-wrapper border-4 position-relative align-self-center d-block d-md-none" style="margin-top: -75px;">
33
- {{{ if picture }}}
34
- <img src="{picture}" class="avatar avatar-rounded" style="--avatar-size: 142px;" />
35
- {{{ else }}}
36
- <div class="avatar avatar-rounded" style="background-color: {icon:bgColor}; --avatar-size: 142px;" title="{username}">{icon:text}</div>
37
- {{{ end }}}
38
- </div>
34
+ <div class="d-flex flex-column flex-md-row mt-1 justify-content-between w-100 gap-2">
35
+ <div class="d-flex flex-1 flex-row gap-2">
36
+ <div class="d-flex flex-column">
37
+ <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
38
+ <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
39
+ <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
40
+ <div class="d-flex align-items-center gap-1 p-1">
41
+ {{{ if selectedGroup.length }}}
42
+ {{{ each selectedGroup }}}
43
+ {{{ if ./slug }}}
44
+ <!-- IMPORT partials/groups/badge.tpl -->
45
+ {{{ end }}}
46
+ {{{ end }}}
47
+ {{{ end }}}
48
+ </div>
49
+ </div>
39
50
 
40
- <div class="d-flex flex-column flex-md-row mt-1 justify-content-between w-100 gap-2">
41
- <div class="d-flex flex-1 flex-row gap-2">
42
- <div class="d-flex flex-column">
43
- <h2 class="fullname fw-semibold fs-2 tracking-tight mb-0">{{{ if fullname }}}{fullname}{{{ else }}}{username}{{{ end }}}</h2>
44
- <div class="d-flex flex-wrap gap-1 text-sm align-items-center">
45
- <span class="username fw-bold">{{{ if !banned }}}@{username}{{{ else }}}[[user:banned]]{{{ end }}}</span>
46
- <div class="d-flex align-items-center gap-1 p-1">
47
- {{{ if selectedGroup.length }}}
48
- {{{ each selectedGroup }}}
49
- {{{ if ./slug }}}
50
- <!-- IMPORT partials/groups/badge.tpl -->
51
- {{{ end }}}
52
- {{{ end }}}
51
+ {{{ if isAdminOrGlobalModeratorOrModerator }}}
52
+ {{{ if banned }}}
53
+ <div class="text-xm text-muted">
54
+ {{{ if banned_until }}}
55
+ [[user:info.banned-until, {banned_until_readable}]]
56
+ {{{ else }}}
57
+ [[user:info.banned-permanently]]
53
58
  {{{ end }}}
54
59
  </div>
60
+ {{{ end }}}
61
+ {{{ end }}}
55
62
  </div>
63
+ </div>
64
+
65
+ <div class="d-flex gap-1 align-self-stretch align-self-md-start justify-content-end">
66
+ {{{ if loggedIn }}}
67
+ {{{ if !isSelf }}}
68
+ <a component="account/unfollow" href="#" class="btn btn-info flex-fill{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
69
+ <a component="account/follow" href="#" class="btn btn-primary flex-fill{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
70
+ {{{ end }}}
71
+ {{{ end }}}
56
72
 
57
- {{{ if isAdminOrGlobalModeratorOrModerator }}}
58
- {{{ if banned }}}
59
- <div class="text-xm text-muted">
60
- {{{ if banned_until }}}
61
- [[user:info.banned-until, {banned_until_readable}]]
62
- {{{ else }}}
63
- [[user:info.banned-permanently]]
73
+ {{{ if (loggedIn && (!isSelf && (!banned && !config.disableChat))) }}}
74
+ <div class="btn-group flex-fill">
75
+ <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
76
+ {{{ if hasPrivateChat}}}
77
+ <button type="button" class="btn btn-light dropdown-toggle flex-0" data-bs-toggle="dropdown">
78
+ <i class="fa fa-caret-down"></i>
79
+ </button>
80
+ <ul class="dropdown-menu dropdown-menu-end" role="menu">
81
+ <li><a class="dropdown-item" href="#" component="account/new-chat">[[user:new_chat_with, {username}]]</a></li>
82
+ </ul>
64
83
  {{{ end }}}
65
84
  </div>
66
85
  {{{ end }}}
86
+ {{{ if !isSelf }}}
87
+ {{{ if (isAdmin || (canBan || canMute ))}}}
88
+ <!-- IMPORT partials/account/admin-menu.tpl -->
67
89
  {{{ end }}}
68
- </div>
69
- </div>
70
-
71
- <div class="d-flex gap-1 align-self-stretch align-self-md-start justify-content-end">
72
- {{{ if loggedIn }}}
73
- {{{ if !isSelf }}}
74
- <a component="account/unfollow" href="#" class="btn btn-info flex-fill{{{ if !isFollowing }}} hide{{{ end }}}">[[user:unfollow]]</a>
75
- <a component="account/follow" href="#" class="btn btn-primary flex-fill{{{ if isFollowing }}} hide{{{ end }}}">[[user:follow]]</a>
76
- {{{ end }}}
77
- {{{ end }}}
78
-
79
- {{{ if (loggedIn && (!isSelf && (!banned && !config.disableChat))) }}}
80
- <div class="btn-group flex-fill">
81
- <a {{{ if hasPrivateChat }}}component="account/chat"{{{ else }}}component="account/new-chat"{{{ end }}} href="#" class="btn btn-light" role="button">[[user:chat]]</a>
82
- {{{ if hasPrivateChat}}}
83
- <button type="button" class="btn btn-light dropdown-toggle flex-0" data-bs-toggle="dropdown">
84
- <i class="fa fa-caret-down"></i>
85
- </button>
86
- <ul class="dropdown-menu dropdown-menu-end" role="menu">
87
- <li><a class="dropdown-item" href="#" component="account/new-chat">[[user:new_chat_with, {username}]]</a></li>
88
- </ul>
89
90
  {{{ end }}}
90
91
  </div>
91
- {{{ end }}}
92
- {{{ if !isSelf }}}
93
- {{{ if (isAdmin || (canBan || canMute ))}}}
94
- <!-- IMPORT partials/account/admin-menu.tpl -->
95
- {{{ end }}}
96
- {{{ end }}}
97
92
  </div>
98
93
  </div>
99
- </div>
100
94
 
95
+ <div class="d-flex flex-column flex-md-row">
96
+ <!-- IMPORT partials/account/sidebar-left.tpl -->
97
+ <div class="account-content flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
101
98
 
@@ -0,0 +1,18 @@
1
+ {{{ each sessions }}}
2
+ <li class="list-group-item text-break" data-uuid="{./uuid}">
3
+ <div class="float-end">
4
+ {{{ if isSelfOrAdminOrGlobalModerator }}}
5
+ {{{ if !./current }}}
6
+ <button class="btn btn-sm btn-outline-secondary" type="button" data-action="revokeSession">[[user:revoke-session]]</button>
7
+ {{{ end }}}
8
+ {{{ end }}}
9
+ {function.userAgentIcons}
10
+ <i class="fa fa-circle text-{{{ if ./current }}}success{{{ else }}}muted{{{ end }}}"></i>
11
+ </div>
12
+ [[user:browser-version-on-platform, {./browser}, {./version}, {./platform}]]<br />
13
+ <small class="timeago text-muted" title="{../datetimeISO}"></small>
14
+ <ul>
15
+ <li><strong>[[global:ip_address]]</strong>: {../ip}</li>
16
+ </ul>
17
+ </li>
18
+ {{{ end }}}
@@ -1,12 +1,12 @@
1
1
  {{{ if breadcrumbs.length }}}
2
- <ol class="breadcrumb mb-0 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}" itemscope="itemscope" itemprop="breadcrumb" itemtype="http://schema.org/BreadcrumbList">
3
- {{{each breadcrumbs}}}
4
- <li<!-- IF @last --> component="breadcrumb/current"<!-- ENDIF @last --> itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem" class="breadcrumb-item <!-- IF @last -->active<!-- ENDIF @last -->">
2
+ <ol class="breadcrumb mb-0 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}" itemscope="itemscope" itemprop="breadcrumb" itemtype="http://schema.org/BreadcrumbList">
3
+ {{{ each breadcrumbs }}}
4
+ <li{{{ if @last }}} component="breadcrumb/current"{{{ end }}} itemscope="itemscope" itemprop="itemListElement" itemtype="http://schema.org/ListItem" class="breadcrumb-item {{{ if @last }}}active{{{ end }}}">
5
5
  <meta itemprop="position" content="{@index}" />
6
- {{{ if ./url }}}<a href="{breadcrumbs.url}" itemprop="item">{{{ end }}}
7
- <span class="fw-semibold" itemprop="name">{breadcrumbs.text}</span>
6
+ {{{ if ./url }}}<a href="{./url}" itemprop="item">{{{ end }}}
7
+ <span class="fw-semibold" itemprop="name">{./text}</span>
8
8
  {{{ if ./url }}}</a>{{{ end }}}
9
9
  </li>
10
- {{{end}}}
10
+ {{{ end }}}
11
11
  </ol>
12
12
  {{{ end }}}
@@ -33,27 +33,28 @@
33
33
  {{{ end }}}
34
34
  </div>
35
35
  </div>
36
-
37
- {{{ if !./link }}}
38
- <div class="col-md-2 d-none d-md-flex stats text-muted gap-2 px-0">
39
- <div class="w-50">
40
- <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
41
- <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalTopicCount}">{./totalTopicCount}</span>
42
- <span class="text-lowercase text-xs">[[global:topics]]</span>
36
+ <div class="row col-md-5 col-sm-3 d-none d-md-flex align-self-start">
37
+ {{{ if !./link }}}
38
+ <div class="col-md-5 d-none d-lg-flex stats text-muted gap-2 px-0">
39
+ <div class="w-50">
40
+ <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
41
+ <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalTopicCount}">{./totalTopicCount}</span>
42
+ <span class="text-lowercase text-xs">[[global:topics]]</span>
43
+ </div>
43
44
  </div>
44
- </div>
45
- <div class="w-50">
46
- <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
47
- <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalPostCount}">{./totalPostCount}</span>
48
- <span class="text-lowercase text-xs">[[global:posts]]</span>
45
+ <div class="w-50">
46
+ <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
47
+ <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalPostCount}">{./totalPostCount}</span>
48
+ <span class="text-lowercase text-xs">[[global:posts]]</span>
49
+ </div>
49
50
  </div>
50
51
  </div>
51
- </div>
52
52
 
53
- {{{ if !config.hideCategoryLastPost }}}
54
- <div class="col-md-3 col-sm-3 teaser d-none d-sm-block" component="topic/teaser">
55
- <!-- IMPORT partials/categories/lastpost.tpl -->
53
+ {{{ if !config.hideCategoryLastPost }}}
54
+ <div class="col-md-7 col-sm-3 teaser d-none d-sm-block" component="topic/teaser">
55
+ <!-- IMPORT partials/categories/lastpost.tpl -->
56
+ </div>
57
+ {{{ end }}}
58
+ {{{ end }}}
56
59
  </div>
57
- {{{ end }}}
58
- {{{ end }}}
59
60
  </li>
@@ -4,12 +4,12 @@
4
4
  <div component="category/posts" class="ps-3">
5
5
  <a class="background-link" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}"></a>
6
6
  <p class="mb-0">
7
- <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "20px", true)}</a>
7
+ <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "20px", true, "avatar-tooltip")}</a>
8
8
  <a class="permalink text-muted" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}">
9
9
  <span class="timeago text-xs" title="{../timestampISO}"></span>
10
10
  </a>
11
11
  </p>
12
- <div class="post-content mt-2 overflow-hidden text-xs line-clamp-3">
12
+ <div class="post-content overflow-hidden text-xs line-clamp-2">
13
13
  {./content}
14
14
  </div>
15
15
  </div>
@@ -1,7 +1,7 @@
1
1
  <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
2
  {{{ if selectedCategory }}}
3
- <span class="category-item">
4
- {buildCategoryIcon(selectedCategory, "20px", "rounded-circle")}
3
+ <span class="category-item d-inline-flex align-items-center gap-1">
4
+ {buildCategoryIcon(selectedCategory, "18px", "rounded-circle")}
5
5
  <span class="visible-md-inline visible-lg-inline fw-semibold">{selectedCategory.name}</span>
6
6
  </span>
7
7
  {{{ else }}}
@@ -9,18 +9,20 @@
9
9
  <span class="visible-md-inline visible-lg-inline fw-semibold">[[unread:all_categories]]</span>{{{ end }}}
10
10
  </button>
11
11
  <div component="category-selector-search" class="hidden position-absolute">
12
- <input type="text" class="form-control" autocomplete="off">
12
+ <input type="text" class="form-control form-control-sm" autocomplete="off">
13
13
  </div>
14
14
  <ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
15
- <li role="presentation" class="category" data-all="all">
16
- <a class="dropdown-item" role="menu-item" href="{config.relative_path}/{allCategoriesUrl}"><i component="category/select/icon" class="fa fa-fw fa-check {{{if selectedCategory}}}invisible{{{end}}}"></i> [[unread:all_categories]]</a>
15
+ <li role="presentation" class="category" data-cid="all">
16
+ <a class="dropdown-item" role="menu-item" href="{{{ if allCategoriesUrl }}}{config.relative_path}/{allCategoriesUrl}{{{ else }}}#{{{ end }}}"><i component="category/select/icon" class="fa fa-fw fa-check {{{if selectedCategory}}}invisible{{{end}}}"></i> [[unread:all_categories]]</a>
17
17
  </li>
18
18
  {{{each categoryItems}}}
19
19
  <li role="presentation" class="category {{{ if ../disabledClass }}}disabled{{{ end }}}" data-cid="{../cid}" data-parent-cid="{../parentCid}" data-name="{../name}">
20
20
  <a class="dropdown-item" role="menu-item" href="#">{../level}<i component="category/select/icon" class="fa fa-fw fa-check {{{ if !../selected }}}invisible{{{ end }}}"></i>
21
21
  <span component="category-markup" style="{{{ if ../match }}}font-weight: bold;{{{end}}}">
22
- <div class="category-item d-inline-block">
22
+ <div class="category-item d-inline-flex align-items-center gap-1">
23
+ {{{ if ./icon }}}
23
24
  {buildCategoryIcon(@value, "24px", "rounded-circle")}
25
+ {{{ end }}}
24
26
  {./name}
25
27
  </div>
26
28
  </span>
@@ -1,7 +1,7 @@
1
1
  <button type="button" class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
2
2
  <span component="category-selector-selected">
3
3
  {{{ if (selectedCategory && !showCategorySelectLabel) }}}
4
- <span class="category-item">
4
+ <span class="category-item d-inline-flex align-items-center gap-1">
5
5
  {buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}
6
6
  <span class="fw-semibold">{selectedCategory.name}</span>
7
7
  </span>
@@ -12,7 +12,7 @@
12
12
  </span>
13
13
  </button>
14
14
  <div component="category-selector-search" class="hidden position-absolute">
15
- <input type="text" class="form-control" autocomplete="off">
15
+ <input type="text" class="form-control form-control-sm" autocomplete="off">
16
16
  </div>
17
17
  <ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
18
18
  <li component="category/no-matches" role="presentation" class="category hidden">
@@ -22,7 +22,7 @@
22
22
  <li role="presentation" class="category {{{ if ./disabledClass }}}disabled {{{ end }}}" data-cid="{./cid}" data-name="{./name}" data-parent-cid="{./parentCid}">
23
23
  <a class="dropdown-item" role="menu-item">{./level}
24
24
  <span component="category-markup" style="{{{ if ./match }}}font-weight: bold;{{{end}}}">
25
- <div class="category-item d-inline-block">
25
+ <div class="category-item d-inline-flex align-items-center gap-1">
26
26
  {{{ if ./icon }}}
27
27
  {buildCategoryIcon(@value, "24px", "rounded-circle")}
28
28
  {{{ end }}}
@@ -1,7 +1,7 @@
1
1
  {{{ if children.length }}}
2
2
  <div class="subcategory">
3
3
  {{{ if hasMoreSubCategories }}}
4
- <div class="mb-2"><!-- IMPORT partials/category-selector.tpl --></div>
4
+ <div class="mb-2"><!-- IMPORT partials/category/selector-dropdown-left.tpl --></div>
5
5
  {{{ else }}}
6
6
  <h3 class="fs-6 fw-semibold">[[category:subcategories]]</h3>
7
7
  {{{ end }}}
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  {{{ each tags }}}
4
2
  <a href="{config.relative_path}/tags/{topics.tags.value}"><span class="tag-item" data-tag="{topics.tags.value}">{topics.tags.value}</span><span class="tag-topic-count human-readable-number" title="{topics.tags.score}">{topics.tags.score}</span></a>
5
3
  {{{ end }}}
@@ -1,5 +1,5 @@
1
1
  {{{ if config.loggedIn }}}
2
- <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch">
2
+ <div class="btn-group bottom-sheet" component="topic/watch">
3
3
  <button class="btn-ghost-sm d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
4
  <span component="category/watching/menu" {{{ if !./isWatched }}}class="hidden"{{{ end }}}><i class="fa fa-fw fa-inbox text-primary"></i><span class="visible-md-inline visible-lg-inline fw-semibold"> [[category:watching]]</span></span>
5
5
 
@@ -9,11 +9,35 @@
9
9
  </button>
10
10
 
11
11
  <ul class="dropdown-menu">
12
- <li><a class="dropdown-item" href="#" component="category/watching" data-state="watching"><i component="category/watching/check" class="fa fa-fw {{{ if ./isWatched }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-inbox"></i> [[category:watching]]<p class="help-text text-muted"><small>[[category:watching.description]]</small></p></a></li>
12
+ <li>
13
+ <a class="dropdown-item d-flex" href="#" component="category/watching" data-state="watching">
14
+ <span><i component="category/watching/check" class="fa fa-fw {{{ if ./isWatched }}}fa-check{{{ end }}}"></i></span>
15
+ <div class="d-flex flex-column">
16
+ <span><i class="fa fa-fw fa-inbox"></i> [[category:watching]]</span>
17
+ <p class="help-text text-muted"><small>[[category:watching.description]]</small></p>
18
+ </div>
19
+ </a>
20
+ </li>
13
21
 
14
- <li><a class="dropdown-item" href="#" component="category/notwatching" data-state="notwatching"><i component="category/notwatching/check" class="fa fa-fw {{{ if ./isNotWatched }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]<p class="help-text text-muted"><small>[[category:not-watching.description]]</small></p></a></li>
22
+ <li>
23
+ <a class="dropdown-item d-flex" href="#" component="category/notwatching" data-state="notwatching">
24
+ <span><i component="category/notwatching/check" class="fa fa-fw {{{ if ./isNotWatched }}}fa-check{{{ end }}}"></i></span>
25
+ <div class="d-flex flex-column">
26
+ <span><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]</span>
27
+ <p class="help-text text-muted"><small>[[category:not-watching.description]]</small></p>
28
+ </div>
29
+ </a>
30
+ </li>
15
31
 
16
- <li><a class="dropdown-item" href="#" component="category/ignoring" data-state="ignoring"><i component="category/ignoring/check" class="fa fa-fw {{{ if ./isIgnored }}}fa-check{{{ end }}}"></i><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]<p class="help-text text-muted"><small>[[category:ignoring.description]]</small></p></a></li>
32
+ <li>
33
+ <a class="dropdown-item d-flex" href="#" component="category/ignoring" data-state="ignoring">
34
+ <span><i component="category/ignoring/check" class="fa fa-fw {{{ if ./isIgnored }}}fa-check{{{ end }}}"></i></span>
35
+ <div class="d-flex flex-column">
36
+ <span><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]</span>
37
+ <p class="help-text text-muted"><small>[[category:ignoring.description]]</small></p>
38
+ </div>
39
+ </a>
40
+ </li>
17
41
  </ul>
18
42
  </div>
19
43
  {{{ end }}}
@@ -26,6 +26,7 @@
26
26
  <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2" style="resize:none;"></textarea>
27
27
  <span component="chat/message/remaining" class="text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
28
28
  </div>
29
+ <button component="chat/upload/button" class="btn btn-light" type="button"><i class="fa fa-fw fa-2x fa-upload"></i></button>
29
30
  <button class="btn btn-primary" type="button" data-action="send"><i class="fa fa-fw fa-2x fa-paper-plane"></i></button>
30
31
  <form component="chat/upload" method="post" enctype="multipart/form-data">
31
32
  <input type="file" name="files[]" multiple class="hidden"/>
@@ -18,19 +18,17 @@
18
18
  {messages.content}
19
19
  </div>
20
20
 
21
- <!-- IF !config.disableChatMessageEditing -->
22
- <!-- IF messages.self -->
21
+ {{{ if (!config.disableChatMessageEditing && ./self ) }}}
23
22
  <div class="position-relative">
24
23
  <div class="btn-group border shadow-sm controls position-absolute small hover-d-block" style="bottom:5px; right:30px; display:none;">
25
24
  <button class="btn btn-sm btn-link" data-action="edit"><i class="fa fa-pencil"></i></button>
26
25
  <button class="btn btn-sm btn-link" data-action="delete"><i class="fa fa-trash"></i></button>
27
26
  <button class="btn btn-sm btn-link" data-action="restore"><i class="fa fa-repeat"></i></button>
28
- <!-- IF isAdminOrGlobalMod -->
27
+ {{{ if isAdminOrGlobalMod }}}
29
28
  <button class="btn btn-sm btn-link chat-ip" title="[[modules:chat.show-ip]]"><i class="fa fa-info-circle chat-ip-button"></i></button>
30
- <!-- ENDIF isAdminOrGlobalMod -->
29
+ {{{ end }}}
31
30
  </div>
32
31
  </div>
33
- <!-- ENDIF messages.self -->
34
- <!-- ENDIF !config.disableChatMessageEditing -->
32
+ {{{ end }}}
35
33
  </div>
36
34
  </li>
@@ -1,6 +1,6 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="cookie-consent">
4
- <button class="float-end btn btn-primary">{dismiss}</button>
5
- {message} <a target="_blank" rel="noopener" href="{link_url}">{link}</a>
1
+ <div class="d-flex justify-content-center position-fixed start-0 bottom-0 w-100 mb-5 mb-md-0">
2
+ <div class="cookie-consent text-bg-info w-50 p-3 rounded d-flex gap-2 mb-5 mb-md-3 justify-content-between align-items-center">
3
+ <span>{message} <a class="fw-bold" target="_blank" rel="noopener" href="{link_url}">{link}</a></span>
4
+ <button class="btn btn-primary text-nowrap">{dismiss}</button>
5
+ </div>
6
6
  </div>
@@ -30,7 +30,7 @@
30
30
  <div class="mb-3">
31
31
  <label class="form-label" for="filter-cid">[[flags:filter-cid]]</label>
32
32
  <div class="input-group">
33
- <!-- IMPORT partials/category-filter.tpl -->
33
+ <!-- IMPORT partials/category/filter-dropdown-left.tpl -->
34
34
  </div>
35
35
  </div>
36
36
  <div class="mb-3">
@@ -4,7 +4,7 @@
4
4
  <div class="col-12 col-lg-6">
5
5
  <div class="mb-3">
6
6
  <label class="form-label" for="name">[[groups:details.group_name]]</label>
7
- <input <!-- IF group.system -->readonly<!-- ENDIF group.system --> class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
7
+ <input {{{ if group.system }}}readonly{{{ end }}} class="form-control" name="name" id="name" type="text" value="{group.displayName}" />
8
8
  </div>
9
9
  <div class="mb-3">
10
10
  <label class="form-label" for="name">[[groups:details.description]]</label>
@@ -13,7 +13,7 @@
13
13
 
14
14
  <div class="form-check">
15
15
  <label class="form-check-label">[[groups:details.private]]</label>
16
- <input class="form-check-input" name="private" type="checkbox"<!-- IF group.private --> checked<!-- ENDIF group.private -->>
16
+ <input class="form-check-input" name="private" type="checkbox"{{{ if group.private }}} checked{{{ end }}}>
17
17
  {{{ if !allowPrivateGroups }}}
18
18
  <p class="form-text">
19
19
  [[groups:details.private_system_help]]
@@ -25,7 +25,7 @@
25
25
  </div>
26
26
  <div class="form-check">
27
27
  <label class="form-check-label">[[groups:details.hidden]]</label>
28
- <input class="form-check-input" name="hidden" type="checkbox"<!-- IF group.hidden --> checked<!-- ENDIF group.hidden -->>
28
+ <input class="form-check-input" name="hidden" type="checkbox"{{{ if group.hidden }}} checked{{{ end }}}>
29
29
  <p class="form-text text-xs m-0">
30
30
  [[groups:details.hidden_help]]
31
31
  </p>
@@ -82,7 +82,7 @@
82
82
  <label class="form-label" for="memberPostCids">[[groups:details.member-post-cids]]</label>
83
83
  <div class="d-flex gap-1">
84
84
  <div class="member-post-cids-selector">
85
- <!-- IMPORT partials/category-selector.tpl -->
85
+ <!-- IMPORT partials/category/selector-dropdown-left.tpl -->
86
86
  </div>
87
87
  <input id="memberPostCids" type="text" class="form-control" value="{group.memberPostCids}">
88
88
  </div>
@@ -1 +1 @@
1
- <a href="{config.relative_path}/groups/{./slug}" class="badge rounded-1 text-uppercase text-truncate text-decoration-none" style="max-width: 150px;color:{./textColor};background-color: {./labelColor};"><i class="fa {{{ if ./icon }}}{./icon}{{{ if ./userTitle}}} me-1{{{ end }}}{{{else}}}hidden{{{ end }}}"></i><span class="badge-text">{{{ if ./userTitle }}}{./userTitle}{{{ end }}}</span></a>
1
+ <a href="{config.relative_path}/groups/{./slug}" class="badge rounded-1 text-uppercase text-truncate text-decoration-none" style="max-width: 150px;color:{./textColor};background-color: {./labelColor};"><i class="fa {{{ if ./icon }}}{./icon}{{{ if ./userTitle}}} me-1{{{ end }}}{{{else}}}hidden{{{ end }}}"></i><span class="badge-text align-text-bottom">{{{ if ./userTitle }}}{./userTitle}{{{ end }}}</span></a>
@@ -25,7 +25,7 @@
25
25
  <div class="d-flex align-items-center justify-content-between">
26
26
  <div class="d-flex align-items-center gap-2">
27
27
  <a class="align-text-top" href="{config.relative_path}/user/{group.members.userslug}">{group.members.username}</a>
28
- <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<!-- ENDIF !group.members.isOwner -->"></i>
28
+ <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>
29
29
  </div>
30
30
 
31
31
  {{{ if group.isOwner }}}
@@ -1,5 +1,5 @@
1
1
  <div class="flex-0 pe-2 border-end-md text-sm mb-3 flex-basis-md-200">
2
- <div class="nav sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
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
3
  <button data-bs-toggle="tab" data-bs-target="#groups-posts" class="btn-ghost fw-semibold {{{ if template.groups/details }}}active{{{ end }}}">
4
4
  <div class="flex-1">[[global:posts]]</div>
5
5
  </button>
@@ -1,6 +1,6 @@
1
1
  {{{ if (brand:logo || config.showSiteTitle)}}}
2
2
  <div class="container brand-container">
3
- <div class="col-12 d-flex border-bottom pb-3 {{{ if config.centerHeaderElements }}}justify-content-center{{{ end }}}">
3
+ <div class="col-12 d-flex border-bottom pb-3 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
4
4
  <div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
5
5
  {{{ if brand:logo }}}
6
6
  <a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}">