@ulu/frontend 0.1.0-beta.6 → 0.1.0-beta.60

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 (290) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/dist/ulu-frontend.min.css +1 -1
  3. package/dist/ulu-frontend.min.js +28 -27
  4. package/docs-dev/assets/main.js +832 -421
  5. package/docs-dev/assets/placeholder/icon-calendar.svg +1 -0
  6. package/docs-dev/assets/placeholder/icon-check.svg +1 -0
  7. package/docs-dev/assets/style.css +629 -233
  8. package/docs-dev/changelog/index.html +6236 -0
  9. package/docs-dev/changelog/updates-and-changes/index.html +5109 -0
  10. package/docs-dev/demos/accordion/index.html +904 -321
  11. package/docs-dev/demos/basic-hero/index.html +111 -0
  12. package/docs-dev/demos/breakpoints-manager/index.html +5246 -0
  13. package/docs-dev/demos/button/index.html +916 -323
  14. package/docs-dev/demos/button-verbose/index.html +5238 -0
  15. package/docs-dev/demos/callout/index.html +951 -328
  16. package/docs-dev/demos/captioned-figure/index.html +904 -321
  17. package/docs-dev/demos/card/index.html +970 -748
  18. package/docs-dev/demos/card-grid/index.html +5357 -0
  19. package/docs-dev/demos/card-new/index.html +5088 -0
  20. package/docs-dev/demos/card-old/index.html +5223 -0
  21. package/docs-dev/demos/card.1/index.html +5223 -0
  22. package/docs-dev/demos/card.TRASH/index.html +5541 -0
  23. package/docs-dev/demos/counter-list/index.html +5224 -0
  24. package/docs-dev/demos/css-icons/index.html +904 -321
  25. package/docs-dev/demos/data-grid/index.html +1014 -511
  26. package/docs-dev/demos/data-table/index.html +1064 -348
  27. package/docs-dev/demos/details-group/index.html +5267 -0
  28. package/docs-dev/demos/file-save/index.html +904 -321
  29. package/docs-dev/demos/flipcard/index.html +904 -321
  30. package/docs-dev/demos/form-theme/index.html +922 -352
  31. package/docs-dev/demos/hero/index.html +12 -4
  32. package/docs-dev/demos/image-grid/index.html +12 -4
  33. package/docs-dev/demos/index.html +905 -322
  34. package/docs-dev/demos/list-inline/index.html +5220 -0
  35. package/docs-dev/demos/list-inline.1/index.html +4727 -0
  36. package/docs-dev/demos/list-lines/index.html +5210 -0
  37. package/docs-dev/demos/menu-stack/index.html +975 -377
  38. package/docs-dev/demos/modals/index.html +1010 -357
  39. package/docs-dev/demos/nav-strip/index.html +904 -321
  40. package/docs-dev/demos/overlay-section/index.html +979 -326
  41. package/docs-dev/demos/popovers/index.html +1152 -327
  42. package/docs-dev/demos/print/index.html +904 -321
  43. package/docs-dev/demos/pull-quote/index.html +904 -321
  44. package/docs-dev/demos/rule/index.html +952 -357
  45. package/docs-dev/demos/scroll-slider/index.html +72 -106
  46. package/docs-dev/demos/scrollpoints/index.html +905 -322
  47. package/docs-dev/demos/slider/index.html +12 -4
  48. package/docs-dev/demos/spoke-spinner/index.html +904 -321
  49. package/docs-dev/demos/sticky-list/index.html +5223 -0
  50. package/docs-dev/demos/tabs/index.html +944 -325
  51. package/docs-dev/demos/tag/index.html +904 -321
  52. package/docs-dev/demos/theme-toggle/index.html +5279 -0
  53. package/docs-dev/demos/tile-grid-overlay/index.html +12 -4
  54. package/docs-dev/demos/tiles/index.html +904 -321
  55. package/docs-dev/demos/tooltip/index.html +904 -321
  56. package/docs-dev/guide/building-stylesheet/index.html +904 -321
  57. package/docs-dev/guide/developing-ulu-scss-module/index.html +904 -321
  58. package/docs-dev/guide/index.html +904 -321
  59. package/docs-dev/guide/updates-and-changes/index.html +5033 -0
  60. package/docs-dev/index.html +904 -321
  61. package/docs-dev/javascript/events/index.html +901 -320
  62. package/docs-dev/javascript/index.html +904 -321
  63. package/docs-dev/javascript/settings/index.html +5400 -0
  64. package/docs-dev/javascript/ui-breakpoints/index.html +916 -335
  65. package/docs-dev/javascript/ui-collapsible/index.html +901 -320
  66. package/docs-dev/javascript/ui-details-group/index.html +5322 -0
  67. package/docs-dev/javascript/ui-dialog/index.html +967 -371
  68. package/docs-dev/javascript/ui-flipcard/index.html +964 -327
  69. package/docs-dev/javascript/ui-grid/index.html +913 -358
  70. package/docs-dev/javascript/ui-modal-builder/index.html +1067 -366
  71. package/docs-dev/javascript/ui-overflow-scroller/index.html +901 -320
  72. package/docs-dev/javascript/ui-overflow-scroller-pager/index.html +901 -320
  73. package/docs-dev/javascript/ui-page/index.html +901 -320
  74. package/docs-dev/javascript/ui-popover/index.html +911 -334
  75. package/docs-dev/javascript/ui-print/index.html +901 -328
  76. package/docs-dev/javascript/ui-print-details/index.html +901 -320
  77. package/docs-dev/javascript/ui-programmatic-modal/index.html +901 -320
  78. package/docs-dev/javascript/ui-proxy-click/index.html +990 -324
  79. package/docs-dev/javascript/ui-resizer/index.html +901 -320
  80. package/docs-dev/javascript/ui-scroll-slider/index.html +941 -328
  81. package/docs-dev/javascript/ui-scrollpoint/index.html +907 -333
  82. package/docs-dev/javascript/ui-slider/index.html +1099 -327
  83. package/docs-dev/javascript/ui-tabs/index.html +914 -370
  84. package/docs-dev/javascript/ui-theme-toggle/index.html +5410 -0
  85. package/docs-dev/javascript/ui-tooltip/index.html +940 -363
  86. package/docs-dev/javascript/utils-class-logger/index.html +901 -320
  87. package/docs-dev/javascript/utils-css/index.html +5224 -0
  88. package/docs-dev/javascript/utils-dom/index.html +1054 -339
  89. package/docs-dev/javascript/utils-file-save/index.html +901 -320
  90. package/docs-dev/javascript/utils-floating-ui/index.html +901 -320
  91. package/docs-dev/javascript/utils-id/index.html +901 -320
  92. package/docs-dev/javascript/utils-pause-youtube-video/index.html +901 -320
  93. package/docs-dev/javascript/utils-system/index.html +5527 -0
  94. package/docs-dev/sass/base/color/index.html +901 -320
  95. package/docs-dev/sass/base/elements/index.html +901 -320
  96. package/docs-dev/sass/base/index/index.html +901 -320
  97. package/docs-dev/sass/base/index.html +904 -321
  98. package/docs-dev/sass/base/keyframes/index.html +901 -320
  99. package/docs-dev/sass/base/layout/index.html +901 -320
  100. package/docs-dev/sass/base/normalize/index.html +901 -320
  101. package/docs-dev/sass/base/print/index.html +901 -320
  102. package/docs-dev/sass/base/root/index.html +901 -320
  103. package/docs-dev/sass/base/typography/index.html +901 -320
  104. package/docs-dev/sass/components/accordion/index.html +908 -327
  105. package/docs-dev/sass/components/adaptive-spacing/index.html +901 -320
  106. package/docs-dev/sass/components/badge/index.html +909 -328
  107. package/docs-dev/sass/components/basic-hero/index.html +5385 -0
  108. package/docs-dev/sass/components/button/index.html +901 -320
  109. package/docs-dev/sass/components/button-verbose/index.html +989 -333
  110. package/docs-dev/sass/components/callout/index.html +1018 -414
  111. package/docs-dev/sass/components/captioned-figure/index.html +1026 -330
  112. package/docs-dev/sass/components/card/index.html +1003 -350
  113. package/docs-dev/sass/components/card-grid/index.html +901 -320
  114. package/docs-dev/sass/components/counter-list/index.html +5458 -0
  115. package/docs-dev/sass/components/css-icon/index.html +918 -330
  116. package/docs-dev/sass/components/data-grid/index.html +922 -334
  117. package/docs-dev/sass/components/data-table/index.html +1106 -333
  118. package/docs-dev/sass/components/fill-context/index.html +901 -320
  119. package/docs-dev/sass/components/flipcard/index.html +939 -327
  120. package/docs-dev/sass/components/flipcard-grid/index.html +901 -320
  121. package/docs-dev/sass/components/form-theme/index.html +1110 -433
  122. package/docs-dev/sass/components/hero/index.html +995 -366
  123. package/docs-dev/sass/components/horizontal-rule/index.html +901 -320
  124. package/docs-dev/sass/components/image-grid/index.html +901 -320
  125. package/docs-dev/sass/components/index/index.html +915 -330
  126. package/docs-dev/sass/components/index.html +904 -321
  127. package/docs-dev/sass/components/links/index.html +901 -320
  128. package/docs-dev/sass/components/list-inline/index.html +5399 -0
  129. package/docs-dev/sass/components/list-lines/index.html +936 -359
  130. package/docs-dev/sass/components/list-ordered/index.html +903 -322
  131. package/docs-dev/sass/components/list-unordered/index.html +901 -320
  132. package/docs-dev/sass/components/menu-stack/index.html +973 -379
  133. package/docs-dev/sass/components/modal/index.html +953 -365
  134. package/docs-dev/sass/components/nav-strip/index.html +909 -328
  135. package/docs-dev/sass/components/overlay-section/index.html +909 -328
  136. package/docs-dev/sass/components/pager/index.html +901 -320
  137. package/docs-dev/sass/components/placeholder-block/index.html +901 -320
  138. package/docs-dev/sass/components/popover/index.html +996 -379
  139. package/docs-dev/sass/components/pull-quote/index.html +913 -332
  140. package/docs-dev/sass/components/ratio-box/index.html +909 -328
  141. package/docs-dev/sass/components/rule/index.html +909 -328
  142. package/docs-dev/sass/components/scroll-slider/index.html +944 -375
  143. package/docs-dev/sass/components/skip-link/index.html +909 -328
  144. package/docs-dev/sass/components/slider/index.html +989 -420
  145. package/docs-dev/sass/components/spoke-spinner/index.html +903 -322
  146. package/docs-dev/sass/components/sticky-list/index.html +5603 -0
  147. package/docs-dev/sass/components/tabs/index.html +910 -329
  148. package/docs-dev/sass/components/tag/index.html +903 -322
  149. package/docs-dev/sass/components/tile-button/index.html +901 -320
  150. package/docs-dev/sass/components/tile-grid/index.html +901 -320
  151. package/docs-dev/sass/components/tile-grid-overlay/index.html +901 -320
  152. package/docs-dev/sass/components/vignette/index.html +915 -328
  153. package/docs-dev/sass/components/wysiwyg/index.html +901 -320
  154. package/docs-dev/sass/core/breakpoint/index.html +947 -352
  155. package/docs-dev/sass/core/button/index.html +901 -320
  156. package/docs-dev/sass/core/color/index.html +1078 -364
  157. package/docs-dev/sass/core/cssvar/index.html +901 -320
  158. package/docs-dev/sass/core/element/index.html +1096 -368
  159. package/docs-dev/sass/core/index.html +901 -320
  160. package/docs-dev/sass/core/layout/index.html +961 -361
  161. package/docs-dev/sass/core/path/index.html +901 -320
  162. package/docs-dev/sass/core/selector/index.html +901 -320
  163. package/docs-dev/sass/core/typography/index.html +901 -320
  164. package/docs-dev/sass/core/units/index.html +911 -324
  165. package/docs-dev/sass/core/utils/index.html +1871 -430
  166. package/docs-dev/sass/helpers/color/index.html +901 -320
  167. package/docs-dev/sass/helpers/display/index.html +902 -321
  168. package/docs-dev/sass/helpers/index/index.html +901 -320
  169. package/docs-dev/sass/helpers/index.html +904 -321
  170. package/docs-dev/sass/helpers/print/index.html +843 -292
  171. package/docs-dev/sass/helpers/typography/index.html +901 -320
  172. package/docs-dev/sass/helpers/units/index.html +901 -320
  173. package/docs-dev/sass/helpers/utilities/index.html +903 -322
  174. package/docs-dev/sass/index.html +904 -321
  175. package/js/index.js +1 -0
  176. package/js/settings.js +95 -0
  177. package/js/ui/breakpoints.js +19 -16
  178. package/js/ui/collapsible.js +8 -1
  179. package/js/ui/details-group.js +112 -0
  180. package/js/ui/dialog.js +90 -42
  181. package/js/ui/dialog.todo +2 -36
  182. package/js/ui/flipcard.js +37 -57
  183. package/js/ui/grid.js +15 -13
  184. package/js/ui/index.js +1 -0
  185. package/js/ui/modal-builder.js +76 -56
  186. package/js/ui/overflow-scroller.js +6 -4
  187. package/js/ui/popover.js +38 -38
  188. package/js/ui/print.js +16 -25
  189. package/js/ui/programmatic-modal.js +9 -3
  190. package/js/ui/proxy-click.js +50 -36
  191. package/js/ui/scroll-slider.js +24 -30
  192. package/js/ui/scrollpoint.js +28 -64
  193. package/js/ui/slider.js +108 -63
  194. package/js/ui/tabs.js +23 -36
  195. package/js/ui/theme-toggle.js +331 -94
  196. package/js/ui/tooltip.js +27 -32
  197. package/js/utils/css.js +13 -0
  198. package/js/utils/dom.js +85 -8
  199. package/js/utils/font-awesome.js +18 -0
  200. package/js/utils/index.js +2 -1
  201. package/js/utils/system.js +154 -0
  202. package/package.json +14 -7
  203. package/scss/_breakpoint.scss +16 -3
  204. package/scss/_color.scss +36 -5
  205. package/scss/_element.scss +94 -2
  206. package/scss/_layout.scss +7 -8
  207. package/scss/_units.scss +3 -2
  208. package/scss/_utils.scss +248 -13
  209. package/scss/components/README.todos +14 -0
  210. package/scss/components/_accordion.scss +5 -7
  211. package/scss/components/_basic-hero.scss +112 -0
  212. package/scss/components/_button-verbose.scss +100 -18
  213. package/scss/components/_callout.scss +125 -78
  214. package/scss/components/_captioned-figure.scss +17 -0
  215. package/scss/components/_card-grid.scss +1 -1
  216. package/scss/components/_card.scss +246 -74
  217. package/scss/components/_counter-list.scss +137 -0
  218. package/scss/components/_css-icon.scss +25 -21
  219. package/scss/components/_data-grid.scss +38 -9
  220. package/scss/components/_data-table.scss +44 -4
  221. package/scss/components/_flipcard.scss +8 -3
  222. package/scss/components/_form-theme.scss +119 -108
  223. package/scss/components/_hero.scss +12 -10
  224. package/scss/components/_index.scss +24 -0
  225. package/scss/components/_list-inline.scss +80 -0
  226. package/scss/components/_list-lines.scss +44 -32
  227. package/scss/components/_menu-stack.scss +42 -26
  228. package/scss/components/_modal.scss +13 -6
  229. package/scss/components/_nav-strip.scss +2 -0
  230. package/scss/components/_overlay-section.scss +2 -5
  231. package/scss/components/_popover.scss +165 -64
  232. package/scss/components/_pull-quote.scss +13 -13
  233. package/scss/components/_ratio-box.scss +2 -5
  234. package/scss/components/_rule.scss +1 -0
  235. package/scss/components/_scroll-slider.scss +1 -5
  236. package/scss/components/_slider.scss +49 -72
  237. package/scss/components/_spoke-spinner.scss +2 -2
  238. package/scss/components/_sticky-list.scss +206 -0
  239. package/scss/components/_tabs.scss +3 -1
  240. package/scss/components/_vignette.scss +3 -5
  241. package/scss/helpers/_display.scss +15 -18
  242. package/scss/helpers/_print.scss +12 -7
  243. package/scss/helpers/_utilities.scss +42 -32
  244. package/types/index.d.ts +1 -0
  245. package/types/settings.d.ts +66 -0
  246. package/types/settings.d.ts.map +1 -0
  247. package/types/ui/breakpoints.d.ts +14 -14
  248. package/types/ui/breakpoints.d.ts.map +1 -1
  249. package/types/ui/collapsible.d.ts.map +1 -1
  250. package/types/ui/details-group.d.ts +38 -0
  251. package/types/ui/details-group.d.ts.map +1 -0
  252. package/types/ui/dialog.d.ts +20 -14
  253. package/types/ui/dialog.d.ts.map +1 -1
  254. package/types/ui/flipcard.d.ts +16 -10
  255. package/types/ui/flipcard.d.ts.map +1 -1
  256. package/types/ui/grid.d.ts +4 -6
  257. package/types/ui/grid.d.ts.map +1 -1
  258. package/types/ui/index.d.ts +1 -0
  259. package/types/ui/modal-builder.d.ts +93 -11
  260. package/types/ui/modal-builder.d.ts.map +1 -1
  261. package/types/ui/overflow-scroller.d.ts +2 -2
  262. package/types/ui/overflow-scroller.d.ts.map +1 -1
  263. package/types/ui/popover.d.ts +6 -7
  264. package/types/ui/popover.d.ts.map +1 -1
  265. package/types/ui/print.d.ts +0 -4
  266. package/types/ui/print.d.ts.map +1 -1
  267. package/types/ui/programmatic-modal.d.ts.map +1 -1
  268. package/types/ui/proxy-click.d.ts +19 -3
  269. package/types/ui/proxy-click.d.ts.map +1 -1
  270. package/types/ui/scroll-slider.d.ts +5 -7
  271. package/types/ui/scroll-slider.d.ts.map +1 -1
  272. package/types/ui/scrollpoint.d.ts +3 -8
  273. package/types/ui/scrollpoint.d.ts.map +1 -1
  274. package/types/ui/slider.d.ts +33 -14
  275. package/types/ui/slider.d.ts.map +1 -1
  276. package/types/ui/tabs.d.ts +6 -8
  277. package/types/ui/tabs.d.ts.map +1 -1
  278. package/types/ui/theme-toggle.d.ts +51 -7
  279. package/types/ui/theme-toggle.d.ts.map +1 -1
  280. package/types/ui/tooltip.d.ts +3 -5
  281. package/types/ui/tooltip.d.ts.map +1 -1
  282. package/types/utils/css.d.ts +11 -0
  283. package/types/utils/css.d.ts.map +1 -0
  284. package/types/utils/dom.d.ts +45 -6
  285. package/types/utils/dom.d.ts.map +1 -1
  286. package/types/utils/font-awesome.d.ts +5 -0
  287. package/types/utils/font-awesome.d.ts.map +1 -0
  288. package/types/utils/index.d.ts +1 -0
  289. package/types/utils/system.d.ts +113 -0
  290. package/types/utils/system.d.ts.map +1 -0
@@ -5,6 +5,7 @@
5
5
 
6
6
  import { getName, dispatch } from "../events/index.js";
7
7
  import { newId } from "../utils/id.js";
8
+ import { getElement } from "../utils/dom.js";
8
9
  import { buildModal } from "./modal-builder.js";
9
10
 
10
11
  export class ProgrammaticModalManager {
@@ -43,12 +44,17 @@ export class ProgrammaticModalManager {
43
44
  });
44
45
  }
45
46
  createAndOpen(config, afterCreate) {
46
- const { selector, noClickTrigger, removeOnClose } = config;
47
- const content = document.querySelector(selector);
47
+ const { noClickTrigger, removeOnClose, element, classes } = config;
48
+ const content = getElement(element);
48
49
  if (!content.id) {
49
50
  content.id = newId();
50
51
  }
51
52
 
53
+ // Added to match original jquery module api
54
+ if (classes) {
55
+ content.classList.add(...classes);
56
+ }
57
+
52
58
  let trigger;
53
59
  if (!noClickTrigger) {
54
60
  trigger = this.cachedTrigger;
@@ -57,7 +63,7 @@ export class ProgrammaticModalManager {
57
63
  }
58
64
 
59
65
  if (!content) {
60
- console.error("No element found from config.selector. ", config);
66
+ console.error("No element found from config.element. ", config);
61
67
  return;
62
68
  }
63
69
  const { modal } = buildModal(content, config.modal);
@@ -1,26 +1,27 @@
1
1
  /**
2
2
  * @module ui/proxy-click
3
+ * @description Used for cards and things that look like they should be clickable
4
+ * even though the link in their content is the only clickable element. This way
5
+ * the entire cards content doesn't need to be in a link (which isn't accessible).
6
+ *
7
+ * The script allows only for clicks with a duration of 250ms to avoid conflict
8
+ * with a user selecting text. Works with either links or buttons because it just
9
+ * uses the elements .click(). Uses data-attributes for selection by default.
3
10
  */
4
11
 
12
+ import { ComponentInitializer } from "../utils/system.js";
5
13
 
6
- // Used for cards and things that look like they should be clickable even
7
- // though the link in their content is the only clickable element. This way the
8
- // entire cards content doesn't need to be in a link (which isn't accessible)
9
- // - The script allows only for clicks with a duration of 250ms to avoid
10
- // conflict with a user selecting text.
11
- // - Works with either links or buttons because it just uses the elements .click()
12
- // - Uses data-attributes for selection
13
- import { getName } from "../events/index.js";
14
- import { getDatasetOptionalJson } from "../utils/dom.js";
15
-
16
- const attrs = {
17
- trigger: "data-ulu-proxy-click",
18
- init: "data-ulu-proxy-click-init",
19
- };
20
-
21
- const attrSelector = key => `[${ attrs[key] }]`;
22
- const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
14
+ /**
15
+ * Proxy Click Component Initializer
16
+ */
17
+ export const initializer = new ComponentInitializer({
18
+ type: "proxy-click",
19
+ baseAttribute: "data-ulu-proxy-click"
20
+ });
23
21
 
22
+ /**
23
+ * Default options
24
+ */
24
25
  export const defaults = {
25
26
  selector: "[data-ulu-proxy-click-source]",
26
27
  selectorPreventBase: "input, select, textarea, button, a, [tabindex='-1']",
@@ -32,7 +33,7 @@ export const defaults = {
32
33
  let currentDefaults = { ...defaults };
33
34
 
34
35
  /**
35
- * @param {Object} options Change options used as default for dialogs, can then be overriden by data attribute settings on element
36
+ * @param {Object} options Change options used as default for dialogs, can then be overridden by data attribute settings on element
36
37
  */
37
38
  export function setDefaults(options) {
38
39
  currentDefaults = Object.assign({}, currentDefaults, options);
@@ -42,26 +43,39 @@ export function setDefaults(options) {
42
43
  * - This will only initialize elements once, it is safe to call on page changes
43
44
  */
44
45
  export function init() {
45
- document.addEventListener(getName("pageModified"), () => setup());
46
- setup();
47
- }
48
-
49
- export function setup(context = document) {
50
- const proxies = context.querySelectorAll(attrSelectorInitial("trigger"));
51
- proxies.forEach(proxy => {
52
- const elOptions = getDatasetOptionalJson(proxy, "siteProxyClick");
53
- const options = Object.assign({}, currentDefaults, elOptions);
54
- const child = proxy.querySelector(options.selector);
55
- if (child) {
56
- attachHandlers(proxy, child, options);
57
- proxy.setAttribute(attrs.init, "");
58
- } else {
59
- console.error("Unable to locate proxy click source", options.selector);
46
+ initializer.init({
47
+ withData: true,
48
+ events: ["pageModified"],
49
+ setup({ element, data, initialize }) {
50
+ setupProxy(element, data);
51
+ initialize();
60
52
  }
61
53
  });
62
54
  }
63
- export function attachHandlers(proxy, child, options) {
64
- const { selectorPreventBase: spb, selectorPrevent: sp } = options;
55
+
56
+ /**
57
+ * Setup a single proxy click
58
+ * @param {Node} proxy The container who's click should proxy the click of inner element with options.selector (defaults to [data-ulu-proxy-click-source])
59
+ * @param {Object} userOptions Options to override defaults
60
+ */
61
+ export function setupProxy(proxy, userOptions) {
62
+ const options = Object.assign({}, currentDefaults, userOptions);
63
+ const child = proxy.querySelector(options.selector);
64
+ if (child) {
65
+ attachHandlers(proxy, child, options);
66
+ } else {
67
+ console.error("Unable to locate proxy click source", options.selector);
68
+ }
69
+ }
70
+
71
+ /**
72
+ * Main function for attaching behaviors that enable proxy click
73
+ * @param {Node} proxy The container who's click should proxy the click of inner element with options.selector (defaults to [data-ulu-proxy-click-source])
74
+ * @param {Node} child The element who is being proxied and will get clicked if the proxy is clicked (as long as not an interactive element within proxy)
75
+ * @param {Object} config Merged/final options object
76
+ */
77
+ export function attachHandlers(proxy, child, config) {
78
+ const { selectorPreventBase: spb, selectorPrevent: sp } = config;
65
79
  const selectorPrevent = `${ spb }${ sp ? `, ${ sp }` : "" }`;
66
80
  let start, shouldProxy;
67
81
  proxy.addEventListener("mousedown", ({ target, timeStamp }) => {
@@ -72,7 +86,7 @@ export function attachHandlers(proxy, child, options) {
72
86
  }
73
87
  });
74
88
  proxy.addEventListener("mouseup", ({ timeStamp }) => {
75
- if (shouldProxy && timeStamp - start < options.mousedownDurationPrevent) {
89
+ if (shouldProxy && timeStamp - start < config.mousedownDurationPrevent) {
76
90
  child.click();
77
91
  }
78
92
  });
@@ -2,29 +2,21 @@
2
2
  * @module ui/scroll-slider
3
3
  */
4
4
 
5
+ import { ComponentInitializer } from "../utils/system.js";
5
6
  import { OverflowScroller } from "./overflow-scroller.js";
6
7
  import { createPager } from "./overflow-scroller-pager.js";
7
- import { getName } from "../events/index.js";
8
- import { getDatasetOptionalJson } from "../utils/dom.js";
9
-
10
8
 
11
9
  /**
12
- * Default data attributes
10
+ * Scroll Slider Component Initializer
13
11
  */
14
- export const attrs = {
15
- init: "data-ulu-scroll-slider-init",
16
- slider: "data-ulu-scroll-slider",
17
- track: "data-ulu-scroll-slider-track",
18
- controls: "data-ulu-scroll-slider-control-context"
19
- };
20
-
21
- // Utils for selecting things based on attributes
22
- const attrSelector = key => `[${ attrs[key] }]`;
23
- const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
24
-
12
+ export const initializer = new ComponentInitializer({
13
+ type: "scroll-slider",
14
+ baseAttribute: "data-ulu-scroll-slider"
15
+ });
25
16
 
17
+ const attrSelectorTrack = initializer.attributeSelector("track");
18
+ const attrSelectorControls = initializer.attributeSelector("control-context");
26
19
  const instances = [];
27
-
28
20
  const defaults = {
29
21
  amount: createPager()
30
22
  };
@@ -34,23 +26,25 @@ const defaults = {
34
26
  * - This will only initialize elements once, it is safe to call on page changes
35
27
  */
36
28
  export function init() {
37
- document.addEventListener(getName("pageModified"), setup);
38
- setup();
29
+ initializer.init({
30
+ withData: true,
31
+ events: ["pageModified"],
32
+ setup({ element, data, initialize }) {
33
+ setupSlider(element, data);
34
+ initialize();
35
+ }
36
+ });
39
37
  }
40
38
 
41
- export function setup() {
42
- const builders = document.querySelectorAll(attrSelectorInitial("slider"));
43
- builders.forEach(setupSlider);
44
- }
45
-
46
- // getDatasetOptionalJson
47
- function setupSlider(container) {
48
- container.setAttribute(attrs.init, "");
49
- const options = getDatasetOptionalJson(container, "uluScrollSlider");
50
- const config = Object.assign({}, defaults, options);
39
+ /**
40
+ * Setup instance of scroll slider based on data-attributes
41
+ * @param {Node} container The scroll slider container
42
+ */
43
+ function setupSlider(container, userOptions) {
44
+ const config = Object.assign({}, defaults, userOptions);
51
45
  const elements = {
52
- track: container.querySelector(attrSelector("track")),
53
- controls: container.querySelector(attrSelector("controls"))
46
+ track: container.querySelector(attrSelectorTrack),
47
+ controls: container.querySelector(attrSelectorControls)
54
48
  };
55
49
  instances.push(new OverflowScroller(elements, config));
56
50
  }
@@ -1,81 +1,45 @@
1
1
  /**
2
2
  * @module ui/scrollpoint
3
+ * @description Module that uses intersection observer to add scrollpoint like behavior.
3
4
  */
4
5
 
5
- // Module that uses intersection observer to add scrollpoint like behavior.
6
- /**
7
- * TODO:
8
- * - Included a group option or attribute (on container)
9
- // for things like anchor menus (one active in group at a time).
10
- *
11
- * How to link elements of group
12
- * <div group={ groupName: test }>
13
- * <div point={ groupName: test, mirror: ["#menu-link-1"] }>
14
- * or
15
- * <div group={ groupName: test, children: [".selector"] }>
16
- * <div class=".selector">
17
- */
18
- import { getName } from "../events/index.js";
19
- import { getDatasetOptionalJson, getElement } from "../utils/dom.js";
6
+ import { ComponentInitializer } from "../utils/system.js";
20
7
  import { logError } from "../utils/class-logger.js";
21
8
 
9
+ // TODO:
10
+ // - Included a group option or attribute (on container), for things like anchor menus (one active in group at a time).
11
+ //
12
+ // How to link elements of group
13
+ // <div group={ groupName: test }>
14
+ // <div point={ groupName: test, mirror: ["#menu-link-1"] }>
15
+ // or
16
+ // <div group={ groupName: test, children: [".selector"] }>
17
+ // <div class=".selector">
18
+
22
19
  /**
23
- * Default data attributes
20
+ * Scrollpoint Component Initializer
24
21
  */
25
- export const attrs = {
26
- init: "data-ulu-scrollpoint-init",
27
- /**
28
- * Individual scrollpoint
29
- */
30
- point: "data-ulu-scrollpoint",
31
- group: "data-ulu-scrollpoint-group",
32
- groupAnchors: "data-ulu-scrollpoint-anchors"
33
- // Goes on container for all items
34
- // group: "data-ulu-scrollpoint-group"
35
- };
36
-
37
- // Utils for selecting things based on attributes
38
- const attrSelector = key => `[${ attrs[key] }]`;
39
- const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
40
- const queryAllInitial = key => document.querySelectorAll(attrSelectorInitial(key));
22
+ export const initializer = new ComponentInitializer({
23
+ type: "scrollpoint",
24
+ baseAttribute: "data-ulu-scrollpoint"
25
+ });
41
26
 
42
27
  /**
43
28
  * Initialize everything in document
44
29
  * - This will only initialize elements once, it is safe to call on page changes
45
30
  */
46
31
  export function init() {
47
- document.addEventListener(getName("pageModified"), setup);
48
- setup();
49
- }
50
-
51
- /**
52
- * Setup all points and groups
53
- */
54
- export function setup() {
55
- const elements = queryAllInitial("point");
56
- // const points = Array.from(elements).map(resolve);
57
- // const groups = points
58
- // .filter(({ config }) => config.groupName)
59
- // .reduce((acc, point) => {
60
- // const { groupName } = point.config;
61
- // if (acc.has(groupName)) {
62
- // acc.get(groupName).push(point);
63
- // } else {
64
- // acc.set(groupName, [point]);
65
- // }
66
- // }, new Map());
67
- // const singles = points.filter(({ config }) => !config.groupName);
68
- // groups.forEach(setupGroup);
69
- elements.forEach(element => {
70
- const elOptions = getDatasetOptionalJson(element, "uluScrollpoint");
71
- const config = Object.assign({}, elOptions);
72
- element.setAttribute(attrs.init, "");
73
- new Scrollpoint(element, config);
32
+ initializer.init({
33
+ withData: true,
34
+ events: ["pageModified"],
35
+ setup({ element, data, initialize }) {
36
+ const config = Object.assign({}, data);
37
+ (new Scrollpoint(element, config));
38
+ initialize();
39
+ }
74
40
  });
75
41
  }
76
42
 
77
-
78
-
79
43
  /**
80
44
  * Single scrollpoint
81
45
  * - Note "forward" and "reverse" refer to scroll directions
@@ -141,7 +105,7 @@ export class Scrollpoint {
141
105
  /**
142
106
  * Attribute name to set state info in
143
107
  */
144
- attributeName: "data-scrollpoint-state",
108
+ attributeName: "data-ulu-scrollpoint-state",
145
109
  /**
146
110
  * Group multiple points, one active at a time (scroll menus)
147
111
  */
@@ -191,7 +155,7 @@ export class Scrollpoint {
191
155
  };
192
156
  this.setupObserver();
193
157
  if (options.debug) {
194
- console.log("Scrollpoint", this);
158
+ initializer.log(this);
195
159
  }
196
160
  }
197
161
  getClassname(suffix) {
@@ -233,7 +197,7 @@ export class Scrollpoint {
233
197
  };
234
198
  const config = this.getObserverOptions();
235
199
  if (this.options.debug) {
236
- console.log("Scrollpoint (IntersectionObserver)", config);
200
+ initializer.log("IntersectionObserver (options)", config);
237
201
  }
238
202
  this.observer = new IntersectionObserver(handler, config);
239
203
  this.observer.observe(this.element);
package/js/ui/slider.js CHANGED
@@ -5,19 +5,22 @@
5
5
  // Slider
6
6
  // =============================================================================
7
7
 
8
- // Version: 1.0.10
8
+ // Version: 1.0.11
9
9
 
10
10
  // Changes:
11
+ // 1.0.11 | Updates for ComponentInitializer
11
12
  // 1.0.10 | Fix bug when two and going in reverse
12
- // 1.0.9 | Fix bug when there are only 2 slides (not sliding correctly [revesers because of switchSlide])
13
- // this is addressed now and should slide infinitly between two slides
14
- // 1.0.8 | Change API, to elements object (from individaul arguments),
13
+ // 1.0.9 | Fix bug when there are only 2 slides (not sliding correctly [reverse because of switchSlide])
14
+ // this is addressed now and should slide infinity between two slides
15
+ // 1.0.8 | Change API, to elements object (from individual arguments),
15
16
  // Add the ability to specify the element to append controls within
16
17
  // 1.0.6 | Add transition class for changes during transition,
17
18
  // add will-change to the transition
18
- // 1.0.5 | Fix transtion event difference on windows, convert all
19
+ // 1.0.5 | Fix transition event difference on windows, convert all
19
20
  // async stuff to promises and simplify
20
- // 1.0.4 | Remove live region annoucement (only used if auto rotate)
21
+ // 1.0.4 | Remove live region announcement (only used if auto rotate)
22
+
23
+ // Todo: - Create destroy method to cleanup listeners
21
24
 
22
25
  // Reference: https://www.w3.org/WAI/tutorials/carousels/working-example/
23
26
  // https://www.w3.org/TR/wai-aria-practices/examples/carousel/carousel-1.html#
@@ -27,16 +30,29 @@
27
30
  // https://dev.opera.com/articles/css-will-change-property/
28
31
  // * Will Change use
29
32
 
33
+ import { ComponentInitializer } from "../utils/system.js";
34
+ import { wrapSettingString } from "../settings.js";
30
35
  import maintain from 'ally.js/maintain/_maintain';
31
36
  import { hasRequiredProps } from '@ulu/utils/object.js';
32
37
  import { trimWhitespace } from "@ulu/utils/string.js";
33
38
  import { debounce } from "@ulu/utils/performance.js";
34
39
  import { log, logError, logWarning } from "../utils/class-logger.js";
35
- import { getDatasetOptionalJson } from "../utils/dom.js";
36
- import { createPager } from "./overflow-scroller-pager.js";
37
- import { getName } from "../events/index.js";
40
+ import setupSwipeListener from "swipe-listener";
41
+
42
+ /**
43
+ * Slider Component Initializer
44
+ */
45
+ export const initializer = new ComponentInitializer({
46
+ type: "slider",
47
+ baseAttribute: "data-ulu-slider"
48
+ });
38
49
 
39
- const debugMode = false; // Global dev debug
50
+ const attrSelectorTrack = initializer.attributeSelector("track");
51
+ const attrSelectorTrackContainer = initializer.attributeSelector("track-container");
52
+ const attrSelectorControlContext = initializer.attributeSelector("control-context");
53
+ const attrSelectorSlide = initializer.attributeSelector("slide");
54
+
55
+ const instances = [];
40
56
  const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
41
57
  const eventOnce = { once: true };
42
58
  const cssDuration = d => `${ d }ms`;
@@ -56,52 +72,34 @@ const requiredElements = [
56
72
  ];
57
73
 
58
74
  /**
59
- * Default data attributes
75
+ * Initialize all sliders based on data attribute selectors
60
76
  */
61
- export const attrs = {
62
- init: "data-ulu-slider-init",
63
- slider: "data-ulu-slider",
64
- track: "data-ulu-slider-track",
65
- trackContainer: "data-ulu-slider-track-container",
66
- controls: "data-ulu-slider-control-context"
67
- };
68
-
69
- // Utils for selecting things based on attributes
70
- const attrSelector = key => `[${ attrs[key] }]`;
71
- const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
72
-
73
- const defaults = {
74
- amount: createPager()
75
- };
76
-
77
- const instances = [];
78
-
79
77
  export function init() {
80
- document.addEventListener(getName("pageModified"), setup);
81
- setup();
82
- }
83
-
84
- export function setup() {
85
- const builders = document.querySelectorAll(attrSelectorInitial("slider"));
86
- builders.forEach(setupSlider);
78
+ initializer.init({
79
+ withData: true,
80
+ events: ["pageModified"],
81
+ setup({ element, data, initialize }) {
82
+ setupSlider(element, data);
83
+ initialize();
84
+ }
85
+ });
87
86
  }
88
87
 
89
- export function setupSlider(container) {
90
- container.setAttribute(attrs.init, "");
91
- const options = getDatasetOptionalJson(container, "uluScrollSlider");
92
- const config = Object.assign({}, defaults, options);
88
+ /**
89
+ * Setup single slider instance from querying via data attribute selectors
90
+ * @param {Node} container The slide container to query children from
91
+ * @param {Object} options Options for slider class
92
+ */
93
+ export function setupSlider(container, options) {
94
+ const config = Object.assign({}, options);
93
95
  const elements = {
94
96
  container,
95
- track: container.querySelector("[data-ulu-slider-track]"),
96
- trackContainer: container.querySelector("[data-ulu-slider-track-container]"),
97
- controlContext: container.querySelector("[data-ulu-slider-control-context]"),
98
- slides: container.querySelectorAll("[data-ulu-slider-slide]")
97
+ track: container.querySelector(attrSelectorTrack),
98
+ trackContainer: container.querySelector(attrSelectorTrackContainer),
99
+ controlContext: container.querySelector(attrSelectorControlContext),
100
+ slides: container.querySelectorAll(attrSelectorSlide)
99
101
  };
100
- // Add in any global settings
101
- // Object.assign(config, {
102
- // callbacks: {}
103
- // });
104
- // /
102
+
105
103
  // This was added because there was an issue on the new windows, need to test this
106
104
  // config.transitionFade = true;
107
105
  if (elements.slides.length) {
@@ -109,8 +107,14 @@ export function setupSlider(container) {
109
107
  }
110
108
  }
111
109
 
110
+ /**
111
+ * Class that controls slider
112
+ */
112
113
  export class Slider {
113
114
  static instances = [];
115
+ /**
116
+ * Default options for slider
117
+ */
114
118
  static defaults = {
115
119
  classAccessiblyHidden: "hidden-visually",
116
120
  namespace: "Slider",
@@ -120,18 +124,22 @@ export class Slider {
120
124
  transitionDuration: 700,
121
125
  transitionDurationExit: 400,
122
126
  transitionTimingFunction: "ease-in-out",
123
- buttonClasses: ["Slider__control-icon", "button", "button--icon"],
124
- iconClassesPrevious: ["css-icon", "css-icon--angle-left"],
125
- iconClassesNext: ["css-icon", "css-icon--angle-right"]
126
- // transition: true
127
+ buttonClasses: ["button", "button--icon"],
128
+ iconClassPrevious: wrapSettingString("iconClassPrevious"),
129
+ iconClassNext: wrapSettingString("iconClassNext"),
130
+ swipeEnabled: true,
131
+ swipeOptions: {
132
+ preventScroll: true
133
+ }
127
134
  }
128
- // constructor(container, title, trackContainer, track, slides, config, debug = false) {
129
- constructor(elements, config, debug = false) {
135
+ constructor(elements, config) {
130
136
  const options = Object.assign({}, Slider.defaults, config);
131
- this.debug = debugMode || debug;
132
137
  this.options = options;
133
138
  this.slide = null;
134
139
  this.index = null;
140
+ this.swipeInstance = null;
141
+ this.swipeListener = null;
142
+ this.swipeImageListener = null;
135
143
  this.transitioning = false;
136
144
 
137
145
  if (!hasRequiredProps(requiredElements)) {
@@ -399,13 +407,50 @@ export class Slider {
399
407
  const trackCss = trimWhitespace(this.trackCss());
400
408
  const trackContainerStyles = trimWhitespace(this.trackContainerStyles());
401
409
  const slideCss = trimWhitespace(this.slideCss());
410
+
402
411
  track.setAttribute("style", trackCss);
403
412
  trackContainer.setAttribute("style", trackContainerStyles);
413
+
404
414
  this.slides.forEach(slide => {
405
415
  slide.element.setAttribute("style", slideCss);
406
416
  slide.element.setAttribute('tabindex', '-1');
407
417
  });
418
+
408
419
  container.classList.add(this.getClass());
420
+
421
+ if (this.options.swipeEnabled) {
422
+ this.setupSwipe();
423
+ }
424
+ }
425
+ setupSwipe() {
426
+ const images = this.elements.track.querySelectorAll("img");
427
+
428
+ // Cache for future destroy
429
+ // this.swipeInstance = setupSwipeListener(track, {
430
+ // preventScroll: true
431
+ // });
432
+ this.swipeListener = (event) => {
433
+ this.onSwipe(event);
434
+ }
435
+ this.swipeImageListener = (event) => {
436
+ event.preventDefault(); // Allow swiping on images
437
+ };
438
+ this.slides.forEach(slide => {
439
+ const { element } = slide;
440
+ slide.swipeInstance = setupSwipeListener(element, this.options.swipeOptions);
441
+ element.addEventListener("swipe", this.swipeListener);
442
+ });
443
+
444
+ images.forEach(image => {
445
+ image.addEventListener('dragstart', this.swipeImageListener);
446
+ });
447
+ }
448
+ onSwipe(event) {
449
+ const { directions } = event.detail;
450
+ const method = directions.left ? "next" : directions.right ? "previous" : null;
451
+ if (method) {
452
+ this[method](event);
453
+ }
409
454
  }
410
455
  trackContainerStyles() {
411
456
  // Crop translated track
@@ -454,6 +499,7 @@ export class Slider {
454
499
  const button = document.createElement("button");
455
500
  button.classList.add(this.getClass("control-button"));
456
501
  button.classList.add(this.getClass(`control-button--${ action }`));
502
+
457
503
  button.classList.add(...this.options.buttonClasses);
458
504
  button.setAttribute("data-slider-control", action);
459
505
  button.setAttribute("type", "button");
@@ -509,21 +555,20 @@ export class Slider {
509
555
  const button = document.createElement("button");
510
556
  button.classList.add(this.getClass("nav-button"));
511
557
  button.setAttribute("type", "button");
512
- button.innerHTML = this.getNavContent(slide.number);
558
+ button.innerHTML = this.getNavContent(slide);
513
559
  slide.navButton = button; // Add reference to slide object
514
560
  button.addEventListener("click", this.goto.bind(this, index));
515
561
  return button;
516
562
  }
517
- // change to css-icon
518
563
  getControlContent(action) {
519
- const classes = this.options[action === "next" ? "iconClassesNext" : "iconClassesPrevious"];
564
+ const classes = this.options[action === "next" ? "iconClassNext" : "iconClassPrevious"];
520
565
  return `
521
- <span class="hidden-visually">${ action }</span>
522
- <span class="${ classes.join(' ') }" aria-hidden="true"></span>
566
+ <span class="${ this.options.classAccessiblyHidden }">${ action }</span>
567
+ <span class="${ this.getClass("control-icon") } ${ classes }" aria-hidden="true"></span>
523
568
  `;
524
569
  }
525
- getNavContent(number) {
526
- return `<span class="hidden-visually">Item ${ number }</span>`;
570
+ getNavContent(slide) {
571
+ return `<span class="${ this.options.classAccessiblyHidden }">Item ${ slide.number }</span>`;
527
572
  }
528
573
  emit(name, args) {
529
574
  if (this.options.events[name]) {