nodebb-theme-harmony 0.0.4 → 0.0.6

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-harmony",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "nbbpm": {
5
5
  "compatibility": "^3.0.0"
6
6
  },
package/public/harmony.js CHANGED
@@ -26,6 +26,12 @@ $(document).ready(function () {
26
26
  width: $('#panel').width(),
27
27
  });
28
28
  });
29
+
30
+ hooks.on('filter:chat.openChat', function (hookData) {
31
+ // disables chat modals & goes straight to chat page
32
+ hookData.modal = false;
33
+ return hookData;
34
+ });
29
35
  });
30
36
 
31
37
  function setupMobileMenu() {
package/scss/chats.scss CHANGED
@@ -7,11 +7,6 @@ body.page-user-chats {
7
7
  overflow: hidden;
8
8
  }
9
9
 
10
- /* Styles common to both full chat and chat modal */
11
- .chats-full, .chat-modal {
12
- height: calc(100vh - var(--panel-offset) - $spacer)!important;
13
- }
14
-
15
10
  .expanded-chat, .chat-modal {
16
11
  // no taskbar so hide minimize button
17
12
  [data-action="minimize"] {
@@ -42,9 +37,11 @@ body.page-user-chats {
42
37
  }
43
38
 
44
39
  /* Mobile handling of chat page */
45
- @include media-breakpoint-down(sm) {
40
+ @include media-breakpoint-down(md) {
46
41
  .page-user-chats {
47
- padding-bottom: 0;
42
+ .chats-full {
43
+ padding-bottom: 8rem!important;
44
+ }
48
45
 
49
46
  [component="chat/nav-wrapper"][data-loaded="1"] {
50
47
  display: none!important;
@@ -53,20 +50,5 @@ body.page-user-chats {
53
50
  [component="chat/nav-wrapper"][data-loaded="0"] + [component="chat/main-wrapper"] {
54
51
  display: none!important;
55
52
  }
56
-
57
- [component="chat/messages"] {
58
- width: calc(100vw - $grid-gutter-width);
59
- }
60
- }
61
-
62
- [data-action="pop-out"] {
63
- display: none!important;
64
53
  }
65
54
  }
66
-
67
- /* Mobile handling of chat modal */
68
- @include media-breakpoint-down(sm) {
69
- .chat-modal {
70
- z-index: $zindex-popover + 10;
71
- }
72
- }
package/scss/common.scss CHANGED
@@ -62,4 +62,16 @@ body {
62
62
  @include btn-ghost-base();
63
63
  font-size: 0.875rem;
64
64
  line-height: 1.25rem;
65
- }
65
+ }
66
+
67
+ .btn-outline {
68
+ @include btn-ghost-base();
69
+ border-color: $border-color;
70
+ }
71
+
72
+ .btn-outline-sm {
73
+ @include btn-ghost-base();
74
+ border-color: $border-color;
75
+ font-size: 0.875rem;
76
+ line-height: 1.25rem;
77
+ }
@@ -3,11 +3,11 @@
3
3
  <div class="modal-content">
4
4
  <div class="modal-header d-flex">
5
5
  <div class="fs-5 flex-grow-1" component="chat/room/name"><!-- IF roomName -->{roomName}<!-- ELSE -->{usernames}<!-- ENDIF roomName --></div>
6
- <button type="button" class="btn btn-link d-none d-md-block p-2 text-muted align-text-top" data-action="maximize">
6
+ <button type="button" class="btn btn-outline d-none d-md-flex" data-action="maximize">
7
7
  <span aria-hidden="true"><i class="fa fa-fw fa-expand"></i></span>
8
8
  <span class="sr-only">[[modules:chat.maximize]]</span>
9
9
  </button>
10
- <button type="button" class="btn btn-link d-none d-md-block p-2 text-muted align-text-top" data-action="minimize">
10
+ <button type="button" class="btn btn-outline d-none d-md-flex" data-action="minimize">
11
11
  <span aria-hidden="true"><i class="fa fa-fw fa-minus"></i></span>
12
12
  <span class="sr-only">[[modules:chat.minimize]]</span>
13
13
  </button>
@@ -1,12 +1,21 @@
1
1
  <div class="chats-full d-flex gap-1 vh-100 py-3">
2
2
  <div class="d-flex flex-column h-100" component="chat/nav-wrapper" data-loaded="{{{ if roomId }}}1{{{ else }}}0{{{ end }}}">
3
3
  <div class="chat-search dropdown mb-2">
4
- <input class="form-control" type="text" component="chat/search" placeholder="[[users:search-user-for-chat]]" data-bs-toggle="dropdown" />
4
+ <label class="text-xs text-muted">[[users:search-user-for-chat]]</label>
5
+
6
+ <div class="input-group">
7
+ <input class="form-control" type="text" component="chat/search" data-bs-toggle="dropdown" />
8
+ <button class="btn btn-primary" type="button">
9
+ <i class="fa fa-search"></i>
10
+ </button>
11
+ </div>
12
+
5
13
  <ul component="chat/search/list" class="dropdown-menu">
6
14
  <li><a href="#" class="dropdown-item">[[admin/menu:search.start-typing]]</a></li>
7
15
  </ul>
8
16
  </div>
9
- <ul component="chat/recent" class="chats-list list-unstyled overflow-auto mb-0 pe-2" data-nextstart="{nextStart}">
17
+ <hr class="text-muted opacity-25 my-1">
18
+ <ul component="chat/recent" class="chats-list list-unstyled overflow-auto mb-0 pe-2" data-nextstart="{nextStart}" style="width:300px;">
10
19
  {{{each rooms}}}
11
20
  <!-- IMPORT partials/chats/recent_room.tpl -->
12
21
  {{{end}}}
@@ -1,5 +1,5 @@
1
1
  <!-- THIS FILE IS STILL PERSONA -->
2
2
 
3
- <div id="taskbar" class="taskbar fixed-bottom">
3
+ <div id="taskbar" class="taskbar fixed-bottom hidden">
4
4
  <div class="navbar-inner"><ul class="nav navbar-nav"></ul></div>
5
5
  </div>
@@ -4,7 +4,7 @@
4
4
  <div component="category/posts" class="ps-3">
5
5
  <a class="background-link" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}"></a>
6
6
  <p class="mb-0">
7
- <a href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "20px", true)}</a>
7
+ <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}">{buildAvatar(posts.user, "20px", true)}</a>
8
8
  <a class="permalink text-muted" href="{config.relative_path}/topic/{./topic.slug}{{{ if ./index }}}/{./index}{{{ end }}}">
9
9
  <span class="timeago text-xs" title="{../timestampISO}"></span>
10
10
  </a>
@@ -1,38 +1,7 @@
1
1
  {{{ if !rooms.length }}}
2
- <li class="text-center"><a href="#" class="text-reset">[[modules:chat.no_active]]</a></li>
2
+ <li class="text-center p-2">[[modules:chat.no_active]]</li>
3
3
  {{{ end }}}
4
4
 
5
5
  {{{ each rooms }}}
6
- <li class="{{{ if ./unread }}}unread{{{ end }}} dropdown-item rounded-1 p-2 d-flex gap-2 pointer" data-roomid="{./roomId}">
7
- <div class="main-avatar">
8
- {{{ if ./users.length }}}
9
- {{{ if ./groupChat}}}
10
- <div class="position-relative" style="width:32px; height:32px;">
11
- <a class="text-decoration-none position-absolute top-0" style="left: 8px;" href="{config.relative_path}/user/{./users.1.userslug}">{buildAvatar(./users.1, "24px", true)}</a>
12
- <a class="text-decoration-none position-absolute start-0" style="top: 8px;" href="{config.relative_path}/user/{./users.0.userslug}" >{buildAvatar(./users.0, "24px", true)}</a>
13
- </div>
14
- {{{ else }}}
15
- <a href="{config.relative_path}/user/{./users.0.userslug}" class="text-decoration-none">{buildAvatar(./users.0, "32px", true)}</a>
16
- {{{ end }}}
17
- {{{ else }}}
18
- <span class="avatar avatar-rounded text-bg-warning" component="avatar/icon" style="--avatar-size: 32px;">?</span>
19
- {{{ end }}}
20
- </div>
21
-
22
- <div class="notification-chat-content d-flex flex-grow-1 flex-column w-100">
23
- <div class="room-name fw-semibold text-xs">
24
- {{{ if !./lastUser.uid }}}
25
- <span>[[modules:chat.no-users-in-room]]</span>
26
- {{{ else }}}
27
- {{{ if ./roomName }}}{./roomName}{{{ else }}}{./usernames}{{{ end }}}
28
- {{{ end }}}
29
- </div>
30
- <div class="teaser-content text-sm line-clamp-3">
31
- <a href="#" class="text-decoration-none">{buildAvatar(./teaser.user, "14px", true)}</a>
32
- <strong class="text-xs fw-semibold teaser-username">{./teaser.user.username}:</strong>
33
- {./teaser.content}
34
- </div>
35
- <div class="teaser-timestamp notification-chat-controls text-muted text-xs">{./teaser.timeagoLong}</div>
36
- </div>
37
- </li>
38
- {{{ end }}}
6
+ <!-- IMPORT partials/chats/recent_room.tpl -->
7
+ {{{ end }}}
@@ -1,24 +1,20 @@
1
1
  <!-- IF roomId -->
2
2
  <div component="chat/messages" class="expanded-chat d-flex flex-column h-100" data-roomid="{roomId}">
3
- <div component="chat/header" class="d-flex align-items-center px-3">
4
- <span class="members flex-grow-1">
5
- [[modules:chat.chatting_with]]:
6
- {{{each users}}}
7
- <a href="{config.relative_path}/uid/{../uid}">{../username}</a><!-- IF !@last -->,<!-- END -->
8
- {{{end}}}
9
- </span>
3
+ <div component="chat/header" class="d-flex align-items-center px-3 gap-1">
4
+ <h5 class="members flex-1 fw-semibold tracking-tight">
5
+ {./chatWithMessage}
6
+ </h5>
10
7
 
11
- <button type="button" class="btn btn-link d-none d-md-block p-2 text-muted" data-action="pop-out" aria-hidden="true" aria-label="Pop Out"><i class="fa fa-compress"></i></button>
12
8
  <!-- IMPORT partials/chats/options.tpl -->
13
- <button type="button" class="btn-close" aria-hidden="true" aria-label="Close" data-action="close"></button>
14
9
  </div>
10
+ <hr class="text-muted opacity-25"/>
15
11
  <div class="position-relative">
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>
12
+ <div component="chat/messages/scroll-up-alert" class="position-absolute me-4 end-0 text-sm scroll-up-alert alert alert-info hidden w-25" role="button" style="z-index: 1;">[[modules:chat.scroll-up-alert]]</div>
17
13
  </div>
18
14
  <ul class="chat-content p-0 m-0 list-unstyled overflow-auto flex-grow-1">
19
15
  <!-- IMPORT partials/chats/messages.tpl -->
20
16
  </ul>
21
- <div component="chat/composer" class="d-flex">
17
+ <div component="chat/composer" class="d-flex gap-1 border-top pt-2">
22
18
  <div class="flex-grow-1 position-relative">
23
19
  <textarea component="chat/input" placeholder="[[modules:chat.placeholder]]" class="form-control chat-input mousetrap" rows="2" style="resize:none;"></textarea>
24
20
  <span component="chat/message/remaining" class="text-muted position-absolute me-1 mb-1" style="right: 0px; bottom:0px;">{maximumChatMessageLength}</span>
@@ -1,4 +1,4 @@
1
- <li component="chat/message" class="chat-message mx-2 pe-2 fw-light clear<!-- IF ../deleted --> deleted<!-- END -->" data-index="{messages.index}" data-mid="{messages.messageId}" data-uid="{messages.fromuid}" data-self="{messages.self}" data-break="{messages.newSet}" data-timestamp="{messages.timestamp}">
1
+ <li component="chat/message" class="chat-message mx-2 pe-2 fw-light clear{{{ if ./deleted }}} deleted{{{ end }}} {{{ if messages.newSet }}}border-top pt-3{{{ end }}}" data-index="{messages.index}" data-mid="{messages.messageId}" data-uid="{messages.fromuid}" data-self="{messages.self}" data-break="{messages.newSet}" data-timestamp="{messages.timestamp}">
2
2
  <div class="message-header {{{ if !messages.newSet }}}hidden{{{ end }}} pb-2">
3
3
  <a href="{config.relative_path}/user/{messages.fromUser.userslug}" class="text-decoration-none">{buildAvatar(messages.fromUser, "24px", false, "not-responsive rounded")}</a>
4
4
  <span class="chat-user fw-bold"><a href="{config.relative_path}/user/{messages.fromUser.userslug}">{messages.fromUser.displayname}</a></span>
@@ -1,7 +1,5 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
1
  <div class="dropdown">
4
- <button class="btn btn-link p-2 text-muted align-text-top" data-bs-toggle="dropdown" component="chat/controlsToggle"><i class="fa fa-gear"></i></button>
2
+ <button class="btn btn-outline align-text-top" data-bs-toggle="dropdown" component="chat/controlsToggle"><i class="fa fa-gear"></i></button>
5
3
  <ul class="dropdown-menu dropdown-menu-end" component="chat/controls">
6
4
  <li class="dropdown-header">[[modules:chat.options]]</li>
7
5
  <li>
@@ -13,14 +11,14 @@
13
11
  <li>
14
12
  <a class="dropdown-item" href="#" data-action="leave"><i class="fa fa-fw fa-sign-out"></i> [[modules:chat.leave]]</a>
15
13
  </li>
16
- <!-- IF users.length -->
14
+ {{{ if users.length }}}
17
15
  <li role="separator" class="dropdown-divider"></li>
18
16
  <li class="dropdown-header">[[modules:chat.in-room]]</li>
19
- {{{each users}}}
17
+ {{{ each users }}}
20
18
  <li>
21
19
  <a class="dropdown-item" href="{config.relative_path}/uid/{../uid}">{buildAvatar(users, "24px", true)} {../username}</a>
22
20
  </li>
23
- {{{end}}}
24
- <!-- END -->
21
+ {{{ end }}}
22
+ {{{ end }}}
25
23
  </ul>
26
24
  </div>
@@ -1,20 +1,37 @@
1
- <li component="chat/recent/room" data-roomid="{rooms.roomId}" class="{{{ if rooms.unread }}}unread{{{ end }}} card card-body p-1 mb-1 border-0 pointer">
2
- <div class="members">
3
- {{{ each rooms.users}}}
4
- {{{ if @first }}}
5
- <div class="main-avatar">
6
- <a href="{config.relative_path}/user/{rooms.users.userslug}" class="text-decoration-none">{buildAvatar(rooms.users, "24px", true)}</a>
7
- <span component="chat/title">{{{ if rooms.roomName }}}{rooms.roomName}{{{ else }}}{rooms.usernames}{{{ end }}}</span>
8
- </div>
9
- {{{ else }}}
10
- <a href="{config.relative_path}/user/{rooms.users.userslug}" class="text-decoration-none">{buildAvatar(rooms.users, "24px", true)}</a>
11
- {{{ end }}}
12
- {{{ end }}}
13
- {{{ if !./users.length}}}
14
- <span class="avatar avatar-rounded text-bg-warning" component="avatar/icon" style="--avatar-size: 24px;">?</span>
15
- {{{ if !rooms.lastUser.uid }}}
16
- <span class="text-muted">[[modules:chat.no-users-in-room]]</span>
17
- {{{ end }}}
18
- {{{ end }}}
19
- </div>
20
- </li>
1
+ <a class="text-decoration-none text-reset" href="{config.relative_path}/me/chats/{./roomId}">
2
+ <li component="chat/recent/room" data-roomid="{./roomId}" data-full="1" class="{{{ if ./unread }}}unread{{{ end }}} btn-ghost-sm gap-2 justify-content-start align-items-start">
3
+ <div class="main-avatar">
4
+ {{{ if ./users.length }}}
5
+ {{{ if ./groupChat}}}
6
+ <div class="position-relative" style="width:32px; height:32px;">
7
+ <span class="text-decoration-none position-absolute top-0" style="left: 8px;" href="{config.relative_path}/user/{./users.1.userslug}">{buildAvatar(./users.1, "24px", true)}</span>
8
+ <span class="text-decoration-none position-absolute start-0" style="top: 8px;" href="{config.relative_path}/user/{./users.0.userslug}" >{buildAvatar(./users.0, "24px", true)}</span>
9
+ </div>
10
+ {{{ else }}}
11
+ <span href="{config.relative_path}/user/{./users.0.userslug}" class="text-decoration-none">{buildAvatar(./users.0, "32px", true)}</span>
12
+ {{{ end }}}
13
+ {{{ else }}}
14
+ <span class="avatar avatar-rounded text-bg-warning" component="avatar/icon" style="--avatar-size: 32px;">?</span>
15
+ {{{ end }}}
16
+ </div>
17
+
18
+ <div class="d-flex flex-grow-1 flex-column w-100">
19
+ <div class="room-name fw-semibold text-xs">
20
+ {{{ if !./lastUser.uid }}}
21
+ <span>[[modules:chat.no-users-in-room]]</span>
22
+ {{{ else }}}
23
+ {{{ if ./roomName }}}{./roomName}{{{ else }}}{./usernames}{{{ end }}}
24
+ {{{ end }}}
25
+ </div>
26
+ {{{ if ./teaser }}}
27
+ <div class="teaser-content text-sm line-clamp-3 text-break">
28
+ <span href="#" class="text-decoration-none">{buildAvatar(./teaser.user, "14px", true)}</span>
29
+ <strong class="text-xs fw-semibold teaser-username">{./teaser.user.username}:</strong>
30
+ {./teaser.content}
31
+ </div>
32
+ <div class="teaser-timestamp text-muted text-xs">{./teaser.timeagoLong}</div>
33
+ {{{ end }}}
34
+ </div>
35
+ </li>
36
+ </a>
37
+ <hr class="text-muted opacity-25 my-1"/>
@@ -1,15 +1,24 @@
1
1
  {{{ if !notifications.length }}}
2
- <li class="no-notifs text-center"><a href="#" class="text-reset">[[notifications:no_notifs]]</a></li>
2
+ <li class="no-notifs text-center p-2">[[notifications:no_notifs]]</li>
3
3
  {{{ end }}}
4
4
 
5
5
  {{{ each notifications }}}
6
- <li class="{./readClass} mb-2" data-nid="{./nid}" data-path="{./path}" {{{ if ./pid }}}data-pid="{./pid}"{{{ end }}}{{{ if ./tid }}}data-tid="{./tid}"{{{ end }}}>
6
+ <li class="{./readClass} mb-2 p-1" data-nid="{./nid}" data-path="{./path}" {{{ if ./pid }}}data-pid="{./pid}"{{{ end }}}{{{ if ./tid }}}data-tid="{./tid}"{{{ end }}}>
7
7
  <div class="d-flex gap-1 justify-content-between">
8
- <div>
9
- <a href="{./path}" class="notification-chat-content text-reset">
10
- <span class="text text-sm">{./bodyShort}</span>
11
- </a>
12
- <div class="text-xs text-muted">{./timeagoLong}</div>
8
+ <div class="d-flex gap-2">
9
+ {{{ if ./image }}}
10
+ {{{ if ./from }}}
11
+ <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}"><img class="avatar avatar-rounded" style="--avatar-size: 32px;" src="{./image}" /></a>
12
+ {{{ end }}}
13
+ {{{ else }}}
14
+ <a class="text-decoration-none" href="{config.relative_path}/user/{./user.userslug}"><div class="avatar avatar-rounded" style="--avatar-size: 32px; background-color: {./user.icon:bgColor};">{./user.icon:text}</div></a>
15
+ {{{ end }}}
16
+ <div class=" d-flex flex-column">
17
+ <a href="{./path}" class="text-decoration-none notification-chat-content text-reset text text-sm">
18
+ {./bodyShort}
19
+ </a>
20
+ <div class="text-xs text-muted">{./timeagoLong}</div>
21
+ </div>
13
22
  </div>
14
23
  <div class="notification-chat-controls">
15
24
  {{{ if ./nid }}}
@@ -10,7 +10,7 @@
10
10
  </a>
11
11
  <ul class="chats-dropdown dropdown-menu p-1 shadow">
12
12
  <li>
13
- <ul component="chat/list" class="chat-list chats-list list-unstyled p-2">
13
+ <ul component="chat/list" class="chat-list chats-list list-unstyled p-0 pe-1">
14
14
  <li class="dropdown-item rounded-1 p-2 d-flex gap-2 placeholder-wave">
15
15
  <div class="main-avatar">
16
16
  <div class="placeholder" style="width: 32px; height: 32px;"></div>
@@ -11,7 +11,7 @@
11
11
  <ul class="drafts-dropdown dropdown-menu p-1 shadow">
12
12
  <li>
13
13
  <ul component="drafts/list" class="draft-list list-unstyled d-flex flex-column gap-1">
14
- <li class="no-drafts text-center hidden p-3 text-sm text-muted">[[modules:composer.no-drafts]]</li>
14
+ <li class="no-drafts text-center p-2">[[modules:composer.no-drafts]]</li>
15
15
 
16
16
  {{{ each drafts }}}
17
17
  {{{ if !@first}}}
@@ -10,7 +10,7 @@
10
10
  </a>
11
11
  <ul class="notifications-dropdown dropdown-menu p-2 shadow">
12
12
  <li>
13
- <ul component="notifications/list" class="notification-list list-unstyled p-2">
13
+ <ul component="notifications/list" class="notification-list list-unstyled">
14
14
  <li class="mb-2 placeholder-wave">
15
15
  <div class="text-sm placeholder col-11">&nbsp;</div>
16
16
  <div class="text-sm placeholder col-5">&nbsp;</div><br />
@@ -1,43 +0,0 @@
1
- <!-- THIS FILE IS STILL PERSONA -->
2
-
3
- {{{ if config.loggedIn }}}
4
- <ul class="nav nav-pills">
5
- <li class="nav-item">
6
- <a class="nav-link" href="#" data-bs-target="#notifications" data-bs-toggle="tab"><span class="counter unread-count" component="notifications/icon" data-content="{unreadCount.notification}"></span> <i class="fa fa-fw fa-bell"></i></a>
7
- </li>
8
- {{{ if !config.disableChat }}}
9
- <li class="nav-item">
10
- <a class="nav-link" href="#" data-bs-target="#chats" data-bs-toggle="tab"><i class="counter unread-count" component="chat/icon" data-content="{unreadCount.chat}"></i> <i class="fa fa-fw fa-comment"></i></a>
11
- </li>
12
- {{{ end }}}
13
- <li class="nav-item">
14
- <a class="nav-link active" href="#" data-bs-target="#profile" data-bs-toggle="tab">
15
- {buildAvatar(user, "24px", true, "user-icon")}
16
- <i component="user/status" class="fa fa-fw fa-circle status {user.status}"></i>
17
- </a>
18
- </li>
19
- </ul>
20
-
21
- <div class="tab-content">
22
- <div class="tab-pane fade show active" id="profile">
23
- <section class="menu-section" data-section="profile">
24
- <ul class="menu-section-list dropdown-menu show text-bg-dark w-100 border-0" component="header/usercontrol"></ul>
25
- </section>
26
- </div>
27
- <div class="tab-pane fade" id="notifications">
28
- <section class="menu-section text-bg-dark" data-section="notifications">
29
- <ul class="menu-section-list notification-list-mobile" component="notifications/list"></ul>
30
- <p class="menu-section-list"><a href="{relative_path}/notifications">[[notifications:see_all]]</a></p>
31
- </section>
32
- </div>
33
- {{{ if !config.disableChat }}}
34
- <div class="tab-pane fade" id="chats">
35
- <section class="menu-section text-bg-dark" data-section="chats">
36
- <ul class="menu-section-list chat-list" component="chat/list">
37
- <a class="navigation-link" href="{relative_path}/user/{user.userslug}/chats">[[modules:chat.see_all]]</a>
38
- </ul>
39
- </section>
40
- </div>
41
- {{{ end }}}
42
- </div>
43
- {{{ end }}}