uikit 3.23.8-dev.ff7a25595 → 3.23.9-dev.0064d7d94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/css/uikit-core-rtl.css +1 -1
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +1 -1
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +1 -1
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +1 -1
  9. package/dist/css/uikit.min.css +1 -1
  10. package/dist/js/components/countdown.js +1 -1
  11. package/dist/js/components/countdown.min.js +1 -1
  12. package/dist/js/components/filter.js +1 -1
  13. package/dist/js/components/filter.min.js +1 -1
  14. package/dist/js/components/lightbox-panel.js +14 -2
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +14 -2
  17. package/dist/js/components/lightbox.min.js +1 -1
  18. package/dist/js/components/notification.js +1 -1
  19. package/dist/js/components/notification.min.js +1 -1
  20. package/dist/js/components/parallax.js +1 -1
  21. package/dist/js/components/parallax.min.js +1 -1
  22. package/dist/js/components/slider-parallax.js +1 -1
  23. package/dist/js/components/slider-parallax.min.js +1 -1
  24. package/dist/js/components/slider.js +1 -1
  25. package/dist/js/components/slider.min.js +1 -1
  26. package/dist/js/components/slideshow-parallax.js +1 -1
  27. package/dist/js/components/slideshow-parallax.min.js +1 -1
  28. package/dist/js/components/slideshow.js +1 -1
  29. package/dist/js/components/slideshow.min.js +1 -1
  30. package/dist/js/components/sortable.js +1 -1
  31. package/dist/js/components/sortable.min.js +1 -1
  32. package/dist/js/components/tooltip.js +1 -1
  33. package/dist/js/components/tooltip.min.js +1 -1
  34. package/dist/js/components/upload.js +1 -1
  35. package/dist/js/components/upload.min.js +1 -1
  36. package/dist/js/uikit-core.js +48 -12
  37. package/dist/js/uikit-core.min.js +1 -1
  38. package/dist/js/uikit-icons.js +1 -1
  39. package/dist/js/uikit-icons.min.js +1 -1
  40. package/dist/js/uikit.js +48 -12
  41. package/dist/js/uikit.min.js +1 -1
  42. package/package.json +1 -1
  43. package/src/js/core/drop.js +3 -2
  44. package/src/js/core/dropnav.js +17 -0
  45. package/src/js/core/icon.js +12 -0
  46. package/src/js/core/navbar.js +1 -0
  47. package/src/js/core/scrollspy-nav.js +2 -3
  48. package/src/js/core/toggle.js +15 -9
  49. package/src/js/mixin/modal.js +18 -1
  50. package/src/js/mixin/svg.js +0 -2
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "uikit",
3
3
  "title": "UIkit",
4
4
  "description": "UIkit is a lightweight and modular front-end framework for developing fast and powerful web interfaces.",
5
- "version": "3.23.8-dev.ff7a25595",
5
+ "version": "3.23.9-dev.0064d7d94",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -117,6 +117,7 @@ export default {
117
117
  if (this.toggle && !this.targetEl) {
118
118
  this.targetEl = createToggleComponent(this);
119
119
  }
120
+ attr(this.targetEl, 'aria-expanded', false);
120
121
 
121
122
  this._style = pick(this.$el.style, ['width', 'height']);
122
123
  },
@@ -297,7 +298,7 @@ export default {
297
298
 
298
299
  active = this.isActive() ? null : active;
299
300
  this.tracker.cancel();
300
- attr(this.targetEl, 'aria-expanded', null);
301
+ attr(this.targetEl, 'aria-expanded', false);
301
302
  },
302
303
  },
303
304
  ],
@@ -460,7 +461,7 @@ function createToggleComponent(drop) {
460
461
  target: drop.$el,
461
462
  mode: drop.mode,
462
463
  });
463
- attr($el, 'aria-haspopup', true);
464
+ $el.ariaHasPopup = true;
464
465
 
465
466
  return $el;
466
467
  }
@@ -15,8 +15,12 @@ import {
15
15
  noop,
16
16
  observeResize,
17
17
  offset,
18
+ on,
18
19
  once,
19
20
  parents,
21
+ pointerEnter,
22
+ pointerLeave,
23
+ pointerMove,
20
24
  query,
21
25
  remove,
22
26
  selFocusable,
@@ -58,6 +62,7 @@ export default {
58
62
  boundary: true,
59
63
  dropbar: false,
60
64
  dropbarAnchor: false,
65
+ delayShow: 160,
61
66
  duration: 200,
62
67
  container: false,
63
68
  selNavItem: '> li > a, > ul > li > a',
@@ -119,6 +124,8 @@ export default {
119
124
 
120
125
  connected() {
121
126
  this.initializeDropdowns();
127
+
128
+ preventInitialPointerEnter(this.$el);
122
129
  },
123
130
 
124
131
  disconnected() {
@@ -430,3 +437,13 @@ function handleNavItemNavigation(e, toggles, active) {
430
437
  toggles[getIndex(next, toggles, toggles.indexOf(active.targetEl || current))].focus();
431
438
  }
432
439
  }
440
+
441
+ // Prevents initial pointer events from opening dropdowns on page load (Safari/Firefox)
442
+ function preventInitialPointerEnter(el) {
443
+ const off = () => handlers.forEach((handler) => handler());
444
+ const handlers = [
445
+ once(el.ownerDocument, pointerMove, (e) => el.contains(e.target) || off()),
446
+ on(el, `mouseenter ${pointerEnter}`, (e) => e.stopPropagation(), { capture: true }),
447
+ on(el, `mouseleave ${pointerLeave}`, off, { capture: true }),
448
+ ];
449
+ }
@@ -102,6 +102,13 @@ export const IconComponent = {
102
102
  beforeConnect() {
103
103
  addClass(this.$el, this.$options.id);
104
104
  },
105
+
106
+ async connected() {
107
+ const svg = await this.svg;
108
+ if (svg) {
109
+ svg.ariaHidden = true;
110
+ }
111
+ },
105
112
  };
106
113
 
107
114
  export const NavParentIcon = {
@@ -195,7 +202,12 @@ export const Slidenav = {
195
202
 
196
203
  export const NavbarToggleIcon = {
197
204
  extends: ButtonComponent,
205
+
198
206
  i18n: { label: 'Open menu' },
207
+
208
+ beforeConnect() {
209
+ this.$el.ariaExpanded = false;
210
+ },
199
211
  };
200
212
 
201
213
  export const Close = {
@@ -12,6 +12,7 @@ export default {
12
12
  },
13
13
 
14
14
  data: {
15
+ delayShow: 200,
15
16
  clsDrop: 'uk-navbar-dropdown',
16
17
  selNavItem:
17
18
  '.uk-navbar-nav > li > a,a.uk-navbar-item,button.uk-navbar-item,.uk-navbar-item a,.uk-navbar-item button,.uk-navbar-toggle', // Simplify with :where() selector once browser target is Safari 14+
@@ -4,7 +4,6 @@ import {
4
4
  getCoveringElement,
5
5
  getTargetedElement,
6
6
  hasClass,
7
- isSameSiteAnchor,
8
7
  isVisible,
9
8
  offset,
10
9
  offsetViewport,
@@ -32,7 +31,7 @@ export default {
32
31
  },
33
32
 
34
33
  computed: {
35
- links: ({ target }, $el) => $$(target, $el).filter((el) => isSameSiteAnchor(el)),
34
+ links: ({ target }, $el) => $$(target, $el).filter((el) => getTargetedElement(el)),
36
35
 
37
36
  elements({ closest }) {
38
37
  return this.links.map((el) => el.closest(closest || '*'));
@@ -52,7 +51,7 @@ export default {
52
51
  update: [
53
52
  {
54
53
  read() {
55
- const targets = this.links.map((el) => getTargetedElement(el)).filter(Boolean);
54
+ const targets = this.links.map(getTargetedElement);
56
55
 
57
56
  const { length } = targets;
58
57
 
@@ -4,6 +4,7 @@ import {
4
4
  includes,
5
5
  isBoolean,
6
6
  isFocusable,
7
+ isSameSiteAnchor,
7
8
  isTag,
8
9
  isTouch,
9
10
  matches,
@@ -153,18 +154,23 @@ export default {
153
154
  filter: ({ mode }) => ['click', 'hover'].some((m) => includes(mode, m)),
154
155
 
155
156
  handler(e) {
156
- let link;
157
- if (
158
- this._preventClick ||
159
- e.target.closest('a[href="#"], a[href=""]') ||
160
- ((link = e.target.closest('a[href]')) &&
161
- (!this.isToggled(this.target) ||
162
- (link.hash && matches(this.target, link.hash))))
163
- ) {
157
+ if (e.defaultPrevented) {
158
+ return;
159
+ }
160
+
161
+ const link = e.target.closest('a');
162
+ const isButtonLike =
163
+ isSameSiteAnchor(link) && (!link.hash || matches(this.target, link.hash));
164
+
165
+ if (this._preventClick || isButtonLike || (link && !this.isToggled(this.target))) {
164
166
  e.preventDefault();
165
167
  }
166
168
 
167
- if (!this._preventClick && includes(this.mode, 'click')) {
169
+ if (
170
+ !this._preventClick &&
171
+ includes(this.mode, 'click') &&
172
+ (!link || isButtonLike || e.defaultPrevented)
173
+ ) {
168
174
  this.toggle();
169
175
  }
170
176
  },
@@ -98,13 +98,14 @@ export default {
98
98
 
99
99
  self: true,
100
100
 
101
- handler(e) {
101
+ handler(e, toggle) {
102
102
  if (e.defaultPrevented) {
103
103
  return;
104
104
  }
105
105
 
106
106
  e.preventDefault();
107
107
 
108
+ this.target = toggle?.$el;
108
109
  if (this.isToggled() === includes(active, this)) {
109
110
  this.toggle();
110
111
  }
@@ -155,6 +156,8 @@ export default {
155
156
  );
156
157
 
157
158
  addClass(document.documentElement, this.clsPage);
159
+
160
+ setAriaExpanded(this.target, true);
158
161
  },
159
162
  },
160
163
 
@@ -189,6 +192,14 @@ export default {
189
192
  if (!active.some((modal) => modal.clsPage === this.clsPage)) {
190
193
  removeClass(document.documentElement, this.clsPage);
191
194
  }
195
+
196
+ if (isFocusable(this.target)) {
197
+ this.target.focus();
198
+ }
199
+
200
+ setAriaExpanded(this.target, false);
201
+
202
+ this.target = null;
192
203
  },
193
204
  },
194
205
  ],
@@ -289,3 +300,9 @@ function listenForEscClose(modal) {
289
300
  }
290
301
  });
291
302
  }
303
+
304
+ function setAriaExpanded(el, toggled) {
305
+ if (el?.ariaExpanded) {
306
+ el.ariaExpanded = toggled;
307
+ }
308
+ }
@@ -112,8 +112,6 @@ const symbolRe = /<symbol([^]*?id=(['"])(.+?)\2[^]*?<\/)symbol>/g;
112
112
  const parseSymbols = memoize(function (svg) {
113
113
  const symbols = {};
114
114
 
115
- symbolRe.lastIndex = 0;
116
-
117
115
  let match;
118
116
  while ((match = symbolRe.exec(svg))) {
119
117
  symbols[match[3]] = `<svg ${match[1]}svg>`;