uikit 3.14.4-dev.17d2f2727 → 3.14.4-dev.19f33e082
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 +40 -15
- package/build/util.js +1 -0
- package/dist/css/uikit-core-rtl.css +353 -96
- package/dist/css/uikit-core-rtl.min.css +1 -1
- package/dist/css/uikit-core.css +353 -96
- package/dist/css/uikit-core.min.css +1 -1
- package/dist/css/uikit-rtl.css +373 -101
- package/dist/css/uikit-rtl.min.css +1 -1
- package/dist/css/uikit.css +373 -101
- package/dist/css/uikit.min.css +1 -1
- package/dist/js/components/countdown.js +1 -1
- package/dist/js/components/countdown.min.js +1 -1
- package/dist/js/components/filter.js +7 -5
- package/dist/js/components/filter.min.js +1 -1
- package/dist/js/components/lightbox-panel.js +89 -132
- package/dist/js/components/lightbox-panel.min.js +1 -1
- package/dist/js/components/lightbox.js +89 -132
- package/dist/js/components/lightbox.min.js +1 -1
- package/dist/js/components/notification.js +1 -1
- package/dist/js/components/notification.min.js +1 -1
- package/dist/js/components/parallax.js +4 -5
- package/dist/js/components/parallax.min.js +1 -1
- package/dist/js/components/slider-parallax.js +4 -5
- package/dist/js/components/slider-parallax.min.js +1 -1
- package/dist/js/components/slider.js +1 -1
- package/dist/js/components/slider.min.js +1 -1
- package/dist/js/components/slideshow-parallax.js +4 -5
- package/dist/js/components/slideshow-parallax.min.js +1 -1
- package/dist/js/components/slideshow.js +1 -1
- package/dist/js/components/slideshow.min.js +1 -1
- package/dist/js/components/sortable.js +3 -3
- package/dist/js/components/sortable.min.js +1 -1
- package/dist/js/components/tooltip.js +107 -137
- package/dist/js/components/tooltip.min.js +1 -1
- package/dist/js/components/upload.js +1 -1
- package/dist/js/components/upload.min.js +1 -1
- package/dist/js/uikit-core.js +508 -452
- package/dist/js/uikit-core.min.js +14 -1
- package/dist/js/uikit-icons.js +1 -1
- package/dist/js/uikit-icons.min.js +1 -1
- package/dist/js/uikit.js +516 -458
- package/dist/js/uikit.min.js +14 -1
- package/package.json +1 -1
- package/src/images/{backgrounds/nav-parent-open.svg → components/nav-parent-icon-large.svg} +0 -0
- package/src/images/components/nav-parent-icon.svg +3 -0
- package/src/images/components/navbar-parent-icon.svg +3 -0
- package/src/images/components/navbar-toggle-icon.svg +22 -3
- package/src/js/api/state.js +2 -2
- package/src/js/components/filter.js +5 -3
- package/src/js/components/sortable.js +2 -3
- package/src/js/core/accordion.js +9 -17
- package/src/js/core/alert.js +35 -14
- package/src/js/core/drop.js +94 -67
- package/src/js/core/height-viewport.js +6 -2
- package/src/js/core/icon.js +16 -0
- package/src/js/core/index.js +2 -0
- package/src/js/core/leader.js +2 -2
- package/src/js/core/navbar.js +44 -30
- package/src/js/core/scroll.js +37 -10
- package/src/js/core/sticky.js +8 -9
- package/src/js/core/toggle.js +3 -5
- package/src/js/mixin/media.js +4 -5
- package/src/js/mixin/modal.js +9 -6
- package/src/js/mixin/position.js +26 -11
- package/src/js/mixin/style.js +11 -0
- package/src/js/mixin/togglable.js +88 -133
- package/src/js/util/animation.js +4 -3
- package/src/js/util/class.js +3 -1
- package/src/js/util/filter.js +3 -7
- package/src/js/util/position.js +108 -107
- package/src/js/util/style.js +4 -13
- package/src/js/util/viewport.js +5 -32
- package/src/less/components/_import.less +1 -0
- package/src/less/components/drop.less +1 -18
- package/src/less/components/dropbar.less +115 -0
- package/src/less/components/dropdown.less +16 -16
- package/src/less/components/leader.less +1 -1
- package/src/less/components/nav.less +218 -59
- package/src/less/components/navbar.less +73 -27
- package/src/less/components/utility.less +10 -2
- package/src/less/theme/_import.less +1 -0
- package/src/less/theme/dropbar.less +44 -0
- package/src/less/theme/dropdown.less +0 -11
- package/src/less/theme/nav.less +45 -7
- package/src/less/theme/navbar.less +4 -10
- package/src/scss/components/_import.scss +1 -0
- package/src/scss/components/drop.scss +1 -18
- package/src/scss/components/dropbar.scss +115 -0
- package/src/scss/components/dropdown.scss +16 -16
- package/src/scss/components/leader.scss +1 -1
- package/src/scss/components/nav.scss +167 -47
- package/src/scss/components/navbar.scss +61 -27
- package/src/scss/components/utility.scss +8 -1
- package/src/scss/mixins-theme.scss +92 -24
- package/src/scss/mixins.scss +89 -17
- package/src/scss/theme/_import.scss +1 -0
- package/src/scss/theme/dropbar.scss +44 -0
- package/src/scss/theme/dropdown.scss +0 -8
- package/src/scss/theme/nav.scss +43 -7
- package/src/scss/theme/navbar.scss +4 -7
- package/src/scss/variables-theme.scss +61 -14
- package/src/scss/variables.scss +50 -11
- package/tests/accordion.html +2 -2
- package/tests/alert.html +2 -2
- package/tests/countdown.html +1 -1
- package/tests/drop.html +451 -371
- package/tests/dropbar.html +456 -0
- package/tests/dropdown.html +26 -401
- package/tests/filter.html +9 -12
- package/tests/form.html +1 -1
- package/tests/index.html +126 -107
- package/tests/js/index.js +1 -4
- package/tests/lightbox.html +5 -5
- package/tests/list.html +8 -8
- package/tests/modal.html +13 -13
- package/tests/nav.html +117 -75
- package/tests/navbar.html +325 -228
- package/tests/offcanvas.html +17 -21
- package/tests/parallax.html +1 -1
- package/tests/position.html +18 -16
- package/tests/progress.html +9 -9
- package/tests/scroll.html +7 -10
- package/tests/search.html +5 -5
- package/tests/slider.html +6 -5
- package/tests/slideshow.html +8 -8
- package/tests/sortable.html +6 -8
- package/tests/sticky-navbar.html +6 -6
- package/tests/sticky.html +8 -8
- package/tests/switcher.html +1 -1
- package/tests/tab.html +1 -1
- package/tests/table.html +7 -7
- package/tests/toggle.html +2 -2
- package/tests/tooltip.html +1 -1
- package/tests/upload.html +11 -11
- package/tests/utility.html +19 -0
- package/src/images/backgrounds/nav-parent-close.svg +0 -3
|
@@ -3,22 +3,22 @@ import {
|
|
|
3
3
|
addClass,
|
|
4
4
|
Animation,
|
|
5
5
|
css,
|
|
6
|
-
|
|
6
|
+
dimensions,
|
|
7
7
|
hasClass,
|
|
8
8
|
includes,
|
|
9
9
|
isBoolean,
|
|
10
10
|
isFunction,
|
|
11
11
|
isVisible,
|
|
12
12
|
noop,
|
|
13
|
-
offset,
|
|
14
13
|
removeClass,
|
|
15
|
-
scrollParents,
|
|
16
14
|
startsWith,
|
|
17
15
|
toFloat,
|
|
18
16
|
toggleClass,
|
|
19
17
|
toNodes,
|
|
20
18
|
Transition,
|
|
21
19
|
trigger,
|
|
20
|
+
unwrap,
|
|
21
|
+
wrapInner,
|
|
22
22
|
} from 'uikit-util';
|
|
23
23
|
|
|
24
24
|
export default {
|
|
@@ -40,26 +40,6 @@ export default {
|
|
|
40
40
|
transition: 'ease',
|
|
41
41
|
clsEnter: 'uk-togglabe-enter',
|
|
42
42
|
clsLeave: 'uk-togglabe-leave',
|
|
43
|
-
|
|
44
|
-
initProps: {
|
|
45
|
-
overflow: '',
|
|
46
|
-
maxHeight: '',
|
|
47
|
-
paddingTop: '',
|
|
48
|
-
paddingBottom: '',
|
|
49
|
-
marginTop: '',
|
|
50
|
-
marginBottom: '',
|
|
51
|
-
boxShadow: '',
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
hideProps: {
|
|
55
|
-
overflow: 'hidden',
|
|
56
|
-
maxHeight: 0,
|
|
57
|
-
paddingTop: 0,
|
|
58
|
-
paddingBottom: 0,
|
|
59
|
-
marginTop: 0,
|
|
60
|
-
marginBottom: 0,
|
|
61
|
-
boxShadow: 'none',
|
|
62
|
-
},
|
|
63
43
|
},
|
|
64
44
|
|
|
65
45
|
computed: {
|
|
@@ -68,7 +48,7 @@ export default {
|
|
|
68
48
|
},
|
|
69
49
|
|
|
70
50
|
hasTransition({ animation }) {
|
|
71
|
-
return startsWith(animation[0],
|
|
51
|
+
return ['slide', 'reveal'].some((transition) => startsWith(animation[0], transition));
|
|
72
52
|
},
|
|
73
53
|
},
|
|
74
54
|
|
|
@@ -161,130 +141,105 @@ function toggleInstant({ _toggle }) {
|
|
|
161
141
|
};
|
|
162
142
|
}
|
|
163
143
|
|
|
164
|
-
function toggleTransition(cmp) {
|
|
165
|
-
|
|
166
|
-
case 'slide-left':
|
|
167
|
-
return slideHorizontal(cmp);
|
|
168
|
-
case 'slide-right':
|
|
169
|
-
return slideHorizontal(cmp, true);
|
|
170
|
-
}
|
|
171
|
-
return slide(cmp);
|
|
172
|
-
}
|
|
144
|
+
export function toggleTransition(cmp) {
|
|
145
|
+
const [mode = 'reveal', startProp = 'top'] = cmp.animation[0]?.split('-') || [];
|
|
173
146
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const inProgress = Transition.inProgress(el);
|
|
185
|
-
const inner =
|
|
186
|
-
!inProgress && el.hasChildNodes()
|
|
187
|
-
? toFloat(css(el.firstElementChild, 'marginTop')) +
|
|
188
|
-
toFloat(css(el.lastElementChild, 'marginBottom'))
|
|
189
|
-
: 0;
|
|
190
|
-
const currentHeight = isVisible(el) ? toFloat(css(el, 'height')) + inner : 0;
|
|
147
|
+
const dirs = [
|
|
148
|
+
['left', 'right'],
|
|
149
|
+
['top', 'bottom'],
|
|
150
|
+
];
|
|
151
|
+
const dir = dirs[includes(dirs[0], startProp) ? 0 : 1];
|
|
152
|
+
const end = dir[1] === startProp;
|
|
153
|
+
const props = ['width', 'height'];
|
|
154
|
+
const dimProp = props[dirs.indexOf(dir)];
|
|
155
|
+
const marginProp = `margin-${dir[0]}`;
|
|
156
|
+
const marginStartProp = `margin-${startProp}`;
|
|
191
157
|
|
|
192
|
-
|
|
158
|
+
return async (el, show) => {
|
|
159
|
+
let { duration, velocity, transition, _toggle } = cmp;
|
|
193
160
|
|
|
194
|
-
|
|
161
|
+
let currentDim = dimensions(el)[dimProp];
|
|
162
|
+
|
|
163
|
+
const inProgress = Transition.inProgress(el);
|
|
164
|
+
await Transition.cancel(el);
|
|
195
165
|
|
|
196
|
-
if (
|
|
166
|
+
if (show) {
|
|
197
167
|
_toggle(el, true);
|
|
198
168
|
}
|
|
199
169
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
? Transition.start(
|
|
213
|
-
el,
|
|
214
|
-
{ ...initProps, overflow: 'hidden', maxHeight: endHeight },
|
|
215
|
-
duration * (1 - currentHeight / endHeight),
|
|
216
|
-
transition
|
|
217
|
-
)
|
|
218
|
-
: Transition.start(
|
|
219
|
-
el,
|
|
220
|
-
hideProps,
|
|
221
|
-
duration * (currentHeight / endHeight),
|
|
222
|
-
transition
|
|
223
|
-
).then(() => _toggle(el, false))
|
|
224
|
-
).then(() => css(el, initProps));
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
function slideHorizontal({ isToggled, duration, velocity, transition, _toggle }, right) {
|
|
229
|
-
return (el, show) => {
|
|
230
|
-
const visible = isVisible(el);
|
|
231
|
-
const marginLeft = toFloat(css(el, 'marginLeft'));
|
|
232
|
-
|
|
233
|
-
Transition.cancel(el);
|
|
170
|
+
const prevProps = Object.fromEntries(
|
|
171
|
+
[
|
|
172
|
+
'padding',
|
|
173
|
+
'border',
|
|
174
|
+
'width',
|
|
175
|
+
'height',
|
|
176
|
+
'overflowY',
|
|
177
|
+
'overflowX',
|
|
178
|
+
marginProp,
|
|
179
|
+
marginStartProp,
|
|
180
|
+
].map((key) => [key, el.style[key]])
|
|
181
|
+
);
|
|
234
182
|
|
|
235
|
-
const
|
|
236
|
-
css(
|
|
183
|
+
const dim = dimensions(el);
|
|
184
|
+
const currentMargin = toFloat(css(el, marginProp));
|
|
185
|
+
const marginStart = toFloat(css(el, marginStartProp));
|
|
186
|
+
const endDim = dim[dimProp] + marginStart;
|
|
237
187
|
|
|
238
|
-
if (!
|
|
239
|
-
|
|
188
|
+
if (!inProgress && !show) {
|
|
189
|
+
currentDim += marginStart;
|
|
240
190
|
}
|
|
241
191
|
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
192
|
+
const [wrapper] = wrapInner(el, '<div>');
|
|
193
|
+
css(wrapper, {
|
|
194
|
+
boxSizing: 'border-box',
|
|
195
|
+
height: dim.height,
|
|
196
|
+
width: dim.width,
|
|
197
|
+
...css(el, [
|
|
198
|
+
'overflow',
|
|
199
|
+
'padding',
|
|
200
|
+
'borderTop',
|
|
201
|
+
'borderRight',
|
|
202
|
+
'borderBottom',
|
|
203
|
+
'borderLeft',
|
|
204
|
+
'borderImage',
|
|
205
|
+
marginStartProp,
|
|
206
|
+
]),
|
|
207
|
+
});
|
|
250
208
|
|
|
251
209
|
css(el, {
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
210
|
+
padding: 0,
|
|
211
|
+
border: 0,
|
|
212
|
+
[marginStartProp]: 0,
|
|
213
|
+
width: dim.width,
|
|
214
|
+
height: dim.height,
|
|
215
|
+
overflow: 'hidden',
|
|
216
|
+
[dimProp]: currentDim,
|
|
258
217
|
});
|
|
259
218
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
).then(() => {
|
|
285
|
-
css(scrollElement, 'overflowX', '');
|
|
286
|
-
css(el, { clipPath: '', marginLeft: '' });
|
|
287
|
-
});
|
|
219
|
+
const percent = currentDim / endDim;
|
|
220
|
+
duration = (velocity * endDim + duration) * (show ? 1 - percent : percent);
|
|
221
|
+
const endProps = { [dimProp]: show ? endDim : 0 };
|
|
222
|
+
|
|
223
|
+
if (end) {
|
|
224
|
+
css(el, marginProp, endDim - currentDim + currentMargin);
|
|
225
|
+
endProps[marginProp] = show ? currentMargin : endDim + currentMargin;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (!end ^ (mode === 'reveal')) {
|
|
229
|
+
css(wrapper, marginProp, -endDim + currentDim);
|
|
230
|
+
Transition.start(wrapper, { [marginProp]: show ? 0 : -endDim }, duration, transition);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
try {
|
|
234
|
+
await Transition.start(el, endProps, duration, transition);
|
|
235
|
+
} finally {
|
|
236
|
+
css(el, prevProps);
|
|
237
|
+
unwrap(wrapper.firstChild);
|
|
238
|
+
|
|
239
|
+
if (!show) {
|
|
240
|
+
_toggle(el, false);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
288
243
|
};
|
|
289
244
|
}
|
|
290
245
|
|
package/src/js/util/animation.js
CHANGED
|
@@ -50,13 +50,14 @@ export function transition(element, props, duration = 400, timing = 'linear') {
|
|
|
50
50
|
export const Transition = {
|
|
51
51
|
start: transition,
|
|
52
52
|
|
|
53
|
-
stop(element) {
|
|
53
|
+
async stop(element) {
|
|
54
54
|
trigger(element, 'transitionend');
|
|
55
|
-
|
|
55
|
+
await Promise.resolve();
|
|
56
56
|
},
|
|
57
57
|
|
|
58
|
-
cancel(element) {
|
|
58
|
+
async cancel(element) {
|
|
59
59
|
trigger(element, 'transitioncanceled');
|
|
60
|
+
await Promise.resolve();
|
|
60
61
|
},
|
|
61
62
|
|
|
62
63
|
inProgress(element) {
|
package/src/js/util/class.js
CHANGED
|
@@ -10,7 +10,9 @@ export function removeClass(element, ...args) {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
export function removeClasses(element, cls) {
|
|
13
|
-
attr(element, 'class', (value) =>
|
|
13
|
+
attr(element, 'class', (value) =>
|
|
14
|
+
(value || '').replace(new RegExp(`\\b${cls}\\b\\s?`, 'g'), '')
|
|
15
|
+
);
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
export function replaceClass(element, ...args) {
|
package/src/js/util/filter.js
CHANGED
|
@@ -51,12 +51,8 @@ export function matches(element, selector) {
|
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export function closest(element, selector) {
|
|
54
|
-
if (startsWith(selector, '>')) {
|
|
55
|
-
selector = selector.slice(1);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
54
|
return isElement(element)
|
|
59
|
-
? element.closest(selector)
|
|
55
|
+
? element.closest(startsWith(selector, '>') ? selector.slice(1) : selector)
|
|
60
56
|
: toNodes(element)
|
|
61
57
|
.map((element) => closest(element, selector))
|
|
62
58
|
.filter(Boolean);
|
|
@@ -64,8 +60,8 @@ export function closest(element, selector) {
|
|
|
64
60
|
|
|
65
61
|
export function within(element, selector) {
|
|
66
62
|
return isString(selector)
|
|
67
|
-
?
|
|
68
|
-
:
|
|
63
|
+
? !!closest(element, selector)
|
|
64
|
+
: toNode(selector).contains(toNode(element));
|
|
69
65
|
}
|
|
70
66
|
|
|
71
67
|
export function parents(element, selector) {
|
package/src/js/util/position.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { offset } from './dimensions';
|
|
2
|
-
import { clamp,
|
|
2
|
+
import { clamp, isArray, ucfirst } from './lang';
|
|
3
3
|
import { offsetViewport, scrollParents } from './viewport';
|
|
4
4
|
|
|
5
5
|
const dirs = [
|
|
@@ -15,126 +15,65 @@ export function positionAt(element, target, options) {
|
|
|
15
15
|
...options.attach,
|
|
16
16
|
},
|
|
17
17
|
offset: [0, 0],
|
|
18
|
+
placement: [],
|
|
18
19
|
...options,
|
|
19
20
|
};
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
: attachTo(element, target, options);
|
|
24
|
-
|
|
25
|
-
offset(element, dim);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
function attachTo(element, target, options) {
|
|
29
|
-
let { attach, offset: offsetBy } = {
|
|
30
|
-
attach: {
|
|
31
|
-
element: ['left', 'top'],
|
|
32
|
-
target: ['left', 'top'],
|
|
33
|
-
...options.attach,
|
|
34
|
-
},
|
|
35
|
-
offset: [0, 0],
|
|
36
|
-
...options,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const position = offset(element);
|
|
40
|
-
const targetOffset = offset(target);
|
|
41
|
-
for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
|
|
42
|
-
position[start] = position[dir] =
|
|
43
|
-
targetOffset[start] +
|
|
44
|
-
moveBy(attach.target[i], end, targetOffset[prop]) -
|
|
45
|
-
moveBy(attach.element[i], end, position[prop]) +
|
|
46
|
-
+offsetBy[i];
|
|
47
|
-
position[end] = position[start] + position[prop];
|
|
22
|
+
if (!isArray(target)) {
|
|
23
|
+
target = [target, target];
|
|
48
24
|
}
|
|
49
|
-
return position;
|
|
50
|
-
}
|
|
51
25
|
|
|
52
|
-
|
|
53
|
-
return start === 'center' ? dim / 2 : start === end ? dim : 0;
|
|
26
|
+
offset(element, getPosition(element, target, options));
|
|
54
27
|
}
|
|
55
28
|
|
|
56
|
-
function
|
|
29
|
+
function getPosition(element, target, options) {
|
|
57
30
|
const position = attachTo(element, target, options);
|
|
58
|
-
const targetDim = offset(target);
|
|
59
31
|
|
|
60
32
|
let {
|
|
61
|
-
flip,
|
|
62
33
|
attach: { element: elAttach, target: targetAttach },
|
|
63
34
|
offset: elOffset,
|
|
64
35
|
boundary,
|
|
65
|
-
viewport,
|
|
66
36
|
viewportOffset,
|
|
37
|
+
placement,
|
|
67
38
|
} = options;
|
|
68
39
|
|
|
69
|
-
let
|
|
70
|
-
|
|
71
|
-
viewports =
|
|
72
|
-
|
|
73
|
-
const [scrollElement] = viewports;
|
|
74
|
-
viewports.push(viewport);
|
|
40
|
+
let offsetPosition = position;
|
|
41
|
+
for (const [i, [prop, , start, end]] of Object.entries(dirs)) {
|
|
42
|
+
let viewports = scrollParents(target[i]);
|
|
43
|
+
const [scrollElement] = viewports;
|
|
75
44
|
|
|
76
|
-
|
|
77
|
-
for (const [i, [prop, dir, start, end]] of Object.entries(dirs)) {
|
|
78
|
-
if (flip !== true && !includes(flip, dir)) {
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const willFlip =
|
|
83
|
-
!intersectLine(position, targetDim, i) && intersectLine(position, targetDim, 1 - i);
|
|
84
|
-
|
|
85
|
-
viewport = getIntersectionArea(...viewports.filter(Boolean).map(offsetViewport));
|
|
45
|
+
let viewport = getIntersectionArea(...viewports.map(offsetViewport));
|
|
86
46
|
|
|
87
47
|
if (viewportOffset) {
|
|
88
48
|
viewport[start] += viewportOffset;
|
|
89
49
|
viewport[end] -= viewportOffset;
|
|
90
50
|
}
|
|
91
51
|
|
|
92
|
-
if (boundary
|
|
93
|
-
viewport = getIntersectionArea(viewport,
|
|
52
|
+
if (boundary) {
|
|
53
|
+
viewport = getIntersectionArea(viewport, offsetViewport(boundary));
|
|
94
54
|
}
|
|
95
55
|
|
|
96
|
-
const
|
|
97
|
-
const
|
|
56
|
+
const isInStartViewport = position[start] >= viewport[start];
|
|
57
|
+
const isInEndViewport = position[end] <= viewport[end];
|
|
98
58
|
|
|
99
|
-
if (
|
|
59
|
+
if (isInStartViewport && isInEndViewport) {
|
|
100
60
|
continue;
|
|
101
61
|
}
|
|
102
62
|
|
|
103
|
-
let offsetBy;
|
|
63
|
+
let offsetBy = 0;
|
|
104
64
|
|
|
105
65
|
// Flip
|
|
106
|
-
if (
|
|
66
|
+
if (placement[i] === 'flip') {
|
|
107
67
|
if (
|
|
108
|
-
(
|
|
109
|
-
(
|
|
68
|
+
(targetAttach[i] === end && isInEndViewport) ||
|
|
69
|
+
(targetAttach[i] === start && isInStartViewport)
|
|
110
70
|
) {
|
|
111
71
|
continue;
|
|
112
72
|
}
|
|
113
73
|
|
|
114
|
-
offsetBy =
|
|
115
|
-
(elAttach[i] === start
|
|
116
|
-
? -position[prop]
|
|
117
|
-
: elAttach[i] === end
|
|
118
|
-
? position[prop]
|
|
119
|
-
: 0) +
|
|
120
|
-
(targetAttach[i] === start
|
|
121
|
-
? targetDim[prop]
|
|
122
|
-
: targetAttach[i] === end
|
|
123
|
-
? -targetDim[prop]
|
|
124
|
-
: 0) -
|
|
125
|
-
elOffset[i] * 2;
|
|
74
|
+
offsetBy = flip(element, target, options, i)[start] - position[start];
|
|
126
75
|
|
|
127
|
-
if (
|
|
128
|
-
!isInScrollArea(
|
|
129
|
-
{
|
|
130
|
-
...position,
|
|
131
|
-
[start]: position[start] + offsetBy,
|
|
132
|
-
[end]: position[end] + offsetBy,
|
|
133
|
-
},
|
|
134
|
-
scrollElement,
|
|
135
|
-
i
|
|
136
|
-
)
|
|
137
|
-
) {
|
|
76
|
+
if (!isInScrollArea(applyOffset(position, offsetBy, i), scrollElement, i)) {
|
|
138
77
|
if (isInScrollArea(position, scrollElement, i)) {
|
|
139
78
|
continue;
|
|
140
79
|
}
|
|
@@ -143,26 +82,27 @@ function attachToWithFlip(element, target, options) {
|
|
|
143
82
|
return false;
|
|
144
83
|
}
|
|
145
84
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return newPos;
|
|
160
|
-
}
|
|
85
|
+
const newPos = getPosition(element, target, {
|
|
86
|
+
...options,
|
|
87
|
+
attach: {
|
|
88
|
+
element: elAttach.map(flipAxis).reverse(),
|
|
89
|
+
target: targetAttach.map(flipAxis).reverse(),
|
|
90
|
+
},
|
|
91
|
+
offset: elOffset.reverse(),
|
|
92
|
+
placement: placement.reverse(),
|
|
93
|
+
recursion: true,
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if (newPos && isInScrollArea(newPos, scrollElement, 1 - i)) {
|
|
97
|
+
return newPos;
|
|
161
98
|
}
|
|
99
|
+
|
|
100
|
+
continue;
|
|
162
101
|
}
|
|
163
102
|
|
|
164
|
-
//
|
|
165
|
-
} else {
|
|
103
|
+
// Shift
|
|
104
|
+
} else if (placement[i] === 'shift') {
|
|
105
|
+
const targetDim = offset(target[i]);
|
|
166
106
|
offsetBy =
|
|
167
107
|
clamp(
|
|
168
108
|
clamp(position[start], viewport[start], viewport[end] - position[prop]),
|
|
@@ -171,13 +111,54 @@ function attachToWithFlip(element, target, options) {
|
|
|
171
111
|
) - position[start];
|
|
172
112
|
}
|
|
173
113
|
|
|
174
|
-
offsetPosition
|
|
175
|
-
offsetPosition[end] += offsetBy;
|
|
114
|
+
offsetPosition = applyOffset(offsetPosition, offsetBy, i);
|
|
176
115
|
}
|
|
177
116
|
|
|
178
117
|
return offsetPosition;
|
|
179
118
|
}
|
|
180
119
|
|
|
120
|
+
function attachTo(element, target, options) {
|
|
121
|
+
let { attach, offset: offsetBy } = {
|
|
122
|
+
attach: {
|
|
123
|
+
element: ['left', 'top'],
|
|
124
|
+
target: ['left', 'top'],
|
|
125
|
+
...options.attach,
|
|
126
|
+
},
|
|
127
|
+
offset: [0, 0],
|
|
128
|
+
...options,
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
let elOffset = offset(element);
|
|
132
|
+
|
|
133
|
+
for (const [i, [prop, , start, end]] of Object.entries(dirs)) {
|
|
134
|
+
const targetOffset =
|
|
135
|
+
attach.target[i] === attach.element[i] ? offsetViewport(target[i]) : offset(target[i]);
|
|
136
|
+
|
|
137
|
+
elOffset = applyOffset(
|
|
138
|
+
elOffset,
|
|
139
|
+
targetOffset[start] -
|
|
140
|
+
elOffset[start] +
|
|
141
|
+
moveBy(attach.target[i], end, targetOffset[prop]) -
|
|
142
|
+
moveBy(attach.element[i], end, elOffset[prop]) +
|
|
143
|
+
+offsetBy[i],
|
|
144
|
+
i
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
return elOffset;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function applyOffset(position, offset, i) {
|
|
151
|
+
const [, dir, start, end] = dirs[i];
|
|
152
|
+
const newPos = { ...position };
|
|
153
|
+
newPos[start] = position[dir] = position[start] + offset;
|
|
154
|
+
newPos[end] += offset;
|
|
155
|
+
return newPos;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function moveBy(attach, end, dim) {
|
|
159
|
+
return attach === 'center' ? dim / 2 : attach === end ? dim : 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
181
162
|
function getIntersectionArea(...rects) {
|
|
182
163
|
let area = {};
|
|
183
164
|
for (const rect of rects) {
|
|
@@ -198,12 +179,32 @@ function isInScrollArea(position, scrollElement, dir) {
|
|
|
198
179
|
return position[start] >= viewport[start] && position[end] <= viewport[end];
|
|
199
180
|
}
|
|
200
181
|
|
|
201
|
-
function
|
|
202
|
-
|
|
203
|
-
|
|
182
|
+
function flip(element, target, { offset, attach }, i) {
|
|
183
|
+
return attachTo(element, target, {
|
|
184
|
+
attach: {
|
|
185
|
+
element: flipAttach(attach.element, i),
|
|
186
|
+
target: flipAttach(attach.target, i),
|
|
187
|
+
},
|
|
188
|
+
offset: flipOffset(offset, i),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function flipAttach(attach, i) {
|
|
193
|
+
const newAttach = [...attach];
|
|
194
|
+
const index = dirs[i].indexOf(attach[i]);
|
|
195
|
+
if (~index) {
|
|
196
|
+
newAttach[i] = dirs[i][1 - (index % 2) + 2];
|
|
197
|
+
}
|
|
198
|
+
return newAttach;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function flipOffset(offset, i) {
|
|
202
|
+
offset = [...offset];
|
|
203
|
+
offset[i] *= -1;
|
|
204
|
+
return offset;
|
|
204
205
|
}
|
|
205
206
|
|
|
206
|
-
function
|
|
207
|
+
function flipAxis(prop) {
|
|
207
208
|
for (let i = 0; i < dirs.length; i++) {
|
|
208
209
|
const index = dirs[i].indexOf(prop);
|
|
209
210
|
if (~index) {
|
package/src/js/util/style.js
CHANGED
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
isString,
|
|
9
9
|
isUndefined,
|
|
10
10
|
memoize,
|
|
11
|
+
startsWith,
|
|
11
12
|
toNodes,
|
|
12
13
|
} from './lang';
|
|
13
14
|
|
|
@@ -62,18 +63,11 @@ export function css(element, property, value, priority = '') {
|
|
|
62
63
|
return elements[0];
|
|
63
64
|
}
|
|
64
65
|
|
|
65
|
-
const propertyRe = /^\s*(["'])?(.*?)\1\s*$/;
|
|
66
|
-
export function getCssVar(name, element = document.documentElement) {
|
|
67
|
-
return css(element, `--uk-${name}`).replace(propertyRe, '$2');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
66
|
// https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-setproperty
|
|
71
67
|
export const propName = memoize((name) => vendorPropName(name));
|
|
72
68
|
|
|
73
|
-
const cssPrefixes = ['webkit', 'moz'];
|
|
74
|
-
|
|
75
69
|
function vendorPropName(name) {
|
|
76
|
-
if (name
|
|
70
|
+
if (startsWith(name, '--')) {
|
|
77
71
|
return name;
|
|
78
72
|
}
|
|
79
73
|
|
|
@@ -85,11 +79,8 @@ function vendorPropName(name) {
|
|
|
85
79
|
return name;
|
|
86
80
|
}
|
|
87
81
|
|
|
88
|
-
|
|
89
|
-
prefixedName
|
|
90
|
-
|
|
91
|
-
while (i--) {
|
|
92
|
-
prefixedName = `-${cssPrefixes[i]}-${name}`;
|
|
82
|
+
for (const prefix of ['webkit', 'moz']) {
|
|
83
|
+
const prefixedName = `-${prefix}-${name}`;
|
|
93
84
|
if (prefixedName in style) {
|
|
94
85
|
return prefixedName;
|
|
95
86
|
}
|