@openeuropa/bcl-theme-default 1.10.8 → 1.10.9

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 (35) hide show
  1. package/css/oe-bcl-ckeditor5.min.css +1 -1
  2. package/css/oe-bcl-ckeditor5.min.css.map +1 -1
  3. package/css/oe-bcl-default.css +156 -85
  4. package/css/oe-bcl-default.css.map +1 -1
  5. package/css/oe-bcl-default.min.css +1 -1
  6. package/css/oe-bcl-default.min.css.map +1 -1
  7. package/js/oe-bcl-default.bundle.js +68 -1
  8. package/js/oe-bcl-default.bundle.js.map +1 -1
  9. package/js/oe-bcl-default.bundle.min.js +1 -1
  10. package/js/oe-bcl-default.bundle.min.js.map +1 -1
  11. package/js/oe-bcl-default.esm.js +67 -1
  12. package/js/oe-bcl-default.esm.js.map +1 -1
  13. package/js/oe-bcl-default.esm.min.js +1 -1
  14. package/js/oe-bcl-default.esm.min.js.map +1 -1
  15. package/js/oe-bcl-default.umd.js +68 -1
  16. package/js/oe-bcl-default.umd.js.map +1 -1
  17. package/js/oe-bcl-default.umd.min.js +1 -1
  18. package/js/oe-bcl-default.umd.min.js.map +1 -1
  19. package/package.json +5 -5
  20. package/src/js/header/header.js +91 -0
  21. package/src/js/index.esm.js +2 -0
  22. package/src/js/index.umd.js +2 -0
  23. package/src/scss/_header.scss +3 -2
  24. package/src/scss/_input.scss +72 -31
  25. package/src/scss/_mega-menu.scss +47 -58
  26. package/src/scss/_multiselect-2.scss +21 -11
  27. package/src/scss/_pagination.scss +1 -0
  28. package/src/scss/_search-form.scss +4 -0
  29. package/src/scss/base/_mixins.scss +12 -0
  30. package/templates/bcl-file/file.html.twig +1 -1
  31. package/templates/bcl-header/header.html.twig +43 -50
  32. package/templates/bcl-links-block/links-block.html.twig +1 -1
  33. package/templates/bcl-mega-menu/mega-menu-submenu.html.twig +10 -7
  34. package/templates/bcl-modal/modal.html.twig +4 -3
  35. /package/templates/{bcl-toast → bcl-toasts}/toasts.html.twig +0 -0
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@openeuropa/bcl-theme-default",
3
3
  "author": "European Commission",
4
4
  "license": "EUPL-1.2",
5
- "version": "1.10.8",
5
+ "version": "1.10.9",
6
6
  "description": "OE - BCL theme default",
7
7
  "scripts": {
8
8
  "align-templates": "lerna --scope \"@openeuropa/bcl-twig-templates\" run prepublish",
@@ -22,9 +22,9 @@
22
22
  "@ecl/resources-ec-logo": "3.7.1",
23
23
  "@ecl/resources-eu-logo": "3.7.1",
24
24
  "@ecl/resources-flag-icons": "3.7.1",
25
- "@openeuropa/bcl-bootstrap": "^1.10.8",
26
- "@openeuropa/bcl-builder": "^1.10.8",
27
- "@openeuropa/bcl-twig-templates": "^1.10.8",
25
+ "@openeuropa/bcl-bootstrap": "^1.10.9",
26
+ "@openeuropa/bcl-builder": "^1.10.9",
27
+ "@openeuropa/bcl-twig-templates": "^1.10.9",
28
28
  "@rollup/plugin-replace": "6.0.2",
29
29
  "copyfiles": "2.4.1",
30
30
  "cross-env": "10.1.0",
@@ -51,5 +51,5 @@
51
51
  "design-system",
52
52
  "twig"
53
53
  ],
54
- "gitHead": "9c2e64443ae179948cbf748c41d438af7a0f2421"
54
+ "gitHead": "cb9864341bfc98404071520d61568bd18e17e1fe"
55
55
  }
@@ -0,0 +1,91 @@
1
+ import EventHandler from "@openeuropa/bcl-bootstrap/js/src/dom/event-handler";
2
+ import SelectorEngine from "@openeuropa/bcl-bootstrap/js/src/dom/selector-engine";
3
+
4
+ const HEADER_SELECTOR = ".bcl-header";
5
+ const TOGGLER_SELECTOR = ".bcl-navbar-toggler";
6
+ const OFFSET_VARIABLE = "--oel-mega-menu-offset-top";
7
+
8
+ class Header {
9
+ scheduleUpdate = () => {
10
+ if (this.frameRequest) {
11
+ return;
12
+ }
13
+
14
+ this.frameRequest = window.requestAnimationFrame(() => {
15
+ this.frameRequest = null;
16
+ this.updateOffset();
17
+ });
18
+ };
19
+
20
+ constructor(element) {
21
+ this.element = element;
22
+ this.frameRequest = null;
23
+ this.resizeObserver = null;
24
+
25
+ this.init();
26
+ }
27
+
28
+ init() {
29
+ this.updateOffset();
30
+
31
+ EventHandler.on(window, "resize", this.scheduleUpdate);
32
+ EventHandler.on(window, "orientationchange", this.scheduleUpdate);
33
+
34
+ const togglers = SelectorEngine.find(TOGGLER_SELECTOR, this.element);
35
+ togglers.forEach((toggler) => {
36
+ // Some layouts move the header when the nav toggler expands; keep offset in sync.
37
+ EventHandler.on(toggler, "click", this.scheduleUpdate);
38
+ });
39
+ }
40
+
41
+ updateOffset() {
42
+ if (!this.element) {
43
+ return;
44
+ }
45
+
46
+ const rect = this.element.getBoundingClientRect();
47
+ const offset = Math.max(0, rect.top);
48
+ const value = `${offset}px`;
49
+
50
+ if (this.element.style.getPropertyValue(OFFSET_VARIABLE) === value) {
51
+ return;
52
+ }
53
+
54
+ this.element.style.setProperty(OFFSET_VARIABLE, value);
55
+ }
56
+
57
+ static init(root) {
58
+ if (typeof document === "undefined" || typeof window === "undefined") {
59
+ return;
60
+ }
61
+
62
+ const resolvedRoot = root || document;
63
+ const context =
64
+ resolvedRoot instanceof Element
65
+ ? resolvedRoot
66
+ : resolvedRoot.documentElement || document.documentElement;
67
+
68
+ const headers = SelectorEngine.find(HEADER_SELECTOR, context);
69
+
70
+ headers.forEach((headerElement) => {
71
+ if (headerElement.dataset.headerOffsetInitialized === "true") {
72
+ return;
73
+ }
74
+
75
+ headerElement.dataset.headerOffsetInitialized = "true";
76
+ new Header(headerElement);
77
+ });
78
+ }
79
+ }
80
+
81
+ if (typeof document !== "undefined") {
82
+ const initializeHeaderOffset = () => Header.init();
83
+
84
+ if (document.readyState === "loading") {
85
+ document.addEventListener("DOMContentLoaded", initializeHeaderOffset);
86
+ } else {
87
+ initializeHeaderOffset();
88
+ }
89
+ }
90
+
91
+ export default Header;
@@ -23,6 +23,7 @@ import Tooltip from "@openeuropa/bcl-bootstrap/js/src/tooltip";
23
23
  import Gallery from "@openeuropa/bcl-theme-default/src/js/gallery/gallery";
24
24
  import AccordionToggle from "@openeuropa/bcl-theme-default/src/js/accordion-toggle/accordion-toggle";
25
25
  import AccessibleToggle from "@openeuropa/bcl-theme-default/src/js/accessible-toggle/accessible-toggle";
26
+ import Header from "@openeuropa/bcl-theme-default/src/js/header/header";
26
27
 
27
28
  export {
28
29
  Alert,
@@ -43,4 +44,5 @@ export {
43
44
  Gallery,
44
45
  AccessibleToggle,
45
46
  AccordionToggle,
47
+ Header,
46
48
  };
@@ -23,6 +23,7 @@ import Tooltip from "@openeuropa/bcl-bootstrap/js/src/tooltip";
23
23
  import AccordionToggle from "@openeuropa/bcl-theme-default/src/js/accordion-toggle/accordion-toggle";
24
24
  import Gallery from "@openeuropa/bcl-theme-default/src/js/gallery/gallery";
25
25
  import AccessibleToggle from "@openeuropa/bcl-theme-default/src/js/accessible-toggle/accessible-toggle";
26
+ import Header from "@openeuropa/bcl-theme-default/src/js/header/header";
26
27
 
27
28
  export default {
28
29
  Alert,
@@ -43,4 +44,5 @@ export default {
43
44
  Gallery,
44
45
  AccessibleToggle,
45
46
  AccordionToggle,
47
+ Header,
46
48
  };
@@ -46,6 +46,7 @@ $header-link-active-background: #003776 !default;
46
46
  }
47
47
 
48
48
  .bcl-header {
49
+ --oel-mega-menu-offset-top: 0px;
49
50
  .notification {
50
51
  position: relative;
51
52
  padding-right: 0;
@@ -96,10 +97,9 @@ $header-link-active-background: #003776 !default;
96
97
  header:has(.bcl-header__navbar #main-navbar.show),
97
98
  header:has(.bcl-header__navbar.collapsing),
98
99
  header:has(.bcl-header__navbar.show) {
99
- height: 100vh;
100
+ height: calc(100vh - var(--oel-mega-menu-offset-top, 0px));
100
101
  display: flex;
101
102
  flex-flow: column;
102
- overflow: auto;
103
103
 
104
104
  > div:has(.breadcrumb) {
105
105
  display: none;
@@ -127,6 +127,7 @@ $header-link-active-background: #003776 !default;
127
127
  z-index: 1030;
128
128
  width: 100%;
129
129
  align-items: flex-start;
130
+ overflow: auto;
130
131
  .navbar-nav {
131
132
  width: 100%;
132
133
  margin-top: 1rem;
@@ -1,15 +1,57 @@
1
1
  /* stylelint-disable no-duplicate-selectors, selector-no-qualifying-type, no-descending-specificity */
2
2
 
3
+ $default-border-color: $gray-600;
4
+
3
5
  .form-select {
4
6
  padding-top: $input-padding-y-lg;
5
7
  padding-bottom: $input-padding-y-lg;
6
8
  padding-left: $input-padding-x-lg;
7
9
  font-size: $form-font-size-lg;
10
+ border-color: $default-border-color;
11
+ &:focus-visible {
12
+ border-color: $default-border-color;
13
+ box-shadow: none;
14
+ @include form-focus-ring();
15
+ &.is-valid {
16
+ outline-color: $success;
17
+ &:focus {
18
+ box-shadow: none;
19
+ border-color: $default-border-color;
20
+ }
21
+ }
22
+ &.is-invalid {
23
+ outline-color: $danger;
24
+ &:focus {
25
+ box-shadow: none;
26
+ border-color: $default-border-color;
27
+ }
28
+ }
29
+ }
30
+ &:focus {
31
+ box-shadow: none;
32
+ border-color: $default-border-color;
33
+ }
34
+ &.is-valid,
35
+ &.is-invalid {
36
+ &:focus {
37
+ box-shadow: none;
38
+ }
39
+ }
40
+ }
41
+
42
+ .form-check-input {
43
+ border-color: $primary;
8
44
  &:focus-visible {
9
- outline: 2px solid $primary;
45
+ &[type="radio"] {
46
+ border-radius: 50%;
47
+ }
48
+ }
49
+ &:focus {
50
+ border-color: $primary;
10
51
  box-shadow: none;
11
- border-radius: 4px;
12
- outline-offset: -1px;
52
+ }
53
+ &:focus-visible {
54
+ @include form-focus-ring(1px);
13
55
  }
14
56
  }
15
57
 
@@ -18,16 +60,35 @@
18
60
  padding: $input-padding-y-lg $input-padding-x-lg;
19
61
  font-size: $form-font-size-lg;
20
62
  border-radius: 0.3rem;
63
+ border-color: $default-border-color;
21
64
  &::file-selector-button {
22
65
  padding: $input-padding-y-lg $input-padding-x-lg;
23
66
  margin: (-$input-padding-y-lg) $input-padding-x-lg (-$input-padding-y-lg)
24
67
  (-$input-padding-x-lg);
25
68
  }
26
- &:focus-visible {
27
- outline: 2px solid $primary;
28
- box-shadow: none;
29
- border-radius: 4px;
30
- outline-offset: -1px;
69
+ &:focus:focus-visible {
70
+ border-color: $default-border-color;
71
+ @include form-focus-ring();
72
+ }
73
+ &.is-valid,
74
+ &.is-invalid {
75
+ &:focus {
76
+ box-shadow: none;
77
+ }
78
+ }
79
+ &.is-valid {
80
+ &:focus:focus-visible {
81
+ transition: none;
82
+ border-color: $default-border-color;
83
+ @include form-focus-ring($outline-color: $success);
84
+ }
85
+ }
86
+ &.is-invalid {
87
+ &:focus:focus-visible {
88
+ transition: none;
89
+ border-color: $default-border-color;
90
+ @include form-focus-ring($outline-color: $danger);
91
+ }
31
92
  }
32
93
  }
33
94
  .form-check:not(.form-switch) {
@@ -41,20 +102,6 @@
41
102
  margin-top: 0.15rem;
42
103
  }
43
104
  }
44
- .form-check-input {
45
- &:focus-visible {
46
- outline: 4px solid $primary;
47
- box-shadow: none;
48
- border-radius: 4px;
49
- outline-offset: 0;
50
- &[type="radio"] {
51
- border-radius: 50%;
52
- }
53
- }
54
- &:checked:focus-visible {
55
- border-color: $white;
56
- }
57
- }
58
105
 
59
106
  @include media-breakpoint-up(md) {
60
107
  .form-check:not(.form-switch) {
@@ -90,24 +137,18 @@
90
137
  textarea.form-control,
91
138
  .form-control {
92
139
  &.is-invalid {
93
- background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM8 4C7.46459 4 7.04623 4.46229 7.0995 4.99504L7.45025 8.50248C7.47849 8.78492 7.71616 9 8 9C8.28384 9 8.52151 8.78492 8.54975 8.50248L8.9005 4.99504C8.95377 4.46228 8.53541 4 8 4ZM8.00154 10C7.44926 10 7.00154 10.4477 7.00154 11C7.00154 11.5523 7.44926 12 8.00154 12C8.55383 12 9.00154 11.5523 9.00154 11C9.00154 10.4477 8.55383 10 8.00154 10Z' fill='%23D72E3D'/%3E%3C/svg%3E%0A");
140
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM8 4C7.46459 4 7.04623 4.46229 7.0995 4.99504L7.45025 8.50248C7.47849 8.78492 7.71616 9 8 9C8.28384 9 8.52151 8.78492 8.54975 8.50248L8.9005 4.99504C8.95377 4.46228 8.53541 4 8 4ZM8.00154 10C7.44926 10 7.00154 10.4477 7.00154 11C7.00154 11.5523 7.44926 12 8.00154 12C8.55383 12 9.00154 11.5523 9.00154 11C9.00154 10.4477 8.55383 10 8.00154 10Z' fill='%23A51F2C'/%3E%3C/svg%3E%0A");
94
141
  }
95
142
  &.is-valid {
96
143
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM12.0303 4.96967C11.7374 4.67678 11.2626 4.67678 10.9697 4.96967C10.9626 4.97674 10.9559 4.98424 10.9498 4.9921L7.4774 9.41674L5.38388 7.32322C5.09098 7.03033 4.61611 7.03033 4.32322 7.32322C4.03032 7.61612 4.03032 8.09099 4.32322 8.38388L6.96966 11.0303C7.26256 11.3232 7.73743 11.3232 8.03032 11.0303C8.03685 11.0238 8.043 11.0169 8.04876 11.0097L12.041 6.01947C12.3232 5.72582 12.3196 5.25897 12.0303 4.96967Z' fill='%2328A745'/%3E%3C/svg%3E%0A");
97
144
  }
98
145
  }
99
146
 
100
- .form-select:not([multiple]):not([size]) {
101
- &:focus-visible {
102
- outline: 2px solid $primary;
103
- box-shadow: none;
104
- border-radius: 4px;
105
- outline-offset: -1px;
106
- }
147
+ select.form-select:not([multiple]):not([size]) {
107
148
  &.is-invalid {
108
149
  background-image:
109
150
  url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E"),
110
- url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM8 4C7.46459 4 7.04623 4.46229 7.0995 4.99504L7.45025 8.50248C7.47849 8.78492 7.71616 9 8 9C8.28384 9 8.52151 8.78492 8.54975 8.50248L8.9005 4.99504C8.95377 4.46228 8.53541 4 8 4ZM8.00154 10C7.44926 10 7.00154 10.4477 7.00154 11C7.00154 11.5523 7.44926 12 8.00154 12C8.55383 12 9.00154 11.5523 9.00154 11C9.00154 10.4477 8.55383 10 8.00154 10Z' fill='%23D72E3D'/%3E%3C/svg%3E%0A");
151
+ url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM8 4C7.46459 4 7.04623 4.46229 7.0995 4.99504L7.45025 8.50248C7.47849 8.78492 7.71616 9 8 9C8.28384 9 8.52151 8.78492 8.54975 8.50248L8.9005 4.99504C8.95377 4.46228 8.53541 4 8 4ZM8.00154 10C7.44926 10 7.00154 10.4477 7.00154 11C7.00154 11.5523 7.44926 12 8.00154 12C8.55383 12 9.00154 11.5523 9.00154 11C9.00154 10.4477 8.55383 10 8.00154 10Z' fill='%23A51F2C'/%3E%3C/svg%3E%0A");
111
152
  }
112
153
  &.is-valid {
113
154
  background-image:
@@ -275,34 +275,6 @@ ul.bcl-mega-menu__items {
275
275
  }
276
276
  }
277
277
  }
278
-
279
- // The see-all link is at the bottom of the list.
280
- &:has(> a.see-all-button) {
281
- position: sticky;
282
- inset-block-start: 100%;
283
- }
284
- > a.see-all-button {
285
- border-top: none;
286
- &:after {
287
- background: $neutral-border-color;
288
- content: "";
289
- block-size: 1px;
290
- inset-inline-start: 0;
291
- position: absolute;
292
- inset-block-start: 0;
293
- // Replicate horizontal padding of parent element.
294
- inset-inline: $mm-gutter-x;
295
- }
296
- > svg {
297
- inline-size: 0.8rem;
298
- }
299
- > span {
300
- text-overflow: ellipsis;
301
- overflow: hidden;
302
- display: block;
303
- white-space: nowrap;
304
- }
305
- }
306
278
  }
307
279
  }
308
280
 
@@ -314,6 +286,21 @@ ul.bcl-mega-menu__items {
314
286
  // Avoid a space between the parent menu and the submenu.
315
287
  @include padding-right(0);
316
288
  }
289
+ @include media-breakpoint-down(lg) {
290
+ > .bcl-mega-menu__items {
291
+ &:has(.bcl-mega-menu__submenu:not([hidden])) {
292
+ > .__leaf,
293
+ > .__parent {
294
+ display: none;
295
+ }
296
+ }
297
+ > .__parent {
298
+ &:has(.bcl-mega-menu__submenu:not([hidden])) {
299
+ display: block;
300
+ }
301
+ }
302
+ }
303
+ }
317
304
  }
318
305
 
319
306
  // Nested submenu.
@@ -372,40 +359,42 @@ ul.bcl-mega-menu__items {
372
359
  }
373
360
  }
374
361
  }
375
- }
376
-
377
- // Second level items column.
378
- .bcl-mega-menu__second-submenu {
379
- > .tab-content > .tab-pane {
380
- // In desktop, the entire second-level list has a light blue background.
381
- @include media-breakpoint-up(lg) {
382
- background: $primary-bg-subtle;
383
- }
384
- // Hide other parts of the mega menu in mobile, when a sub-submenu is open.
385
- @include media-breakpoint-down(lg) {
386
- .bcl-mega-menu__container:has(&.active) {
387
- .bcl-mega-menu__info,
388
- .bcl-mega-menu__first-submenu {
389
- display: none;
390
- }
362
+ @include media-breakpoint-up(lg) {
363
+ > .bcl-mega-menu__items {
364
+ flex: 1 1 0;
365
+ overflow-y: auto;
366
+ > li > :is(span, a, button) {
367
+ @include mm-item-padding($px: map-get($spacers, "4-25"));
391
368
  }
392
369
  }
393
- // The panel title only shows in mobile.
394
- > .panel-title {
395
- @include mm-item-padding(map-get($spacers, 3));
396
- margin: 0;
397
- color: $dark;
398
- background: $primary-bg-subtle;
399
- display: block;
400
- font-size: 20px;
370
+ }
371
+ > .__see_all {
372
+ border-top: 1px solid $neutral-border-color;
373
+ @include media-breakpoint-up(lg) {
374
+ border-top: 1px solid $primary-border-subtle;
375
+ margin: 0 map-get($spacers, "4-25");
376
+ }
377
+ > .see-all-button {
378
+ @include mm-item-padding();
379
+ // Use flex for icon spacing.
380
+ display: flex;
381
+ align-items: center;
382
+ color: $link-color;
401
383
  @include media-breakpoint-up(lg) {
402
- display: none;
384
+ padding: $mm-gutter-y map-get($spacers, "4-25");
385
+ margin: 0 -1.75rem;
403
386
  }
404
- }
405
- // Items get a bit more space to the sides in xl viewport.
406
- @include media-breakpoint-up(xl) {
407
- > ul > li > * {
408
- margin: 0 map-get($spacers, "2-5");
387
+ &:hover {
388
+ background: $primary-bg-subtle;
389
+ }
390
+ > svg {
391
+ flex-shrink: 0;
392
+ }
393
+ > span {
394
+ text-overflow: ellipsis;
395
+ overflow: hidden;
396
+ display: block;
397
+ white-space: nowrap;
409
398
  }
410
399
  }
411
400
  }
@@ -11,7 +11,7 @@
11
11
  --ss-font-color: #4d4d4d;
12
12
  --ss-font-placeholder-color: #212529;
13
13
  --ss-disabled-color: #dcdee2;
14
- --ss-border-color: #dcdee2;
14
+ --ss-border-color: #6c757d;
15
15
  --ss-highlight-color: #fffb8c;
16
16
  --ss-success-color: #00b755;
17
17
  --ss-error-color: #dc3545;
@@ -77,8 +77,8 @@
77
77
  overflow: hidden;
78
78
  min-height: 38px;
79
79
 
80
- &:focus {
81
- box-shadow: 0 0 5px var(--ss-focus-color);
80
+ &:focus-visible {
81
+ @include form-focus-ring();
82
82
  }
83
83
 
84
84
  &.form-select {
@@ -330,7 +330,7 @@
330
330
  }
331
331
 
332
332
  &:focus {
333
- box-shadow: 0 0 5px var(--ss-focus-color);
333
+ @include form-focus-ring();
334
334
  }
335
335
  }
336
336
 
@@ -534,21 +534,31 @@
534
534
  }
535
535
  }
536
536
 
537
- .ss-main.multi-select.is-invalid,
538
- .was-validated .multi-select:invalid + .ss-main.multi-select {
537
+ .form-select.ss-main.multi-select.is-invalid,
538
+ .was-validated .multi-select:invalid + .form-select.ss-main.multi-select {
539
539
  border-color: $danger;
540
- background-position: right 1.5rem center;
540
+ background-position: right 2.5rem center;
541
541
  background-repeat: no-repeat;
542
+ padding-right: 0.5rem;
542
543
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
543
- background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM8 4C7.46459 4 7.04623 4.46229 7.0995 4.99504L7.45025 8.50248C7.47849 8.78492 7.71616 9 8 9C8.28384 9 8.52151 8.78492 8.54975 8.50248L8.9005 4.99504C8.95377 4.46228 8.53541 4 8 4ZM8.00154 10C7.44926 10 7.00154 10.4477 7.00154 11C7.00154 11.5523 7.44926 12 8.00154 12C8.55383 12 9.00154 11.5523 9.00154 11C9.00154 10.4477 8.55383 10 8.00154 10Z' fill='%23D72E3D'/%3E%3C/svg%3E%0A");
544
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='none' viewBox='0 0 16 16'%3E%3Cpath fill='%23a51f2c' d='M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0M8 4a.905.905 0 0 0-.9.995l.35 3.507a.552.552 0 0 0 1.1 0l.35-3.507A.905.905 0 0 0 8 4m.002 6a1 1 0 1 0 0 2 1 1 0 0 0 0-2'/%3E%3C/svg%3E");
545
+ &:focus-visible {
546
+ border-color: $gray-600;
547
+ outline-color: $danger;
548
+ }
544
549
  }
545
- .ss-main.multi-select.is-valid,
546
- .was-validated .multi-select:valid + .ss-main.multi-select {
550
+ .form-select.ss-main.multi-select.is-valid,
551
+ .was-validated .multi-select:valid + .form-select.ss-main.multi-select {
547
552
  border-color: $success;
548
- background-position: right 1.5rem center;
553
+ background-position: right 2.5rem center;
549
554
  background-repeat: no-repeat;
555
+ padding-right: 0.5rem;
550
556
  background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
551
557
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M16 8C16 12.4183 12.4183 16 8 16C3.58172 16 0 12.4183 0 8C0 3.58172 3.58172 0 8 0C12.4183 0 16 3.58172 16 8ZM12.0303 4.96967C11.7374 4.67678 11.2626 4.67678 10.9697 4.96967C10.9626 4.97674 10.9559 4.98424 10.9498 4.9921L7.4774 9.41674L5.38388 7.32322C5.09098 7.03033 4.61611 7.03033 4.32322 7.32322C4.03032 7.61612 4.03032 8.09099 4.32322 8.38388L6.96966 11.0303C7.26256 11.3232 7.73743 11.3232 8.03032 11.0303C8.03685 11.0238 8.043 11.0169 8.04876 11.0097L12.041 6.01947C12.3232 5.72582 12.3196 5.25897 12.0303 4.96967Z' fill='%2328A745'/%3E%3C/svg%3E%0A");
558
+ &:focus-visible {
559
+ border-color: $gray-600;
560
+ outline-color: $success;
561
+ }
552
562
  }
553
563
 
554
564
  .ss-sr-only {
@@ -1,5 +1,6 @@
1
1
  /* stylelint-disable no-descending-specificity */
2
2
  .pagination {
3
+ flex-wrap: wrap;
3
4
  .page-item {
4
5
  .page-link {
5
6
  // Align icons vertically and focus styling
@@ -39,6 +39,10 @@ $search-spacers: (
39
39
  padding-right: map-get($search-spacers, "submit-spacer-right");
40
40
  border-top-left-radius: 0;
41
41
  border-bottom-left-radius: 0;
42
+ &:focus-visible {
43
+ outline-offset: 2px;
44
+ outline-color: $primary;
45
+ }
42
46
  }
43
47
  .bcl-search-form__group {
44
48
  display: flex;
@@ -12,6 +12,18 @@
12
12
  }
13
13
  }
14
14
 
15
+ @mixin form-focus-ring(
16
+ $outline-offset: 2px,
17
+ $outline-width: 2px,
18
+ $radius: 4px,
19
+ $outline-color: $primary
20
+ ) {
21
+ outline: $outline-width solid $outline-color;
22
+ box-shadow: none;
23
+ border-radius: $radius;
24
+ outline-offset: $outline-offset;
25
+ }
26
+
15
27
  @mixin focused-item($width: 2px, $offset: 2px, $color: $primary) {
16
28
  &:focus,
17
29
  &:focus-visible {
@@ -139,7 +139,7 @@
139
139
  {% endif %}
140
140
  </div>
141
141
  {% set download_attributes = create_attribute()
142
- .setAttribute('download', 'true')
142
+ .setAttribute('download', true)
143
143
  .setAttribute('target', '_blank')
144
144
  .addClass(['standalone', 'align-self-center', 'd-inline-block', 'mt-1', 'mt-md-0', 'flex-shrink-0']) %}
145
145
  {% set _download = _download|merge({