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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +110 -0
- data/README.md +114 -32
- data/_data/i4y-colors.json +218 -0
- data/_data/i4y-errors.json +32 -0
- data/_data/i4y-icons.json +1 -0
- data/_data/i4y-illustrations.json +20 -0
- data/_data/i4y-social-media.yml +24 -0
- data/_includes/card/profile.html +42 -0
- data/_includes/layout/footer.html +48 -0
- data/_includes/layout/head.html +79 -0
- data/_includes/layout/navbar-logo.html +137 -0
- data/_includes/layout/navbar.html +82 -0
- data/_includes/ui/button.html +13 -14
- data/_includes/ui/icon.html +24 -26
- data/_includes/ui/spinner.html +2 -0
- data/_includes/utils/banner.html +7 -0
- data/_includes/utils/settings.html +144 -0
- data/_layouts/base.html +63 -0
- data/_layouts/default.html +36 -11
- data/_sass/_bootstrap-components.scss +31 -0
- data/_sass/_bootstrap-config.scss +7 -0
- data/_sass/_bootstrap-override.scss +78 -0
- data/_sass/_config.scss +9 -0
- data/_sass/_core.scss +78 -0
- data/_sass/_debug.scss +49 -0
- data/_sass/_mixins.scss +2 -0
- data/_sass/_props.scss +91 -0
- data/_sass/_utilities-marketing.scss +209 -0
- data/_sass/_utilities.scss +135 -0
- data/_sass/_variables-dark.scss +19 -0
- data/_sass/_variables-marketing.scss +0 -0
- data/_sass/_variables.scss +1001 -0
- data/_sass/bootstrap/LICENSE +21 -0
- data/_sass/bootstrap/README.md +246 -0
- data/_sass/bootstrap/js/index.esm.js +19 -0
- data/_sass/bootstrap/js/index.umd.js +34 -0
- data/_sass/bootstrap/js/src/alert.js +87 -0
- data/_sass/bootstrap/js/src/base-component.js +85 -0
- data/_sass/bootstrap/js/src/button.js +72 -0
- data/_sass/bootstrap/js/src/carousel.js +474 -0
- data/_sass/bootstrap/js/src/collapse.js +297 -0
- data/_sass/bootstrap/js/src/dom/data.js +55 -0
- data/_sass/bootstrap/js/src/dom/event-handler.js +317 -0
- data/_sass/bootstrap/js/src/dom/manipulator.js +71 -0
- data/_sass/bootstrap/js/src/dom/selector-engine.js +126 -0
- data/_sass/bootstrap/js/src/dropdown.js +455 -0
- data/_sass/bootstrap/js/src/modal.js +378 -0
- data/_sass/bootstrap/js/src/offcanvas.js +282 -0
- data/_sass/bootstrap/js/src/popover.js +97 -0
- data/_sass/bootstrap/js/src/scrollspy.js +296 -0
- data/_sass/bootstrap/js/src/tab.js +315 -0
- data/_sass/bootstrap/js/src/toast.js +225 -0
- data/_sass/bootstrap/js/src/tooltip.js +633 -0
- data/_sass/bootstrap/js/src/util/backdrop.js +151 -0
- data/_sass/bootstrap/js/src/util/component-functions.js +35 -0
- data/_sass/bootstrap/js/src/util/config.js +65 -0
- data/_sass/bootstrap/js/src/util/focustrap.js +115 -0
- data/_sass/bootstrap/js/src/util/index.js +306 -0
- data/_sass/bootstrap/js/src/util/sanitizer.js +117 -0
- data/_sass/bootstrap/js/src/util/scrollbar.js +114 -0
- data/_sass/bootstrap/js/src/util/swipe.js +146 -0
- data/_sass/bootstrap/js/src/util/template-factory.js +160 -0
- data/_sass/bootstrap/package.json +184 -0
- data/_sass/bootstrap/scss/_accordion.scss +158 -0
- data/_sass/bootstrap/scss/_alert.scss +68 -0
- data/_sass/bootstrap/scss/_badge.scss +38 -0
- data/_sass/bootstrap/scss/_breadcrumb.scss +40 -0
- data/_sass/bootstrap/scss/_button-group.scss +142 -0
- data/_sass/bootstrap/scss/_buttons.scss +216 -0
- data/_sass/bootstrap/scss/_card.scss +239 -0
- data/_sass/bootstrap/scss/_carousel.scss +236 -0
- data/_sass/bootstrap/scss/_close.scss +63 -0
- data/_sass/bootstrap/scss/_containers.scss +41 -0
- data/_sass/bootstrap/scss/_dropdown.scss +250 -0
- data/_sass/bootstrap/scss/_forms.scss +9 -0
- data/_sass/bootstrap/scss/_functions.scss +302 -0
- data/_sass/bootstrap/scss/_grid.scss +39 -0
- data/_sass/bootstrap/scss/_helpers.scss +12 -0
- data/_sass/bootstrap/scss/_images.scss +42 -0
- data/_sass/bootstrap/scss/_list-group.scss +197 -0
- data/_sass/bootstrap/scss/_maps.scss +174 -0
- data/_sass/bootstrap/scss/_mixins.scss +42 -0
- data/_sass/bootstrap/scss/_modal.scss +236 -0
- data/_sass/bootstrap/scss/_nav.scss +197 -0
- data/_sass/bootstrap/scss/_navbar.scss +289 -0
- data/_sass/bootstrap/scss/_offcanvas.scss +143 -0
- data/_sass/bootstrap/scss/_pagination.scss +109 -0
- data/_sass/bootstrap/scss/_placeholders.scss +51 -0
- data/_sass/bootstrap/scss/_popover.scss +196 -0
- data/_sass/bootstrap/scss/_progress.scss +68 -0
- data/_sass/bootstrap/scss/_reboot.scss +611 -0
- data/_sass/bootstrap/scss/_root.scss +187 -0
- data/_sass/bootstrap/scss/_spinners.scss +85 -0
- data/_sass/bootstrap/scss/_tables.scss +171 -0
- data/_sass/bootstrap/scss/_toasts.scss +73 -0
- data/_sass/bootstrap/scss/_tooltip.scss +119 -0
- data/_sass/bootstrap/scss/_transitions.scss +27 -0
- data/_sass/bootstrap/scss/_type.scss +106 -0
- data/_sass/bootstrap/scss/_utilities.scss +806 -0
- data/_sass/bootstrap/scss/_variables-dark.scss +87 -0
- data/_sass/bootstrap/scss/_variables.scss +1751 -0
- data/_sass/bootstrap/scss/bootstrap-grid.scss +62 -0
- data/_sass/bootstrap/scss/bootstrap-reboot.scss +10 -0
- data/_sass/bootstrap/scss/bootstrap-utilities.scss +19 -0
- data/_sass/bootstrap/scss/bootstrap.scss +52 -0
- data/_sass/bootstrap/scss/forms/_floating-labels.scss +95 -0
- data/_sass/bootstrap/scss/forms/_form-check.scss +189 -0
- data/_sass/bootstrap/scss/forms/_form-control.scss +214 -0
- data/_sass/bootstrap/scss/forms/_form-range.scss +91 -0
- data/_sass/bootstrap/scss/forms/_form-select.scss +80 -0
- data/_sass/bootstrap/scss/forms/_form-text.scss +11 -0
- data/_sass/bootstrap/scss/forms/_input-group.scss +132 -0
- data/_sass/bootstrap/scss/forms/_labels.scss +36 -0
- data/_sass/bootstrap/scss/forms/_validation.scss +12 -0
- data/_sass/bootstrap/scss/helpers/_clearfix.scss +3 -0
- data/_sass/bootstrap/scss/helpers/_color-bg.scss +7 -0
- data/_sass/bootstrap/scss/helpers/_colored-links.scss +30 -0
- data/_sass/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- data/_sass/bootstrap/scss/helpers/_icon-link.scss +25 -0
- data/_sass/bootstrap/scss/helpers/_position.scss +36 -0
- data/_sass/bootstrap/scss/helpers/_ratio.scss +26 -0
- data/_sass/bootstrap/scss/helpers/_stacks.scss +15 -0
- data/_sass/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- data/_sass/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- data/_sass/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- data/_sass/bootstrap/scss/helpers/_vr.scss +8 -0
- data/_sass/bootstrap/scss/mixins/_alert.scss +18 -0
- data/_sass/bootstrap/scss/mixins/_backdrop.scss +14 -0
- data/_sass/bootstrap/scss/mixins/_banner.scss +7 -0
- data/_sass/bootstrap/scss/mixins/_border-radius.scss +78 -0
- data/_sass/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- data/_sass/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- data/_sass/bootstrap/scss/mixins/_buttons.scss +70 -0
- data/_sass/bootstrap/scss/mixins/_caret.scss +69 -0
- data/_sass/bootstrap/scss/mixins/_clearfix.scss +9 -0
- data/_sass/bootstrap/scss/mixins/_color-mode.scss +21 -0
- data/_sass/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- data/_sass/bootstrap/scss/mixins/_container.scss +11 -0
- data/_sass/bootstrap/scss/mixins/_deprecate.scss +10 -0
- data/_sass/bootstrap/scss/mixins/_forms.scss +163 -0
- data/_sass/bootstrap/scss/mixins/_gradients.scss +47 -0
- data/_sass/bootstrap/scss/mixins/_grid.scss +151 -0
- data/_sass/bootstrap/scss/mixins/_image.scss +16 -0
- data/_sass/bootstrap/scss/mixins/_list-group.scss +26 -0
- data/_sass/bootstrap/scss/mixins/_lists.scss +7 -0
- data/_sass/bootstrap/scss/mixins/_pagination.scss +10 -0
- data/_sass/bootstrap/scss/mixins/_reset-text.scss +17 -0
- data/_sass/bootstrap/scss/mixins/_resize.scss +6 -0
- data/_sass/bootstrap/scss/mixins/_table-variants.scss +24 -0
- data/_sass/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- data/_sass/bootstrap/scss/mixins/_transition.scss +26 -0
- data/_sass/bootstrap/scss/mixins/_utilities.scss +97 -0
- data/_sass/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
- data/_sass/bootstrap/scss/utilities/_api.scss +47 -0
- data/_sass/fonts/_webfonts.scss +15 -0
- data/_sass/helpers/_index.scss +143 -0
- data/_sass/layout/_animations.scss +63 -0
- data/_sass/layout/_core.scss +62 -0
- data/_sass/layout/_dark.scss +77 -0
- data/_sass/layout/_footer.scss +12 -0
- data/_sass/layout/_navbar.scss +392 -0
- data/_sass/layout/_page.scss +169 -0
- data/_sass/layout/_root.scss +64 -0
- data/_sass/marketing/_browser.scss +67 -0
- data/_sass/marketing/_core.scss +8 -0
- data/_sass/marketing/_filters.scss +0 -0
- data/_sass/marketing/_hero.scss +69 -0
- data/_sass/marketing/_pricing.scss +111 -0
- data/_sass/marketing/_sections.scss +124 -0
- data/_sass/marketing/_shape.scss +31 -0
- data/_sass/mixins/_functions.scss +96 -0
- data/_sass/mixins/_mixins.scss +68 -0
- data/_sass/tabler-flags.scss +2 -0
- data/_sass/tabler-marketing.scss +13 -0
- data/_sass/tabler-payments.scss +2 -0
- data/_sass/tabler-props.scss +1 -0
- data/_sass/tabler-socials.scss +2 -0
- data/_sass/tabler-themes.scss +121 -0
- data/_sass/tabler-vendors.scss +16 -0
- data/_sass/tabler.scss +2 -0
- data/_sass/ui/_accordion.scss +177 -0
- data/_sass/ui/_alerts.scss +99 -0
- data/_sass/ui/_avatars.scss +145 -0
- data/_sass/ui/_badges.scss +113 -0
- data/_sass/ui/_breadcrumbs.scss +50 -0
- data/_sass/ui/_button-group.scss +16 -0
- data/_sass/ui/_buttons.scss +261 -0
- data/_sass/ui/_calendars.scss +104 -0
- data/_sass/ui/_cards.scss +594 -0
- data/_sass/ui/_carousel.scss +68 -0
- data/_sass/ui/_charts.scss +61 -0
- data/_sass/ui/_chat.scss +38 -0
- data/_sass/ui/_chips.scss +0 -0
- data/_sass/ui/_close.scss +60 -0
- data/_sass/ui/_datagrid.scss +17 -0
- data/_sass/ui/_dropdowns.scss +120 -0
- data/_sass/ui/_empty.scss +60 -0
- data/_sass/ui/_flags.scss +31 -0
- data/_sass/ui/_forms.scss +241 -0
- data/_sass/ui/_grid.scss +115 -0
- data/_sass/ui/_icons.scss +72 -0
- data/_sass/ui/_images.scss +19 -0
- data/_sass/ui/_legend.scss +12 -0
- data/_sass/ui/_lists.scss +124 -0
- data/_sass/ui/_loaders.scss +72 -0
- data/_sass/ui/_login.scss +3 -0
- data/_sass/ui/_markdown.scss +43 -0
- data/_sass/ui/_modals.scss +67 -0
- data/_sass/ui/_nav.scss +96 -0
- data/_sass/ui/_offcanvas.scss +17 -0
- data/_sass/ui/_pagination.scss +58 -0
- data/_sass/ui/_payments.scss +28 -0
- data/_sass/ui/_placeholder.scss +9 -0
- data/_sass/ui/_popovers.scss +2 -0
- data/_sass/ui/_progress.scss +107 -0
- data/_sass/ui/_ribbons.scss +157 -0
- data/_sass/ui/_segmented.scss +101 -0
- data/_sass/ui/_signature.scss +15 -0
- data/_sass/ui/_social.scss +52 -0
- data/_sass/ui/_stars.scss +13 -0
- data/_sass/ui/_status.scss +163 -0
- data/_sass/ui/_steps.scss +156 -0
- data/_sass/ui/_switch-icon.scss +211 -0
- data/_sass/ui/_tables.scss +177 -0
- data/_sass/ui/_tags.scss +57 -0
- data/_sass/ui/_timeline.scss +61 -0
- data/_sass/ui/_toasts.scss +18 -0
- data/_sass/ui/_toolbar.scss +10 -0
- data/_sass/ui/_tracking.scss +29 -0
- data/_sass/ui/_type.scss +268 -0
- data/_sass/ui/forms/_form-check.scss +91 -0
- data/_sass/ui/forms/_form-colorinput.scss +54 -0
- data/_sass/ui/forms/_form-custom.scss +28 -0
- data/_sass/ui/forms/_form-icon.scss +35 -0
- data/_sass/ui/forms/_form-imagecheck.scss +105 -0
- data/_sass/ui/forms/_form-selectgroup.scss +153 -0
- data/_sass/ui/forms/_validation.scss +13 -0
- data/_sass/ui/typo/_hr.scss +77 -0
- data/_sass/utils/_background.scss +15 -0
- data/_sass/utils/_colors.scss +100 -0
- data/_sass/utils/_opacity.scss +7 -0
- data/_sass/utils/_scroll.scss +47 -0
- data/_sass/utils/_shadow.scss +9 -0
- data/_sass/utils/_sizing.scss +6 -0
- data/_sass/utils/_text.scss +15 -0
- data/_sass/vendors/_apexcharts.scss +48 -0
- data/_sass/vendors/_coloris.scss +72 -0
- data/_sass/vendors/_dropzone.scss +27 -0
- data/_sass/vendors/_fslightbox.scss +13 -0
- data/_sass/vendors/_jsvectormap.scss +47 -0
- data/_sass/vendors/_litepicker.scss +69 -0
- data/_sass/vendors/_nouislider.scss +49 -0
- data/_sass/vendors/_plyr.scss +3 -0
- data/_sass/vendors/_stars-rating.scss +22 -0
- data/_sass/vendors/_tinymce.scss +34 -0
- data/_sass/vendors/_tom-select.scss +81 -0
- data/_sass/vendors/_turbo.scss +3 -0
- data/_sass/vendors/_typed.scss +4 -0
- data/_sass/vendors/_wysiwyg.scss +34 -0
- data/assets/css/main.scss +10 -0
- data/assets/images/i4y-logo.jpg +0 -0
- data/assets/images/preview-dark.png +0 -0
- data/assets/js/custom.js +175 -0
- data/assets/js/custom.min.js +1 -0
- data/assets/js/theme.js +11 -30
- data/assets/js/theme.min.js +12 -0
- data/insights4you-jekyll-theme.gemspec +93 -0
- metadata +393 -25
- data/_includes/footer.html +0 -45
- data/_includes/head.html +0 -63
- data/_includes/header-logo.html +0 -179
- data/_includes/header-navbar.html +0 -69
- data/_includes/header-svg.html +0 -39
- data/_layouts/home.html +0 -19
- 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
|