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