@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,149 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): util/backdrop.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import EventHandler from '../dom/event-handler'
9
+ import { execute, executeAfterTransition, getElement, reflow } from './index'
10
+ import Config from './config'
11
+
12
+ /**
13
+ * Constants
14
+ */
15
+
16
+ const NAME = 'backdrop'
17
+ const CLASS_NAME_FADE = 'fade'
18
+ const CLASS_NAME_SHOW = 'show'
19
+ const EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`
20
+
21
+ const Default = {
22
+ className: 'modal-backdrop',
23
+ clickCallback: null,
24
+ isAnimated: false,
25
+ isVisible: true, // if false, we use the backdrop helper without adding any element to the dom
26
+ rootElement: 'body' // give the choice to place backdrop under different elements
27
+ }
28
+
29
+ const DefaultType = {
30
+ className: 'string',
31
+ clickCallback: '(function|null)',
32
+ isAnimated: 'boolean',
33
+ isVisible: 'boolean',
34
+ rootElement: '(element|string)'
35
+ }
36
+
37
+ /**
38
+ * Class definition
39
+ */
40
+
41
+ class Backdrop extends Config {
42
+ constructor(config) {
43
+ super()
44
+ this._config = this._getConfig(config)
45
+ this._isAppended = false
46
+ this._element = null
47
+ }
48
+
49
+ // Getters
50
+ static get Default() {
51
+ return Default
52
+ }
53
+
54
+ static get DefaultType() {
55
+ return DefaultType
56
+ }
57
+
58
+ static get NAME() {
59
+ return NAME
60
+ }
61
+
62
+ // Public
63
+ show(callback) {
64
+ if (!this._config.isVisible) {
65
+ execute(callback)
66
+ return
67
+ }
68
+
69
+ this._append()
70
+
71
+ const element = this._getElement()
72
+ if (this._config.isAnimated) {
73
+ reflow(element)
74
+ }
75
+
76
+ element.classList.add(CLASS_NAME_SHOW)
77
+
78
+ this._emulateAnimation(() => {
79
+ execute(callback)
80
+ })
81
+ }
82
+
83
+ hide(callback) {
84
+ if (!this._config.isVisible) {
85
+ execute(callback)
86
+ return
87
+ }
88
+
89
+ this._getElement().classList.remove(CLASS_NAME_SHOW)
90
+
91
+ this._emulateAnimation(() => {
92
+ this.dispose()
93
+ execute(callback)
94
+ })
95
+ }
96
+
97
+ dispose() {
98
+ if (!this._isAppended) {
99
+ return
100
+ }
101
+
102
+ EventHandler.off(this._element, EVENT_MOUSEDOWN)
103
+
104
+ this._element.remove()
105
+ this._isAppended = false
106
+ }
107
+
108
+ // Private
109
+ _getElement() {
110
+ if (!this._element) {
111
+ const backdrop = document.createElement('div')
112
+ backdrop.className = this._config.className
113
+ if (this._config.isAnimated) {
114
+ backdrop.classList.add(CLASS_NAME_FADE)
115
+ }
116
+
117
+ this._element = backdrop
118
+ }
119
+
120
+ return this._element
121
+ }
122
+
123
+ _configAfterMerge(config) {
124
+ // use getElement() with the default "body" to get a fresh Element on each instantiation
125
+ config.rootElement = getElement(config.rootElement)
126
+ return config
127
+ }
128
+
129
+ _append() {
130
+ if (this._isAppended) {
131
+ return
132
+ }
133
+
134
+ const element = this._getElement()
135
+ this._config.rootElement.append(element)
136
+
137
+ EventHandler.on(element, EVENT_MOUSEDOWN, () => {
138
+ execute(this._config.clickCallback)
139
+ })
140
+
141
+ this._isAppended = true
142
+ }
143
+
144
+ _emulateAnimation(callback) {
145
+ executeAfterTransition(callback, this._getElement(), this._config.isAnimated)
146
+ }
147
+ }
148
+
149
+ export default Backdrop
@@ -0,0 +1,34 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): util/component-functions.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import EventHandler from '../dom/event-handler'
9
+ import { getElementFromSelector, isDisabled } from './index'
10
+
11
+ const enableDismissTrigger = (component, method = 'hide') => {
12
+ const clickEvent = `click.dismiss${component.EVENT_KEY}`
13
+ const name = component.NAME
14
+
15
+ EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) {
16
+ if (['A', 'AREA'].includes(this.tagName)) {
17
+ event.preventDefault()
18
+ }
19
+
20
+ if (isDisabled(this)) {
21
+ return
22
+ }
23
+
24
+ const target = getElementFromSelector(this) || this.closest(`.${name}`)
25
+ const instance = component.getOrCreateInstance(target)
26
+
27
+ // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method
28
+ instance[method]()
29
+ })
30
+ }
31
+
32
+ export {
33
+ enableDismissTrigger
34
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): util/config.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { isElement, toType } from './index'
9
+ import Manipulator from '../dom/manipulator'
10
+
11
+ /**
12
+ * Class definition
13
+ */
14
+
15
+ class Config {
16
+ // Getters
17
+ static get Default() {
18
+ return {}
19
+ }
20
+
21
+ static get DefaultType() {
22
+ return {}
23
+ }
24
+
25
+ static get NAME() {
26
+ throw new Error('You have to implement the static method "NAME", for each component!')
27
+ }
28
+
29
+ _getConfig(config) {
30
+ config = this._mergeConfigObj(config)
31
+ config = this._configAfterMerge(config)
32
+ this._typeCheckConfig(config)
33
+ return config
34
+ }
35
+
36
+ _configAfterMerge(config) {
37
+ return config
38
+ }
39
+
40
+ _mergeConfigObj(config, element) {
41
+ const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse
42
+
43
+ return {
44
+ ...this.constructor.Default,
45
+ ...(typeof jsonConfig === 'object' ? jsonConfig : {}),
46
+ ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),
47
+ ...(typeof config === 'object' ? config : {})
48
+ }
49
+ }
50
+
51
+ _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
52
+ for (const property of Object.keys(configTypes)) {
53
+ const expectedTypes = configTypes[property]
54
+ const value = config[property]
55
+ const valueType = isElement(value) ? 'element' : toType(value)
56
+
57
+ if (!new RegExp(expectedTypes).test(valueType)) {
58
+ throw new TypeError(
59
+ `${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`
60
+ )
61
+ }
62
+ }
63
+ }
64
+ }
65
+
66
+ export default Config
@@ -0,0 +1,115 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): util/focustrap.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import EventHandler from '../dom/event-handler'
9
+ import SelectorEngine from '../dom/selector-engine'
10
+ import Config from './config'
11
+
12
+ /**
13
+ * Constants
14
+ */
15
+
16
+ const NAME = 'focustrap'
17
+ const DATA_KEY = 'bs.focustrap'
18
+ const EVENT_KEY = `.${DATA_KEY}`
19
+ const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
20
+ const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`
21
+
22
+ const TAB_KEY = 'Tab'
23
+ const TAB_NAV_FORWARD = 'forward'
24
+ const TAB_NAV_BACKWARD = 'backward'
25
+
26
+ const Default = {
27
+ autofocus: true,
28
+ trapElement: null // The element to trap focus inside of
29
+ }
30
+
31
+ const DefaultType = {
32
+ autofocus: 'boolean',
33
+ trapElement: 'element'
34
+ }
35
+
36
+ /**
37
+ * Class definition
38
+ */
39
+
40
+ class FocusTrap extends Config {
41
+ constructor(config) {
42
+ super()
43
+ this._config = this._getConfig(config)
44
+ this._isActive = false
45
+ this._lastTabNavDirection = null
46
+ }
47
+
48
+ // Getters
49
+ static get Default() {
50
+ return Default
51
+ }
52
+
53
+ static get DefaultType() {
54
+ return DefaultType
55
+ }
56
+
57
+ static get NAME() {
58
+ return NAME
59
+ }
60
+
61
+ // Public
62
+ activate() {
63
+ if (this._isActive) {
64
+ return
65
+ }
66
+
67
+ if (this._config.autofocus) {
68
+ this._config.trapElement.focus()
69
+ }
70
+
71
+ EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop
72
+ EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))
73
+ EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))
74
+
75
+ this._isActive = true
76
+ }
77
+
78
+ deactivate() {
79
+ if (!this._isActive) {
80
+ return
81
+ }
82
+
83
+ this._isActive = false
84
+ EventHandler.off(document, EVENT_KEY)
85
+ }
86
+
87
+ // Private
88
+ _handleFocusin(event) {
89
+ const { trapElement } = this._config
90
+
91
+ if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
92
+ return
93
+ }
94
+
95
+ const elements = SelectorEngine.focusableChildren(trapElement)
96
+
97
+ if (elements.length === 0) {
98
+ trapElement.focus()
99
+ } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
100
+ elements[elements.length - 1].focus()
101
+ } else {
102
+ elements[0].focus()
103
+ }
104
+ }
105
+
106
+ _handleKeydown(event) {
107
+ if (event.key !== TAB_KEY) {
108
+ return
109
+ }
110
+
111
+ this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD
112
+ }
113
+ }
114
+
115
+ export default FocusTrap
@@ -0,0 +1,336 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v5.2.3): util/index.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ const MAX_UID = 1_000_000
9
+ const MILLISECONDS_MULTIPLIER = 1000
10
+ const TRANSITION_END = 'transitionend'
11
+
12
+ // Shout-out Angus Croll (https://goo.gl/pxwQGp)
13
+ const toType = object => {
14
+ if (object === null || object === undefined) {
15
+ return `${object}`
16
+ }
17
+
18
+ return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase()
19
+ }
20
+
21
+ /**
22
+ * Public Util API
23
+ */
24
+
25
+ const getUID = prefix => {
26
+ do {
27
+ prefix += Math.floor(Math.random() * MAX_UID)
28
+ } while (document.getElementById(prefix))
29
+
30
+ return prefix
31
+ }
32
+
33
+ const getSelector = element => {
34
+ let selector = element.getAttribute('data-bs-target')
35
+
36
+ if (!selector || selector === '#') {
37
+ let hrefAttribute = element.getAttribute('href')
38
+
39
+ // The only valid content that could double as a selector are IDs or classes,
40
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
41
+ // `document.querySelector` will rightfully complain it is invalid.
42
+ // See https://github.com/twbs/bootstrap/issues/32273
43
+ if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {
44
+ return null
45
+ }
46
+
47
+ // Just in case some CMS puts out a full URL with the anchor appended
48
+ if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
49
+ hrefAttribute = `#${hrefAttribute.split('#')[1]}`
50
+ }
51
+
52
+ selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null
53
+ }
54
+
55
+ return selector
56
+ }
57
+
58
+ const getSelectorFromElement = element => {
59
+ const selector = getSelector(element)
60
+
61
+ if (selector) {
62
+ return document.querySelector(selector) ? selector : null
63
+ }
64
+
65
+ return null
66
+ }
67
+
68
+ const getElementFromSelector = element => {
69
+ const selector = getSelector(element)
70
+
71
+ return selector ? document.querySelector(selector) : null
72
+ }
73
+
74
+ const getTransitionDurationFromElement = element => {
75
+ if (!element) {
76
+ return 0
77
+ }
78
+
79
+ // Get transition-duration of the element
80
+ let { transitionDuration, transitionDelay } = window.getComputedStyle(element)
81
+
82
+ const floatTransitionDuration = Number.parseFloat(transitionDuration)
83
+ const floatTransitionDelay = Number.parseFloat(transitionDelay)
84
+
85
+ // Return 0 if element or transition duration is not found
86
+ if (!floatTransitionDuration && !floatTransitionDelay) {
87
+ return 0
88
+ }
89
+
90
+ // If multiple durations are defined, take the first
91
+ transitionDuration = transitionDuration.split(',')[0]
92
+ transitionDelay = transitionDelay.split(',')[0]
93
+
94
+ return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER
95
+ }
96
+
97
+ const triggerTransitionEnd = element => {
98
+ element.dispatchEvent(new Event(TRANSITION_END))
99
+ }
100
+
101
+ const isElement = object => {
102
+ if (!object || typeof object !== 'object') {
103
+ return false
104
+ }
105
+
106
+ if (typeof object.jquery !== 'undefined') {
107
+ object = object[0]
108
+ }
109
+
110
+ return typeof object.nodeType !== 'undefined'
111
+ }
112
+
113
+ const getElement = object => {
114
+ // it's a jQuery object or a node element
115
+ if (isElement(object)) {
116
+ return object.jquery ? object[0] : object
117
+ }
118
+
119
+ if (typeof object === 'string' && object.length > 0) {
120
+ return document.querySelector(object)
121
+ }
122
+
123
+ return null
124
+ }
125
+
126
+ const isVisible = element => {
127
+ if (!isElement(element) || element.getClientRects().length === 0) {
128
+ return false
129
+ }
130
+
131
+ const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'
132
+ // Handle `details` element as its content may falsie appear visible when it is closed
133
+ const closedDetails = element.closest('details:not([open])')
134
+
135
+ if (!closedDetails) {
136
+ return elementIsVisible
137
+ }
138
+
139
+ if (closedDetails !== element) {
140
+ const summary = element.closest('summary')
141
+ if (summary && summary.parentNode !== closedDetails) {
142
+ return false
143
+ }
144
+
145
+ if (summary === null) {
146
+ return false
147
+ }
148
+ }
149
+
150
+ return elementIsVisible
151
+ }
152
+
153
+ const isDisabled = element => {
154
+ if (!element || element.nodeType !== Node.ELEMENT_NODE) {
155
+ return true
156
+ }
157
+
158
+ if (element.classList.contains('disabled')) {
159
+ return true
160
+ }
161
+
162
+ if (typeof element.disabled !== 'undefined') {
163
+ return element.disabled
164
+ }
165
+
166
+ return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'
167
+ }
168
+
169
+ const findShadowRoot = element => {
170
+ if (!document.documentElement.attachShadow) {
171
+ return null
172
+ }
173
+
174
+ // Can find the shadow root otherwise it'll return the document
175
+ if (typeof element.getRootNode === 'function') {
176
+ const root = element.getRootNode()
177
+ return root instanceof ShadowRoot ? root : null
178
+ }
179
+
180
+ if (element instanceof ShadowRoot) {
181
+ return element
182
+ }
183
+
184
+ // when we don't find a shadow root
185
+ if (!element.parentNode) {
186
+ return null
187
+ }
188
+
189
+ return findShadowRoot(element.parentNode)
190
+ }
191
+
192
+ const noop = () => {}
193
+
194
+ /**
195
+ * Trick to restart an element's animation
196
+ *
197
+ * @param {HTMLElement} element
198
+ * @return void
199
+ *
200
+ * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation
201
+ */
202
+ const reflow = element => {
203
+ element.offsetHeight // eslint-disable-line no-unused-expressions
204
+ }
205
+
206
+ const getjQuery = () => {
207
+ if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {
208
+ return window.jQuery
209
+ }
210
+
211
+ return null
212
+ }
213
+
214
+ const DOMContentLoadedCallbacks = []
215
+
216
+ const onDOMContentLoaded = callback => {
217
+ if (document.readyState === 'loading') {
218
+ // add listener on the first call when the document is in loading state
219
+ if (!DOMContentLoadedCallbacks.length) {
220
+ document.addEventListener('DOMContentLoaded', () => {
221
+ for (const callback of DOMContentLoadedCallbacks) {
222
+ callback()
223
+ }
224
+ })
225
+ }
226
+
227
+ DOMContentLoadedCallbacks.push(callback)
228
+ } else {
229
+ callback()
230
+ }
231
+ }
232
+
233
+ const isRTL = () => document.documentElement.dir === 'rtl'
234
+
235
+ const defineJQueryPlugin = plugin => {
236
+ onDOMContentLoaded(() => {
237
+ const $ = getjQuery()
238
+ /* istanbul ignore if */
239
+ if ($) {
240
+ const name = plugin.NAME
241
+ const JQUERY_NO_CONFLICT = $.fn[name]
242
+ $.fn[name] = plugin.jQueryInterface
243
+ $.fn[name].Constructor = plugin
244
+ $.fn[name].noConflict = () => {
245
+ $.fn[name] = JQUERY_NO_CONFLICT
246
+ return plugin.jQueryInterface
247
+ }
248
+ }
249
+ })
250
+ }
251
+
252
+ const execute = callback => {
253
+ if (typeof callback === 'function') {
254
+ callback()
255
+ }
256
+ }
257
+
258
+ const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
259
+ if (!waitForTransition) {
260
+ execute(callback)
261
+ return
262
+ }
263
+
264
+ const durationPadding = 5
265
+ const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding
266
+
267
+ let called = false
268
+
269
+ const handler = ({ target }) => {
270
+ if (target !== transitionElement) {
271
+ return
272
+ }
273
+
274
+ called = true
275
+ transitionElement.removeEventListener(TRANSITION_END, handler)
276
+ execute(callback)
277
+ }
278
+
279
+ transitionElement.addEventListener(TRANSITION_END, handler)
280
+ setTimeout(() => {
281
+ if (!called) {
282
+ triggerTransitionEnd(transitionElement)
283
+ }
284
+ }, emulatedDuration)
285
+ }
286
+
287
+ /**
288
+ * Return the previous/next element of a list.
289
+ *
290
+ * @param {array} list The list of elements
291
+ * @param activeElement The active element
292
+ * @param shouldGetNext Choose to get next or previous element
293
+ * @param isCycleAllowed
294
+ * @return {Element|elem} The proper element
295
+ */
296
+ const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
297
+ const listLength = list.length
298
+ let index = list.indexOf(activeElement)
299
+
300
+ // if the element does not exist in the list return an element
301
+ // depending on the direction and if cycle is allowed
302
+ if (index === -1) {
303
+ return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]
304
+ }
305
+
306
+ index += shouldGetNext ? 1 : -1
307
+
308
+ if (isCycleAllowed) {
309
+ index = (index + listLength) % listLength
310
+ }
311
+
312
+ return list[Math.max(0, Math.min(index, listLength - 1))]
313
+ }
314
+
315
+ export {
316
+ defineJQueryPlugin,
317
+ execute,
318
+ executeAfterTransition,
319
+ findShadowRoot,
320
+ getElement,
321
+ getElementFromSelector,
322
+ getjQuery,
323
+ getNextActiveElement,
324
+ getSelectorFromElement,
325
+ getTransitionDurationFromElement,
326
+ getUID,
327
+ isDisabled,
328
+ isElement,
329
+ isRTL,
330
+ isVisible,
331
+ noop,
332
+ onDOMContentLoaded,
333
+ reflow,
334
+ triggerTransitionEnd,
335
+ toType
336
+ }