nodebb-theme-harmony 2.0.0-pre.40 → 2.0.0-pre.42

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.
package/README.md CHANGED
@@ -10,6 +10,9 @@ Issues are tracked in [the main project issue tracker](https://github.com/NodeBB
10
10
  ## Screenshots
11
11
 
12
12
  ### Categories
13
+
14
+ _The cards in the header are added by the recent cards plugin. https://github.com/NodeBB-Community/nodebb-plugin-recent-cards_
15
+
13
16
  <img height="450" src="screenshots/categories.png">
14
17
 
15
18
  ### Recent
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "nodebb-theme-harmony",
3
- "version": "2.0.0-pre.38",
3
+ "version": "2.0.0-pre.42",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "nodebb-theme-harmony",
9
- "version": "2.0.0-pre.38",
9
+ "version": "2.0.0-pre.42",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@fontsource/inter": "5.0.15",
@@ -43,9 +43,9 @@
43
43
  }
44
44
  },
45
45
  "node_modules/@eslint-community/regexpp": {
46
- "version": "4.11.0",
47
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz",
48
- "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==",
46
+ "version": "4.12.1",
47
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
48
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
49
49
  "dev": true,
50
50
  "license": "MIT",
51
51
  "engines": {
@@ -102,9 +102,9 @@
102
102
  }
103
103
  },
104
104
  "node_modules/@eslint/js": {
105
- "version": "9.13.0",
106
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz",
107
- "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==",
105
+ "version": "9.14.0",
106
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
107
+ "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
108
108
  "dev": true,
109
109
  "license": "MIT",
110
110
  "engines": {
@@ -145,9 +145,9 @@
145
145
  "integrity": "sha512-P8owfYWluoUY5Nyzk4gT/L6LmLmseP6ezFWhj6VBUa5pRIdnCvNJpoQ6i/vhekjtJOfqX6nKlB+LCttoUl2GQQ=="
146
146
  },
147
147
  "node_modules/@humanfs/core": {
148
- "version": "0.19.0",
149
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
150
- "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
148
+ "version": "0.19.1",
149
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
150
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
151
151
  "dev": true,
152
152
  "license": "Apache-2.0",
153
153
  "engines": {
@@ -155,19 +155,33 @@
155
155
  }
156
156
  },
157
157
  "node_modules/@humanfs/node": {
158
- "version": "0.16.5",
159
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
160
- "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
158
+ "version": "0.16.6",
159
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
160
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
161
161
  "dev": true,
162
162
  "license": "Apache-2.0",
163
163
  "dependencies": {
164
- "@humanfs/core": "^0.19.0",
164
+ "@humanfs/core": "^0.19.1",
165
165
  "@humanwhocodes/retry": "^0.3.0"
166
166
  },
167
167
  "engines": {
168
168
  "node": ">=18.18.0"
169
169
  }
170
170
  },
171
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
172
+ "version": "0.3.1",
173
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
174
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
175
+ "dev": true,
176
+ "license": "Apache-2.0",
177
+ "engines": {
178
+ "node": ">=18.18"
179
+ },
180
+ "funding": {
181
+ "type": "github",
182
+ "url": "https://github.com/sponsors/nzakas"
183
+ }
184
+ },
171
185
  "node_modules/@humanwhocodes/module-importer": {
172
186
  "version": "1.0.1",
173
187
  "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -182,9 +196,9 @@
182
196
  }
183
197
  },
184
198
  "node_modules/@humanwhocodes/retry": {
185
- "version": "0.3.1",
186
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
187
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
199
+ "version": "0.4.0",
200
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.0.tgz",
201
+ "integrity": "sha512-xnRgu9DxZbkWak/te3fcytNyp8MTbuiZIaueg2rgEvBuN55n04nwLYLU9TX/VVlusc9L2ZNXi99nUFNkHXtr5g==",
188
202
  "dev": true,
189
203
  "license": "Apache-2.0",
190
204
  "engines": {
@@ -216,9 +230,9 @@
216
230
  "dev": true
217
231
  },
218
232
  "node_modules/acorn": {
219
- "version": "8.12.1",
220
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
221
- "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
233
+ "version": "8.14.0",
234
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
235
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
222
236
  "dev": true,
223
237
  "license": "MIT",
224
238
  "bin": {
@@ -701,22 +715,22 @@
701
715
  }
702
716
  },
703
717
  "node_modules/eslint": {
704
- "version": "9.13.0",
705
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz",
706
- "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==",
718
+ "version": "9.14.0",
719
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz",
720
+ "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==",
707
721
  "dev": true,
708
722
  "license": "MIT",
709
723
  "dependencies": {
710
724
  "@eslint-community/eslint-utils": "^4.2.0",
711
- "@eslint-community/regexpp": "^4.11.0",
725
+ "@eslint-community/regexpp": "^4.12.1",
712
726
  "@eslint/config-array": "^0.18.0",
713
727
  "@eslint/core": "^0.7.0",
714
728
  "@eslint/eslintrc": "^3.1.0",
715
- "@eslint/js": "9.13.0",
729
+ "@eslint/js": "9.14.0",
716
730
  "@eslint/plugin-kit": "^0.2.0",
717
- "@humanfs/node": "^0.16.5",
731
+ "@humanfs/node": "^0.16.6",
718
732
  "@humanwhocodes/module-importer": "^1.0.1",
719
- "@humanwhocodes/retry": "^0.3.1",
733
+ "@humanwhocodes/retry": "^0.4.0",
720
734
  "@types/estree": "^1.0.6",
721
735
  "@types/json-schema": "^7.0.15",
722
736
  "ajv": "^6.12.4",
@@ -724,9 +738,9 @@
724
738
  "cross-spawn": "^7.0.2",
725
739
  "debug": "^4.3.2",
726
740
  "escape-string-regexp": "^4.0.0",
727
- "eslint-scope": "^8.1.0",
728
- "eslint-visitor-keys": "^4.1.0",
729
- "espree": "^10.2.0",
741
+ "eslint-scope": "^8.2.0",
742
+ "eslint-visitor-keys": "^4.2.0",
743
+ "espree": "^10.3.0",
730
744
  "esquery": "^1.5.0",
731
745
  "esutils": "^2.0.2",
732
746
  "fast-deep-equal": "^3.1.3",
@@ -893,9 +907,9 @@
893
907
  }
894
908
  },
895
909
  "node_modules/eslint-scope": {
896
- "version": "8.1.0",
897
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.1.0.tgz",
898
- "integrity": "sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==",
910
+ "version": "8.2.0",
911
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
912
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
899
913
  "dev": true,
900
914
  "license": "BSD-2-Clause",
901
915
  "dependencies": {
@@ -922,9 +936,9 @@
922
936
  }
923
937
  },
924
938
  "node_modules/eslint/node_modules/eslint-visitor-keys": {
925
- "version": "4.1.0",
926
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
927
- "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
939
+ "version": "4.2.0",
940
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
941
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
928
942
  "dev": true,
929
943
  "license": "Apache-2.0",
930
944
  "engines": {
@@ -935,15 +949,15 @@
935
949
  }
936
950
  },
937
951
  "node_modules/espree": {
938
- "version": "10.2.0",
939
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.2.0.tgz",
940
- "integrity": "sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==",
952
+ "version": "10.3.0",
953
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
954
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
941
955
  "dev": true,
942
956
  "license": "BSD-2-Clause",
943
957
  "dependencies": {
944
- "acorn": "^8.12.0",
958
+ "acorn": "^8.14.0",
945
959
  "acorn-jsx": "^5.3.2",
946
- "eslint-visitor-keys": "^4.1.0"
960
+ "eslint-visitor-keys": "^4.2.0"
947
961
  },
948
962
  "engines": {
949
963
  "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -953,9 +967,9 @@
953
967
  }
954
968
  },
955
969
  "node_modules/espree/node_modules/eslint-visitor-keys": {
956
- "version": "4.1.0",
957
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz",
958
- "integrity": "sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==",
970
+ "version": "4.2.0",
971
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
972
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
959
973
  "dev": true,
960
974
  "license": "Apache-2.0",
961
975
  "engines": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-theme-harmony",
3
- "version": "2.0.0-pre.40",
3
+ "version": "2.0.0-pre.42",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.7.0"
6
6
  },
package/public/harmony.js CHANGED
@@ -254,20 +254,18 @@ $(document).ready(function () {
254
254
  return;
255
255
  }
256
256
  ['notifications', 'chat'].forEach((type) => {
257
- const countEl = document.querySelector(`[component="${type}/count"]`);
258
- if (!countEl) {
257
+ const countEl = $(`nav.sidebar [component="${type}/count"]`).first();
258
+ if (!countEl.length) {
259
259
  return;
260
260
  }
261
- const count = parseInt(countEl.innerText, 10);
261
+ const count = parseInt(countEl.text(), 10);
262
262
  if (count > 1) {
263
- const listEls = document.querySelectorAll(`[component="${type}/list"]`);
264
- listEls.forEach((listEl) => {
265
- const placeholder = listEl.querySelector('*');
266
- if (placeholder) {
267
- for (let x = 0; x < count - 1; x++) {
268
- const cloneEl = placeholder.cloneNode(true);
269
- listEl.insertBefore(cloneEl, placeholder);
270
- }
263
+ const listEls = $(`.dropdown-menu [component="${type}/list"]`);
264
+ listEls.each((index, el) => {
265
+ const placeholder = $(el).children().first();
266
+ for (let x = 0; x < count - 1; x++) {
267
+ const cloneEl = placeholder.clone(true);
268
+ cloneEl.insertAfter(placeholder);
271
269
  }
272
270
  });
273
271
  }
package/scss/harmony.scss CHANGED
@@ -15,7 +15,6 @@
15
15
  @import "modules/breadcrumbs";
16
16
  @import "modules/tags";
17
17
  @import "modules/user-menu";
18
- @import "modules/bottom-sheet";
19
18
  @import "modules/topic-navigator";
20
19
  @import "modules/topics-list";
21
20
  @import "modules/cover";
@@ -1,7 +1,7 @@
1
1
  ul.topics-list, ul.categories-list {
2
2
  li {
3
3
  &.deleted {
4
- .meta, .topic-thumbs { display: none!important; }
4
+ .meta, .topic-thumbs { visibility: hidden!important; }
5
5
  opacity: 0.65;
6
6
  }
7
7
 
package/scss/topic.scss CHANGED
@@ -9,11 +9,6 @@ body.template-topic {
9
9
  }
10
10
 
11
11
  .posts {
12
- // fixes code blocks pushing content out on mobile
13
- @include media-breakpoint-down(md) {
14
- max-width: calc(100vw - $grid-gutter-width);
15
- }
16
-
17
12
  &.timeline {
18
13
  @include timeline-style;
19
14
  }
@@ -27,10 +22,6 @@ body.template-topic {
27
22
  }
28
23
  }
29
24
 
30
- > [component="post"] > [component="post/footer"] {
31
- margin-left: calc($spacer * 2.5);
32
- }
33
-
34
25
  [component="post"] {
35
26
  &.selected .post-container {
36
27
  background-color: mix($body-bg, $body-color, 90%);
@@ -101,6 +92,7 @@ body.template-topic {
101
92
  &:last-of-type {
102
93
  padding-bottom: 0;
103
94
  .post-footer {
95
+ padding-bottom: 0!important;
104
96
  border-bottom: none !important;
105
97
  }
106
98
  }
@@ -113,7 +105,7 @@ body.template-topic {
113
105
  }
114
106
  }
115
107
 
116
- @include media-breakpoint-up(sm) {
108
+ @include media-breakpoint-up(lg) {
117
109
  body.template-topic {
118
110
  .topic .posts {
119
111
  [component="post"] {
@@ -129,7 +121,7 @@ body.template-topic {
129
121
  opacity: 1;
130
122
  }
131
123
  &:hover {
132
- > .post-footer > [component="post/actions"] {
124
+ > div > .post-container > [component="post/footer"] > div > [component="post/actions"] {
133
125
  opacity: 1;
134
126
  }
135
127
  }
@@ -29,6 +29,26 @@
29
29
  <input class="form-control" type="date" id="birthday" name="birthday" value="{birthday}" placeholder="mm/dd/yyyy">
30
30
  </div>
31
31
 
32
+ {{{ each customUserFields }}}
33
+ <div class="mb-3">
34
+ <label class="form-label fw-bold" for="{./key}">{./name}</label>
35
+ {{{ if ((./type == "input-text") || (./type == "input-link")) }}}
36
+ <input class="form-control" type="text" id="{./key}" name="{./key}" value="{./value}">
37
+ {{{ end }}}
38
+
39
+ {{{ if (./type == "input-number") }}}
40
+ <input class="form-control" type="number" id="{./key}" name="{./key}" value="{./value}">
41
+ {{{ end }}}
42
+ {{{ if (./type == "select") }}}
43
+ <select class="form-select" id="{./key}" name="{./key}">
44
+ {{{ each ./select-options}}}
45
+ <option value="{./value}" {{{ if ./selected }}}selected{{{ end }}}>{./value}</option>
46
+ {{{ end }}}
47
+ </select>
48
+ {{{ end }}}
49
+ </div>
50
+ {{{ end }}}
51
+
32
52
  <div class="mb-3">
33
53
  <label class="form-label fw-bold" for="groupTitle">[[user:grouptitle]]</label>
34
54
 
@@ -23,17 +23,17 @@
23
23
  {{{ end }}}
24
24
 
25
25
  <div class="account-stats container">
26
- <div class="row row-cols-2 row-cols-xl-3 row-cols-xxl-4 g-2">
26
+ <div class="row row-cols-2 row-cols-xl-3 row-cols-xxl-4 g-2 mb-5">
27
27
  {{{ if !reputation:disabled }}}
28
28
  <div class="stat">
29
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
29
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100">
30
30
  <span class="stat-label text-xs fw-semibold">[[global:reputation]]</span>
31
31
  <span class="fs-2 ff-secondary" title="{reputation}">{humanReadableNumber(reputation)}</span>
32
32
  </div>
33
33
  </div>
34
34
  {{{ end }}}
35
35
  <div class="stat">
36
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100">
36
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100">
37
37
  <span class="stat-label text-xs fw-semibold">[[user:profile-views]]</span>
38
38
  <span class="fs-2 ff-secondary" title="
39
39
  {profileviews}">{humanReadableNumber(profileviews)}</span>
@@ -41,14 +41,14 @@
41
41
  </div>
42
42
 
43
43
  <div class="stat">
44
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
44
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
45
45
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-user-plus"></i> <span>[[user:joined]]</span></span>
46
46
  <span class="timeago fs-6 ff-secondary" title="{joindateISO}"></span>
47
47
  </div>
48
48
  </div>
49
49
 
50
50
  <div class="stat">
51
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
51
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
52
52
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-clock"></i> <span>[[user:lastonline]]</span></span>
53
53
  <span class="timeago text-center text-break w-100 px-2 fs-6 ff-secondary" title="{lastonlineISO}"></span>
54
54
  </div>
@@ -56,7 +56,7 @@
56
56
 
57
57
  {{{ if email }}}
58
58
  <div class="stat">
59
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
59
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
60
60
  <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>
61
61
  <span class="text-sm text-center text-break w-100 px-2 ff-secondary">{email}</span>
62
62
  </div>
@@ -65,7 +65,7 @@
65
65
 
66
66
  {{{ if websiteName }}}
67
67
  <div class="stat">
68
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
68
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
69
69
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-globe"></i> <span>[[user:website]]</span></span>
70
70
  <a class="text-sm text-center text-break w-100 px-2 ff-secondary text-underline text-reset" href="{websiteLink}" rel="nofollow noreferrer me">{websiteName}</a>
71
71
  </div>
@@ -74,7 +74,7 @@
74
74
 
75
75
  {{{ if location }}}
76
76
  <div class="stat">
77
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
77
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
78
78
  <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-map-pin"></i> <span>[[user:location]]</span></span>
79
79
  <span class="text-center text-break w-100 px-2 fs-6 ff-secondary">{location}</span>
80
80
  </div>
@@ -83,12 +83,27 @@
83
83
 
84
84
  {{{ if age }}}
85
85
  <div class="stat">
86
- <div class="align-items-center justify-content-center card card-header px-0 py-3 border-0 rounded-1 h-100 gap-2">
86
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
87
87
  <span class="stat-label text-xs fw-semibold"><span><i class="text-muted fa-solid fa-cake-candles"></i> [[user:age]]</span></span>
88
88
  <span class="fs-6 ff-secondary">{age}</span>
89
89
  </div>
90
90
  </div>
91
91
  {{{ end }}}
92
+
93
+ {{{ each customUserFields }}}
94
+ {{{ if ./value }}}
95
+ <div class="stat">
96
+ <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
97
+ <span class="stat-label text-xs fw-semibold"><span><i class="text-muted {./icon}"></i> {./name}</span></span>
98
+ {{{ if (./type == "input-link") }}}
99
+ <a class="text-sm text-center text-break w-100 px-2 ff-secondary text-underline text-reset" href="{./value}" rel="nofollow noreferrer me">{./value}</a>
100
+ {{{ else }}}
101
+ <span class="text-center fs-6 ff-secondary">{./value}</span>
102
+ {{{ end }}}
103
+ </div>
104
+ </div>
105
+ {{{ end }}}
106
+ {{{ end }}}
92
107
  </div>
93
108
  </div>
94
109
 
@@ -68,11 +68,11 @@
68
68
  {{{ if (loggedIn && (!isSelf && !banned)) }}}
69
69
  <hr class="w-100 my-2"/>
70
70
 
71
- <a {{{if flagId }}}hidden{{{end}}} href="#" component="account/flag" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start">
71
+ <a href="#" component="account/flag" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if flagId }}}hidden{{{end}}}">
72
72
  <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
73
73
  <div class="flex-grow-1 text-nowrap">[[user:flag-profile]]</div>
74
74
  </a>
75
- <a {{{if !flagId }}}hidden{{{end}}} href="#" component="account/already-flagged" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start" data-flag-id="{flagId}">
75
+ <a href="#" component="account/already-flagged" class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 text-start {{{if !flagId }}}hidden{{{end}}}" data-flag-id="{flagId}">
76
76
  <i class="flex-shrink-0 fa-solid fa-flag text-danger"></i>
77
77
  <div class="flex-grow-1 text-nowrap">[[user:profile-flagged]]</div>
78
78
  </a>
@@ -20,8 +20,8 @@
20
20
  {{{ each ./children }}}
21
21
  {{{ if !./isSection }}}
22
22
  <span class="category-children-item small">
23
- <div class="d-flex align-items-center gap-1">
24
- <i class="fa fa-fw fa-caret-right text-primary align-self-start" style="line-height: var(--bs-body-line-height);"></i>
23
+ <div class="d-flex gap-1">
24
+ <i class="fa fa-fw fa-caret-right text-primary" style="line-height: var(--bs-body-line-height);"></i>
25
25
  <a href="{{{ if ./link }}}{./link}{{{ else }}}{config.relative_path}/category/{./slug}{{{ end }}}" class="text-reset fw-semibold">{./name}</a>
26
26
  </div>
27
27
  </span>
@@ -1,6 +1,7 @@
1
- {{{ if (brand:logo || config.showSiteTitle)}}}
1
+ {{{ if (brand:logo || (config.showSiteTitle || widgets.brand-header.length)) }}}
2
2
  <div class="container-lg px-md-4 brand-container">
3
3
  <div class="col-12 d-flex border-bottom pb-3 {{{ if config.theme.centerHeaderElements }}}justify-content-center{{{ end }}}">
4
+ {{{ if (brand:logo || config.showSiteTitle) }}}
4
5
  <div component="brand/wrapper" class="d-flex align-items-center gap-3 p-2 rounded-1 align-content-stretch ">
5
6
  {{{ if brand:logo }}}
6
7
  <a component="brand/anchor" href="{{{ if brand:logo:url }}}{brand:logo:url}{{{ else }}}{relative_path}/{{{ end }}}" title="[[global:header.brand-logo]]">
@@ -14,6 +15,7 @@
14
15
  </a>
15
16
  {{{ end }}}
16
17
  </div>
18
+ {{{ end }}}
17
19
  {{{ if widgets.brand-header.length }}}
18
20
  <div data-widget-area="brand-header" class="flex-fill gap-3 p-2 align-self-center">
19
21
  {{{each widgets.brand-header}}}
@@ -4,6 +4,7 @@
4
4
  <span class="menu-icon"><i class="fa fa-fw text-secondary fa-pencil"></i></span> [[topic:edit]]
5
5
  </a>
6
6
  </li>
7
+ {{{ if posts.display_delete_tools }}}
7
8
  <li {{{ if posts.deleted }}}hidden{{{ end }}}>
8
9
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/delete" role="menuitem" href="#" class="{{{ if posts.deleted }}}hidden{{{ end }}}">
9
10
  <span class="menu-icon"><i class="fa fa-fw text-secondary fa-trash-o"></i></span> [[topic:delete]]
@@ -14,6 +15,7 @@
14
15
  <span class="menu-icon"><i class="fa fa-fw text-secondary fa-history"></i></span> [[topic:restore]]
15
16
  </a>
16
17
  </li>
18
+ {{{ end }}}
17
19
  {{{ if posts.display_purge_tools }}}
18
20
  <li {{{ if !posts.deleted }}}hidden{{{ end }}}>
19
21
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/purge" role="menuitem" href="#" class="{{{ if !posts.deleted }}}hidden{{{ end }}}">
@@ -38,6 +40,14 @@
38
40
  </li>
39
41
  {{{ end }}}
40
42
 
43
+ {{{ if posts.display_manage_editors_tools }}}
44
+ <li>
45
+ <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/manage-editors" role="menuitem" href="#">
46
+ <span class="menu-icon"><i class="fa fa-fw text-secondary fa-user-pen"></i></span> [[topic:manage-editors]]
47
+ </a>
48
+ </li>
49
+ {{{ end }}}
50
+
41
51
  {{{ if posts.ip }}}
42
52
  <li>
43
53
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" component="post/copy-ip" role="menuitem" href="#" data-clipboard-text="{posts.ip}">