@ulu/frontend 0.0.3

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 (323) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/ulu-frontend.min.css +1 -0
  4. package/dist/ulu-frontend.min.js +1 -0
  5. package/index.js +2 -0
  6. package/js/deprecated/doc-ready.js +28 -0
  7. package/js/deprecated/jquery-prototypes.js +309 -0
  8. package/js/deprecated/mini-collapsible-popper-positioning.js +126 -0
  9. package/js/deprecated/mini-collapsible.js +607 -0
  10. package/js/deprecated/script-loader.js +60 -0
  11. package/js/events/index.js +42 -0
  12. package/js/helpers/css-breakpoint.js +247 -0
  13. package/js/helpers/file-save.js +48 -0
  14. package/js/helpers/node-data-manager.js +74 -0
  15. package/js/helpers/pause-youtube-video.js +42 -0
  16. package/js/helpers/scrollbar-width-property.js +10 -0
  17. package/js/index.js +15 -0
  18. package/js/polyfills/element-closest.js +17 -0
  19. package/js/ui/flipcard.js +202 -0
  20. package/js/ui/grid.js +67 -0
  21. package/js/ui/modals.js +219 -0
  22. package/js/ui/overflow-scroller-pager.js +58 -0
  23. package/js/ui/overflow-scroller.js +160 -0
  24. package/js/ui/programmatic-modal.js +91 -0
  25. package/js/ui/resizer.js +60 -0
  26. package/js/ui/slider.js +468 -0
  27. package/js/ui/tabs.js +109 -0
  28. package/js/ui/tooltip.js +82 -0
  29. package/js/utils/array.js +28 -0
  30. package/js/utils/dom.js +122 -0
  31. package/js/utils/logger.js +69 -0
  32. package/js/utils/object.js +22 -0
  33. package/js/utils/performance.js +43 -0
  34. package/js/utils/regex.js +10 -0
  35. package/js/utils/string.js +107 -0
  36. package/js/waypoints/README.md +3 -0
  37. package/js/waypoints/anchor-menu.js +76 -0
  38. package/js/waypoints/element-waypoint.js +75 -0
  39. package/js/waypoints/examples/page-link-menu.md +106 -0
  40. package/js/waypoints/state-in-attribute.js +32 -0
  41. package/package.json +38 -0
  42. package/scss/README.md +58 -0
  43. package/scss/_breakpoint.scss +190 -0
  44. package/scss/_button.scss +241 -0
  45. package/scss/_calculate.scss +64 -0
  46. package/scss/_color.scss +211 -0
  47. package/scss/_cssvar.scss +116 -0
  48. package/scss/_element.scss +276 -0
  49. package/scss/_grid.scss +699 -0
  50. package/scss/_index.scss +29 -0
  51. package/scss/_layout.scss +202 -0
  52. package/scss/_path.scss +58 -0
  53. package/scss/_selector.scss +81 -0
  54. package/scss/_typography.scss +320 -0
  55. package/scss/_units.scss +47 -0
  56. package/scss/_utility.scss +12 -0
  57. package/scss/_utils.scss +209 -0
  58. package/scss/base/_color.scss +13 -0
  59. package/scss/base/_elements.scss +188 -0
  60. package/scss/base/_index.scss +62 -0
  61. package/scss/base/_keyframes.scss +78 -0
  62. package/scss/base/_layout.scss +100 -0
  63. package/scss/base/_normalize.scss +315 -0
  64. package/scss/base/_typography.scss +41 -0
  65. package/scss/components/README.md +5 -0
  66. package/scss/components/README.todos +15 -0
  67. package/scss/components/_button.scss +95 -0
  68. package/scss/components/_index.scss +63 -0
  69. package/scss/components/_links.scss +34 -0
  70. package/scss/components/_list-lines.scss +73 -0
  71. package/scss/components/_list-ordered.scss +16 -0
  72. package/scss/components/_list-unordered.scss +21 -0
  73. package/scss/components/_rule.scss +93 -0
  74. package/scss/helpers/_color.scss +14 -0
  75. package/scss/helpers/_display.scss +73 -0
  76. package/scss/helpers/_index.scss +67 -0
  77. package/scss/helpers/_print.scss +58 -0
  78. package/scss/helpers/_typography.scss +80 -0
  79. package/scss/helpers/_units.scss +79 -0
  80. package/scss/helpers/_utilities.scss +102 -0
  81. package/scss/stylesheets/README.md +3 -0
  82. package/scss/stylesheets/full.scss +17 -0
  83. package/trash/js-old/deprecated/doc-ready.js +28 -0
  84. package/trash/js-old/deprecated/jquery-prototypes.js +309 -0
  85. package/trash/js-old/deprecated/mini-collapsible-popper-positioning.js +126 -0
  86. package/trash/js-old/deprecated/mini-collapsible.js +607 -0
  87. package/trash/js-old/deprecated/script-loader.js +60 -0
  88. package/trash/js-old/events/index.js +42 -0
  89. package/trash/js-old/helpers/css-breakpoint.js +247 -0
  90. package/trash/js-old/helpers/file-save.js +48 -0
  91. package/trash/js-old/helpers/node-data-manager.js +74 -0
  92. package/trash/js-old/helpers/pause-youtube-video.js +42 -0
  93. package/trash/js-old/index.js +15 -0
  94. package/trash/js-old/polyfills/element-closest.js +17 -0
  95. package/trash/js-old/ui/flipcard.js +202 -0
  96. package/trash/js-old/ui/grid.js +67 -0
  97. package/trash/js-old/ui/modals.js +219 -0
  98. package/trash/js-old/ui/programmatic-modal.js +91 -0
  99. package/trash/js-old/ui/resizer.js +60 -0
  100. package/trash/js-old/ui/slider.js +469 -0
  101. package/trash/js-old/ui/tabs.js +109 -0
  102. package/trash/js-old/ui/tooltip.js +82 -0
  103. package/trash/js-old/utils/array.js +28 -0
  104. package/trash/js-old/utils/dom.js +122 -0
  105. package/trash/js-old/utils/logger.js +69 -0
  106. package/trash/js-old/utils/object.js +22 -0
  107. package/trash/js-old/utils/performance.js +43 -0
  108. package/trash/js-old/utils/regex.js +10 -0
  109. package/trash/js-old/utils/string.js +107 -0
  110. package/trash/js-old/waypoints/README.md +3 -0
  111. package/trash/js-old/waypoints/anchor-menu.js +76 -0
  112. package/trash/js-old/waypoints/element-waypoint.js +75 -0
  113. package/trash/js-old/waypoints/examples/page-link-menu.md +106 -0
  114. package/trash/js-old/waypoints/state-in-attribute.js +32 -0
  115. package/trash/js-old-230729/deprecated/doc-ready.js +28 -0
  116. package/trash/js-old-230729/deprecated/jquery-prototypes.js +309 -0
  117. package/trash/js-old-230729/deprecated/mini-collapsible-popper-positioning.js +126 -0
  118. package/trash/js-old-230729/deprecated/mini-collapsible.js +607 -0
  119. package/trash/js-old-230729/deprecated/script-loader.js +60 -0
  120. package/trash/js-old-230729/events/index.js +42 -0
  121. package/trash/js-old-230729/helpers/css-breakpoint.js +247 -0
  122. package/trash/js-old-230729/helpers/file-save.js +48 -0
  123. package/trash/js-old-230729/helpers/node-data-manager.js +74 -0
  124. package/trash/js-old-230729/helpers/pause-youtube-video.js +42 -0
  125. package/trash/js-old-230729/helpers/scrollbar-width-property.js +10 -0
  126. package/trash/js-old-230729/index.js +15 -0
  127. package/trash/js-old-230729/polyfills/element-closest.js +17 -0
  128. package/trash/js-old-230729/ui/flipcard.js +202 -0
  129. package/trash/js-old-230729/ui/grid.js +67 -0
  130. package/trash/js-old-230729/ui/modals.js +219 -0
  131. package/trash/js-old-230729/ui/overflow-scroller-pager.js +58 -0
  132. package/trash/js-old-230729/ui/overflow-scroller.js +160 -0
  133. package/trash/js-old-230729/ui/programmatic-modal.js +91 -0
  134. package/trash/js-old-230729/ui/resizer.js +60 -0
  135. package/trash/js-old-230729/ui/slider.js +468 -0
  136. package/trash/js-old-230729/ui/tabs.js +109 -0
  137. package/trash/js-old-230729/ui/tooltip.js +82 -0
  138. package/trash/js-old-230729/utils/array.js +28 -0
  139. package/trash/js-old-230729/utils/dom.js +122 -0
  140. package/trash/js-old-230729/utils/logger.js +69 -0
  141. package/trash/js-old-230729/utils/object.js +22 -0
  142. package/trash/js-old-230729/utils/performance.js +43 -0
  143. package/trash/js-old-230729/utils/regex.js +10 -0
  144. package/trash/js-old-230729/utils/string.js +107 -0
  145. package/trash/js-old-230729/waypoints/README.md +3 -0
  146. package/trash/js-old-230729/waypoints/anchor-menu.js +76 -0
  147. package/trash/js-old-230729/waypoints/element-waypoint.js +75 -0
  148. package/trash/js-old-230729/waypoints/examples/page-link-menu.md +106 -0
  149. package/trash/js-old-230729/waypoints/state-in-attribute.js +32 -0
  150. package/trash/logo-1.svg +13 -0
  151. package/trash/logo.svg +16 -0
  152. package/trash/scss-before-cqc-update/README.md +58 -0
  153. package/trash/scss-before-cqc-update/_breakpoint.scss +190 -0
  154. package/trash/scss-before-cqc-update/_button.scss +229 -0
  155. package/trash/scss-before-cqc-update/_calculate.scss +65 -0
  156. package/trash/scss-before-cqc-update/_color.scss +211 -0
  157. package/trash/scss-before-cqc-update/_cssvar.scss +116 -0
  158. package/trash/scss-before-cqc-update/_element.scss +275 -0
  159. package/trash/scss-before-cqc-update/_index.scss +29 -0
  160. package/trash/scss-before-cqc-update/_layout.scss +247 -0
  161. package/trash/scss-before-cqc-update/_path.scss +59 -0
  162. package/trash/scss-before-cqc-update/_selector.scss +82 -0
  163. package/trash/scss-before-cqc-update/_typography.scss +322 -0
  164. package/trash/scss-before-cqc-update/_units.scss +48 -0
  165. package/trash/scss-before-cqc-update/_utility.scss +13 -0
  166. package/trash/scss-before-cqc-update/_utils.scss +211 -0
  167. package/trash/scss-before-cqc-update/base/_color.scss +14 -0
  168. package/trash/scss-before-cqc-update/base/_elements.scss +189 -0
  169. package/trash/scss-before-cqc-update/base/_index.scss +63 -0
  170. package/trash/scss-before-cqc-update/base/_keyframes.scss +74 -0
  171. package/trash/scss-before-cqc-update/base/_layout.scss +88 -0
  172. package/trash/scss-before-cqc-update/base/_normalize.scss +316 -0
  173. package/trash/scss-before-cqc-update/base/_typography.scss +42 -0
  174. package/trash/scss-before-cqc-update/components/README.md +5 -0
  175. package/trash/scss-before-cqc-update/components/README.todos +15 -0
  176. package/trash/scss-before-cqc-update/components/_button.scss +96 -0
  177. package/trash/scss-before-cqc-update/components/_grid.scss +671 -0
  178. package/trash/scss-before-cqc-update/components/_index.scss +70 -0
  179. package/trash/scss-before-cqc-update/components/_links.scss +35 -0
  180. package/trash/scss-before-cqc-update/components/_list-lines.scss +74 -0
  181. package/trash/scss-before-cqc-update/components/_list-ordered.scss +17 -0
  182. package/trash/scss-before-cqc-update/components/_list-unordered.scss +22 -0
  183. package/trash/scss-before-cqc-update/components/_rule.scss +94 -0
  184. package/trash/scss-before-cqc-update/helpers/_color.scss +15 -0
  185. package/trash/scss-before-cqc-update/helpers/_display.scss +73 -0
  186. package/trash/scss-before-cqc-update/helpers/_index.scss +68 -0
  187. package/trash/scss-before-cqc-update/helpers/_print.scss +59 -0
  188. package/trash/scss-before-cqc-update/helpers/_typography.scss +73 -0
  189. package/trash/scss-before-cqc-update/helpers/_units.scss +79 -0
  190. package/trash/scss-before-cqc-update/helpers/_utilities.scss +88 -0
  191. package/trash/scss-before-cqc-update/stylesheets/README.md +3 -0
  192. package/trash/scss-before-cqc-update/stylesheets/full.scss +17 -0
  193. package/trash/scss-old/README.md +58 -0
  194. package/trash/scss-old/_breakpoint.scss +140 -0
  195. package/trash/scss-old/_button.scss +223 -0
  196. package/trash/scss-old/_calculate.scss +64 -0
  197. package/trash/scss-old/_color.scss +200 -0
  198. package/trash/scss-old/_element.scss +262 -0
  199. package/trash/scss-old/_grid.scss +558 -0
  200. package/trash/scss-old/_index.scss +25 -0
  201. package/trash/scss-old/_layout.scss +170 -0
  202. package/trash/scss-old/_path.scss +58 -0
  203. package/trash/scss-old/_selector.scss +81 -0
  204. package/trash/scss-old/_typography.scss +320 -0
  205. package/trash/scss-old/_units.scss +47 -0
  206. package/trash/scss-old/_utility.scss +12 -0
  207. package/trash/scss-old/_utils.scss +186 -0
  208. package/trash/scss-old/base/_color.scss +13 -0
  209. package/trash/scss-old/base/_elements.scss +183 -0
  210. package/trash/scss-old/base/_index.scss +62 -0
  211. package/trash/scss-old/base/_keyframes.scss +74 -0
  212. package/trash/scss-old/base/_layout.scss +81 -0
  213. package/trash/scss-old/base/_normalize.scss +316 -0
  214. package/trash/scss-old/base/_typography.scss +42 -0
  215. package/trash/scss-old/components/README.md +5 -0
  216. package/trash/scss-old/components/README.todos +15 -0
  217. package/trash/scss-old/components/_button.scss +74 -0
  218. package/trash/scss-old/components/_index.scss +63 -0
  219. package/trash/scss-old/components/_links.scss +34 -0
  220. package/trash/scss-old/components/_list-lines.scss +73 -0
  221. package/trash/scss-old/components/_list-ordered.scss +16 -0
  222. package/trash/scss-old/components/_list-unordered.scss +21 -0
  223. package/trash/scss-old/components/_rule.scss +84 -0
  224. package/trash/scss-old/helpers/_color.scss +14 -0
  225. package/trash/scss-old/helpers/_display.scss +68 -0
  226. package/trash/scss-old/helpers/_index.scss +67 -0
  227. package/trash/scss-old/helpers/_print.scss +59 -0
  228. package/trash/scss-old/helpers/_typography.scss +73 -0
  229. package/trash/scss-old/helpers/_units.scss +68 -0
  230. package/trash/scss-old/helpers/_utilities.scss +82 -0
  231. package/trash/scss-old/packages/README.md +3 -0
  232. package/trash/scss-old/packages/everything.scss +17 -0
  233. package/trash/scss-old-2/README.md +58 -0
  234. package/trash/scss-old-2/_breakpoint.scss +139 -0
  235. package/trash/scss-old-2/_button.scss +223 -0
  236. package/trash/scss-old-2/_calculate.scss +64 -0
  237. package/trash/scss-old-2/_color.scss +202 -0
  238. package/trash/scss-old-2/_element.scss +263 -0
  239. package/trash/scss-old-2/_grid.scss +558 -0
  240. package/trash/scss-old-2/_index.scss +25 -0
  241. package/trash/scss-old-2/_layout.scss +170 -0
  242. package/trash/scss-old-2/_path.scss +58 -0
  243. package/trash/scss-old-2/_selector.scss +81 -0
  244. package/trash/scss-old-2/_typography.scss +320 -0
  245. package/trash/scss-old-2/_units.scss +47 -0
  246. package/trash/scss-old-2/_utility.scss +12 -0
  247. package/trash/scss-old-2/_utils.scss +186 -0
  248. package/trash/scss-old-2/base/_color.scss +13 -0
  249. package/trash/scss-old-2/base/_elements.scss +182 -0
  250. package/trash/scss-old-2/base/_index.scss +62 -0
  251. package/trash/scss-old-2/base/_keyframes.scss +73 -0
  252. package/trash/scss-old-2/base/_layout.scss +83 -0
  253. package/trash/scss-old-2/base/_normalize.scss +315 -0
  254. package/trash/scss-old-2/base/_typography.scss +41 -0
  255. package/trash/scss-old-2/components/README.md +5 -0
  256. package/trash/scss-old-2/components/README.todos +15 -0
  257. package/trash/scss-old-2/components/_button.scss +95 -0
  258. package/trash/scss-old-2/components/_index.scss +63 -0
  259. package/trash/scss-old-2/components/_links.scss +33 -0
  260. package/trash/scss-old-2/components/_list-lines.scss +73 -0
  261. package/trash/scss-old-2/components/_list-ordered.scss +16 -0
  262. package/trash/scss-old-2/components/_list-unordered.scss +21 -0
  263. package/trash/scss-old-2/components/_rule.scss +84 -0
  264. package/trash/scss-old-2/helpers/_color.scss +14 -0
  265. package/trash/scss-old-2/helpers/_display.scss +67 -0
  266. package/trash/scss-old-2/helpers/_index.scss +67 -0
  267. package/trash/scss-old-2/helpers/_print.scss +58 -0
  268. package/trash/scss-old-2/helpers/_typography.scss +72 -0
  269. package/trash/scss-old-2/helpers/_units.scss +68 -0
  270. package/trash/scss-old-2/helpers/_utilities.scss +81 -0
  271. package/trash/scss-old-2/packages/README.md +3 -0
  272. package/trash/scss-old-2/packages/everything.scss +17 -0
  273. package/trash/scss-old-230729/README.md +58 -0
  274. package/trash/scss-old-230729/_breakpoint.scss +139 -0
  275. package/trash/scss-old-230729/_button.scss +223 -0
  276. package/trash/scss-old-230729/_calculate.scss +64 -0
  277. package/trash/scss-old-230729/_color.scss +202 -0
  278. package/trash/scss-old-230729/_element.scss +273 -0
  279. package/trash/scss-old-230729/_grid.scss +694 -0
  280. package/trash/scss-old-230729/_index.scss +25 -0
  281. package/trash/scss-old-230729/_layout.scss +193 -0
  282. package/trash/scss-old-230729/_path.scss +58 -0
  283. package/trash/scss-old-230729/_selector.scss +81 -0
  284. package/trash/scss-old-230729/_typography.scss +320 -0
  285. package/trash/scss-old-230729/_units.scss +47 -0
  286. package/trash/scss-old-230729/_utility.scss +12 -0
  287. package/trash/scss-old-230729/_utils.scss +186 -0
  288. package/trash/scss-old-230729/base/_color.scss +13 -0
  289. package/trash/scss-old-230729/base/_elements.scss +188 -0
  290. package/trash/scss-old-230729/base/_index.scss +62 -0
  291. package/trash/scss-old-230729/base/_keyframes.scss +73 -0
  292. package/trash/scss-old-230729/base/_layout.scss +83 -0
  293. package/trash/scss-old-230729/base/_normalize.scss +315 -0
  294. package/trash/scss-old-230729/base/_typography.scss +41 -0
  295. package/trash/scss-old-230729/components/README.md +5 -0
  296. package/trash/scss-old-230729/components/README.todos +15 -0
  297. package/trash/scss-old-230729/components/_button.scss +95 -0
  298. package/trash/scss-old-230729/components/_index.scss +63 -0
  299. package/trash/scss-old-230729/components/_links.scss +34 -0
  300. package/trash/scss-old-230729/components/_list-lines.scss +73 -0
  301. package/trash/scss-old-230729/components/_list-ordered.scss +16 -0
  302. package/trash/scss-old-230729/components/_list-unordered.scss +21 -0
  303. package/trash/scss-old-230729/components/_rule.scss +93 -0
  304. package/trash/scss-old-230729/helpers/_color.scss +14 -0
  305. package/trash/scss-old-230729/helpers/_display.scss +73 -0
  306. package/trash/scss-old-230729/helpers/_index.scss +67 -0
  307. package/trash/scss-old-230729/helpers/_print.scss +58 -0
  308. package/trash/scss-old-230729/helpers/_typography.scss +72 -0
  309. package/trash/scss-old-230729/helpers/_units.scss +68 -0
  310. package/trash/scss-old-230729/helpers/_utilities.scss +87 -0
  311. package/trash/scss-old-230729/packages/README.md +3 -0
  312. package/trash/scss-old-230729/packages/everything.scss +17 -0
  313. package/trash/vue/directives/background-image-url.js +12 -0
  314. package/trash/vue/helpers/add-required-components.js +14 -0
  315. package/trash/vue/ui/CollapsibleRegion/CollapsibleRegion.vue +277 -0
  316. package/trash/vue/ui/CollapsibleRegion/Demo.vue +101 -0
  317. package/trash/vue/ui/Dropdown/Dropdown.vue +184 -0
  318. package/trash/vue/ui/Modals/components/Modal.vue +49 -0
  319. package/trash/vue/ui/Modals/components/Modals.vue +103 -0
  320. package/trash/vue/ui/Modals/plugin.js +215 -0
  321. package/trash/vue/ui/Modals/readme.note +10 -0
  322. package/trash/vue/ui/Modals/reference/example-usage.vue +27 -0
  323. package/trash/vue/ui/Modals/reference/wcag-example/dialog.js +324 -0
@@ -0,0 +1,607 @@
1
+ // =============================================================================
2
+ // Collapsibles Mini
3
+ // =============================================================================
4
+
5
+ // Version: 1.0.9
6
+ //
7
+ // Requires: Ally.js v1.4.1
8
+
9
+ // Changes: 1.0.2 | Added clickWithinCloses
10
+ // 1.0.3 | Tested In NVDA on Firefox Windows (everything works for basic and accordion)
11
+ // 1.0.4 | Fixed duplicate ID, remove incorrect aria-selected attr
12
+ // 1.0.5 | Converted to ES module
13
+ // 1.0.6 | Added the ability to change the toggle text with [data-cc-state-text]
14
+ // 1.0.7 | Added ability to fade instead of just slide
15
+ // 1.0.8 | Added dependency ally.js for focus trapping, and added
16
+ // option for closeOnEscape.
17
+ // 1.0.9 | Added event object from click/keyboard that caused change
18
+
19
+ // Description: Mini collapsible module that supports basic show and hide
20
+ // and accordions. This is not maintained with the Informatics
21
+ // core module Collapsibles but works similarly, based on
22
+ // version 4.0.7.
23
+ // - Handlers are attached to the document for convenience.
24
+ // - Self managed option exists for those that want to manage the click handlers.
25
+ // - Callbacks for change in state (before and after)
26
+ // - Type support:
27
+ // - hide/show
28
+ // - accordion
29
+ // - tabs (with keyboard controls) @coming-soon
30
+
31
+ // Support: - Built to work in legacy jQuery 1.12 (may not work in newer versions)
32
+ // - Uses ES5 include polyfill for:
33
+ // - Array.every(), Array.forEach()
34
+ // - Object.assign
35
+ // - Function.bind()
36
+
37
+ // Options: See the "defaults" object below for options and descriptions. All default
38
+ // properties can be modified and viewed at MiniCollapsibles.defaults [object]
39
+
40
+
41
+ // Setup: 1. Create the correct markup (see below)
42
+ // - This plugin will set the aria attributes for you with one exception
43
+ // if an element is added to the page after calling the constructor
44
+ // you will need to run instance.init(); to do the same for new elements.
45
+ // For convenience the module provides a method to update all instances with:
46
+ //
47
+ // MiniCollapsibles.parse()
48
+ //
49
+ // - This can be avoided by including the aria attributes in the HTML
50
+ // use the ariaStates object below for reference on what attributes
51
+ // should be set initially (based on if you want it open or closed)
52
+ // 2. Setup an instance by calling the constructor:
53
+ //
54
+ // var dropdown = new MiniCollapsible({
55
+ // container: '.collapsible',
56
+ // toggle: '.collapsible__toggle',
57
+ // content: '.collapsible__content',
58
+ // slide: 500
59
+ // });
60
+ //
61
+ // 3. Setup the CSS, the only requirement is adding display none when closed
62
+ // on the content container:
63
+
64
+ // .collapsible__content {
65
+ // display: none;
66
+ // }
67
+ // .collapsible__content[data-cc-state="open"] {
68
+ // display: block;
69
+ // }
70
+ //
71
+ // Markup: See comments below code
72
+
73
+
74
+ // Todo: - Tabs type (time permitting)
75
+ // - Add arrow key cycler from framework collapsible module
76
+
77
+ import maintain from 'ally.js/maintain/_maintain';
78
+ import { hasRequiredProps } from "../utils/object.js";
79
+
80
+ const requiredProps = ['selectorContainer', 'selectorToggle', 'selectorContent'];
81
+ const hasRequired = hasRequiredProps(requiredProps);
82
+ const $ = jQuery;
83
+ const $document = $(document);
84
+ const merge = Object.assign;
85
+ const elementsFocusable = [
86
+ 'a[href]',
87
+ 'button:not([disabled])',
88
+ 'area[href]',
89
+ 'input:not([disabled])',
90
+ 'select:not([disabled])',
91
+ 'textarea:not([disabled])',
92
+ 'iframe','object',
93
+ 'embed','*[tabindex]',
94
+ '*[contenteditable]'
95
+ ];
96
+ const selectorFocusable = elementsFocusable.join(' ');
97
+ const dataKeyParsed = "MiniCollapsibleInit";
98
+ const defaults = {
99
+ idPrefix: 'mc-id--', // So user can adjust if needed
100
+ selectorContainer: null, // (required, string) Selector
101
+ selectorToggle: null, // see above
102
+ selectorContent: null, // see above
103
+ selectorContext: 'body', // (string) Selector for container that holds multiple collapsibles (oneOpenPerContext)
104
+ aria: true, // (boolean) Toggle aria attributes for accessibility
105
+ selfManaged: false, // (boolean) The module will not handle the clicks (Attach yourself and run methods yourself)
106
+ clickOutsideCloses: false, // Will close the collapsible if it's open and the user clicks outside, not available to self managed
107
+ clickWithinCloses: false, // Useful for menus
108
+ focusoutCloses: false, // Focusing away from the element closes it
109
+ closeOnEscape: false, // Add escape key handler when collapsible is open
110
+ onChangeBefore: null, // Callback(elements, newState, event) called before open/closed/toggled
111
+ onChangeAfter: null, // Callback(elements, newState, event) called after open/closed/toggled
112
+ attr: 'data-cc-state', // The attribute to use to indicate the state (for styling), for adding a class use the callbacks
113
+ slide: false, // Whether or not to use jQuery slide animation pass value for duration or false, also can use keywords
114
+ fade: false, // Whether or not to use jQuery fadeIn/Out animation pass value for duration or false, also can use keywords (Cannot slide and fade)
115
+ oneOpenPerContext: false, // If enabled the selector for "context" will be used to close all others before opening a new one
116
+ closeBeforeOpen: true, // The closing of other items in the context (may be expanded to other things in future) should be done before opening another
117
+ type: 'basic', // The type of collapsible (basic, accordion, tabs[not created yet])
118
+ trapFocus: false // Only allow focusing within the open collapsible
119
+ };
120
+ // Object holds info for plugin internally
121
+ const managed = {
122
+ all: [],
123
+ click: {
124
+ // ".container-selector .toggle-selector" : { instance object }
125
+ },
126
+ clickOutside: {
127
+ // ".container-selector .toggle-selector" : { instance object }
128
+ },
129
+ clickWithin: {
130
+ // ".container-selector .toggle-selector" : { instance object }
131
+ }
132
+ };
133
+ let ariaStates = {
134
+ basic: {
135
+ init: { // Dev note: Use this property to add specific props for this type (non dynamic like aria-role, etc)
136
+ toggle: null,
137
+ content: null,
138
+ container: null,
139
+ callback: null // Dev note: Use this for doing custom stuff
140
+ },
141
+ open: {
142
+ toggle: {
143
+ 'aria-expanded' : 'true',
144
+ },
145
+ content: {
146
+ 'aria-hidden' : 'false'
147
+ }
148
+ },
149
+ closed: {
150
+ toggle: {
151
+ 'aria-expanded' : 'false',
152
+ },
153
+ content: {
154
+ 'aria-hidden' : 'true'
155
+ }
156
+ }
157
+ }
158
+ };
159
+ let instanceCount = 0;
160
+
161
+ // Adding other merged Aria States
162
+ ariaStates.accordion = merge({}, ariaStates.basic, {
163
+ init: {
164
+ callback: function(elements) {
165
+ if (elements.index === 0) {
166
+ elements.context.attr('aria-label', 'Accordion Control Group Buttons');
167
+ }
168
+ }
169
+ }
170
+ });
171
+
172
+
173
+
174
+ class MiniCollapsible {
175
+ constructor(options) {
176
+ if (!hasRequired(options)) {
177
+ console.warn('MiniCollapsible: Missing required options:', options);
178
+ }
179
+
180
+ merge(this, defaults, options);
181
+ managed.all.push(this); // Register
182
+
183
+ // Click handlers
184
+ if (!this.selfManaged) {
185
+ var clickSelector = this.clickSelector();
186
+ managed.click[clickSelector] = this;
187
+
188
+ if (this.clickOutsideCloses) {
189
+ managed.clickOutside[clickSelector] = this;
190
+ }
191
+ if (this.clickWithinCloses) {
192
+ managed.clickWithin[this.clickSelectorWithin()] = this;
193
+ }
194
+ }
195
+
196
+ this.init();
197
+ }
198
+ // Plugin Interface to re-parse plugin managed collapsibles
199
+ static parse() {
200
+ var all = managed.all;
201
+ for(var k = 0, l = all.length; k < l; k++) {
202
+ all[k].init();
203
+ }
204
+ }
205
+ clickSelector() {
206
+ return this.selectorContainer + ' ' + this.selectorToggle;
207
+ }
208
+ clickSelectorWithin() {
209
+ return this.selectorContainer + ' ' + this.selectorContent;
210
+ }
211
+ openSelector() {
212
+ return this.selectorContainer + '[' + this.attr + '="open"]';
213
+ }
214
+ handleClick(event, $toggle) {
215
+ var elements = this.getElements($toggle);
216
+ this.toggle(elements, event);
217
+ }
218
+ getElements($toggle) {
219
+
220
+ var $container = $toggle.closest(this.selectorContainer),
221
+ $content = $container.find(this.selectorContent).first();
222
+ return {
223
+ container: $container,
224
+ toggle: $toggle,
225
+ content: $content,
226
+ context: $container.closest(this.selectorContext),
227
+ all: $container.add($toggle).add($content)
228
+ };
229
+ }
230
+ getElementsFromContainer($container) {
231
+ var $toggle = $container.find(this.selectorToggle).first(),
232
+ $content = $container.find(this.selectorContent).first();
233
+ return {
234
+ container: $container,
235
+ toggle: $toggle,
236
+ content: $content,
237
+ context: $container.closest(this.selectorContext),
238
+ all: $container.add($toggle).add($content)
239
+ };
240
+ }
241
+ getElementsFromContent($content) {
242
+ var $container = $content.closest(this.selectorContainer),
243
+ $toggle = $container.find(this.selectorToggle).first();
244
+ return {
245
+ container: $container,
246
+ toggle: $toggle,
247
+ content: $content,
248
+ context: $container.closest(this.selectorContext),
249
+ all: $container.add($toggle).add($content)
250
+ };
251
+ }
252
+ getElementsArray($container) {
253
+ // Expects multiple containers returns arrays of elements objects
254
+ var self = this,
255
+ elementsArray = [];
256
+
257
+ function collect() {
258
+ elementsArray.push(self.getElementsFromContainer($(this)));
259
+ }
260
+
261
+ $container.each(collect);
262
+ return elementsArray;
263
+ }
264
+ getOtherElements({ container, content, toggle }) {
265
+
266
+ var $context = container.closest(this.selectorContext),
267
+ $container = $context.find(this.selectorContainer).not(container),
268
+ $toggle = $context.find(this.selectorToggle).not(toggle),
269
+ $content = $context.find(this.selectorContent).not(content);
270
+
271
+ return {
272
+ container: $container,
273
+ toggle: $toggle,
274
+ content: $content,
275
+ context: $context,
276
+ all: $container.add($toggle).add($content)
277
+ };
278
+ }
279
+ // Switched the state
280
+ toggle(elements, event) {
281
+ const state = this.getState(elements),
282
+ isOpening = state === "closed",
283
+ changeTo = isOpening ? "open" : "closed",
284
+ change = () => this.setState(elements, changeTo, event);
285
+ if (isOpening && this.oneOpenPerContext) {
286
+ if (this.closeBeforeOpen) {
287
+ this.setState(this.getOtherElements(elements), "closed", event, change);
288
+ } else {
289
+ this.setState(this.getOtherElements(elements), "closed", event);
290
+ change();
291
+ }
292
+ } else {
293
+ change();
294
+ }
295
+ }
296
+ setState(elements, state, event, onComplete) {
297
+ const handleComplete = () => onComplete && onComplete();
298
+ // Don't want to fire callbacks if no changes were made
299
+ if (!elements.container.length) return handleComplete();
300
+
301
+ // Callback after element is open/closed
302
+ const after = () => {
303
+ elements.all.attr(this.attr, state);
304
+ if (this.onChangeAfter) {
305
+ this.onChangeAfter.call(this, elements, state, event);
306
+ }
307
+ if (this.aria) {
308
+ this.setAriaAttr(elements, state);
309
+ }
310
+ if (this.trapFocus) {
311
+ this.setTrapFocus(elements, state);
312
+ }
313
+ if (this.closeOnEscape) {
314
+ this.setEscapeClose(elements, state);
315
+ }
316
+ if (this.focusoutCloses) {
317
+ this.setFocusoutCloses(elements, state);
318
+ }
319
+
320
+ // Change the toggle text if user passes state text object
321
+ const textState = elements.toggle.data('cc-state-text');
322
+ if (textState) {
323
+ elements.toggle.text(textState[state]);
324
+ }
325
+ handleComplete();
326
+ }
327
+ // Change the state and call callback
328
+ if (this.onChangeBefore) {
329
+ this.onChangeBefore.call(this, elements, state, event);
330
+ }
331
+ if (this.slide) {
332
+ elements.content[state === "open" ? "slideDown" : "slideUp"](this.slide, after);
333
+ } else if (this.fade) {
334
+ elements.content[state === "open" ? "fadeIn" : "fadeOut"](this.slide, after);
335
+ } else {
336
+ after();
337
+ }
338
+ }
339
+ getState({ content }) {
340
+ return content.attr(this.attr) || "closed";
341
+ }
342
+ setAriaAttr(elements, state, setImmutable) {
343
+
344
+ var ariaAttrs = ariaStates[this.type],
345
+ ariaInit = ariaAttrs.init,
346
+ ariaState = ariaAttrs[state],
347
+ toggleAttrs = ariaState.toggle,
348
+ contentAttrs = ariaState.content;
349
+
350
+ if (setImmutable) {
351
+
352
+ var tid = this.uniqueId(),
353
+ cid = this.uniqueId();
354
+
355
+ toggleAttrs = merge(toggleAttrs, ariaInit.toggle, {
356
+ "id": tid,
357
+ "aria-controls" : cid,
358
+ });
359
+
360
+ contentAttrs = merge(contentAttrs, ariaInit.content, {
361
+ "id": cid,
362
+ "aria-labelledby" : tid
363
+ });
364
+
365
+ if (ariaInit.container) {
366
+ elements.container.attr(ariaInit.container);
367
+ }
368
+ if (ariaInit.context) {
369
+ elements.context.attr(ariaInit.context);
370
+ }
371
+ // Do custom stuff
372
+ if (ariaInit.callback) {
373
+ ariaInit.callback.call(this, elements);
374
+ }
375
+ }
376
+
377
+ elements.toggle.attr(toggleAttrs);
378
+ elements.content.attr(contentAttrs);
379
+ }
380
+ /**
381
+ * Attaches temporary ally handler for disabling
382
+ * focus outside of the collapsible instance
383
+ * @param {Object} elements
384
+ * @param {String} state
385
+ */
386
+ setTrapFocus(elements, state) {
387
+ const filter = elements.container.get(0);
388
+ if (state === "open") {
389
+ this._focusTrapHandler = maintain.disabled({ filter });
390
+ } else if (this.focusTrapHandler) {
391
+ this._focusTrapHandler.disengage();
392
+ delete this._focusTrapHandler;
393
+ }
394
+ }
395
+ /**
396
+ * Attaches temporary handler for the escape key
397
+ * while the collapsible is open. Removing it when
398
+ * it closes.
399
+ * @param {Object} elements
400
+ * @param {String} state
401
+ */
402
+ setEscapeClose(elements, state) {
403
+ const { container } = elements;
404
+ if (state === "open") {
405
+ this._escapeCloseHandler = e => {
406
+ if (e.keyCode === 27) {
407
+ this.setState(elements, "closed", e);
408
+ container.off('keyup', handler);
409
+ delete this._escapeCloseHandler;
410
+ }
411
+ };
412
+ container.on('keyup', this._escapeCloseHandler);
413
+ } else if (this._escapeCloseHandler) {
414
+ container.off('keyup', this._escapeCloseHandler);
415
+ delete this._escapeCloseHandler;
416
+ }
417
+ }
418
+ setFocusoutCloses(elements, state) {
419
+ const { container } = elements;
420
+ if (state === "open") {
421
+ this._focusoutClosesHandler = e => {
422
+ if (!container.get(0).contains(e.relatedTarget)) {
423
+ console.log('Closed due to focu out');
424
+ this.setState(elements, "closed", e);
425
+ delete this._focusoutClosesHandler;
426
+ }
427
+ };
428
+ container.on('focusout', this._focusoutClosesHandler);
429
+ } else if (this._focusoutClosesHandler) {
430
+ container.off('focusout', this._focusoutClosesHandler);
431
+ delete this._focusoutClosesHandler;
432
+ }
433
+ }
434
+ init() {
435
+ this.each(this.initElementSet);
436
+ }
437
+ initElementSet(elements) {
438
+ // Check if they are already setting attributes if not set them
439
+ if (elements.container.data(dataKeyParsed)) {
440
+ return;
441
+ }
442
+ var state = this.getState(elements);
443
+ this.setAriaAttr(elements, state, true);
444
+ elements.container.data(dataKeyParsed, true);
445
+ }
446
+ each(callback) {
447
+
448
+ $(this.selectorContainer).each(eachContainer.bind(this));
449
+
450
+ function eachContainer(index, container) {
451
+ var $container = $(container),
452
+ $toggle = $container.find(this.selectorToggle).first(),
453
+ $content = $container.find(this.selectorContent).first();
454
+
455
+ var elements = {
456
+ container: $container,
457
+ toggle: $toggle,
458
+ content: $content,
459
+ index: index,
460
+ context: $container.closest(this.selectorContext),
461
+ all: $container.add($toggle).add($content)
462
+ };
463
+
464
+ callback.call(this, elements);
465
+ }
466
+ }
467
+ // Function should test DOM for an ID and return one that doesn't exist.
468
+ // - User can override this function if needed
469
+ uniqueId(attempt) {
470
+
471
+ attempt = attempt === undefined ? 1 : ++attempt;
472
+
473
+ var id = this.idPrefix + (++instanceCount),
474
+ el = $('#' + id);
475
+
476
+ // Check to make sure this ID isn't in the DOM (try again)
477
+ // The attempt limit is so this doesn't go into infinite loop for some
478
+ // reason (very unlikely but it didn't feel right leaving the
479
+ // opportunity to loop forever)
480
+ if (el.length && attempt < 50) {
481
+ return this.uniqueId(attempt);
482
+ } else {
483
+ return id;
484
+ }
485
+ }
486
+ }
487
+
488
+ // Attaching properties to class so user can modify globally
489
+ MiniCollapsible.defaults = defaults;
490
+ MiniCollapsible.ariaStates = ariaStates;
491
+ MiniCollapsible.managed = managed;
492
+
493
+ $document.on('click', onClick); // Module click handler
494
+
495
+ // Internal Functions
496
+ // =============================================================================
497
+
498
+ function onClick(event) {
499
+ var $target = $(event.target),
500
+ selector,
501
+ $toggle,
502
+ $content,
503
+ instance,
504
+ elements;
505
+
506
+
507
+ // Check for open instances before changing new ones
508
+ for (selector in managed.clickOutside) {
509
+ // Need to select all open
510
+ instance = managed.clickOutside[selector];
511
+ ifOutsideClose(instance, $target, event);
512
+ }
513
+ // Check all instances
514
+ for (selector in managed.click) {
515
+ $toggle = $target.closest(selector);
516
+ if ($toggle.length) {
517
+ instance = managed.click[selector];
518
+ instance.handleClick(event, $toggle);
519
+ }
520
+ }
521
+ // check Click within and close
522
+ for (selector in managed.clickWithin) {
523
+ $content = $target.closest(selector);
524
+ if ($content.length) {
525
+ instance = managed.clickWithin[selector];
526
+ elements = instance.getElementsFromContent($content);
527
+ instance.setState(elements, 'closed', event);
528
+ }
529
+ }
530
+ }
531
+ function ifOutsideClose(self, $target, event) {
532
+ // Decide if the current click target is a toggle
533
+ var cont = self.selectorContainer,
534
+ contOpen = self.openSelector(),
535
+ $targetContainer = $target.parents(cont).addBack(cont),
536
+ $openContainer = $document.find(contOpen).not($targetContainer);
537
+
538
+ // Then close the open containers
539
+ if ($openContainer.length) {
540
+ var elementsArray = self.getElementsArray($openContainer);
541
+ for(var i = 0; i < elementsArray.length; i++){
542
+ self.setState(elementsArray[i], "closed", event);
543
+ }
544
+ }
545
+ }
546
+
547
+ export default MiniCollapsible;
548
+
549
+ /*
550
+ Markup Example:
551
+
552
+ <!-- Basic Hide and Show -->
553
+ <div class="collapsible" data-cc-state="closed">
554
+ <button class="collapsible__toggle" type="button" data-cc-state="closed" data-cc-state-text='{ "open" : "Hide Filters", "closed" : "Show Filters" }'>
555
+ Open Me
556
+ </button>
557
+ <div class="collapsible__content" data-cc-state="closed">
558
+ <p>
559
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu molestie est. Proin ante augue, sollicitudin at diam sed, ullamcorper vehicula libero. Vestibulum hendrerit, arcu eget viverra imperdiet, ipsum nunc consectetur sapien, eu tincidunt velit leo vel neque. Quisque sit amet venenatis turpis. Donec ac faucibus nisi. Aliquam nec rhoncus
560
+ </p>
561
+ </div>
562
+ </div>
563
+
564
+ <!-- Example accordion -->
565
+ <ul class="accordion">
566
+ <li class="accordion__item" data-cc-state="open">
567
+ <button class="accordion__toggle" data-cc-state="open" type="button">
568
+ <strong>Toggle the accordion</strong>
569
+ </button>
570
+ <div class="accordion__content" data-cc-state="open">
571
+ <p>
572
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu molestie est. Proin ante augue, sollicitudin at diam sed, ullamcorper vehicula libero. Vestibulum hendrerit, arcu eget viverra imperdiet, ipsum nunc consectetur sapien, eu tincidunt velit leo vel neque. Quisque sit amet venenatis turpis. Donec ac faucibus nisi. Aliquam nec rhoncus turpis, sit amet euismod sem. Morbi facilisis, ipsum eget fermentum interdum, ligula diam tincidunt nisi, eu auctor lacus sem maximus erat. Sed at metus ex. Nam vestibulum convallis magna, et ultricies eros suscipit non. Quisque ornare semper ipsum vitae tempor. Aliquam semper ante leo, eget pretium nisi fringilla quis.
573
+ </p>
574
+ </div>
575
+ </li>
576
+ <li class="accordion__item" data-cc-state="closed">
577
+ <button class="accordion__toggle" data-cc-state="closed">
578
+ <strong>Toggle the accordion</strong>
579
+ </button>
580
+ <div class="accordion__content" data-cc-state="closed">
581
+ <p>
582
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu molestie est. Proin ante augue, sollicitudin at diam sed, ullamcorper vehicula libero. Vestibulum hendrerit, arcu eget viverra imperdiet, ipsum nunc consectetur sapien, eu tincidunt velit leo vel neque. Quisque sit amet venenatis turpis. Donec ac faucibus nisi. Aliquam nec rhoncus turpis, sit amet euismod sem. Morbi facilisis, ipsum eget fermentum interdum, ligula diam tincidunt nisi, eu auctor lacus sem maximus erat. Sed at metus ex. Nam vestibulum convallis magna, et ultricies eros suscipit non. Quisque ornare semper ipsum vitae tempor. Aliquam semper ante leo, eget pretium nisi fringilla quis.
583
+ </p>
584
+ </div>
585
+ </li>
586
+ <li class="accordion__item" data-cc-state="closed">
587
+ <button class="accordion__toggle" data-cc-state="closed">
588
+ <strong>Toggle the accordion</strong>
589
+ </button>
590
+ <div class="accordion__content" data-cc-state="closed">
591
+ <p>
592
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu molestie est. Proin ante augue, sollicitudin at diam sed, ullamcorper vehicula libero. Vestibulum hendrerit, arcu eget viverra imperdiet, ipsum nunc consectetur sapien, eu tincidunt velit leo vel neque. Quisque sit amet venenatis turpis. Donec ac faucibus nisi. Aliquam nec rhoncus turpis, sit amet euismod sem. Morbi facilisis, ipsum eget fermentum interdum, ligula diam tincidunt nisi, eu auctor lacus sem maximus erat. Sed at metus ex. Nam vestibulum convallis magna, et ultricies eros suscipit non. Quisque ornare semper ipsum vitae tempor. Aliquam semper ante leo, eget pretium nisi fringilla quis.
593
+ </p>
594
+ </div>
595
+ </li>
596
+ <li class="accordion__item" data-cc-state="closed">
597
+ <button class="accordion__toggle" data-cc-state="closed">
598
+ <strong>Toggle the accordion</strong>
599
+ </button>
600
+ <div class="accordion__content" data-cc-state="closed">
601
+ <p>
602
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam eu molestie est. Proin ante augue, sollicitudin at diam sed, ullamcorper vehicula libero. Vestibulum hendrerit, arcu eget viverra imperdiet, ipsum nunc consectetur sapien, eu tincidunt velit leo vel neque. Quisque sit amet venenatis turpis. Donec ac faucibus nisi. Aliquam nec rhoncus turpis, sit amet euismod sem. Morbi facilisis, ipsum eget fermentum interdum, ligula diam tincidunt nisi, eu auctor lacus sem maximus erat. Sed at metus ex. Nam vestibulum convallis magna, et ultricies eros suscipit non. Quisque ornare semper ipsum vitae tempor. Aliquam semper ante leo, eget pretium nisi fringilla quis.
603
+ </p>
604
+ </div>
605
+ </li>
606
+ </ul>
607
+ */
@@ -0,0 +1,60 @@
1
+ // Would be used in the head of the document
2
+ (function(d, w) {
3
+
4
+ // The constructor will set unique props
5
+ // And it will create/init the script tag
6
+ function ScriptLoader(url, callback) {
7
+
8
+ // Add the script tag
9
+ var s = d.createElement("script");
10
+ s.src = url;
11
+ s.async = true;
12
+
13
+ // Funciton to be run when script is loaded and executed
14
+ // Note: This will be bound to this object
15
+ function init() {
16
+ for (var i = 0; i < this.callbacks.length; i++) {
17
+ this.callbacks[i].call(this);
18
+ }
19
+ delete this.callbacks;
20
+ this.loaded = true;
21
+ }
22
+
23
+ // Unique Props
24
+ this.callbacks = [];
25
+ this.loaded = false;
26
+ this.script = s;
27
+
28
+ // Ability to add callbacks when creating object
29
+ if (callback) this.callbacks.push(callback);
30
+
31
+ // Add listener for load and then attach document
32
+ s.addEventListener("load", init.bind(this));
33
+
34
+ // If the script is placed in the head we
35
+ // will make sure the the body exists
36
+ var ds = d.readyState;
37
+
38
+ if (ds === "complete" ||
39
+ ds === "loaded" ||
40
+ ds === "interactive") {
41
+ // document has been parsed
42
+ d.body.appendChild(s);
43
+ } else {
44
+ // Attach after the body is ready
45
+ d.addEventListener("DOMContentLoaded", function() {
46
+ d.body.appendChild(s);
47
+ });
48
+ }
49
+ }
50
+
51
+ // This method allows the user to add callbacks to be
52
+ // called when script is loaded and executed
53
+ ScriptLoader.prototype.onLoad = function(callback) {
54
+ if (!this.loaded) this.callbacks.push(callback);
55
+ else callback.call(this);
56
+ };
57
+
58
+ // Create key for global access to class
59
+ window.ScriptLoader = ScriptLoader;
60
+ }(document, window));