@iamproperty/components 3.4.7 → 3.5.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 (210) hide show
  1. package/assets/bootstrap/LICENSE +22 -0
  2. package/assets/bootstrap/README.md +246 -0
  3. package/assets/bootstrap/js/src/alert.js +87 -0
  4. package/assets/bootstrap/js/src/base-component.js +85 -0
  5. package/assets/bootstrap/js/src/button.js +72 -0
  6. package/assets/bootstrap/js/src/carousel.js +475 -0
  7. package/assets/bootstrap/js/src/collapse.js +302 -0
  8. package/assets/bootstrap/js/src/dom/data.js +55 -0
  9. package/assets/bootstrap/js/src/dom/event-handler.js +320 -0
  10. package/assets/bootstrap/js/src/dom/manipulator.js +71 -0
  11. package/assets/bootstrap/js/src/dom/selector-engine.js +83 -0
  12. package/assets/bootstrap/js/src/dropdown.js +454 -0
  13. package/assets/bootstrap/js/src/modal.js +377 -0
  14. package/assets/bootstrap/js/src/offcanvas.js +283 -0
  15. package/assets/bootstrap/js/src/popover.js +97 -0
  16. package/assets/bootstrap/js/src/scrollspy.js +294 -0
  17. package/assets/bootstrap/js/src/tab.js +305 -0
  18. package/assets/bootstrap/js/src/toast.js +225 -0
  19. package/assets/bootstrap/js/src/tooltip.js +633 -0
  20. package/assets/bootstrap/js/src/util/backdrop.js +149 -0
  21. package/assets/bootstrap/js/src/util/component-functions.js +34 -0
  22. package/assets/bootstrap/js/src/util/config.js +66 -0
  23. package/assets/bootstrap/js/src/util/focustrap.js +115 -0
  24. package/assets/bootstrap/js/src/util/index.js +336 -0
  25. package/assets/bootstrap/js/src/util/sanitizer.js +118 -0
  26. package/assets/bootstrap/js/src/util/scrollbar.js +114 -0
  27. package/assets/bootstrap/js/src/util/swipe.js +146 -0
  28. package/assets/bootstrap/js/src/util/template-factory.js +160 -0
  29. package/assets/bootstrap/package.json +181 -0
  30. package/assets/bootstrap/scss/_accordion.scss +149 -0
  31. package/assets/bootstrap/scss/_alert.scss +71 -0
  32. package/assets/bootstrap/scss/_badge.scss +38 -0
  33. package/assets/bootstrap/scss/_breadcrumb.scss +40 -0
  34. package/assets/bootstrap/scss/_button-group.scss +142 -0
  35. package/assets/bootstrap/scss/_buttons.scss +207 -0
  36. package/assets/bootstrap/scss/_card.scss +234 -0
  37. package/assets/bootstrap/scss/_carousel.scss +226 -0
  38. package/assets/bootstrap/scss/_close.scss +40 -0
  39. package/assets/bootstrap/scss/_containers.scss +41 -0
  40. package/assets/bootstrap/scss/_dropdown.scss +249 -0
  41. package/assets/bootstrap/scss/_forms.scss +9 -0
  42. package/assets/bootstrap/scss/_functions.scss +302 -0
  43. package/assets/bootstrap/scss/_grid.scss +33 -0
  44. package/assets/bootstrap/scss/_helpers.scss +10 -0
  45. package/assets/bootstrap/scss/_images.scss +42 -0
  46. package/assets/bootstrap/scss/_list-group.scss +192 -0
  47. package/assets/bootstrap/scss/_maps.scss +54 -0
  48. package/assets/bootstrap/scss/_mixins.scss +43 -0
  49. package/assets/bootstrap/scss/_modal.scss +237 -0
  50. package/assets/bootstrap/scss/_nav.scss +172 -0
  51. package/assets/bootstrap/scss/_navbar.scss +278 -0
  52. package/assets/bootstrap/scss/_offcanvas.scss +144 -0
  53. package/assets/bootstrap/scss/_pagination.scss +109 -0
  54. package/assets/bootstrap/scss/_placeholders.scss +51 -0
  55. package/assets/bootstrap/scss/_popover.scss +196 -0
  56. package/assets/bootstrap/scss/_progress.scss +59 -0
  57. package/assets/bootstrap/scss/_reboot.scss +610 -0
  58. package/assets/bootstrap/scss/_root.scss +73 -0
  59. package/assets/bootstrap/scss/_spinners.scss +85 -0
  60. package/assets/bootstrap/scss/_tables.scss +164 -0
  61. package/assets/bootstrap/scss/_toasts.scss +73 -0
  62. package/assets/bootstrap/scss/_tooltip.scss +120 -0
  63. package/assets/bootstrap/scss/_transitions.scss +27 -0
  64. package/assets/bootstrap/scss/_type.scss +106 -0
  65. package/assets/bootstrap/scss/_utilities.scss +647 -0
  66. package/assets/bootstrap/scss/_variables.scss +1634 -0
  67. package/assets/bootstrap/scss/bootstrap-grid.scss +64 -0
  68. package/assets/bootstrap/scss/bootstrap-reboot.scss +9 -0
  69. package/assets/bootstrap/scss/bootstrap-utilities.scss +18 -0
  70. package/assets/bootstrap/scss/bootstrap.scss +51 -0
  71. package/assets/bootstrap/scss/forms/_floating-labels.scss +75 -0
  72. package/assets/bootstrap/scss/forms/_form-check.scss +175 -0
  73. package/assets/bootstrap/scss/forms/_form-control.scss +194 -0
  74. package/assets/bootstrap/scss/forms/_form-range.scss +91 -0
  75. package/assets/bootstrap/scss/forms/_form-select.scss +71 -0
  76. package/assets/bootstrap/scss/forms/_form-text.scss +11 -0
  77. package/assets/bootstrap/scss/forms/_input-group.scss +132 -0
  78. package/assets/bootstrap/scss/forms/_labels.scss +36 -0
  79. package/assets/bootstrap/scss/forms/_validation.scss +12 -0
  80. package/assets/bootstrap/scss/helpers/_clearfix.scss +3 -0
  81. package/assets/bootstrap/scss/helpers/_color-bg.scss +10 -0
  82. package/assets/bootstrap/scss/helpers/_colored-links.scss +12 -0
  83. package/assets/bootstrap/scss/helpers/_position.scss +36 -0
  84. package/assets/bootstrap/scss/helpers/_ratio.scss +26 -0
  85. package/assets/bootstrap/scss/helpers/_stacks.scss +15 -0
  86. package/assets/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  87. package/assets/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  88. package/assets/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  89. package/assets/bootstrap/scss/helpers/_vr.scss +8 -0
  90. package/assets/bootstrap/scss/mixins/_alert.scss +15 -0
  91. package/assets/bootstrap/scss/mixins/_backdrop.scss +14 -0
  92. package/assets/bootstrap/scss/mixins/_banner.scss +9 -0
  93. package/assets/bootstrap/scss/mixins/_border-radius.scss +78 -0
  94. package/assets/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  95. package/assets/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  96. package/assets/bootstrap/scss/mixins/_buttons.scss +70 -0
  97. package/assets/bootstrap/scss/mixins/_caret.scss +64 -0
  98. package/assets/bootstrap/scss/mixins/_clearfix.scss +9 -0
  99. package/assets/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  100. package/assets/bootstrap/scss/mixins/_container.scss +11 -0
  101. package/assets/bootstrap/scss/mixins/_deprecate.scss +10 -0
  102. package/assets/bootstrap/scss/mixins/_forms.scss +152 -0
  103. package/assets/bootstrap/scss/mixins/_gradients.scss +47 -0
  104. package/assets/bootstrap/scss/mixins/_grid.scss +151 -0
  105. package/assets/bootstrap/scss/mixins/_image.scss +16 -0
  106. package/assets/bootstrap/scss/mixins/_list-group.scss +24 -0
  107. package/assets/bootstrap/scss/mixins/_lists.scss +7 -0
  108. package/assets/bootstrap/scss/mixins/_pagination.scss +10 -0
  109. package/assets/bootstrap/scss/mixins/_reset-text.scss +17 -0
  110. package/assets/bootstrap/scss/mixins/_resize.scss +6 -0
  111. package/assets/bootstrap/scss/mixins/_table-variants.scss +24 -0
  112. package/assets/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  113. package/assets/bootstrap/scss/mixins/_transition.scss +26 -0
  114. package/assets/bootstrap/scss/mixins/_utilities.scss +97 -0
  115. package/assets/bootstrap/scss/mixins/_visually-hidden.scss +29 -0
  116. package/assets/bootstrap/scss/utilities/_api.scss +47 -0
  117. package/assets/bootstrap/scss/vendor/_rfs.scss +354 -0
  118. package/assets/css/components/accordion.css +1 -1
  119. package/assets/css/components/accordion.css.map +1 -1
  120. package/assets/css/components/admin-panel.css +1 -0
  121. package/assets/css/components/admin-panel.css.map +1 -0
  122. package/assets/css/components/alert.css +1 -1
  123. package/assets/css/components/alert.css.map +1 -1
  124. package/assets/css/components/carousel.css +1 -1
  125. package/assets/css/components/carousel.css.map +1 -1
  126. package/assets/css/components/charts.css +1 -1
  127. package/assets/css/components/charts.css.map +1 -1
  128. package/assets/css/components/container.css.map +1 -1
  129. package/assets/css/components/dialog.css +1 -1
  130. package/assets/css/components/dialog.css.map +1 -1
  131. package/assets/css/components/forms.css.map +1 -1
  132. package/assets/css/components/header.css +1 -1
  133. package/assets/css/components/header.css.map +1 -1
  134. package/assets/css/components/lists.css +1 -1
  135. package/assets/css/components/lists.css.map +1 -1
  136. package/assets/css/components/nav.css +1 -1
  137. package/assets/css/components/nav.css.map +1 -1
  138. package/assets/css/components/pagination.css.map +1 -1
  139. package/assets/css/components/property-searchbar.css +1 -1
  140. package/assets/css/components/property-searchbar.css.map +1 -1
  141. package/assets/css/components/stepper.css +1 -1
  142. package/assets/css/components/stepper.css.map +1 -1
  143. package/assets/css/components/table.css +1 -1
  144. package/assets/css/components/table.css.map +1 -1
  145. package/assets/css/components/tabs.css +1 -1
  146. package/assets/css/components/tabs.css.map +1 -1
  147. package/assets/css/components/tooltips.css +1 -1
  148. package/assets/css/components/tooltips.css.map +1 -1
  149. package/assets/css/core.min.css +1 -1
  150. package/assets/css/core.min.css.map +1 -1
  151. package/assets/css/style.min.css +1 -1
  152. package/assets/css/style.min.css.map +1 -1
  153. package/assets/js/components/accordion/accordion.component.min.js +1 -1
  154. package/assets/js/components/card/card.component.min.js +1 -1
  155. package/assets/js/components/filterlist/filterlist.component.min.js +1 -1
  156. package/assets/js/components/header/header.component.min.js +5 -5
  157. package/assets/js/components/table/table.component.js +4 -0
  158. package/assets/js/components/table/table.component.min.js +5 -5
  159. package/assets/js/components/table/table.component.min.js.map +1 -1
  160. package/assets/js/components/tabs/tabs.component.min.js +5 -5
  161. package/assets/js/dynamic.min.js +2 -2
  162. package/assets/js/dynamic.min.js.map +1 -1
  163. package/assets/js/modules/helpers.js +31 -6
  164. package/assets/js/modules/table.js +4 -5
  165. package/assets/js/scripts.bundle.js +31 -31
  166. package/assets/js/scripts.bundle.js.map +1 -1
  167. package/assets/js/scripts.bundle.min.js +2 -2
  168. package/assets/js/scripts.bundle.min.js.map +1 -1
  169. package/assets/js/tests/table.spec.js +3 -1
  170. package/assets/sass/_corefiles.scss +15 -15
  171. package/assets/sass/_forms.scss +7 -7
  172. package/assets/sass/_functions/functions.scss +1 -1
  173. package/assets/sass/_functions/mixins.scss +19 -21
  174. package/assets/sass/_functions/utilities.scss +51 -9
  175. package/assets/sass/_functions/variables.scss +77 -37
  176. package/assets/sass/_tests/colours.spec.scss +8 -22
  177. package/assets/sass/components/accordion.scss +13 -0
  178. package/assets/sass/components/admin-panel.scss +106 -0
  179. package/assets/sass/components/alert.scss +22 -0
  180. package/assets/sass/components/carousel.scss +72 -0
  181. package/assets/sass/components/charts.scss +37 -1
  182. package/assets/sass/components/container.scss +1 -1
  183. package/assets/sass/components/dialog.scss +7 -1
  184. package/assets/sass/components/lists.scss +14 -0
  185. package/assets/sass/components/nav.scss +1 -1
  186. package/assets/sass/components/pagination.scss +1 -1
  187. package/assets/sass/components/stepper.scss +3 -3
  188. package/assets/sass/components/table.scss +19 -15
  189. package/assets/sass/components/tabs.scss +20 -7
  190. package/assets/sass/components/tooltips.scss +1 -1
  191. package/assets/sass/foundations/buttons.scss +366 -0
  192. package/assets/sass/foundations/links.scss +75 -75
  193. package/assets/sass/foundations/media.scss +1 -1
  194. package/assets/sass/foundations/reboot.scss +3 -5
  195. package/assets/sass/foundations/root.scss +9 -29
  196. package/assets/sass/foundations/type.scss +1 -1
  197. package/assets/ts/components/table/table.component.ts +5 -0
  198. package/assets/ts/modules/helpers.ts +49 -8
  199. package/assets/ts/modules/table.ts +6 -6
  200. package/assets/ts/tests/table.spec.ts +4 -1
  201. package/dist/components.es.js +46 -42
  202. package/dist/components.umd.js +4 -4
  203. package/dist/style.css +1 -1
  204. package/package.json +2 -1
  205. package/assets/css/components/buttons.css +0 -1
  206. package/assets/css/components/buttons.css.map +0 -1
  207. package/assets/css/components/panel.css +0 -1
  208. package/assets/css/components/panel.css.map +0 -1
  209. package/assets/sass/components/buttons.scss +0 -252
  210. package/assets/sass/components/panel.scss +0 -161
@@ -0,0 +1,71 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): dom/manipulator.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ function normalizeData(value) {
9
+ if (value === 'true') {
10
+ return true
11
+ }
12
+
13
+ if (value === 'false') {
14
+ return false
15
+ }
16
+
17
+ if (value === Number(value).toString()) {
18
+ return Number(value)
19
+ }
20
+
21
+ if (value === '' || value === 'null') {
22
+ return null
23
+ }
24
+
25
+ if (typeof value !== 'string') {
26
+ return value
27
+ }
28
+
29
+ try {
30
+ return JSON.parse(decodeURIComponent(value))
31
+ } catch {
32
+ return value
33
+ }
34
+ }
35
+
36
+ function normalizeDataKey(key) {
37
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
38
+ }
39
+
40
+ const Manipulator = {
41
+ setDataAttribute(element, key, value) {
42
+ element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)
43
+ },
44
+
45
+ removeDataAttribute(element, key) {
46
+ element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)
47
+ },
48
+
49
+ getDataAttributes(element) {
50
+ if (!element) {
51
+ return {}
52
+ }
53
+
54
+ const attributes = {}
55
+ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))
56
+
57
+ for (const key of bsKeys) {
58
+ let pureKey = key.replace(/^bs/, '')
59
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
60
+ attributes[pureKey] = normalizeData(element.dataset[key])
61
+ }
62
+
63
+ return attributes
64
+ },
65
+
66
+ getDataAttribute(element, key) {
67
+ return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
68
+ }
69
+ }
70
+
71
+ export default Manipulator
@@ -0,0 +1,83 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): dom/selector-engine.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { isDisabled, isVisible } from '../util/index'
9
+
10
+ /**
11
+ * Constants
12
+ */
13
+
14
+ const SelectorEngine = {
15
+ find(selector, element = document.documentElement) {
16
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector))
17
+ },
18
+
19
+ findOne(selector, element = document.documentElement) {
20
+ return Element.prototype.querySelector.call(element, selector)
21
+ },
22
+
23
+ children(element, selector) {
24
+ return [].concat(...element.children).filter(child => child.matches(selector))
25
+ },
26
+
27
+ parents(element, selector) {
28
+ const parents = []
29
+ let ancestor = element.parentNode.closest(selector)
30
+
31
+ while (ancestor) {
32
+ parents.push(ancestor)
33
+ ancestor = ancestor.parentNode.closest(selector)
34
+ }
35
+
36
+ return parents
37
+ },
38
+
39
+ prev(element, selector) {
40
+ let previous = element.previousElementSibling
41
+
42
+ while (previous) {
43
+ if (previous.matches(selector)) {
44
+ return [previous]
45
+ }
46
+
47
+ previous = previous.previousElementSibling
48
+ }
49
+
50
+ return []
51
+ },
52
+ // TODO: this is now unused; remove later along with prev()
53
+ next(element, selector) {
54
+ let next = element.nextElementSibling
55
+
56
+ while (next) {
57
+ if (next.matches(selector)) {
58
+ return [next]
59
+ }
60
+
61
+ next = next.nextElementSibling
62
+ }
63
+
64
+ return []
65
+ },
66
+
67
+ focusableChildren(element) {
68
+ const focusables = [
69
+ 'a',
70
+ 'button',
71
+ 'input',
72
+ 'textarea',
73
+ 'select',
74
+ 'details',
75
+ '[tabindex]',
76
+ '[contenteditable="true"]'
77
+ ].map(selector => `${selector}:not([tabindex^="-"])`).join(',')
78
+
79
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))
80
+ }
81
+ }
82
+
83
+ export default SelectorEngine
@@ -0,0 +1,454 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): dropdown.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import * as Popper from '@popperjs/core'
9
+ import {
10
+ defineJQueryPlugin,
11
+ getElement,
12
+ getNextActiveElement,
13
+ isDisabled,
14
+ isElement,
15
+ isRTL,
16
+ isVisible,
17
+ noop
18
+ } from './util/index'
19
+ import EventHandler from './dom/event-handler'
20
+ import Manipulator from './dom/manipulator'
21
+ import SelectorEngine from './dom/selector-engine'
22
+ import BaseComponent from './base-component'
23
+
24
+ /**
25
+ * Constants
26
+ */
27
+
28
+ const NAME = 'dropdown'
29
+ const DATA_KEY = 'bs.dropdown'
30
+ const EVENT_KEY = `.${DATA_KEY}`
31
+ const DATA_API_KEY = '.data-api'
32
+
33
+ const ESCAPE_KEY = 'Escape'
34
+ const TAB_KEY = 'Tab'
35
+ const ARROW_UP_KEY = 'ArrowUp'
36
+ const ARROW_DOWN_KEY = 'ArrowDown'
37
+ const RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button
38
+
39
+ const EVENT_HIDE = `hide${EVENT_KEY}`
40
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
41
+ const EVENT_SHOW = `show${EVENT_KEY}`
42
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
43
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
44
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
45
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
46
+
47
+ const CLASS_NAME_SHOW = 'show'
48
+ const CLASS_NAME_DROPUP = 'dropup'
49
+ const CLASS_NAME_DROPEND = 'dropend'
50
+ const CLASS_NAME_DROPSTART = 'dropstart'
51
+ const CLASS_NAME_DROPUP_CENTER = 'dropup-center'
52
+ const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'
53
+
54
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'
55
+ const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`
56
+ const SELECTOR_MENU = '.dropdown-menu'
57
+ const SELECTOR_NAVBAR = '.navbar'
58
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav'
59
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
60
+
61
+ const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'
62
+ const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'
63
+ const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'
64
+ const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'
65
+ const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'
66
+ const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'
67
+ const PLACEMENT_TOPCENTER = 'top'
68
+ const PLACEMENT_BOTTOMCENTER = 'bottom'
69
+
70
+ const Default = {
71
+ autoClose: true,
72
+ boundary: 'clippingParents',
73
+ display: 'dynamic',
74
+ offset: [0, 2],
75
+ popperConfig: null,
76
+ reference: 'toggle'
77
+ }
78
+
79
+ const DefaultType = {
80
+ autoClose: '(boolean|string)',
81
+ boundary: '(string|element)',
82
+ display: 'string',
83
+ offset: '(array|string|function)',
84
+ popperConfig: '(null|object|function)',
85
+ reference: '(string|element|object)'
86
+ }
87
+
88
+ /**
89
+ * Class definition
90
+ */
91
+
92
+ class Dropdown extends BaseComponent {
93
+ constructor(element, config) {
94
+ super(element, config)
95
+
96
+ this._popper = null
97
+ this._parent = this._element.parentNode // dropdown wrapper
98
+ // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
99
+ this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||
100
+ SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||
101
+ SelectorEngine.findOne(SELECTOR_MENU, this._parent)
102
+ this._inNavbar = this._detectNavbar()
103
+ }
104
+
105
+ // Getters
106
+ static get Default() {
107
+ return Default
108
+ }
109
+
110
+ static get DefaultType() {
111
+ return DefaultType
112
+ }
113
+
114
+ static get NAME() {
115
+ return NAME
116
+ }
117
+
118
+ // Public
119
+ toggle() {
120
+ return this._isShown() ? this.hide() : this.show()
121
+ }
122
+
123
+ show() {
124
+ if (isDisabled(this._element) || this._isShown()) {
125
+ return
126
+ }
127
+
128
+ const relatedTarget = {
129
+ relatedTarget: this._element
130
+ }
131
+
132
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)
133
+
134
+ if (showEvent.defaultPrevented) {
135
+ return
136
+ }
137
+
138
+ this._createPopper()
139
+
140
+ // If this is a touch-enabled device we add extra
141
+ // empty mouseover listeners to the body's immediate children;
142
+ // only needed because of broken event delegation on iOS
143
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
144
+ if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
145
+ for (const element of [].concat(...document.body.children)) {
146
+ EventHandler.on(element, 'mouseover', noop)
147
+ }
148
+ }
149
+
150
+ this._element.focus()
151
+ this._element.setAttribute('aria-expanded', true)
152
+
153
+ this._menu.classList.add(CLASS_NAME_SHOW)
154
+ this._element.classList.add(CLASS_NAME_SHOW)
155
+ EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)
156
+ }
157
+
158
+ hide() {
159
+ if (isDisabled(this._element) || !this._isShown()) {
160
+ return
161
+ }
162
+
163
+ const relatedTarget = {
164
+ relatedTarget: this._element
165
+ }
166
+
167
+ this._completeHide(relatedTarget)
168
+ }
169
+
170
+ dispose() {
171
+ if (this._popper) {
172
+ this._popper.destroy()
173
+ }
174
+
175
+ super.dispose()
176
+ }
177
+
178
+ update() {
179
+ this._inNavbar = this._detectNavbar()
180
+ if (this._popper) {
181
+ this._popper.update()
182
+ }
183
+ }
184
+
185
+ // Private
186
+ _completeHide(relatedTarget) {
187
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)
188
+ if (hideEvent.defaultPrevented) {
189
+ return
190
+ }
191
+
192
+ // If this is a touch-enabled device we remove the extra
193
+ // empty mouseover listeners we added for iOS support
194
+ if ('ontouchstart' in document.documentElement) {
195
+ for (const element of [].concat(...document.body.children)) {
196
+ EventHandler.off(element, 'mouseover', noop)
197
+ }
198
+ }
199
+
200
+ if (this._popper) {
201
+ this._popper.destroy()
202
+ }
203
+
204
+ this._menu.classList.remove(CLASS_NAME_SHOW)
205
+ this._element.classList.remove(CLASS_NAME_SHOW)
206
+ this._element.setAttribute('aria-expanded', 'false')
207
+ Manipulator.removeDataAttribute(this._menu, 'popper')
208
+ EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)
209
+ }
210
+
211
+ _getConfig(config) {
212
+ config = super._getConfig(config)
213
+
214
+ if (typeof config.reference === 'object' && !isElement(config.reference) &&
215
+ typeof config.reference.getBoundingClientRect !== 'function'
216
+ ) {
217
+ // Popper virtual elements require a getBoundingClientRect method
218
+ throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`)
219
+ }
220
+
221
+ return config
222
+ }
223
+
224
+ _createPopper() {
225
+ if (typeof Popper === 'undefined') {
226
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)')
227
+ }
228
+
229
+ let referenceElement = this._element
230
+
231
+ if (this._config.reference === 'parent') {
232
+ referenceElement = this._parent
233
+ } else if (isElement(this._config.reference)) {
234
+ referenceElement = getElement(this._config.reference)
235
+ } else if (typeof this._config.reference === 'object') {
236
+ referenceElement = this._config.reference
237
+ }
238
+
239
+ const popperConfig = this._getPopperConfig()
240
+ this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)
241
+ }
242
+
243
+ _isShown() {
244
+ return this._menu.classList.contains(CLASS_NAME_SHOW)
245
+ }
246
+
247
+ _getPlacement() {
248
+ const parentDropdown = this._parent
249
+
250
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
251
+ return PLACEMENT_RIGHT
252
+ }
253
+
254
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
255
+ return PLACEMENT_LEFT
256
+ }
257
+
258
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
259
+ return PLACEMENT_TOPCENTER
260
+ }
261
+
262
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
263
+ return PLACEMENT_BOTTOMCENTER
264
+ }
265
+
266
+ // We need to trim the value because custom properties can also include spaces
267
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'
268
+
269
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
270
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP
271
+ }
272
+
273
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM
274
+ }
275
+
276
+ _detectNavbar() {
277
+ return this._element.closest(SELECTOR_NAVBAR) !== null
278
+ }
279
+
280
+ _getOffset() {
281
+ const { offset } = this._config
282
+
283
+ if (typeof offset === 'string') {
284
+ return offset.split(',').map(value => Number.parseInt(value, 10))
285
+ }
286
+
287
+ if (typeof offset === 'function') {
288
+ return popperData => offset(popperData, this._element)
289
+ }
290
+
291
+ return offset
292
+ }
293
+
294
+ _getPopperConfig() {
295
+ const defaultBsPopperConfig = {
296
+ placement: this._getPlacement(),
297
+ modifiers: [{
298
+ name: 'preventOverflow',
299
+ options: {
300
+ boundary: this._config.boundary
301
+ }
302
+ },
303
+ {
304
+ name: 'offset',
305
+ options: {
306
+ offset: this._getOffset()
307
+ }
308
+ }]
309
+ }
310
+
311
+ // Disable Popper if we have a static display or Dropdown is in Navbar
312
+ if (this._inNavbar || this._config.display === 'static') {
313
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static') // todo:v6 remove
314
+ defaultBsPopperConfig.modifiers = [{
315
+ name: 'applyStyles',
316
+ enabled: false
317
+ }]
318
+ }
319
+
320
+ return {
321
+ ...defaultBsPopperConfig,
322
+ ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig)
323
+ }
324
+ }
325
+
326
+ _selectMenuItem({ key, target }) {
327
+ const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))
328
+
329
+ if (!items.length) {
330
+ return
331
+ }
332
+
333
+ // if target isn't included in items (e.g. when expanding the dropdown)
334
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
335
+ getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()
336
+ }
337
+
338
+ // Static
339
+ static jQueryInterface(config) {
340
+ return this.each(function () {
341
+ const data = Dropdown.getOrCreateInstance(this, config)
342
+
343
+ if (typeof config !== 'string') {
344
+ return
345
+ }
346
+
347
+ if (typeof data[config] === 'undefined') {
348
+ throw new TypeError(`No method named "${config}"`)
349
+ }
350
+
351
+ data[config]()
352
+ })
353
+ }
354
+
355
+ static clearMenus(event) {
356
+ if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {
357
+ return
358
+ }
359
+
360
+ const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)
361
+
362
+ for (const toggle of openToggles) {
363
+ const context = Dropdown.getInstance(toggle)
364
+ if (!context || context._config.autoClose === false) {
365
+ continue
366
+ }
367
+
368
+ const composedPath = event.composedPath()
369
+ const isMenuTarget = composedPath.includes(context._menu)
370
+ if (
371
+ composedPath.includes(context._element) ||
372
+ (context._config.autoClose === 'inside' && !isMenuTarget) ||
373
+ (context._config.autoClose === 'outside' && isMenuTarget)
374
+ ) {
375
+ continue
376
+ }
377
+
378
+ // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
379
+ if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {
380
+ continue
381
+ }
382
+
383
+ const relatedTarget = { relatedTarget: context._element }
384
+
385
+ if (event.type === 'click') {
386
+ relatedTarget.clickEvent = event
387
+ }
388
+
389
+ context._completeHide(relatedTarget)
390
+ }
391
+ }
392
+
393
+ static dataApiKeydownHandler(event) {
394
+ // If not an UP | DOWN | ESCAPE key => not a dropdown command
395
+ // If input/textarea && if key is other than ESCAPE => not a dropdown command
396
+
397
+ const isInput = /input|textarea/i.test(event.target.tagName)
398
+ const isEscapeEvent = event.key === ESCAPE_KEY
399
+ const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)
400
+
401
+ if (!isUpOrDownEvent && !isEscapeEvent) {
402
+ return
403
+ }
404
+
405
+ if (isInput && !isEscapeEvent) {
406
+ return
407
+ }
408
+
409
+ event.preventDefault()
410
+
411
+ // todo: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.2/forms/input-group/
412
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?
413
+ this :
414
+ (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||
415
+ SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||
416
+ SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))
417
+
418
+ const instance = Dropdown.getOrCreateInstance(getToggleButton)
419
+
420
+ if (isUpOrDownEvent) {
421
+ event.stopPropagation()
422
+ instance.show()
423
+ instance._selectMenuItem(event)
424
+ return
425
+ }
426
+
427
+ if (instance._isShown()) { // else is escape and we check if it is shown
428
+ event.stopPropagation()
429
+ instance.hide()
430
+ getToggleButton.focus()
431
+ }
432
+ }
433
+ }
434
+
435
+ /**
436
+ * Data API implementation
437
+ */
438
+
439
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)
440
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)
441
+ EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)
442
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)
443
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
444
+ event.preventDefault()
445
+ Dropdown.getOrCreateInstance(this).toggle()
446
+ })
447
+
448
+ /**
449
+ * jQuery
450
+ */
451
+
452
+ defineJQueryPlugin(Dropdown)
453
+
454
+ export default Dropdown