nodebb-theme-persona 13.0.66 → 13.0.68

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nodebb-theme-persona",
3
- "version": "13.0.66",
3
+ "version": "13.0.68",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.0.0"
6
6
  },
package/scss/chats.scss CHANGED
@@ -100,14 +100,6 @@
100
100
  border: 1px solid $gray-200;
101
101
  border-radius: 0;
102
102
  }
103
-
104
- [component="chat/message/remaining"] {
105
- position: absolute;
106
- right: 10em;
107
- z-index: 2;
108
- bottom: 0;
109
- color: $gray-600;
110
- }
111
103
  }
112
104
  }
113
105
 
@@ -26,19 +26,7 @@
26
26
  <!-- IMPORT partials/chats/messages.tpl -->
27
27
  </ul>
28
28
 
29
- <div component="chat/composer" class="d-flex flex-column flex-md-row gap-2 border-top pt-2 align-items-start align-items-md-end">
30
- <div class="w-100 flex-grow-1 position-relative">
31
- <textarea component="chat/input" placeholder="[[modules:chat.placeholder.mobile]]" class="form-control chat-input mousetrap" style="height:0;resize:none;"></textarea>
32
- <span component="chat/message/remaining" class="text-xs text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
33
- </div>
34
- <div class="d-flex justify-content-between align-self-stretch gap-2">
35
- <button component="chat/upload/button" class="btn btn-light btn-sm align-self-end" type="button"><i class="fa fa-fw fa-upload"></i></button>
36
- <button class="btn btn-primary btn-sm align-self-end" type="button" data-action="send"><i class="fa fa-fw fa-paper-plane"></i></button>
37
- </div>
38
- <form class="hidden" component="chat/upload" method="post" enctype="multipart/form-data">
39
- <input type="file" name="files[]" multiple class="hidden"/>
40
- </form>
41
- </div>
29
+ <!-- IMPORT partials/chats/composer.tpl -->
42
30
  </div>
43
31
  <div class="imagedrop"><div>[[topic:composer.drag_and_drop_images]]</div></div>
44
32
  </div>
@@ -12,15 +12,17 @@
12
12
  <input type="text" class="form-control form-control-sm" placeholder="[[search:type-to-search]]" autocomplete="off">
13
13
  </div>
14
14
  <ul component="category/list" class="dropdown-menu category-dropdown-menu" role="menu">
15
- <li role="presentation" class="category" data-all="all">
16
- <a class="dropdown-item" role="menu-item" href="{config.relative_path}/{allCategoriesUrl}"><i component="category/select/icon" class="fa fa-fw fa-check {{{if selectedCategory}}}invisible{{{end}}}"></i> [[unread:all_categories]]</a>
15
+ <li role="presentation" class="category" data-cid="all">
16
+ <a class="dropdown-item" role="menu-item" href="{{{ if allCategoriesUrl }}}{config.relative_path}/{allCategoriesUrl}{{{ else }}}#{{{ end }}}"><i component="category/select/icon" class="fa fa-fw fa-check {{{if selectedCategory}}}invisible{{{end}}}"></i> [[unread:all_categories]]</a>
17
17
  </li>
18
18
  {{{each categoryItems}}}
19
19
  <li role="presentation" class="category {{{ if ../disabledClass }}}disabled{{{ end }}}" data-cid="{../cid}" data-parent-cid="{../parentCid}" data-name="{../name}">
20
20
  <a class="dropdown-item" role="menu-item" href="#">{../level}<i component="category/select/icon" class="fa fa-fw fa-check {{{ if !../selected }}}invisible{{{ end }}}"></i>
21
21
  <span component="category-markup" style="{{{ if ../match }}}font-weight: bold;{{{end}}}">
22
22
  <div class="category-item d-inline-block">
23
+ {{{ if ./icon}}}
23
24
  {buildCategoryIcon(@value, "24px", "rounded-circle")}
25
+ {{{ end }}}
24
26
  {./name}
25
27
  </div>
26
28
  </span>
@@ -0,0 +1,13 @@
1
+ <div component="chat/composer" class="d-flex flex-column flex-md-row gap-2 border-top pt-2 align-items-start align-items-md-end">
2
+ <div class="w-100 flex-grow-1 flex-nowrap position-relative d-flex rounded-2 border border-secondary p-1 align-items-end">
3
+ <button component="chat/upload/button" class="btn btn-light btn-sm px-2 rounded-1" type="button"><i class="fa fa-fw fa-upload"></i></button>
4
+ <div class="flex-grow-1 align-self-center">
5
+ <textarea component="chat/input" placeholder="[[modules:chat.placeholder.mobile]]" class="bg-transparent text-body form-control chat-input mousetrap rounded-0 border-0 shadow-none ps-1 py-0" style="min-height: 1.5rem;height:0;max-height:30vh;resize:none;"></textarea>
6
+ </div>
7
+ <div component="chat/message/remaining" class="text-xs text-muted me-1">{maximumChatMessageLength}</div>
8
+ <button class="btn btn-primary btn-sm px-2 rounded-1" type="button" data-action="send"><i class="fa fa-fw fa-paper-plane"></i></button>
9
+ </div>
10
+ <form class="hidden" component="chat/upload" method="post" enctype="multipart/form-data">
11
+ <input type="file" name="files[]" multiple class="hidden"/>
12
+ </form>
13
+ </div>
@@ -18,19 +18,7 @@
18
18
  <ul class="chat-content">
19
19
  <!-- IMPORT partials/chats/messages.tpl -->
20
20
  </ul>
21
- <div component="chat/composer" class="d-flex flex-column flex-md-row gap-2 border-top pt-2 align-items-start align-items-md-end">
22
- <div class="w-100 flex-grow-1 position-relative">
23
- <textarea component="chat/input" placeholder="[[modules:chat.placeholder.mobile]]" class="form-control chat-input mousetrap" style="height:0;resize:none;"></textarea>
24
- <span component="chat/message/remaining" class="text-xs text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
25
- </div>
26
- <div class="d-flex justify-content-between align-self-stretch gap-2">
27
- <button component="chat/upload/button" class="btn btn-light btn-sm align-self-end" type="button"><i class="fa fa-fw fa-upload"></i></button>
28
- <button class="btn btn-primary btn-sm align-self-end" type="button" data-action="send"><i class="fa fa-fw fa-paper-plane"></i></button>
29
- </div>
30
- <form class="hidden" component="chat/upload" method="post" enctype="multipart/form-data">
31
- <input type="file" name="files[]" multiple class="hidden"/>
32
- </form>
33
- </div>
21
+ <!-- IMPORT partials/chats/composer.tpl -->
34
22
  </div>
35
23
  <!-- ELSE -->
36
24
  <div class="alert alert-info me-3">
@@ -0,0 +1,184 @@
1
+ <div class="d-flex flex-wrap gap-2 align-items-center" component="search/filters">
2
+ <!-- category filter -->
3
+ <div class="post-search-item">
4
+ <div component="category/filter" class="dropdown" data-filter-name="category">
5
+ <a component="category/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.categories.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
6
+ <span class="filter-label">{{{ if filters.categories.active }}}{filters.categories.label}{{{ else }}}[[search:categories]]{{{ end }}}</span>
7
+ <span class="caret"></span>
8
+ </a>
9
+
10
+ <ul class="dropdown-menu p-1 text-sm">
11
+ <li class="px-3 py-1 mb-2 d-flex flex-column gap-2">
12
+ <div component="category-selector-search">
13
+ <input type="text" class="form-control" component="category/filter/search" placeholder="[[search:type-a-category]]">
14
+ </div>
15
+ </li>
16
+ <div component="category/list" class="overflow-auto" style="max-height: 350px;"></div>
17
+ <div class="px-3 py-1">
18
+ <div class="form-check">
19
+ <input id="search-children" class="form-check-input" type="checkbox"/>
20
+ <label class="form-check-label" for="search-children">[[search:search-child-categories]]</label>
21
+ </div>
22
+ </div>
23
+ </ul>
24
+ </div>
25
+ </div>
26
+
27
+
28
+ <!-- tag filter -->
29
+ <div class="post-search-item">
30
+ <div component="tag/filter" class="dropdown" data-filter-name="tag">
31
+ <a component="tag/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.tags.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
32
+ <span class="filter-label">{{{ if filters.tags.active }}}{filters.tags.label}{{{ else }}}[[search:tags]]{{{ end }}}</span>
33
+ <span class="caret"></span>
34
+ </a>
35
+
36
+ <ul class="dropdown-menu p-1 text-sm" style="width: 350px;">
37
+ <li class="px-3 py-1 d-flex flex-column gap-2">
38
+ <input type="text" class="form-control" component="tag/filter/search" placeholder="[[search:type-a-tag]]">
39
+ <div component="tag/filter/selected" class="d-flex flex-wrap gap-2">
40
+ {{{ each tagFilterSelected }}}
41
+ <div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
42
+ <div>{./valueEscaped}</div>
43
+ <button component="tag/filter/delete" data-tag="{./valueEscaped}" class="btn btn-primary btn-sm py-0"><i class="fa fa-times fa-xs"></i></button>
44
+ </div>
45
+ {{{ end }}}
46
+ </div>
47
+ <hr/>
48
+ <div component="tag/filter/results" class="d-flex flex-wrap gap-2">
49
+ {{{ each tagFilterResults }}}
50
+ <button class="btn btn-light btn-sm border" data-tag="{./valueEscaped}">{./valueEscaped}</button>
51
+ {{{ end }}}
52
+ </div>
53
+ </li>
54
+ </ul>
55
+ </div>
56
+ </div>
57
+
58
+ <!-- user name filter -->
59
+ <div class="post-search-item">
60
+ <div component="user/filter" class="dropdown" data-filter-name="user">
61
+ <a component="user/filter/button" class="filter-btn btn btn-light btn-sm border {{{ if filters.users.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
62
+ <span class="filter-label">{{{ if filters.users.active }}}{filters.users.label}{{{ else }}}[[search:posted-by]]{{{ end }}}</span>
63
+ <span class="caret"></span>
64
+ </a>
65
+
66
+ <ul class="dropdown-menu p-1 text-sm" style="width: 350px;">
67
+ <li class="px-3 py-1 d-flex flex-column gap-2">
68
+ <input type="text" class="form-control" component="user/filter/search" placeholder="[[search:type-a-username]]">
69
+ <div component="user/filter/selected" class="d-flex flex-wrap gap-2">
70
+ {{{ each userFilterSelected }}}
71
+ <div class="d-flex px-2 py-1 rounded-1 text-bg-primary gap-2 align-items-center text-sm">
72
+ {buildAvatar(@value, "16px", true)} {./username}
73
+ <button component="user/filter/delete" data-uid="{./uid}" class="btn btn-primary btn-sm py-0"><i class="fa fa-times fa-xs"></i></button>
74
+ </div>
75
+ {{{ end }}}
76
+ </div>
77
+ <hr/>
78
+ <div component="user/filter/results" class="d-flex flex-wrap gap-2">
79
+ {{{ each userFilterResults }}}
80
+ <button class="btn btn-light btn-sm border" data-uid="{./uid}" data-username="{./username}">{buildAvatar(@value, "16px", true)} {./username}</button>
81
+ {{{ end }}}
82
+ </div>
83
+ </li>
84
+ </ul>
85
+ </div>
86
+ </div>
87
+
88
+
89
+ <!-- reply count filter -->
90
+ <div class="post-search-item">
91
+ <div class="dropdown" data-filter-name="replies">
92
+ <a id="reply-count-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.replies.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
93
+ <span class="filter-label">{{{ if filters.replies.active }}}{filters.replies.label}{{{ else }}}[[search:replies]]{{{ end }}}</span>
94
+ <span class="caret"></span>
95
+ </a>
96
+
97
+ <ul class="dropdown-menu p-1 text-sm" style="width: 300px;">
98
+ <li class="px-3 py-1 d-flex flex-nowrap gap-2">
99
+ <select id="reply-count-filter" class="form-select py-2 ps-2 pe-3">
100
+ <option value="atleast">[[search:at-least]]</option>
101
+ <option value="atmost">[[search:at-most]]</option>
102
+ </select>
103
+ <input id="reply-count" type="number" min="0" class="form-control py-2 ps-2 pe-3" />
104
+ </li>
105
+ </ul>
106
+ </div>
107
+ </div>
108
+
109
+ <!-- time filter -->
110
+ <div class="post-search-item">
111
+ <div class="dropdown" data-filter-name="time">
112
+ <a id="post-time-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.time.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
113
+ <span class="filter-label">{{{ if filters.time.active }}}{filters.time.label}{{{ else }}}[[search:time]]{{{ end }}}</span>
114
+ <span class="caret"></span>
115
+ </a>
116
+
117
+ <ul class="dropdown-menu p-1 text-sm" style="width: 350px;">
118
+ <li class="px-3 py-1 d-flex flex-nowrap gap-2">
119
+ <select id="post-time-filter" class="form-select py-2 ps-2 pe-3">
120
+ <option value="newer">[[search:newer-than]]</option>
121
+ <option value="older">[[search:older-than]]</option>
122
+ </select>
123
+ <select id="post-time-range" class="form-select py-2 ps-2 pe-3">
124
+ <option value="">[[search:any-date]]</option>
125
+ <option value="86400">[[search:yesterday]]</option>
126
+ <option value="604800">[[search:one-week]]</option>
127
+ <option value="1209600">[[search:two-weeks]]</option>
128
+ <option value="2592000">[[search:one-month]]</option>
129
+ <option value="7776000">[[search:three-months]]</option>
130
+ <option value="15552000">[[search:six-months]]</option>
131
+ <option value="31104000">[[search:one-year]]</option>
132
+ </select>
133
+ </li>
134
+ </ul>
135
+ </div>
136
+ </div>
137
+
138
+ <!-- sort filter -->
139
+ <div class="post-search-item">
140
+ <div class="dropdown" data-filter-name="sort">
141
+ <a id="sort-by-button" class="filter-btn btn btn-light btn-sm border {{{ if filters.sort.active }}}active-filter{{{ end }}} dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
142
+ <span class="filter-label">{{{ if filters.sort.active }}}{filters.sort.label}{{{ else }}}[[search:sort]]{{{ end }}}</span>
143
+ <span class="caret"></span>
144
+ </a>
145
+
146
+ <ul class="dropdown-menu p-1 text-sm" style="width: 250px;">
147
+ <li class="px-3 py-1 d-flex flex-column gap-2">
148
+ <select id="post-sort-by" class="form-select py-2 ps-2 pe-3">
149
+ <option value="relevance">[[search:relevance]]</option>
150
+ <option value="timestamp">[[search:post-time]]</option>
151
+ <option value="votes">[[search:votes]]</option>
152
+ <option value="topic.lastposttime">[[search:last-reply-time]]</option>
153
+ <option value="topic.title">[[search:topic-title]]</option>
154
+ <option value="topic.postcount">[[search:number-of-replies]]</option>
155
+ <option value="topic.viewcount">[[search:number-of-views]]</option>
156
+ <option value="topic.votes">[[search:topic-votes]]</option>
157
+ <option value="topic.timestamp">[[search:topic-start-date]]</option>
158
+ <option value="user.username">[[search:username]]</option>
159
+ <option value="category.name">[[search:category]]</option>
160
+ </select>
161
+ <select id="post-sort-direction" class="form-select py-2 ps-2 pe-3">
162
+ <option value="desc">[[search:descending]]</option>
163
+ <option value="asc">[[search:ascending]]</option>
164
+ </select>
165
+ </li>
166
+ </ul>
167
+ </div>
168
+ </div>
169
+
170
+ <!-- save & reset preferences -->
171
+ <div class="post-search-item">
172
+ <div class="dropdown">
173
+ <a class="btn btn-light btn-sm border border-gray-300 dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">[[search:save]] <span class="caret"></span>
174
+ </a>
175
+
176
+ <ul class="dropdown-menu p-1 text-sm" style="width: 300px;">
177
+ <li class="px-3 py-1 d-flex flex-column gap-2">
178
+ <button id="save-preferences" class="btn btn-primary">[[search:save-preferences]]</button>
179
+ <button id="clear-preferences" class="btn-outline border">[[search:clear-preferences]]</button>
180
+ </li>
181
+ </ul>
182
+ </div>
183
+ </div>
184
+ </div>