@ecl/site-header 5.0.0-RC1

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.
@@ -0,0 +1,546 @@
1
+ /**
2
+ * Site Header EU
3
+ * @define site-header
4
+ */
5
+
6
+ @use 'sass:map';
7
+ @use '@ecl/grid/mixins/breakpoints';
8
+
9
+ // Exposed variables
10
+ $theme: null !default;
11
+ $site-header: null !default;
12
+ $language-list: null !default;
13
+
14
+ @use 'site-header-dropdown' with (
15
+ $theme: $theme,
16
+ $language-switcher: map.get($site-header, 'language-switcher'),
17
+ $language-list: $language-list
18
+ );
19
+
20
+ .ecl-site-header {
21
+ background-color: map.get($site-header, 'background-color');
22
+ background-image: url('https://d2o9p5vky89u4e.cloudfront.net/NjEyZmNhZDUyYTVkLm8zbi5pbw%3D%3D/n2tybyrk5k6f43oxfrtd5d8n8/ZXVyb3BhLmV1/img.gif');
23
+ margin: 0;
24
+ position: relative;
25
+ z-index: map.get($theme, 'z-index', 'modal');
26
+
27
+ .ecl-site-header__inner {
28
+ box-shadow: var(--sh-4);
29
+ }
30
+
31
+ .ecl-site-header__background {
32
+ background: map.get($theme, 'color', 'white');
33
+ position: relative;
34
+ }
35
+
36
+ .ecl-menu,
37
+ .ecl-mega-menu {
38
+ background: transparent;
39
+ box-shadow: none;
40
+ display: flex;
41
+ min-height: map.get($site-header, 'logo-height-s');
42
+ top: var(--s-m);
43
+ padding: 0;
44
+ position: absolute;
45
+ right: 0;
46
+ width: calc(44px + var(--s-m) * 2);
47
+
48
+ &:dir(rtl) {
49
+ left: 0;
50
+ right: auto;
51
+ }
52
+ }
53
+
54
+ .ecl-site-header__cta {
55
+ margin-bottom: var(--s-m);
56
+ position: relative;
57
+ width: max-content;
58
+ z-index: 1;
59
+ }
60
+
61
+ .ecl-site-header__cta:only-child {
62
+ margin-top: 0;
63
+ }
64
+
65
+ &.ecl-site-header--has-menu,
66
+ &.ecl-site-header--has-mega-menu {
67
+ .ecl-site-header__site-name + .ecl-site-header__cta {
68
+ margin-bottom: var(--s-m);
69
+ }
70
+ }
71
+
72
+ .ecl-menu__open,
73
+ .ecl-mega-menu__open {
74
+ top: 8px;
75
+
76
+ .ecl-link__icon:last-of-type {
77
+ top: 1px;
78
+ }
79
+ }
80
+
81
+ .ecl-menu__inner-header {
82
+ flex-flow: row;
83
+
84
+ .ecl-menu__close {
85
+ display: none;
86
+ }
87
+ }
88
+
89
+ /* stylelint-disable no-descending-specificity */
90
+ .ecl-menu__open,
91
+ .ecl-mega-menu__open,
92
+ .ecl-menu[data-expanded] .ecl-menu__open,
93
+ .ecl-mega-menu[data-expanded] .ecl-mega-menu__open {
94
+ align-items: center;
95
+ border: 1px solid transparent;
96
+ box-sizing: border-box;
97
+ color: currentcolor;
98
+ height: 44px;
99
+ padding: calc(var(--s-xs) + 1px) 0;
100
+ position: relative;
101
+ z-index: 54;
102
+
103
+ &:hover {
104
+ border-color: var(--c-d);
105
+ border-width: 1px;
106
+ }
107
+ }
108
+
109
+ .ecl-menu__open .ecl-icon:last-of-type {
110
+ height: 1.5rem;
111
+ width: 1.5rem;
112
+ }
113
+
114
+ .ecl-mega-menu__open {
115
+ margin-inline-start: var(--s-m);
116
+ }
117
+
118
+ .ecl-menu[data-expanded] .ecl-menu__open,
119
+ .ecl-mega-menu[data-expanded] .ecl-mega-menu__open {
120
+ background-color: var(--c-p-20);
121
+ }
122
+ /* stylelint-enable no-descending-specificity */
123
+ }
124
+
125
+ .ecl-site-header__header {
126
+ background-color: map.get($site-header, 'background-color');
127
+ position: relative;
128
+ z-index: 54;
129
+
130
+ .ecl-site-header--open-menu:not(.ecl-site-header--open-menu-start) & {
131
+ box-shadow: var(--sh-4);
132
+ }
133
+ }
134
+
135
+ .ecl-site-header__container {
136
+ display: flex;
137
+ flex-direction: column;
138
+ padding-bottom: var(--s-l);
139
+ padding-top: var(--s-l);
140
+ position: static;
141
+ }
142
+
143
+ .ecl-site-header__top {
144
+ align-items: center;
145
+ display: flex;
146
+ flex-grow: 1;
147
+ justify-content: space-between;
148
+ }
149
+
150
+ .ecl-site-header__logo-link {
151
+ flex-grow: 1;
152
+ }
153
+
154
+ .ecl-site-header__logo-image {
155
+ display: block;
156
+ height: map.get($site-header, 'logo-height-s');
157
+ max-width: 100%;
158
+ }
159
+
160
+ .ecl-site-header__action {
161
+ align-items: center;
162
+ display: flex;
163
+
164
+ .ecl-button:not(.ecl-search-form__button) {
165
+ margin-inline-start: var(--s-2xs);
166
+ }
167
+
168
+ .ecl-site-header--has-menu &,
169
+ .ecl-site-header--has-mega-menu & {
170
+ margin-inline-end: calc(44px + var(--s-2xs));
171
+ }
172
+
173
+ .ecl-form-group {
174
+ flex-grow: 0;
175
+ margin-inline-start: auto;
176
+ width: 100%;
177
+ }
178
+
179
+ .ecl-search-form__text-input {
180
+ box-sizing: border-box;
181
+ flex-grow: 0;
182
+ width: 100%;
183
+ }
184
+ }
185
+
186
+ .ecl-site-header__login-box,
187
+ .ecl-site-header__search {
188
+ background-color: map.get($theme, 'color', 'white');
189
+ border: 1px solid var(--c-p-5);
190
+ box-shadow: var(--sh-3);
191
+ box-sizing: content-box;
192
+ color: var(--c-d);
193
+ display: none;
194
+ font: var(--f-ui-m);
195
+ left: 0;
196
+ margin-top: calc(var(--s-xs) - 1px);
197
+ padding: calc(var(--s-m) - 1px);
198
+ position: absolute;
199
+ width: calc(100% - var(--s-m) - var(--s-m));
200
+ z-index: map.get($theme, 'z-index', 'modal') + 1;
201
+ }
202
+
203
+ .ecl-site-header__login-box {
204
+ border-radius: map.get($theme, 'border-radius', 'xs');
205
+ box-sizing: border-box;
206
+ left: 0;
207
+ margin-top: var(--s-m);
208
+ width: 100%;
209
+
210
+ &::before {
211
+ @include site-header-dropdown.arrow-up;
212
+
213
+ left: auto;
214
+ right: var(--ecl-login-arrow-position);
215
+ }
216
+
217
+ &.ecl-site-header__login-box--active {
218
+ display: block;
219
+ }
220
+ }
221
+
222
+ .ecl-site-header__custom-action-toggle,
223
+ .ecl-site-header__language-selector,
224
+ .ecl-site-header__login-toggle,
225
+ .ecl-site-header__search-toggle {
226
+ align-items: center;
227
+ display: flex;
228
+ flex-direction: row;
229
+ font: var(--f-ui-m);
230
+ justify-content: center;
231
+
232
+ &.ecl-link {
233
+ color: var(--c-d);
234
+ border-radius: map.get($theme, 'border-radius', 's');
235
+ text-decoration: none;
236
+
237
+ &:focus-visible {
238
+ outline: none;
239
+ }
240
+
241
+ .ecl-link__label {
242
+ margin: 0;
243
+ }
244
+ }
245
+ // stylelint-disable-next-line no-descending-specificity
246
+ .ecl-icon {
247
+ height: map.get($theme, 'icon', 'm');
248
+ width: map.get($theme, 'icon', 'm');
249
+ }
250
+
251
+ &:active,
252
+ &[aria-expanded='true'] {
253
+ background-color: var(--c-p-20);
254
+ }
255
+ }
256
+
257
+ .ecl-site-header__custom-action-toggle {
258
+ .ecl-link__icon-container {
259
+ .ecl-site-header__icon {
260
+ margin-inline-end: 0;
261
+ }
262
+ }
263
+
264
+ .ecl-indicator:not(:empty) {
265
+ left: -18px;
266
+ right: auto;
267
+ }
268
+ }
269
+
270
+ .ecl-site-header__search--active {
271
+ display: flex;
272
+ margin-top: var(--s-m);
273
+
274
+ @include breakpoints.down('l') {
275
+ &::before {
276
+ @include site-header-dropdown.arrow-up;
277
+
278
+ left: auto;
279
+ right: var(--ecl-search-arrow-position);
280
+ }
281
+ }
282
+ }
283
+
284
+ .ecl-site-header__language-container {
285
+ margin-top: var(--s-m);
286
+ }
287
+
288
+ .ecl-site-header__login-description {
289
+ margin: 0;
290
+ max-width: var(--max-w);
291
+ }
292
+
293
+ .ecl-site-header__login-separator {
294
+ background-color: var(--c-p-20);
295
+ border-width: 0;
296
+ height: 1px;
297
+ margin-bottom: var(--s-m);
298
+ margin-top: var(--s-m);
299
+ }
300
+
301
+ .ecl-site-header__custom-action-icon,
302
+ .ecl-site-header__language-icon {
303
+ align-items: center;
304
+ display: flex;
305
+ justify-content: center;
306
+ position: relative;
307
+ }
308
+
309
+ .ecl-site-header__banner-top {
310
+ border-top: 1px solid var(--c-p-20);
311
+ font: var(--f-m);
312
+ padding: var(--s-xs) 0;
313
+ }
314
+
315
+ .ecl-site-header__site-name {
316
+ border-top: 1px solid var(--c-p-20);
317
+ color: map.get($site-header, 'site-name-mobile-color');
318
+ font: var(--f-2xl);
319
+ padding: var(--s-l) 0;
320
+ }
321
+
322
+ .ecl-site-header__notification {
323
+ display: flex;
324
+
325
+ .ecl-notification {
326
+ margin: 0 0 var(--s-l);
327
+ }
328
+ }
329
+
330
+ // stylelint-disable plugin/selector-bem-pattern
331
+ .ecl-site-header .ecl-search-form__button .ecl-button__label {
332
+ display: none;
333
+ }
334
+
335
+ .ecl-site-header .ecl-search-form__button .ecl-button__icon {
336
+ display: block;
337
+ }
338
+ // stylelint-enable plugin/selector-bem-pattern
339
+
340
+ @include breakpoints.down('l') {
341
+ .ecl-site-header__custom-action-toggle,
342
+ .ecl-site-header__login-toggle,
343
+ .ecl-site-header__search-toggle,
344
+ .ecl-site-header__language-selector {
345
+ font-size: 0 !important;
346
+ line-height: 0 !important;
347
+ padding: calc(var(--s-xs) - 1px) 0 !important;
348
+
349
+ &.ecl-link {
350
+ .ecl-link__label {
351
+ display: none;
352
+ }
353
+ }
354
+
355
+ .ecl-link__icon-container {
356
+ margin-inline-start: 0;
357
+ }
358
+ }
359
+ }
360
+
361
+ /* stylelint-disable-next-line order/order */
362
+ @include breakpoints.up('s') {
363
+ .ecl-site-header__logo-image {
364
+ height: map.get($site-header, 'logo-height-m');
365
+ }
366
+
367
+ .ecl-site-header .ecl-menu__open,
368
+ .ecl-site-header .ecl-mega-menu__open {
369
+ top: 14px;
370
+ }
371
+
372
+ .ecl-site-header__logo-link {
373
+ flex-grow: 0;
374
+ }
375
+ }
376
+
377
+ @include breakpoints.up('l') {
378
+ .ecl-site-header__logo-link {
379
+ margin-top: 0;
380
+ }
381
+ /* stylelint-disable-next-line plugin/selector-bem-pattern */
382
+ .ecl-site-header .ecl-search-form {
383
+ max-width: 100%;
384
+ }
385
+ }
386
+
387
+ @include breakpoints.up('xl') {
388
+ .ecl-site-header {
389
+ .ecl-site-header__cta {
390
+ align-self: center;
391
+ margin: var(--s-xs) 0;
392
+
393
+ &:only-child {
394
+ margin-top: var(--s-xs);
395
+ }
396
+ }
397
+
398
+ &.ecl-site-header--has-menu {
399
+ box-shadow: none;
400
+ }
401
+
402
+ &.ecl-site-header--has-mega-menu .ecl-site-header__header {
403
+ box-shadow: none;
404
+ }
405
+
406
+ .ecl-menu {
407
+ background: map.get($site-header, 'gradient-background');
408
+ min-height: auto;
409
+ position: static;
410
+ width: 100%;
411
+ }
412
+
413
+ .ecl-mega-menu {
414
+ background: map.get($site-header, 'gradient-background');
415
+ position: relative;
416
+ top: 0;
417
+ width: 100%;
418
+ }
419
+
420
+ &.ecl-site-header--has-menu,
421
+ &.ecl-site-header--has-mega-menu {
422
+ .ecl-site-header__action {
423
+ margin-inline-end: 0;
424
+ }
425
+ }
426
+ }
427
+
428
+ .ecl-site-header__banner {
429
+ box-shadow: none;
430
+
431
+ .ecl-container {
432
+ display: flex;
433
+ position: relative;
434
+ }
435
+ }
436
+
437
+ .ecl-site-header__site-name {
438
+ align-self: center;
439
+ color: map.get($site-header, 'site-name-desktop-color');
440
+ flex-grow: 1;
441
+ font: var(--f-2xl);
442
+ margin-inline-end: 0;
443
+ }
444
+
445
+ .ecl-site-header__site-name--mobile-only {
446
+ display: none;
447
+ }
448
+
449
+ .ecl-site-header__container {
450
+ align-items: flex-end;
451
+ flex-direction: row;
452
+ padding-bottom: var(--s-l);
453
+ padding-top: var(--s-l);
454
+ }
455
+
456
+ .ecl-site-header__top {
457
+ align-items: flex-end;
458
+ }
459
+
460
+ .ecl-site-header__logo-link {
461
+ margin-bottom: 0;
462
+ }
463
+
464
+ .ecl-site-header__logo-image {
465
+ display: block;
466
+
467
+ &.ecl-site-header__logo-image--s {
468
+ height: map.get($site-header, 'logo-height-s');
469
+ }
470
+
471
+ &.ecl-site-header__logo-image--m {
472
+ height: map.get($site-header, 'logo-height-m');
473
+ }
474
+
475
+ &.ecl-site-header__logo-image--l {
476
+ height: map.get($site-header, 'logo-height-lg-l');
477
+ }
478
+ }
479
+
480
+ .ecl-site-header__action {
481
+ .ecl-form-group {
482
+ width: map.get($site-header, 'search-width-l');
483
+ }
484
+ }
485
+
486
+ .ecl-site-header__login-container {
487
+ position: relative;
488
+ }
489
+
490
+ .ecl-site-header__notification .ecl-notification {
491
+ margin: 0 0 var(--s-l);
492
+ }
493
+
494
+ .ecl-site-header__login-box {
495
+ left: 50%;
496
+ min-width: 22rem;
497
+ padding: var(--s-l);
498
+ transform: translateX(-50%);
499
+ width: auto;
500
+
501
+ &::before {
502
+ left: 50%;
503
+ }
504
+ }
505
+
506
+ .ecl-site-header__custom-action-toggle,
507
+ .ecl-site-header__login-toggle,
508
+ .ecl-site-header__language-selector {
509
+ .ecl-site-header__icon {
510
+ margin-inline-end: var(--s-xs);
511
+ }
512
+ }
513
+
514
+ .ecl-site-header__search-toggle {
515
+ display: none;
516
+ }
517
+
518
+ .ecl-site-header__search-container {
519
+ flex-grow: 1;
520
+ margin-inline-start: var(--s-l);
521
+
522
+ .ecl-site-header__search {
523
+ background-color: map.get($theme, 'color', 'white');
524
+ border-width: 0;
525
+ box-shadow: none;
526
+ display: flex;
527
+ margin: 0;
528
+ padding: 0;
529
+ position: relative;
530
+ top: 0;
531
+ width: auto;
532
+ }
533
+ }
534
+
535
+ // stylelint-disable plugin/selector-bem-pattern
536
+ .ecl-site-header .ecl-search-form__button .ecl-button__label {
537
+ display: block;
538
+ }
539
+ // stylelint-enable plugin/selector-bem-pattern
540
+ }
541
+
542
+ @media (width >= 1368px) {
543
+ .ecl-site-header__action .ecl-form-group {
544
+ width: map.get($site-header, 'search-width-xl');
545
+ }
546
+ }
@@ -0,0 +1,178 @@
1
+ {% apply spaceless %}
2
+
3
+ {#
4
+ Parameters:
5
+ - "language_selector" (associative array) (default: predefined structure): Language switcher settings. format:
6
+ {
7
+ "href": (string) (default: ''): URL for switcher
8
+ "label": (string) (default: ''): Switcher language label, eg. 'English' in EU, 'EN' in ec.
9
+ "aria_label": (string) (default: ''): Switcher language aria label
10
+ "eu_category": (string) (default: ''): Label for EU languages
11
+ "non_eu_category": (string) (default: ''): Label for non-EU languages
12
+ "overlay" (associative array) (default: predefined structure): Overlay language switcher settings. format:
13
+ {
14
+ "close": (associative array) (default: {}): Close button, following ECL Button structure
15
+ "title": (string) (default: ''): Overlay title, eg. 'Select your language'.
16
+ "items": (array) (default: []): (array) (default: []): format: [
17
+ {
18
+ "lang" (string) (default: '') Item language code, eg. 'en', 'fr', etc.
19
+ "label" (string) (default: '') Item language label, eg. 'English', 'Français', etc.
20
+ "path" (string) (default: '') Item language URL eg. '/example#language_en'.
21
+ "active" (boolean) (default: false) define if item is the active language.
22
+ },
23
+ ],
24
+ "non_eu_items": (array) (default: []): (array) (default: []): format: [
25
+ {
26
+ "lang" (string) (default: '') Item language code, eg. 'en', 'fr', etc.
27
+ "label" (string) (default: '') Item language label, eg. 'English', 'Français', etc.
28
+ "path" (string) (default: '') Item language URL eg. '/example#language_en'.
29
+ "active" (boolean) (default: false) define if item is the active language.
30
+ },
31
+ ],
32
+ },
33
+ },
34
+ #}
35
+
36
+ {# Default variables #}
37
+
38
+ {% set _language_selector = language_selector|default({}) %}
39
+ {% set _label = _language_selector.label|default('') %}
40
+
41
+ {# Internal logic - Process properties #}
42
+
43
+ {% if _language_selector.overlay is defined and _language_selector.overlay is not empty %}
44
+ {% set _has_overlay = true %}
45
+ {% endif %}
46
+
47
+ {# Print the result #}
48
+
49
+ <div class="ecl-site-header__language">
50
+ <a
51
+ class="ecl-button ecl-button--tertiary ecl-button--neutral ecl-site-header__language-selector"
52
+ href="{{ _language_selector.href|default('') }}"
53
+ data-ecl-language-selector
54
+ role="button"
55
+ aria-label="{{ _language_selector.aria_label|default('') ~ ' - ' ~ _label }}"
56
+ {% if _has_overlay is defined %}
57
+ aria-controls="language-list-overlay"
58
+ {% endif %}
59
+ >
60
+ <span class="ecl-site-header__language-icon">
61
+ {% include '@ecl/icon/icon.html.twig' with {
62
+ icon: {
63
+ name: 'global',
64
+ size: 'm'
65
+ },
66
+ as_image: true,
67
+ extra_classes: 'ecl-site-header__icon',
68
+ extra_accessibility: {
69
+ title: _label,
70
+ },
71
+ } only %}
72
+ </span>
73
+ {{- _label -}}
74
+ </a>
75
+
76
+ {% if _has_overlay is defined %}
77
+ <div class="ecl-site-header__language-container" id="language-list-overlay" hidden data-ecl-language-list-overlay aria-labelledby="ecl-site-header__language-title" role="dialog">
78
+ {# language list header #}
79
+ <div class="ecl-site-header__language-header">
80
+ <div
81
+ class="ecl-site-header__language-title"
82
+ id="ecl-site-header__language-title"
83
+ >
84
+ {{- _language_selector.overlay.title|default('') -}}
85
+ </div>
86
+ {% if _language_selector.overlay.close is not empty %}
87
+ {% include '@ecl/button/button.html.twig' with _language_selector.overlay.close|merge({
88
+ variant: 'tertiary',
89
+ style: 'neutral',
90
+ extra_classes: 'ecl-site-header__language-close',
91
+ extra_attributes: [{
92
+ name: 'data-ecl-language-list-close',
93
+ }],
94
+ }) only %}
95
+ {% endif %}
96
+ </div>
97
+
98
+ <div
99
+ class="ecl-site-header__language-content"
100
+ data-ecl-language-list-content
101
+ >
102
+ {# EU languages #}
103
+ {% if _language_selector.overlay.items is not empty and _language_selector.overlay.items is iterable %}
104
+ <div class="ecl-site-header__language-category" data-ecl-language-list-eu>
105
+ {% if _language_selector.eu_category is not empty %}
106
+ <div class="ecl-site-header__language-category-title">
107
+ {{- _language_selector.eu_category -}}
108
+ </div>
109
+ {% endif %}
110
+ <ul class="ecl-site-header__language-list" translate="no">
111
+ {% for _item in _language_selector.overlay.items %}
112
+ <li class="ecl-site-header__language-item">
113
+ {% set _link_label %}
114
+ <span class="ecl-site-header__language-link-code">{{ _item.lang|default('') }}</span>
115
+ <span class="ecl-site-header__language-link-label" lang="{{ _item.lang|default('') }}">{{ _item.label|default('') }}</span>
116
+ {% endset %}
117
+ {% set _link_classes = 'ecl-site-header__language-link' %}
118
+ {% if _item.active %}
119
+ {% set _link_classes = _link_classes ~ ' ecl-site-header__language-link--active' %}
120
+ {% endif %}
121
+ {% include '@ecl/link/link.html.twig' with {
122
+ link: _item|merge({
123
+ label: _link_label,
124
+ type: 'standalone'
125
+ }),
126
+ extra_classes: _link_classes,
127
+ extra_attributes: [
128
+ { name: 'hreflang', value: _item.lang|default('')|e('html_attr') },
129
+ ],
130
+ } only %}
131
+ </li>
132
+ {% endfor %}
133
+ </ul>
134
+ </div>
135
+ {% endif %}
136
+
137
+ {# non-EU languages #}
138
+ {% if _language_selector.overlay.non_eu_items is not empty and _language_selector.overlay.non_eu_items is iterable %}
139
+ <div class="ecl-site-header__language-category" data-ecl-language-list-non-eu>
140
+ {% if _language_selector.non_eu_category is not empty %}
141
+ <div class="ecl-site-header__language-category-title">
142
+ {{- _language_selector.non_eu_category -}}
143
+ </div>
144
+ {% endif %}
145
+ <ul class="ecl-site-header__language-list" translate="no">
146
+ {% for _item in _language_selector.overlay.non_eu_items %}
147
+ <li class="ecl-site-header__language-item">
148
+ {% set _link_label %}
149
+ <span class="ecl-site-header__language-link-code">{{ _item.lang|default('') }}</span>
150
+ <span class="ecl-site-header__language-link-label">{{ _item.label|default('') }}</span>
151
+ {% endset %}
152
+ {% set _link_classes = 'ecl-site-header__language-link' %}
153
+ {% if _item.active %}
154
+ {% set _link_classes = _link_classes ~ ' ecl-site-header__language-link--active' %}
155
+ {% endif %}
156
+ {% include '@ecl/link/link.html.twig' with {
157
+ link: _item|merge({
158
+ label: _link_label,
159
+ type: 'standalone',
160
+ no_visited: true
161
+ }),
162
+ extra_classes: _link_classes,
163
+ extra_attributes: [
164
+ { name: 'lang', value: _item.lang|default('') },
165
+ { name: 'hreflang', value: _item.lang|default('') },
166
+ ],
167
+ } only %}
168
+ </li>
169
+ {% endfor %}
170
+ </ul>
171
+ </div>
172
+ {% endif %}
173
+ </div>
174
+ </div>
175
+ {% endif %}
176
+ </div>
177
+
178
+ {% endapply %}