@coreui/coreui 4.0.2
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.
- package/LICENSE +22 -0
- package/README.md +183 -0
- package/dist/css/coreui-grid.css +5004 -0
- package/dist/css/coreui-grid.css.map +1 -0
- package/dist/css/coreui-grid.min.css +8 -0
- package/dist/css/coreui-grid.min.css.map +1 -0
- package/dist/css/coreui-grid.rtl.css +5011 -0
- package/dist/css/coreui-grid.rtl.css.map +1 -0
- package/dist/css/coreui-grid.rtl.min.css +14 -0
- package/dist/css/coreui-grid.rtl.min.css.map +1 -0
- package/dist/css/coreui-reboot.css +440 -0
- package/dist/css/coreui-reboot.css.map +1 -0
- package/dist/css/coreui-reboot.min.css +8 -0
- package/dist/css/coreui-reboot.min.css.map +1 -0
- package/dist/css/coreui-reboot.rtl.css +441 -0
- package/dist/css/coreui-reboot.rtl.css.map +1 -0
- package/dist/css/coreui-reboot.rtl.min.css +14 -0
- package/dist/css/coreui-reboot.rtl.min.css.map +1 -0
- package/dist/css/coreui-utilities.css +5030 -0
- package/dist/css/coreui-utilities.css.map +1 -0
- package/dist/css/coreui-utilities.min.css +8 -0
- package/dist/css/coreui-utilities.min.css.map +1 -0
- package/dist/css/coreui-utilities.rtl.css +5024 -0
- package/dist/css/coreui-utilities.rtl.css.map +1 -0
- package/dist/css/coreui-utilities.rtl.min.css +14 -0
- package/dist/css/coreui-utilities.rtl.min.css.map +1 -0
- package/dist/css/coreui.css +12152 -0
- package/dist/css/coreui.css.map +1 -0
- package/dist/css/coreui.min.css +8 -0
- package/dist/css/coreui.min.css.map +1 -0
- package/dist/css/coreui.rtl.css +12041 -0
- package/dist/css/coreui.rtl.css.map +1 -0
- package/dist/css/coreui.rtl.min.css +14 -0
- package/dist/css/coreui.rtl.min.css.map +1 -0
- package/dist/js/coreui.bundle.js +7437 -0
- package/dist/js/coreui.bundle.js.map +1 -0
- package/dist/js/coreui.bundle.min.js +7 -0
- package/dist/js/coreui.bundle.min.js.map +1 -0
- package/dist/js/coreui.esm.js +5622 -0
- package/dist/js/coreui.esm.js.map +1 -0
- package/dist/js/coreui.esm.min.js +7 -0
- package/dist/js/coreui.esm.min.js.map +1 -0
- package/dist/js/coreui.js +5673 -0
- package/dist/js/coreui.js.map +1 -0
- package/dist/js/coreui.min.js +7 -0
- package/dist/js/coreui.min.js.map +1 -0
- package/js/dist/alert.js +208 -0
- package/js/dist/alert.js.map +1 -0
- package/js/dist/base-component.js +181 -0
- package/js/dist/base-component.js.map +1 -0
- package/js/dist/button.js +142 -0
- package/js/dist/button.js.map +1 -0
- package/js/dist/carousel.js +724 -0
- package/js/dist/carousel.js.map +1 -0
- package/js/dist/collapse.js +515 -0
- package/js/dist/collapse.js.map +1 -0
- package/js/dist/dom/data.js +72 -0
- package/js/dist/dom/data.js.map +1 -0
- package/js/dist/dom/event-handler.js +319 -0
- package/js/dist/dom/event-handler.js.map +1 -0
- package/js/dist/dom/manipulator.js +92 -0
- package/js/dist/dom/manipulator.js.map +1 -0
- package/js/dist/dom/selector-engine.js +89 -0
- package/js/dist/dom/selector-engine.js.map +1 -0
- package/js/dist/dropdown.js +700 -0
- package/js/dist/dropdown.js.map +1 -0
- package/js/dist/modal.js +891 -0
- package/js/dist/modal.js.map +1 -0
- package/js/dist/offcanvas.js +724 -0
- package/js/dist/offcanvas.js.map +1 -0
- package/js/dist/popover.js +220 -0
- package/js/dist/popover.js.map +1 -0
- package/js/dist/scrollspy.js +387 -0
- package/js/dist/scrollspy.js.map +1 -0
- package/js/dist/tab.js +317 -0
- package/js/dist/tab.js.map +1 -0
- package/js/dist/toast.js +331 -0
- package/js/dist/toast.js.map +1 -0
- package/js/dist/tooltip.js +997 -0
- package/js/dist/tooltip.js.map +1 -0
- package/js/src/alert.js +128 -0
- package/js/src/base-component.js +78 -0
- package/js/src/button.js +89 -0
- package/js/src/carousel.js +589 -0
- package/js/src/collapse.js +391 -0
- package/js/src/dom/data.js +60 -0
- package/js/src/dom/event-handler.js +352 -0
- package/js/src/dom/manipulator.js +83 -0
- package/js/src/dom/selector-engine.js +78 -0
- package/js/src/dropdown.js +517 -0
- package/js/src/modal.js +451 -0
- package/js/src/navigation.js +298 -0
- package/js/src/offcanvas.js +277 -0
- package/js/src/popover.js +173 -0
- package/js/src/scrollspy.js +298 -0
- package/js/src/sidebar.js +347 -0
- package/js/src/tab.js +227 -0
- package/js/src/toast.js +245 -0
- package/js/src/tooltip.js +750 -0
- package/js/src/util/backdrop.js +129 -0
- package/js/src/util/index.js +327 -0
- package/js/src/util/sanitizer.js +130 -0
- package/js/src/util/scrollbar.js +97 -0
- package/package.json +166 -0
- package/scss/_accordion.scss +118 -0
- package/scss/_alert.scss +52 -0
- package/scss/_avatar.scss +49 -0
- package/scss/_badge.scss +38 -0
- package/scss/_breadcrumb.scss +33 -0
- package/scss/_button-group.scss +139 -0
- package/scss/_buttons.scss +143 -0
- package/scss/_callout.scss +16 -0
- package/scss/_card.scss +215 -0
- package/scss/_carousel.scss +231 -0
- package/scss/_close.scss +40 -0
- package/scss/_containers.scss +41 -0
- package/scss/_dropdown.scss +227 -0
- package/scss/_footer.scss +25 -0
- package/scss/_forms.scss +9 -0
- package/scss/_functions.scss +356 -0
- package/scss/_grid.scss +56 -0
- package/scss/_header.scss +170 -0
- package/scss/_helpers.scss +7 -0
- package/scss/_icon.scss +32 -0
- package/scss/_images.scss +42 -0
- package/scss/_list-group.scss +169 -0
- package/scss/_mixins.scss +50 -0
- package/scss/_modal.scss +219 -0
- package/scss/_nav.scss +140 -0
- package/scss/_navbar.scss +254 -0
- package/scss/_offcanvas.scss +79 -0
- package/scss/_pagination.scss +64 -0
- package/scss/_popover.scss +158 -0
- package/scss/_progress.scss +91 -0
- package/scss/_reboot.scss +632 -0
- package/scss/_root.scss +25 -0
- package/scss/_sidebar.scss +3 -0
- package/scss/_spinners.scss +69 -0
- package/scss/_subheader.scss +72 -0
- package/scss/_tables.scss +166 -0
- package/scss/_toasts.scss +52 -0
- package/scss/_tooltip.scss +115 -0
- package/scss/_transitions.scss +21 -0
- package/scss/_type.scss +104 -0
- package/scss/_utilities.scss +678 -0
- package/scss/_variables.scss +1801 -0
- package/scss/coreui-grid.rtl.scss +12 -0
- package/scss/coreui-grid.scss +67 -0
- package/scss/coreui-reboot.rtl.scss +12 -0
- package/scss/coreui-reboot.scss +15 -0
- package/scss/coreui-utilities.rtl.scss +12 -0
- package/scss/coreui-utilities.scss +19 -0
- package/scss/coreui.rtl.scss +12 -0
- package/scss/coreui.scss +61 -0
- package/scss/forms/_floating-labels.scss +63 -0
- package/scss/forms/_form-check.scss +188 -0
- package/scss/forms/_form-control.scss +219 -0
- package/scss/forms/_form-range.scss +91 -0
- package/scss/forms/_form-select.scss +70 -0
- package/scss/forms/_form-text.scss +11 -0
- package/scss/forms/_input-group.scss +121 -0
- package/scss/forms/_labels.scss +36 -0
- package/scss/forms/_validation.scss +12 -0
- package/scss/helpers/_clearfix.scss +3 -0
- package/scss/helpers/_colored-links.scss +12 -0
- package/scss/helpers/_position.scss +30 -0
- package/scss/helpers/_ratio.scss +26 -0
- package/scss/helpers/_stretched-link.scss +15 -0
- package/scss/helpers/_text-truncation.scss +7 -0
- package/scss/helpers/_visually-hidden.scss +8 -0
- package/scss/mixins/_alert.scss +15 -0
- package/scss/mixins/_avatar.scss +10 -0
- package/scss/mixins/_border-radius.scss +78 -0
- package/scss/mixins/_box-shadow.scss +18 -0
- package/scss/mixins/_breakpoints.scss +140 -0
- package/scss/mixins/_buttons.scss +101 -0
- package/scss/mixins/_caret.scss +64 -0
- package/scss/mixins/_clearfix.scss +9 -0
- package/scss/mixins/_color-scheme.scss +7 -0
- package/scss/mixins/_container.scss +9 -0
- package/scss/mixins/_css-vars.scss +87 -0
- package/scss/mixins/_deprecate.scss +10 -0
- package/scss/mixins/_forms.scss +144 -0
- package/scss/mixins/_gradients.scss +47 -0
- package/scss/mixins/_grid.scss +132 -0
- package/scss/mixins/_icon.scss +6 -0
- package/scss/mixins/_image.scss +16 -0
- package/scss/mixins/_list-group.scss +18 -0
- package/scss/mixins/_lists.scss +7 -0
- package/scss/mixins/_ltr-rtl.scss +60 -0
- package/scss/mixins/_pagination.scss +31 -0
- package/scss/mixins/_reset-text.scss +17 -0
- package/scss/mixins/_resize.scss +6 -0
- package/scss/mixins/_table-variants.scss +16 -0
- package/scss/mixins/_text-truncate.scss +8 -0
- package/scss/mixins/_transition.scss +26 -0
- package/scss/mixins/_utilities.scss +104 -0
- package/scss/mixins/_visually-hidden.scss +29 -0
- package/scss/sidebar/_sidebar-narrow.scss +106 -0
- package/scss/sidebar/_sidebar-nav.scss +165 -0
- package/scss/sidebar/_sidebar.scss +261 -0
- package/scss/utilities/_api.scss +47 -0
- package/scss/vendor/_rfs.scss +354 -0
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* --------------------------------------------------------------------------
|
|
3
|
+
* CoreUI (v4.0.2): dropdown.js
|
|
4
|
+
* Licensed under MIT (https://coreui.io/license)
|
|
5
|
+
*
|
|
6
|
+
* This component is a modified version of the Bootstrap's offcanvas.js
|
|
7
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
|
8
|
+
* --------------------------------------------------------------------------
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
defineJQueryPlugin,
|
|
13
|
+
getElementFromSelector,
|
|
14
|
+
isDisabled,
|
|
15
|
+
isVisible,
|
|
16
|
+
typeCheckConfig
|
|
17
|
+
} from './util/index'
|
|
18
|
+
import ScrollBarHelper from './util/scrollbar'
|
|
19
|
+
import EventHandler from './dom/event-handler'
|
|
20
|
+
import BaseComponent from './base-component'
|
|
21
|
+
import SelectorEngine from './dom/selector-engine'
|
|
22
|
+
import Manipulator from './dom/manipulator'
|
|
23
|
+
import Backdrop from './util/backdrop'
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* ------------------------------------------------------------------------
|
|
27
|
+
* Constants
|
|
28
|
+
* ------------------------------------------------------------------------
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const NAME = 'offcanvas'
|
|
32
|
+
const DATA_KEY = 'coreui.offcanvas'
|
|
33
|
+
const EVENT_KEY = `.${DATA_KEY}`
|
|
34
|
+
const DATA_API_KEY = '.data-api'
|
|
35
|
+
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
|
|
36
|
+
const ESCAPE_KEY = 'Escape'
|
|
37
|
+
|
|
38
|
+
const Default = {
|
|
39
|
+
backdrop: true,
|
|
40
|
+
keyboard: true,
|
|
41
|
+
scroll: false
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const DefaultType = {
|
|
45
|
+
backdrop: 'boolean',
|
|
46
|
+
keyboard: 'boolean',
|
|
47
|
+
scroll: 'boolean'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const CLASS_NAME_SHOW = 'show'
|
|
51
|
+
const OPEN_SELECTOR = '.offcanvas.show'
|
|
52
|
+
|
|
53
|
+
const EVENT_SHOW = `show${EVENT_KEY}`
|
|
54
|
+
const EVENT_SHOWN = `shown${EVENT_KEY}`
|
|
55
|
+
const EVENT_HIDE = `hide${EVENT_KEY}`
|
|
56
|
+
const EVENT_HIDDEN = `hidden${EVENT_KEY}`
|
|
57
|
+
const EVENT_FOCUSIN = `focusin${EVENT_KEY}`
|
|
58
|
+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
|
|
59
|
+
const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`
|
|
60
|
+
const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`
|
|
61
|
+
|
|
62
|
+
const SELECTOR_DATA_DISMISS = '[data-coreui-dismiss="offcanvas"]'
|
|
63
|
+
const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="offcanvas"]'
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* ------------------------------------------------------------------------
|
|
67
|
+
* Class Definition
|
|
68
|
+
* ------------------------------------------------------------------------
|
|
69
|
+
*/
|
|
70
|
+
|
|
71
|
+
class Offcanvas extends BaseComponent {
|
|
72
|
+
constructor(element, config) {
|
|
73
|
+
super(element)
|
|
74
|
+
|
|
75
|
+
this._config = this._getConfig(config)
|
|
76
|
+
this._isShown = false
|
|
77
|
+
this._backdrop = this._initializeBackDrop()
|
|
78
|
+
this._addEventListeners()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Getters
|
|
82
|
+
|
|
83
|
+
static get NAME() {
|
|
84
|
+
return NAME
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
static get Default() {
|
|
88
|
+
return Default
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Public
|
|
92
|
+
|
|
93
|
+
toggle(relatedTarget) {
|
|
94
|
+
return this._isShown ? this.hide() : this.show(relatedTarget)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
show(relatedTarget) {
|
|
98
|
+
if (this._isShown) {
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })
|
|
103
|
+
|
|
104
|
+
if (showEvent.defaultPrevented) {
|
|
105
|
+
return
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
this._isShown = true
|
|
109
|
+
this._element.style.visibility = 'visible'
|
|
110
|
+
|
|
111
|
+
this._backdrop.show()
|
|
112
|
+
|
|
113
|
+
if (!this._config.scroll) {
|
|
114
|
+
new ScrollBarHelper().hide()
|
|
115
|
+
this._enforceFocusOnElement(this._element)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
this._element.removeAttribute('aria-hidden')
|
|
119
|
+
this._element.setAttribute('aria-modal', true)
|
|
120
|
+
this._element.setAttribute('role', 'dialog')
|
|
121
|
+
this._element.classList.add(CLASS_NAME_SHOW)
|
|
122
|
+
|
|
123
|
+
const completeCallBack = () => {
|
|
124
|
+
EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this._queueCallback(completeCallBack, this._element, true)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
hide() {
|
|
131
|
+
if (!this._isShown) {
|
|
132
|
+
return
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)
|
|
136
|
+
|
|
137
|
+
if (hideEvent.defaultPrevented) {
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
EventHandler.off(document, EVENT_FOCUSIN)
|
|
142
|
+
this._element.blur()
|
|
143
|
+
this._isShown = false
|
|
144
|
+
this._element.classList.remove(CLASS_NAME_SHOW)
|
|
145
|
+
this._backdrop.hide()
|
|
146
|
+
|
|
147
|
+
const completeCallback = () => {
|
|
148
|
+
this._element.setAttribute('aria-hidden', true)
|
|
149
|
+
this._element.removeAttribute('aria-modal')
|
|
150
|
+
this._element.removeAttribute('role')
|
|
151
|
+
this._element.style.visibility = 'hidden'
|
|
152
|
+
|
|
153
|
+
if (!this._config.scroll) {
|
|
154
|
+
new ScrollBarHelper().reset()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
EventHandler.trigger(this._element, EVENT_HIDDEN)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
this._queueCallback(completeCallback, this._element, true)
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
dispose() {
|
|
164
|
+
this._backdrop.dispose()
|
|
165
|
+
super.dispose()
|
|
166
|
+
EventHandler.off(document, EVENT_FOCUSIN)
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Private
|
|
170
|
+
|
|
171
|
+
_getConfig(config) {
|
|
172
|
+
config = {
|
|
173
|
+
...Default,
|
|
174
|
+
...Manipulator.getDataAttributes(this._element),
|
|
175
|
+
...(typeof config === 'object' ? config : {})
|
|
176
|
+
}
|
|
177
|
+
typeCheckConfig(NAME, config, DefaultType)
|
|
178
|
+
return config
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
_initializeBackDrop() {
|
|
182
|
+
return new Backdrop({
|
|
183
|
+
isVisible: this._config.backdrop,
|
|
184
|
+
isAnimated: true,
|
|
185
|
+
rootElement: this._element.parentNode,
|
|
186
|
+
clickCallback: () => this.hide()
|
|
187
|
+
})
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
_enforceFocusOnElement(element) {
|
|
191
|
+
EventHandler.off(document, EVENT_FOCUSIN) // guard against infinite focus loop
|
|
192
|
+
EventHandler.on(document, EVENT_FOCUSIN, event => {
|
|
193
|
+
if (document !== event.target &&
|
|
194
|
+
element !== event.target &&
|
|
195
|
+
!element.contains(event.target)) {
|
|
196
|
+
element.focus()
|
|
197
|
+
}
|
|
198
|
+
})
|
|
199
|
+
element.focus()
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
_addEventListeners() {
|
|
203
|
+
EventHandler.on(this._element, EVENT_CLICK_DISMISS, SELECTOR_DATA_DISMISS, () => this.hide())
|
|
204
|
+
|
|
205
|
+
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {
|
|
206
|
+
if (this._config.keyboard && event.key === ESCAPE_KEY) {
|
|
207
|
+
this.hide()
|
|
208
|
+
}
|
|
209
|
+
})
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Static
|
|
213
|
+
|
|
214
|
+
static jQueryInterface(config) {
|
|
215
|
+
return this.each(function () {
|
|
216
|
+
const data = Offcanvas.getOrCreateInstance(this, config)
|
|
217
|
+
|
|
218
|
+
if (typeof config !== 'string') {
|
|
219
|
+
return
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {
|
|
223
|
+
throw new TypeError(`No method named "${config}"`)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
data[config](this)
|
|
227
|
+
})
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* ------------------------------------------------------------------------
|
|
233
|
+
* Data Api implementation
|
|
234
|
+
* ------------------------------------------------------------------------
|
|
235
|
+
*/
|
|
236
|
+
|
|
237
|
+
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
|
|
238
|
+
const target = getElementFromSelector(this)
|
|
239
|
+
|
|
240
|
+
if (['A', 'AREA'].includes(this.tagName)) {
|
|
241
|
+
event.preventDefault()
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (isDisabled(this)) {
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
EventHandler.one(target, EVENT_HIDDEN, () => {
|
|
249
|
+
// focus on trigger when it is closed
|
|
250
|
+
if (isVisible(this)) {
|
|
251
|
+
this.focus()
|
|
252
|
+
}
|
|
253
|
+
})
|
|
254
|
+
|
|
255
|
+
// avoid conflict when clicking a toggler of an offcanvas, while another is open
|
|
256
|
+
const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)
|
|
257
|
+
if (allReadyOpen && allReadyOpen !== target) {
|
|
258
|
+
Offcanvas.getInstance(allReadyOpen).hide()
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const data = Offcanvas.getOrCreateInstance(target)
|
|
262
|
+
data.toggle(this)
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
EventHandler.on(window, EVENT_LOAD_DATA_API, () =>
|
|
266
|
+
SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* ------------------------------------------------------------------------
|
|
271
|
+
* jQuery
|
|
272
|
+
* ------------------------------------------------------------------------
|
|
273
|
+
*/
|
|
274
|
+
|
|
275
|
+
defineJQueryPlugin(Offcanvas)
|
|
276
|
+
|
|
277
|
+
export default Offcanvas
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* --------------------------------------------------------------------------
|
|
3
|
+
* CoreUI (v4.0.2): popover.js
|
|
4
|
+
* Licensed under MIT (https://coreui.io/license)
|
|
5
|
+
*
|
|
6
|
+
* This component is a modified version of the Bootstrap's popover.js
|
|
7
|
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
|
8
|
+
* --------------------------------------------------------------------------
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { defineJQueryPlugin } from './util/index'
|
|
12
|
+
import SelectorEngine from './dom/selector-engine'
|
|
13
|
+
import Tooltip from './tooltip'
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* ------------------------------------------------------------------------
|
|
17
|
+
* Constants
|
|
18
|
+
* ------------------------------------------------------------------------
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
const NAME = 'popover'
|
|
22
|
+
const DATA_KEY = 'coreui.popover'
|
|
23
|
+
const EVENT_KEY = `.${DATA_KEY}`
|
|
24
|
+
const CLASS_PREFIX = 'bs-popover'
|
|
25
|
+
const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
|
|
26
|
+
|
|
27
|
+
const Default = {
|
|
28
|
+
...Tooltip.Default,
|
|
29
|
+
placement: 'right',
|
|
30
|
+
offset: [0, 8],
|
|
31
|
+
trigger: 'click',
|
|
32
|
+
content: '',
|
|
33
|
+
template: '<div class="popover" role="tooltip">' +
|
|
34
|
+
'<div class="popover-arrow"></div>' +
|
|
35
|
+
'<h3 class="popover-header"></h3>' +
|
|
36
|
+
'<div class="popover-body"></div>' +
|
|
37
|
+
'</div>'
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const DefaultType = {
|
|
41
|
+
...Tooltip.DefaultType,
|
|
42
|
+
content: '(string|element|function)'
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const Event = {
|
|
46
|
+
HIDE: `hide${EVENT_KEY}`,
|
|
47
|
+
HIDDEN: `hidden${EVENT_KEY}`,
|
|
48
|
+
SHOW: `show${EVENT_KEY}`,
|
|
49
|
+
SHOWN: `shown${EVENT_KEY}`,
|
|
50
|
+
INSERTED: `inserted${EVENT_KEY}`,
|
|
51
|
+
CLICK: `click${EVENT_KEY}`,
|
|
52
|
+
FOCUSIN: `focusin${EVENT_KEY}`,
|
|
53
|
+
FOCUSOUT: `focusout${EVENT_KEY}`,
|
|
54
|
+
MOUSEENTER: `mouseenter${EVENT_KEY}`,
|
|
55
|
+
MOUSELEAVE: `mouseleave${EVENT_KEY}`
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const CLASS_NAME_FADE = 'fade'
|
|
59
|
+
const CLASS_NAME_SHOW = 'show'
|
|
60
|
+
|
|
61
|
+
const SELECTOR_TITLE = '.popover-header'
|
|
62
|
+
const SELECTOR_CONTENT = '.popover-body'
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* ------------------------------------------------------------------------
|
|
66
|
+
* Class Definition
|
|
67
|
+
* ------------------------------------------------------------------------
|
|
68
|
+
*/
|
|
69
|
+
|
|
70
|
+
class Popover extends Tooltip {
|
|
71
|
+
// Getters
|
|
72
|
+
|
|
73
|
+
static get Default() {
|
|
74
|
+
return Default
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
static get NAME() {
|
|
78
|
+
return NAME
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
static get Event() {
|
|
82
|
+
return Event
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static get DefaultType() {
|
|
86
|
+
return DefaultType
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Overrides
|
|
90
|
+
|
|
91
|
+
isWithContent() {
|
|
92
|
+
return this.getTitle() || this._getContent()
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
getTipElement() {
|
|
96
|
+
if (this.tip) {
|
|
97
|
+
return this.tip
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
this.tip = super.getTipElement()
|
|
101
|
+
|
|
102
|
+
if (!this.getTitle()) {
|
|
103
|
+
SelectorEngine.findOne(SELECTOR_TITLE, this.tip).remove()
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
if (!this._getContent()) {
|
|
107
|
+
SelectorEngine.findOne(SELECTOR_CONTENT, this.tip).remove()
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return this.tip
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
setContent() {
|
|
114
|
+
const tip = this.getTipElement()
|
|
115
|
+
|
|
116
|
+
// we use append for html objects to maintain js events
|
|
117
|
+
this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle())
|
|
118
|
+
let content = this._getContent()
|
|
119
|
+
if (typeof content === 'function') {
|
|
120
|
+
content = content.call(this._element)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content)
|
|
124
|
+
|
|
125
|
+
tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Private
|
|
129
|
+
|
|
130
|
+
_addAttachmentClass(attachment) {
|
|
131
|
+
this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`)
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
_getContent() {
|
|
135
|
+
return this._element.getAttribute('data-coreui-content') || this._config.content
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
_cleanTipClass() {
|
|
139
|
+
const tip = this.getTipElement()
|
|
140
|
+
const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX)
|
|
141
|
+
if (tabClass !== null && tabClass.length > 0) {
|
|
142
|
+
tabClass.map(token => token.trim())
|
|
143
|
+
.forEach(tClass => tip.classList.remove(tClass))
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Static
|
|
148
|
+
|
|
149
|
+
static jQueryInterface(config) {
|
|
150
|
+
return this.each(function () {
|
|
151
|
+
const data = Popover.getOrCreateInstance(this, config)
|
|
152
|
+
|
|
153
|
+
if (typeof config === 'string') {
|
|
154
|
+
if (typeof data[config] === 'undefined') {
|
|
155
|
+
throw new TypeError(`No method named "${config}"`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
data[config]()
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* ------------------------------------------------------------------------
|
|
166
|
+
* jQuery
|
|
167
|
+
* ------------------------------------------------------------------------
|
|
168
|
+
* add .Popover to jQuery only if jQuery is present
|
|
169
|
+
*/
|
|
170
|
+
|
|
171
|
+
defineJQueryPlugin(Popover)
|
|
172
|
+
|
|
173
|
+
export default Popover
|