uikit 3.7.3-dev.af32c46e8 → 3.7.4-dev.e74b22b13

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 (54) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/css/uikit-core-rtl.css +3 -3
  3. package/dist/css/uikit-core-rtl.min.css +1 -1
  4. package/dist/css/uikit-core.css +3 -3
  5. package/dist/css/uikit-core.min.css +1 -1
  6. package/dist/css/uikit-rtl.css +3 -3
  7. package/dist/css/uikit-rtl.min.css +1 -1
  8. package/dist/css/uikit.css +3 -3
  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 +1 -1
  15. package/dist/js/components/lightbox-panel.min.js +1 -1
  16. package/dist/js/components/lightbox.js +1 -1
  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 +172 -15
  37. package/dist/js/uikit-core.min.js +2 -2
  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 +172 -15
  41. package/dist/js/uikit.min.js +2 -2
  42. package/package.json +1 -1
  43. package/src/js/core/navbar.js +136 -7
  44. package/src/js/core/overflow-auto.js +6 -4
  45. package/src/js/core/switcher.js +3 -1
  46. package/src/js/core/toggle.js +14 -1
  47. package/src/js/util/filter.js +2 -2
  48. package/src/less/components/form.less +1 -1
  49. package/src/less/components/navbar.less +1 -1
  50. package/src/scss/components/form.scss +1 -1
  51. package/src/scss/components/navbar.scss +1 -1
  52. package/src/scss/variables-theme.scss +1 -1
  53. package/src/scss/variables.scss +1 -1
  54. package/tests/switcher.html +7 -1
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.7.3-dev.af32c46e8",
5
+ "version": "3.7.4-dev.e74b22b13",
6
6
  "main": "dist/js/uikit.js",
7
7
  "style": "dist/css/uikit.css",
8
8
  "sideEffects": [
@@ -2,7 +2,7 @@ import {active} from './drop';
2
2
  import Class from '../mixin/class';
3
3
  import FlexBug from '../mixin/flex-bug';
4
4
  import Container from '../mixin/container';
5
- import {$, $$, addClass, after, assign, css, hasClass, height, includes, isRtl, isVisible, matches, noop, parent, Promise, query, remove, toFloat, Transition, within} from 'uikit-util';
5
+ import {$, $$, addClass, after, assign, css, findIndex, hasAttr, hasClass, height, includes, isRtl, isVisible, matches, noop, once, parent, Promise, query, remove, selFocusable, toFloat, Transition, within} from 'uikit-util';
6
6
 
7
7
  const navItem = '.uk-navbar-nav > li > a, .uk-navbar-item, .uk-navbar-toggle';
8
8
 
@@ -91,8 +91,13 @@ export default {
91
91
  get({clsDrop}, $el) {
92
92
  const dropdowns = $$(`.${clsDrop}`, $el);
93
93
 
94
- if (this.container !== $el) {
95
- $$(`.${clsDrop}`, this.container).forEach(el => !includes(dropdowns, el) && dropdowns.push(el));
94
+ if (this.dropContainer !== $el) {
95
+ $$(`.${clsDrop}`, this.dropContainer).forEach(el => {
96
+ const dropdown = this.getDropdown(el);
97
+ if (!includes(dropdowns, el) && dropdown && dropdown.target && within(dropdown.target, this.$el)) {
98
+ dropdowns.push(el);
99
+ }
100
+ });
96
101
  }
97
102
 
98
103
  return dropdowns;
@@ -108,6 +113,10 @@ export default {
108
113
 
109
114
  immediate: true
110
115
 
116
+ },
117
+
118
+ toggles({dropdown}, $el) {
119
+ return $$(dropdown, $el);
111
120
  }
112
121
 
113
122
  },
@@ -120,7 +129,7 @@ export default {
120
129
  events: [
121
130
 
122
131
  {
123
- name: 'mouseover',
132
+ name: 'mouseover focusin',
124
133
 
125
134
  delegate() {
126
135
  return this.dropdown;
@@ -128,13 +137,87 @@ export default {
128
137
 
129
138
  handler({current}) {
130
139
  const active = this.getActive();
131
- if (active && active.target && !within(active.target, current) && !active.tracker.movesTo(active.$el)) {
140
+ if (active && includes(active.mode, 'hover') && active.target && !within(active.target, current) && !active.tracker.movesTo(active.$el)) {
132
141
  active.hide(false);
133
142
  }
134
143
  }
135
144
 
136
145
  },
137
146
 
147
+ {
148
+ name: 'keydown',
149
+
150
+ delegate() {
151
+ return this.dropdown;
152
+ },
153
+
154
+ handler(e) {
155
+
156
+ const {current, keyCode} = e;
157
+ const active = this.getActive();
158
+
159
+ if (keyCode === keyMap.DOWN && hasAttr(current, 'aria-expanded')) {
160
+
161
+ e.preventDefault();
162
+
163
+ if (!active || active.target !== current) {
164
+ current.click();
165
+ once(this.dropContainer, 'show', ({target}) => focusFirstFocusableElement(target));
166
+ } else {
167
+ focusFirstFocusableElement(active.$el);
168
+ }
169
+
170
+ }
171
+
172
+ handleNavItemNavigation(e, this.toggles, active);
173
+ }
174
+ },
175
+
176
+ {
177
+ name: 'keydown',
178
+
179
+ el() {
180
+ return this.dropContainer;
181
+ },
182
+
183
+ delegate() {
184
+ return `.${this.clsDrop}`;
185
+ },
186
+
187
+ handler(e) {
188
+
189
+ const {current, keyCode} = e;
190
+
191
+ if (!includes(this.dropdowns, current)) {
192
+ return;
193
+ }
194
+
195
+ const active = this.getActive();
196
+ const elements = $$(selFocusable, current);
197
+ const i = findIndex(elements, el => matches(el, ':focus'));
198
+
199
+ if (keyCode === keyMap.UP) {
200
+ e.preventDefault();
201
+ if (i > 0) {
202
+ elements[i - 1].focus();
203
+ }
204
+ }
205
+
206
+ if (keyCode === keyMap.DOWN) {
207
+ e.preventDefault();
208
+ if (i < elements.length - 1) {
209
+ elements[i + 1].focus();
210
+ }
211
+ }
212
+
213
+ if (keyCode === keyMap.ESC) {
214
+ active && active.target && active.target.focus();
215
+ }
216
+
217
+ handleNavItemNavigation(e, this.toggles, active);
218
+ }
219
+ },
220
+
138
221
  {
139
222
  name: 'mouseleave',
140
223
 
@@ -142,10 +225,14 @@ export default {
142
225
  return this.dropbar;
143
226
  },
144
227
 
228
+ filter() {
229
+ return this.dropbar;
230
+ },
231
+
145
232
  handler() {
146
233
  const active = this.getActive();
147
234
 
148
- if (active && !this.dropdowns.some(el => matches(el, ':hover'))) {
235
+ if (active && includes(active.mode, 'hover') && !this.dropdowns.some(el => matches(el, ':hover'))) {
149
236
  active.hide();
150
237
  }
151
238
  }
@@ -249,7 +336,7 @@ export default {
249
336
  methods: {
250
337
 
251
338
  getActive() {
252
- return active && includes(active.mode, 'hover') && within(active.target, this.$el) && active;
339
+ return active && within(active.target, this.$el) && active;
253
340
  },
254
341
 
255
342
  transitionTo(newHeight, el) {
@@ -282,3 +369,45 @@ export default {
282
369
  }
283
370
 
284
371
  };
372
+
373
+ function handleNavItemNavigation(e, toggles, active) {
374
+
375
+ const {current, keyCode} = e;
376
+ const target = active && active.target || current;
377
+ const i = toggles.indexOf(target);
378
+
379
+ // Left
380
+ if (keyCode === keyMap.LEFT && i > 0) {
381
+ active && active.hide(false);
382
+ toggles[i - 1].focus();
383
+ }
384
+
385
+ // Right
386
+ if (keyCode === keyMap.RIGHT && i < toggles.length - 1) {
387
+ active && active.hide(false);
388
+ toggles[i + 1].focus();
389
+ }
390
+
391
+ if (keyCode === keyMap.TAB) {
392
+ target.focus();
393
+ active && active.hide(false);
394
+ }
395
+ }
396
+
397
+ function focusFirstFocusableElement(el) {
398
+ if (!$(':focus', el)) {
399
+ const focusEl = $(selFocusable, el);
400
+ if (focusEl) {
401
+ focusEl.focus();
402
+ }
403
+ }
404
+ }
405
+
406
+ const keyMap = {
407
+ TAB: 9,
408
+ ESC: 27,
409
+ LEFT: 37,
410
+ UP: 38,
411
+ RIGHT: 39,
412
+ DOWN: 40
413
+ };
@@ -7,12 +7,14 @@ export default {
7
7
 
8
8
  props: {
9
9
  selContainer: String,
10
- selContent: String
10
+ selContent: String,
11
+ minHeight: Number
11
12
  },
12
13
 
13
14
  data: {
14
15
  selContainer: '.uk-modal',
15
- selContent: '.uk-modal-dialog'
16
+ selContent: '.uk-modal-dialog',
17
+ minHeight: 150
16
18
  },
17
19
 
18
20
  computed: {
@@ -28,7 +30,7 @@ export default {
28
30
  },
29
31
 
30
32
  connected() {
31
- css(this.$el, 'minHeight', 150);
33
+ css(this.$el, 'minHeight', this.minHeight);
32
34
  },
33
35
 
34
36
  update: {
@@ -41,7 +43,7 @@ export default {
41
43
 
42
44
  return {
43
45
  current: toFloat(css(this.$el, 'maxHeight')),
44
- max: Math.max(150, height(this.container) - (dimensions(this.content).height - height(this.$el)))
46
+ max: Math.max(this.minHeight, height(this.container) - (dimensions(this.content).height - height(this.$el)))
45
47
  };
46
48
  },
47
49
 
@@ -10,6 +10,7 @@ export default {
10
10
  props: {
11
11
  connect: String,
12
12
  toggle: String,
13
+ itemNav: String,
13
14
  active: Number,
14
15
  swiping: Boolean
15
16
  },
@@ -17,6 +18,7 @@ export default {
17
18
  data: {
18
19
  connect: '~.uk-switcher',
19
20
  toggle: '> * > :first-child',
21
+ itemNav: false,
20
22
  active: 0,
21
23
  swiping: true,
22
24
  cls: 'uk-active',
@@ -92,7 +94,7 @@ export default {
92
94
  name: 'click',
93
95
 
94
96
  el() {
95
- return this.connects;
97
+ return this.connects.concat(this.itemNav ? queryAll(this.itemNav, this.$el) : []);
96
98
  },
97
99
 
98
100
  delegate() {
@@ -86,6 +86,18 @@ export default {
86
86
 
87
87
  },
88
88
 
89
+ {
90
+ name: 'keydown',
91
+
92
+ handler(e) {
93
+ // Space
94
+ if (e.keyCode === 32) {
95
+ e.preventDefault();
96
+ this.$el.click();
97
+ }
98
+ }
99
+ },
100
+
89
101
  {
90
102
 
91
103
  name: 'click',
@@ -99,7 +111,7 @@ export default {
99
111
  let link;
100
112
  if (closest(e.target, 'a[href="#"], a[href=""]')
101
113
  || (link = closest(e.target, 'a[href]')) && (
102
- !attr(this.$el, 'aria-expanded')
114
+ attr(this.$el, 'aria-expanded') !== 'true'
103
115
  || link.hash && matches(this.target, link.hash)
104
116
  )
105
117
  ) {
@@ -192,3 +204,4 @@ export default {
192
204
  }
193
205
 
194
206
  };
207
+
@@ -1,4 +1,3 @@
1
- import {hasAttr} from './attr';
2
1
  import {inBrowser} from './env';
3
2
  import {isDocument, isElement, isString, noop, startsWith, toNode, toNodes} from './lang';
4
3
 
@@ -33,8 +32,9 @@ export function isInput(element) {
33
32
  return toNodes(element).some(element => matches(element, selInput));
34
33
  }
35
34
 
35
+ export const selFocusable = `${selInput},a[href],[tabindex]`;
36
36
  export function isFocusable(element) {
37
- return isInput(element) || matches(element, 'a[href],button') || hasAttr(element, 'tabindex');
37
+ return matches(element, selFocusable);
38
38
  }
39
39
 
40
40
  export function parent(element) {
@@ -73,7 +73,7 @@
73
73
 
74
74
  @form-select-padding-right: 20px;
75
75
  @form-select-icon-color: @global-color;
76
- @form-select-option-color: #444;
76
+ @form-select-option-color: @global-color;
77
77
  @form-select-disabled-icon-color: @global-muted-color;
78
78
 
79
79
  @form-datalist-padding-right: 20px;
@@ -251,7 +251,7 @@
251
251
 
252
252
  .uk-navbar-nav > li:hover > a,
253
253
  .uk-navbar-nav > li > a:focus,
254
- .uk-navbar-nav > li > a.uk-open {
254
+ .uk-navbar-nav > li > a[aria-expanded="true"] {
255
255
  color: @navbar-nav-item-hover-color;
256
256
  outline: none;
257
257
  .hook-navbar-nav-item-hover;
@@ -73,7 +73,7 @@ $form-width-large: 500px !default;
73
73
 
74
74
  $form-select-padding-right: 20px !default;
75
75
  $form-select-icon-color: $global-color !default;
76
- $form-select-option-color: #444 !default;
76
+ $form-select-option-color: $global-color !default;
77
77
  $form-select-disabled-icon-color: $global-muted-color !default;
78
78
 
79
79
  $form-datalist-padding-right: 20px !default;
@@ -251,7 +251,7 @@ $navbar-dropbar-z-index: $global-z-index - 20 !default;
251
251
 
252
252
  .uk-navbar-nav > li:hover > a,
253
253
  .uk-navbar-nav > li > a:focus,
254
- .uk-navbar-nav > li > a.uk-open {
254
+ .uk-navbar-nav > li > a[aria-expanded="true"] {
255
255
  color: $navbar-nav-item-hover-color;
256
256
  outline: none;
257
257
  @if(mixin-exists(hook-navbar-nav-item-hover)) {@include hook-navbar-nav-item-hover();}
@@ -413,7 +413,7 @@ $form-width-medium: 200px !default;
413
413
  $form-width-large: 500px !default;
414
414
  $form-select-padding-right: 20px !default;
415
415
  $form-select-icon-color: $global-color !default;
416
- $form-select-option-color: #444 !default;
416
+ $form-select-option-color: $global-color !default;
417
417
  $form-select-disabled-icon-color: $global-muted-color !default;
418
418
  $form-datalist-padding-right: 20px !default;
419
419
  $form-datalist-icon-color: $global-color !default;
@@ -411,7 +411,7 @@ $form-width-medium: 200px !default;
411
411
  $form-width-large: 500px !default;
412
412
  $form-select-padding-right: 20px !default;
413
413
  $form-select-icon-color: $global-color !default;
414
- $form-select-option-color: #444 !default;
414
+ $form-select-option-color: $global-color !default;
415
415
  $form-select-disabled-icon-color: $global-muted-color !default;
416
416
  $form-datalist-padding-right: 20px !default;
417
417
  $form-datalist-icon-color: $global-color !default;
@@ -334,7 +334,7 @@
334
334
  <td><code>connect</code></td>
335
335
  <td>CSS selector</td>
336
336
  <td>~.uk-switcher</td>
337
- <td>Related items container. By default succeeding elements with class 'uk-switcher'.</td>
337
+ <td>Related items container. By default, succeeding elements with class 'uk-switcher'.</td>
338
338
  </tr>
339
339
  <tr>
340
340
  <td><code>toggle</code></td>
@@ -342,6 +342,12 @@
342
342
  <td>> * > :first-child</td>
343
343
  <td>Toggle selector - triggers content switching on click.</td>
344
344
  </tr>
345
+ <tr>
346
+ <td><code>itemNav</code></td>
347
+ <td>CSS selector</td>
348
+ <td>false</td>
349
+ <td>Related nav container. By default, nav items are found in related items container only.</td>
350
+ </tr>
345
351
  <tr>
346
352
  <td><code>active</code></td>
347
353
  <td>Number</td>