nodebb-theme-harmony 0.0.10 → 0.0.12

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 (69) hide show
  1. package/library.js +1 -0
  2. package/package.json +1 -1
  3. package/public/harmony.js +10 -1
  4. package/scss/account.scss +0 -3
  5. package/scss/common.scss +9 -0
  6. package/scss/modules/bottom-sheet.scss +1 -1
  7. package/scss/modules/topic-navigator.scss +0 -6
  8. package/scss/sidebar.scss +19 -25
  9. package/scss/skins.scss +8 -1
  10. package/templates/account/blocks.tpl +2 -2
  11. package/templates/account/categories.tpl +27 -21
  12. package/templates/account/consent.tpl +10 -64
  13. package/templates/account/edit/password.tpl +29 -24
  14. package/templates/account/edit/username.tpl +25 -20
  15. package/templates/account/edit.tpl +48 -58
  16. package/templates/account/followers.tpl +2 -3
  17. package/templates/account/following.tpl +2 -3
  18. package/templates/account/groups.tpl +2 -3
  19. package/templates/account/info.tpl +4 -5
  20. package/templates/account/posts.tpl +4 -4
  21. package/templates/account/profile.tpl +9 -9
  22. package/templates/account/sessions.tpl +2 -3
  23. package/templates/account/settings.tpl +119 -136
  24. package/templates/account/theme.tpl +7 -4
  25. package/templates/account/topics.tpl +17 -16
  26. package/templates/account/uploads.tpl +4 -8
  27. package/templates/groups/details.tpl +3 -20
  28. package/templates/groups/list.tpl +10 -9
  29. package/templates/header.tpl +3 -21
  30. package/templates/login.tpl +1 -1
  31. package/templates/notifications.tpl +4 -4
  32. package/templates/partials/account/header.tpl +58 -47
  33. package/templates/partials/account/sidebar-left.tpl +5 -5
  34. package/templates/partials/buttons/newTopic.tpl +1 -3
  35. package/templates/partials/categories/item.tpl +1 -8
  36. package/templates/partials/category/sort.tpl +3 -3
  37. package/templates/partials/category/subcategory.tpl +1 -1
  38. package/templates/partials/category/tools.tpl +3 -3
  39. package/templates/partials/category/watch.tpl +7 -7
  40. package/templates/partials/category-filter-content.tpl +4 -4
  41. package/templates/partials/category-selector-content.tpl +10 -9
  42. package/templates/partials/chats/message-window.tpl +10 -8
  43. package/templates/partials/groups/sidebar-left.tpl +1 -1
  44. package/templates/partials/header/brand.tpl +19 -0
  45. package/templates/partials/notifications_list.tpl +5 -5
  46. package/templates/partials/post_bar.tpl +4 -4
  47. package/templates/partials/sidebar/drafts.tpl +16 -5
  48. package/templates/partials/sidebar/logged-in-menu.tpl +23 -0
  49. package/templates/partials/sidebar/user-menu.tpl +1 -1
  50. package/templates/partials/sidebar-left.tpl +2 -2
  51. package/templates/partials/sidebar-right.tpl +2 -24
  52. package/templates/partials/tags_list.tpl +3 -2
  53. package/templates/partials/topic/navigator.tpl +2 -2
  54. package/templates/partials/topic/post-menu.tpl +2 -4
  55. package/templates/partials/topic/post.tpl +13 -13
  56. package/templates/partials/topic/reply-button.tpl +3 -3
  57. package/templates/partials/topic/sort.tpl +3 -3
  58. package/templates/partials/topic/tools.tpl +3 -3
  59. package/templates/partials/topic/watch.tpl +17 -16
  60. package/templates/partials/topic-filters.tpl +3 -3
  61. package/templates/partials/topic-list-bar.tpl +7 -11
  62. package/templates/partials/topic-terms.tpl +3 -3
  63. package/templates/partials/topics_list.tpl +4 -4
  64. package/templates/partials/users/item.tpl +27 -25
  65. package/templates/partials/users_list_menu.tpl +1 -1
  66. package/templates/tags.tpl +12 -8
  67. package/templates/topic.tpl +1 -3
  68. package/templates/users.tpl +4 -5
  69. package/templates/chat.tpl +0 -41
@@ -1,10 +1,9 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
-
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
8
7
  <h3 class="fw-semibold fs-5">[[pages:{template.name}, {username}]]</h3>
9
8
 
10
9
  {{{ if !users.length }}}
@@ -1,10 +1,9 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
-
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
8
7
  <h3 class="fw-semibold fs-5">[[pages:{template.name}, {username}]]</h3>
9
8
 
10
9
  <div class="groups">
@@ -1,10 +1,9 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
-
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
8
7
  {{{ if sessions.length }}}
9
8
  <div class="mb-3">
10
9
  <h4>[[global:sessions]]</h4>
@@ -32,7 +31,7 @@
32
31
  {{{ end }}}
33
32
 
34
33
  <div class="row">
35
- <div class="col-sm-6">
34
+ <div class="col-sm-6 mb-3">
36
35
  <div class="card mb-3">
37
36
  <h5 class="card-header">
38
37
  [[global:recentips]]
@@ -78,7 +77,7 @@
78
77
  </div>
79
78
  </div>
80
79
  </div>
81
- <div class="col-sm-6">
80
+ <div class="col-sm-6 mb-3">
82
81
  <div class="card mb-3">
83
82
  <h5 class="card-header">
84
83
  [[user:info.latest-flags]]
@@ -1,12 +1,12 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
7
- <div class="d-flex justify-content-between align-items-center mb-3">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
+ <div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
8
8
  <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
9
- <div class="d-flex gap-1">
9
+ <div class="d-flex flex-wrap gap-1">
10
10
  <a href="{config.relative_path}/user/{userslug}/posts" class="btn-ghost-sm fw-semibold {{{ if template.account/posts }}}active{{{ end }}}">[[global:header.recent]]</a>
11
11
  {{{ if !reputation:disabled }}}
12
12
  <a href="{config.relative_path}/user/{userslug}/best"class="btn-ghost-sm fw-semibold {{{ if template.account/best }}}active{{{ end }}}">[[global:best]]</a>
@@ -1,10 +1,10 @@
1
1
  <div class="account mx-auto">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
6
 
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
7
+ <div class="flex-1 ps-md-2 ps-lg-5">
8
8
  {{{ if aboutme }}}
9
9
  <div component="aboutme" class="text-sm">
10
10
  {aboutmeParsed}
@@ -12,7 +12,7 @@
12
12
  {{{ end }}}
13
13
 
14
14
  <div class="account-stats container">
15
- <div class="row row-cols-2 row-cols-lg-3 row-cols-xl-4 g-2">
15
+ <div class="row row-cols-2 row-cols-xl-3 row-cols-xxl-4 g-2">
16
16
  {{{ if !reputation:disabled }}}
17
17
  <div class="stat">
18
18
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
@@ -31,7 +31,7 @@
31
31
 
32
32
  <div class="stat">
33
33
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
34
- <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-cake-candles"></i> <span>[[user:joined]]</span></span>
34
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-user-plus"></i> <span>[[user:joined]]</span></span>
35
35
  <span class="timeago fs-6 ff-secondary" title="{joindateISO}"></span>
36
36
  </div>
37
37
  </div>
@@ -39,7 +39,7 @@
39
39
  <div class="stat">
40
40
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
41
41
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-clock"></i> <span>[[user:lastonline]]</span></span>
42
- <span class="timeago fs-6 ff-secondary" title="{lastonlineISO}"></span>
42
+ <span class="timeago text-center text-break w-100 px-2 fs-6 ff-secondary" title="{lastonlineISO}"></span>
43
43
  </div>
44
44
  </div>
45
45
 
@@ -47,7 +47,7 @@
47
47
  <div class="stat">
48
48
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
49
49
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-envelope"></i> <span>[[user:email]]</span> {{{ if emailHidden}}}<span class="text-lowercase">([[global:hidden]])</span>{{{ end }}}</span>
50
- <span class="text-sm text-break ff-secondary">{email}</span>
50
+ <span class="text-sm text-center text-break w-100 px-2 ff-secondary">{email}</span>
51
51
  </div>
52
52
  </div>
53
53
  {{{ end }}}
@@ -56,7 +56,7 @@
56
56
  <div class="stat">
57
57
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
58
58
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-globe"></i> <span>[[user:website]]</span></span>
59
- <a class="text-sm text-break ff-secondary text-underline text-reset" href="{websiteLink}" rel="nofollow noopener noreferrer">{websiteName}</a>
59
+ <a class="text-sm text-center text-break w-100 px-2 ff-secondary text-underline text-reset" href="{websiteLink}" rel="nofollow noopener noreferrer">{websiteName}</a>
60
60
  </div>
61
61
  </div>
62
62
  {{{ end }}}
@@ -65,7 +65,7 @@
65
65
  <div class="stat">
66
66
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
67
67
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-map-pin"></i> <span>[[user:location]]</span></span>
68
- <span class="fs-6 ff-secondary">{location}</span>
68
+ <span class="text-center text-break w-100 px-2 fs-6 ff-secondary">{location}</span>
69
69
  </div>
70
70
  </div>
71
71
  {{{ end }}}
@@ -73,7 +73,7 @@
73
73
  {{{ if age }}}
74
74
  <div class="stat">
75
75
  <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
76
- <span class="stat-label text-xs fw-semibold"><span>[[user:age]]</span></span>
76
+ <span class="stat-label text-xs fw-semibold"><span><i class="text-muted fa-solid fa-cake-candles"></i> [[user:age]]</span></span>
77
77
  <span class="fs-6 ff-secondary">{age}</span>
78
78
  </div>
79
79
  </div>
@@ -1,10 +1,9 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
-
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
8
7
  <p class="lead">[[user:sessions.description]]</p>
9
8
  <hr />
10
9
  <ul class="list-group" component="user/sessions">
@@ -1,212 +1,196 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
-
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
8
- <div class="form-actions mb-3 d-flex justify-content-end sticky-lg-top" style="top: 1rem;">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
+ <div class="mb-3 d-flex justify-content-between">
8
+ <h3 class="fw-semibold fs-5">{{{ if isSelf }}}[[pages:account/settings]]{{{ else }}}[[pages:account/settings-of, {username}]]{{{ end }}}</h3>
9
9
  <button id="submitBtn" class="btn btn-primary">[[global:save_changes]]</button>
10
10
  </div>
11
11
  <div class="row">
12
12
  <div class="col-12 col-md-6">
13
- <!-- IF !disableCustomUserSkins -->
14
- <h4>[[user:select-skin]]</h4>
15
- <div class="card card-body mb-3">
16
- <select class="form-select" id="bootswatchSkin" data-property="bootswatchSkin">
13
+ {{{ if !disableCustomUserSkins }}}
14
+ <h6 class="fw-bold">[[user:select-skin]]</h6>
15
+ <div class="">
16
+ <select class="form-select form-select-sm" id="bootswatchSkin" data-property="bootswatchSkin">
17
17
  {{{each bootswatchSkinOptions}}}
18
- <option value="{bootswatchSkinOptions.value}" <!-- IF bootswatchSkinOptions.selected -->selected<!-- ENDIF bootswatchSkinOptions.selected -->>{bootswatchSkinOptions.name}</option>
18
+ <option value="{bootswatchSkinOptions.value}" {{{ if bootswatchSkinOptions.selected }}}selected{{{ end }}}>{bootswatchSkinOptions.name}</option>
19
19
  {{{end}}}
20
20
  </select>
21
21
  </div>
22
- <!-- ENDIF !disableCustomUserSkins -->
22
+ <hr/>
23
+ {{{ end }}}
23
24
 
24
- <!-- IF allowUserHomePage -->
25
- <h4>[[user:select-homepage]]</h4>
26
- <div class="card card-body mb-3">
25
+ {{{ if allowUserHomePage }}}
26
+ <h6 class="fw-bold">[[user:select-homepage]]</h6>
27
+ <div class="">
27
28
  <div class="mb-2">
28
- <label for="homePageRoute">[[user:homepage]]</label>
29
- <select class="form-select" id="homePageRoute" data-property="homePageRoute">
29
+ <select class="form-select form-select-sm" id="homePageRoute" data-property="homePageRoute">
30
30
  <option value="none">None</option>
31
31
  {{{each homePageRoutes}}}
32
32
  <option value="{homePageRoutes.route}" <!-- IF homePageRoutes.selected -->selected="1"<!-- ENDIF homePageRoutes.selected -->>{homePageRoutes.name}</option>
33
33
  {{{end}}}
34
34
  </select>
35
- <p class="form-text">[[user:homepage_description]]</p>
35
+ <p class="form-text text-xs">[[user:homepage_description]]</p>
36
36
  </div>
37
37
  <div id="homePageCustom" class="mb-2" style="display: none;">
38
- <label for="homePageCustom">[[user:custom_route]]</label>
39
- <input type="text" class="form-control" data-property="homePageCustom" id="homePageCustom" value="{settings.homePageRoute}"/>
40
- <p class="form-text">[[user:custom_route_help]]</p>
38
+ <label class="form-label" for="homePageCustom">[[user:custom_route]]</label>
39
+ <input type="text" class="form-control form-control-sm" data-property="homePageCustom" id="homePageCustom" value="{settings.homePageRoute}"/>
40
+ <p class="form-text text-xs">[[user:custom_route_help]]</p>
41
41
  </div>
42
42
  </div>
43
- <!-- ENDIF allowUserHomePage -->
43
+ <hr/>
44
+ {{{ end }}}
44
45
 
45
- <h4>[[global:privacy]]</h4>
46
- <div class="card card-body mb-3">
47
- <!-- IF !hideEmail -->
46
+ <h6 class="fw-bold">[[global:privacy]]</h6>
47
+ <div class="">
48
+ {{{ if !hideEmail }}}
48
49
  <div class="form-check">
49
- <input class="form-check-input" type="checkbox" data-property="showemail" <!-- IF settings.showemail -->checked <!-- ENDIF settings.showemail -->/>
50
- <strong>
51
- <label class="form-check-label">[[user:show_email]]</label>
52
- </strong>
50
+ <input class="form-check-input" type="checkbox" data-property="showemail" {{{ if settings.showemail }}}checked {{{ end }}}/>
51
+ <label class="form-check-label text-sm">[[user:show_email]]</label>
53
52
  </div>
54
- <!-- ENDIF !hideEmail -->
53
+ {{{ end }}}
55
54
 
56
- <!-- IF !hideFullname -->
55
+ {{{ if !hideFullname }}}
57
56
  <div class="form-check">
58
- <input class="form-check-input" type="checkbox" data-property="showfullname" <!-- IF settings.showfullname -->checked<!-- ENDIF settings.showfullname -->/>
59
- <strong>
60
- <label class="form-check-label">[[user:show_fullname]]</label>
61
- </strong>
57
+ <input class="form-check-input" type="checkbox" data-property="showfullname" {{{ if settings.showfullname }}}checked{{{ end }}}/>
58
+ <label class="form-check-label text-sm">[[user:show_fullname]]</label>
62
59
  </div>
63
- <!-- ENDIF !hideFullname -->
64
- <!-- IF !config.disableChat -->
60
+ {{{ end }}}
61
+ {{{ if !config.disableChat }}}
65
62
  <div class="form-check">
66
- <input class="form-check-input" type="checkbox" data-property="restrictChat" <!-- IF settings.restrictChat -->checked<!-- ENDIF settings.restrictChat -->/>
67
- <strong>
68
- <label class="form-check-label">[[user:restrict_chats]]</label>
69
- </strong>
63
+ <input class="form-check-input" type="checkbox" data-property="restrictChat" {{{ if settings.restrictChat }}}checked{{{ end }}}/>
64
+ <label class="form-check-label text-sm">[[user:restrict_chats]]</label>
70
65
  </div>
71
- <!-- ENDIF !config.disableChat -->
66
+ {{{ end }}}
72
67
  </div>
68
+ <hr/>
73
69
 
74
- <h4>[[user:browsing]]</h4>
75
- <div class="card card-body mb-3">
70
+ <h6 class="fw-bold">[[user:browsing]]</h6>
71
+ <div class="">
76
72
  <div class="form-check">
77
- <input class="form-check-input" type="checkbox" data-property="openOutgoingLinksInNewTab" <!-- IF settings.openOutgoingLinksInNewTab -->checked<!-- ENDIF settings.openOutgoingLinksInNewTab -->/>
78
- <strong>
79
- <label class="form-check-label">[[user:open_links_in_new_tab]]</label>
80
- </strong>
73
+ <input class="form-check-input" type="checkbox" data-property="openOutgoingLinksInNewTab" {{{ if settings.openOutgoingLinksInNewTab }}}checked{{{ end }}}/>
74
+ <label class="form-check-label">[[user:open_links_in_new_tab]]</label>
81
75
  </div>
82
- <!-- IF inTopicSearchAvailable -->
76
+ {{{ if inTopicSearchAvailable }}}
83
77
  <div class="form-check">
84
- <input class="form-check-input" type="checkbox" data-property="topicSearchEnabled" <!-- IF settings.topicSearchEnabled -->checked<!-- ENDIF settings.topicSearchEnabled -->/>
85
- <strong>
86
- <label class="form-check-label">[[user:enable_topic_searching]]</label>
87
- </strong>
78
+ <input class="form-check-input" type="checkbox" data-property="topicSearchEnabled" {{{ if settings.topicSearchEnabled }}}checked{{{ end }}}/>
79
+ <label class="form-check-label">[[user:enable_topic_searching]]</label>
88
80
  </div>
89
- <p class="form-text">[[user:topic_search_help]]</p>
90
- <!-- ENDIF inTopicSearchAvailable -->
81
+ <p class="form-text text-xs">[[user:topic_search_help]]</p>
82
+ {{{ end }}}
83
+
91
84
  <div class="form-check">
92
85
  <input class="form-check-input" type="checkbox" data-property="updateUrlWithPostIndex" {{{ if settings.updateUrlWithPostIndex }}}checked{{{ end }}}/>
93
- <strong>
94
- <label class="form-check-label">[[user:update_url_with_post_index]]</label>
95
- </strong>
86
+ <label class="form-check-label">[[user:update_url_with_post_index]]</label>
96
87
  </div>
97
88
  <div class="form-check">
98
- <input class="form-check-input" type="checkbox" data-property="scrollToMyPost" <!-- IF settings.scrollToMyPost -->checked<!-- ENDIF settings.scrollToMyPost -->/>
99
- <strong>
100
- <label class="form-check-label">[[user:scroll_to_my_post]]</label>
101
- </strong>
89
+ <input class="form-check-input" type="checkbox" data-property="scrollToMyPost" {{{ if settings.scrollToMyPost }}}checked{{{ end }}}/>
90
+ <label class="form-check-label">[[user:scroll_to_my_post]]</label>
102
91
  </div>
103
92
  </div>
93
+ <hr/>
104
94
 
105
- <h4>[[global:pagination]]</h4>
106
- <div class="card card-body mb-3">
95
+ <h6 class="fw-bold">[[global:pagination]]</h6>
96
+ <div class="">
107
97
  <div class="mb-2 form-check">
108
- <input type="checkbox" class="form-check-input" data-property="usePagination" <!-- IF settings.usePagination -->checked<!-- ENDIF settings.usePagination -->> <strong><label class="form-check-label">[[user:paginate_description]]</label></strong>
98
+ <input type="checkbox" class="form-check-input" data-property="usePagination" {{{ if settings.usePagination }}}checked{{{ end }}}>
99
+ <label class="form-check-label">[[user:paginate_description]]</label>
109
100
  </div>
110
- <div class="mb-3">
111
- <strong><label class="form-label">[[user:topics_per_page]] ([[user:max_items_per_page, {maxTopicsPerPage}]])</label></strong>
112
- <input type="text" class="form-control" data-property="topicsPerPage" value="{settings.topicsPerPage}">
101
+ <div class="mb-2">
102
+ <label class="form-label">[[user:topics_per_page]] ([[user:max_items_per_page, {maxTopicsPerPage}]])</label>
103
+ <input type="text" class="form-control form-control-sm" data-property="topicsPerPage" value="{settings.topicsPerPage}">
113
104
  </div>
114
105
  <div class="">
115
- <strong><label class="form-label">[[user:posts_per_page]] ([[user:max_items_per_page, {maxPostsPerPage}]])</label></strong>
116
- <input type="text" class="form-control" data-property="postsPerPage" value="{settings.postsPerPage}">
106
+ <label class="form-label">[[user:posts_per_page]] ([[user:max_items_per_page, {maxPostsPerPage}]])</label>
107
+ <input type="text" class="form-control form-control-sm" data-property="postsPerPage" value="{settings.postsPerPage}">
117
108
  </div>
118
109
  </div>
119
110
 
120
- <!-- IF !disableEmailSubscriptions -->
121
- <h4>[[global:email]]</h4>
122
- <div class="card card-body mb-3">
111
+ {{{ if !disableEmailSubscriptions }}}
112
+ <hr/>
113
+ <h6 class="fw-bold">[[global:email]]</h6>
114
+ <div class="">
123
115
  <div class="mb-2">
124
- <label for="dailyDigestFreq">[[user:digest_label]]</label>
125
- <select class="form-select" id="dailyDigestFreq" data-property="dailyDigestFreq" autocomplete="off">
116
+ <label class="form-label" for="dailyDigestFreq">[[user:digest_label]]</label>
117
+ <select class="form-select form-select-sm" id="dailyDigestFreq" data-property="dailyDigestFreq" autocomplete="off">
126
118
  {{{each dailyDigestFreqOptions}}}
127
- <option value="{dailyDigestFreqOptions.value}" <!-- IF dailyDigestFreqOptions.selected -->selected="1"<!-- ENDIF dailyDigestFreqOptions.selected -->>{dailyDigestFreqOptions.name}</option>
119
+ <option value="{./value}" {{{ if ./selected }}}selected="1"{{{ end }}}>{./name}</option>
128
120
  {{{end}}}
129
121
  </select>
130
- <p class="form-text">[[user:digest_description]]</p>
122
+ <p class="form-text text-xs">[[user:digest_description]]</p>
131
123
  </div>
132
124
  </div>
133
- <!-- ENDIF !disableEmailSubscriptions -->
125
+ {{{ end }}}
134
126
 
135
- {{{each customSettings}}}
136
- <h4>{customSettings.title}</h4>
137
- <div class="card card-body mb-3">
138
- {customSettings.content}
127
+ {{{ each customSettings}}}
128
+ <hr/>
129
+ <h6 class="fw-bold">{./title}</h6>
130
+ <div class="">
131
+ {./content}
139
132
  </div>
140
- {{{end}}}
141
133
 
134
+ {{{end}}}
135
+ <hr class="d-block d-md-none"/>
142
136
  </div>
143
137
 
144
138
  <div class="col-12 col-md-6">
145
- <h4>[[global:language]]</h4>
146
- <div class="card card-body mb-3">
147
- <div class="row">
148
- <div class="mb-2 col-lg-12">
149
- <select data-property="userLang" class="form-select">
150
- {{{each languages}}}
151
- <option value="{languages.code}" <!-- IF languages.selected -->selected<!-- ENDIF languages.selected -->>{languages.name} ({languages.code})</option>
152
- {{{end}}}
153
- </select>
154
- </div>
155
- </div>
156
- <!-- IF isAdmin -->
157
- <!-- IF isSelf -->
158
- <label>[[user:acp_language]]</label>
159
- <div class="row">
160
- <div class="mb-2 col-lg-12">
161
- <select data-property="acpLang" class="form-select">
162
- {{{each acpLanguages}}}
163
- <option value="{acpLanguages.code}" <!-- IF acpLanguages.selected -->selected<!-- ENDIF acpLanguages.selected -->>{acpLanguages.name} ({acpLanguages.code})</option>
164
- {{{end}}}
165
- </select>
166
- </div>
167
- </div>
168
- <!-- ENDIF isSelf -->
169
- <!-- ENDIF isAdmin -->
139
+ <h6 class="fw-bold">[[global:language]]</h6>
140
+ <div class="">
141
+ <select data-property="userLang" class="form-select form-select-sm mb-2">
142
+ {{{each languages}}}
143
+ <option value="{./code}" {{{ if ./selected }}}selected{{{ end }}}>{./name} ({./code})</option>
144
+ {{{end}}}
145
+ </select>
170
146
  </div>
147
+ <hr/>
148
+ {{{ if (isAdmin && isSelf) }}}
149
+ <h6 class="fw-bold">[[user:acp_language]]</h6>
150
+ <div class="">
151
+ <select data-property="acpLang" class="form-select form-select-sm">
152
+ {{{each acpLanguages}}}
153
+ <option value="{./code}" {{{ if ./selected }}}selected{{{ end }}}>{./name} ({./code})</option>
154
+ {{{end}}}
155
+ </select>
156
+ </div>
157
+ <hr/>
158
+ {{{ end }}}
171
159
 
172
- <h4>[[topic:watch]]</h4>
173
- <div class="card card-body mb-3">
160
+ <h6 class="fw-bold">[[topic:watch]]</h6>
161
+ <div class="">
174
162
  <div class="form-check">
175
- <input class="form-check-input" type="checkbox" data-property="followTopicsOnCreate" <!-- IF settings.followTopicsOnCreate -->checked <!-- ENDIF settings.followTopicsOnCreate -->/>
176
- <strong>
177
- <label class="form-check-label">[[user:follow_topics_you_create]]</label>
178
- </strong>
163
+ <input class="form-check-input" type="checkbox" data-property="followTopicsOnCreate" {{{ if settings.followTopicsOnCreate }}}checked{{{ end }}}/>
164
+ <label class="form-check-label">[[user:follow_topics_you_create]]</label>
179
165
  </div>
180
166
  <div class="form-check">
181
- <input class="form-check-input" type="checkbox" data-property="followTopicsOnReply" <!-- IF settings.followTopicsOnReply -->checked<!-- ENDIF settings.followTopicsOnReply -->/>
182
- <strong>
183
- <label class="form-check-label">[[user:follow_topics_you_reply_to]]</label>
184
- </strong>
167
+ <input class="form-check-input" type="checkbox" data-property="followTopicsOnReply" {{{ if settings.followTopicsOnReply }}}checked{{{ end }}}/>
168
+ <label class="form-check-label">[[user:follow_topics_you_reply_to]]</label>
185
169
  </div>
186
170
  <div class="mb-2">
187
- <label>[[user:default-category-watch-state]]</label>
188
- <select class="form-select" data-property="categoryWatchState">
189
- <option value="watching" <!-- IF categoryWatchState.watching -->selected<!-- ENDIF categoryWatchState.watching -->>[[category:watching]]</option>
190
- <option value="notwatching" <!-- IF categoryWatchState.notwatching -->selected<!-- ENDIF categoryWatchState.notwatching -->>[[category:not-watching]]</option>
191
- <option value="ignoring" <!-- IF categoryWatchState.ignoring -->selected<!-- ENDIF categoryWatchState.ignoring -->>[[category:ignoring]]</option>
171
+ <label class="form-label">[[user:default-category-watch-state]]</label>
172
+ <select class="form-select form-select-sm" data-property="categoryWatchState">
173
+ <option value="watching" {{{ if categoryWatchState.watching }}}selected{{{ end }}}>[[category:watching]]</option>
174
+ <option value="notwatching" {{{ if categoryWatchState.notwatching }}}selected{{{ end }}}>[[category:not-watching]]</option>
175
+ <option value="ignoring" {{{ if categoryWatchState.ignoring }}}selected{{{ end }}}>[[category:ignoring]]</option>
192
176
  </select>
193
177
  </div>
194
178
  </div>
179
+ <hr/>
195
180
 
196
-
197
- <h4>[[user:notifications]]</h4>
198
- <div class="card card-body mb-3">
181
+ <h6 class="fw-bold">[[user:notifications]]</h6>
182
+ <div class="">
199
183
  {{{each notificationSettings}}}
200
184
  <div class="row mb-3">
201
185
  <div class="col-7">
202
- <label>{notificationSettings.label}</label>
186
+ <label class="text-sm">{./label}</label>
203
187
  </div>
204
188
  <div class="mb-2 col-5">
205
- <select class="form-select" data-property="{notificationSettings.name}">
206
- <option value="none" <!-- IF notificationSettings.none -->selected<!-- ENDIF notificationSettings.none -->>[[notifications:none]]</option>
207
- <option value="notification" <!-- IF notificationSettings.notification -->selected<!-- ENDIF notificationSettings.notification -->>[[notifications:notification_only]]</option>
208
- <option value="email" <!-- IF notificationSettings.email -->selected<!-- ENDIF notificationSettings.email -->>[[notifications:email_only]]</option>
209
- <option value="notificationemail" <!-- IF notificationSettings.notificationemail -->selected<!-- ENDIF notificationSettings.notificationemail -->>[[notifications:notification_and_email]]</option>
189
+ <select class="form-select form-select-sm" data-property="{./name}">
190
+ <option value="none" {{{ if ./none }}}selected{{{ end }}}>[[notifications:none]]</option>
191
+ <option value="notification" {{{ if ./notification }}}selected{{{ end }}}>[[notifications:notification_only]]</option>
192
+ <option value="email" {{{ if ./email }}}selected{{{ end }}}>[[notifications:email_only]]</option>
193
+ <option value="notificationemail" {{{ if ./notificationemail }}}selected{{{ end }}}>[[notifications:notification_and_email]]</option>
210
194
  </select>
211
195
  </div>
212
196
  </div>
@@ -214,13 +198,13 @@
214
198
 
215
199
  <div class="row">
216
200
  <div class="col-7">
217
- <label for="upvote-notif-freq">[[user:upvote-notif-freq]]</label>
201
+ <label class="text-sm" for="upvote-notif-freq">[[user:upvote-notif-freq]]</label>
218
202
  </div>
219
203
  <div class="mb-2 col-5">
220
- <select class="form-select" id="upvote-notif-freq" name="upvote-notif-freq" data-property="upvoteNotifFreq">
221
- {{{each upvoteNotifFreq}}}
222
- <option value="{upvoteNotifFreq.name}" <!-- IF upvoteNotifFreq.selected -->selected<!-- ENDIF upvoteNotifFreq.selected -->>
223
- [[user:upvote-notif-freq.{upvoteNotifFreq.name}]]
204
+ <select class="form-select form-select-sm" id="upvote-notif-freq" name="upvote-notif-freq" data-property="upvoteNotifFreq">
205
+ {{{ each upvoteNotifFreq }}}
206
+ <option value="{./name}" {{{ if ./selected }}}selected{{{ end }}}>
207
+ [[user:upvote-notif-freq.{./name}]]
224
208
  </option>
225
209
  {{{end}}}
226
210
  </select>
@@ -229,7 +213,6 @@
229
213
  </div>
230
214
  </div>
231
215
  </div>
232
-
233
216
  </div>
234
217
  </div>
235
218
  </div>
@@ -1,11 +1,14 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
+ <div class="mb-3 d-flex justify-content-between">
8
+ <h3 class="fw-semibold fs-5">[[harmony:settings.title]]</h3>
6
9
 
7
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
8
- <h3 class="fw-semibold fs-5">[[harmony:settings.title]]</h3>
10
+ <button id="save" type="button" class="btn btn-primary">[[global:save_changes]]</button>
11
+ </div>
9
12
 
10
13
  <form id="theme-settings" role="form">
11
14
  <div class="form-check mb-2">
@@ -23,7 +26,7 @@
23
26
  <label class="form-check-label">[[harmony:settings.stickyToolbar]]</label>
24
27
  </div>
25
28
 
26
- <button id="save" type="button" class="btn btn-primary">[[global:save_changes]]</button>
29
+
27
30
  </form>
28
31
  </div>
29
32
  </div>
@@ -1,32 +1,33 @@
1
1
  <div class="account">
2
2
  <!-- IMPORT partials/account/header.tpl -->
3
3
 
4
- <div class="row gx-5">
4
+ <div class="d-flex flex-column flex-md-row">
5
5
  <!-- IMPORT partials/account/sidebar-left.tpl -->
6
- <div class="col-12 col-md-9 col-lg-10 ps-md-5">
6
+ <div class="flex-1 ps-md-2 ps-lg-5" style="min-width: 0;">
7
7
  <div class="d-flex justify-content-between align-items-center mb-3">
8
- <h3 class="fw-semibold fs-5 mb-0">[[global:topics]]</h3>
9
8
  <div class="d-flex gap-1">
10
- <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost-sm fw-semibold {{{ if template.account/topics }}}active{{{ end }}}">[[global:header.recent]]</a>
9
+ <h3 class="fw-semibold fs-5 mb-0">[[global:topics]]</h3>
10
+ {{{ if showSort }}}
11
+ <div class="btn-group bottom-sheet" component="thread/sort">
12
+ <button title="[[global:sort]]" class="btn-ghost-sm dropdown-toggle" data-bs-toggle="dropdown" type="button"><i class="fa-solid fa-arrow-up-wide-short"></i></button>
13
+ <ul class="dropdown-menu">
14
+ {{{each sortOptions }}}
15
+ <li><a class="dropdown-item" href="{config.relative_path}{./url}"><i class="fa fa-fw {{{if ./selected}}}fa-check{{{end}}}"></i>{./name}</a></li>
16
+ {{{end}}}
17
+ </ul>
18
+ </div>
19
+ {{{ end }}}
20
+ </div>
21
+
22
+ <div class="d-flex gap-1">
11
23
  {{{ if canEdit }}}
24
+ <a href="{config.relative_path}/user/{userslug}/topics" class="btn-ghost-sm fw-semibold {{{ if template.account/topics }}}active{{{ end }}}">[[global:header.recent]]</a>
12
25
  <a href="{config.relative_path}/user/{userslug}/watched"class="btn-ghost-sm fw-semibold {{{ if template.account/watched }}}active{{{ end }}}">[[user:watched]]</a>
13
26
  <a href="{config.relative_path}/user/{userslug}/ignored" class="btn-ghost-sm fw-semibold {{{ if template.account/ignored }}}active{{{ end }}}">[[user:ignored]]</a>
14
27
  {{{ end }}}
15
28
  </div>
16
29
  </div>
17
30
 
18
- {{{ if showSort }}}
19
- <div class="btn-toolbar justify-content-end mb-2">
20
- <div class="btn-group bottom-sheet" component="thread/sort">
21
- <button class="btn-ghost-sm dropdown-toggle" data-bs-toggle="dropdown" type="button"><span>[[topic:sort_by]]</span></button>
22
- <ul class="dropdown-menu dropdown-menu-end">
23
- {{{each sortOptions }}}
24
- <li><a class="dropdown-item" href="{config.relative_path}{sortOptions.url}"><i class="fa fa-fw {{{if sortOptions.selected}}}fa-check{{{end}}}"></i>{sortOptions.name}</a></li>
25
- {{{end}}}
26
- </ul>
27
- </div>
28
- </div>
29
- {{{ end }}}
30
31
 
31
32
  {{{ if !topics.length }}}
32
33
  <div class="alert alert-warning text-center">{noItemsFoundKey}</div>