inkstream 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (218) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +21 -0
  3. data/README.md +93 -0
  4. data/_config.yml +122 -0
  5. data/_includes/button.html +4 -0
  6. data/_includes/icon.html +1 -0
  7. data/_includes/nav-default.html +23 -0
  8. data/_includes/nav-header.html +25 -0
  9. data/_includes/post-list.html +59 -0
  10. data/_includes/post-meta.html +0 -0
  11. data/_includes/post-pagination.html +29 -0
  12. data/_includes/promo-section.html +12 -0
  13. data/_includes/site-before-end.html +1 -0
  14. data/_includes/site-before-start.html +1 -0
  15. data/_includes/site-favicons.html +7 -0
  16. data/_includes/site-fonts.html +13 -0
  17. data/_includes/site-footer-default.html +17 -0
  18. data/_includes/site-footer.html +12 -0
  19. data/_includes/site-header.html +46 -0
  20. data/_includes/site-styles.html +6 -0
  21. data/_layouts/blog.html +24 -0
  22. data/_layouts/default.html +62 -0
  23. data/_layouts/page.html +35 -0
  24. data/_layouts/post.html +201 -0
  25. data/assets/css/styles.css +11167 -0
  26. data/assets/images/about-me.jpg +0 -0
  27. data/assets/images/blog/blog-post-banner.jpg +0 -0
  28. data/assets/images/blog/blog-post-thumb-1.jpg +0 -0
  29. data/assets/images/blog/blog-post-thumb-10.jpg +0 -0
  30. data/assets/images/blog/blog-post-thumb-11.jpg +0 -0
  31. data/assets/images/blog/blog-post-thumb-12.jpg +0 -0
  32. data/assets/images/blog/blog-post-thumb-2.jpg +0 -0
  33. data/assets/images/blog/blog-post-thumb-3.jpg +0 -0
  34. data/assets/images/blog/blog-post-thumb-4.jpg +0 -0
  35. data/assets/images/blog/blog-post-thumb-5.jpg +0 -0
  36. data/assets/images/blog/blog-post-thumb-6.jpg +0 -0
  37. data/assets/images/blog/blog-post-thumb-7.jpg +0 -0
  38. data/assets/images/blog/blog-post-thumb-8.jpg +0 -0
  39. data/assets/images/blog/blog-post-thumb-9.jpg +0 -0
  40. data/assets/images/posts/default-post-img.jpg +0 -0
  41. data/assets/images/posts/text-syntax.jpg +0 -0
  42. data/assets/images/posts/welcome.jpg +0 -0
  43. data/assets/images/profile.png +0 -0
  44. data/assets/images/promo-banner.jpg +0 -0
  45. data/assets/js/blog.js +9 -0
  46. data/assets/js/demo/style-switcher.js +45 -0
  47. data/assets/plugins/bootstrap/js/bootstrap.min.js +7 -0
  48. data/assets/plugins/jquery-3.3.1.min.js +2 -0
  49. data/assets/plugins/popper.min.js +5 -0
  50. data/assets/scss/bootstrap/js/dist/alert.js +199 -0
  51. data/assets/scss/bootstrap/js/dist/alert.js.map +1 -0
  52. data/assets/scss/bootstrap/js/dist/button.js +187 -0
  53. data/assets/scss/bootstrap/js/dist/button.js.map +1 -0
  54. data/assets/scss/bootstrap/js/dist/carousel.js +668 -0
  55. data/assets/scss/bootstrap/js/dist/carousel.js.map +1 -0
  56. data/assets/scss/bootstrap/js/dist/collapse.js +428 -0
  57. data/assets/scss/bootstrap/js/dist/collapse.js.map +1 -0
  58. data/assets/scss/bootstrap/js/dist/dropdown.js +595 -0
  59. data/assets/scss/bootstrap/js/dist/dropdown.js.map +1 -0
  60. data/assets/scss/bootstrap/js/dist/index.js +23 -0
  61. data/assets/scss/bootstrap/js/dist/index.js.map +1 -0
  62. data/assets/scss/bootstrap/js/dist/modal.js +650 -0
  63. data/assets/scss/bootstrap/js/dist/modal.js.map +1 -0
  64. data/assets/scss/bootstrap/js/dist/popover.js +261 -0
  65. data/assets/scss/bootstrap/js/dist/popover.js.map +1 -0
  66. data/assets/scss/bootstrap/js/dist/scrollspy.js +375 -0
  67. data/assets/scss/bootstrap/js/dist/scrollspy.js.map +1 -0
  68. data/assets/scss/bootstrap/js/dist/tab.js +269 -0
  69. data/assets/scss/bootstrap/js/dist/tab.js.map +1 -0
  70. data/assets/scss/bootstrap/js/dist/toast.js +283 -0
  71. data/assets/scss/bootstrap/js/dist/toast.js.map +1 -0
  72. data/assets/scss/bootstrap/js/dist/tooltip.js +760 -0
  73. data/assets/scss/bootstrap/js/dist/tooltip.js.map +1 -0
  74. data/assets/scss/bootstrap/js/dist/util.js +172 -0
  75. data/assets/scss/bootstrap/js/dist/util.js.map +1 -0
  76. data/assets/scss/bootstrap/js/src/alert.js +179 -0
  77. data/assets/scss/bootstrap/js/src/button.js +171 -0
  78. data/assets/scss/bootstrap/js/src/carousel.js +606 -0
  79. data/assets/scss/bootstrap/js/src/collapse.js +402 -0
  80. data/assets/scss/bootstrap/js/src/dropdown.js +545 -0
  81. data/assets/scss/bootstrap/js/src/index.js +52 -0
  82. data/assets/scss/bootstrap/js/src/modal.js +594 -0
  83. data/assets/scss/bootstrap/js/src/popover.js +184 -0
  84. data/assets/scss/bootstrap/js/src/scrollspy.js +326 -0
  85. data/assets/scss/bootstrap/js/src/tab.js +260 -0
  86. data/assets/scss/bootstrap/js/src/toast.js +227 -0
  87. data/assets/scss/bootstrap/js/src/tooltip.js +752 -0
  88. data/assets/scss/bootstrap/js/src/util.js +177 -0
  89. data/assets/scss/bootstrap/js/tests/README.md +69 -0
  90. data/assets/scss/bootstrap/js/tests/browsers.js +82 -0
  91. data/assets/scss/bootstrap/js/tests/index.html +133 -0
  92. data/assets/scss/bootstrap/js/tests/integration/bundle.js +8 -0
  93. data/assets/scss/bootstrap/js/tests/integration/index.html +66 -0
  94. data/assets/scss/bootstrap/js/tests/integration/rollup.bundle.js +20 -0
  95. data/assets/scss/bootstrap/js/tests/karma.conf.js +143 -0
  96. data/assets/scss/bootstrap/js/tests/unit/.eslintrc.json +40 -0
  97. data/assets/scss/bootstrap/js/tests/unit/alert.js +123 -0
  98. data/assets/scss/bootstrap/js/tests/unit/button.js +222 -0
  99. data/assets/scss/bootstrap/js/tests/unit/carousel.js +1333 -0
  100. data/assets/scss/bootstrap/js/tests/unit/collapse.js +892 -0
  101. data/assets/scss/bootstrap/js/tests/unit/dropdown.js +1419 -0
  102. data/assets/scss/bootstrap/js/tests/unit/modal.js +815 -0
  103. data/assets/scss/bootstrap/js/tests/unit/popover.js +471 -0
  104. data/assets/scss/bootstrap/js/tests/unit/scrollspy.js +728 -0
  105. data/assets/scss/bootstrap/js/tests/unit/tab.js +518 -0
  106. data/assets/scss/bootstrap/js/tests/unit/toast.js +259 -0
  107. data/assets/scss/bootstrap/js/tests/unit/tooltip.js +1109 -0
  108. data/assets/scss/bootstrap/js/tests/unit/util.js +163 -0
  109. data/assets/scss/bootstrap/js/tests/visual/alert.html +58 -0
  110. data/assets/scss/bootstrap/js/tests/visual/button.html +51 -0
  111. data/assets/scss/bootstrap/js/tests/visual/carousel.html +66 -0
  112. data/assets/scss/bootstrap/js/tests/visual/collapse.html +78 -0
  113. data/assets/scss/bootstrap/js/tests/visual/dropdown.html +212 -0
  114. data/assets/scss/bootstrap/js/tests/visual/modal.html +268 -0
  115. data/assets/scss/bootstrap/js/tests/visual/popover.html +46 -0
  116. data/assets/scss/bootstrap/js/tests/visual/scrollspy.html +95 -0
  117. data/assets/scss/bootstrap/js/tests/visual/tab.html +234 -0
  118. data/assets/scss/bootstrap/js/tests/visual/toast.html +72 -0
  119. data/assets/scss/bootstrap/js/tests/visual/tooltip.html +106 -0
  120. data/assets/scss/bootstrap/scss/_alert.scss +51 -0
  121. data/assets/scss/bootstrap/scss/_badge.scss +54 -0
  122. data/assets/scss/bootstrap/scss/_breadcrumb.scss +41 -0
  123. data/assets/scss/bootstrap/scss/_button-group.scss +163 -0
  124. data/assets/scss/bootstrap/scss/_buttons.scss +137 -0
  125. data/assets/scss/bootstrap/scss/_card.scss +289 -0
  126. data/assets/scss/bootstrap/scss/_carousel.scss +197 -0
  127. data/assets/scss/bootstrap/scss/_close.scss +41 -0
  128. data/assets/scss/bootstrap/scss/_code.scss +48 -0
  129. data/assets/scss/bootstrap/scss/_custom-forms.scss +507 -0
  130. data/assets/scss/bootstrap/scss/_dropdown.scss +191 -0
  131. data/assets/scss/bootstrap/scss/_forms.scss +330 -0
  132. data/assets/scss/bootstrap/scss/_functions.scss +86 -0
  133. data/assets/scss/bootstrap/scss/_grid.scss +52 -0
  134. data/assets/scss/bootstrap/scss/_images.scss +42 -0
  135. data/assets/scss/bootstrap/scss/_input-group.scss +193 -0
  136. data/assets/scss/bootstrap/scss/_jumbotron.scss +17 -0
  137. data/assets/scss/bootstrap/scss/_list-group.scss +149 -0
  138. data/assets/scss/bootstrap/scss/_media.scss +8 -0
  139. data/assets/scss/bootstrap/scss/_mixins.scss +47 -0
  140. data/assets/scss/bootstrap/scss/_modal.scss +229 -0
  141. data/assets/scss/bootstrap/scss/_nav.scss +120 -0
  142. data/assets/scss/bootstrap/scss/_navbar.scss +294 -0
  143. data/assets/scss/bootstrap/scss/_pagination.scss +73 -0
  144. data/assets/scss/bootstrap/scss/_popover.scss +171 -0
  145. data/assets/scss/bootstrap/scss/_print.scss +141 -0
  146. data/assets/scss/bootstrap/scss/_progress.scss +43 -0
  147. data/assets/scss/bootstrap/scss/_reboot.scss +483 -0
  148. data/assets/scss/bootstrap/scss/_root.scss +19 -0
  149. data/assets/scss/bootstrap/scss/_spinners.scss +55 -0
  150. data/assets/scss/bootstrap/scss/_tables.scss +185 -0
  151. data/assets/scss/bootstrap/scss/_toasts.scss +44 -0
  152. data/assets/scss/bootstrap/scss/_tooltip.scss +115 -0
  153. data/assets/scss/bootstrap/scss/_transitions.scss +20 -0
  154. data/assets/scss/bootstrap/scss/_type.scss +125 -0
  155. data/assets/scss/bootstrap/scss/_utilities.scss +17 -0
  156. data/assets/scss/bootstrap/scss/_variables.scss +1123 -0
  157. data/assets/scss/bootstrap/scss/bootstrap-grid.scss +29 -0
  158. data/assets/scss/bootstrap/scss/bootstrap-reboot.scss +12 -0
  159. data/assets/scss/bootstrap/scss/bootstrap.scss +44 -0
  160. data/assets/scss/bootstrap/scss/mixins/_alert.scss +13 -0
  161. data/assets/scss/bootstrap/scss/mixins/_background-variant.scss +21 -0
  162. data/assets/scss/bootstrap/scss/mixins/_badge.scss +17 -0
  163. data/assets/scss/bootstrap/scss/mixins/_border-radius.scss +63 -0
  164. data/assets/scss/bootstrap/scss/mixins/_box-shadow.scss +20 -0
  165. data/assets/scss/bootstrap/scss/mixins/_breakpoints.scss +123 -0
  166. data/assets/scss/bootstrap/scss/mixins/_buttons.scss +107 -0
  167. data/assets/scss/bootstrap/scss/mixins/_caret.scss +62 -0
  168. data/assets/scss/bootstrap/scss/mixins/_clearfix.scss +7 -0
  169. data/assets/scss/bootstrap/scss/mixins/_deprecate.scss +10 -0
  170. data/assets/scss/bootstrap/scss/mixins/_float.scss +14 -0
  171. data/assets/scss/bootstrap/scss/mixins/_forms.scss +192 -0
  172. data/assets/scss/bootstrap/scss/mixins/_gradients.scss +45 -0
  173. data/assets/scss/bootstrap/scss/mixins/_grid-framework.scss +66 -0
  174. data/assets/scss/bootstrap/scss/mixins/_grid.scss +51 -0
  175. data/assets/scss/bootstrap/scss/mixins/_hover.scss +37 -0
  176. data/assets/scss/bootstrap/scss/mixins/_image.scss +36 -0
  177. data/assets/scss/bootstrap/scss/mixins/_list-group.scss +21 -0
  178. data/assets/scss/bootstrap/scss/mixins/_lists.scss +7 -0
  179. data/assets/scss/bootstrap/scss/mixins/_nav-divider.scss +10 -0
  180. data/assets/scss/bootstrap/scss/mixins/_pagination.scss +22 -0
  181. data/assets/scss/bootstrap/scss/mixins/_reset-text.scss +17 -0
  182. data/assets/scss/bootstrap/scss/mixins/_resize.scss +6 -0
  183. data/assets/scss/bootstrap/scss/mixins/_screen-reader.scss +33 -0
  184. data/assets/scss/bootstrap/scss/mixins/_size.scss +7 -0
  185. data/assets/scss/bootstrap/scss/mixins/_table-row.scss +39 -0
  186. data/assets/scss/bootstrap/scss/mixins/_text-emphasis.scss +16 -0
  187. data/assets/scss/bootstrap/scss/mixins/_text-hide.scss +11 -0
  188. data/assets/scss/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  189. data/assets/scss/bootstrap/scss/mixins/_transition.scss +16 -0
  190. data/assets/scss/bootstrap/scss/mixins/_visibility.scss +8 -0
  191. data/assets/scss/bootstrap/scss/utilities/_align.scss +8 -0
  192. data/assets/scss/bootstrap/scss/utilities/_background.scss +19 -0
  193. data/assets/scss/bootstrap/scss/utilities/_borders.scss +75 -0
  194. data/assets/scss/bootstrap/scss/utilities/_clearfix.scss +3 -0
  195. data/assets/scss/bootstrap/scss/utilities/_display.scss +26 -0
  196. data/assets/scss/bootstrap/scss/utilities/_embed.scss +39 -0
  197. data/assets/scss/bootstrap/scss/utilities/_flex.scss +51 -0
  198. data/assets/scss/bootstrap/scss/utilities/_float.scss +11 -0
  199. data/assets/scss/bootstrap/scss/utilities/_overflow.scss +5 -0
  200. data/assets/scss/bootstrap/scss/utilities/_position.scss +32 -0
  201. data/assets/scss/bootstrap/scss/utilities/_screenreaders.scss +11 -0
  202. data/assets/scss/bootstrap/scss/utilities/_shadows.scss +6 -0
  203. data/assets/scss/bootstrap/scss/utilities/_sizing.scss +20 -0
  204. data/assets/scss/bootstrap/scss/utilities/_spacing.scss +73 -0
  205. data/assets/scss/bootstrap/scss/utilities/_stretched-link.scss +19 -0
  206. data/assets/scss/bootstrap/scss/utilities/_text.scss +72 -0
  207. data/assets/scss/bootstrap/scss/utilities/_visibility.scss +13 -0
  208. data/assets/scss/bootstrap/scss/vendor/_rfs.scss +212 -0
  209. data/assets/scss/theme/_about.scss +28 -0
  210. data/assets/scss/theme/_base.scss +207 -0
  211. data/assets/scss/theme/_blog.scss +140 -0
  212. data/assets/scss/theme/_demo.scss +153 -0
  213. data/assets/scss/theme/_mixins.scss +34 -0
  214. data/assets/scss/theme/_responsive.scss +88 -0
  215. data/assets/scss/theme/styles.scss +14 -0
  216. data/assets/scss/theme-8.scss +41 -0
  217. data/assets/styles.scss +6 -0
  218. metadata +219 -3
@@ -0,0 +1,184 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v4.3.0): popover.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import $ from 'jquery'
9
+ import Tooltip from './tooltip'
10
+
11
+ /**
12
+ * ------------------------------------------------------------------------
13
+ * Constants
14
+ * ------------------------------------------------------------------------
15
+ */
16
+
17
+ const NAME = 'popover'
18
+ const VERSION = '4.3.0'
19
+ const DATA_KEY = 'bs.popover'
20
+ const EVENT_KEY = `.${DATA_KEY}`
21
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
22
+ const CLASS_PREFIX = 'bs-popover'
23
+ const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g')
24
+
25
+ const Default = {
26
+ ...Tooltip.Default,
27
+ placement : 'right',
28
+ trigger : 'click',
29
+ content : '',
30
+ template : '<div class="popover" role="tooltip">' +
31
+ '<div class="arrow"></div>' +
32
+ '<h3 class="popover-header"></h3>' +
33
+ '<div class="popover-body"></div></div>'
34
+ }
35
+
36
+ const DefaultType = {
37
+ ...Tooltip.DefaultType,
38
+ content : '(string|element|function)'
39
+ }
40
+
41
+ const ClassName = {
42
+ FADE : 'fade',
43
+ SHOW : 'show'
44
+ }
45
+
46
+ const Selector = {
47
+ TITLE : '.popover-header',
48
+ CONTENT : '.popover-body'
49
+ }
50
+
51
+ const Event = {
52
+ HIDE : `hide${EVENT_KEY}`,
53
+ HIDDEN : `hidden${EVENT_KEY}`,
54
+ SHOW : `show${EVENT_KEY}`,
55
+ SHOWN : `shown${EVENT_KEY}`,
56
+ INSERTED : `inserted${EVENT_KEY}`,
57
+ CLICK : `click${EVENT_KEY}`,
58
+ FOCUSIN : `focusin${EVENT_KEY}`,
59
+ FOCUSOUT : `focusout${EVENT_KEY}`,
60
+ MOUSEENTER : `mouseenter${EVENT_KEY}`,
61
+ MOUSELEAVE : `mouseleave${EVENT_KEY}`
62
+ }
63
+
64
+ /**
65
+ * ------------------------------------------------------------------------
66
+ * Class Definition
67
+ * ------------------------------------------------------------------------
68
+ */
69
+
70
+ class Popover extends Tooltip {
71
+ // Getters
72
+
73
+ static get VERSION() {
74
+ return VERSION
75
+ }
76
+
77
+ static get Default() {
78
+ return Default
79
+ }
80
+
81
+ static get NAME() {
82
+ return NAME
83
+ }
84
+
85
+ static get DATA_KEY() {
86
+ return DATA_KEY
87
+ }
88
+
89
+ static get Event() {
90
+ return Event
91
+ }
92
+
93
+ static get EVENT_KEY() {
94
+ return EVENT_KEY
95
+ }
96
+
97
+ static get DefaultType() {
98
+ return DefaultType
99
+ }
100
+
101
+ // Overrides
102
+
103
+ isWithContent() {
104
+ return this.getTitle() || this._getContent()
105
+ }
106
+
107
+ addAttachmentClass(attachment) {
108
+ $(this.getTipElement()).addClass(`${CLASS_PREFIX}-${attachment}`)
109
+ }
110
+
111
+ getTipElement() {
112
+ this.tip = this.tip || $(this.config.template)[0]
113
+ return this.tip
114
+ }
115
+
116
+ setContent() {
117
+ const $tip = $(this.getTipElement())
118
+
119
+ // We use append for html objects to maintain js events
120
+ this.setElementContent($tip.find(Selector.TITLE), this.getTitle())
121
+ let content = this._getContent()
122
+ if (typeof content === 'function') {
123
+ content = content.call(this.element)
124
+ }
125
+ this.setElementContent($tip.find(Selector.CONTENT), content)
126
+
127
+ $tip.removeClass(`${ClassName.FADE} ${ClassName.SHOW}`)
128
+ }
129
+
130
+ // Private
131
+
132
+ _getContent() {
133
+ return this.element.getAttribute('data-content') ||
134
+ this.config.content
135
+ }
136
+
137
+ _cleanTipClass() {
138
+ const $tip = $(this.getTipElement())
139
+ const tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX)
140
+ if (tabClass !== null && tabClass.length > 0) {
141
+ $tip.removeClass(tabClass.join(''))
142
+ }
143
+ }
144
+
145
+ // Static
146
+
147
+ static _jQueryInterface(config) {
148
+ return this.each(function () {
149
+ let data = $(this).data(DATA_KEY)
150
+ const _config = typeof config === 'object' ? config : null
151
+
152
+ if (!data && /dispose|hide/.test(config)) {
153
+ return
154
+ }
155
+
156
+ if (!data) {
157
+ data = new Popover(this, _config)
158
+ $(this).data(DATA_KEY, data)
159
+ }
160
+
161
+ if (typeof config === 'string') {
162
+ if (typeof data[config] === 'undefined') {
163
+ throw new TypeError(`No method named "${config}"`)
164
+ }
165
+ data[config]()
166
+ }
167
+ })
168
+ }
169
+ }
170
+
171
+ /**
172
+ * ------------------------------------------------------------------------
173
+ * jQuery
174
+ * ------------------------------------------------------------------------
175
+ */
176
+
177
+ $.fn[NAME] = Popover._jQueryInterface
178
+ $.fn[NAME].Constructor = Popover
179
+ $.fn[NAME].noConflict = () => {
180
+ $.fn[NAME] = JQUERY_NO_CONFLICT
181
+ return Popover._jQueryInterface
182
+ }
183
+
184
+ export default Popover
@@ -0,0 +1,326 @@
1
+ /**
2
+ * --------------------------------------------------------------------------
3
+ * Bootstrap (v4.3.0): scrollspy.js
4
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
5
+ * --------------------------------------------------------------------------
6
+ */
7
+
8
+ import $ from 'jquery'
9
+ import Util from './util'
10
+
11
+ /**
12
+ * ------------------------------------------------------------------------
13
+ * Constants
14
+ * ------------------------------------------------------------------------
15
+ */
16
+
17
+ const NAME = 'scrollspy'
18
+ const VERSION = '4.3.0'
19
+ const DATA_KEY = 'bs.scrollspy'
20
+ const EVENT_KEY = `.${DATA_KEY}`
21
+ const DATA_API_KEY = '.data-api'
22
+ const JQUERY_NO_CONFLICT = $.fn[NAME]
23
+
24
+ const Default = {
25
+ offset : 10,
26
+ method : 'auto',
27
+ target : ''
28
+ }
29
+
30
+ const DefaultType = {
31
+ offset : 'number',
32
+ method : 'string',
33
+ target : '(string|element)'
34
+ }
35
+
36
+ const Event = {
37
+ ACTIVATE : `activate${EVENT_KEY}`,
38
+ SCROLL : `scroll${EVENT_KEY}`,
39
+ LOAD_DATA_API : `load${EVENT_KEY}${DATA_API_KEY}`
40
+ }
41
+
42
+ const ClassName = {
43
+ DROPDOWN_ITEM : 'dropdown-item',
44
+ DROPDOWN_MENU : 'dropdown-menu',
45
+ ACTIVE : 'active'
46
+ }
47
+
48
+ const Selector = {
49
+ DATA_SPY : '[data-spy="scroll"]',
50
+ ACTIVE : '.active',
51
+ NAV_LIST_GROUP : '.nav, .list-group',
52
+ NAV_LINKS : '.nav-link',
53
+ NAV_ITEMS : '.nav-item',
54
+ LIST_ITEMS : '.list-group-item',
55
+ DROPDOWN : '.dropdown',
56
+ DROPDOWN_ITEMS : '.dropdown-item',
57
+ DROPDOWN_TOGGLE : '.dropdown-toggle'
58
+ }
59
+
60
+ const OffsetMethod = {
61
+ OFFSET : 'offset',
62
+ POSITION : 'position'
63
+ }
64
+
65
+ /**
66
+ * ------------------------------------------------------------------------
67
+ * Class Definition
68
+ * ------------------------------------------------------------------------
69
+ */
70
+
71
+ class ScrollSpy {
72
+ constructor(element, config) {
73
+ this._element = element
74
+ this._scrollElement = element.tagName === 'BODY' ? window : element
75
+ this._config = this._getConfig(config)
76
+ this._selector = `${this._config.target} ${Selector.NAV_LINKS},` +
77
+ `${this._config.target} ${Selector.LIST_ITEMS},` +
78
+ `${this._config.target} ${Selector.DROPDOWN_ITEMS}`
79
+ this._offsets = []
80
+ this._targets = []
81
+ this._activeTarget = null
82
+ this._scrollHeight = 0
83
+
84
+ $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event))
85
+
86
+ this.refresh()
87
+ this._process()
88
+ }
89
+
90
+ // Getters
91
+
92
+ static get VERSION() {
93
+ return VERSION
94
+ }
95
+
96
+ static get Default() {
97
+ return Default
98
+ }
99
+
100
+ // Public
101
+
102
+ refresh() {
103
+ const autoMethod = this._scrollElement === this._scrollElement.window
104
+ ? OffsetMethod.OFFSET : OffsetMethod.POSITION
105
+
106
+ const offsetMethod = this._config.method === 'auto'
107
+ ? autoMethod : this._config.method
108
+
109
+ const offsetBase = offsetMethod === OffsetMethod.POSITION
110
+ ? this._getScrollTop() : 0
111
+
112
+ this._offsets = []
113
+ this._targets = []
114
+
115
+ this._scrollHeight = this._getScrollHeight()
116
+
117
+ const targets = [].slice.call(document.querySelectorAll(this._selector))
118
+
119
+ targets
120
+ .map((element) => {
121
+ let target
122
+ const targetSelector = Util.getSelectorFromElement(element)
123
+
124
+ if (targetSelector) {
125
+ target = document.querySelector(targetSelector)
126
+ }
127
+
128
+ if (target) {
129
+ const targetBCR = target.getBoundingClientRect()
130
+ if (targetBCR.width || targetBCR.height) {
131
+ // TODO (fat): remove sketch reliance on jQuery position/offset
132
+ return [
133
+ $(target)[offsetMethod]().top + offsetBase,
134
+ targetSelector
135
+ ]
136
+ }
137
+ }
138
+ return null
139
+ })
140
+ .filter((item) => item)
141
+ .sort((a, b) => a[0] - b[0])
142
+ .forEach((item) => {
143
+ this._offsets.push(item[0])
144
+ this._targets.push(item[1])
145
+ })
146
+ }
147
+
148
+ dispose() {
149
+ $.removeData(this._element, DATA_KEY)
150
+ $(this._scrollElement).off(EVENT_KEY)
151
+
152
+ this._element = null
153
+ this._scrollElement = null
154
+ this._config = null
155
+ this._selector = null
156
+ this._offsets = null
157
+ this._targets = null
158
+ this._activeTarget = null
159
+ this._scrollHeight = null
160
+ }
161
+
162
+ // Private
163
+
164
+ _getConfig(config) {
165
+ config = {
166
+ ...Default,
167
+ ...typeof config === 'object' && config ? config : {}
168
+ }
169
+
170
+ if (typeof config.target !== 'string') {
171
+ let id = $(config.target).attr('id')
172
+ if (!id) {
173
+ id = Util.getUID(NAME)
174
+ $(config.target).attr('id', id)
175
+ }
176
+ config.target = `#${id}`
177
+ }
178
+
179
+ Util.typeCheckConfig(NAME, config, DefaultType)
180
+
181
+ return config
182
+ }
183
+
184
+ _getScrollTop() {
185
+ return this._scrollElement === window
186
+ ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop
187
+ }
188
+
189
+ _getScrollHeight() {
190
+ return this._scrollElement.scrollHeight || Math.max(
191
+ document.body.scrollHeight,
192
+ document.documentElement.scrollHeight
193
+ )
194
+ }
195
+
196
+ _getOffsetHeight() {
197
+ return this._scrollElement === window
198
+ ? window.innerHeight : this._scrollElement.getBoundingClientRect().height
199
+ }
200
+
201
+ _process() {
202
+ const scrollTop = this._getScrollTop() + this._config.offset
203
+ const scrollHeight = this._getScrollHeight()
204
+ const maxScroll = this._config.offset +
205
+ scrollHeight -
206
+ this._getOffsetHeight()
207
+
208
+ if (this._scrollHeight !== scrollHeight) {
209
+ this.refresh()
210
+ }
211
+
212
+ if (scrollTop >= maxScroll) {
213
+ const target = this._targets[this._targets.length - 1]
214
+
215
+ if (this._activeTarget !== target) {
216
+ this._activate(target)
217
+ }
218
+ return
219
+ }
220
+
221
+ if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
222
+ this._activeTarget = null
223
+ this._clear()
224
+ return
225
+ }
226
+
227
+ const offsetLength = this._offsets.length
228
+ for (let i = offsetLength; i--;) {
229
+ const isActiveTarget = this._activeTarget !== this._targets[i] &&
230
+ scrollTop >= this._offsets[i] &&
231
+ (typeof this._offsets[i + 1] === 'undefined' ||
232
+ scrollTop < this._offsets[i + 1])
233
+
234
+ if (isActiveTarget) {
235
+ this._activate(this._targets[i])
236
+ }
237
+ }
238
+ }
239
+
240
+ _activate(target) {
241
+ this._activeTarget = target
242
+
243
+ this._clear()
244
+
245
+ const queries = this._selector
246
+ .split(',')
247
+ .map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`)
248
+
249
+ const $link = $([].slice.call(document.querySelectorAll(queries.join(','))))
250
+
251
+ if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
252
+ $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE)
253
+ $link.addClass(ClassName.ACTIVE)
254
+ } else {
255
+ // Set triggered link as active
256
+ $link.addClass(ClassName.ACTIVE)
257
+ // Set triggered links parents as active
258
+ // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
259
+ $link.parents(Selector.NAV_LIST_GROUP).prev(`${Selector.NAV_LINKS}, ${Selector.LIST_ITEMS}`).addClass(ClassName.ACTIVE)
260
+ // Handle special case when .nav-link is inside .nav-item
261
+ $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE)
262
+ }
263
+
264
+ $(this._scrollElement).trigger(Event.ACTIVATE, {
265
+ relatedTarget: target
266
+ })
267
+ }
268
+
269
+ _clear() {
270
+ [].slice.call(document.querySelectorAll(this._selector))
271
+ .filter((node) => node.classList.contains(ClassName.ACTIVE))
272
+ .forEach((node) => node.classList.remove(ClassName.ACTIVE))
273
+ }
274
+
275
+ // Static
276
+
277
+ static _jQueryInterface(config) {
278
+ return this.each(function () {
279
+ let data = $(this).data(DATA_KEY)
280
+ const _config = typeof config === 'object' && config
281
+
282
+ if (!data) {
283
+ data = new ScrollSpy(this, _config)
284
+ $(this).data(DATA_KEY, data)
285
+ }
286
+
287
+ if (typeof config === 'string') {
288
+ if (typeof data[config] === 'undefined') {
289
+ throw new TypeError(`No method named "${config}"`)
290
+ }
291
+ data[config]()
292
+ }
293
+ })
294
+ }
295
+ }
296
+
297
+ /**
298
+ * ------------------------------------------------------------------------
299
+ * Data Api implementation
300
+ * ------------------------------------------------------------------------
301
+ */
302
+
303
+ $(window).on(Event.LOAD_DATA_API, () => {
304
+ const scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY))
305
+ const scrollSpysLength = scrollSpys.length
306
+
307
+ for (let i = scrollSpysLength; i--;) {
308
+ const $spy = $(scrollSpys[i])
309
+ ScrollSpy._jQueryInterface.call($spy, $spy.data())
310
+ }
311
+ })
312
+
313
+ /**
314
+ * ------------------------------------------------------------------------
315
+ * jQuery
316
+ * ------------------------------------------------------------------------
317
+ */
318
+
319
+ $.fn[NAME] = ScrollSpy._jQueryInterface
320
+ $.fn[NAME].Constructor = ScrollSpy
321
+ $.fn[NAME].noConflict = () => {
322
+ $.fn[NAME] = JQUERY_NO_CONFLICT
323
+ return ScrollSpy._jQueryInterface
324
+ }
325
+
326
+ export default ScrollSpy