uikit 3.11.2-dev.4c11be04b → 3.11.2-dev.72dbb9a19
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/.eslintrc.json +4 -49
- package/.prettierignore +14 -0
- package/.prettierrc.json +13 -0
- package/.webstorm.js +3 -3
- package/CHANGELOG.md +21 -0
- package/build/.eslintrc.json +1 -3
- package/build/build.js +26 -28
- package/build/icons.js +7 -11
- package/build/less.js +48 -36
- package/build/package.json +2 -2
- package/build/prefix.js +21 -18
- package/build/publishDev.js +6 -8
- package/build/release.js +20 -17
- package/build/scope.js +21 -11
- package/build/scss.js +72 -39
- package/build/util.js +71 -62
- package/build/wrapper/icons.js +0 -2
- package/dist/css/uikit-core-rtl.css +42 -32
- package/dist/css/uikit-core-rtl.min.css +1 -1
- package/dist/css/uikit-core.css +42 -32
- package/dist/css/uikit-core.min.css +1 -1
- package/dist/css/uikit-rtl.css +42 -32
- package/dist/css/uikit-rtl.min.css +1 -1
- package/dist/css/uikit.css +42 -32
- package/dist/css/uikit.min.css +1 -1
- package/dist/js/components/countdown.js +88 -133
- package/dist/js/components/countdown.min.js +1 -1
- package/dist/js/components/filter.js +408 -439
- package/dist/js/components/filter.min.js +1 -1
- package/dist/js/components/lightbox-panel.js +1098 -1316
- package/dist/js/components/lightbox-panel.min.js +1 -1
- package/dist/js/components/lightbox.js +1144 -1393
- package/dist/js/components/lightbox.min.js +1 -1
- package/dist/js/components/notification.js +94 -114
- package/dist/js/components/notification.min.js +1 -1
- package/dist/js/components/parallax.js +294 -356
- package/dist/js/components/parallax.min.js +1 -1
- package/dist/js/components/slider-parallax.js +292 -344
- package/dist/js/components/slider-parallax.min.js +1 -1
- package/dist/js/components/slider.js +722 -852
- package/dist/js/components/slider.min.js +1 -1
- package/dist/js/components/slideshow-parallax.js +292 -344
- package/dist/js/components/slideshow-parallax.min.js +1 -1
- package/dist/js/components/slideshow.js +612 -802
- package/dist/js/components/slideshow.min.js +1 -1
- package/dist/js/components/sortable.js +587 -621
- package/dist/js/components/sortable.min.js +1 -1
- package/dist/js/components/tooltip.js +324 -356
- package/dist/js/components/tooltip.min.js +1 -1
- package/dist/js/components/upload.js +155 -167
- package/dist/js/components/upload.min.js +1 -1
- package/dist/js/uikit-core.js +5370 -6659
- package/dist/js/uikit-core.min.js +1 -1
- package/dist/js/uikit-icons.js +7 -9
- package/dist/js/uikit-icons.min.js +1 -1
- package/dist/js/uikit.js +8056 -9832
- package/dist/js/uikit.min.js +1 -1
- package/jsconfig.json +1 -1
- package/package.json +64 -60
- package/src/js/api/boot.js +25 -32
- package/src/js/api/component.js +15 -28
- package/src/js/api/global.js +6 -12
- package/src/js/api/hooks.js +14 -33
- package/src/js/api/instance.js +7 -15
- package/src/js/api/state.js +79 -100
- package/src/js/components/countdown.js +24 -50
- package/src/js/components/filter.js +70 -66
- package/src/js/components/index.js +13 -13
- package/src/js/components/internal/lightbox-animations.js +14 -25
- package/src/js/components/internal/slider-transitioner.js +66 -45
- package/src/js/components/internal/slideshow-animations.js +46 -64
- package/src/js/components/lightbox-panel.js +107 -105
- package/src/js/components/lightbox.js +17 -39
- package/src/js/components/notification.js +49 -43
- package/src/js/components/parallax.js +21 -46
- package/src/js/components/slider-parallax.js +13 -23
- package/src/js/components/slider.js +75 -64
- package/src/js/components/slideshow-parallax.js +1 -1
- package/src/js/components/slideshow.js +8 -13
- package/src/js/components/sortable.js +126 -108
- package/src/js/components/tooltip.js +41 -31
- package/src/js/components/upload.js +52 -63
- package/src/js/core/accordion.js +53 -48
- package/src/js/core/alert.js +9 -17
- package/src/js/core/core.js +74 -53
- package/src/js/core/cover.js +11 -15
- package/src/js/core/drop.js +107 -93
- package/src/js/core/form-custom.js +20 -25
- package/src/js/core/gif.js +3 -7
- package/src/js/core/grid.js +57 -58
- package/src/js/core/height-match.js +16 -29
- package/src/js/core/height-viewport.js +29 -36
- package/src/js/core/icon.js +38 -50
- package/src/js/core/img.js +59 -58
- package/src/js/core/index.js +39 -39
- package/src/js/core/leader.js +9 -18
- package/src/js/core/margin.js +21 -37
- package/src/js/core/modal.js +49 -36
- package/src/js/core/nav.js +2 -4
- package/src/js/core/navbar.js +113 -85
- package/src/js/core/offcanvas.js +49 -53
- package/src/js/core/overflow-auto.js +13 -17
- package/src/js/core/responsive.js +14 -12
- package/src/js/core/scroll.js +10 -20
- package/src/js/core/scrollspy-nav.js +34 -31
- package/src/js/core/scrollspy.js +37 -54
- package/src/js/core/sticky.js +187 -116
- package/src/js/core/svg.js +60 -79
- package/src/js/core/switcher.js +47 -46
- package/src/js/core/tab.js +7 -10
- package/src/js/core/toggle.js +64 -66
- package/src/js/core/video.js +11 -22
- package/src/js/mixin/animate.js +19 -20
- package/src/js/mixin/class.js +2 -4
- package/src/js/mixin/container.js +7 -11
- package/src/js/mixin/internal/animate-fade.js +73 -30
- package/src/js/mixin/internal/animate-slide.js +58 -41
- package/src/js/mixin/internal/slideshow-animations.js +7 -14
- package/src/js/mixin/internal/slideshow-transitioner.js +10 -17
- package/src/js/mixin/media.js +5 -10
- package/src/js/mixin/modal.js +89 -66
- package/src/js/mixin/parallax.js +53 -48
- package/src/js/mixin/position.js +26 -20
- package/src/js/mixin/slider-autoplay.js +12 -21
- package/src/js/mixin/slider-drag.js +64 -65
- package/src/js/mixin/slider-nav.js +26 -35
- package/src/js/mixin/slider-reactive.js +2 -8
- package/src/js/mixin/slider.js +48 -55
- package/src/js/mixin/slideshow.js +13 -19
- package/src/js/mixin/togglable.js +89 -63
- package/src/js/uikit-core.js +2 -4
- package/src/js/uikit.js +2 -4
- package/src/js/util/ajax.js +20 -39
- package/src/js/util/animation.js +77 -75
- package/src/js/util/attr.js +17 -21
- package/src/js/util/class.js +14 -52
- package/src/js/util/dimensions.js +76 -47
- package/src/js/util/dom.js +40 -73
- package/src/js/util/env.js +7 -12
- package/src/js/util/event.js +60 -59
- package/src/js/util/fastdom.js +3 -8
- package/src/js/util/filter.js +17 -34
- package/src/js/util/index.js +0 -1
- package/src/js/util/lang.js +81 -121
- package/src/js/util/mouse.js +19 -17
- package/src/js/util/options.js +35 -49
- package/src/js/util/player.js +40 -36
- package/src/js/util/position.js +54 -46
- package/src/js/util/selector.js +43 -58
- package/src/js/util/style.js +36 -46
- package/src/js/util/viewport.js +81 -66
- package/src/less/components/base.less +0 -5
- package/src/less/components/flex.less +0 -9
- package/src/less/components/leader.less +0 -1
- package/src/less/components/navbar.less +0 -7
- package/src/less/components/utility.less +22 -0
- package/src/scss/components/base.scss +0 -5
- package/src/scss/components/flex.scss +0 -9
- package/src/scss/components/form.scss +3 -3
- package/src/scss/components/icon.scss +2 -2
- package/src/scss/components/leader.scss +0 -1
- package/src/scss/components/navbar.scss +0 -7
- package/src/scss/components/search.scss +1 -1
- package/src/scss/components/utility.scss +22 -0
- package/src/scss/variables-theme.scss +6 -6
- package/src/scss/variables.scss +6 -6
- package/tests/js/index.js +114 -85
- package/tests/sticky-parallax.html +44 -41
- package/tests/sticky.html +56 -24
- package/src/js/mixin/flex-bug.js +0 -56
- package/src/js/util/promise.js +0 -191
package/src/js/util/options.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { hasOwn, includes, isArray, isFunction, isUndefined, sortBy, startsWith } from './lang';
|
|
2
2
|
|
|
3
3
|
const strats = {};
|
|
4
4
|
|
|
5
5
|
strats.events =
|
|
6
|
-
strats.created =
|
|
7
|
-
strats.beforeConnect =
|
|
8
|
-
strats.connected =
|
|
9
|
-
strats.beforeDisconnect =
|
|
10
|
-
strats.disconnected =
|
|
11
|
-
strats.destroy =
|
|
6
|
+
strats.created =
|
|
7
|
+
strats.beforeConnect =
|
|
8
|
+
strats.connected =
|
|
9
|
+
strats.beforeDisconnect =
|
|
10
|
+
strats.disconnected =
|
|
11
|
+
strats.destroy =
|
|
12
|
+
concatStrat;
|
|
12
13
|
|
|
13
14
|
// args strategy
|
|
14
15
|
strats.args = function (parentVal, childVal) {
|
|
@@ -17,37 +18,33 @@ strats.args = function (parentVal, childVal) {
|
|
|
17
18
|
|
|
18
19
|
// update strategy
|
|
19
20
|
strats.update = function (parentVal, childVal) {
|
|
20
|
-
return sortBy(
|
|
21
|
+
return sortBy(
|
|
22
|
+
concatStrat(parentVal, isFunction(childVal) ? { read: childVal } : childVal),
|
|
23
|
+
'order'
|
|
24
|
+
);
|
|
21
25
|
};
|
|
22
26
|
|
|
23
27
|
// property strategy
|
|
24
28
|
strats.props = function (parentVal, childVal) {
|
|
25
|
-
|
|
26
29
|
if (isArray(childVal)) {
|
|
27
|
-
|
|
30
|
+
const value = {};
|
|
31
|
+
for (const key of childVal) {
|
|
28
32
|
value[key] = String;
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
}
|
|
34
|
+
childVal = value;
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
return strats.methods(parentVal, childVal);
|
|
34
38
|
};
|
|
35
39
|
|
|
36
40
|
// extend strategy
|
|
37
|
-
strats.computed =
|
|
38
|
-
|
|
39
|
-
return childVal
|
|
40
|
-
? parentVal
|
|
41
|
-
? assign({}, parentVal, childVal)
|
|
42
|
-
: childVal
|
|
43
|
-
: parentVal;
|
|
41
|
+
strats.computed = strats.methods = function (parentVal, childVal) {
|
|
42
|
+
return childVal ? (parentVal ? { ...parentVal, ...childVal } : childVal) : parentVal;
|
|
44
43
|
};
|
|
45
44
|
|
|
46
45
|
// data strategy
|
|
47
46
|
strats.data = function (parentVal, childVal, vm) {
|
|
48
|
-
|
|
49
47
|
if (!vm) {
|
|
50
|
-
|
|
51
48
|
if (!childVal) {
|
|
52
49
|
return parentVal;
|
|
53
50
|
}
|
|
@@ -59,7 +56,6 @@ strats.data = function (parentVal, childVal, vm) {
|
|
|
59
56
|
return function (vm) {
|
|
60
57
|
return mergeFnData(parentVal, childVal, vm);
|
|
61
58
|
};
|
|
62
|
-
|
|
63
59
|
}
|
|
64
60
|
|
|
65
61
|
return mergeFnData(parentVal, childVal, vm);
|
|
@@ -67,26 +63,21 @@ strats.data = function (parentVal, childVal, vm) {
|
|
|
67
63
|
|
|
68
64
|
function mergeFnData(parentVal, childVal, vm) {
|
|
69
65
|
return strats.computed(
|
|
70
|
-
isFunction(parentVal)
|
|
71
|
-
|
|
72
|
-
: parentVal,
|
|
73
|
-
isFunction(childVal)
|
|
74
|
-
? childVal.call(vm, vm)
|
|
75
|
-
: childVal
|
|
66
|
+
isFunction(parentVal) ? parentVal.call(vm, vm) : parentVal,
|
|
67
|
+
isFunction(childVal) ? childVal.call(vm, vm) : childVal
|
|
76
68
|
);
|
|
77
69
|
}
|
|
78
70
|
|
|
79
71
|
// concat strategy
|
|
80
72
|
function concatStrat(parentVal, childVal) {
|
|
81
|
-
|
|
82
73
|
parentVal = parentVal && !isArray(parentVal) ? [parentVal] : parentVal;
|
|
83
74
|
|
|
84
75
|
return childVal
|
|
85
76
|
? parentVal
|
|
86
77
|
? parentVal.concat(childVal)
|
|
87
78
|
: isArray(childVal)
|
|
88
|
-
|
|
89
|
-
|
|
79
|
+
? childVal
|
|
80
|
+
: [childVal]
|
|
90
81
|
: parentVal;
|
|
91
82
|
}
|
|
92
83
|
|
|
@@ -96,7 +87,6 @@ function defaultStrat(parentVal, childVal) {
|
|
|
96
87
|
}
|
|
97
88
|
|
|
98
89
|
export function mergeOptions(parent, child, vm) {
|
|
99
|
-
|
|
100
90
|
const options = {};
|
|
101
91
|
|
|
102
92
|
if (isFunction(child)) {
|
|
@@ -108,8 +98,8 @@ export function mergeOptions(parent, child, vm) {
|
|
|
108
98
|
}
|
|
109
99
|
|
|
110
100
|
if (child.mixins) {
|
|
111
|
-
for (
|
|
112
|
-
parent = mergeOptions(parent,
|
|
101
|
+
for (const mixin of child.mixins) {
|
|
102
|
+
parent = mergeOptions(parent, mixin, vm);
|
|
113
103
|
}
|
|
114
104
|
}
|
|
115
105
|
|
|
@@ -131,25 +121,21 @@ export function mergeOptions(parent, child, vm) {
|
|
|
131
121
|
}
|
|
132
122
|
|
|
133
123
|
export function parseOptions(options, args = []) {
|
|
134
|
-
|
|
135
124
|
try {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
? {}
|
|
139
|
-
: startsWith(options, '{')
|
|
125
|
+
return options
|
|
126
|
+
? startsWith(options, '{')
|
|
140
127
|
? JSON.parse(options)
|
|
141
128
|
: args.length && !includes(options, ':')
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
129
|
+
? { [args[0]]: options }
|
|
130
|
+
: options.split(';').reduce((options, option) => {
|
|
131
|
+
const [key, value] = option.split(/:(.*)/);
|
|
132
|
+
if (key && !isUndefined(value)) {
|
|
133
|
+
options[key.trim()] = value.trim();
|
|
134
|
+
}
|
|
135
|
+
return options;
|
|
136
|
+
}, {})
|
|
137
|
+
: {};
|
|
151
138
|
} catch (e) {
|
|
152
139
|
return {};
|
|
153
140
|
}
|
|
154
|
-
|
|
155
141
|
}
|
package/src/js/util/player.js
CHANGED
|
@@ -1,43 +1,38 @@
|
|
|
1
|
-
import {once} from './event';
|
|
2
|
-
import {
|
|
3
|
-
import {assign, includes, noop} from './lang';
|
|
1
|
+
import { once } from './event';
|
|
2
|
+
import { includes, noop } from './lang';
|
|
4
3
|
|
|
5
4
|
export function play(el) {
|
|
6
|
-
|
|
7
5
|
if (isIFrame(el)) {
|
|
8
|
-
call(el, {func: 'playVideo', method: 'play'});
|
|
6
|
+
call(el, { func: 'playVideo', method: 'play' });
|
|
9
7
|
}
|
|
10
8
|
|
|
11
9
|
if (isHTML5(el)) {
|
|
12
10
|
try {
|
|
13
11
|
el.play().catch(noop);
|
|
14
|
-
} catch (e) {
|
|
12
|
+
} catch (e) {
|
|
13
|
+
// noop
|
|
14
|
+
}
|
|
15
15
|
}
|
|
16
|
-
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
export function pause(el) {
|
|
20
|
-
|
|
21
19
|
if (isIFrame(el)) {
|
|
22
|
-
call(el, {func: 'pauseVideo', method: 'pause'});
|
|
20
|
+
call(el, { func: 'pauseVideo', method: 'pause' });
|
|
23
21
|
}
|
|
24
22
|
|
|
25
23
|
if (isHTML5(el)) {
|
|
26
24
|
el.pause();
|
|
27
25
|
}
|
|
28
|
-
|
|
29
26
|
}
|
|
30
27
|
|
|
31
28
|
export function mute(el) {
|
|
32
|
-
|
|
33
29
|
if (isIFrame(el)) {
|
|
34
|
-
call(el, {func: 'mute', method: 'setVolume', value: 0});
|
|
30
|
+
call(el, { func: 'mute', method: 'setVolume', value: 0 });
|
|
35
31
|
}
|
|
36
32
|
|
|
37
33
|
if (isHTML5(el)) {
|
|
38
34
|
el.muted = true;
|
|
39
35
|
}
|
|
40
|
-
|
|
41
36
|
}
|
|
42
37
|
|
|
43
38
|
export function isVideo(el) {
|
|
@@ -45,35 +40,39 @@ export function isVideo(el) {
|
|
|
45
40
|
}
|
|
46
41
|
|
|
47
42
|
function isHTML5(el) {
|
|
48
|
-
return el
|
|
43
|
+
return el?.tagName === 'VIDEO';
|
|
49
44
|
}
|
|
50
45
|
|
|
51
46
|
function isIFrame(el) {
|
|
52
|
-
return el
|
|
47
|
+
return el?.tagName === 'IFRAME' && (isYoutube(el) || isVimeo(el));
|
|
53
48
|
}
|
|
54
49
|
|
|
55
50
|
function isYoutube(el) {
|
|
56
|
-
return !!el.src.match(
|
|
51
|
+
return !!el.src.match(
|
|
52
|
+
/\/\/.*?youtube(-nocookie)?\.[a-z]+\/(watch\?v=[^&\s]+|embed)|youtu\.be\/.*/
|
|
53
|
+
);
|
|
57
54
|
}
|
|
58
55
|
|
|
59
56
|
function isVimeo(el) {
|
|
60
57
|
return !!el.src.match(/vimeo\.com\/video\/.*/);
|
|
61
58
|
}
|
|
62
59
|
|
|
63
|
-
function call(el, cmd) {
|
|
64
|
-
enableApi(el)
|
|
60
|
+
async function call(el, cmd) {
|
|
61
|
+
await enableApi(el);
|
|
62
|
+
post(el, cmd);
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
function post(el, cmd) {
|
|
68
66
|
try {
|
|
69
|
-
el.contentWindow.postMessage(JSON.stringify(
|
|
70
|
-
} catch (e) {
|
|
67
|
+
el.contentWindow.postMessage(JSON.stringify({ event: 'command', ...cmd }), '*');
|
|
68
|
+
} catch (e) {
|
|
69
|
+
// noop
|
|
70
|
+
}
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
const stateKey = '_ukPlayer';
|
|
74
74
|
let counter = 0;
|
|
75
75
|
function enableApi(el) {
|
|
76
|
-
|
|
77
76
|
if (el[stateKey]) {
|
|
78
77
|
return el[stateKey];
|
|
79
78
|
}
|
|
@@ -84,24 +83,29 @@ function enableApi(el) {
|
|
|
84
83
|
const id = ++counter;
|
|
85
84
|
let poller;
|
|
86
85
|
|
|
87
|
-
return el[stateKey] = new Promise(resolve => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
once(window, 'message', resolve, false, ({data}) => {
|
|
86
|
+
return (el[stateKey] = new Promise((resolve) => {
|
|
87
|
+
youtube &&
|
|
88
|
+
once(el, 'load', () => {
|
|
89
|
+
const listener = () => post(el, { event: 'listening', id });
|
|
90
|
+
poller = setInterval(listener, 100);
|
|
91
|
+
listener();
|
|
92
|
+
});
|
|
96
93
|
|
|
94
|
+
once(window, 'message', resolve, false, ({ data }) => {
|
|
97
95
|
try {
|
|
98
96
|
data = JSON.parse(data);
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
|
|
97
|
+
return (
|
|
98
|
+
data &&
|
|
99
|
+
((youtube && data.id === id && data.event === 'onReady') ||
|
|
100
|
+
(vimeo && Number(data.player_id) === id))
|
|
101
|
+
);
|
|
102
|
+
} catch (e) {
|
|
103
|
+
// noop
|
|
104
|
+
}
|
|
102
105
|
});
|
|
103
106
|
|
|
104
|
-
el.src = `${el.src}${includes(el.src, '?') ? '&' : '?'}${
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
el.src = `${el.src}${includes(el.src, '?') ? '&' : '?'}${
|
|
108
|
+
youtube ? 'enablejsapi=1' : `api=1&player_id=${id}`
|
|
109
|
+
}`;
|
|
110
|
+
}).then(() => clearInterval(poller)));
|
|
107
111
|
}
|
package/src/js/util/position.js
CHANGED
|
@@ -1,18 +1,26 @@
|
|
|
1
|
-
import {offset} from './dimensions';
|
|
2
|
-
import {each, endsWith, includes, toFloat} from './lang';
|
|
3
|
-
import {getViewport, scrollParents} from './viewport';
|
|
1
|
+
import { offset } from './dimensions';
|
|
2
|
+
import { each, endsWith, includes, toFloat } from './lang';
|
|
3
|
+
import { getViewport, scrollParents } from './viewport';
|
|
4
4
|
|
|
5
5
|
const dirs = {
|
|
6
6
|
width: ['x', 'left', 'right'],
|
|
7
|
-
height: ['y', 'top', 'bottom']
|
|
7
|
+
height: ['y', 'top', 'bottom'],
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export function positionAt(
|
|
11
|
-
|
|
10
|
+
export function positionAt(
|
|
11
|
+
element,
|
|
12
|
+
target,
|
|
13
|
+
elAttach,
|
|
14
|
+
targetAttach,
|
|
15
|
+
elOffset,
|
|
16
|
+
targetOffset,
|
|
17
|
+
flip,
|
|
18
|
+
boundary
|
|
19
|
+
) {
|
|
12
20
|
elAttach = getPos(elAttach);
|
|
13
21
|
targetAttach = getPos(targetAttach);
|
|
14
22
|
|
|
15
|
-
const flipped = {element: elAttach, target: targetAttach};
|
|
23
|
+
const flipped = { element: elAttach, target: targetAttach };
|
|
16
24
|
|
|
17
25
|
if (!element || !target) {
|
|
18
26
|
return flipped;
|
|
@@ -35,69 +43,71 @@ export function positionAt(element, target, elAttach, targetAttach, elOffset, ta
|
|
|
35
43
|
position.top += elOffset['y'];
|
|
36
44
|
|
|
37
45
|
if (flip) {
|
|
38
|
-
|
|
39
46
|
let boundaries = scrollParents(element).map(getViewport);
|
|
40
47
|
|
|
41
48
|
if (boundary && !includes(boundaries, boundary)) {
|
|
42
49
|
boundaries.unshift(boundary);
|
|
43
50
|
}
|
|
44
51
|
|
|
45
|
-
boundaries = boundaries.map(el => offset(el));
|
|
52
|
+
boundaries = boundaries.map((el) => offset(el));
|
|
46
53
|
|
|
47
54
|
each(dirs, ([dir, align, alignFlip], prop) => {
|
|
48
|
-
|
|
49
55
|
if (!(flip === true || includes(flip, dir))) {
|
|
50
56
|
return;
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
boundaries.some(boundary => {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
boundaries.some((boundary) => {
|
|
60
|
+
const elemOffset =
|
|
61
|
+
elAttach[dir] === align
|
|
62
|
+
? -dim[prop]
|
|
63
|
+
: elAttach[dir] === alignFlip
|
|
58
64
|
? dim[prop]
|
|
59
65
|
: 0;
|
|
60
66
|
|
|
61
|
-
const targetOffset =
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
const targetOffset =
|
|
68
|
+
targetAttach[dir] === align
|
|
69
|
+
? targetDim[prop]
|
|
70
|
+
: targetAttach[dir] === alignFlip
|
|
64
71
|
? -targetDim[prop]
|
|
65
72
|
: 0;
|
|
66
73
|
|
|
67
|
-
if (
|
|
68
|
-
|
|
74
|
+
if (
|
|
75
|
+
position[align] < boundary[align] ||
|
|
76
|
+
position[align] + dim[prop] > boundary[alignFlip]
|
|
77
|
+
) {
|
|
69
78
|
const centerOffset = dim[prop] / 2;
|
|
70
|
-
const centerTargetOffset =
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
const centerTargetOffset =
|
|
80
|
+
targetAttach[dir] === 'center' ? -targetDim[prop] / 2 : 0;
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
(elAttach[dir] === 'center' &&
|
|
84
|
+
(apply(centerOffset, centerTargetOffset) ||
|
|
85
|
+
apply(-centerOffset, -centerTargetOffset))) ||
|
|
86
|
+
apply(elemOffset, targetOffset)
|
|
87
|
+
);
|
|
77
88
|
}
|
|
78
89
|
|
|
79
90
|
function apply(elemOffset, targetOffset) {
|
|
80
|
-
|
|
81
|
-
|
|
91
|
+
const newVal = toFloat(
|
|
92
|
+
(position[align] + elemOffset + targetOffset - elOffset[dir] * 2).toFixed(4)
|
|
93
|
+
);
|
|
82
94
|
|
|
83
95
|
if (newVal >= boundary[align] && newVal + dim[prop] <= boundary[alignFlip]) {
|
|
84
96
|
position[align] = newVal;
|
|
85
97
|
|
|
86
|
-
['element', 'target']
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
for (const el of ['element', 'target']) {
|
|
99
|
+
if (elemOffset) {
|
|
100
|
+
flipped[el][dir] =
|
|
101
|
+
flipped[el][dir] === dirs[prop][1]
|
|
102
|
+
? dirs[prop][2]
|
|
103
|
+
: dirs[prop][1];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
93
106
|
|
|
94
107
|
return true;
|
|
95
108
|
}
|
|
96
|
-
|
|
97
109
|
}
|
|
98
|
-
|
|
99
110
|
});
|
|
100
|
-
|
|
101
111
|
});
|
|
102
112
|
}
|
|
103
113
|
|
|
@@ -111,13 +121,12 @@ function moveTo(position, attach, dim, factor) {
|
|
|
111
121
|
if (attach[dir] === alignFlip) {
|
|
112
122
|
position[align] += dim[prop] * factor;
|
|
113
123
|
} else if (attach[dir] === 'center') {
|
|
114
|
-
position[align] += dim[prop] * factor / 2;
|
|
124
|
+
position[align] += (dim[prop] * factor) / 2;
|
|
115
125
|
}
|
|
116
126
|
});
|
|
117
127
|
}
|
|
118
128
|
|
|
119
129
|
function getPos(pos) {
|
|
120
|
-
|
|
121
130
|
const x = /left|center|right/;
|
|
122
131
|
const y = /top|center|bottom/;
|
|
123
132
|
|
|
@@ -127,22 +136,21 @@ function getPos(pos) {
|
|
|
127
136
|
pos = x.test(pos[0])
|
|
128
137
|
? pos.concat('center')
|
|
129
138
|
: y.test(pos[0])
|
|
130
|
-
|
|
131
|
-
|
|
139
|
+
? ['center'].concat(pos)
|
|
140
|
+
: ['center', 'center'];
|
|
132
141
|
}
|
|
133
142
|
|
|
134
143
|
return {
|
|
135
144
|
x: x.test(pos[0]) ? pos[0] : 'center',
|
|
136
|
-
y: y.test(pos[1]) ? pos[1] : 'center'
|
|
145
|
+
y: y.test(pos[1]) ? pos[1] : 'center',
|
|
137
146
|
};
|
|
138
147
|
}
|
|
139
148
|
|
|
140
149
|
function getOffsets(offsets, width, height) {
|
|
141
|
-
|
|
142
150
|
const [x, y] = (offsets || '').split(' ');
|
|
143
151
|
|
|
144
152
|
return {
|
|
145
153
|
x: x ? toFloat(x) * (endsWith(x, '%') ? width / 100 : 1) : 0,
|
|
146
|
-
y: y ? toFloat(y) * (endsWith(y, '%') ? height / 100 : 1) : 0
|
|
154
|
+
y: y ? toFloat(y) * (endsWith(y, '%') ? height / 100 : 1) : 0,
|
|
147
155
|
};
|
|
148
156
|
}
|
package/src/js/util/selector.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {attr} from './attr';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {isDocument, isString, memoize, toNode, toNodes} from './lang';
|
|
1
|
+
import { attr } from './attr';
|
|
2
|
+
import { closest, index, matches, parent } from './filter';
|
|
3
|
+
import { isDocument, isString, memoize, toNode, toNodes } from './lang';
|
|
5
4
|
|
|
6
5
|
export function query(selector, context) {
|
|
7
6
|
return find(selector, getContext(selector, context));
|
|
@@ -11,12 +10,6 @@ export function queryAll(selector, context) {
|
|
|
11
10
|
return findAll(selector, getContext(selector, context));
|
|
12
11
|
}
|
|
13
12
|
|
|
14
|
-
function getContext(selector, context = document) {
|
|
15
|
-
return isString(selector) && isContextSelector(selector) || isDocument(context)
|
|
16
|
-
? context
|
|
17
|
-
: context.ownerDocument;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
13
|
export function find(selector, context) {
|
|
21
14
|
return toNode(_query(selector, context, 'querySelector'));
|
|
22
15
|
}
|
|
@@ -25,8 +18,18 @@ export function findAll(selector, context) {
|
|
|
25
18
|
return toNodes(_query(selector, context, 'querySelectorAll'));
|
|
26
19
|
}
|
|
27
20
|
|
|
28
|
-
|
|
21
|
+
const contextSelectorRe = /(^|[^\\],)\s*[!>+~-]/;
|
|
22
|
+
const isContextSelector = memoize((selector) => selector.match(contextSelectorRe));
|
|
23
|
+
|
|
24
|
+
function getContext(selector, context = document) {
|
|
25
|
+
return (isString(selector) && isContextSelector(selector)) || isDocument(context)
|
|
26
|
+
? context
|
|
27
|
+
: context.ownerDocument;
|
|
28
|
+
}
|
|
29
29
|
|
|
30
|
+
const contextSanitizeRe = /([!>+~-])(?=\s+[!>+~-]|\s*$)/g;
|
|
31
|
+
|
|
32
|
+
function _query(selector, context = document, queryFn) {
|
|
30
33
|
if (!selector || !isString(selector)) {
|
|
31
34
|
return selector;
|
|
32
35
|
}
|
|
@@ -34,63 +37,46 @@ function _query(selector, context = document, queryFn) {
|
|
|
34
37
|
selector = selector.replace(contextSanitizeRe, '$1 *');
|
|
35
38
|
|
|
36
39
|
if (isContextSelector(selector)) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return `${domPath(ctx)} ${selector}`;
|
|
64
|
-
|
|
65
|
-
}).filter(Boolean).join(',');
|
|
40
|
+
selector = splitSelector(selector)
|
|
41
|
+
.map((selector) => {
|
|
42
|
+
let ctx = context;
|
|
43
|
+
|
|
44
|
+
if (selector[0] === '!') {
|
|
45
|
+
const selectors = selector.substr(1).trim().split(' ');
|
|
46
|
+
ctx = closest(parent(context), selectors[0]);
|
|
47
|
+
selector = selectors.slice(1).join(' ').trim();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (selector[0] === '-') {
|
|
51
|
+
const selectors = selector.substr(1).trim().split(' ');
|
|
52
|
+
const prev = (ctx || context).previousElementSibling;
|
|
53
|
+
ctx = matches(prev, selector.substr(1)) ? prev : null;
|
|
54
|
+
selector = selectors.slice(1).join(' ');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!ctx) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return `${domPath(ctx)} ${selector}`;
|
|
62
|
+
})
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.join(',');
|
|
66
65
|
|
|
67
66
|
context = document;
|
|
68
|
-
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
try {
|
|
72
|
-
|
|
73
70
|
return context[queryFn](selector);
|
|
74
|
-
|
|
75
71
|
} catch (e) {
|
|
76
|
-
|
|
77
72
|
return null;
|
|
78
|
-
|
|
79
73
|
}
|
|
80
|
-
|
|
81
74
|
}
|
|
82
75
|
|
|
83
|
-
const contextSelectorRe = /(^|[^\\],)\s*[!>+~-]/;
|
|
84
|
-
const contextSanitizeRe = /([!>+~-])(?=\s+[!>+~-]|\s*$)/g;
|
|
85
|
-
|
|
86
|
-
const isContextSelector = memoize(selector => selector.match(contextSelectorRe));
|
|
87
|
-
|
|
88
76
|
const selectorRe = /.*?[^\\](?:,|$)/g;
|
|
89
77
|
|
|
90
|
-
const splitSelector = memoize(selector =>
|
|
91
|
-
selector.match(selectorRe).map(selector =>
|
|
92
|
-
selector.replace(/,$/, '').trim()
|
|
93
|
-
)
|
|
78
|
+
const splitSelector = memoize((selector) =>
|
|
79
|
+
selector.match(selectorRe).map((selector) => selector.replace(/,$/, '').trim())
|
|
94
80
|
);
|
|
95
81
|
|
|
96
82
|
function domPath(element) {
|
|
@@ -101,7 +87,7 @@ function domPath(element) {
|
|
|
101
87
|
names.unshift(`#${escape(id)}`);
|
|
102
88
|
break;
|
|
103
89
|
} else {
|
|
104
|
-
let {tagName} = element;
|
|
90
|
+
let { tagName } = element;
|
|
105
91
|
if (tagName !== 'HTML') {
|
|
106
92
|
tagName += `:nth-child(${index(element) + 1})`;
|
|
107
93
|
}
|
|
@@ -112,7 +98,6 @@ function domPath(element) {
|
|
|
112
98
|
return names.join(' > ');
|
|
113
99
|
}
|
|
114
100
|
|
|
115
|
-
const escapeFn = inBrowser && window.CSS && CSS.escape || function (css) { return css.replace(/([^\x7f-\uFFFF\w-])/g, match => `\\${match}`); };
|
|
116
101
|
export function escape(css) {
|
|
117
|
-
return isString(css) ?
|
|
102
|
+
return isString(css) ? CSS.escape(css) : '';
|
|
118
103
|
}
|