@openeuropa/bcl-bootstrap 0.25.1 → 0.26.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 (142) hide show
  1. package/bootstrap-icons.svg +1 -1
  2. package/icons/apple.svg +2 -2
  3. package/icons/boombox-fill.svg +2 -2
  4. package/icons/cup-fill.svg +1 -1
  5. package/icons/cup.svg +1 -1
  6. package/js/dist/alert.js +3 -12
  7. package/js/dist/alert.js.map +1 -1
  8. package/js/dist/base-component.js +32 -18
  9. package/js/dist/base-component.js.map +1 -1
  10. package/js/dist/button.js +3 -12
  11. package/js/dist/button.js.map +1 -1
  12. package/js/dist/carousel.js +207 -307
  13. package/js/dist/carousel.js.map +1 -1
  14. package/js/dist/collapse.js +57 -88
  15. package/js/dist/collapse.js.map +1 -1
  16. package/js/dist/dom/data.js +1 -3
  17. package/js/dist/dom/data.js.map +1 -1
  18. package/js/dist/dom/event-handler.js +87 -106
  19. package/js/dist/dom/event-handler.js.map +1 -1
  20. package/js/dist/dom/manipulator.js +21 -25
  21. package/js/dist/dom/manipulator.js.map +1 -1
  22. package/js/dist/dom/selector-engine.js +11 -10
  23. package/js/dist/dom/selector-engine.js.map +1 -1
  24. package/js/dist/dropdown.js +83 -115
  25. package/js/dist/dropdown.js.map +1 -1
  26. package/js/dist/modal.js +95 -152
  27. package/js/dist/modal.js.map +1 -1
  28. package/js/dist/offcanvas.js +75 -58
  29. package/js/dist/offcanvas.js.map +1 -1
  30. package/js/dist/popover.js +29 -56
  31. package/js/dist/popover.js.map +1 -1
  32. package/js/dist/scrollspy.js +176 -125
  33. package/js/dist/scrollspy.js.map +1 -1
  34. package/js/dist/tab.js +207 -92
  35. package/js/dist/tab.js.map +1 -1
  36. package/js/dist/toast.js +23 -37
  37. package/js/dist/toast.js.map +1 -1
  38. package/js/dist/tooltip.js +259 -348
  39. package/js/dist/tooltip.js.map +1 -1
  40. package/js/dist/util/backdrop.js +62 -39
  41. package/js/dist/util/backdrop.js.map +1 -1
  42. package/js/dist/util/component-functions.js +1 -1
  43. package/js/dist/util/component-functions.js.map +1 -1
  44. package/js/dist/util/config.js +75 -0
  45. package/js/dist/util/config.js.map +1 -0
  46. package/js/dist/util/focustrap.js +41 -34
  47. package/js/dist/util/focustrap.js.map +1 -1
  48. package/js/dist/util/index.js +56 -52
  49. package/js/dist/util/index.js.map +1 -1
  50. package/js/dist/util/sanitizer.js +12 -19
  51. package/js/dist/util/sanitizer.js.map +1 -1
  52. package/js/dist/util/scrollbar.js +49 -34
  53. package/js/dist/util/scrollbar.js.map +1 -1
  54. package/js/dist/util/swipe.js +151 -0
  55. package/js/dist/util/swipe.js.map +1 -0
  56. package/js/dist/util/template-factory.js +173 -0
  57. package/js/dist/util/template-factory.js.map +1 -0
  58. package/js/src/alert.js +3 -15
  59. package/js/src/base-component.js +28 -18
  60. package/js/src/button.js +3 -17
  61. package/js/src/carousel.js +203 -319
  62. package/js/src/collapse.js +61 -94
  63. package/js/src/dom/data.js +1 -3
  64. package/js/src/dom/event-handler.js +80 -108
  65. package/js/src/dom/manipulator.js +22 -31
  66. package/js/src/dom/selector-engine.js +10 -19
  67. package/js/src/dropdown.js +84 -138
  68. package/js/src/modal.js +94 -158
  69. package/js/src/offcanvas.js +72 -61
  70. package/js/src/popover.js +31 -62
  71. package/js/src/scrollspy.js +166 -171
  72. package/js/src/tab.js +193 -110
  73. package/js/src/toast.js +19 -41
  74. package/js/src/tooltip.js +259 -371
  75. package/js/src/util/backdrop.js +55 -36
  76. package/js/src/util/component-functions.js +1 -1
  77. package/js/src/util/config.js +66 -0
  78. package/js/src/util/focustrap.js +38 -28
  79. package/js/src/util/index.js +67 -64
  80. package/js/src/util/sanitizer.js +11 -19
  81. package/js/src/util/scrollbar.js +47 -30
  82. package/js/src/util/swipe.js +146 -0
  83. package/js/src/util/template-factory.js +160 -0
  84. package/package.json +4 -4
  85. package/scss/_accordion.scss +52 -24
  86. package/scss/_alert.scss +18 -4
  87. package/scss/_badge.scss +14 -5
  88. package/scss/_breadcrumb.scss +22 -10
  89. package/scss/_button-group.scss +3 -0
  90. package/scss/_buttons.scss +97 -22
  91. package/scss/_card.scss +55 -37
  92. package/scss/_close.scss +1 -1
  93. package/scss/_containers.scss +1 -1
  94. package/scss/_dropdown.scss +83 -75
  95. package/scss/_functions.scss +7 -7
  96. package/scss/_grid.scss +3 -3
  97. package/scss/_helpers.scss +1 -0
  98. package/scss/_list-group.scss +44 -27
  99. package/scss/_maps.scss +54 -0
  100. package/scss/_modal.scss +71 -43
  101. package/scss/_nav.scss +53 -20
  102. package/scss/_navbar.scss +91 -150
  103. package/scss/_offcanvas.scss +119 -59
  104. package/scss/_pagination.scss +66 -21
  105. package/scss/_placeholders.scss +1 -1
  106. package/scss/_popover.scss +90 -52
  107. package/scss/_progress.scss +20 -9
  108. package/scss/_reboot.scss +25 -40
  109. package/scss/_root.scss +40 -21
  110. package/scss/_spinners.scss +38 -22
  111. package/scss/_tables.scss +32 -23
  112. package/scss/_toasts.scss +35 -16
  113. package/scss/_tooltip.scss +61 -56
  114. package/scss/_type.scss +2 -0
  115. package/scss/_utilities.scss +43 -26
  116. package/scss/_variables.scss +113 -121
  117. package/scss/bootstrap-grid.scss +3 -6
  118. package/scss/bootstrap-reboot.scss +3 -7
  119. package/scss/bootstrap-utilities.scss +3 -6
  120. package/scss/bootstrap.scss +4 -6
  121. package/scss/forms/_floating-labels.scss +14 -3
  122. package/scss/forms/_form-check.scss +28 -5
  123. package/scss/forms/_form-control.scss +12 -37
  124. package/scss/forms/_form-select.scss +0 -1
  125. package/scss/forms/_input-group.scss +15 -7
  126. package/scss/helpers/_color-bg.scss +10 -0
  127. package/scss/helpers/_colored-links.scss +2 -2
  128. package/scss/helpers/_position.scss +7 -1
  129. package/scss/helpers/_ratio.scss +2 -2
  130. package/scss/helpers/_vr.scss +1 -1
  131. package/scss/mixins/_alert.scss +7 -3
  132. package/scss/mixins/_banner.scss +9 -0
  133. package/scss/mixins/_breakpoints.scss +8 -8
  134. package/scss/mixins/_buttons.scss +32 -95
  135. package/scss/mixins/_container.scss +4 -2
  136. package/scss/mixins/_forms.scss +8 -0
  137. package/scss/mixins/_gradients.scss +1 -1
  138. package/scss/mixins/_grid.scss +12 -12
  139. package/scss/mixins/_pagination.scss +4 -25
  140. package/scss/mixins/_reset-text.scss +1 -1
  141. package/scss/mixins/_table-variants.scss +12 -9
  142. package/scss/mixins/_utilities.scss +12 -4
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * --------------------------------------------------------------------------
3
- * Bootstrap (v5.1.3): util/scrollBar.js
3
+ * Bootstrap (v5.2.0): util/scrollBar.js
4
4
  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
5
  * --------------------------------------------------------------------------
6
6
  */
@@ -9,14 +9,25 @@ import SelectorEngine from '../dom/selector-engine'
9
9
  import Manipulator from '../dom/manipulator'
10
10
  import { isElement } from './index'
11
11
 
12
+ /**
13
+ * Constants
14
+ */
15
+
12
16
  const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'
13
17
  const SELECTOR_STICKY_CONTENT = '.sticky-top'
18
+ const PROPERTY_PADDING = 'padding-right'
19
+ const PROPERTY_MARGIN = 'margin-right'
20
+
21
+ /**
22
+ * Class definition
23
+ */
14
24
 
15
25
  class ScrollBarHelper {
16
26
  constructor() {
17
27
  this._element = document.body
18
28
  }
19
29
 
30
+ // Public
20
31
  getWidth() {
21
32
  // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes
22
33
  const documentWidth = document.documentElement.clientWidth
@@ -27,55 +38,62 @@ class ScrollBarHelper {
27
38
  const width = this.getWidth()
28
39
  this._disableOverFlow()
29
40
  // give padding to element to balance the hidden scrollbar width
30
- this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width)
41
+ this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)
31
42
  // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth
32
- this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width)
33
- this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width)
43
+ this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)
44
+ this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)
45
+ }
46
+
47
+ reset() {
48
+ this._resetElementAttributes(this._element, 'overflow')
49
+ this._resetElementAttributes(this._element, PROPERTY_PADDING)
50
+ this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)
51
+ this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)
52
+ }
53
+
54
+ isOverflowing() {
55
+ return this.getWidth() > 0
34
56
  }
35
57
 
58
+ // Private
36
59
  _disableOverFlow() {
37
60
  this._saveInitialAttribute(this._element, 'overflow')
38
61
  this._element.style.overflow = 'hidden'
39
62
  }
40
63
 
41
- _setElementAttributes(selector, styleProp, callback) {
64
+ _setElementAttributes(selector, styleProperty, callback) {
42
65
  const scrollbarWidth = this.getWidth()
43
66
  const manipulationCallBack = element => {
44
67
  if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
45
68
  return
46
69
  }
47
70
 
48
- this._saveInitialAttribute(element, styleProp)
49
- const calculatedValue = window.getComputedStyle(element)[styleProp]
50
- element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`
71
+ this._saveInitialAttribute(element, styleProperty)
72
+ const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)
73
+ element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)
51
74
  }
52
75
 
53
76
  this._applyManipulationCallback(selector, manipulationCallBack)
54
77
  }
55
78
 
56
- reset() {
57
- this._resetElementAttributes(this._element, 'overflow')
58
- this._resetElementAttributes(this._element, 'paddingRight')
59
- this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight')
60
- this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight')
61
- }
62
-
63
- _saveInitialAttribute(element, styleProp) {
64
- const actualValue = element.style[styleProp]
79
+ _saveInitialAttribute(element, styleProperty) {
80
+ const actualValue = element.style.getPropertyValue(styleProperty)
65
81
  if (actualValue) {
66
- Manipulator.setDataAttribute(element, styleProp, actualValue)
82
+ Manipulator.setDataAttribute(element, styleProperty, actualValue)
67
83
  }
68
84
  }
69
85
 
70
- _resetElementAttributes(selector, styleProp) {
86
+ _resetElementAttributes(selector, styleProperty) {
71
87
  const manipulationCallBack = element => {
72
- const value = Manipulator.getDataAttribute(element, styleProp)
73
- if (typeof value === 'undefined') {
74
- element.style.removeProperty(styleProp)
75
- } else {
76
- Manipulator.removeDataAttribute(element, styleProp)
77
- element.style[styleProp] = value
88
+ const value = Manipulator.getDataAttribute(element, styleProperty)
89
+ // We only want to remove the property if the value is `null`; the value can also be zero
90
+ if (value === null) {
91
+ element.style.removeProperty(styleProperty)
92
+ return
78
93
  }
94
+
95
+ Manipulator.removeDataAttribute(element, styleProperty)
96
+ element.style.setProperty(styleProperty, value)
79
97
  }
80
98
 
81
99
  this._applyManipulationCallback(selector, manipulationCallBack)
@@ -84,13 +102,12 @@ class ScrollBarHelper {
84
102
  _applyManipulationCallback(selector, callBack) {
85
103
  if (isElement(selector)) {
86
104
  callBack(selector)
87
- } else {
88
- SelectorEngine.find(selector, this._element).forEach(callBack)
105
+ return
89
106
  }
90
- }
91
107
 
92
- isOverflowing() {
93
- return this.getWidth() > 0
108
+ for (const sel of SelectorEngine.find(selector, this._element)) {
109
+ callBack(sel)
110
+ }
94
111
  }
95
112
  }
96
113
 
@@ -0,0 +1,146 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.0): util/swipe.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import Config from './config'
9
+ import EventHandler from '../dom/event-handler'
10
+ import { execute } from './index'
11
+
12
+ /**
13
+ * Constants
14
+ */
15
+
16
+ const NAME = 'swipe'
17
+ const EVENT_KEY = '.bs.swipe'
18
+ const EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`
19
+ const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`
20
+ const EVENT_TOUCHEND = `touchend${EVENT_KEY}`
21
+ const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`
22
+ const EVENT_POINTERUP = `pointerup${EVENT_KEY}`
23
+ const POINTER_TYPE_TOUCH = 'touch'
24
+ const POINTER_TYPE_PEN = 'pen'
25
+ const CLASS_NAME_POINTER_EVENT = 'pointer-event'
26
+ const SWIPE_THRESHOLD = 40
27
+
28
+ const Default = {
29
+ endCallback: null,
30
+ leftCallback: null,
31
+ rightCallback: null
32
+ }
33
+
34
+ const DefaultType = {
35
+ endCallback: '(function|null)',
36
+ leftCallback: '(function|null)',
37
+ rightCallback: '(function|null)'
38
+ }
39
+
40
+ /**
41
+ * Class definition
42
+ */
43
+
44
+ class Swipe extends Config {
45
+ constructor(element, config) {
46
+ super()
47
+ this._element = element
48
+
49
+ if (!element || !Swipe.isSupported()) {
50
+ return
51
+ }
52
+
53
+ this._config = this._getConfig(config)
54
+ this._deltaX = 0
55
+ this._supportPointerEvents = Boolean(window.PointerEvent)
56
+ this._initEvents()
57
+ }
58
+
59
+ // Getters
60
+ static get Default() {
61
+ return Default
62
+ }
63
+
64
+ static get DefaultType() {
65
+ return DefaultType
66
+ }
67
+
68
+ static get NAME() {
69
+ return NAME
70
+ }
71
+
72
+ // Public
73
+ dispose() {
74
+ EventHandler.off(this._element, EVENT_KEY)
75
+ }
76
+
77
+ // Private
78
+ _start(event) {
79
+ if (!this._supportPointerEvents) {
80
+ this._deltaX = event.touches[0].clientX
81
+
82
+ return
83
+ }
84
+
85
+ if (this._eventIsPointerPenTouch(event)) {
86
+ this._deltaX = event.clientX
87
+ }
88
+ }
89
+
90
+ _end(event) {
91
+ if (this._eventIsPointerPenTouch(event)) {
92
+ this._deltaX = event.clientX - this._deltaX
93
+ }
94
+
95
+ this._handleSwipe()
96
+ execute(this._config.endCallback)
97
+ }
98
+
99
+ _move(event) {
100
+ this._deltaX = event.touches && event.touches.length > 1 ?
101
+ 0 :
102
+ event.touches[0].clientX - this._deltaX
103
+ }
104
+
105
+ _handleSwipe() {
106
+ const absDeltaX = Math.abs(this._deltaX)
107
+
108
+ if (absDeltaX <= SWIPE_THRESHOLD) {
109
+ return
110
+ }
111
+
112
+ const direction = absDeltaX / this._deltaX
113
+
114
+ this._deltaX = 0
115
+
116
+ if (!direction) {
117
+ return
118
+ }
119
+
120
+ execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)
121
+ }
122
+
123
+ _initEvents() {
124
+ if (this._supportPointerEvents) {
125
+ EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))
126
+ EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))
127
+
128
+ this._element.classList.add(CLASS_NAME_POINTER_EVENT)
129
+ } else {
130
+ EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))
131
+ EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))
132
+ EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))
133
+ }
134
+ }
135
+
136
+ _eventIsPointerPenTouch(event) {
137
+ return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)
138
+ }
139
+
140
+ // Static
141
+ static isSupported() {
142
+ return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0
143
+ }
144
+ }
145
+
146
+ export default Swipe
@@ -0,0 +1,160 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.0): util/template-factory.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { DefaultAllowlist, sanitizeHtml } from './sanitizer'
9
+ import { getElement, isElement } from '../util/index'
10
+ import SelectorEngine from '../dom/selector-engine'
11
+ import Config from './config'
12
+
13
+ /**
14
+ * Constants
15
+ */
16
+
17
+ const NAME = 'TemplateFactory'
18
+
19
+ const Default = {
20
+ allowList: DefaultAllowlist,
21
+ content: {}, // { selector : text , selector2 : text2 , }
22
+ extraClass: '',
23
+ html: false,
24
+ sanitize: true,
25
+ sanitizeFn: null,
26
+ template: '<div></div>'
27
+ }
28
+
29
+ const DefaultType = {
30
+ allowList: 'object',
31
+ content: 'object',
32
+ extraClass: '(string|function)',
33
+ html: 'boolean',
34
+ sanitize: 'boolean',
35
+ sanitizeFn: '(null|function)',
36
+ template: 'string'
37
+ }
38
+
39
+ const DefaultContentType = {
40
+ entry: '(string|element|function|null)',
41
+ selector: '(string|element)'
42
+ }
43
+
44
+ /**
45
+ * Class definition
46
+ */
47
+
48
+ class TemplateFactory extends Config {
49
+ constructor(config) {
50
+ super()
51
+ this._config = this._getConfig(config)
52
+ }
53
+
54
+ // Getters
55
+ static get Default() {
56
+ return Default
57
+ }
58
+
59
+ static get DefaultType() {
60
+ return DefaultType
61
+ }
62
+
63
+ static get NAME() {
64
+ return NAME
65
+ }
66
+
67
+ // Public
68
+ getContent() {
69
+ return Object.values(this._config.content)
70
+ .map(config => this._resolvePossibleFunction(config))
71
+ .filter(Boolean)
72
+ }
73
+
74
+ hasContent() {
75
+ return this.getContent().length > 0
76
+ }
77
+
78
+ changeContent(content) {
79
+ this._checkContent(content)
80
+ this._config.content = { ...this._config.content, ...content }
81
+ return this
82
+ }
83
+
84
+ toHtml() {
85
+ const templateWrapper = document.createElement('div')
86
+ templateWrapper.innerHTML = this._maybeSanitize(this._config.template)
87
+
88
+ for (const [selector, text] of Object.entries(this._config.content)) {
89
+ this._setContent(templateWrapper, text, selector)
90
+ }
91
+
92
+ const template = templateWrapper.children[0]
93
+ const extraClass = this._resolvePossibleFunction(this._config.extraClass)
94
+
95
+ if (extraClass) {
96
+ template.classList.add(...extraClass.split(' '))
97
+ }
98
+
99
+ return template
100
+ }
101
+
102
+ // Private
103
+ _typeCheckConfig(config) {
104
+ super._typeCheckConfig(config)
105
+ this._checkContent(config.content)
106
+ }
107
+
108
+ _checkContent(arg) {
109
+ for (const [selector, content] of Object.entries(arg)) {
110
+ super._typeCheckConfig({ selector, entry: content }, DefaultContentType)
111
+ }
112
+ }
113
+
114
+ _setContent(template, content, selector) {
115
+ const templateElement = SelectorEngine.findOne(selector, template)
116
+
117
+ if (!templateElement) {
118
+ return
119
+ }
120
+
121
+ content = this._resolvePossibleFunction(content)
122
+
123
+ if (!content) {
124
+ templateElement.remove()
125
+ return
126
+ }
127
+
128
+ if (isElement(content)) {
129
+ this._putElementInTemplate(getElement(content), templateElement)
130
+ return
131
+ }
132
+
133
+ if (this._config.html) {
134
+ templateElement.innerHTML = this._maybeSanitize(content)
135
+ return
136
+ }
137
+
138
+ templateElement.textContent = content
139
+ }
140
+
141
+ _maybeSanitize(arg) {
142
+ return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg
143
+ }
144
+
145
+ _resolvePossibleFunction(arg) {
146
+ return typeof arg === 'function' ? arg(this) : arg
147
+ }
148
+
149
+ _putElementInTemplate(element, templateElement) {
150
+ if (this._config.html) {
151
+ templateElement.innerHTML = ''
152
+ templateElement.append(element)
153
+ return
154
+ }
155
+
156
+ templateElement.textContent = element.textContent
157
+ }
158
+ }
159
+
160
+ export default TemplateFactory
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@openeuropa/bcl-bootstrap",
3
3
  "author": "European Commission",
4
4
  "license": "EUPL-1.2",
5
- "version": "0.25.1",
5
+ "version": "0.26.0",
6
6
  "description": "OE - BCL bootstrap 5 sources",
7
7
  "bin": {
8
8
  "plugins-builder": "./bin/build-plugins.js"
@@ -18,8 +18,8 @@
18
18
  },
19
19
  "devDependencies": {
20
20
  "@rollup/plugin-babel": "5.3.1",
21
- "bootstrap": "5.1.3",
22
- "bootstrap-icons": "1.8.3",
21
+ "bootstrap": "5.2.0",
22
+ "bootstrap-icons": "1.9.1",
23
23
  "copyfiles": "2.4.1",
24
24
  "npm-run-all": "4.1.5",
25
25
  "rimraf": "3.0.2"
@@ -41,5 +41,5 @@
41
41
  "design-system",
42
42
  "twig"
43
43
  ],
44
- "gitHead": "01db3de0765fee0f44e4f202f3ea7d0f2e28f742"
44
+ "gitHead": "94d89cc379780cfce06178959194b3bc1b4c5eda"
45
45
  }
@@ -2,43 +2,70 @@
2
2
  // Base styles
3
3
  //
4
4
 
5
+ .accordion {
6
+ // scss-docs-start accordion-css-vars
7
+ --#{$prefix}accordion-color: #{color-contrast($accordion-bg)};
8
+ --#{$prefix}accordion-bg: #{$accordion-bg};
9
+ --#{$prefix}accordion-transition: #{$accordion-transition};
10
+ --#{$prefix}accordion-border-color: #{$accordion-border-color};
11
+ --#{$prefix}accordion-border-width: #{$accordion-border-width};
12
+ --#{$prefix}accordion-border-radius: #{$accordion-border-radius};
13
+ --#{$prefix}accordion-inner-border-radius: #{$accordion-inner-border-radius};
14
+ --#{$prefix}accordion-btn-padding-x: #{$accordion-button-padding-x};
15
+ --#{$prefix}accordion-btn-padding-y: #{$accordion-button-padding-y};
16
+ --#{$prefix}accordion-btn-color: #{$accordion-color};
17
+ --#{$prefix}accordion-btn-bg: #{$accordion-button-bg};
18
+ --#{$prefix}accordion-btn-icon: #{escape-svg($accordion-button-icon)};
19
+ --#{$prefix}accordion-btn-icon-width: #{$accordion-icon-width};
20
+ --#{$prefix}accordion-btn-icon-transform: #{$accordion-icon-transform};
21
+ --#{$prefix}accordion-btn-icon-transition: #{$accordion-icon-transition};
22
+ --#{$prefix}accordion-btn-active-icon: #{escape-svg($accordion-button-active-icon)};
23
+ --#{$prefix}accordion-btn-focus-border-color: #{$accordion-button-focus-border-color};
24
+ --#{$prefix}accordion-btn-focus-box-shadow: #{$accordion-button-focus-box-shadow};
25
+ --#{$prefix}accordion-body-padding-x: #{$accordion-body-padding-x};
26
+ --#{$prefix}accordion-body-padding-y: #{$accordion-body-padding-y};
27
+ --#{$prefix}accordion-active-color: #{$accordion-button-active-color};
28
+ --#{$prefix}accordion-active-bg: #{$accordion-button-active-bg};
29
+ // scss-docs-end accordion-css-vars
30
+ }
31
+
5
32
  .accordion-button {
6
33
  position: relative;
7
34
  display: flex;
8
35
  align-items: center;
9
36
  width: 100%;
10
- padding: $accordion-button-padding-y $accordion-button-padding-x;
37
+ padding: var(--#{$prefix}accordion-btn-padding-y) var(--#{$prefix}accordion-btn-padding-x);
11
38
  @include font-size($font-size-base);
12
- color: $accordion-button-color;
39
+ color: var(--#{$prefix}accordion-btn-color);
13
40
  text-align: left; // Reset button style
14
- background-color: $accordion-button-bg;
41
+ background-color: var(--#{$prefix}accordion-btn-bg);
15
42
  border: 0;
16
43
  @include border-radius(0);
17
44
  overflow-anchor: none;
18
- @include transition($accordion-transition);
45
+ @include transition(var(--#{$prefix}accordion-transition));
19
46
 
20
47
  &:not(.collapsed) {
21
- color: $accordion-button-active-color;
22
- background-color: $accordion-button-active-bg;
23
- box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;
48
+ color: var(--#{$prefix}accordion-active-color);
49
+ background-color: var(--#{$prefix}accordion-active-bg);
50
+ box-shadow: inset 0 calc(var(--#{$prefix}accordion-border-width) * -1) 0 var(--#{$prefix}accordion-border-color); // stylelint-disable-line function-disallowed-list
24
51
 
25
52
  &::after {
26
- background-image: escape-svg($accordion-button-active-icon);
27
- transform: $accordion-icon-transform;
53
+ background-image: var(--#{$prefix}accordion-btn-active-icon);
54
+ transform: var(--#{$prefix}accordion-btn-icon-transform);
28
55
  }
29
56
  }
30
57
 
31
58
  // Accordion icon
32
59
  &::after {
33
60
  flex-shrink: 0;
34
- width: $accordion-icon-width;
35
- height: $accordion-icon-width;
61
+ width: var(--#{$prefix}accordion-btn-icon-width);
62
+ height: var(--#{$prefix}accordion-btn-icon-width);
36
63
  margin-left: auto;
37
64
  content: "";
38
- background-image: escape-svg($accordion-button-icon);
65
+ background-image: var(--#{$prefix}accordion-btn-icon);
39
66
  background-repeat: no-repeat;
40
- background-size: $accordion-icon-width;
41
- @include transition($accordion-icon-transition);
67
+ background-size: var(--#{$prefix}accordion-btn-icon-width);
68
+ @include transition(var(--#{$prefix}accordion-btn-icon-transition));
42
69
  }
43
70
 
44
71
  &:hover {
@@ -47,9 +74,9 @@
47
74
 
48
75
  &:focus {
49
76
  z-index: 3;
50
- border-color: $accordion-button-focus-border-color;
77
+ border-color: var(--#{$prefix}accordion-btn-focus-border-color);
51
78
  outline: 0;
52
- box-shadow: $accordion-button-focus-box-shadow;
79
+ box-shadow: var(--#{$prefix}accordion-btn-focus-box-shadow);
53
80
  }
54
81
  }
55
82
 
@@ -58,14 +85,15 @@
58
85
  }
59
86
 
60
87
  .accordion-item {
61
- background-color: $accordion-bg;
62
- border: $accordion-border-width solid $accordion-border-color;
88
+ color: var(--#{$prefix}accordion-color);
89
+ background-color: var(--#{$prefix}accordion-bg);
90
+ border: var(--#{$prefix}accordion-border-width) solid var(--#{$prefix}accordion-border-color);
63
91
 
64
92
  &:first-of-type {
65
- @include border-top-radius($accordion-border-radius);
93
+ @include border-top-radius(var(--#{$prefix}accordion-border-radius));
66
94
 
67
95
  .accordion-button {
68
- @include border-top-radius($accordion-inner-border-radius);
96
+ @include border-top-radius(var(--#{$prefix}accordion-inner-border-radius));
69
97
  }
70
98
  }
71
99
 
@@ -75,22 +103,22 @@
75
103
 
76
104
  // Only set a border-radius on the last item if the accordion is collapsed
77
105
  &:last-of-type {
78
- @include border-bottom-radius($accordion-border-radius);
106
+ @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));
79
107
 
80
108
  .accordion-button {
81
109
  &.collapsed {
82
- @include border-bottom-radius($accordion-inner-border-radius);
110
+ @include border-bottom-radius(var(--#{$prefix}accordion-inner-border-radius));
83
111
  }
84
112
  }
85
113
 
86
114
  .accordion-collapse {
87
- @include border-bottom-radius($accordion-border-radius);
115
+ @include border-bottom-radius(var(--#{$prefix}accordion-border-radius));
88
116
  }
89
117
  }
90
118
  }
91
119
 
92
120
  .accordion-body {
93
- padding: $accordion-body-padding-y $accordion-body-padding-x;
121
+ padding: var(--#{$prefix}accordion-body-padding-y) var(--#{$prefix}accordion-body-padding-x);
94
122
  }
95
123
 
96
124
 
package/scss/_alert.scss CHANGED
@@ -3,11 +3,24 @@
3
3
  //
4
4
 
5
5
  .alert {
6
+ // scss-docs-start alert-css-vars
7
+ --#{$prefix}alert-bg: transparent;
8
+ --#{$prefix}alert-padding-x: #{$alert-padding-x};
9
+ --#{$prefix}alert-padding-y: #{$alert-padding-y};
10
+ --#{$prefix}alert-margin-bottom: #{$alert-margin-bottom};
11
+ --#{$prefix}alert-color: inherit;
12
+ --#{$prefix}alert-border-color: transparent;
13
+ --#{$prefix}alert-border: #{$alert-border-width} solid var(--#{$prefix}alert-border-color);
14
+ --#{$prefix}alert-border-radius: #{$alert-border-radius};
15
+ // scss-docs-end alert-css-vars
16
+
6
17
  position: relative;
7
- padding: $alert-padding-y $alert-padding-x;
8
- margin-bottom: $alert-margin-bottom;
9
- border: $alert-border-width solid transparent;
10
- @include border-radius($alert-border-radius);
18
+ padding: var(--#{$prefix}alert-padding-y) var(--#{$prefix}alert-padding-x);
19
+ margin-bottom: var(--#{$prefix}alert-margin-bottom);
20
+ color: var(--#{$prefix}alert-color);
21
+ background-color: var(--#{$prefix}alert-bg);
22
+ border: var(--#{$prefix}alert-border);
23
+ @include border-radius(var(--#{$prefix}alert-border-radius));
11
24
  }
12
25
 
13
26
  // Headings for larger alerts
@@ -47,6 +60,7 @@
47
60
  $alert-background: shift-color($value, $alert-bg-scale);
48
61
  $alert-border: shift-color($value, $alert-border-scale);
49
62
  $alert-color: shift-color($value, $alert-color-scale);
63
+
50
64
  @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
51
65
  $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
52
66
  }
package/scss/_badge.scss CHANGED
@@ -4,16 +4,25 @@
4
4
  // `background-color`.
5
5
 
6
6
  .badge {
7
+ // scss-docs-start badge-css-vars
8
+ --#{$prefix}badge-padding-x: #{$badge-padding-x};
9
+ --#{$prefix}badge-padding-y: #{$badge-padding-y};
10
+ @include rfs($badge-font-size, --#{$prefix}badge-font-size);
11
+ --#{$prefix}badge-font-weight: #{$badge-font-weight};
12
+ --#{$prefix}badge-color: #{$badge-color};
13
+ --#{$prefix}badge-border-radius: #{$badge-border-radius};
14
+ // scss-docs-end badge-css-vars
15
+
7
16
  display: inline-block;
8
- padding: $badge-padding-y $badge-padding-x;
9
- @include font-size($badge-font-size);
10
- font-weight: $badge-font-weight;
17
+ padding: var(--#{$prefix}badge-padding-y) var(--#{$prefix}badge-padding-x);
18
+ @include font-size(var(--#{$prefix}badge-font-size));
19
+ font-weight: var(--#{$prefix}badge-font-weight);
11
20
  line-height: 1;
12
- color: $badge-color;
21
+ color: var(--#{$prefix}badge-color);
13
22
  text-align: center;
14
23
  white-space: nowrap;
15
24
  vertical-align: baseline;
16
- @include border-radius($badge-border-radius);
25
+ @include border-radius(var(--#{$prefix}badge-border-radius));
17
26
  @include gradient-bg();
18
27
 
19
28
  // Empty badges collapse automatically