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
@@ -0,0 +1,82 @@
1
+ <div class="col-12 col-md-3 col-lg-2 border-end-md text-sm mb-3">
2
+ <div class="sticky-top d-flex flex-row flex-md-column flex-wrap gap-1" style="z-index: 1;">
3
+ <a href="{config.relative_path}/user/{userslug}" class="btn-ghost fw-semibold {{{ if template.account/profile }}}active{{{ end }}}">
4
+ <div class="flex-1">[[global:about]]</div>
5
+ </a>
6
+ <a href="{config.relative_path}/user/{userslug}/posts"class="btn-ghost fw-semibold
7
+ {{{ if template.account/posts }}}active{{{ end }}}
8
+ {{{ if template.account/best }}}active{{{ end }}}
9
+ {{{ if template.account/controversial }}}active{{{ end }}}
10
+ {{{ if template.account/upvoted }}}active{{{ end }}}
11
+ {{{ if template.account/downvoted }}}active{{{ end }}}
12
+ {{{ if template.account/bookmarks }}}active{{{ end }}}">
13
+ <div class="flex-1">[[global:posts]]</div>
14
+ <span class="text-xs human-readable-number" title="{counts.posts}">{counts.posts}</span>
15
+ </a>
16
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost fw-semibold
17
+ {{{ if template.account/topics }}}active{{{ end }}}
18
+ {{{ if template.account/watched }}}active{{{ end }}}
19
+ {{{ if template.account/ignored }}}active{{{ end }}}">
20
+ <div class="flex-1">[[global:topics]]</div>
21
+ <span class="text-xs human-readable-number" title="{counts.topics}">{counts.topics}</span>
22
+ </a>
23
+ <a href="{config.relative_path}/user/{userslug}/groups" class="btn-ghost fw-semibold">
24
+ <div class="flex-1">[[global:header.groups]]</div>
25
+ <span class="text-xs human-readable-number" title="{counts.groups}">{counts.groups}</span>
26
+ </a>
27
+
28
+ <a href="{config.relative_path}/user/{userslug}/followers" class="btn-ghost fw-semibold">
29
+ <div class="flex-1">[[user:followers]]</div>
30
+ <span class="text-xs human-readable-number" title="{counts.followers}">{counts.followers}</span>
31
+ </a>
32
+
33
+ <a href="{config.relative_path}/user/{userslug}/following" class="btn-ghost fw-semibold">
34
+ <div class="flex-1">[[user:following]]</div>
35
+ <span class="text-xs human-readable-number" title="{counts.following}">{counts.following}</span>
36
+ </a>
37
+
38
+ {{{ if canEdit }}}
39
+ <a href="{config.relative_path}/user/{userslug}/blocks" class="btn-ghost fw-semibold">
40
+ <div class="flex-1">[[user:blocked-users]]</div>
41
+ <span class="text-xs human-readable-number" title="{counts.blocks}">{counts.blocks}</span>
42
+ </a>
43
+
44
+ <a href="{config.relative_path}/user/{userslug}/uploads" class="btn-ghost fw-semibold">
45
+ <div class="flex-1">[[global:uploads]]</div>
46
+ <span class="text-xs human-readable-number" title="{counts.uploaded}">{counts.uploaded}</span>
47
+ </a>
48
+ {{{ end }}}
49
+
50
+ <hr/>
51
+ {{{ if (loggedIn && (!isSelf && !banned)) }}}
52
+ <a href="#" component="account/flag" class="btn-ghost-sm">
53
+ <i class="fa-solid fa-flag text-danger"></i>
54
+ <div class="flex-1 text-nowrap">[[user:flag-profile]]</div>
55
+ </a>
56
+ <a href="#" component="account/block" class="btn-ghost-sm {{{ if isBlocked }}}hidden{{{ end }}}">
57
+ <i class="fa-solid fa-ban text-danger"></i>
58
+ <div class="flex-1 text-nowrap">[[user:block_user]]</div>
59
+ </a>
60
+ <a href="#" component="account/unblock" class="btn-ghost-sm {{{ if !isBlocked }}}hidden{{{ end }}}">
61
+ <i class="fa-solid fa-ban text-danger"></i>
62
+ <div class="flex-1 text-nowrap">[[user:unblock_user]]</div>
63
+ </a>
64
+ <hr/>
65
+ {{{ end }}}
66
+
67
+ {{{ if canEdit }}}
68
+ <a href="{config.relative_path}/user/{userslug}/edit" class="btn-ghost-sm text-xs">
69
+ <div class="flex-1">[[user:edit-profile]]</div>
70
+ </a>
71
+ <a href="{config.relative_path}/user/{userslug}/settings" class="btn-ghost-sm text-xs">
72
+ <div class="flex-1">[[user:settings]]</div>
73
+ </a>
74
+ {{{ end }}}
75
+
76
+ {{{ each profile_links }}}
77
+ <a href="{config.relative_path}/user/{userslug}/{./route}" class="btn-ghost-sm text-xs plugin-link {{{ if ./public }}}public{{{ else }}}private{{{ end }}}" id="{./id}">
78
+ <div class="flex-1">{./name}</div>
79
+ </a>
80
+ {{{end}}}
81
+ </div>
82
+ </div>
@@ -1,20 +1,12 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <!-- IF breadcrumbs.length -->
4
- <ol class="breadcrumb" itemscope="itemscope" itemprop="breadcrumb" itemtype="http://schema.org/BreadcrumbList">
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">
5
3
  {{{each breadcrumbs}}}
6
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 -->">
7
5
  <meta itemprop="position" content="{@index}" />
8
6
  {{{ if ./url }}}<a href="{breadcrumbs.url}" itemprop="item">{{{ end }}}
9
- <span itemprop="name">
10
- {breadcrumbs.text}
11
- <!-- IF @last -->
12
- <!-- IF !feeds:disableRSS -->
13
- <!-- IF rssFeedUrl --><a target="_blank" href="{rssFeedUrl}" itemprop="item"><i class="fa fa-rss-square"></i></a><!-- ENDIF rssFeedUrl --><!-- ENDIF !feeds:disableRSS -->
14
- <!-- ENDIF @last -->
15
- </span>
7
+ <span class="fw-semibold" itemprop="name">{breadcrumbs.text}</span>
16
8
  {{{ if ./url }}}</a>{{{ end }}}
17
9
  </li>
18
10
  {{{end}}}
19
11
  </ol>
20
- <!-- ENDIF breadcrumbs.length -->
12
+ {{{ end }}}
@@ -1,62 +1,66 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
1
+ <li component="categories/category" data-cid="{./cid}" class="row clearfix category-{./cid}">
2
+ <meta itemprop="name" content="{./name}">
2
3
 
3
- <li component="categories/category" data-cid="{../cid}" data-numRecentReplies="1" class="row clearfix category-{../cid}">
4
- <meta itemprop="name" content="{../name}">
5
-
6
- <div class="content col-12 <!-- IF config.hideCategoryLastPost -->col-md-10 col-sm-12<!-- ELSE -->col-md-7 col-sm-9<!-- ENDIF config.hideCategoryLastPost -->">
7
- <div class="float-start">
8
- {buildCategoryIcon(@value, "48px", "rounded-circle")}
4
+ <div class="d-flex gap-3 col-12 {{{ if config.hideCategoryLastPost }}}col-md-10 col-sm-12{{{ else }}}col-md-7 col-sm-9{{{ end }}}">
5
+ <div class="">
6
+ {buildCategoryIcon(@value, "40px", "rounded-1")}
9
7
  </div>
10
- <h2 class="title">
11
- <!-- IMPORT partials/categories/link.tpl -->
12
- </h2>
13
- <div>
14
- <!-- IF ../descriptionParsed -->
15
- <div class="description text-muted">
16
- {../descriptionParsed}
8
+ <div class="d-flex flex-column gap-1">
9
+ <h2 class="title fw-bold fs-4">
10
+ <!-- IMPORT partials/categories/link.tpl -->
11
+ </h2>
12
+ {{{ if ./descriptionParsed }}}
13
+ <div class="description text-muted small">
14
+ {./descriptionParsed}
17
15
  </div>
18
- <!-- ENDIF ../descriptionParsed -->
19
- <!-- IF !config.hideSubCategories -->
20
- {{{ if ../children.length }}}
21
- <div class="category-children">
22
- {{{ each ../children }}}
23
- {{{ if !../isSection }}}
24
- <span class="category-children-item">
25
- {buildCategoryIcon(@value, "24px", "rounded-circle")}
26
- {{{ if ../link }}}
27
- <a href="{../link}">{../name}</a>
16
+ {{{ end }}}
17
+ {{{ if !config.hideSubCategories }}}
18
+ {{{ if ./children.length }}}
19
+ <div class="category-children d-flex gap-3">
20
+ {{{ each ./children }}}
21
+ {{{ if !./isSection }}}
22
+ <span class="category-children-item small">
23
+ {{{ if ./link }}}
24
+ <a href="{./link}">{./name}</a>
28
25
  {{{ else }}}
29
- <a href="{config.relative_path}/category/{../slug}">{../name}</a>
26
+ <a href="{config.relative_path}/category/{./slug}">{./name}</a>
30
27
  {{{ end }}}
31
28
  </span>
32
29
  {{{ end }}}
33
30
  {{{ end }}}
34
31
  </div>
35
32
  {{{ end }}}
36
- <!-- ENDIF !config.hideSubCategories -->
33
+ {{{ end }}}
34
+ <span class="d-block d-sm-none">
35
+ {{{ if ./teaser.timestampISO }}}
36
+ <a class="permalink" href="{./teaser.url}">
37
+ <small class="timeago" title="{./teaser.timestampISO}"></small>
38
+ </a>
39
+ {{{ end }}}
40
+ </span>
37
41
  </div>
38
- <span class="d-block d-sm-none float-end">
39
- <!-- IF ../teaser.timestampISO -->
40
- <a class="permalink" href="{../teaser.url}">
41
- <small class="timeago" title="{../teaser.timestampISO}"></small>
42
- </a>
43
- <!-- ENDIF ../teaser.timestampISO -->
44
- </span>
45
42
  </div>
46
43
 
47
- <!-- IF !../link -->
48
- <div class="col-md-1 d-none d-md-block stats text-muted">
49
- <span class="{../unread-class} human-readable-number" title="{../totalTopicCount}">{../totalTopicCount}</span><br />
50
- <small>[[global:topics]]</small>
51
- </div>
52
- <div class="col-md-1 d-none d-md-block stats text-muted">
53
- <span class="{../unread-class} human-readable-number" title="{../totalPostCount}">{../totalPostCount}</span><br />
54
- <small>[[global:posts]]</small>
44
+ {{{ if !./link }}}
45
+ <div class="col-md-2 d-none d-md-flex stats text-muted gap-2 px-0">
46
+ <div class="w-50">
47
+ <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
48
+ <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalTopicCount}">{./totalTopicCount}</span>
49
+ <span class="text-lowercase text-xs">[[global:topics]]</span>
50
+ </div>
51
+ </div>
52
+ <div class="w-50">
53
+ <div class="card card-header align-items-center px-0 py-2 border-0 rounded-1">
54
+ <span class="{./unread-class} human-readable-number fs-5 fw-semibold ff-secondary" title="{./totalPostCount}">{./totalPostCount}</span>
55
+ <span class="text-lowercase text-xs">[[global:posts]]</span>
56
+ </div>
57
+ </div>
55
58
  </div>
56
- <!-- IF !config.hideCategoryLastPost -->
59
+
60
+ {{{ if !config.hideCategoryLastPost }}}
57
61
  <div class="col-md-3 col-sm-3 teaser d-none d-sm-block" component="topic/teaser">
58
62
  <!-- IMPORT partials/categories/lastpost.tpl -->
59
63
  </div>
60
- <!-- ENDIF !config.hideCategoryLastPost -->
61
- <!-- ENDIF !../link -->
64
+ {{{ end }}}
65
+ {{{ end }}}
62
66
  </li>
@@ -1,28 +1,26 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <div class="lastpost background-link-container" style="border-color: {../bgColor}">
4
- {{{each ./posts}}}
5
- <!-- IF @first -->
6
- <div component="category/posts">
7
- <a class="background-link" href="{config.relative_path}/topic/{../topic.slug}<!-- IF ../index -->/{../index}<!-- ENDIF ../index -->"></a>
8
- <p>
9
- <a href="{config.relative_path}/user/{../user.userslug}">{buildAvatar(posts.user, "24px", true)}</a>
10
- <a class="permalink text-muted" href="{config.relative_path}/topic/{../topic.slug}<!-- IF ../index -->/{../index}<!-- ENDIF ../index -->">
11
- <small class="timeago" title="{../timestampISO}"></small>
1
+ <div class="lastpost background-link-container border-start border-2 h-100" style="border-color: {./bgColor}!important;">
2
+ {{{ each ./posts }}}
3
+ {{{ if @first }}}
4
+ <div component="category/posts" class="ps-3">
5
+ <a class="background-link" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}"></a>
6
+ <p class="mb-0">
7
+ <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "20px", true)}</a>
8
+ <a class="permalink text-muted" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}">
9
+ <span class="timeago text-xs" title="{../timestampISO}"></span>
12
10
  </a>
13
11
  </p>
14
- <div class="post-content">
15
- {../content}
12
+ <div class="post-content mt-2 overflow-hidden text-xs line-clamp-3">
13
+ {./content}
16
14
  </div>
17
15
  </div>
18
- <!-- ENDIF @first -->
19
- {{{end}}}
16
+ {{{ end }}}
17
+ {{{ end }}}
20
18
 
21
- <!-- IF !../posts.length -->
22
- <div component="category/posts">
23
- <div class="post-content">
19
+ {{{ if !./posts.length }}}
20
+ <div component="category/posts" class="ps-3">
21
+ <div class="post-content overflow-hidden text-xs">
24
22
  [[category:no_new_posts]]
25
23
  </div>
26
24
  </div>
27
- <!-- ENDIF !../posts.length -->
25
+ {{{ end }}}
28
26
  </div>
@@ -1,13 +1,5 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <!-- IF ../isSection -->
4
- {../name}
5
- <!-- ELSE -->
6
- <!-- IF ../link -->
7
- <a href="{../link}" itemprop="url">
8
- <!-- ELSE -->
9
- <a href="{config.relative_path}/category/{../slug}" itemprop="url">
10
- <!-- ENDIF ../link -->
11
- {../name}
12
- </a>
13
- <!-- ENDIF ../isSection -->
1
+ {{{ if ./isSection }}}
2
+ {./name}
3
+ {{{ else }}}
4
+ <a class="text-reset" href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" itemprop="url">{../name}</a>
5
+ {{{ end }}}
@@ -1,13 +1,10 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="btn-group bottom-sheet" component="thread/sort">
4
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
5
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">[[topic:sort_by]]</span>
6
- <span class="visible-xs-inline"><i class="fa fa-fw fa-sort"></i></span>
7
- <span class="caret"></span>
2
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
3
+ <i class="fa fa-fw fa-arrow-down-wide-short small link-primary"></i>
4
+ <span class="visible-md-inline visible-lg-inline small">[[topic:sort_by]]</span>
8
5
  </button>
9
6
 
10
- <ul class="dropdown-menu dropdown-menu-end">
7
+ <ul class="dropdown-menu">
11
8
  <li><a class="dropdown-item" href="#" class="newest_to_oldest" data-sort="newest_to_oldest"><i class="fa fa-fw"></i> [[topic:newest_to_oldest]]</a></li>
12
9
  <li><a class="dropdown-item" href="#" class="oldest_to_newest" data-sort="oldest_to_newest"><i class="fa fa-fw"></i> [[topic:oldest_to_newest]]</a></li>
13
10
  <li><a class="dropdown-item" href="#" class="most_posts" data-sort="most_posts"><i class="fa fa-fw"></i> [[topic:most_posts]]</a></li>
@@ -1,20 +1,20 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  {{{ if children.length }}}
4
2
  <div class="subcategory">
5
3
  {{{ if hasMoreSubCategories }}}
6
4
  <div class="mb-2"><!-- IMPORT partials/category-selector.tpl --></div>
7
5
  {{{ else }}}
8
- <p>[[category:subcategories]]</p>
6
+ <h3 class="fs-6 fw-semibold">[[category:subcategories]]</h3>
9
7
  {{{ end }}}
10
8
 
11
9
  <ul component="category/subcategory/container" class="categories list-unstyled" itemscope itemtype="http://www.schema.org/ItemList">
10
+ <hr class="text-muted"/>
12
11
  {{{each children}}}
13
12
  <!-- IMPORT partials/categories/item.tpl -->
13
+ <hr class="text-muted"/>
14
14
  {{{end}}}
15
15
  </ul>
16
16
  {{{ if hasMoreSubCategories}}}
17
- <button class="btn btn-outline-secondary mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
17
+ <button class="btn btn-link mb-2" component="category/load-more-subcategories">[[category:x-more-categories, {subCategoriesLeft}]]</button>
18
18
  {{{ end }}}
19
19
  </div>
20
20
  {{{ end }}}
@@ -1,13 +1,10 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <!-- IF showTopicTools -->
1
+ {{{ if showTopicTools }}}
4
2
  <div class="btn-group thread-tools bottom-sheet">
5
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
6
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">[[topic:thread_tools.title]]</span>
7
- <span class="visible-xs-inline"><i class="fa fa-fw fa-gear"></i></span>
8
- <span class="caret"></span>
3
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <i class="fa fa-fw fa-gear small link-primary"></i>
5
+ <span class="visible-md-inline visible-lg-inline small">[[topic:thread_tools.title]]</span>
9
6
  </button>
10
- <ul class="dropdown-menu dropdown-menu-end">
7
+ <ul class="dropdown-menu">
11
8
  <li>
12
9
  <a component="topic/mark-unread-for-all" href="#" class="dropdown-item">
13
10
  <i class="fa fa-fw fa-inbox"></i> [[topic:thread_tools.markAsUnreadForAll]]
@@ -80,4 +77,4 @@
80
77
  {{{end}}}
81
78
  </ul>
82
79
  </div>
83
- <!-- ENDIF showTopicTools -->
80
+ {{{ end }}}
@@ -1,18 +1,14 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <!-- IF config.loggedIn -->
1
+ {{{ if config.loggedIn }}}
4
2
  <div class="btn-group topic-watch-dropdown bottom-sheet" component="topic/watch">
3
+ <button class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown" type="button">
4
+ <span component="category/watching/menu" <!-- IF !../isWatched -->class="hidden"<!-- ENDIF !../isWatched -->><i class="fa fa-fw fa-inbox small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:watching]]</span></span>
5
5
 
6
- <button class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown" type="button">
7
- <span component="category/watching/menu" <!-- IF !../isWatched -->class="hidden"<!-- ENDIF !../isWatched -->><i class="fa fa-fw fa-inbox"></i><span class="visible-sm-inline visible-md-inline visible-lg-inline"> [[category:watching]]</span></span>
8
-
9
- <span component="category/notwatching/menu" <!-- IF !../isNotWatched -->class="hidden"<!-- ENDIF !../isNotWatched -->><i class="fa fa-fw fa-clock-o"></i><span class="visible-sm-inline visible-md-inline visible-lg-inline"> [[category:not-watching]]</span></span>
6
+ <span component="category/notwatching/menu" <!-- IF !../isNotWatched -->class="hidden"<!-- ENDIF !../isNotWatched -->><i class="fa fa-fw fa-clock-o small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:not-watching]]</span></span>
10
7
 
11
- <span component="category/ignoring/menu" <!-- IF !../isIgnored -->class="hidden"<!-- ENDIF !../isIgnored -->><i class="fa fa-fw fa-eye-slash"></i><span class="visible-sm-inline visible-md-inline visible-lg-inline"> [[category:ignoring]]</span></span>
12
- <span class="caret"></span>
8
+ <span component="category/ignoring/menu" <!-- IF !../isIgnored -->class="hidden"<!-- ENDIF !../isIgnored -->><i class="fa fa-fw fa-eye-slash small link-primary"></i><span class="visible-md-inline visible-lg-inline small"> [[category:ignoring]]</span></span>
13
9
  </button>
14
10
 
15
- <ul class="dropdown-menu dropdown-menu-end">
11
+ <ul class="dropdown-menu">
16
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<!-- ENDIF ../isWatched -->"></i><i class="fa fa-fw fa-inbox"></i> [[category:watching]]<p class="help-text"><small>[[category:watching.description]]</small></p></a></li>
17
13
 
18
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<!-- ENDIF ../isNotWatched -->"></i><i class="fa fa-fw fa-clock-o"></i> [[category:not-watching]]<p class="help-text"><small>[[category:not-watching.description]]</small></p></a></li>
@@ -20,4 +16,4 @@
20
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<!-- ENDIF ../isIgnored -->"></i><i class="fa fa-fw fa-eye-slash"></i> [[category:ignoring]]<p class="help-text"><small>[[category:ignoring.description]]</small></p></a></li>
21
17
  </ul>
22
18
  </div>
23
- <!-- ENDIF config.loggedIn -->
19
+ {{{ end }}}
@@ -1,13 +1,12 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
1
+ <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
4
2
  {{{ if selectedCategory }}}
5
3
  <span class="category-item">
6
- {buildCategoryIcon(selectedCategory, "24px", "rounded-circle")}
7
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">{selectedCategory.name}</span>
4
+ {buildCategoryIcon(selectedCategory, "20px", "rounded-circle")}
5
+ <span class="visible-md-inline visible-lg-inline small">{selectedCategory.name}</span>
8
6
  </span>
9
7
  {{{ else }}}
10
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">[[unread:all_categories]]</span><span class="visible-xs-inline"><i class="fa fa-fw fa-list"></i></span>{{{ end }}} <span class="caret"></span>
8
+ <i class="fa fa-fw fa-list small link-primary"></i>
9
+ <span class="visible-md-inline visible-lg-inline small">[[unread:all_categories]]</span>{{{ end }}}
11
10
  </button>
12
11
  <div component="category-selector-search" class="hidden position-absolute">
13
12
  <input type="text" class="form-control" autocomplete="off">
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div component="category/dropdown" class="btn-group category-dropdown-container bottom-sheet">
4
2
  <!-- IMPORT partials/category-filter-content.tpl -->
5
3
  </div>
@@ -1,6 +1,4 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- <button type="button" class="btn btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
1
+ <button type="button" class="btn btn-link d-flex gap-2 align-items-baseline dropdown-toggle" data-bs-toggle="dropdown">
4
2
  <span component="category-selector-selected">
5
3
  {{{ if (selectedCategory && !showCategorySelectLabel) }}}
6
4
  <span class="category-item">
@@ -8,8 +6,9 @@
8
6
  {selectedCategory.name}
9
7
  </span>
10
8
  {{{ else }}}
11
- <span class="visible-sm-inline visible-md-inline visible-lg-inline">{{{ if selectCategoryLabel }}}{selectCategoryLabel}{{{ else }}}[[topic:thread_tools.select_category]]{{{ end }}}</span><span class="visible-xs-inline"><i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}}"></i></span>
12
- {{{ end }}}</span> <span class="caret"></span>
9
+ <i class="fa fa-fw {{{ if selectCategoryIcon }}}{selectCategoryIcon}{{{ else }}}fa-list{{{ end }}} link-primary small"></i>
10
+ <span class="visible-md-inline visible-lg-inline small">{{{ if selectCategoryLabel }}}{selectCategoryLabel}{{{ else }}}[[topic:thread_tools.select_category]]{{{ end }}}</span>
11
+ {{{ end }}}</span>
13
12
  </button>
14
13
  <div component="category-selector-search" class="hidden position-absolute">
15
14
  <input type="text" class="form-control" autocomplete="off">
@@ -1,5 +1,3 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div component="category-selector" class="btn-group bottom-sheet">
4
2
  <!-- IMPORT partials/category-selector-content.tpl -->
5
3
  </div>
@@ -1,40 +1,32 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
1
+ {{{ if !rooms.length }}}
2
+ <li class="text-center"><a href="#" class="text-reset">[[modules:chat.no_active]]</a></li>
3
+ {{{ end }}}
2
4
 
3
- <!-- IF rooms.length -->
4
- {{{each rooms}}}
5
- <li class="<!-- IF ../unread -->unread<!-- ENDIF ../unread -->" data-roomid="{rooms.roomId}">
6
- {{{each rooms.users}}}
7
- <!-- IF @first -->
5
+ {{{ each rooms }}}
6
+ <li class="{{{ if ./unread }}}unread{{{ end }}} dropdown-item rounded-1 p-2 d-flex gap-2 pointer" data-roomid="{./roomId}">
8
7
  <div class="main-avatar">
8
+ {{{ each ./users}}}
9
+ {{{ if @first }}}
9
10
  <!-- IMPORT partials/chats/user.tpl -->
11
+ {{{ end }}}
12
+ {{{ end }}}
13
+ {{{ if !./users.length}}}
14
+ <span class="avatar avatar-rounded text-bg-warning" component="avatar/icon" style="--avatar-size: 32px;">?</span>
15
+ {{{ end }}}
10
16
  </div>
11
- <!-- ENDIF @first -->
12
- {{{end}}}
13
17
 
14
- <ul class="members">
15
- {{{each rooms.users}}}
16
- <li>
17
- <!-- IMPORT partials/chats/user.tpl -->
18
- </li>
19
- {{{end}}}
20
- </ul>
21
-
22
- <div class="notification-chat-content">
23
- <strong class="room-name">
24
- <!-- IF !rooms.lastUser.uid -->
18
+ <div class="notification-chat-content d-flex flex-grow-1 flex-column w-100">
19
+ <div class="room-name fw-semibold text-xs">
20
+ {{{ if !./lastUser.uid }}}
25
21
  <span>[[modules:chat.no-users-in-room]]</span>
26
- <!-- ELSE -->
27
- <!-- IF rooms.roomName -->{rooms.roomName}<!-- ELSE -->{rooms.usernames}<!-- ENDIF rooms.roomName -->
28
- <!-- ENDIF !rooms.lastUser.uid -->
29
- </strong>
30
- <span class="teaser-content">
31
- <strong class="teaser-username">{rooms.teaser.user.username}:</strong>
32
- {rooms.teaser.content}
33
- </span>
22
+ {{{ else }}}
23
+ {./lastUser.username}
24
+ {{{ end }}}
25
+ </div>
26
+ <div class="teaser-content text-sm line-clamp-3">
27
+ {./teaser.content}
28
+ </div>
29
+ <div class="teaser-timestamp notification-chat-controls text-muted text-xs">{./teaser.timeagoLong}</div>
34
30
  </div>
35
- <div class="teaser-timestamp notification-chat-controls">{rooms.teaser.timeago}</div>
36
31
  </li>
37
- {{{end}}}
38
- <!-- ELSE -->
39
- <li class="no_active"><a href="#">[[modules:chat.no_active]]</a></li>
40
- <!-- ENDIF rooms.length -->
32
+ {{{ end }}}
@@ -1,7 +1,5 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <!-- IF roomId -->
4
- <div component="chat/messages" class="expanded-chat" data-roomid="{roomId}">
2
+ <div component="chat/messages" class="expanded-chat d-flex flex-column h-100" data-roomid="{roomId}">
5
3
  <div component="chat/header" class="d-flex align-items-center px-3">
6
4
  <span class="members flex-grow-1">
7
5
  [[modules:chat.chatting_with]]:
@@ -17,13 +15,15 @@
17
15
  <div class="position-relative">
18
16
  <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>
19
17
  </div>
20
- <ul class="chat-content">
18
+ <ul class="chat-content p-0 m-0 list-unstyled overflow-auto flex-grow-1">
21
19
  <!-- IMPORT partials/chats/messages.tpl -->
22
20
  </ul>
23
- <div component="chat/composer">
24
- <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2"></textarea>
21
+ <div component="chat/composer" class="d-flex">
22
+ <div class="flex-grow-1 position-relative">
23
+ <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2" style="resize:none;"></textarea>
24
+ <span component="chat/message/remaining" class="text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
25
+ </div>
25
26
  <button class="btn btn-primary" type="button" data-action="send"><i class="fa fa-fw fa-2x fa-paper-plane"></i></button>
26
- <span component="chat/message/remaining">{maximumChatMessageLength}</span>
27
27
  <form component="chat/upload" method="post" enctype="multipart/form-data">
28
28
  <input type="file" name="files[]" multiple class="hidden"/>
29
29
  </form>