insights4you-jekyll-theme 0.2.0 → 0.4.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 (276) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -0
  3. data/README.md +114 -32
  4. data/_data/i4y-colors.json +218 -0
  5. data/_data/i4y-errors.json +32 -0
  6. data/_data/i4y-icons.json +1 -0
  7. data/_data/i4y-illustrations.json +20 -0
  8. data/_data/i4y-social-media.yml +24 -0
  9. data/_includes/card/profile.html +42 -0
  10. data/_includes/layout/footer.html +48 -0
  11. data/_includes/layout/head.html +79 -0
  12. data/_includes/layout/navbar-logo.html +137 -0
  13. data/_includes/layout/navbar.html +82 -0
  14. data/_includes/ui/button.html +13 -14
  15. data/_includes/ui/icon.html +24 -26
  16. data/_includes/ui/spinner.html +2 -0
  17. data/_includes/utils/banner.html +7 -0
  18. data/_includes/utils/settings.html +144 -0
  19. data/_layouts/base.html +63 -0
  20. data/_layouts/default.html +36 -11
  21. data/_sass/_bootstrap-components.scss +31 -0
  22. data/_sass/_bootstrap-config.scss +7 -0
  23. data/_sass/_bootstrap-override.scss +78 -0
  24. data/_sass/_config.scss +9 -0
  25. data/_sass/_core.scss +78 -0
  26. data/_sass/_debug.scss +49 -0
  27. data/_sass/_mixins.scss +2 -0
  28. data/_sass/_props.scss +91 -0
  29. data/_sass/_utilities-marketing.scss +209 -0
  30. data/_sass/_utilities.scss +135 -0
  31. data/_sass/_variables-dark.scss +19 -0
  32. data/_sass/_variables-marketing.scss +0 -0
  33. data/_sass/_variables.scss +1001 -0
  34. data/_sass/bootstrap/LICENSE +21 -0
  35. data/_sass/bootstrap/README.md +246 -0
  36. data/_sass/bootstrap/js/index.esm.js +19 -0
  37. data/_sass/bootstrap/js/index.umd.js +34 -0
  38. data/_sass/bootstrap/js/src/alert.js +87 -0
  39. data/_sass/bootstrap/js/src/base-component.js +85 -0
  40. data/_sass/bootstrap/js/src/button.js +72 -0
  41. data/_sass/bootstrap/js/src/carousel.js +474 -0
  42. data/_sass/bootstrap/js/src/collapse.js +297 -0
  43. data/_sass/bootstrap/js/src/dom/data.js +55 -0
  44. data/_sass/bootstrap/js/src/dom/event-handler.js +317 -0
  45. data/_sass/bootstrap/js/src/dom/manipulator.js +71 -0
  46. data/_sass/bootstrap/js/src/dom/selector-engine.js +126 -0
  47. data/_sass/bootstrap/js/src/dropdown.js +455 -0
  48. data/_sass/bootstrap/js/src/modal.js +378 -0
  49. data/_sass/bootstrap/js/src/offcanvas.js +282 -0
  50. data/_sass/bootstrap/js/src/popover.js +97 -0
  51. data/_sass/bootstrap/js/src/scrollspy.js +296 -0
  52. data/_sass/bootstrap/js/src/tab.js +315 -0
  53. data/_sass/bootstrap/js/src/toast.js +225 -0
  54. data/_sass/bootstrap/js/src/tooltip.js +633 -0
  55. data/_sass/bootstrap/js/src/util/backdrop.js +151 -0
  56. data/_sass/bootstrap/js/src/util/component-functions.js +35 -0
  57. data/_sass/bootstrap/js/src/util/config.js +65 -0
  58. data/_sass/bootstrap/js/src/util/focustrap.js +115 -0
  59. data/_sass/bootstrap/js/src/util/index.js +306 -0
  60. data/_sass/bootstrap/js/src/util/sanitizer.js +117 -0
  61. data/_sass/bootstrap/js/src/util/scrollbar.js +114 -0
  62. data/_sass/bootstrap/js/src/util/swipe.js +146 -0
  63. data/_sass/bootstrap/js/src/util/template-factory.js +160 -0
  64. data/_sass/bootstrap/package.json +184 -0
  65. data/_sass/bootstrap/scss/_accordion.scss +158 -0
  66. data/_sass/bootstrap/scss/_alert.scss +68 -0
  67. data/_sass/bootstrap/scss/_badge.scss +38 -0
  68. data/_sass/bootstrap/scss/_breadcrumb.scss +40 -0
  69. data/_sass/bootstrap/scss/_button-group.scss +142 -0
  70. data/_sass/bootstrap/scss/_buttons.scss +216 -0
  71. data/_sass/bootstrap/scss/_card.scss +239 -0
  72. data/_sass/bootstrap/scss/_carousel.scss +236 -0
  73. data/_sass/bootstrap/scss/_close.scss +63 -0
  74. data/_sass/bootstrap/scss/_containers.scss +41 -0
  75. data/_sass/bootstrap/scss/_dropdown.scss +250 -0
  76. data/_sass/bootstrap/scss/_forms.scss +9 -0
  77. data/_sass/bootstrap/scss/_functions.scss +302 -0
  78. data/_sass/bootstrap/scss/_grid.scss +39 -0
  79. data/_sass/bootstrap/scss/_helpers.scss +12 -0
  80. data/_sass/bootstrap/scss/_images.scss +42 -0
  81. data/_sass/bootstrap/scss/_list-group.scss +197 -0
  82. data/_sass/bootstrap/scss/_maps.scss +174 -0
  83. data/_sass/bootstrap/scss/_mixins.scss +42 -0
  84. data/_sass/bootstrap/scss/_modal.scss +236 -0
  85. data/_sass/bootstrap/scss/_nav.scss +197 -0
  86. data/_sass/bootstrap/scss/_navbar.scss +289 -0
  87. data/_sass/bootstrap/scss/_offcanvas.scss +143 -0
  88. data/_sass/bootstrap/scss/_pagination.scss +109 -0
  89. data/_sass/bootstrap/scss/_placeholders.scss +51 -0
  90. data/_sass/bootstrap/scss/_popover.scss +196 -0
  91. data/_sass/bootstrap/scss/_progress.scss +68 -0
  92. data/_sass/bootstrap/scss/_reboot.scss +611 -0
  93. data/_sass/bootstrap/scss/_root.scss +187 -0
  94. data/_sass/bootstrap/scss/_spinners.scss +85 -0
  95. data/_sass/bootstrap/scss/_tables.scss +171 -0
  96. data/_sass/bootstrap/scss/_toasts.scss +73 -0
  97. data/_sass/bootstrap/scss/_tooltip.scss +119 -0
  98. data/_sass/bootstrap/scss/_transitions.scss +27 -0
  99. data/_sass/bootstrap/scss/_type.scss +106 -0
  100. data/_sass/bootstrap/scss/_utilities.scss +806 -0
  101. data/_sass/bootstrap/scss/_variables-dark.scss +87 -0
  102. data/_sass/bootstrap/scss/_variables.scss +1751 -0
  103. data/_sass/bootstrap/scss/bootstrap-grid.scss +62 -0
  104. data/_sass/bootstrap/scss/bootstrap-reboot.scss +10 -0
  105. data/_sass/bootstrap/scss/bootstrap-utilities.scss +19 -0
  106. data/_sass/bootstrap/scss/bootstrap.scss +52 -0
  107. data/_sass/bootstrap/scss/forms/_floating-labels.scss +95 -0
  108. data/_sass/bootstrap/scss/forms/_form-check.scss +189 -0
  109. data/_sass/bootstrap/scss/forms/_form-control.scss +214 -0
  110. data/_sass/bootstrap/scss/forms/_form-range.scss +91 -0
  111. data/_sass/bootstrap/scss/forms/_form-select.scss +80 -0
  112. data/_sass/bootstrap/scss/forms/_form-text.scss +11 -0
  113. data/_sass/bootstrap/scss/forms/_input-group.scss +132 -0
  114. data/_sass/bootstrap/scss/forms/_labels.scss +36 -0
  115. data/_sass/bootstrap/scss/forms/_validation.scss +12 -0
  116. data/_sass/bootstrap/scss/helpers/_clearfix.scss +3 -0
  117. data/_sass/bootstrap/scss/helpers/_color-bg.scss +7 -0
  118. data/_sass/bootstrap/scss/helpers/_colored-links.scss +30 -0
  119. data/_sass/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  120. data/_sass/bootstrap/scss/helpers/_icon-link.scss +25 -0
  121. data/_sass/bootstrap/scss/helpers/_position.scss +36 -0
  122. data/_sass/bootstrap/scss/helpers/_ratio.scss +26 -0
  123. data/_sass/bootstrap/scss/helpers/_stacks.scss +15 -0
  124. data/_sass/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  125. data/_sass/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  126. data/_sass/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  127. data/_sass/bootstrap/scss/helpers/_vr.scss +8 -0
  128. data/_sass/bootstrap/scss/mixins/_alert.scss +18 -0
  129. data/_sass/bootstrap/scss/mixins/_backdrop.scss +14 -0
  130. data/_sass/bootstrap/scss/mixins/_banner.scss +7 -0
  131. data/_sass/bootstrap/scss/mixins/_border-radius.scss +78 -0
  132. data/_sass/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  133. data/_sass/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  134. data/_sass/bootstrap/scss/mixins/_buttons.scss +70 -0
  135. data/_sass/bootstrap/scss/mixins/_caret.scss +69 -0
  136. data/_sass/bootstrap/scss/mixins/_clearfix.scss +9 -0
  137. data/_sass/bootstrap/scss/mixins/_color-mode.scss +21 -0
  138. data/_sass/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  139. data/_sass/bootstrap/scss/mixins/_container.scss +11 -0
  140. data/_sass/bootstrap/scss/mixins/_deprecate.scss +10 -0
  141. data/_sass/bootstrap/scss/mixins/_forms.scss +163 -0
  142. data/_sass/bootstrap/scss/mixins/_gradients.scss +47 -0
  143. data/_sass/bootstrap/scss/mixins/_grid.scss +151 -0
  144. data/_sass/bootstrap/scss/mixins/_image.scss +16 -0
  145. data/_sass/bootstrap/scss/mixins/_list-group.scss +26 -0
  146. data/_sass/bootstrap/scss/mixins/_lists.scss +7 -0
  147. data/_sass/bootstrap/scss/mixins/_pagination.scss +10 -0
  148. data/_sass/bootstrap/scss/mixins/_reset-text.scss +17 -0
  149. data/_sass/bootstrap/scss/mixins/_resize.scss +6 -0
  150. data/_sass/bootstrap/scss/mixins/_table-variants.scss +24 -0
  151. data/_sass/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  152. data/_sass/bootstrap/scss/mixins/_transition.scss +26 -0
  153. data/_sass/bootstrap/scss/mixins/_utilities.scss +97 -0
  154. data/_sass/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
  155. data/_sass/bootstrap/scss/utilities/_api.scss +47 -0
  156. data/_sass/fonts/_webfonts.scss +15 -0
  157. data/_sass/helpers/_index.scss +143 -0
  158. data/_sass/layout/_animations.scss +63 -0
  159. data/_sass/layout/_core.scss +62 -0
  160. data/_sass/layout/_dark.scss +77 -0
  161. data/_sass/layout/_footer.scss +12 -0
  162. data/_sass/layout/_navbar.scss +392 -0
  163. data/_sass/layout/_page.scss +169 -0
  164. data/_sass/layout/_root.scss +64 -0
  165. data/_sass/marketing/_browser.scss +67 -0
  166. data/_sass/marketing/_core.scss +8 -0
  167. data/_sass/marketing/_filters.scss +0 -0
  168. data/_sass/marketing/_hero.scss +69 -0
  169. data/_sass/marketing/_pricing.scss +111 -0
  170. data/_sass/marketing/_sections.scss +124 -0
  171. data/_sass/marketing/_shape.scss +31 -0
  172. data/_sass/mixins/_functions.scss +96 -0
  173. data/_sass/mixins/_mixins.scss +68 -0
  174. data/_sass/tabler-flags.scss +2 -0
  175. data/_sass/tabler-marketing.scss +13 -0
  176. data/_sass/tabler-payments.scss +2 -0
  177. data/_sass/tabler-props.scss +1 -0
  178. data/_sass/tabler-socials.scss +2 -0
  179. data/_sass/tabler-themes.scss +121 -0
  180. data/_sass/tabler-vendors.scss +16 -0
  181. data/_sass/tabler.scss +2 -0
  182. data/_sass/ui/_accordion.scss +177 -0
  183. data/_sass/ui/_alerts.scss +99 -0
  184. data/_sass/ui/_avatars.scss +145 -0
  185. data/_sass/ui/_badges.scss +113 -0
  186. data/_sass/ui/_breadcrumbs.scss +50 -0
  187. data/_sass/ui/_button-group.scss +16 -0
  188. data/_sass/ui/_buttons.scss +261 -0
  189. data/_sass/ui/_calendars.scss +104 -0
  190. data/_sass/ui/_cards.scss +594 -0
  191. data/_sass/ui/_carousel.scss +68 -0
  192. data/_sass/ui/_charts.scss +61 -0
  193. data/_sass/ui/_chat.scss +38 -0
  194. data/_sass/ui/_chips.scss +0 -0
  195. data/_sass/ui/_close.scss +60 -0
  196. data/_sass/ui/_datagrid.scss +17 -0
  197. data/_sass/ui/_dropdowns.scss +120 -0
  198. data/_sass/ui/_empty.scss +60 -0
  199. data/_sass/ui/_flags.scss +31 -0
  200. data/_sass/ui/_forms.scss +241 -0
  201. data/_sass/ui/_grid.scss +115 -0
  202. data/_sass/ui/_icons.scss +72 -0
  203. data/_sass/ui/_images.scss +19 -0
  204. data/_sass/ui/_legend.scss +12 -0
  205. data/_sass/ui/_lists.scss +124 -0
  206. data/_sass/ui/_loaders.scss +72 -0
  207. data/_sass/ui/_login.scss +3 -0
  208. data/_sass/ui/_markdown.scss +43 -0
  209. data/_sass/ui/_modals.scss +67 -0
  210. data/_sass/ui/_nav.scss +96 -0
  211. data/_sass/ui/_offcanvas.scss +17 -0
  212. data/_sass/ui/_pagination.scss +58 -0
  213. data/_sass/ui/_payments.scss +28 -0
  214. data/_sass/ui/_placeholder.scss +9 -0
  215. data/_sass/ui/_popovers.scss +2 -0
  216. data/_sass/ui/_progress.scss +107 -0
  217. data/_sass/ui/_ribbons.scss +157 -0
  218. data/_sass/ui/_segmented.scss +101 -0
  219. data/_sass/ui/_signature.scss +15 -0
  220. data/_sass/ui/_social.scss +52 -0
  221. data/_sass/ui/_stars.scss +13 -0
  222. data/_sass/ui/_status.scss +163 -0
  223. data/_sass/ui/_steps.scss +156 -0
  224. data/_sass/ui/_switch-icon.scss +211 -0
  225. data/_sass/ui/_tables.scss +177 -0
  226. data/_sass/ui/_tags.scss +57 -0
  227. data/_sass/ui/_timeline.scss +61 -0
  228. data/_sass/ui/_toasts.scss +18 -0
  229. data/_sass/ui/_toolbar.scss +10 -0
  230. data/_sass/ui/_tracking.scss +29 -0
  231. data/_sass/ui/_type.scss +268 -0
  232. data/_sass/ui/forms/_form-check.scss +91 -0
  233. data/_sass/ui/forms/_form-colorinput.scss +54 -0
  234. data/_sass/ui/forms/_form-custom.scss +28 -0
  235. data/_sass/ui/forms/_form-icon.scss +35 -0
  236. data/_sass/ui/forms/_form-imagecheck.scss +105 -0
  237. data/_sass/ui/forms/_form-selectgroup.scss +153 -0
  238. data/_sass/ui/forms/_validation.scss +13 -0
  239. data/_sass/ui/typo/_hr.scss +77 -0
  240. data/_sass/utils/_background.scss +15 -0
  241. data/_sass/utils/_colors.scss +100 -0
  242. data/_sass/utils/_opacity.scss +7 -0
  243. data/_sass/utils/_scroll.scss +47 -0
  244. data/_sass/utils/_shadow.scss +9 -0
  245. data/_sass/utils/_sizing.scss +6 -0
  246. data/_sass/utils/_text.scss +15 -0
  247. data/_sass/vendors/_apexcharts.scss +48 -0
  248. data/_sass/vendors/_coloris.scss +72 -0
  249. data/_sass/vendors/_dropzone.scss +27 -0
  250. data/_sass/vendors/_fslightbox.scss +13 -0
  251. data/_sass/vendors/_jsvectormap.scss +47 -0
  252. data/_sass/vendors/_litepicker.scss +69 -0
  253. data/_sass/vendors/_nouislider.scss +49 -0
  254. data/_sass/vendors/_plyr.scss +3 -0
  255. data/_sass/vendors/_stars-rating.scss +22 -0
  256. data/_sass/vendors/_tinymce.scss +34 -0
  257. data/_sass/vendors/_tom-select.scss +81 -0
  258. data/_sass/vendors/_turbo.scss +3 -0
  259. data/_sass/vendors/_typed.scss +4 -0
  260. data/_sass/vendors/_wysiwyg.scss +34 -0
  261. data/assets/css/main.scss +10 -0
  262. data/assets/images/i4y-logo.jpg +0 -0
  263. data/assets/images/preview-dark.png +0 -0
  264. data/assets/js/custom.js +175 -0
  265. data/assets/js/custom.min.js +1 -0
  266. data/assets/js/theme.js +11 -30
  267. data/assets/js/theme.min.js +12 -0
  268. data/insights4you-jekyll-theme.gemspec +93 -0
  269. metadata +393 -25
  270. data/_includes/footer.html +0 -45
  271. data/_includes/head.html +0 -63
  272. data/_includes/header-logo.html +0 -179
  273. data/_includes/header-navbar.html +0 -69
  274. data/_includes/header-svg.html +0 -39
  275. data/_layouts/home.html +0 -19
  276. data/assets/css/theme.min.css +0 -90
@@ -0,0 +1,378 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap modal.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import BaseComponent from './base-component.js'
9
+ import EventHandler from './dom/event-handler.js'
10
+ import SelectorEngine from './dom/selector-engine.js'
11
+ import Backdrop from './util/backdrop.js'
12
+ import { enableDismissTrigger } from './util/component-functions.js'
13
+ import FocusTrap from './util/focustrap.js'
14
+ import {
15
+ defineJQueryPlugin, isRTL, isVisible, reflow
16
+ } from './util/index.js'
17
+ import ScrollBarHelper from './util/scrollbar.js'
18
+
19
+ /**
20
+ * Constants
21
+ */
22
+
23
+ const NAME = 'modal'
24
+ const DATA_KEY = 'bs.modal'
25
+ const EVENT_KEY = `.${DATA_KEY}`
26
+ const DATA_API_KEY = '.data-api'
27
+ const ESCAPE_KEY = 'Escape'
28
+
29
+ const EVENT_HIDE = `hide${EVENT_KEY}`
30
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
31
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
32
+ const EVENT_SHOW = `show${EVENT_KEY}`
33
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
34
+ const EVENT_RESIZE = `resize${EVENT_KEY}`
35
+ const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
36
+ const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`
37
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
38
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
39
+
40
+ const CLASS_NAME_OPEN = 'modal-open'
41
+ const CLASS_NAME_FADE = 'fade'
42
+ const CLASS_NAME_SHOW = 'show'
43
+ const CLASS_NAME_STATIC = 'modal-static'
44
+
45
+ const OPEN_SELECTOR = '.modal.show'
46
+ const SELECTOR_DIALOG = '.modal-dialog'
47
+ const SELECTOR_MODAL_BODY = '.modal-body'
48
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="modal"]'
49
+
50
+ const Default = {
51
+ backdrop: true,
52
+ focus: true,
53
+ keyboard: true
54
+ }
55
+
56
+ const DefaultType = {
57
+ backdrop: '(boolean|string)',
58
+ focus: 'boolean',
59
+ keyboard: 'boolean'
60
+ }
61
+
62
+ /**
63
+ * Class definition
64
+ */
65
+
66
+ class Modal extends BaseComponent {
67
+ constructor(element, config) {
68
+ super(element, config)
69
+
70
+ this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)
71
+ this._backdrop = this._initializeBackDrop()
72
+ this._focustrap = this._initializeFocusTrap()
73
+ this._isShown = false
74
+ this._isTransitioning = false
75
+ this._scrollBar = new ScrollBarHelper()
76
+
77
+ this._addEventListeners()
78
+ }
79
+
80
+ // Getters
81
+ static get Default() {
82
+ return Default
83
+ }
84
+
85
+ static get DefaultType() {
86
+ return DefaultType
87
+ }
88
+
89
+ static get NAME() {
90
+ return NAME
91
+ }
92
+
93
+ // Public
94
+ toggle(relatedTarget) {
95
+ return this._isShown ? this.hide() : this.show(relatedTarget)
96
+ }
97
+
98
+ show(relatedTarget) {
99
+ if (this._isShown || this._isTransitioning) {
100
+ return
101
+ }
102
+
103
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {
104
+ relatedTarget
105
+ })
106
+
107
+ if (showEvent.defaultPrevented) {
108
+ return
109
+ }
110
+
111
+ this._isShown = true
112
+ this._isTransitioning = true
113
+
114
+ this._scrollBar.hide()
115
+
116
+ document.body.classList.add(CLASS_NAME_OPEN)
117
+
118
+ this._adjustDialog()
119
+
120
+ this._backdrop.show(() => this._showElement(relatedTarget))
121
+ }
122
+
123
+ hide() {
124
+ if (!this._isShown || this._isTransitioning) {
125
+ return
126
+ }
127
+
128
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)
129
+
130
+ if (hideEvent.defaultPrevented) {
131
+ return
132
+ }
133
+
134
+ this._isShown = false
135
+ this._isTransitioning = true
136
+ this._focustrap.deactivate()
137
+
138
+ this._element.classList.remove(CLASS_NAME_SHOW)
139
+
140
+ this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())
141
+ }
142
+
143
+ dispose() {
144
+ EventHandler.off(window, EVENT_KEY)
145
+ EventHandler.off(this._dialog, EVENT_KEY)
146
+
147
+ this._backdrop.dispose()
148
+ this._focustrap.deactivate()
149
+
150
+ super.dispose()
151
+ }
152
+
153
+ handleUpdate() {
154
+ this._adjustDialog()
155
+ }
156
+
157
+ // Private
158
+ _initializeBackDrop() {
159
+ return new Backdrop({
160
+ isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,
161
+ isAnimated: this._isAnimated()
162
+ })
163
+ }
164
+
165
+ _initializeFocusTrap() {
166
+ return new FocusTrap({
167
+ trapElement: this._element
168
+ })
169
+ }
170
+
171
+ _showElement(relatedTarget) {
172
+ // try to append dynamic modal
173
+ if (!document.body.contains(this._element)) {
174
+ document.body.append(this._element)
175
+ }
176
+
177
+ this._element.style.display = 'block'
178
+ this._element.removeAttribute('aria-hidden')
179
+ this._element.setAttribute('aria-modal', true)
180
+ this._element.setAttribute('role', 'dialog')
181
+ this._element.scrollTop = 0
182
+
183
+ const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)
184
+ if (modalBody) {
185
+ modalBody.scrollTop = 0
186
+ }
187
+
188
+ reflow(this._element)
189
+
190
+ this._element.classList.add(CLASS_NAME_SHOW)
191
+
192
+ const transitionComplete = () => {
193
+ if (this._config.focus) {
194
+ this._focustrap.activate()
195
+ }
196
+
197
+ this._isTransitioning = false
198
+ EventHandler.trigger(this._element, EVENT_SHOWN, {
199
+ relatedTarget
200
+ })
201
+ }
202
+
203
+ this._queueCallback(transitionComplete, this._dialog, this._isAnimated())
204
+ }
205
+
206
+ _addEventListeners() {
207
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
208
+ if (event.key !== ESCAPE_KEY) {
209
+ return
210
+ }
211
+
212
+ if (this._config.keyboard) {
213
+ this.hide()
214
+ return
215
+ }
216
+
217
+ this._triggerBackdropTransition()
218
+ })
219
+
220
+ EventHandler.on(window, EVENT_RESIZE, () => {
221
+ if (this._isShown && !this._isTransitioning) {
222
+ this._adjustDialog()
223
+ }
224
+ })
225
+
226
+ EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {
227
+ // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks
228
+ EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {
229
+ if (this._element !== event.target || this._element !== event2.target) {
230
+ return
231
+ }
232
+
233
+ if (this._config.backdrop === 'static') {
234
+ this._triggerBackdropTransition()
235
+ return
236
+ }
237
+
238
+ if (this._config.backdrop) {
239
+ this.hide()
240
+ }
241
+ })
242
+ })
243
+ }
244
+
245
+ _hideModal() {
246
+ this._element.style.display = 'none'
247
+ this._element.setAttribute('aria-hidden', true)
248
+ this._element.removeAttribute('aria-modal')
249
+ this._element.removeAttribute('role')
250
+ this._isTransitioning = false
251
+
252
+ this._backdrop.hide(() => {
253
+ document.body.classList.remove(CLASS_NAME_OPEN)
254
+ this._resetAdjustments()
255
+ this._scrollBar.reset()
256
+ EventHandler.trigger(this._element, EVENT_HIDDEN)
257
+ })
258
+ }
259
+
260
+ _isAnimated() {
261
+ return this._element.classList.contains(CLASS_NAME_FADE)
262
+ }
263
+
264
+ _triggerBackdropTransition() {
265
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)
266
+ if (hideEvent.defaultPrevented) {
267
+ return
268
+ }
269
+
270
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
271
+ const initialOverflowY = this._element.style.overflowY
272
+ // return if the following background transition hasn't yet completed
273
+ if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {
274
+ return
275
+ }
276
+
277
+ if (!isModalOverflowing) {
278
+ this._element.style.overflowY = 'hidden'
279
+ }
280
+
281
+ this._element.classList.add(CLASS_NAME_STATIC)
282
+ this._queueCallback(() => {
283
+ this._element.classList.remove(CLASS_NAME_STATIC)
284
+ this._queueCallback(() => {
285
+ this._element.style.overflowY = initialOverflowY
286
+ }, this._dialog)
287
+ }, this._dialog)
288
+
289
+ this._element.focus()
290
+ }
291
+
292
+ /**
293
+ * The following methods are used to handle overflowing modals
294
+ */
295
+
296
+ _adjustDialog() {
297
+ const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight
298
+ const scrollbarWidth = this._scrollBar.getWidth()
299
+ const isBodyOverflowing = scrollbarWidth > 0
300
+
301
+ if (isBodyOverflowing && !isModalOverflowing) {
302
+ const property = isRTL() ? 'paddingLeft' : 'paddingRight'
303
+ this._element.style[property] = `${scrollbarWidth}px`
304
+ }
305
+
306
+ if (!isBodyOverflowing && isModalOverflowing) {
307
+ const property = isRTL() ? 'paddingRight' : 'paddingLeft'
308
+ this._element.style[property] = `${scrollbarWidth}px`
309
+ }
310
+ }
311
+
312
+ _resetAdjustments() {
313
+ this._element.style.paddingLeft = ''
314
+ this._element.style.paddingRight = ''
315
+ }
316
+
317
+ // Static
318
+ static jQueryInterface(config, relatedTarget) {
319
+ return this.each(function () {
320
+ const data = Modal.getOrCreateInstance(this, config)
321
+
322
+ if (typeof config !== 'string') {
323
+ return
324
+ }
325
+
326
+ if (typeof data[config] === 'undefined') {
327
+ throw new TypeError(`No method named "${config}"`)
328
+ }
329
+
330
+ data[config](relatedTarget)
331
+ })
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Data API implementation
337
+ */
338
+
339
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
340
+ const target = SelectorEngine.getElementFromSelector(this)
341
+
342
+ if (['A', 'AREA'].includes(this.tagName)) {
343
+ event.preventDefault()
344
+ }
345
+
346
+ EventHandler.one(target, EVENT_SHOW, showEvent => {
347
+ if (showEvent.defaultPrevented) {
348
+ // only register focus restorer if modal will actually get shown
349
+ return
350
+ }
351
+
352
+ EventHandler.one(target, EVENT_HIDDEN, () => {
353
+ if (isVisible(this)) {
354
+ this.focus()
355
+ }
356
+ })
357
+ })
358
+
359
+ // avoid conflict when clicking modal toggler while another one is open
360
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)
361
+ if (alreadyOpen) {
362
+ Modal.getInstance(alreadyOpen).hide()
363
+ }
364
+
365
+ const data = Modal.getOrCreateInstance(target)
366
+
367
+ data.toggle(this)
368
+ })
369
+
370
+ enableDismissTrigger(Modal)
371
+
372
+ /**
373
+ * jQuery
374
+ */
375
+
376
+ defineJQueryPlugin(Modal)
377
+
378
+ export default Modal
@@ -0,0 +1,282 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap offcanvas.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import BaseComponent from './base-component.js'
9
+ import EventHandler from './dom/event-handler.js'
10
+ import SelectorEngine from './dom/selector-engine.js'
11
+ import Backdrop from './util/backdrop.js'
12
+ import { enableDismissTrigger } from './util/component-functions.js'
13
+ import FocusTrap from './util/focustrap.js'
14
+ import {
15
+ defineJQueryPlugin,
16
+ isDisabled,
17
+ isVisible
18
+ } from './util/index.js'
19
+ import ScrollBarHelper from './util/scrollbar.js'
20
+
21
+ /**
22
+ * Constants
23
+ */
24
+
25
+ const NAME = 'offcanvas'
26
+ const DATA_KEY = 'bs.offcanvas'
27
+ const EVENT_KEY = `.${DATA_KEY}`
28
+ const DATA_API_KEY = '.data-api'
29
+ const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
30
+ const ESCAPE_KEY = 'Escape'
31
+
32
+ const CLASS_NAME_SHOW = 'show'
33
+ const CLASS_NAME_SHOWING = 'showing'
34
+ const CLASS_NAME_HIDING = 'hiding'
35
+ const CLASS_NAME_BACKDROP = 'offcanvas-backdrop'
36
+ const OPEN_SELECTOR = '.offcanvas.show'
37
+
38
+ const EVENT_SHOW = `show${EVENT_KEY}`
39
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
40
+ const EVENT_HIDE = `hide${EVENT_KEY}`
41
+ const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`
42
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
43
+ const EVENT_RESIZE = `resize${EVENT_KEY}`
44
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
45
+ const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
46
+
47
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]'
48
+
49
+ const Default = {
50
+ backdrop: true,
51
+ keyboard: true,
52
+ scroll: false
53
+ }
54
+
55
+ const DefaultType = {
56
+ backdrop: '(boolean|string)',
57
+ keyboard: 'boolean',
58
+ scroll: 'boolean'
59
+ }
60
+
61
+ /**
62
+ * Class definition
63
+ */
64
+
65
+ class Offcanvas extends BaseComponent {
66
+ constructor(element, config) {
67
+ super(element, config)
68
+
69
+ this._isShown = false
70
+ this._backdrop = this._initializeBackDrop()
71
+ this._focustrap = this._initializeFocusTrap()
72
+ this._addEventListeners()
73
+ }
74
+
75
+ // Getters
76
+ static get Default() {
77
+ return Default
78
+ }
79
+
80
+ static get DefaultType() {
81
+ return DefaultType
82
+ }
83
+
84
+ static get NAME() {
85
+ return NAME
86
+ }
87
+
88
+ // Public
89
+ toggle(relatedTarget) {
90
+ return this._isShown ? this.hide() : this.show(relatedTarget)
91
+ }
92
+
93
+ show(relatedTarget) {
94
+ if (this._isShown) {
95
+ return
96
+ }
97
+
98
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })
99
+
100
+ if (showEvent.defaultPrevented) {
101
+ return
102
+ }
103
+
104
+ this._isShown = true
105
+ this._backdrop.show()
106
+
107
+ if (!this._config.scroll) {
108
+ new ScrollBarHelper().hide()
109
+ }
110
+
111
+ this._element.setAttribute('aria-modal', true)
112
+ this._element.setAttribute('role', 'dialog')
113
+ this._element.classList.add(CLASS_NAME_SHOWING)
114
+
115
+ const completeCallBack = () => {
116
+ if (!this._config.scroll || this._config.backdrop) {
117
+ this._focustrap.activate()
118
+ }
119
+
120
+ this._element.classList.add(CLASS_NAME_SHOW)
121
+ this._element.classList.remove(CLASS_NAME_SHOWING)
122
+ EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })
123
+ }
124
+
125
+ this._queueCallback(completeCallBack, this._element, true)
126
+ }
127
+
128
+ hide() {
129
+ if (!this._isShown) {
130
+ return
131
+ }
132
+
133
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)
134
+
135
+ if (hideEvent.defaultPrevented) {
136
+ return
137
+ }
138
+
139
+ this._focustrap.deactivate()
140
+ this._element.blur()
141
+ this._isShown = false
142
+ this._element.classList.add(CLASS_NAME_HIDING)
143
+ this._backdrop.hide()
144
+
145
+ const completeCallback = () => {
146
+ this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)
147
+ this._element.removeAttribute('aria-modal')
148
+ this._element.removeAttribute('role')
149
+
150
+ if (!this._config.scroll) {
151
+ new ScrollBarHelper().reset()
152
+ }
153
+
154
+ EventHandler.trigger(this._element, EVENT_HIDDEN)
155
+ }
156
+
157
+ this._queueCallback(completeCallback, this._element, true)
158
+ }
159
+
160
+ dispose() {
161
+ this._backdrop.dispose()
162
+ this._focustrap.deactivate()
163
+ super.dispose()
164
+ }
165
+
166
+ // Private
167
+ _initializeBackDrop() {
168
+ const clickCallback = () => {
169
+ if (this._config.backdrop === 'static') {
170
+ EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)
171
+ return
172
+ }
173
+
174
+ this.hide()
175
+ }
176
+
177
+ // 'static' option will be translated to true, and booleans will keep their value
178
+ const isVisible = Boolean(this._config.backdrop)
179
+
180
+ return new Backdrop({
181
+ className: CLASS_NAME_BACKDROP,
182
+ isVisible,
183
+ isAnimated: true,
184
+ rootElement: this._element.parentNode,
185
+ clickCallback: isVisible ? clickCallback : null
186
+ })
187
+ }
188
+
189
+ _initializeFocusTrap() {
190
+ return new FocusTrap({
191
+ trapElement: this._element
192
+ })
193
+ }
194
+
195
+ _addEventListeners() {
196
+ EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
197
+ if (event.key !== ESCAPE_KEY) {
198
+ return
199
+ }
200
+
201
+ if (this._config.keyboard) {
202
+ this.hide()
203
+ return
204
+ }
205
+
206
+ EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)
207
+ })
208
+ }
209
+
210
+ // Static
211
+ static jQueryInterface(config) {
212
+ return this.each(function () {
213
+ const data = Offcanvas.getOrCreateInstance(this, config)
214
+
215
+ if (typeof config !== 'string') {
216
+ return
217
+ }
218
+
219
+ if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
220
+ throw new TypeError(`No method named "${config}"`)
221
+ }
222
+
223
+ data[config](this)
224
+ })
225
+ }
226
+ }
227
+
228
+ /**
229
+ * Data API implementation
230
+ */
231
+
232
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
233
+ const target = SelectorEngine.getElementFromSelector(this)
234
+
235
+ if (['A', 'AREA'].includes(this.tagName)) {
236
+ event.preventDefault()
237
+ }
238
+
239
+ if (isDisabled(this)) {
240
+ return
241
+ }
242
+
243
+ EventHandler.one(target, EVENT_HIDDEN, () => {
244
+ // focus on trigger when it is closed
245
+ if (isVisible(this)) {
246
+ this.focus()
247
+ }
248
+ })
249
+
250
+ // avoid conflict when clicking a toggler of an offcanvas, while another is open
251
+ const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)
252
+ if (alreadyOpen && alreadyOpen !== target) {
253
+ Offcanvas.getInstance(alreadyOpen).hide()
254
+ }
255
+
256
+ const data = Offcanvas.getOrCreateInstance(target)
257
+ data.toggle(this)
258
+ })
259
+
260
+ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
261
+ for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
262
+ Offcanvas.getOrCreateInstance(selector).show()
263
+ }
264
+ })
265
+
266
+ EventHandler.on(window, EVENT_RESIZE, () => {
267
+ for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {
268
+ if (getComputedStyle(element).position !== 'fixed') {
269
+ Offcanvas.getOrCreateInstance(element).hide()
270
+ }
271
+ }
272
+ })
273
+
274
+ enableDismissTrigger(Offcanvas)
275
+
276
+ /**
277
+ * jQuery
278
+ */
279
+
280
+ defineJQueryPlugin(Offcanvas)
281
+
282
+ export default Offcanvas