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,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