insights4you-jekyll-theme 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -0
  3. data/README.md +114 -32
  4. data/_data/i4y-colors.json +218 -0
  5. data/_data/i4y-errors.json +32 -0
  6. data/_data/i4y-icons.json +1 -0
  7. data/_data/i4y-illustrations.json +20 -0
  8. data/_data/i4y-social-media.yml +24 -0
  9. data/_includes/card/profile.html +42 -0
  10. data/_includes/layout/footer.html +48 -0
  11. data/_includes/layout/head.html +79 -0
  12. data/_includes/layout/navbar-logo.html +137 -0
  13. data/_includes/layout/navbar.html +82 -0
  14. data/_includes/ui/button.html +13 -14
  15. data/_includes/ui/icon.html +24 -26
  16. data/_includes/ui/spinner.html +2 -0
  17. data/_includes/utils/banner.html +7 -0
  18. data/_includes/utils/settings.html +144 -0
  19. data/_layouts/base.html +63 -0
  20. data/_layouts/default.html +36 -11
  21. data/_sass/_bootstrap-components.scss +31 -0
  22. data/_sass/_bootstrap-config.scss +7 -0
  23. data/_sass/_bootstrap-override.scss +78 -0
  24. data/_sass/_config.scss +9 -0
  25. data/_sass/_core.scss +78 -0
  26. data/_sass/_debug.scss +49 -0
  27. data/_sass/_mixins.scss +2 -0
  28. data/_sass/_props.scss +91 -0
  29. data/_sass/_utilities-marketing.scss +209 -0
  30. data/_sass/_utilities.scss +135 -0
  31. data/_sass/_variables-dark.scss +19 -0
  32. data/_sass/_variables-marketing.scss +0 -0
  33. data/_sass/_variables.scss +1001 -0
  34. data/_sass/bootstrap/LICENSE +21 -0
  35. data/_sass/bootstrap/README.md +246 -0
  36. data/_sass/bootstrap/js/index.esm.js +19 -0
  37. data/_sass/bootstrap/js/index.umd.js +34 -0
  38. data/_sass/bootstrap/js/src/alert.js +87 -0
  39. data/_sass/bootstrap/js/src/base-component.js +85 -0
  40. data/_sass/bootstrap/js/src/button.js +72 -0
  41. data/_sass/bootstrap/js/src/carousel.js +474 -0
  42. data/_sass/bootstrap/js/src/collapse.js +297 -0
  43. data/_sass/bootstrap/js/src/dom/data.js +55 -0
  44. data/_sass/bootstrap/js/src/dom/event-handler.js +317 -0
  45. data/_sass/bootstrap/js/src/dom/manipulator.js +71 -0
  46. data/_sass/bootstrap/js/src/dom/selector-engine.js +126 -0
  47. data/_sass/bootstrap/js/src/dropdown.js +455 -0
  48. data/_sass/bootstrap/js/src/modal.js +378 -0
  49. data/_sass/bootstrap/js/src/offcanvas.js +282 -0
  50. data/_sass/bootstrap/js/src/popover.js +97 -0
  51. data/_sass/bootstrap/js/src/scrollspy.js +296 -0
  52. data/_sass/bootstrap/js/src/tab.js +315 -0
  53. data/_sass/bootstrap/js/src/toast.js +225 -0
  54. data/_sass/bootstrap/js/src/tooltip.js +633 -0
  55. data/_sass/bootstrap/js/src/util/backdrop.js +151 -0
  56. data/_sass/bootstrap/js/src/util/component-functions.js +35 -0
  57. data/_sass/bootstrap/js/src/util/config.js +65 -0
  58. data/_sass/bootstrap/js/src/util/focustrap.js +115 -0
  59. data/_sass/bootstrap/js/src/util/index.js +306 -0
  60. data/_sass/bootstrap/js/src/util/sanitizer.js +117 -0
  61. data/_sass/bootstrap/js/src/util/scrollbar.js +114 -0
  62. data/_sass/bootstrap/js/src/util/swipe.js +146 -0
  63. data/_sass/bootstrap/js/src/util/template-factory.js +160 -0
  64. data/_sass/bootstrap/package.json +184 -0
  65. data/_sass/bootstrap/scss/_accordion.scss +158 -0
  66. data/_sass/bootstrap/scss/_alert.scss +68 -0
  67. data/_sass/bootstrap/scss/_badge.scss +38 -0
  68. data/_sass/bootstrap/scss/_breadcrumb.scss +40 -0
  69. data/_sass/bootstrap/scss/_button-group.scss +142 -0
  70. data/_sass/bootstrap/scss/_buttons.scss +216 -0
  71. data/_sass/bootstrap/scss/_card.scss +239 -0
  72. data/_sass/bootstrap/scss/_carousel.scss +236 -0
  73. data/_sass/bootstrap/scss/_close.scss +63 -0
  74. data/_sass/bootstrap/scss/_containers.scss +41 -0
  75. data/_sass/bootstrap/scss/_dropdown.scss +250 -0
  76. data/_sass/bootstrap/scss/_forms.scss +9 -0
  77. data/_sass/bootstrap/scss/_functions.scss +302 -0
  78. data/_sass/bootstrap/scss/_grid.scss +39 -0
  79. data/_sass/bootstrap/scss/_helpers.scss +12 -0
  80. data/_sass/bootstrap/scss/_images.scss +42 -0
  81. data/_sass/bootstrap/scss/_list-group.scss +197 -0
  82. data/_sass/bootstrap/scss/_maps.scss +174 -0
  83. data/_sass/bootstrap/scss/_mixins.scss +42 -0
  84. data/_sass/bootstrap/scss/_modal.scss +236 -0
  85. data/_sass/bootstrap/scss/_nav.scss +197 -0
  86. data/_sass/bootstrap/scss/_navbar.scss +289 -0
  87. data/_sass/bootstrap/scss/_offcanvas.scss +143 -0
  88. data/_sass/bootstrap/scss/_pagination.scss +109 -0
  89. data/_sass/bootstrap/scss/_placeholders.scss +51 -0
  90. data/_sass/bootstrap/scss/_popover.scss +196 -0
  91. data/_sass/bootstrap/scss/_progress.scss +68 -0
  92. data/_sass/bootstrap/scss/_reboot.scss +611 -0
  93. data/_sass/bootstrap/scss/_root.scss +187 -0
  94. data/_sass/bootstrap/scss/_spinners.scss +85 -0
  95. data/_sass/bootstrap/scss/_tables.scss +171 -0
  96. data/_sass/bootstrap/scss/_toasts.scss +73 -0
  97. data/_sass/bootstrap/scss/_tooltip.scss +119 -0
  98. data/_sass/bootstrap/scss/_transitions.scss +27 -0
  99. data/_sass/bootstrap/scss/_type.scss +106 -0
  100. data/_sass/bootstrap/scss/_utilities.scss +806 -0
  101. data/_sass/bootstrap/scss/_variables-dark.scss +87 -0
  102. data/_sass/bootstrap/scss/_variables.scss +1751 -0
  103. data/_sass/bootstrap/scss/bootstrap-grid.scss +62 -0
  104. data/_sass/bootstrap/scss/bootstrap-reboot.scss +10 -0
  105. data/_sass/bootstrap/scss/bootstrap-utilities.scss +19 -0
  106. data/_sass/bootstrap/scss/bootstrap.scss +52 -0
  107. data/_sass/bootstrap/scss/forms/_floating-labels.scss +95 -0
  108. data/_sass/bootstrap/scss/forms/_form-check.scss +189 -0
  109. data/_sass/bootstrap/scss/forms/_form-control.scss +214 -0
  110. data/_sass/bootstrap/scss/forms/_form-range.scss +91 -0
  111. data/_sass/bootstrap/scss/forms/_form-select.scss +80 -0
  112. data/_sass/bootstrap/scss/forms/_form-text.scss +11 -0
  113. data/_sass/bootstrap/scss/forms/_input-group.scss +132 -0
  114. data/_sass/bootstrap/scss/forms/_labels.scss +36 -0
  115. data/_sass/bootstrap/scss/forms/_validation.scss +12 -0
  116. data/_sass/bootstrap/scss/helpers/_clearfix.scss +3 -0
  117. data/_sass/bootstrap/scss/helpers/_color-bg.scss +7 -0
  118. data/_sass/bootstrap/scss/helpers/_colored-links.scss +30 -0
  119. data/_sass/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  120. data/_sass/bootstrap/scss/helpers/_icon-link.scss +25 -0
  121. data/_sass/bootstrap/scss/helpers/_position.scss +36 -0
  122. data/_sass/bootstrap/scss/helpers/_ratio.scss +26 -0
  123. data/_sass/bootstrap/scss/helpers/_stacks.scss +15 -0
  124. data/_sass/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  125. data/_sass/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  126. data/_sass/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  127. data/_sass/bootstrap/scss/helpers/_vr.scss +8 -0
  128. data/_sass/bootstrap/scss/mixins/_alert.scss +18 -0
  129. data/_sass/bootstrap/scss/mixins/_backdrop.scss +14 -0
  130. data/_sass/bootstrap/scss/mixins/_banner.scss +7 -0
  131. data/_sass/bootstrap/scss/mixins/_border-radius.scss +78 -0
  132. data/_sass/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  133. data/_sass/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  134. data/_sass/bootstrap/scss/mixins/_buttons.scss +70 -0
  135. data/_sass/bootstrap/scss/mixins/_caret.scss +69 -0
  136. data/_sass/bootstrap/scss/mixins/_clearfix.scss +9 -0
  137. data/_sass/bootstrap/scss/mixins/_color-mode.scss +21 -0
  138. data/_sass/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  139. data/_sass/bootstrap/scss/mixins/_container.scss +11 -0
  140. data/_sass/bootstrap/scss/mixins/_deprecate.scss +10 -0
  141. data/_sass/bootstrap/scss/mixins/_forms.scss +163 -0
  142. data/_sass/bootstrap/scss/mixins/_gradients.scss +47 -0
  143. data/_sass/bootstrap/scss/mixins/_grid.scss +151 -0
  144. data/_sass/bootstrap/scss/mixins/_image.scss +16 -0
  145. data/_sass/bootstrap/scss/mixins/_list-group.scss +26 -0
  146. data/_sass/bootstrap/scss/mixins/_lists.scss +7 -0
  147. data/_sass/bootstrap/scss/mixins/_pagination.scss +10 -0
  148. data/_sass/bootstrap/scss/mixins/_reset-text.scss +17 -0
  149. data/_sass/bootstrap/scss/mixins/_resize.scss +6 -0
  150. data/_sass/bootstrap/scss/mixins/_table-variants.scss +24 -0
  151. data/_sass/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  152. data/_sass/bootstrap/scss/mixins/_transition.scss +26 -0
  153. data/_sass/bootstrap/scss/mixins/_utilities.scss +97 -0
  154. data/_sass/bootstrap/scss/mixins/_visually-hidden.scss +33 -0
  155. data/_sass/bootstrap/scss/utilities/_api.scss +47 -0
  156. data/_sass/fonts/_webfonts.scss +15 -0
  157. data/_sass/helpers/_index.scss +143 -0
  158. data/_sass/layout/_animations.scss +63 -0
  159. data/_sass/layout/_core.scss +62 -0
  160. data/_sass/layout/_dark.scss +77 -0
  161. data/_sass/layout/_footer.scss +12 -0
  162. data/_sass/layout/_navbar.scss +392 -0
  163. data/_sass/layout/_page.scss +169 -0
  164. data/_sass/layout/_root.scss +64 -0
  165. data/_sass/marketing/_browser.scss +67 -0
  166. data/_sass/marketing/_core.scss +8 -0
  167. data/_sass/marketing/_filters.scss +0 -0
  168. data/_sass/marketing/_hero.scss +69 -0
  169. data/_sass/marketing/_pricing.scss +111 -0
  170. data/_sass/marketing/_sections.scss +124 -0
  171. data/_sass/marketing/_shape.scss +31 -0
  172. data/_sass/mixins/_functions.scss +96 -0
  173. data/_sass/mixins/_mixins.scss +68 -0
  174. data/_sass/tabler-flags.scss +2 -0
  175. data/_sass/tabler-marketing.scss +13 -0
  176. data/_sass/tabler-payments.scss +2 -0
  177. data/_sass/tabler-props.scss +1 -0
  178. data/_sass/tabler-socials.scss +2 -0
  179. data/_sass/tabler-themes.scss +121 -0
  180. data/_sass/tabler-vendors.scss +16 -0
  181. data/_sass/tabler.scss +2 -0
  182. data/_sass/ui/_accordion.scss +177 -0
  183. data/_sass/ui/_alerts.scss +99 -0
  184. data/_sass/ui/_avatars.scss +145 -0
  185. data/_sass/ui/_badges.scss +113 -0
  186. data/_sass/ui/_breadcrumbs.scss +50 -0
  187. data/_sass/ui/_button-group.scss +16 -0
  188. data/_sass/ui/_buttons.scss +261 -0
  189. data/_sass/ui/_calendars.scss +104 -0
  190. data/_sass/ui/_cards.scss +594 -0
  191. data/_sass/ui/_carousel.scss +68 -0
  192. data/_sass/ui/_charts.scss +61 -0
  193. data/_sass/ui/_chat.scss +38 -0
  194. data/_sass/ui/_chips.scss +0 -0
  195. data/_sass/ui/_close.scss +60 -0
  196. data/_sass/ui/_datagrid.scss +17 -0
  197. data/_sass/ui/_dropdowns.scss +120 -0
  198. data/_sass/ui/_empty.scss +60 -0
  199. data/_sass/ui/_flags.scss +31 -0
  200. data/_sass/ui/_forms.scss +241 -0
  201. data/_sass/ui/_grid.scss +115 -0
  202. data/_sass/ui/_icons.scss +72 -0
  203. data/_sass/ui/_images.scss +19 -0
  204. data/_sass/ui/_legend.scss +12 -0
  205. data/_sass/ui/_lists.scss +124 -0
  206. data/_sass/ui/_loaders.scss +72 -0
  207. data/_sass/ui/_login.scss +3 -0
  208. data/_sass/ui/_markdown.scss +43 -0
  209. data/_sass/ui/_modals.scss +67 -0
  210. data/_sass/ui/_nav.scss +96 -0
  211. data/_sass/ui/_offcanvas.scss +17 -0
  212. data/_sass/ui/_pagination.scss +58 -0
  213. data/_sass/ui/_payments.scss +28 -0
  214. data/_sass/ui/_placeholder.scss +9 -0
  215. data/_sass/ui/_popovers.scss +2 -0
  216. data/_sass/ui/_progress.scss +107 -0
  217. data/_sass/ui/_ribbons.scss +157 -0
  218. data/_sass/ui/_segmented.scss +101 -0
  219. data/_sass/ui/_signature.scss +15 -0
  220. data/_sass/ui/_social.scss +52 -0
  221. data/_sass/ui/_stars.scss +13 -0
  222. data/_sass/ui/_status.scss +163 -0
  223. data/_sass/ui/_steps.scss +156 -0
  224. data/_sass/ui/_switch-icon.scss +211 -0
  225. data/_sass/ui/_tables.scss +177 -0
  226. data/_sass/ui/_tags.scss +57 -0
  227. data/_sass/ui/_timeline.scss +61 -0
  228. data/_sass/ui/_toasts.scss +18 -0
  229. data/_sass/ui/_toolbar.scss +10 -0
  230. data/_sass/ui/_tracking.scss +29 -0
  231. data/_sass/ui/_type.scss +268 -0
  232. data/_sass/ui/forms/_form-check.scss +91 -0
  233. data/_sass/ui/forms/_form-colorinput.scss +54 -0
  234. data/_sass/ui/forms/_form-custom.scss +28 -0
  235. data/_sass/ui/forms/_form-icon.scss +35 -0
  236. data/_sass/ui/forms/_form-imagecheck.scss +105 -0
  237. data/_sass/ui/forms/_form-selectgroup.scss +153 -0
  238. data/_sass/ui/forms/_validation.scss +13 -0
  239. data/_sass/ui/typo/_hr.scss +77 -0
  240. data/_sass/utils/_background.scss +15 -0
  241. data/_sass/utils/_colors.scss +100 -0
  242. data/_sass/utils/_opacity.scss +7 -0
  243. data/_sass/utils/_scroll.scss +47 -0
  244. data/_sass/utils/_shadow.scss +9 -0
  245. data/_sass/utils/_sizing.scss +6 -0
  246. data/_sass/utils/_text.scss +15 -0
  247. data/_sass/vendors/_apexcharts.scss +48 -0
  248. data/_sass/vendors/_coloris.scss +72 -0
  249. data/_sass/vendors/_dropzone.scss +27 -0
  250. data/_sass/vendors/_fslightbox.scss +13 -0
  251. data/_sass/vendors/_jsvectormap.scss +47 -0
  252. data/_sass/vendors/_litepicker.scss +69 -0
  253. data/_sass/vendors/_nouislider.scss +49 -0
  254. data/_sass/vendors/_plyr.scss +3 -0
  255. data/_sass/vendors/_stars-rating.scss +22 -0
  256. data/_sass/vendors/_tinymce.scss +34 -0
  257. data/_sass/vendors/_tom-select.scss +81 -0
  258. data/_sass/vendors/_turbo.scss +3 -0
  259. data/_sass/vendors/_typed.scss +4 -0
  260. data/_sass/vendors/_wysiwyg.scss +34 -0
  261. data/assets/css/main.scss +10 -0
  262. data/assets/images/i4y-logo.jpg +0 -0
  263. data/assets/images/preview-dark.png +0 -0
  264. data/assets/js/custom.js +175 -0
  265. data/assets/js/custom.min.js +1 -0
  266. data/assets/js/theme.js +11 -30
  267. data/assets/js/theme.min.js +12 -0
  268. data/insights4you-jekyll-theme.gemspec +93 -0
  269. metadata +393 -25
  270. data/_includes/footer.html +0 -45
  271. data/_includes/head.html +0 -63
  272. data/_includes/header-logo.html +0 -179
  273. data/_includes/header-navbar.html +0 -69
  274. data/_includes/header-svg.html +0 -39
  275. data/_layouts/home.html +0 -19
  276. data/assets/css/theme.min.css +0 -90
@@ -0,0 +1,71 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap dom/manipulator.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ function normalizeData(value) {
9
+ if (value === 'true') {
10
+ return true
11
+ }
12
+
13
+ if (value === 'false') {
14
+ return false
15
+ }
16
+
17
+ if (value === Number(value).toString()) {
18
+ return Number(value)
19
+ }
20
+
21
+ if (value === '' || value === 'null') {
22
+ return null
23
+ }
24
+
25
+ if (typeof value !== 'string') {
26
+ return value
27
+ }
28
+
29
+ try {
30
+ return JSON.parse(decodeURIComponent(value))
31
+ } catch {
32
+ return value
33
+ }
34
+ }
35
+
36
+ function normalizeDataKey(key) {
37
+ return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
38
+ }
39
+
40
+ const Manipulator = {
41
+ setDataAttribute(element, key, value) {
42
+ element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)
43
+ },
44
+
45
+ removeDataAttribute(element, key) {
46
+ element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)
47
+ },
48
+
49
+ getDataAttributes(element) {
50
+ if (!element) {
51
+ return {}
52
+ }
53
+
54
+ const attributes = {}
55
+ const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))
56
+
57
+ for (const key of bsKeys) {
58
+ let pureKey = key.replace(/^bs/, '')
59
+ pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
60
+ attributes[pureKey] = normalizeData(element.dataset[key])
61
+ }
62
+
63
+ return attributes
64
+ },
65
+
66
+ getDataAttribute(element, key) {
67
+ return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
68
+ }
69
+ }
70
+
71
+ export default Manipulator
@@ -0,0 +1,126 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap dom/selector-engine.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import { isDisabled, isVisible, parseSelector } from '../util/index.js'
9
+
10
+ const getSelector = element => {
11
+ let selector = element.getAttribute('data-bs-target')
12
+
13
+ if (!selector || selector === '#') {
14
+ let hrefAttribute = element.getAttribute('href')
15
+
16
+ // The only valid content that could double as a selector are IDs or classes,
17
+ // so everything starting with `#` or `.`. If a "real" URL is used as the selector,
18
+ // `document.querySelector` will rightfully complain it is invalid.
19
+ // See https://github.com/twbs/bootstrap/issues/32273
20
+ if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {
21
+ return null
22
+ }
23
+
24
+ // Just in case some CMS puts out a full URL with the anchor appended
25
+ if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {
26
+ hrefAttribute = `#${hrefAttribute.split('#')[1]}`
27
+ }
28
+
29
+ selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null
30
+ }
31
+
32
+ return selector ? selector.split(',').map(sel => parseSelector(sel)).join(',') : null
33
+ }
34
+
35
+ const SelectorEngine = {
36
+ find(selector, element = document.documentElement) {
37
+ return [].concat(...Element.prototype.querySelectorAll.call(element, selector))
38
+ },
39
+
40
+ findOne(selector, element = document.documentElement) {
41
+ return Element.prototype.querySelector.call(element, selector)
42
+ },
43
+
44
+ children(element, selector) {
45
+ return [].concat(...element.children).filter(child => child.matches(selector))
46
+ },
47
+
48
+ parents(element, selector) {
49
+ const parents = []
50
+ let ancestor = element.parentNode.closest(selector)
51
+
52
+ while (ancestor) {
53
+ parents.push(ancestor)
54
+ ancestor = ancestor.parentNode.closest(selector)
55
+ }
56
+
57
+ return parents
58
+ },
59
+
60
+ prev(element, selector) {
61
+ let previous = element.previousElementSibling
62
+
63
+ while (previous) {
64
+ if (previous.matches(selector)) {
65
+ return [previous]
66
+ }
67
+
68
+ previous = previous.previousElementSibling
69
+ }
70
+
71
+ return []
72
+ },
73
+ // TODO: this is now unused; remove later along with prev()
74
+ next(element, selector) {
75
+ let next = element.nextElementSibling
76
+
77
+ while (next) {
78
+ if (next.matches(selector)) {
79
+ return [next]
80
+ }
81
+
82
+ next = next.nextElementSibling
83
+ }
84
+
85
+ return []
86
+ },
87
+
88
+ focusableChildren(element) {
89
+ const focusables = [
90
+ 'a',
91
+ 'button',
92
+ 'input',
93
+ 'textarea',
94
+ 'select',
95
+ 'details',
96
+ '[tabindex]',
97
+ '[contenteditable="true"]'
98
+ ].map(selector => `${selector}:not([tabindex^="-"])`).join(',')
99
+
100
+ return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))
101
+ },
102
+
103
+ getSelectorFromElement(element) {
104
+ const selector = getSelector(element)
105
+
106
+ if (selector) {
107
+ return SelectorEngine.findOne(selector) ? selector : null
108
+ }
109
+
110
+ return null
111
+ },
112
+
113
+ getElementFromSelector(element) {
114
+ const selector = getSelector(element)
115
+
116
+ return selector ? SelectorEngine.findOne(selector) : null
117
+ },
118
+
119
+ getMultipleElementsFromSelector(element) {
120
+ const selector = getSelector(element)
121
+
122
+ return selector ? SelectorEngine.find(selector) : []
123
+ }
124
+ }
125
+
126
+ export default SelectorEngine
@@ -0,0 +1,455 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap dropdown.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import * as Popper from '@popperjs/core'
9
+ import BaseComponent from './base-component.js'
10
+ import EventHandler from './dom/event-handler.js'
11
+ import Manipulator from './dom/manipulator.js'
12
+ import SelectorEngine from './dom/selector-engine.js'
13
+ import {
14
+ defineJQueryPlugin,
15
+ execute,
16
+ getElement,
17
+ getNextActiveElement,
18
+ isDisabled,
19
+ isElement,
20
+ isRTL,
21
+ isVisible,
22
+ noop
23
+ } from './util/index.js'
24
+
25
+ /**
26
+ * Constants
27
+ */
28
+
29
+ const NAME = 'dropdown'
30
+ const DATA_KEY = 'bs.dropdown'
31
+ const EVENT_KEY = `.${DATA_KEY}`
32
+ const DATA_API_KEY = '.data-api'
33
+
34
+ const ESCAPE_KEY = 'Escape'
35
+ const TAB_KEY = 'Tab'
36
+ const ARROW_UP_KEY = 'ArrowUp'
37
+ const ARROW_DOWN_KEY = 'ArrowDown'
38
+ const RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button
39
+
40
+ const EVENT_HIDE = `hide${EVENT_KEY}`
41
+ const EVENT_HIDDEN = `hidden${EVENT_KEY}`
42
+ const EVENT_SHOW = `show${EVENT_KEY}`
43
+ const EVENT_SHOWN = `shown${EVENT_KEY}`
44
+ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
45
+ const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`
46
+ const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
47
+
48
+ const CLASS_NAME_SHOW = 'show'
49
+ const CLASS_NAME_DROPUP = 'dropup'
50
+ const CLASS_NAME_DROPEND = 'dropend'
51
+ const CLASS_NAME_DROPSTART = 'dropstart'
52
+ const CLASS_NAME_DROPUP_CENTER = 'dropup-center'
53
+ const CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'
54
+
55
+ const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)'
56
+ const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`
57
+ const SELECTOR_MENU = '.dropdown-menu'
58
+ const SELECTOR_NAVBAR = '.navbar'
59
+ const SELECTOR_NAVBAR_NAV = '.navbar-nav'
60
+ const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'
61
+
62
+ const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'
63
+ const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'
64
+ const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'
65
+ const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'
66
+ const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'
67
+ const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'
68
+ const PLACEMENT_TOPCENTER = 'top'
69
+ const PLACEMENT_BOTTOMCENTER = 'bottom'
70
+
71
+ const Default = {
72
+ autoClose: true,
73
+ boundary: 'clippingParents',
74
+ display: 'dynamic',
75
+ offset: [0, 2],
76
+ popperConfig: null,
77
+ reference: 'toggle'
78
+ }
79
+
80
+ const DefaultType = {
81
+ autoClose: '(boolean|string)',
82
+ boundary: '(string|element)',
83
+ display: 'string',
84
+ offset: '(array|string|function)',
85
+ popperConfig: '(null|object|function)',
86
+ reference: '(string|element|object)'
87
+ }
88
+
89
+ /**
90
+ * Class definition
91
+ */
92
+
93
+ class Dropdown extends BaseComponent {
94
+ constructor(element, config) {
95
+ super(element, config)
96
+
97
+ this._popper = null
98
+ this._parent = this._element.parentNode // dropdown wrapper
99
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
100
+ this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||
101
+ SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||
102
+ SelectorEngine.findOne(SELECTOR_MENU, this._parent)
103
+ this._inNavbar = this._detectNavbar()
104
+ }
105
+
106
+ // Getters
107
+ static get Default() {
108
+ return Default
109
+ }
110
+
111
+ static get DefaultType() {
112
+ return DefaultType
113
+ }
114
+
115
+ static get NAME() {
116
+ return NAME
117
+ }
118
+
119
+ // Public
120
+ toggle() {
121
+ return this._isShown() ? this.hide() : this.show()
122
+ }
123
+
124
+ show() {
125
+ if (isDisabled(this._element) || this._isShown()) {
126
+ return
127
+ }
128
+
129
+ const relatedTarget = {
130
+ relatedTarget: this._element
131
+ }
132
+
133
+ const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)
134
+
135
+ if (showEvent.defaultPrevented) {
136
+ return
137
+ }
138
+
139
+ this._createPopper()
140
+
141
+ // If this is a touch-enabled device we add extra
142
+ // empty mouseover listeners to the body's immediate children;
143
+ // only needed because of broken event delegation on iOS
144
+ // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html
145
+ if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
146
+ for (const element of [].concat(...document.body.children)) {
147
+ EventHandler.on(element, 'mouseover', noop)
148
+ }
149
+ }
150
+
151
+ this._element.focus()
152
+ this._element.setAttribute('aria-expanded', true)
153
+
154
+ this._menu.classList.add(CLASS_NAME_SHOW)
155
+ this._element.classList.add(CLASS_NAME_SHOW)
156
+ EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)
157
+ }
158
+
159
+ hide() {
160
+ if (isDisabled(this._element) || !this._isShown()) {
161
+ return
162
+ }
163
+
164
+ const relatedTarget = {
165
+ relatedTarget: this._element
166
+ }
167
+
168
+ this._completeHide(relatedTarget)
169
+ }
170
+
171
+ dispose() {
172
+ if (this._popper) {
173
+ this._popper.destroy()
174
+ }
175
+
176
+ super.dispose()
177
+ }
178
+
179
+ update() {
180
+ this._inNavbar = this._detectNavbar()
181
+ if (this._popper) {
182
+ this._popper.update()
183
+ }
184
+ }
185
+
186
+ // Private
187
+ _completeHide(relatedTarget) {
188
+ const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)
189
+ if (hideEvent.defaultPrevented) {
190
+ return
191
+ }
192
+
193
+ // If this is a touch-enabled device we remove the extra
194
+ // empty mouseover listeners we added for iOS support
195
+ if ('ontouchstart' in document.documentElement) {
196
+ for (const element of [].concat(...document.body.children)) {
197
+ EventHandler.off(element, 'mouseover', noop)
198
+ }
199
+ }
200
+
201
+ if (this._popper) {
202
+ this._popper.destroy()
203
+ }
204
+
205
+ this._menu.classList.remove(CLASS_NAME_SHOW)
206
+ this._element.classList.remove(CLASS_NAME_SHOW)
207
+ this._element.setAttribute('aria-expanded', 'false')
208
+ Manipulator.removeDataAttribute(this._menu, 'popper')
209
+ EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)
210
+ }
211
+
212
+ _getConfig(config) {
213
+ config = super._getConfig(config)
214
+
215
+ if (typeof config.reference === 'object' && !isElement(config.reference) &&
216
+ typeof config.reference.getBoundingClientRect !== 'function'
217
+ ) {
218
+ // Popper virtual elements require a getBoundingClientRect method
219
+ throw new TypeError(`${NAME.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`)
220
+ }
221
+
222
+ return config
223
+ }
224
+
225
+ _createPopper() {
226
+ if (typeof Popper === 'undefined') {
227
+ throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)')
228
+ }
229
+
230
+ let referenceElement = this._element
231
+
232
+ if (this._config.reference === 'parent') {
233
+ referenceElement = this._parent
234
+ } else if (isElement(this._config.reference)) {
235
+ referenceElement = getElement(this._config.reference)
236
+ } else if (typeof this._config.reference === 'object') {
237
+ referenceElement = this._config.reference
238
+ }
239
+
240
+ const popperConfig = this._getPopperConfig()
241
+ this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)
242
+ }
243
+
244
+ _isShown() {
245
+ return this._menu.classList.contains(CLASS_NAME_SHOW)
246
+ }
247
+
248
+ _getPlacement() {
249
+ const parentDropdown = this._parent
250
+
251
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
252
+ return PLACEMENT_RIGHT
253
+ }
254
+
255
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
256
+ return PLACEMENT_LEFT
257
+ }
258
+
259
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
260
+ return PLACEMENT_TOPCENTER
261
+ }
262
+
263
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
264
+ return PLACEMENT_BOTTOMCENTER
265
+ }
266
+
267
+ // We need to trim the value because custom properties can also include spaces
268
+ const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'
269
+
270
+ if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
271
+ return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP
272
+ }
273
+
274
+ return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM
275
+ }
276
+
277
+ _detectNavbar() {
278
+ return this._element.closest(SELECTOR_NAVBAR) !== null
279
+ }
280
+
281
+ _getOffset() {
282
+ const { offset } = this._config
283
+
284
+ if (typeof offset === 'string') {
285
+ return offset.split(',').map(value => Number.parseInt(value, 10))
286
+ }
287
+
288
+ if (typeof offset === 'function') {
289
+ return popperData => offset(popperData, this._element)
290
+ }
291
+
292
+ return offset
293
+ }
294
+
295
+ _getPopperConfig() {
296
+ const defaultBsPopperConfig = {
297
+ placement: this._getPlacement(),
298
+ modifiers: [{
299
+ name: 'preventOverflow',
300
+ options: {
301
+ boundary: this._config.boundary
302
+ }
303
+ },
304
+ {
305
+ name: 'offset',
306
+ options: {
307
+ offset: this._getOffset()
308
+ }
309
+ }]
310
+ }
311
+
312
+ // Disable Popper if we have a static display or Dropdown is in Navbar
313
+ if (this._inNavbar || this._config.display === 'static') {
314
+ Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove
315
+ defaultBsPopperConfig.modifiers = [{
316
+ name: 'applyStyles',
317
+ enabled: false
318
+ }]
319
+ }
320
+
321
+ return {
322
+ ...defaultBsPopperConfig,
323
+ ...execute(this._config.popperConfig, [defaultBsPopperConfig])
324
+ }
325
+ }
326
+
327
+ _selectMenuItem({ key, target }) {
328
+ const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))
329
+
330
+ if (!items.length) {
331
+ return
332
+ }
333
+
334
+ // if target isn't included in items (e.g. when expanding the dropdown)
335
+ // allow cycling to get the last item in case key equals ARROW_UP_KEY
336
+ getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()
337
+ }
338
+
339
+ // Static
340
+ static jQueryInterface(config) {
341
+ return this.each(function () {
342
+ const data = Dropdown.getOrCreateInstance(this, config)
343
+
344
+ if (typeof config !== 'string') {
345
+ return
346
+ }
347
+
348
+ if (typeof data[config] === 'undefined') {
349
+ throw new TypeError(`No method named "${config}"`)
350
+ }
351
+
352
+ data[config]()
353
+ })
354
+ }
355
+
356
+ static clearMenus(event) {
357
+ if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {
358
+ return
359
+ }
360
+
361
+ const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)
362
+
363
+ for (const toggle of openToggles) {
364
+ const context = Dropdown.getInstance(toggle)
365
+ if (!context || context._config.autoClose === false) {
366
+ continue
367
+ }
368
+
369
+ const composedPath = event.composedPath()
370
+ const isMenuTarget = composedPath.includes(context._menu)
371
+ if (
372
+ composedPath.includes(context._element) ||
373
+ (context._config.autoClose === 'inside' && !isMenuTarget) ||
374
+ (context._config.autoClose === 'outside' && isMenuTarget)
375
+ ) {
376
+ continue
377
+ }
378
+
379
+ // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu
380
+ if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {
381
+ continue
382
+ }
383
+
384
+ const relatedTarget = { relatedTarget: context._element }
385
+
386
+ if (event.type === 'click') {
387
+ relatedTarget.clickEvent = event
388
+ }
389
+
390
+ context._completeHide(relatedTarget)
391
+ }
392
+ }
393
+
394
+ static dataApiKeydownHandler(event) {
395
+ // If not an UP | DOWN | ESCAPE key => not a dropdown command
396
+ // If input/textarea && if key is other than ESCAPE => not a dropdown command
397
+
398
+ const isInput = /input|textarea/i.test(event.target.tagName)
399
+ const isEscapeEvent = event.key === ESCAPE_KEY
400
+ const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)
401
+
402
+ if (!isUpOrDownEvent && !isEscapeEvent) {
403
+ return
404
+ }
405
+
406
+ if (isInput && !isEscapeEvent) {
407
+ return
408
+ }
409
+
410
+ event.preventDefault()
411
+
412
+ // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/
413
+ const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?
414
+ this :
415
+ (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||
416
+ SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||
417
+ SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))
418
+
419
+ const instance = Dropdown.getOrCreateInstance(getToggleButton)
420
+
421
+ if (isUpOrDownEvent) {
422
+ event.stopPropagation()
423
+ instance.show()
424
+ instance._selectMenuItem(event)
425
+ return
426
+ }
427
+
428
+ if (instance._isShown()) { // else is escape and we check if it is shown
429
+ event.stopPropagation()
430
+ instance.hide()
431
+ getToggleButton.focus()
432
+ }
433
+ }
434
+ }
435
+
436
+ /**
437
+ * Data API implementation
438
+ */
439
+
440
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)
441
+ EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)
442
+ EventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)
443
+ EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)
444
+ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {
445
+ event.preventDefault()
446
+ Dropdown.getOrCreateInstance(this).toggle()
447
+ })
448
+
449
+ /**
450
+ * jQuery
451
+ */
452
+
453
+ defineJQueryPlugin(Dropdown)
454
+
455
+ export default Dropdown