@ulu/frontend 0.1.0-beta.8 → 0.1.0-beta.81

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 (294) hide show
  1. package/CHANGELOG.md +544 -0
  2. package/README.dev.md +3 -3
  3. package/README.md +14 -4
  4. package/dist/ulu-frontend.min.css +1 -1
  5. package/dist/ulu-frontend.min.js +34 -27
  6. package/docs-dev/assets/main.js +8290 -635
  7. package/docs-dev/assets/placeholder/icon-calendar.svg +1 -0
  8. package/docs-dev/assets/placeholder/icon-check.svg +1 -0
  9. package/docs-dev/assets/style.css +789 -338
  10. package/docs-dev/changelog/index.html +6593 -0
  11. package/docs-dev/demos/accordion/index.html +850 -328
  12. package/docs-dev/demos/badge/index.html +5265 -0
  13. package/docs-dev/demos/basic-hero/index.html +111 -0
  14. package/docs-dev/demos/breakpoints-manager/index.html +5276 -0
  15. package/docs-dev/demos/button/index.html +892 -328
  16. package/docs-dev/demos/button-verbose/index.html +5268 -0
  17. package/docs-dev/demos/callout/index.html +895 -332
  18. package/docs-dev/demos/captioned-figure/index.html +850 -327
  19. package/docs-dev/demos/card/index.html +930 -768
  20. package/docs-dev/demos/card-grid/index.html +5387 -0
  21. package/docs-dev/demos/counter-list/index.html +5270 -0
  22. package/docs-dev/demos/css-icons/index.html +873 -327
  23. package/docs-dev/demos/data-grid/index.html +870 -347
  24. package/docs-dev/demos/data-table/index.html +1024 -368
  25. package/docs-dev/demos/details-group/index.html +5297 -0
  26. package/docs-dev/demos/file-save/index.html +850 -327
  27. package/docs-dev/demos/flipcard/index.html +850 -327
  28. package/docs-dev/demos/form-theme/index.html +868 -358
  29. package/docs-dev/demos/hero/index.html +12 -4
  30. package/docs-dev/demos/image-grid/index.html +12 -4
  31. package/docs-dev/demos/index.html +851 -328
  32. package/docs-dev/demos/list-inline/index.html +850 -327
  33. package/docs-dev/demos/list-lines/index.html +850 -327
  34. package/docs-dev/demos/menu-stack/index.html +884 -346
  35. package/docs-dev/demos/modals/index.html +977 -331
  36. package/docs-dev/demos/nav-strip/index.html +850 -327
  37. package/docs-dev/demos/overlay-section/index.html +939 -346
  38. package/docs-dev/demos/popovers/index.html +1112 -347
  39. package/docs-dev/demos/print/index.html +850 -327
  40. package/docs-dev/demos/pull-quote/index.html +850 -327
  41. package/docs-dev/demos/rule/index.html +863 -328
  42. package/docs-dev/demos/scroll-slider/index.html +72 -106
  43. package/docs-dev/demos/scrollpoints/index.html +851 -328
  44. package/docs-dev/demos/slider/index.html +12 -4
  45. package/docs-dev/demos/spoke-spinner/index.html +850 -327
  46. package/docs-dev/demos/{list-inline.1 → sticky-list}/index.html +883 -357
  47. package/docs-dev/demos/tabs/index.html +886 -327
  48. package/docs-dev/demos/tag/index.html +850 -327
  49. package/docs-dev/demos/theme-toggle/index.html +5309 -0
  50. package/docs-dev/demos/tile-grid-overlay/index.html +12 -4
  51. package/docs-dev/demos/tiles/index.html +850 -327
  52. package/docs-dev/demos/tooltip/index.html +850 -327
  53. package/docs-dev/guide/building-stylesheet/index.html +850 -327
  54. package/docs-dev/guide/developing-ulu-scss-module/index.html +850 -327
  55. package/docs-dev/guide/index.html +850 -327
  56. package/docs-dev/index.html +850 -327
  57. package/docs-dev/javascript/events/index.html +888 -327
  58. package/docs-dev/javascript/index.html +850 -327
  59. package/docs-dev/javascript/settings/index.html +5435 -0
  60. package/docs-dev/javascript/ui-breakpoints/index.html +862 -341
  61. package/docs-dev/javascript/ui-collapsible/index.html +847 -326
  62. package/docs-dev/javascript/ui-details-group/index.html +5352 -0
  63. package/docs-dev/javascript/ui-dialog/index.html +879 -343
  64. package/docs-dev/javascript/ui-flipcard/index.html +908 -331
  65. package/docs-dev/javascript/ui-grid/index.html +857 -362
  66. package/docs-dev/javascript/ui-modal-builder/index.html +1047 -386
  67. package/docs-dev/javascript/ui-overflow-scroller/index.html +847 -326
  68. package/docs-dev/javascript/ui-overflow-scroller-pager/index.html +847 -326
  69. package/docs-dev/javascript/ui-page/index.html +847 -326
  70. package/docs-dev/javascript/ui-popover/index.html +855 -338
  71. package/docs-dev/javascript/ui-print/index.html +847 -334
  72. package/docs-dev/javascript/ui-print-details/index.html +847 -326
  73. package/docs-dev/javascript/ui-programmatic-modal/index.html +847 -326
  74. package/docs-dev/javascript/ui-proxy-click/index.html +934 -328
  75. package/docs-dev/javascript/ui-resizer/index.html +926 -336
  76. package/docs-dev/javascript/ui-scroll-slider/index.html +885 -332
  77. package/docs-dev/javascript/ui-scrollpoint/index.html +853 -339
  78. package/docs-dev/javascript/ui-slider/index.html +1043 -331
  79. package/docs-dev/javascript/ui-tabs/index.html +858 -374
  80. package/docs-dev/javascript/ui-theme-toggle/index.html +5440 -0
  81. package/docs-dev/javascript/ui-tooltip/index.html +854 -337
  82. package/docs-dev/javascript/utils-class-logger/index.html +848 -327
  83. package/docs-dev/javascript/utils-css/index.html +5254 -0
  84. package/docs-dev/javascript/utils-dom/index.html +887 -446
  85. package/docs-dev/javascript/utils-file-save/index.html +847 -326
  86. package/docs-dev/javascript/utils-floating-ui/index.html +847 -326
  87. package/docs-dev/javascript/utils-id/index.html +847 -326
  88. package/docs-dev/javascript/utils-pause-youtube-video/index.html +847 -326
  89. package/docs-dev/javascript/utils-system/index.html +5557 -0
  90. package/docs-dev/sass/base/color/index.html +847 -326
  91. package/docs-dev/sass/base/elements/index.html +847 -326
  92. package/docs-dev/sass/base/index/index.html +847 -326
  93. package/docs-dev/sass/base/index.html +850 -327
  94. package/docs-dev/sass/base/keyframes/index.html +847 -326
  95. package/docs-dev/sass/base/layout/index.html +847 -326
  96. package/docs-dev/sass/base/normalize/index.html +847 -326
  97. package/docs-dev/sass/base/print/index.html +847 -326
  98. package/docs-dev/sass/base/root/index.html +847 -326
  99. package/docs-dev/sass/base/typography/index.html +847 -326
  100. package/docs-dev/sass/components/accordion/index.html +866 -338
  101. package/docs-dev/sass/components/adaptive-spacing/index.html +847 -326
  102. package/docs-dev/sass/components/badge/index.html +869 -337
  103. package/docs-dev/sass/components/basic-hero/index.html +5415 -0
  104. package/docs-dev/sass/components/button/index.html +847 -326
  105. package/docs-dev/sass/components/button-verbose/index.html +933 -337
  106. package/docs-dev/sass/components/callout/index.html +958 -418
  107. package/docs-dev/sass/components/captioned-figure/index.html +970 -334
  108. package/docs-dev/sass/components/card/index.html +939 -346
  109. package/docs-dev/sass/components/card-grid/index.html +847 -326
  110. package/docs-dev/sass/components/counter-list/index.html +5497 -0
  111. package/docs-dev/sass/components/css-icon/index.html +864 -336
  112. package/docs-dev/sass/components/data-grid/index.html +868 -340
  113. package/docs-dev/sass/components/data-table/index.html +1063 -352
  114. package/docs-dev/sass/components/fill-context/index.html +847 -326
  115. package/docs-dev/sass/components/flipcard/index.html +888 -336
  116. package/docs-dev/sass/components/flipcard-grid/index.html +847 -326
  117. package/docs-dev/sass/components/form-theme/index.html +1063 -446
  118. package/docs-dev/sass/components/hero/index.html +903 -334
  119. package/docs-dev/sass/components/horizontal-rule/index.html +847 -326
  120. package/docs-dev/sass/components/image-grid/index.html +847 -326
  121. package/docs-dev/sass/components/index/index.html +860 -336
  122. package/docs-dev/sass/components/index.html +850 -327
  123. package/docs-dev/sass/components/links/index.html +847 -326
  124. package/docs-dev/sass/components/list-inline/index.html +847 -326
  125. package/docs-dev/sass/components/list-lines/index.html +847 -326
  126. package/docs-dev/sass/components/list-ordered/index.html +847 -326
  127. package/docs-dev/sass/components/list-unordered/index.html +847 -326
  128. package/docs-dev/sass/components/menu-stack/index.html +881 -347
  129. package/docs-dev/sass/components/modal/index.html +898 -342
  130. package/docs-dev/sass/components/nav-strip/index.html +855 -334
  131. package/docs-dev/sass/components/overlay-section/index.html +855 -334
  132. package/docs-dev/sass/components/pager/index.html +847 -326
  133. package/docs-dev/sass/components/placeholder-block/index.html +847 -326
  134. package/docs-dev/sass/components/popover/index.html +904 -347
  135. package/docs-dev/sass/components/pull-quote/index.html +859 -338
  136. package/docs-dev/sass/components/ratio-box/index.html +855 -334
  137. package/docs-dev/sass/components/rule/index.html +848 -327
  138. package/docs-dev/sass/components/scroll-slider/index.html +855 -346
  139. package/docs-dev/sass/components/skip-link/index.html +847 -326
  140. package/docs-dev/sass/components/slider/index.html +897 -388
  141. package/docs-dev/sass/components/spoke-spinner/index.html +849 -328
  142. package/docs-dev/sass/components/sticky-list/index.html +5633 -0
  143. package/docs-dev/sass/components/tabs/index.html +872 -336
  144. package/docs-dev/sass/components/tag/index.html +849 -328
  145. package/docs-dev/sass/components/tile-button/index.html +847 -326
  146. package/docs-dev/sass/components/tile-grid/index.html +847 -326
  147. package/docs-dev/sass/components/tile-grid-overlay/index.html +847 -326
  148. package/docs-dev/sass/components/vignette/index.html +861 -334
  149. package/docs-dev/sass/components/wysiwyg/index.html +847 -326
  150. package/docs-dev/sass/core/breakpoint/index.html +931 -358
  151. package/docs-dev/sass/core/button/index.html +847 -326
  152. package/docs-dev/sass/core/color/index.html +1019 -366
  153. package/docs-dev/sass/core/cssvar/index.html +847 -326
  154. package/docs-dev/sass/core/element/index.html +1108 -381
  155. package/docs-dev/sass/core/index.html +847 -326
  156. package/docs-dev/sass/core/layout/index.html +903 -363
  157. package/docs-dev/sass/core/path/index.html +847 -326
  158. package/docs-dev/sass/core/selector/index.html +847 -326
  159. package/docs-dev/sass/core/typography/index.html +847 -326
  160. package/docs-dev/sass/core/units/index.html +857 -330
  161. package/docs-dev/sass/core/utils/index.html +2104 -476
  162. package/docs-dev/sass/helpers/color/index.html +847 -326
  163. package/docs-dev/sass/helpers/display/index.html +848 -327
  164. package/docs-dev/sass/helpers/index/index.html +847 -326
  165. package/docs-dev/sass/helpers/index.html +850 -327
  166. package/docs-dev/sass/helpers/print/index.html +759 -298
  167. package/docs-dev/sass/helpers/typography/index.html +847 -326
  168. package/docs-dev/sass/helpers/units/index.html +847 -326
  169. package/docs-dev/sass/helpers/utilities/index.html +849 -328
  170. package/docs-dev/sass/index.html +850 -327
  171. package/js/events/index.js +17 -5
  172. package/js/index.js +1 -0
  173. package/js/settings.js +97 -0
  174. package/js/ui/breakpoints.js +19 -16
  175. package/js/ui/collapsible.js +8 -1
  176. package/js/ui/details-group.js +112 -0
  177. package/js/ui/dialog.js +132 -45
  178. package/js/ui/dialog.todo +2 -36
  179. package/js/ui/flipcard.js +37 -57
  180. package/js/ui/grid.js +15 -13
  181. package/js/ui/index.js +1 -0
  182. package/js/ui/modal-builder.js +126 -69
  183. package/js/ui/overflow-scroller.js +6 -4
  184. package/js/ui/page.js +2 -2
  185. package/js/ui/popover.js +38 -38
  186. package/js/ui/print.js +16 -25
  187. package/js/ui/programmatic-modal.js +9 -3
  188. package/js/ui/proxy-click.js +50 -36
  189. package/js/ui/resizer.js +186 -36
  190. package/js/ui/scroll-slider.js +24 -30
  191. package/js/ui/scrollpoint.js +29 -64
  192. package/js/ui/slider.js +108 -63
  193. package/js/ui/tabs.js +23 -36
  194. package/js/ui/theme-toggle.js +332 -94
  195. package/js/ui/tooltip.js +27 -32
  196. package/js/utils/class-logger.js +3 -3
  197. package/js/utils/css.js +13 -0
  198. package/js/utils/dom.js +23 -64
  199. package/js/utils/font-awesome.js +19 -0
  200. package/js/utils/index.js +2 -1
  201. package/js/utils/system.js +155 -0
  202. package/package.json +23 -8
  203. package/scss/README.md +4 -0
  204. package/scss/_breakpoint.scss +38 -4
  205. package/scss/_color.scss +40 -9
  206. package/scss/_element.scss +108 -2
  207. package/scss/_layout.scss +7 -8
  208. package/scss/_units.scss +3 -2
  209. package/scss/_utils.scss +380 -16
  210. package/scss/components/README.todos +14 -0
  211. package/scss/components/_accordion.scss +33 -19
  212. package/scss/components/_badge.scss +23 -4
  213. package/scss/components/_basic-hero.scss +112 -0
  214. package/scss/components/_button-verbose.scss +100 -18
  215. package/scss/components/_callout.scss +125 -78
  216. package/scss/components/_captioned-figure.scss +17 -0
  217. package/scss/components/_card-grid.scss +1 -1
  218. package/scss/components/_card.scss +246 -74
  219. package/scss/components/_counter-list.scss +151 -0
  220. package/scss/components/_css-icon.scss +35 -21
  221. package/scss/components/_data-grid.scss +55 -9
  222. package/scss/components/_data-table.scss +39 -3
  223. package/scss/components/_flipcard.scss +8 -3
  224. package/scss/components/_form-theme.scss +119 -108
  225. package/scss/components/_hero.scss +12 -10
  226. package/scss/components/_index.scss +18 -0
  227. package/scss/components/_menu-stack.scss +42 -26
  228. package/scss/components/_modal.scss +58 -29
  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 +22 -4
  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/events/index.d.ts +10 -1
  245. package/types/events/index.d.ts.map +1 -1
  246. package/types/index.d.ts +1 -0
  247. package/types/settings.d.ts +70 -0
  248. package/types/settings.d.ts.map +1 -0
  249. package/types/ui/breakpoints.d.ts +14 -14
  250. package/types/ui/breakpoints.d.ts.map +1 -1
  251. package/types/ui/collapsible.d.ts.map +1 -1
  252. package/types/ui/details-group.d.ts +38 -0
  253. package/types/ui/details-group.d.ts.map +1 -0
  254. package/types/ui/dialog.d.ts +20 -14
  255. package/types/ui/dialog.d.ts.map +1 -1
  256. package/types/ui/flipcard.d.ts +16 -10
  257. package/types/ui/flipcard.d.ts.map +1 -1
  258. package/types/ui/grid.d.ts +4 -6
  259. package/types/ui/grid.d.ts.map +1 -1
  260. package/types/ui/index.d.ts +2 -1
  261. package/types/ui/modal-builder.d.ts +116 -11
  262. package/types/ui/modal-builder.d.ts.map +1 -1
  263. package/types/ui/overflow-scroller.d.ts +2 -2
  264. package/types/ui/overflow-scroller.d.ts.map +1 -1
  265. package/types/ui/popover.d.ts +6 -7
  266. package/types/ui/popover.d.ts.map +1 -1
  267. package/types/ui/print.d.ts +0 -4
  268. package/types/ui/print.d.ts.map +1 -1
  269. package/types/ui/programmatic-modal.d.ts.map +1 -1
  270. package/types/ui/proxy-click.d.ts +19 -3
  271. package/types/ui/proxy-click.d.ts.map +1 -1
  272. package/types/ui/resizer.d.ts +39 -12
  273. package/types/ui/resizer.d.ts.map +1 -1
  274. package/types/ui/scroll-slider.d.ts +5 -7
  275. package/types/ui/scroll-slider.d.ts.map +1 -1
  276. package/types/ui/scrollpoint.d.ts +3 -8
  277. package/types/ui/scrollpoint.d.ts.map +1 -1
  278. package/types/ui/slider.d.ts +33 -14
  279. package/types/ui/slider.d.ts.map +1 -1
  280. package/types/ui/tabs.d.ts +6 -8
  281. package/types/ui/tabs.d.ts.map +1 -1
  282. package/types/ui/theme-toggle.d.ts +51 -7
  283. package/types/ui/theme-toggle.d.ts.map +1 -1
  284. package/types/ui/tooltip.d.ts +3 -5
  285. package/types/ui/tooltip.d.ts.map +1 -1
  286. package/types/utils/css.d.ts +11 -0
  287. package/types/utils/css.d.ts.map +1 -0
  288. package/types/utils/dom.d.ts +12 -32
  289. package/types/utils/dom.d.ts.map +1 -1
  290. package/types/utils/font-awesome.d.ts +5 -0
  291. package/types/utils/font-awesome.d.ts.map +1 -0
  292. package/types/utils/index.d.ts +2 -1
  293. package/types/utils/system.d.ts +113 -0
  294. package/types/utils/system.d.ts.map +1 -0
@@ -1,81 +1,46 @@
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";
8
+ import { getElement } from "@ulu/utils/browser/dom.js";
9
+
10
+ // TODO:
11
+ // - Included a group option or attribute (on container), for things like anchor menus (one active in group at a time).
12
+ //
13
+ // How to link elements of group
14
+ // <div group={ groupName: test }>
15
+ // <div point={ groupName: test, mirror: ["#menu-link-1"] }>
16
+ // or
17
+ // <div group={ groupName: test, children: [".selector"] }>
18
+ // <div class=".selector">
21
19
 
22
20
  /**
23
- * Default data attributes
21
+ * Scrollpoint Component Initializer
24
22
  */
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));
23
+ export const initializer = new ComponentInitializer({
24
+ type: "scrollpoint",
25
+ baseAttribute: "data-ulu-scrollpoint"
26
+ });
41
27
 
42
28
  /**
43
29
  * Initialize everything in document
44
30
  * - This will only initialize elements once, it is safe to call on page changes
45
31
  */
46
32
  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);
33
+ initializer.init({
34
+ withData: true,
35
+ events: ["pageModified"],
36
+ setup({ element, data, initialize }) {
37
+ const config = Object.assign({}, data);
38
+ (new Scrollpoint(element, config));
39
+ initialize();
40
+ }
74
41
  });
75
42
  }
76
43
 
77
-
78
-
79
44
  /**
80
45
  * Single scrollpoint
81
46
  * - Note "forward" and "reverse" refer to scroll directions
@@ -141,7 +106,7 @@ export class Scrollpoint {
141
106
  /**
142
107
  * Attribute name to set state info in
143
108
  */
144
- attributeName: "data-scrollpoint-state",
109
+ attributeName: "data-ulu-scrollpoint-state",
145
110
  /**
146
111
  * Group multiple points, one active at a time (scroll menus)
147
112
  */
@@ -191,7 +156,7 @@ export class Scrollpoint {
191
156
  };
192
157
  this.setupObserver();
193
158
  if (options.debug) {
194
- console.log("Scrollpoint", this);
159
+ initializer.log(this);
195
160
  }
196
161
  }
197
162
  getClassname(suffix) {
@@ -233,7 +198,7 @@ export class Scrollpoint {
233
198
  };
234
199
  const config = this.getObserverOptions();
235
200
  if (this.options.debug) {
236
- console.log("Scrollpoint (IntersectionObserver)", config);
201
+ initializer.log("IntersectionObserver (options)", config);
237
202
  }
238
203
  this.observer = new IntersectionObserver(handler, config);
239
204
  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]) {
package/js/ui/tabs.js CHANGED
@@ -9,9 +9,7 @@
9
9
  // setting this up to destroy tab interface when ui layout changes?
10
10
 
11
11
  import AriaTablist from "aria-tablist";
12
-
13
- const initAttr = "data-ulu-tablist-init";
14
- const errorHeader = "[data-ulu-tablist] error:";
12
+ import { ComponentInitializer } from "../utils/system.js";
15
13
 
16
14
  /**
17
15
  * Array of current tab instances (exported if you need to interact with them)
@@ -19,13 +17,28 @@ const errorHeader = "[data-ulu-tablist] error:";
19
17
  */
20
18
  export const instances = [];
21
19
 
20
+ /**
21
+ * Tabs Component Initializer
22
+ */
23
+ export const initializer = new ComponentInitializer({
24
+ type: "tabs",
25
+ baseAttribute: "data-ulu-tablist"
26
+ });
27
+
22
28
  /**
23
29
  * Init all instances currently in document
24
- * @param {Object} options Options to serve as defaults
25
30
  */
26
- export function init(options = {}) {
31
+ export function init() {
27
32
  const initial = () => {
28
- initWithin(document, options);
33
+ initializer.init({
34
+ events: ["pageModified"],
35
+ withData: true,
36
+ setup({ element, data, initialize }) {
37
+ setup(element, data);
38
+ initialize();
39
+ }
40
+ });
41
+
29
42
  // Run this on page load, optionally exported for use when page is running
30
43
  instances.forEach(openByCurrentHash);
31
44
  };
@@ -35,22 +48,6 @@ export function init(options = {}) {
35
48
  } else {
36
49
  window.addEventListener("load", initial);
37
50
  }
38
- // Initialize when page updates/changes
39
- document.addEventListener("pageModified", e => initWithin(e.target, options));
40
- }
41
-
42
- /**
43
- * Init all tabs within a certain context
44
- * @param {Node} context Element to init within
45
- * @param {Object} options Options to serve as defaults
46
- */
47
- export function initWithin(context, options = {}) {
48
- if (!context) {
49
- console.warn("Missing context to initWithin, skipping init of tabs");
50
- return;
51
- }
52
- const tablists = context.querySelectorAll(`[data-ulu-tablist]:not([${ initAttr }])`);
53
- tablists.forEach(element => setup(element, options));
54
51
  }
55
52
 
56
53
  /**
@@ -60,17 +57,7 @@ export function initWithin(context, options = {}) {
60
57
  * @return {Object} Instance object
61
58
  */
62
59
  export function setup(element, options = {}) {
63
- let elementOptions = {};
64
-
65
- if (element.dataset.uluTablist) {
66
- try {
67
- elementOptions = JSON.parse(element.dataset.uluTablist);
68
- } catch(e) {
69
- console.error(errorHeader, "(JSON Parse for options)", element);
70
- }
71
- }
72
-
73
- const config = Object.assign({}, options, elementOptions);
60
+ const config = Object.assign({}, options);
74
61
 
75
62
  if (config.vertical) {
76
63
  config.allArrows = true;
@@ -91,8 +78,6 @@ export function setup(element, options = {}) {
91
78
  if (config.equalHeights) {
92
79
  setHeights(element);
93
80
  }
94
-
95
- element.setAttribute(initAttr, "");
96
81
 
97
82
  return instance;
98
83
  }
@@ -150,7 +135,9 @@ function setHeights(element) {
150
135
  if (panel.hidden) {
151
136
  panel.hidden = false;
152
137
  panelHeight = panel.offsetHeight;
153
- panel.hidden = true;
138
+ // This explicity needs "hidden" for aria-tablist (it checks this string value)
139
+ // Will break the initial window push state when using openWithUrlHash
140
+ panel.setAttribute("hidden", "hidden");
154
141
  }
155
142
  return panelHeight;
156
143
  });