@ulu/frontend 0.1.0-beta.32 → 0.1.0-beta.34
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.
- package/CHANGELOG.md +53 -0
- package/dist/ulu-frontend.min.css +1 -1
- package/dist/ulu-frontend.min.js +23 -23
- package/docs-dev/changelog/index.html +161 -8
- package/docs-dev/demos/accordion/index.html +38 -8
- package/docs-dev/demos/button/index.html +38 -8
- package/docs-dev/demos/button-verbose/index.html +38 -8
- package/docs-dev/demos/callout/index.html +65 -8
- package/docs-dev/demos/captioned-figure/index.html +38 -8
- package/docs-dev/demos/card/index.html +59 -33
- package/docs-dev/demos/card-grid/index.html +42 -12
- package/docs-dev/demos/css-icons/index.html +38 -8
- package/docs-dev/demos/data-grid/index.html +38 -8
- package/docs-dev/demos/data-table/index.html +63 -33
- package/docs-dev/demos/details-group/index.html +71 -8
- package/docs-dev/demos/file-save/index.html +38 -8
- package/docs-dev/demos/flipcard/index.html +38 -8
- package/docs-dev/demos/form-theme/index.html +38 -8
- package/docs-dev/demos/index.html +38 -8
- package/docs-dev/demos/list-inline/index.html +38 -8
- package/docs-dev/demos/list-lines/index.html +38 -8
- package/docs-dev/demos/menu-stack/index.html +38 -8
- package/docs-dev/demos/modals/index.html +51 -10
- package/docs-dev/demos/nav-strip/index.html +38 -8
- package/docs-dev/demos/overlay-section/index.html +38 -8
- package/docs-dev/demos/popovers/index.html +38 -8
- package/docs-dev/demos/print/index.html +38 -8
- package/docs-dev/demos/pull-quote/index.html +38 -8
- package/docs-dev/demos/rule/index.html +38 -8
- package/docs-dev/demos/scrollpoints/index.html +39 -9
- package/docs-dev/demos/spoke-spinner/index.html +38 -8
- package/docs-dev/demos/sticky-list/index.html +38 -8
- package/docs-dev/demos/tabs/index.html +74 -8
- package/docs-dev/demos/tag/index.html +38 -8
- package/docs-dev/demos/theme-toggle/index.html +38 -8
- package/docs-dev/demos/tiles/index.html +38 -8
- package/docs-dev/demos/tooltip/index.html +38 -8
- package/docs-dev/guide/building-stylesheet/index.html +38 -8
- package/docs-dev/guide/developing-ulu-scss-module/index.html +38 -8
- package/docs-dev/guide/index.html +38 -8
- package/docs-dev/index.html +38 -8
- package/docs-dev/javascript/events/index.html +38 -8
- package/docs-dev/javascript/index.html +38 -8
- package/docs-dev/javascript/settings/index.html +38 -8
- package/docs-dev/javascript/ui-breakpoints/index.html +38 -8
- package/docs-dev/javascript/ui-collapsible/index.html +38 -8
- package/docs-dev/javascript/ui-details-group/index.html +56 -38
- package/docs-dev/javascript/ui-dialog/index.html +70 -25
- package/docs-dev/javascript/ui-flipcard/index.html +99 -13
- package/docs-dev/javascript/ui-grid/index.html +48 -44
- package/docs-dev/javascript/ui-modal-builder/index.html +49 -40
- package/docs-dev/javascript/ui-overflow-scroller/index.html +38 -8
- package/docs-dev/javascript/ui-overflow-scroller-pager/index.html +38 -8
- package/docs-dev/javascript/ui-page/index.html +38 -8
- package/docs-dev/javascript/ui-popover/index.html +46 -20
- package/docs-dev/javascript/ui-print/index.html +38 -16
- package/docs-dev/javascript/ui-print-details/index.html +38 -8
- package/docs-dev/javascript/ui-programmatic-modal/index.html +38 -8
- package/docs-dev/javascript/ui-proxy-click/index.html +125 -10
- package/docs-dev/javascript/ui-resizer/index.html +38 -8
- package/docs-dev/javascript/ui-scroll-slider/index.html +76 -14
- package/docs-dev/javascript/ui-scrollpoint/index.html +44 -21
- package/docs-dev/javascript/ui-slider/index.html +234 -13
- package/docs-dev/javascript/ui-tabs/index.html +49 -56
- package/docs-dev/javascript/ui-theme-toggle/index.html +43 -21
- package/docs-dev/javascript/ui-tooltip/index.html +45 -19
- package/docs-dev/javascript/utils-class-logger/index.html +38 -8
- package/docs-dev/javascript/utils-dom/index.html +63 -8
- package/docs-dev/javascript/utils-file-save/index.html +38 -8
- package/docs-dev/javascript/utils-floating-ui/index.html +38 -8
- package/docs-dev/javascript/utils-id/index.html +38 -8
- package/docs-dev/javascript/utils-pause-youtube-video/index.html +38 -8
- package/docs-dev/javascript/utils-system/index.html +5437 -0
- package/docs-dev/sass/base/color/index.html +38 -8
- package/docs-dev/sass/base/elements/index.html +38 -8
- package/docs-dev/sass/base/index/index.html +38 -8
- package/docs-dev/sass/base/index.html +38 -8
- package/docs-dev/sass/base/keyframes/index.html +38 -8
- package/docs-dev/sass/base/layout/index.html +38 -8
- package/docs-dev/sass/base/normalize/index.html +38 -8
- package/docs-dev/sass/base/print/index.html +38 -8
- package/docs-dev/sass/base/root/index.html +38 -8
- package/docs-dev/sass/base/typography/index.html +38 -8
- package/docs-dev/sass/components/accordion/index.html +39 -9
- package/docs-dev/sass/components/adaptive-spacing/index.html +38 -8
- package/docs-dev/sass/components/badge/index.html +38 -8
- package/docs-dev/sass/components/basic-hero/index.html +38 -8
- package/docs-dev/sass/components/button/index.html +38 -8
- package/docs-dev/sass/components/button-verbose/index.html +72 -37
- package/docs-dev/sass/components/callout/index.html +124 -35
- package/docs-dev/sass/components/captioned-figure/index.html +38 -8
- package/docs-dev/sass/components/card/index.html +38 -8
- package/docs-dev/sass/components/card-grid/index.html +38 -8
- package/docs-dev/sass/components/css-icon/index.html +38 -8
- package/docs-dev/sass/components/data-grid/index.html +38 -8
- package/docs-dev/sass/components/data-table/index.html +53 -16
- package/docs-dev/sass/components/fill-context/index.html +38 -8
- package/docs-dev/sass/components/flipcard/index.html +38 -8
- package/docs-dev/sass/components/flipcard-grid/index.html +38 -8
- package/docs-dev/sass/components/form-theme/index.html +84 -60
- package/docs-dev/sass/components/hero/index.html +38 -8
- package/docs-dev/sass/components/horizontal-rule/index.html +38 -8
- package/docs-dev/sass/components/image-grid/index.html +38 -8
- package/docs-dev/sass/components/index/index.html +38 -8
- package/docs-dev/sass/components/index.html +38 -8
- package/docs-dev/sass/components/links/index.html +38 -8
- package/docs-dev/sass/components/list-inline/index.html +38 -8
- package/docs-dev/sass/components/list-lines/index.html +38 -8
- package/docs-dev/sass/components/list-ordered/index.html +38 -8
- package/docs-dev/sass/components/list-unordered/index.html +38 -8
- package/docs-dev/sass/components/menu-stack/index.html +38 -8
- package/docs-dev/sass/components/modal/index.html +38 -8
- package/docs-dev/sass/components/nav-strip/index.html +38 -8
- package/docs-dev/sass/components/overlay-section/index.html +38 -8
- package/docs-dev/sass/components/pager/index.html +38 -8
- package/docs-dev/sass/components/placeholder-block/index.html +38 -8
- package/docs-dev/sass/components/popover/index.html +38 -8
- package/docs-dev/sass/components/pull-quote/index.html +38 -8
- package/docs-dev/sass/components/ratio-box/index.html +38 -8
- package/docs-dev/sass/components/rule/index.html +38 -8
- package/docs-dev/sass/components/scroll-slider/index.html +46 -28
- package/docs-dev/sass/components/skip-link/index.html +38 -8
- package/docs-dev/sass/components/slider/index.html +38 -8
- package/docs-dev/sass/components/spoke-spinner/index.html +40 -10
- package/docs-dev/sass/components/sticky-list/index.html +38 -8
- package/docs-dev/sass/components/tabs/index.html +38 -8
- package/docs-dev/sass/components/tag/index.html +40 -10
- package/docs-dev/sass/components/tile-button/index.html +38 -8
- package/docs-dev/sass/components/tile-grid/index.html +38 -8
- package/docs-dev/sass/components/tile-grid-overlay/index.html +38 -8
- package/docs-dev/sass/components/vignette/index.html +38 -8
- package/docs-dev/sass/components/wysiwyg/index.html +38 -8
- package/docs-dev/sass/core/breakpoint/index.html +38 -8
- package/docs-dev/sass/core/button/index.html +38 -8
- package/docs-dev/sass/core/color/index.html +38 -8
- package/docs-dev/sass/core/cssvar/index.html +38 -8
- package/docs-dev/sass/core/element/index.html +218 -47
- package/docs-dev/sass/core/index.html +38 -8
- package/docs-dev/sass/core/layout/index.html +94 -45
- package/docs-dev/sass/core/path/index.html +38 -8
- package/docs-dev/sass/core/selector/index.html +38 -8
- package/docs-dev/sass/core/typography/index.html +38 -8
- package/docs-dev/sass/core/units/index.html +38 -8
- package/docs-dev/sass/core/utils/index.html +302 -68
- package/docs-dev/sass/helpers/color/index.html +38 -8
- package/docs-dev/sass/helpers/display/index.html +38 -8
- package/docs-dev/sass/helpers/index/index.html +38 -8
- package/docs-dev/sass/helpers/index.html +38 -8
- package/docs-dev/sass/helpers/print/index.html +38 -8
- package/docs-dev/sass/helpers/typography/index.html +38 -8
- package/docs-dev/sass/helpers/units/index.html +38 -8
- package/docs-dev/sass/helpers/utilities/index.html +38 -8
- package/docs-dev/sass/index.html +38 -8
- package/js/ui/breakpoints.js +1 -2
- package/js/ui/details-group.js +33 -42
- package/js/ui/dialog.js +64 -41
- package/js/ui/dialog.todo +2 -36
- package/js/ui/flipcard.js +37 -57
- package/js/ui/grid.js +15 -13
- package/js/ui/modal-builder.js +24 -38
- package/js/ui/popover.js +38 -39
- package/js/ui/print.js +16 -25
- package/js/ui/proxy-click.js +50 -36
- package/js/ui/scroll-slider.js +24 -30
- package/js/ui/scrollpoint.js +27 -63
- package/js/ui/slider.js +53 -55
- package/js/ui/tabs.js +23 -36
- package/js/ui/theme-toggle.js +37 -41
- package/js/ui/tooltip.js +27 -32
- package/js/utils/dom.js +12 -0
- package/js/utils/system.js +154 -0
- package/package.json +1 -1
- package/scss/_element.scss +91 -0
- package/scss/_layout.scss +3 -1
- package/scss/_utils.scss +42 -0
- package/scss/components/_accordion.scss +1 -2
- package/scss/components/_button-verbose.scss +41 -36
- package/scss/components/_callout.scss +113 -53
- package/scss/components/_data-table.scss +3 -0
- package/scss/components/_form-theme.scss +24 -25
- package/scss/components/_scroll-slider.scss +0 -4
- package/types/ui/breakpoints.d.ts.map +1 -1
- package/types/ui/details-group.d.ts +7 -12
- package/types/ui/details-group.d.ts.map +1 -1
- package/types/ui/dialog.d.ts +19 -14
- package/types/ui/dialog.d.ts.map +1 -1
- package/types/ui/flipcard.d.ts +16 -10
- package/types/ui/flipcard.d.ts.map +1 -1
- package/types/ui/grid.d.ts +4 -6
- package/types/ui/grid.d.ts.map +1 -1
- package/types/ui/modal-builder.d.ts +5 -9
- package/types/ui/modal-builder.d.ts.map +1 -1
- package/types/ui/popover.d.ts +6 -7
- package/types/ui/popover.d.ts.map +1 -1
- package/types/ui/print.d.ts +0 -4
- package/types/ui/print.d.ts.map +1 -1
- package/types/ui/proxy-click.d.ts +19 -3
- package/types/ui/proxy-click.d.ts.map +1 -1
- package/types/ui/scroll-slider.d.ts +5 -7
- package/types/ui/scroll-slider.d.ts.map +1 -1
- package/types/ui/scrollpoint.d.ts +3 -8
- package/types/ui/scrollpoint.d.ts.map +1 -1
- package/types/ui/slider.d.ts +22 -12
- package/types/ui/slider.d.ts.map +1 -1
- package/types/ui/tabs.d.ts +6 -8
- package/types/ui/tabs.d.ts.map +1 -1
- package/types/ui/theme-toggle.d.ts +6 -13
- package/types/ui/theme-toggle.d.ts.map +1 -1
- package/types/ui/tooltip.d.ts +3 -5
- package/types/ui/tooltip.d.ts.map +1 -1
- package/types/utils/dom.d.ts +6 -0
- package/types/utils/dom.d.ts.map +1 -1
- package/types/utils/system.d.ts +113 -0
- package/types/utils/system.d.ts.map +1 -0
package/js/ui/scrollpoint.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
*
|
|
20
|
+
* Scrollpoint Component Initializer
|
|
24
21
|
*/
|
|
25
|
-
export const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
@@ -191,7 +155,7 @@ export class Scrollpoint {
|
|
|
191
155
|
};
|
|
192
156
|
this.setupObserver();
|
|
193
157
|
if (options.debug) {
|
|
194
|
-
|
|
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
|
-
|
|
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,20 @@
|
|
|
5
5
|
// Slider
|
|
6
6
|
// =============================================================================
|
|
7
7
|
|
|
8
|
-
// Version: 1.0.
|
|
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 [
|
|
13
|
-
// this is addressed now and should slide
|
|
14
|
-
// 1.0.8 | Change API, to elements object (from
|
|
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
|
|
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
|
|
21
|
+
// 1.0.4 | Remove live region announcement (only used if auto rotate)
|
|
21
22
|
|
|
22
23
|
// Reference: https://www.w3.org/WAI/tutorials/carousels/working-example/
|
|
23
24
|
// https://www.w3.org/TR/wai-aria-practices/examples/carousel/carousel-1.html#
|
|
@@ -27,17 +28,28 @@
|
|
|
27
28
|
// https://dev.opera.com/articles/css-will-change-property/
|
|
28
29
|
// * Will Change use
|
|
29
30
|
|
|
31
|
+
import { ComponentInitializer } from "../utils/system.js";
|
|
30
32
|
import { wrapSettingString } from "../settings.js";
|
|
31
33
|
import maintain from 'ally.js/maintain/_maintain';
|
|
32
34
|
import { hasRequiredProps } from '@ulu/utils/object.js';
|
|
33
35
|
import { trimWhitespace } from "@ulu/utils/string.js";
|
|
34
36
|
import { debounce } from "@ulu/utils/performance.js";
|
|
35
37
|
import { log, logError, logWarning } from "../utils/class-logger.js";
|
|
36
|
-
import { getDatasetOptionalJson } from "../utils/dom.js";
|
|
37
|
-
import { createPager } from "./overflow-scroller-pager.js";
|
|
38
|
-
import { getName } from "../events/index.js";
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Slider Component Initializer
|
|
41
|
+
*/
|
|
42
|
+
export const initializer = new ComponentInitializer({
|
|
43
|
+
type: "slider",
|
|
44
|
+
baseAttribute: "data-ulu-slider"
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const attrSelectorTrack = initializer.attributeSelector("track");
|
|
48
|
+
const attrSelectorTrackContainer = initializer.attributeSelector("track-container");
|
|
49
|
+
const attrSelectorControlContext = initializer.attributeSelector("control-context");
|
|
50
|
+
const attrSelectorSlide = initializer.attributeSelector("slide");
|
|
51
|
+
|
|
52
|
+
const instances = [];
|
|
41
53
|
const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
42
54
|
const eventOnce = { once: true };
|
|
43
55
|
const cssDuration = d => `${ d }ms`;
|
|
@@ -57,52 +69,34 @@ const requiredElements = [
|
|
|
57
69
|
];
|
|
58
70
|
|
|
59
71
|
/**
|
|
60
|
-
*
|
|
72
|
+
* Initialize all sliders based on data attribute selectors
|
|
61
73
|
*/
|
|
62
|
-
export const attrs = {
|
|
63
|
-
init: "data-ulu-slider-init",
|
|
64
|
-
slider: "data-ulu-slider",
|
|
65
|
-
track: "data-ulu-slider-track",
|
|
66
|
-
trackContainer: "data-ulu-slider-track-container",
|
|
67
|
-
controls: "data-ulu-slider-control-context"
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// Utils for selecting things based on attributes
|
|
71
|
-
const attrSelector = key => `[${ attrs[key] }]`;
|
|
72
|
-
const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
|
|
73
|
-
|
|
74
|
-
const defaults = {
|
|
75
|
-
amount: createPager()
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
const instances = [];
|
|
79
|
-
|
|
80
74
|
export function init() {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
75
|
+
initializer.init({
|
|
76
|
+
withData: true,
|
|
77
|
+
events: ["pageModified"],
|
|
78
|
+
setup({ element, data, initialize }) {
|
|
79
|
+
setupSlider(element, data);
|
|
80
|
+
initialize();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
88
83
|
}
|
|
89
84
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Setup single slider instance from querying via data attribute selectors
|
|
87
|
+
* @param {Node} container The slide container to query children from
|
|
88
|
+
* @param {Object} options Options for slider class
|
|
89
|
+
*/
|
|
90
|
+
export function setupSlider(container, options) {
|
|
91
|
+
const config = Object.assign({}, options);
|
|
94
92
|
const elements = {
|
|
95
93
|
container,
|
|
96
|
-
track: container.querySelector(
|
|
97
|
-
trackContainer: container.querySelector(
|
|
98
|
-
controlContext: container.querySelector(
|
|
99
|
-
slides: container.querySelectorAll(
|
|
94
|
+
track: container.querySelector(attrSelectorTrack),
|
|
95
|
+
trackContainer: container.querySelector(attrSelectorTrackContainer),
|
|
96
|
+
controlContext: container.querySelector(attrSelectorControlContext),
|
|
97
|
+
slides: container.querySelectorAll(attrSelectorSlide)
|
|
100
98
|
};
|
|
101
|
-
|
|
102
|
-
// Object.assign(config, {
|
|
103
|
-
// callbacks: {}
|
|
104
|
-
// });
|
|
105
|
-
// /
|
|
99
|
+
|
|
106
100
|
// This was added because there was an issue on the new windows, need to test this
|
|
107
101
|
// config.transitionFade = true;
|
|
108
102
|
if (elements.slides.length) {
|
|
@@ -110,8 +104,14 @@ export function setupSlider(container) {
|
|
|
110
104
|
}
|
|
111
105
|
}
|
|
112
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Class that controls slider
|
|
109
|
+
*/
|
|
113
110
|
export class Slider {
|
|
114
111
|
static instances = [];
|
|
112
|
+
/**
|
|
113
|
+
* Default options for slider
|
|
114
|
+
*/
|
|
115
115
|
static defaults = {
|
|
116
116
|
classAccessiblyHidden: "hidden-visually",
|
|
117
117
|
namespace: "Slider",
|
|
@@ -126,10 +126,8 @@ export class Slider {
|
|
|
126
126
|
iconClassNext: wrapSettingString("iconClassNext"),
|
|
127
127
|
// transition: true
|
|
128
128
|
}
|
|
129
|
-
|
|
130
|
-
constructor(elements, config, debug = false) {
|
|
129
|
+
constructor(elements, config) {
|
|
131
130
|
const options = Object.assign({}, Slider.defaults, config);
|
|
132
|
-
this.debug = debugMode || debug;
|
|
133
131
|
this.options = options;
|
|
134
132
|
this.slide = null;
|
|
135
133
|
this.index = null;
|
|
@@ -511,7 +509,7 @@ export class Slider {
|
|
|
511
509
|
const button = document.createElement("button");
|
|
512
510
|
button.classList.add(this.getClass("nav-button"));
|
|
513
511
|
button.setAttribute("type", "button");
|
|
514
|
-
button.innerHTML = this.getNavContent(slide
|
|
512
|
+
button.innerHTML = this.getNavContent(slide);
|
|
515
513
|
slide.navButton = button; // Add reference to slide object
|
|
516
514
|
button.addEventListener("click", this.goto.bind(this, index));
|
|
517
515
|
return button;
|
|
@@ -523,8 +521,8 @@ export class Slider {
|
|
|
523
521
|
<span class="${ this.getClass("control-icon") } ${ classes }" aria-hidden="true"></span>
|
|
524
522
|
`;
|
|
525
523
|
}
|
|
526
|
-
getNavContent(
|
|
527
|
-
return `<span class="hidden-visually">Item ${ number }</span>`;
|
|
524
|
+
getNavContent(slide) {
|
|
525
|
+
return `<span class="hidden-visually">Item ${ slide.number }</span>`;
|
|
528
526
|
}
|
|
529
527
|
emit(name, args) {
|
|
530
528
|
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(
|
|
31
|
+
export function init() {
|
|
27
32
|
const initial = () => {
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
});
|
package/js/ui/theme-toggle.js
CHANGED
|
@@ -2,33 +2,32 @@
|
|
|
2
2
|
* @module ui/theme-toggle
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import { ComponentInitializer } from "../utils/system.js";
|
|
5
6
|
import { getName } from "../events/index.js";
|
|
6
|
-
import {
|
|
7
|
+
import { getElements, resolveClasses } from "../utils/dom.js";
|
|
7
8
|
import { hasRequiredProps } from "@ulu/utils/object.js";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
+
* Theme Toggle Component Initializer
|
|
11
12
|
*/
|
|
12
|
-
export const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
export const initializer = new ComponentInitializer({
|
|
14
|
+
type: "theme-toggle",
|
|
15
|
+
baseAttribute: "data-ulu-theme-toggle"
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
const attrSelectorLabel = initializer.attributeSelector("label");
|
|
19
|
+
const attrSelectorIcon = initializer.attributeSelector("icon");
|
|
20
|
+
const attrRemote = initializer.getAttribute("remote");
|
|
21
|
+
const attrInit = initializer.getAttribute("init");
|
|
22
|
+
const attrState = initializer.getAttribute("state");
|
|
20
23
|
|
|
21
24
|
// Utils for selecting things based on attributes
|
|
22
|
-
const attrSelector = key => `[${ attrs[key] }]`;
|
|
23
|
-
const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
|
|
24
|
-
const queryAllInitial = key => document.querySelectorAll(attrSelectorInitial(key));
|
|
25
25
|
const queryRemotes = group => document.querySelectorAll(
|
|
26
|
-
`[${
|
|
26
|
+
`[${ attrRemote }="${ group }"]`
|
|
27
27
|
);
|
|
28
28
|
const queryRemotesInitial = group => document.querySelectorAll(
|
|
29
|
-
`[${
|
|
29
|
+
`[${ attrRemote }="${ group }"]:not([${ attrInit }])`
|
|
30
30
|
);
|
|
31
|
-
const debugLog = (...msgs) => console.log("Theme Toggle:", ...msgs);
|
|
32
31
|
const requiredToggleProps = ["target"];
|
|
33
32
|
const checkToggleProps = hasRequiredProps(requiredToggleProps);
|
|
34
33
|
const when = (cond, fn) => cond ? fn() : null; // Consider adding as util
|
|
@@ -109,24 +108,22 @@ export function setDefaults(options) {
|
|
|
109
108
|
* - This will only initialize elements once, it is safe to call on page changes
|
|
110
109
|
*/
|
|
111
110
|
export function init() {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
queryAllInitial("toggle").forEach(setupToggle);
|
|
111
|
+
initializer.init({
|
|
112
|
+
events: ["pageModified"],
|
|
113
|
+
withData: true,
|
|
114
|
+
setup({ element, data, initialize }) {
|
|
115
|
+
setupToggle(element, data);
|
|
116
|
+
initialize();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
121
119
|
}
|
|
122
120
|
|
|
123
121
|
/**
|
|
124
122
|
* Sets up a single toggle
|
|
125
123
|
* @param {HTMLElement} toggle A toggle to be setup
|
|
126
124
|
*/
|
|
127
|
-
export function setupToggle(toggle,
|
|
128
|
-
const
|
|
129
|
-
const options = Object.assign({}, defaults, passedOptions, elementOptions);
|
|
125
|
+
export function setupToggle(toggle, userOptions) {
|
|
126
|
+
const options = Object.assign({}, defaults, userOptions);
|
|
130
127
|
|
|
131
128
|
if (!checkToggleProps(options)) {
|
|
132
129
|
console.error(`Missing a required option: ${ requiredToggleProps.join(", ") }`);
|
|
@@ -145,7 +142,6 @@ export function setupToggle(toggle, passedOptions) {
|
|
|
145
142
|
setState(initialKey, ctx);
|
|
146
143
|
|
|
147
144
|
toggle.addEventListener("click", onToggleClick);
|
|
148
|
-
toggle.setAttribute(attrs.init, "");
|
|
149
145
|
|
|
150
146
|
// Remotes listeners are attached initially and then we also
|
|
151
147
|
// update them vs toggles which would be updated by the main pageModified
|
|
@@ -183,7 +179,7 @@ export function setupToggle(toggle, passedOptions) {
|
|
|
183
179
|
const remotes = queryRemotesInitial(group);
|
|
184
180
|
remotes.forEach(remote => {
|
|
185
181
|
remote.addEventListener("click", onToggleClick);
|
|
186
|
-
|
|
182
|
+
initializer.initializeElement(remote);
|
|
187
183
|
});
|
|
188
184
|
}
|
|
189
185
|
|
|
@@ -196,7 +192,7 @@ export function setupToggle(toggle, passedOptions) {
|
|
|
196
192
|
const remotes = queryRemotesInitial(group);
|
|
197
193
|
remotes.forEach(remote => {
|
|
198
194
|
remote.removeEventListener("click", onToggleClick);
|
|
199
|
-
remote.removeAttribute(
|
|
195
|
+
remote.removeAttribute(attrInit, "");
|
|
200
196
|
});
|
|
201
197
|
}
|
|
202
198
|
|
|
@@ -205,7 +201,7 @@ export function setupToggle(toggle, passedOptions) {
|
|
|
205
201
|
*/
|
|
206
202
|
function destroy() {
|
|
207
203
|
toggle.removeEventListener("click", onToggleClick);
|
|
208
|
-
toggle.removeAttribute(
|
|
204
|
+
toggle.removeAttribute(attrInit, "");
|
|
209
205
|
cleanupRemotes();
|
|
210
206
|
document.removeEventListener(getName("pageModified"), attachRemotes);
|
|
211
207
|
}
|
|
@@ -255,7 +251,7 @@ function setState(key, ctx) {
|
|
|
255
251
|
};
|
|
256
252
|
|
|
257
253
|
if (options.debug) {
|
|
258
|
-
|
|
254
|
+
initializer.log("Set state context", stateCtx);
|
|
259
255
|
}
|
|
260
256
|
|
|
261
257
|
// Prepare classes to remove
|
|
@@ -264,15 +260,15 @@ function setState(key, ctx) {
|
|
|
264
260
|
|
|
265
261
|
// Update all targets
|
|
266
262
|
elements.targets.forEach(element => {
|
|
267
|
-
element.setAttribute(
|
|
263
|
+
element.setAttribute(attrState, key);
|
|
268
264
|
element.classList.remove(...otherTargetClasses);
|
|
269
265
|
element.classList.add(...resolveClasses(theme.targetClass));
|
|
270
266
|
});
|
|
271
267
|
|
|
272
268
|
// Update all toggles and inner children
|
|
273
269
|
elements.toggles.forEach(element => {
|
|
274
|
-
const label = element.querySelector(
|
|
275
|
-
const icon = element.querySelector(
|
|
270
|
+
const label = element.querySelector(attrSelectorLabel);
|
|
271
|
+
const icon = element.querySelector(attrSelectorIcon);
|
|
276
272
|
if (label) {
|
|
277
273
|
label.textContent = theme.label;
|
|
278
274
|
}
|
|
@@ -280,7 +276,7 @@ function setState(key, ctx) {
|
|
|
280
276
|
icon.classList.remove(...otherIconClasses);
|
|
281
277
|
icon.classList.add(...resolveClasses(theme.iconClass));
|
|
282
278
|
}
|
|
283
|
-
element.setAttribute(
|
|
279
|
+
element.setAttribute(attrState, key);
|
|
284
280
|
});
|
|
285
281
|
|
|
286
282
|
// Optional callback if user want to set other things (ie. data-theme or something)
|
|
@@ -306,13 +302,13 @@ function resolveInitial(options) {
|
|
|
306
302
|
const resolved = saved || mediaQueryPreference || initialState;
|
|
307
303
|
|
|
308
304
|
if (options.debug) {
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
305
|
+
initializer.log("Preference Saved", saved);
|
|
306
|
+
initializer.log("Media Query Preference", mediaQueryPreference);
|
|
307
|
+
initializer.log("Initial State:", initialState);
|
|
312
308
|
}
|
|
313
309
|
|
|
314
310
|
if (!resolved) {
|
|
315
|
-
|
|
311
|
+
initializer.logError("Failed to resolve initial theme (pass 'initialState' to options)");
|
|
316
312
|
}
|
|
317
313
|
|
|
318
314
|
return resolved;
|
package/js/ui/tooltip.js
CHANGED
|
@@ -2,46 +2,41 @@
|
|
|
2
2
|
* @module ui/tooltip
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
import { ComponentInitializer } from "../utils/system.js";
|
|
5
6
|
import { getName as getEventName } from "../events/index.js";
|
|
6
7
|
import { createFloatingUi } from "../utils/floating-ui.js";
|
|
7
8
|
import { createElementFromHtml } from "@ulu/utils/browser/dom.js";
|
|
8
9
|
import { logError } from "../utils/class-logger.js";
|
|
9
|
-
import { getDatasetOptionalJson } from "../utils/dom.js";
|
|
10
10
|
import { newId, ensureId } from "../utils/id.js";
|
|
11
11
|
|
|
12
|
-
const attrs = {
|
|
13
|
-
trigger: "data-ulu-tooltip",
|
|
14
|
-
init: "data-ulu-init",
|
|
15
|
-
body: "data-ulu-tooltip-display-body",
|
|
16
|
-
arrow: "data-ulu-tooltip-arrow"
|
|
17
|
-
};
|
|
18
|
-
const attrSelector = key => `[${ attrs[key] }]`;
|
|
19
|
-
const attrSelectorInitial = key => `${ attrSelector(key) }:not([${ attrs.init }])`;
|
|
20
12
|
/**
|
|
21
|
-
*
|
|
13
|
+
* Tooltip Component Initializer
|
|
22
14
|
*/
|
|
23
|
-
export
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
15
|
+
export const initializer = new ComponentInitializer({
|
|
16
|
+
type: "tooltip",
|
|
17
|
+
baseAttribute: "data-ulu-tooltip"
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const attrBody = initializer.getAttribute("body");
|
|
21
|
+
const attrSelectorBody = initializer.attributeSelector("body");
|
|
22
|
+
const attrSelectorArrow = initializer.attributeSelector("arrow");
|
|
27
23
|
|
|
28
24
|
/**
|
|
29
|
-
*
|
|
30
|
-
* - Use this manually if needed
|
|
31
|
-
* - Won't setup a popover more than once
|
|
25
|
+
* Initialize default popover
|
|
32
26
|
*/
|
|
33
|
-
export function
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
27
|
+
export function init() {
|
|
28
|
+
initializer.init({
|
|
29
|
+
events: ["pageModified"],
|
|
30
|
+
withData: true,
|
|
31
|
+
setup({ element: trigger, data, initialize }) {
|
|
32
|
+
const options = typeof data === "object" ? data : {};
|
|
33
|
+
if (typeof data === "string") {
|
|
34
|
+
options.content = data;
|
|
35
|
+
}
|
|
36
|
+
initialize();
|
|
37
|
+
(new Tooltip({ trigger }, options));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
45
40
|
}
|
|
46
41
|
|
|
47
42
|
/**
|
|
@@ -103,7 +98,7 @@ export class Tooltip {
|
|
|
103
98
|
template(_config) {
|
|
104
99
|
return `
|
|
105
100
|
<div class="popover popover--tooltip">
|
|
106
|
-
<div class="popover__inner" ${
|
|
101
|
+
<div class="popover__inner" ${ attrBody }>
|
|
107
102
|
</div>
|
|
108
103
|
<span class="popover__arrow" data-ulu-tooltip-arrow></span>
|
|
109
104
|
</div>
|
|
@@ -177,7 +172,7 @@ export class Tooltip {
|
|
|
177
172
|
createContentElement() {
|
|
178
173
|
const { options } = this;
|
|
179
174
|
const content = createElementFromHtml(options.template(options));
|
|
180
|
-
const body = content.querySelector(
|
|
175
|
+
const body = content.querySelector(attrSelectorBody);
|
|
181
176
|
const innerContent = this.getInnerContent();
|
|
182
177
|
if (options.isHtml) {
|
|
183
178
|
body.innerHTML = innerContent;
|
|
@@ -190,7 +185,7 @@ export class Tooltip {
|
|
|
190
185
|
}
|
|
191
186
|
|
|
192
187
|
this.elements.content = content;
|
|
193
|
-
this.elements.contentArrow = content.querySelector(
|
|
188
|
+
this.elements.contentArrow = content.querySelector(attrSelectorArrow);
|
|
194
189
|
document.body.appendChild(content);
|
|
195
190
|
}
|
|
196
191
|
attachHandlers() {
|