@openeuropa/bcl-theme-default 0.19.0 → 0.22.0

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 (169) hide show
  1. package/bcl-builder.config.js +11 -4
  2. package/css/oe-bcl-default.css +1288 -400
  3. package/css/oe-bcl-default.css.map +1 -1
  4. package/css/oe-bcl-default.min.css +1 -1
  5. package/css/oe-bcl-default.min.css.map +1 -1
  6. package/icons/bcl-default-icons.svg +1 -0
  7. package/icons/icons-flag.svg +1 -1
  8. package/js/oe-bcl-default.bundle.js +242 -76
  9. package/js/oe-bcl-default.bundle.js.map +1 -1
  10. package/js/oe-bcl-default.bundle.min.js +1 -1
  11. package/js/oe-bcl-default.bundle.min.js.map +1 -1
  12. package/js/oe-bcl-default.esm.js +236 -75
  13. package/js/oe-bcl-default.esm.js.map +1 -1
  14. package/js/oe-bcl-default.esm.min.js +1 -1
  15. package/js/oe-bcl-default.esm.min.js.map +1 -1
  16. package/js/oe-bcl-default.umd.js +242 -76
  17. package/js/oe-bcl-default.umd.js.map +1 -1
  18. package/js/oe-bcl-default.umd.min.js +1 -1
  19. package/js/oe-bcl-default.umd.min.js.map +1 -1
  20. package/logos/ec/{logo-ec--ar.svg → positive/logo-ec--ar.svg} +0 -0
  21. package/logos/ec/{logo-ec--bg.svg → positive/logo-ec--bg.svg} +0 -0
  22. package/logos/ec/{logo-ec--ca.svg → positive/logo-ec--ca.svg} +0 -0
  23. package/logos/ec/{logo-ec--cs.svg → positive/logo-ec--cs.svg} +0 -0
  24. package/logos/ec/{logo-ec--da.svg → positive/logo-ec--da.svg} +0 -0
  25. package/logos/ec/{logo-ec--de.svg → positive/logo-ec--de.svg} +0 -0
  26. package/logos/ec/{logo-ec--el.svg → positive/logo-ec--el.svg} +0 -0
  27. package/logos/ec/{logo-ec--en.svg → positive/logo-ec--en.svg} +0 -0
  28. package/logos/ec/{logo-ec--es.svg → positive/logo-ec--es.svg} +0 -0
  29. package/logos/ec/{logo-ec--et.svg → positive/logo-ec--et.svg} +0 -0
  30. package/logos/ec/{logo-ec--fi.svg → positive/logo-ec--fi.svg} +0 -0
  31. package/logos/ec/{logo-ec--fr.svg → positive/logo-ec--fr.svg} +0 -0
  32. package/logos/ec/{logo-ec--ga.svg → positive/logo-ec--ga.svg} +0 -0
  33. package/logos/ec/{logo-ec--hr.svg → positive/logo-ec--hr.svg} +0 -0
  34. package/logos/ec/{logo-ec--hu.svg → positive/logo-ec--hu.svg} +0 -0
  35. package/logos/ec/{logo-ec--is.svg → positive/logo-ec--is.svg} +0 -0
  36. package/logos/ec/{logo-ec--it.svg → positive/logo-ec--it.svg} +0 -0
  37. package/logos/ec/{logo-ec--lt.svg → positive/logo-ec--lt.svg} +0 -0
  38. package/logos/ec/{logo-ec--lv.svg → positive/logo-ec--lv.svg} +0 -0
  39. package/logos/ec/{logo-ec--mt.svg → positive/logo-ec--mt.svg} +0 -0
  40. package/logos/ec/{logo-ec--nl.svg → positive/logo-ec--nl.svg} +0 -0
  41. package/logos/ec/{logo-ec--no.svg → positive/logo-ec--no.svg} +0 -0
  42. package/logos/ec/{logo-ec--pl.svg → positive/logo-ec--pl.svg} +0 -0
  43. package/logos/ec/{logo-ec--pt.svg → positive/logo-ec--pt.svg} +0 -0
  44. package/logos/ec/{logo-ec--ro.svg → positive/logo-ec--ro.svg} +0 -0
  45. package/logos/ec/{logo-ec--sk.svg → positive/logo-ec--sk.svg} +0 -0
  46. package/logos/ec/{logo-ec--sl.svg → positive/logo-ec--sl.svg} +0 -0
  47. package/logos/ec/{logo-ec--sv.svg → positive/logo-ec--sv.svg} +0 -0
  48. package/logos/ec/{logo-ec--tr.svg → positive/logo-ec--tr.svg} +0 -0
  49. package/logos/eu/condensed-version/negative/logo-eu--ar.svg +18 -0
  50. package/logos/eu/condensed-version/negative/logo-eu--bg.svg +7 -0
  51. package/logos/eu/condensed-version/negative/logo-eu--ca.svg +7 -0
  52. package/logos/eu/condensed-version/negative/logo-eu--cs.svg +7 -0
  53. package/logos/eu/condensed-version/negative/logo-eu--da.svg +7 -0
  54. package/logos/eu/condensed-version/negative/logo-eu--de.svg +7 -0
  55. package/logos/eu/condensed-version/negative/logo-eu--el.svg +7 -0
  56. package/logos/eu/condensed-version/negative/logo-eu--en.svg +7 -0
  57. package/logos/eu/condensed-version/negative/logo-eu--es.svg +7 -0
  58. package/logos/eu/condensed-version/negative/logo-eu--et.svg +7 -0
  59. package/logos/eu/condensed-version/negative/logo-eu--fi.svg +7 -0
  60. package/logos/eu/condensed-version/negative/logo-eu--fr.svg +7 -0
  61. package/logos/eu/condensed-version/negative/logo-eu--ga.svg +7 -0
  62. package/logos/eu/condensed-version/negative/logo-eu--hr.svg +7 -0
  63. package/logos/eu/condensed-version/negative/logo-eu--hu.svg +7 -0
  64. package/logos/eu/condensed-version/negative/logo-eu--is.svg +8 -0
  65. package/logos/eu/condensed-version/negative/logo-eu--it.svg +7 -0
  66. package/logos/eu/condensed-version/negative/logo-eu--lt.svg +7 -0
  67. package/logos/eu/condensed-version/negative/logo-eu--lv.svg +7 -0
  68. package/logos/eu/condensed-version/negative/logo-eu--mt.svg +7 -0
  69. package/logos/eu/condensed-version/negative/logo-eu--nl.svg +7 -0
  70. package/logos/eu/condensed-version/negative/logo-eu--no.svg +7 -0
  71. package/logos/eu/condensed-version/negative/logo-eu--pl.svg +7 -0
  72. package/logos/eu/condensed-version/negative/logo-eu--pt.svg +7 -0
  73. package/logos/eu/condensed-version/negative/logo-eu--ro.svg +7 -0
  74. package/logos/eu/condensed-version/negative/logo-eu--sk.svg +7 -0
  75. package/logos/eu/condensed-version/negative/logo-eu--sl.svg +7 -0
  76. package/logos/eu/condensed-version/negative/logo-eu--sv.svg +7 -0
  77. package/logos/eu/condensed-version/negative/logo-eu--tr.svg +7 -0
  78. package/logos/eu/standard-version/negative/logo-eu--ar.svg +18 -0
  79. package/logos/eu/standard-version/negative/logo-eu--bg.svg +17 -0
  80. package/logos/eu/standard-version/negative/logo-eu--ca.svg +16 -0
  81. package/logos/eu/standard-version/negative/logo-eu--cs.svg +17 -0
  82. package/logos/eu/standard-version/negative/logo-eu--da.svg +23 -0
  83. package/logos/eu/standard-version/negative/logo-eu--de.svg +21 -0
  84. package/logos/eu/standard-version/negative/logo-eu--el.svg +19 -0
  85. package/logos/eu/standard-version/negative/logo-eu--en.svg +18 -0
  86. package/logos/eu/standard-version/negative/logo-eu--es.svg +17 -0
  87. package/logos/eu/standard-version/negative/logo-eu--et.svg +16 -0
  88. package/logos/eu/standard-version/negative/logo-eu--fi.svg +19 -0
  89. package/logos/eu/standard-version/negative/logo-eu--fr.svg +20 -0
  90. package/logos/eu/standard-version/negative/logo-eu--ga.svg +21 -0
  91. package/logos/eu/standard-version/negative/logo-eu--hr.svg +18 -0
  92. package/logos/eu/standard-version/negative/logo-eu--hu.svg +16 -0
  93. package/logos/eu/standard-version/negative/logo-eu--is.svg +20 -0
  94. package/logos/eu/standard-version/negative/logo-eu--it.svg +18 -0
  95. package/logos/eu/standard-version/negative/logo-eu--lt.svg +19 -0
  96. package/logos/eu/standard-version/negative/logo-eu--lv.svg +21 -0
  97. package/logos/eu/standard-version/negative/logo-eu--mt.svg +19 -0
  98. package/logos/eu/standard-version/negative/logo-eu--nl.svg +17 -0
  99. package/logos/eu/standard-version/negative/logo-eu--no.svg +20 -0
  100. package/logos/eu/standard-version/negative/logo-eu--pl.svg +19 -0
  101. package/logos/eu/standard-version/negative/logo-eu--pt.svg +18 -0
  102. package/logos/eu/standard-version/negative/logo-eu--ro.svg +21 -0
  103. package/logos/eu/standard-version/negative/logo-eu--sk.svg +17 -0
  104. package/logos/eu/standard-version/negative/logo-eu--sl.svg +18 -0
  105. package/logos/eu/standard-version/negative/logo-eu--sv.svg +22 -0
  106. package/logos/eu/standard-version/negative/logo-eu--tr.svg +18 -0
  107. package/package.json +14 -9
  108. package/src/icons/icons.js +356 -0
  109. package/src/js/gallery/gallery.js +168 -0
  110. package/src/js/index.esm.js +2 -0
  111. package/src/js/index.umd.js +2 -0
  112. package/src/scss/_badge.scss +5 -5
  113. package/src/scss/_banners.scss +4 -4
  114. package/src/scss/_bcl-offcanvas.scss +7 -0
  115. package/src/scss/_carousel.scss +85 -0
  116. package/src/scss/_circular-progress-bar.scss +122 -0
  117. package/src/scss/_gallery.scss +269 -0
  118. package/src/scss/_header.scss +46 -45
  119. package/src/scss/_inpage-navigation.scss +6 -0
  120. package/src/scss/_language-list.scss +51 -0
  121. package/src/scss/_pagination.scss +8 -0
  122. package/src/scss/_reset.scss +9 -0
  123. package/src/scss/_search-form.scss +4 -2
  124. package/src/scss/base/_colors.scss +17 -6
  125. package/src/scss/base/_utilities.scss +35 -4
  126. package/src/scss/base/_variables.scss +10 -1
  127. package/src/scss/oe-bcl-default.scss +5 -0
  128. package/templates/bcl-alert/alert.html.twig +13 -5
  129. package/templates/bcl-badge/badge.html.twig +4 -4
  130. package/templates/bcl-banner/banner.html.twig +16 -9
  131. package/templates/bcl-base-templates/listing-page.html.twig +13 -13
  132. package/templates/bcl-breadcrumb/breadcrumb.html.twig +2 -2
  133. package/templates/bcl-card/card.html.twig +42 -20
  134. package/templates/bcl-card-layout/card-layout.html.twig +6 -1
  135. package/templates/bcl-carousel/carousel.html.twig +26 -5
  136. package/templates/bcl-content-banner/content-banner.html.twig +39 -33
  137. package/templates/bcl-date-block/date-block.html.twig +29 -9
  138. package/templates/bcl-description-list/description-list.html.twig +23 -12
  139. package/templates/bcl-fact-figures/fact-figures.html.twig +9 -5
  140. package/templates/bcl-file/file.html.twig +11 -8
  141. package/templates/bcl-footer/footer.html.twig +3 -1
  142. package/templates/bcl-form/form.html.twig +7 -4
  143. package/templates/bcl-gallery/gallery.html.twig +206 -0
  144. package/templates/bcl-header/header.html.twig +31 -15
  145. package/templates/bcl-heading/heading.html.twig +42 -0
  146. package/templates/bcl-language-list/language-list-grid.html.twig +68 -0
  147. package/templates/bcl-language-list/language-list-modal.html.twig +58 -0
  148. package/templates/bcl-language-list/language-list.html.twig +111 -0
  149. package/templates/bcl-language-switcher/language-switcher.html.twig +44 -0
  150. package/templates/bcl-link/link.html.twig +1 -1
  151. package/templates/bcl-links-block/links-block.html.twig +9 -3
  152. package/templates/bcl-listing/listing.html.twig +12 -8
  153. package/templates/bcl-modal/modal.html.twig +12 -1
  154. package/templates/bcl-navbar/navbar.html.twig +39 -28
  155. package/templates/bcl-page/page.html.twig +1 -1
  156. package/templates/bcl-pagination/pagination.html.twig +123 -9
  157. package/templates/bcl-person/person.html.twig +44 -0
  158. package/templates/bcl-project/project-lists.html.twig +67 -0
  159. package/templates/bcl-project/project.html.twig +84 -49
  160. package/templates/bcl-project-status/project-contributions.html.twig +56 -0
  161. package/templates/bcl-project-status/project-status.html.twig +13 -24
  162. package/templates/bcl-select/select.html.twig +13 -3
  163. package/templates/bcl-subscription/subscription-modal.html.twig +24 -0
  164. package/templates/bcl-subscription/subscription.html.twig +10 -0
  165. package/templates/bcl-subscription-block/subscription-block.html.twig +36 -0
  166. package/templates/bcl-timeline/timeline.html.twig +10 -7
  167. package/templates/bcl-user/user-view-compact.html.twig +9 -2
  168. package/templates/bcl-user/user-view.html.twig +0 -10
  169. package/icons/bootstrap-icons.svg +0 -1
@@ -0,0 +1,168 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.1.3): gallery.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { defineJQueryPlugin, typeCheckConfig } from '@openeuropa/bcl-bootstrap/js/src/util/index'
9
+ import EventHandler from '@openeuropa/bcl-bootstrap/js/src/dom/event-handler'
10
+ import BaseComponent from '@openeuropa/bcl-bootstrap/js/src/base-component'
11
+ import SelectorEngine from '@openeuropa/bcl-bootstrap/js/src/dom/selector-engine'
12
+ import Manipulator from '@openeuropa/bcl-bootstrap/js/src/dom/manipulator'
13
+
14
+ /**
15
+ * ------------------------------------------------------------------------
16
+ * Constants
17
+ * ------------------------------------------------------------------------
18
+ */
19
+
20
+ const Default = {}
21
+ const DefaultType = {}
22
+
23
+ const NAME = 'gallery'
24
+ const DATA_KEY = 'bs.gallery'
25
+ const EVENT_KEY = `.${DATA_KEY}`
26
+ const DATA_API_KEY = '.data-api'
27
+
28
+ const CAROUSEL_SELECTOR = '.carousel'
29
+ const CAROUSEL_PAGER_SELECTOR = '.carousel-pager span'
30
+ const CAROUSEL_ACTIVE_SELECTOR = '.carousel-item.active'
31
+ const CAROUSEL_ITEM_SELECTOR = '.carousel-item'
32
+ const THUMBNAIL_SELECTOR = '.bcl-gallery__grid a, .bcl-gallery__mobile-view-more'
33
+ const MODAL_SELECTOR = '.modal'
34
+ const EVENT_MODAL_HIDE = 'hide.bs.modal'
35
+ const CAROUSEL_EVENT = 'slide.bs.carousel'
36
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
37
+
38
+ /**
39
+ * ------------------------------------------------------------------------
40
+ * Class Definition
41
+ * ------------------------------------------------------------------------
42
+ */
43
+
44
+ class Gallery extends BaseComponent {
45
+ constructor(element, config) {
46
+ super(element)
47
+ this._carousel = SelectorEngine.findOne(CAROUSEL_SELECTOR, this._element)
48
+ this._carouselPager = SelectorEngine.findOne(CAROUSEL_PAGER_SELECTOR, this._element)
49
+ this._carouselStartIndex = element.getAttribute('data-gallery-start')
50
+ this._carouselActiveItem = SelectorEngine.find(CAROUSEL_ITEM_SELECTOR, this._carousel)[this._carouselStartIndex]
51
+ this._carouselPager.textContent = Number(this._carouselStartIndex) + 1
52
+ this._modal = SelectorEngine.findOne(MODAL_SELECTOR, this._element)
53
+ this._config = this._getConfig(config)
54
+ this._addEventListeners()
55
+ this._carouselLazyLoad(this._carouselActiveItem)
56
+ }
57
+
58
+ // Getters
59
+ static get NAME() {
60
+ return NAME
61
+ }
62
+
63
+ // Public
64
+ setSlide(event) {
65
+ const slideFrom = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this._carousel)
66
+ const slideTo = event.relatedTarget
67
+ this._carouselLazyLoad(slideTo)
68
+ this._carouselPager.textContent = event.to + 1
69
+ this.stopVideo(slideFrom)
70
+ }
71
+
72
+ stopSlide() {
73
+ const currentSlide = SelectorEngine.findOne(CAROUSEL_ACTIVE_SELECTOR, this._carousel)
74
+ this.stopVideo(currentSlide)
75
+ }
76
+
77
+ stopVideo(slide) {
78
+ const iframe = SelectorEngine.findOne('iframe', slide);
79
+ const video = SelectorEngine.findOne('video', slide);
80
+ if (iframe) {
81
+ iframe.src = iframe.dataset.src;
82
+ } else if (video) {
83
+ video.pause();
84
+ }
85
+ }
86
+
87
+ // Private
88
+ _carouselLazyLoad(slide) {
89
+ const media = SelectorEngine.findOne('[data-src]', slide);
90
+
91
+ if (media && !media.src) {
92
+ media.src = media.dataset.src;
93
+ }
94
+ }
95
+
96
+ _getConfig(config) {
97
+ config = {
98
+ ...Default,
99
+ ...Manipulator.getDataAttributes(this._element),
100
+ ...(typeof config === 'object' ? config : {})
101
+ }
102
+ typeCheckConfig(NAME, config, DefaultType)
103
+ return config
104
+ }
105
+
106
+ _addEventListeners() {
107
+ EventHandler.on(this._carousel, CAROUSEL_EVENT, event => this.setSlide(event))
108
+ EventHandler.on(this._modal, EVENT_MODAL_HIDE, event => this.stopSlide(event))
109
+ }
110
+
111
+ // Static
112
+ static get Default() {
113
+ return Default
114
+ }
115
+
116
+ static galleryInterface(element, config) {
117
+ const data = Gallery.getOrCreateInstance(element, config)
118
+
119
+ let { _config } = data
120
+ if (typeof config === 'object') {
121
+ _config = {
122
+ ..._config,
123
+ ...config
124
+ }
125
+ }
126
+ }
127
+
128
+ static jQueryInterface(config) {
129
+ return this.each(function () {
130
+ const data = Gallery.getOrCreateInstance(this)
131
+
132
+ if (typeof config !== 'string') {
133
+ return
134
+ }
135
+
136
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
137
+ throw new TypeError(`No method named "${config}"`)
138
+ }
139
+
140
+ data[config](this)
141
+ })
142
+ }
143
+ }
144
+
145
+ /**
146
+ * ------------------------------------------------------------------------
147
+ * Data Api implementation
148
+ * ------------------------------------------------------------------------
149
+ */
150
+
151
+ EventHandler.on(document, EVENT_CLICK_DATA_API, THUMBNAIL_SELECTOR, function (event) {
152
+ const gallery = event.target.closest('div.bcl-gallery')
153
+ const firstSlide = event.target.parentNode.getAttribute('data-bs-slide-to');
154
+ gallery.dataset.galleryStart = firstSlide;
155
+
156
+ Gallery.galleryInterface(gallery, Gallery.getInstance(gallery))
157
+ })
158
+
159
+ /**
160
+ * ------------------------------------------------------------------------
161
+ * jQuery
162
+ * ------------------------------------------------------------------------
163
+ * add .gallery to jQuery only if jQuery is present
164
+ */
165
+
166
+ defineJQueryPlugin(Gallery)
167
+
168
+ export default Gallery
@@ -10,6 +10,7 @@ import Button from "@openeuropa/bcl-bootstrap/js/src/button";
10
10
  import Carousel from "@openeuropa/bcl-bootstrap/js/src/carousel";
11
11
  import Collapse from "@openeuropa/bcl-bootstrap/js/src/collapse";
12
12
  import Dropdown from "@openeuropa/bcl-bootstrap/js/src/dropdown";
13
+ import Gallery from "@openeuropa/bcl-theme-default/src/js/gallery/gallery";
13
14
  import Modal from "@openeuropa/bcl-bootstrap/js/src/modal";
14
15
  import Offcanvas from "@openeuropa/bcl-bootstrap/js/src/offcanvas";
15
16
  import Popover from "@openeuropa/bcl-bootstrap/js/src/popover";
@@ -24,6 +25,7 @@ export {
24
25
  Carousel,
25
26
  Collapse,
26
27
  Dropdown,
28
+ Gallery,
27
29
  Modal,
28
30
  Offcanvas,
29
31
  Popover,
@@ -10,6 +10,7 @@ import Button from "@openeuropa/bcl-bootstrap/js/src/button";
10
10
  import Carousel from "@openeuropa/bcl-bootstrap/js/src/carousel";
11
11
  import Collapse from "@openeuropa/bcl-bootstrap/js/src/collapse";
12
12
  import Dropdown from "@openeuropa/bcl-bootstrap/js/src/dropdown";
13
+ import Gallery from "@openeuropa/bcl-theme-default/src/js/gallery/gallery";
13
14
  import Modal from "@openeuropa/bcl-bootstrap/js/src/modal";
14
15
  import Offcanvas from "@openeuropa/bcl-bootstrap/js/src/offcanvas";
15
16
  import Popover from "@openeuropa/bcl-bootstrap/js/src/popover";
@@ -24,6 +25,7 @@ export default {
24
25
  Carousel,
25
26
  Collapse,
26
27
  Dropdown,
28
+ Gallery,
27
29
  Modal,
28
30
  Offcanvas,
29
31
  Popover,
@@ -8,20 +8,20 @@
8
8
  font-size: $badge-font-size-desktop;
9
9
  }
10
10
  .icon--close {
11
- display: inline-block;
11
+ display: inline-flex;
12
12
  width: 12px;
13
13
  height: 12px;
14
14
  margin-left: 0.3rem;
15
15
  font-size: 1em;
16
16
  font-weight: 300;
17
- line-height: 0.55rem;
18
- vertical-align: inherit;
17
+ justify-content: center;
18
+ align-items: center;
19
19
  cursor: pointer;
20
20
  background: $white;
21
21
  border-radius: 50%;
22
22
  svg {
23
- width: 12px;
24
- height: 12px;
23
+ width: 6px;
24
+ height: 6px;
25
25
  margin: 0;
26
26
  }
27
27
  }
@@ -42,12 +42,12 @@
42
42
  &::before {
43
43
  display: block;
44
44
  width: 100%;
45
- padding-top: 25%;
45
+ padding-top: 20%;
46
46
  content: "";
47
47
  }
48
48
 
49
49
  .hero &::before {
50
- padding-top: 33.33%;
50
+ padding-top: 25%;
51
51
  }
52
52
  }
53
53
 
@@ -147,14 +147,14 @@
147
147
  &::before {
148
148
  display: block;
149
149
  width: 100%;
150
- padding-top: 25%;
150
+ padding-top: 20%;
151
151
  content: "";
152
152
  }
153
153
 
154
154
  &.hero {
155
155
  min-height: 380px;
156
156
  &::before {
157
- padding-top: 33.33%;
157
+ padding-top: 25%;
158
158
  }
159
159
  }
160
160
  }
@@ -5,10 +5,17 @@
5
5
  visibility: visible !important; // stylelint-disable-line declaration-no-important
6
6
  border: none;
7
7
  transform: none;
8
+ box-shadow: none;
8
9
 
9
10
  .offcanvas-body {
10
11
  overflow: visible;
11
12
  }
13
+
14
+ .offcanvas-title {
15
+ height: 38px;
16
+ display: flex;
17
+ align-items: center;
18
+ }
12
19
  }
13
20
 
14
21
  .bcl-offcanvas + .offcanvas-backdrop {
@@ -0,0 +1,85 @@
1
+ $indicator-size: 8px;
2
+
3
+ .carousel-indicators {
4
+ background-color: rgba(0, 0, 0, 0.5);
5
+ margin: 0;
6
+ [data-bs-target] {
7
+ width: $indicator-size;
8
+ height: $indicator-size;
9
+ margin: map-get($spacers, "1-5") map-get($spacers, 2) map-get($spacers, 3);
10
+ border-radius: 50%;
11
+ }
12
+ }
13
+
14
+ .carousel-caption {
15
+ width: 100%;
16
+ left: 0;
17
+ right: 0;
18
+ background-color: rgba(0, 0, 0, 0.5);
19
+ bottom: 0;
20
+ padding: map-get($spacers, 3) 0 map-get($spacers, 4);
21
+ p {
22
+ margin-bottom: 0;
23
+ }
24
+ a {
25
+ color: $white;
26
+ text-decoration-color: $white;
27
+ }
28
+ }
29
+
30
+ .carousel-dark {
31
+ .carousel-caption {
32
+ background-color: rgba(255, 255, 255, 0.5);
33
+ a {
34
+ color: $black;
35
+ text-decoration-color: $black;
36
+ }
37
+ }
38
+
39
+ .carousel-indicators {
40
+ background-color: rgba(255, 255, 255, 0.5);
41
+ }
42
+ }
43
+
44
+ .carousel-control-next,
45
+ .carousel-control-prev {
46
+ opacity: 1;
47
+ &:hover {
48
+ opacity: 1;
49
+ }
50
+ }
51
+
52
+ .carousel-control-prev-icon,
53
+ .carousel-control-next-icon {
54
+ width: 40px;
55
+ height: 40px;
56
+ background-size: 60% 60%;
57
+ background-color: rgba(0, 0, 0, 0.5);
58
+ border-radius: 4px;
59
+ }
60
+
61
+ .carousel-control-next-icon {
62
+ background-position: 9px center;
63
+ }
64
+
65
+ .carousel-control-prev-icon {
66
+ background-position: 7px center;
67
+ }
68
+
69
+ .carousel.rounded-indicators {
70
+ .carousel-control-prev-icon,
71
+ .carousel-control-next-icon {
72
+ border-radius: 50%;
73
+ }
74
+ }
75
+
76
+ @include media-breakpoint-up(md) {
77
+ .carousel-indicators {
78
+ & + .carousel-inner {
79
+ .carousel-caption {
80
+ bottom: 50px;
81
+ padding-bottom: 0;
82
+ }
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,122 @@
1
+ @use "sass:math";
2
+
3
+ //styling
4
+ $borderWidth: 12px;
5
+ $animationTime: 1s;
6
+ $size: 120px;
7
+
8
+ //Create how many steps
9
+ $howManySteps: 20;
10
+
11
+ .circular-progress {
12
+ width: $size;
13
+ height: $size;
14
+ line-height: $size;
15
+ background: none;
16
+ box-shadow: none;
17
+ position: relative;
18
+ &:after {
19
+ content: "";
20
+ width: 100%;
21
+ height: 100%;
22
+ border-radius: 50%;
23
+ border: $borderWidth solid $circular-progress-border-color;
24
+ position: absolute;
25
+ top: 0;
26
+ left: 0;
27
+ }
28
+ > span {
29
+ width: 50%;
30
+ height: 100%;
31
+ overflow: hidden;
32
+ position: absolute;
33
+ top: 0;
34
+ z-index: 1;
35
+ }
36
+ }
37
+
38
+ .circular-progress-bar {
39
+ width: 100%;
40
+ height: 100%;
41
+ background: none;
42
+ border-width: $borderWidth;
43
+ border-style: solid;
44
+ position: absolute;
45
+ top: 0;
46
+ border-color: $circular-progress-border-color-fill;
47
+ }
48
+
49
+ .circular-progress-left {
50
+ left: 0;
51
+ .circular-progress-bar {
52
+ left: 100%;
53
+ border-top-right-radius: math.div($size, 2);
54
+ border-bottom-right-radius: math.div($size, 2);
55
+ border-left: 0;
56
+ transform-origin: center left;
57
+ }
58
+ }
59
+
60
+ .circular-progress-right {
61
+ right: 0;
62
+ .circular-progress-bar {
63
+ left: -100%;
64
+ border-top-left-radius: math.div($size, 2);
65
+ border-bottom-left-radius: math.div($size, 2);
66
+ border-right: 0;
67
+ transform-origin: center right;
68
+ }
69
+ }
70
+
71
+ /* This for loop creates the necessary css animation names
72
+ Due to the split circle of progress-left and progress right, we must use the animations on each side.
73
+ */
74
+ @for $i from 1 through $howManySteps {
75
+ $stepName: ($i * math.div(100, $howManySteps));
76
+
77
+ //animation only the left side if below 50%
78
+ @if $i <= math.div($howManySteps, 2) {
79
+ .circular-progress[data-percentage="#{$stepName}"] {
80
+ .circular-progress-right .circular-progress-bar {
81
+ animation: loading-#{$i} $animationTime linear forwards;
82
+ }
83
+ .circular-progress-left .circular-progress-bar {
84
+ animation: 0;
85
+ }
86
+ }
87
+ }
88
+ //animation only the right side if above 50%
89
+ @if $i > math.div($howManySteps, 2) {
90
+ .circular-progress[data-percentage="#{$stepName}"] {
91
+ .circular-progress-right .circular-progress-bar {
92
+ // prettier-ignore
93
+ animation: loading-#{ math.div($howManySteps, 2)}
94
+ $animationTime
95
+ linear
96
+ forwards; //set the animation to longest animation
97
+ }
98
+ .circular-progress-left .circular-progress-bar {
99
+ // prettier-ignore
100
+ animation: loading-#{$i - math.div($howManySteps, 2)}
101
+ $animationTime
102
+ linear
103
+ forwards
104
+ $animationTime;
105
+ }
106
+ }
107
+ }
108
+ }
109
+
110
+ //animation
111
+ @for $i from 1 through math.div($howManySteps, 2) {
112
+ $degrees: math.div(180, math.div($howManySteps, 2));
113
+ $degrees: ($degrees * $i);
114
+ @keyframes loading-#{$i} {
115
+ 0% {
116
+ transform: rotate(0deg);
117
+ }
118
+ 100% {
119
+ transform: rotate(#{$degrees}deg);
120
+ }
121
+ }
122
+ }