@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,97 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): popover.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { defineJQueryPlugin } from './util/index'
9
+ import Tooltip from './tooltip'
10
+
11
+ /**
12
+ * Constants
13
+ */
14
+
15
+ const NAME = 'popover'
16
+
17
+ const SELECTOR_TITLE = '.popover-header'
18
+ const SELECTOR_CONTENT = '.popover-body'
19
+
20
+ const Default = {
21
+ ...Tooltip.Default,
22
+ content: '',
23
+ offset: [0, 8],
24
+ placement: 'right',
25
+ template: '<div class="popover" role="tooltip">' +
26
+ '<div class="popover-arrow"></div>' +
27
+ '<h3 class="popover-header"></h3>' +
28
+ '<div class="popover-body"></div>' +
29
+ '</div>',
30
+ trigger: 'click'
31
+ }
32
+
33
+ const DefaultType = {
34
+ ...Tooltip.DefaultType,
35
+ content: '(null|string|element|function)'
36
+ }
37
+
38
+ /**
39
+ * Class definition
40
+ */
41
+
42
+ class Popover extends Tooltip {
43
+ // Getters
44
+ static get Default() {
45
+ return Default
46
+ }
47
+
48
+ static get DefaultType() {
49
+ return DefaultType
50
+ }
51
+
52
+ static get NAME() {
53
+ return NAME
54
+ }
55
+
56
+ // Overrides
57
+ _isWithContent() {
58
+ return this._getTitle() || this._getContent()
59
+ }
60
+
61
+ // Private
62
+ _getContentForTemplate() {
63
+ return {
64
+ [SELECTOR_TITLE]: this._getTitle(),
65
+ [SELECTOR_CONTENT]: this._getContent()
66
+ }
67
+ }
68
+
69
+ _getContent() {
70
+ return this._resolvePossibleFunction(this._config.content)
71
+ }
72
+
73
+ // Static
74
+ static jQueryInterface(config) {
75
+ return this.each(function () {
76
+ const data = Popover.getOrCreateInstance(this, config)
77
+
78
+ if (typeof config !== 'string') {
79
+ return
80
+ }
81
+
82
+ if (typeof data[config] === 'undefined') {
83
+ throw new TypeError(`No method named "${config}"`)
84
+ }
85
+
86
+ data[config]()
87
+ })
88
+ }
89
+ }
90
+
91
+ /**
92
+ * jQuery
93
+ */
94
+
95
+ defineJQueryPlugin(Popover)
96
+
97
+ export default Popover
@@ -0,0 +1,294 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): scrollspy.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index'
9
+ import EventHandler from './dom/event-handler'
10
+ import SelectorEngine from './dom/selector-engine'
11
+ import BaseComponent from './base-component'
12
+
13
+ /**
14
+ * Constants
15
+ */
16
+
17
+ const NAME = 'scrollspy'
18
+ const DATA_KEY = 'bs.scrollspy'
19
+ const EVENT_KEY = `.${DATA_KEY}`
20
+ const DATA_API_KEY = '.data-api'
21
+
22
+ const EVENT_ACTIVATE = `activate${EVENT_KEY}`
23
+ const EVENT_CLICK = `click${EVENT_KEY}`
24
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
25
+
26
+ const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'
27
+ const CLASS_NAME_ACTIVE = 'active'
28
+
29
+ const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'
30
+ const SELECTOR_TARGET_LINKS = '[href]'
31
+ const SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'
32
+ const SELECTOR_NAV_LINKS = '.nav-link'
33
+ const SELECTOR_NAV_ITEMS = '.nav-item'
34
+ const SELECTOR_LIST_ITEMS = '.list-group-item'
35
+ const SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`
36
+ const SELECTOR_DROPDOWN = '.dropdown'
37
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
38
+
39
+ const Default = {
40
+ offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons
41
+ rootMargin: '0px 0px -25%',
42
+ smoothScroll: false,
43
+ target: null,
44
+ threshold: [0.1, 0.5, 1]
45
+ }
46
+
47
+ const DefaultType = {
48
+ offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons
49
+ rootMargin: 'string',
50
+ smoothScroll: 'boolean',
51
+ target: 'element',
52
+ threshold: 'array'
53
+ }
54
+
55
+ /**
56
+ * Class definition
57
+ */
58
+
59
+ class ScrollSpy extends BaseComponent {
60
+ constructor(element, config) {
61
+ super(element, config)
62
+
63
+ // this._element is the observablesContainer and config.target the menu links wrapper
64
+ this._targetLinks = new Map()
65
+ this._observableSections = new Map()
66
+ this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element
67
+ this._activeTarget = null
68
+ this._observer = null
69
+ this._previousScrollData = {
70
+ visibleEntryTop: 0,
71
+ parentScrollTop: 0
72
+ }
73
+ this.refresh() // initialize
74
+ }
75
+
76
+ // Getters
77
+ static get Default() {
78
+ return Default
79
+ }
80
+
81
+ static get DefaultType() {
82
+ return DefaultType
83
+ }
84
+
85
+ static get NAME() {
86
+ return NAME
87
+ }
88
+
89
+ // Public
90
+ refresh() {
91
+ this._initializeTargetsAndObservables()
92
+ this._maybeEnableSmoothScroll()
93
+
94
+ if (this._observer) {
95
+ this._observer.disconnect()
96
+ } else {
97
+ this._observer = this._getNewObserver()
98
+ }
99
+
100
+ for (const section of this._observableSections.values()) {
101
+ this._observer.observe(section)
102
+ }
103
+ }
104
+
105
+ dispose() {
106
+ this._observer.disconnect()
107
+ super.dispose()
108
+ }
109
+
110
+ // Private
111
+ _configAfterMerge(config) {
112
+ // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case
113
+ config.target = getElement(config.target) || document.body
114
+
115
+ // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only
116
+ config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin
117
+
118
+ if (typeof config.threshold === 'string') {
119
+ config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))
120
+ }
121
+
122
+ return config
123
+ }
124
+
125
+ _maybeEnableSmoothScroll() {
126
+ if (!this._config.smoothScroll) {
127
+ return
128
+ }
129
+
130
+ // unregister any previous listeners
131
+ EventHandler.off(this._config.target, EVENT_CLICK)
132
+
133
+ EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {
134
+ const observableSection = this._observableSections.get(event.target.hash)
135
+ if (observableSection) {
136
+ event.preventDefault()
137
+ const root = this._rootElement || window
138
+ const height = observableSection.offsetTop - this._element.offsetTop
139
+ if (root.scrollTo) {
140
+ root.scrollTo({ top: height, behavior: 'smooth' })
141
+ return
142
+ }
143
+
144
+ // Chrome 60 doesn't support `scrollTo`
145
+ root.scrollTop = height
146
+ }
147
+ })
148
+ }
149
+
150
+ _getNewObserver() {
151
+ const options = {
152
+ root: this._rootElement,
153
+ threshold: this._config.threshold,
154
+ rootMargin: this._config.rootMargin
155
+ }
156
+
157
+ return new IntersectionObserver(entries => this._observerCallback(entries), options)
158
+ }
159
+
160
+ // The logic of selection
161
+ _observerCallback(entries) {
162
+ const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)
163
+ const activate = entry => {
164
+ this._previousScrollData.visibleEntryTop = entry.target.offsetTop
165
+ this._process(targetElement(entry))
166
+ }
167
+
168
+ const parentScrollTop = (this._rootElement || document.documentElement).scrollTop
169
+ const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop
170
+ this._previousScrollData.parentScrollTop = parentScrollTop
171
+
172
+ for (const entry of entries) {
173
+ if (!entry.isIntersecting) {
174
+ this._activeTarget = null
175
+ this._clearActiveClass(targetElement(entry))
176
+
177
+ continue
178
+ }
179
+
180
+ const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop
181
+ // if we are scrolling down, pick the bigger offsetTop
182
+ if (userScrollsDown && entryIsLowerThanPrevious) {
183
+ activate(entry)
184
+ // if parent isn't scrolled, let's keep the first visible item, breaking the iteration
185
+ if (!parentScrollTop) {
186
+ return
187
+ }
188
+
189
+ continue
190
+ }
191
+
192
+ // if we are scrolling up, pick the smallest offsetTop
193
+ if (!userScrollsDown && !entryIsLowerThanPrevious) {
194
+ activate(entry)
195
+ }
196
+ }
197
+ }
198
+
199
+ _initializeTargetsAndObservables() {
200
+ this._targetLinks = new Map()
201
+ this._observableSections = new Map()
202
+
203
+ const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)
204
+
205
+ for (const anchor of targetLinks) {
206
+ // ensure that the anchor has an id and is not disabled
207
+ if (!anchor.hash || isDisabled(anchor)) {
208
+ continue
209
+ }
210
+
211
+ const observableSection = SelectorEngine.findOne(anchor.hash, this._element)
212
+
213
+ // ensure that the observableSection exists & is visible
214
+ if (isVisible(observableSection)) {
215
+ this._targetLinks.set(anchor.hash, anchor)
216
+ this._observableSections.set(anchor.hash, observableSection)
217
+ }
218
+ }
219
+ }
220
+
221
+ _process(target) {
222
+ if (this._activeTarget === target) {
223
+ return
224
+ }
225
+
226
+ this._clearActiveClass(this._config.target)
227
+ this._activeTarget = target
228
+ target.classList.add(CLASS_NAME_ACTIVE)
229
+ this._activateParents(target)
230
+
231
+ EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })
232
+ }
233
+
234
+ _activateParents(target) {
235
+ // Activate dropdown parents
236
+ if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
237
+ SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))
238
+ .classList.add(CLASS_NAME_ACTIVE)
239
+ return
240
+ }
241
+
242
+ for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
243
+ // Set triggered links parents as active
244
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
245
+ for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
246
+ item.classList.add(CLASS_NAME_ACTIVE)
247
+ }
248
+ }
249
+ }
250
+
251
+ _clearActiveClass(parent) {
252
+ parent.classList.remove(CLASS_NAME_ACTIVE)
253
+
254
+ const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE}`, parent)
255
+ for (const node of activeNodes) {
256
+ node.classList.remove(CLASS_NAME_ACTIVE)
257
+ }
258
+ }
259
+
260
+ // Static
261
+ static jQueryInterface(config) {
262
+ return this.each(function () {
263
+ const data = ScrollSpy.getOrCreateInstance(this, config)
264
+
265
+ if (typeof config !== 'string') {
266
+ return
267
+ }
268
+
269
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
270
+ throw new TypeError(`No method named "${config}"`)
271
+ }
272
+
273
+ data[config]()
274
+ })
275
+ }
276
+ }
277
+
278
+ /**
279
+ * Data API implementation
280
+ */
281
+
282
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
283
+ for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
284
+ ScrollSpy.getOrCreateInstance(spy)
285
+ }
286
+ })
287
+
288
+ /**
289
+ * jQuery
290
+ */
291
+
292
+ defineJQueryPlugin(ScrollSpy)
293
+
294
+ export default ScrollSpy
@@ -0,0 +1,305 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): tab.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { defineJQueryPlugin, getElementFromSelector, getNextActiveElement, isDisabled } from './util/index'
9
+ import EventHandler from './dom/event-handler'
10
+ import SelectorEngine from './dom/selector-engine'
11
+ import BaseComponent from './base-component'
12
+
13
+ /**
14
+ * Constants
15
+ */
16
+
17
+ const NAME = 'tab'
18
+ const DATA_KEY = 'bs.tab'
19
+ const EVENT_KEY = `.${DATA_KEY}`
20
+
21
+ const EVENT_HIDE = `hide${EVENT_KEY}`
22
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
23
+ const EVENT_SHOW = `show${EVENT_KEY}`
24
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
25
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}`
26
+ const EVENT_KEYDOWN = `keydown${EVENT_KEY}`
27
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}`
28
+
29
+ const ARROW_LEFT_KEY = 'ArrowLeft'
30
+ const ARROW_RIGHT_KEY = 'ArrowRight'
31
+ const ARROW_UP_KEY = 'ArrowUp'
32
+ const ARROW_DOWN_KEY = 'ArrowDown'
33
+
34
+ const CLASS_NAME_ACTIVE = 'active'
35
+ const CLASS_NAME_FADE = 'fade'
36
+ const CLASS_NAME_SHOW = 'show'
37
+ const CLASS_DROPDOWN = 'dropdown'
38
+
39
+ const SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'
40
+ const SELECTOR_DROPDOWN_MENU = '.dropdown-menu'
41
+ const NOT_SELECTOR_DROPDOWN_TOGGLE = ':not(.dropdown-toggle)'
42
+
43
+ const SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]'
44
+ const SELECTOR_OUTER = '.nav-item, .list-group-item'
45
+ const SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`
46
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]' // todo:v6: could be only `tab`
47
+ const SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`
48
+
49
+ const SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`
50
+
51
+ /**
52
+ * Class definition
53
+ */
54
+
55
+ class Tab extends BaseComponent {
56
+ constructor(element) {
57
+ super(element)
58
+ this._parent = this._element.closest(SELECTOR_TAB_PANEL)
59
+
60
+ if (!this._parent) {
61
+ return
62
+ // todo: should Throw exception on v6
63
+ // throw new TypeError(`${element.outerHTML} has not a valid parent ${SELECTOR_INNER_ELEM}`)
64
+ }
65
+
66
+ // Set up initial aria attributes
67
+ this._setInitialAttributes(this._parent, this._getChildren())
68
+
69
+ EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))
70
+ }
71
+
72
+ // Getters
73
+ static get NAME() {
74
+ return NAME
75
+ }
76
+
77
+ // Public
78
+ show() { // Shows this elem and deactivate the active sibling if exists
79
+ const innerElem = this._element
80
+ if (this._elemIsActive(innerElem)) {
81
+ return
82
+ }
83
+
84
+ // Search for active tab on same parent to deactivate it
85
+ const active = this._getActiveElem()
86
+
87
+ const hideEvent = active ?
88
+ EventHandler.trigger(active, EVENT_HIDE, { relatedTarget: innerElem }) :
89
+ null
90
+
91
+ const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW, { relatedTarget: active })
92
+
93
+ if (showEvent.defaultPrevented || (hideEvent && hideEvent.defaultPrevented)) {
94
+ return
95
+ }
96
+
97
+ this._deactivate(active, innerElem)
98
+ this._activate(innerElem, active)
99
+ }
100
+
101
+ // Private
102
+ _activate(element, relatedElem) {
103
+ if (!element) {
104
+ return
105
+ }
106
+
107
+ element.classList.add(CLASS_NAME_ACTIVE)
108
+
109
+ this._activate(getElementFromSelector(element)) // Search and activate/show the proper section
110
+
111
+ const complete = () => {
112
+ if (element.getAttribute('role') !== 'tab') {
113
+ element.classList.add(CLASS_NAME_SHOW)
114
+ return
115
+ }
116
+
117
+ element.removeAttribute('tabindex')
118
+ element.setAttribute('aria-selected', true)
119
+ this._toggleDropDown(element, true)
120
+ EventHandler.trigger(element, EVENT_SHOWN, {
121
+ relatedTarget: relatedElem
122
+ })
123
+ }
124
+
125
+ this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))
126
+ }
127
+
128
+ _deactivate(element, relatedElem) {
129
+ if (!element) {
130
+ return
131
+ }
132
+
133
+ element.classList.remove(CLASS_NAME_ACTIVE)
134
+ element.blur()
135
+
136
+ this._deactivate(getElementFromSelector(element)) // Search and deactivate the shown section too
137
+
138
+ const complete = () => {
139
+ if (element.getAttribute('role') !== 'tab') {
140
+ element.classList.remove(CLASS_NAME_SHOW)
141
+ return
142
+ }
143
+
144
+ element.setAttribute('aria-selected', false)
145
+ element.setAttribute('tabindex', '-1')
146
+ this._toggleDropDown(element, false)
147
+ EventHandler.trigger(element, EVENT_HIDDEN, { relatedTarget: relatedElem })
148
+ }
149
+
150
+ this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE))
151
+ }
152
+
153
+ _keydown(event) {
154
+ if (!([ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key))) {
155
+ return
156
+ }
157
+
158
+ event.stopPropagation()// stopPropagation/preventDefault both added to support up/down keys without scrolling the page
159
+ event.preventDefault()
160
+ const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key)
161
+ const nextActiveElement = getNextActiveElement(this._getChildren().filter(element => !isDisabled(element)), event.target, isNext, true)
162
+
163
+ if (nextActiveElement) {
164
+ nextActiveElement.focus({ preventScroll: true })
165
+ Tab.getOrCreateInstance(nextActiveElement).show()
166
+ }
167
+ }
168
+
169
+ _getChildren() { // collection of inner elements
170
+ return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent)
171
+ }
172
+
173
+ _getActiveElem() {
174
+ return this._getChildren().find(child => this._elemIsActive(child)) || null
175
+ }
176
+
177
+ _setInitialAttributes(parent, children) {
178
+ this._setAttributeIfNotExists(parent, 'role', 'tablist')
179
+
180
+ for (const child of children) {
181
+ this._setInitialAttributesOnChild(child)
182
+ }
183
+ }
184
+
185
+ _setInitialAttributesOnChild(child) {
186
+ child = this._getInnerElement(child)
187
+ const isActive = this._elemIsActive(child)
188
+ const outerElem = this._getOuterElement(child)
189
+ child.setAttribute('aria-selected', isActive)
190
+
191
+ if (outerElem !== child) {
192
+ this._setAttributeIfNotExists(outerElem, 'role', 'presentation')
193
+ }
194
+
195
+ if (!isActive) {
196
+ child.setAttribute('tabindex', '-1')
197
+ }
198
+
199
+ this._setAttributeIfNotExists(child, 'role', 'tab')
200
+
201
+ // set attributes to the related panel too
202
+ this._setInitialAttributesOnTargetPanel(child)
203
+ }
204
+
205
+ _setInitialAttributesOnTargetPanel(child) {
206
+ const target = getElementFromSelector(child)
207
+
208
+ if (!target) {
209
+ return
210
+ }
211
+
212
+ this._setAttributeIfNotExists(target, 'role', 'tabpanel')
213
+
214
+ if (child.id) {
215
+ this._setAttributeIfNotExists(target, 'aria-labelledby', `#${child.id}`)
216
+ }
217
+ }
218
+
219
+ _toggleDropDown(element, open) {
220
+ const outerElem = this._getOuterElement(element)
221
+ if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
222
+ return
223
+ }
224
+
225
+ const toggle = (selector, className) => {
226
+ const element = SelectorEngine.findOne(selector, outerElem)
227
+ if (element) {
228
+ element.classList.toggle(className, open)
229
+ }
230
+ }
231
+
232
+ toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE)
233
+ toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW)
234
+ outerElem.setAttribute('aria-expanded', open)
235
+ }
236
+
237
+ _setAttributeIfNotExists(element, attribute, value) {
238
+ if (!element.hasAttribute(attribute)) {
239
+ element.setAttribute(attribute, value)
240
+ }
241
+ }
242
+
243
+ _elemIsActive(elem) {
244
+ return elem.classList.contains(CLASS_NAME_ACTIVE)
245
+ }
246
+
247
+ // Try to get the inner element (usually the .nav-link)
248
+ _getInnerElement(elem) {
249
+ return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem)
250
+ }
251
+
252
+ // Try to get the outer element (usually the .nav-item)
253
+ _getOuterElement(elem) {
254
+ return elem.closest(SELECTOR_OUTER) || elem
255
+ }
256
+
257
+ // Static
258
+ static jQueryInterface(config) {
259
+ return this.each(function () {
260
+ const data = Tab.getOrCreateInstance(this)
261
+
262
+ if (typeof config !== 'string') {
263
+ return
264
+ }
265
+
266
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
267
+ throw new TypeError(`No method named "${config}"`)
268
+ }
269
+
270
+ data[config]()
271
+ })
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Data API implementation
277
+ */
278
+
279
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
280
+ if (['A', 'AREA'].includes(this.tagName)) {
281
+ event.preventDefault()
282
+ }
283
+
284
+ if (isDisabled(this)) {
285
+ return
286
+ }
287
+
288
+ Tab.getOrCreateInstance(this).show()
289
+ })
290
+
291
+ /**
292
+ * Initialize on focus
293
+ */
294
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
295
+ for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
296
+ Tab.getOrCreateInstance(element)
297
+ }
298
+ })
299
+ /**
300
+ * jQuery
301
+ */
302
+
303
+ defineJQueryPlugin(Tab)
304
+
305
+ export default Tab