efront 3.25.7 → 3.25.11

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 (41) hide show
  1. package/apps/_index.html +1 -1
  2. package/coms/basic/Item.js +13 -3
  3. package/coms/basic/Speed.js +36 -17
  4. package/coms/basic/Tree.js +4 -4
  5. package/coms/{zimoli → basic}/cancelAnimationFrame.js +1 -0
  6. package/coms/basic/lazy.js +29 -12
  7. package/coms/basic/loader.js +12 -9
  8. package/coms/basic/mark.js +1 -1
  9. package/coms/basic/mark_test.js +7 -0
  10. package/coms/basic/renderExpress.js +3 -3
  11. package/coms/frame/route.js +12 -3
  12. package/coms/kugou/playList.less +6 -0
  13. package/coms/zimoli/bindAccesskey.js +13 -5
  14. package/coms/zimoli/button.js +2 -1
  15. package/coms/zimoli/getGenerator.js +24 -8
  16. package/coms/zimoli/getName.js +7 -5
  17. package/coms/zimoli/hexagon.js +33 -0
  18. package/coms/zimoli/innerHeight.js +2 -1
  19. package/coms/zimoli/innerWidth.js +2 -1
  20. package/coms/zimoli/list.js +146 -17
  21. package/coms/zimoli/menu.js +7 -3
  22. package/coms/zimoli/menuItem.html +8 -3
  23. package/coms/zimoli/menuItem.js +2 -2
  24. package/coms/zimoli/menuItem.less +3 -2
  25. package/coms/zimoli/menuList.js +188 -196
  26. package/coms/zimoli/menuList.less +1 -1
  27. package/coms/zimoli/moveupon.js +1 -0
  28. package/coms/zimoli/on.js +54 -16
  29. package/coms/zimoli/onmousewheel.js +1 -1
  30. package/coms/zimoli/popup.js +17 -22
  31. package/coms/zimoli/render.js +7 -5
  32. package/coms/zimoli/resize.js +1 -0
  33. package/coms/zimoli/slider.js +23 -9
  34. package/coms/zimoli/slider_test.js +1 -1
  35. package/coms/zimoli/table.js +7 -1
  36. package/coms/zimoli/touchList.js +22 -20
  37. package/coms/zimoli/vbox.js +11 -8
  38. package/docs/main.js +3 -0
  39. package/package.json +2 -2
  40. package/public/efront.js +1 -1
  41. package/coms/zimoli/menuList.html +0 -6
@@ -9,51 +9,21 @@ var release = function () {
9
9
  var clear = function () {
10
10
  clearTimeout(releaseTimer);
11
11
  };
12
- var unfocus = function () {
12
+ var unfocus = lazy(function () {
13
+ if (mounted_menus.indexOf(document.activeElement) >= 0) return;
13
14
  remove(mounted_menus);
14
- this.ispop = false;
15
- this.setFocus(null);
16
- };
17
- var setFocus = function (focused) {
18
- if (focused && focused.hasAttribute("disabled")) return;
19
- var page = this;
20
- if (focused) {
21
- if (page.focused !== focused) {
22
- if (page.focused) removeClass(page.focused, 'focus');
23
- if (focused) addClass(focused, "focus");
24
- page.focused = focused;
25
- }
26
- }
27
- else {
28
- if (page.focused) {
29
- removeClass(page.focused, 'focus');
30
- page.focused = null;
31
- }
15
+ if (root_menu) root_menu.setFocus(null);
16
+ var root = this.root || this;
17
+ if (root.ispop === 1) root.ispop = false;
18
+ root.actived = null;
19
+ root.setFocus(null);
20
+ });
21
+ var unblur = function () {
22
+ if (document.activeElement !== this) {
23
+ this.tabIndex = 0;
24
+ this.focus();
32
25
  }
33
26
  };
34
- var moveFocus = function (delta) {
35
- var page = this;
36
- var focused = page.focused;
37
- var newIndex = 0;
38
- if (!focused) {
39
- if (delta > 0) newIndex = 0;
40
- else newIndex = page.total - 1;
41
- }
42
- else {
43
- var newIndex = focused.index + delta;
44
- var total = page.total;
45
- if (newIndex < 0) newIndex = total + newIndex;
46
- if (newIndex > total - 1) newIndex = newIndex - total;
47
- }
48
- do {
49
- var e = page.getIndexedElement(newIndex);
50
- if (newIndex < 0) newIndex = total + newIndex;
51
- newIndex += delta;
52
- } while (e && (e.hasAttribute("disabled") || e.hasAttribute("line")));
53
- if (!e) page.setFocus(null);
54
- else if (page.ispop !== true) page.setFocus(e), page.open(e);
55
- else page.setFocus(e);
56
- };
57
27
  var openFocus = function () {
58
28
  var menu = mounted_menus[mounted_menus.length - 1] || root_menu;
59
29
  if (!menu.ispop) menu.ispop = 1;
@@ -76,19 +46,24 @@ var keyAction = function (deltax, deltay) {
76
46
  if (fmenu && fmenu.children && fmenu.children.length) {
77
47
  openFocus();
78
48
  }
79
- else if (parent && parent.direction !== 'y') {
80
- parent.moveFocus(deltax);
49
+ else if (parent) {
50
+ var index = mounted_menus.lastIndexOf(parent);
51
+ while (parent && parent.direction === 'y') {
52
+ parent = mounted_menus[--index];
53
+ }
54
+ if (!parent && root_menu.direction !== 'y') parent = root_menu;
55
+ if (parent) parent.moveFocus(deltax, parent.ispop);
81
56
  }
82
57
  }
83
58
  else if (deltax === -1) {
84
59
  // left
85
60
  if (parent) {
86
61
  if (parent.direction === 'y') remove(mounted_menus.pop());
87
- else parent.moveFocus(deltax);
62
+ else parent.moveFocus(deltax, parent.ispop);
88
63
  }
89
64
  }
90
65
  else {
91
- menu.moveFocus(deltay);
66
+ menu.moveFocus(deltay, menu.ispop);
92
67
  }
93
68
  }
94
69
  else {
@@ -96,19 +71,24 @@ var keyAction = function (deltax, deltay) {
96
71
  // down
97
72
  if (menu.focused) var fmenu = menu.focused.menu;
98
73
  if (fmenu && fmenu.children && fmenu.children.length) openFocus();
99
- else if (parent && parent.direction === 'y') {
100
- parent.moveFocus(deltay);
74
+ else if (parent) {
75
+ var index = mounted_menus.lastIndexOf(parent);
76
+ while (parent && parent.direction !== 'y') {
77
+ parent = mounted_menus[--index];
78
+ }
79
+ if (!parent && root_menu.direction === 'y') parent = root_menu;
80
+ if (parent) parent.moveFocus(deltay, parent.ispop);
101
81
  }
102
82
  }
103
83
  else if (deltay === -1) {
104
84
  // up
105
85
  if (parent) {
106
86
  if (parent.direction !== 'y') remove(mounted_menus.pop());
107
- else parent.moveFocus(deltay);
87
+ else parent.moveFocus(deltay, parent.ispop);
108
88
  }
109
89
  }
110
90
  else {
111
- menu.moveFocus(deltax);
91
+ menu.moveFocus(deltax, menu.ispop);
112
92
  }
113
93
  }
114
94
  };
@@ -117,7 +97,7 @@ function keyalt() {
117
97
  else if (root_menu === this && root_menu !== document.activeElement) {
118
98
  root_menu.tabIndex = 0;
119
99
  root_menu.focus();
120
- root_menu.setFocus(root_menu.firstMenu);
100
+ root_menu.setFocus(root_menu.getIndexedElement(0));
121
101
  }
122
102
  }
123
103
  function keytab(event) {
@@ -144,26 +124,49 @@ function keyleft() {
144
124
  function keyright() {
145
125
  keyAction(1, 0);
146
126
  }
147
- function keyspace() {
127
+ function getFocusedMenu() {
148
128
  var menu = mounted_menus[mounted_menus.length - 1];
149
129
  if (!menu || !menu.focused) menu = mounted_menus[mounted_menus.length - 2] || root_menu;
150
- if (menu.focused) {
130
+ if (mounted_menus.indexOf(document.activeElement) >= 0 || document.activeElement === root_menu) return menu;
131
+ }
132
+ function keyspace() {
133
+ var menu = getFocusedMenu();
134
+ if (menu && menu.focused) {
151
135
  menu.focused.click();
152
136
  }
153
137
  }
138
+ function keyhome() {
139
+ var menu = getFocusedMenu();
140
+ if (menu) menu.moveFocus("home", true);
141
+ }
142
+ function keyend() {
143
+ var menu = getFocusedMenu();
144
+ if (menu) menu.moveFocus("end", true);
145
+ }
146
+ function keypagedown() {
147
+ var menu = getFocusedMenu();
148
+ if (menu) menu.moveFocus("pagedown", true);
149
+ }
150
+ function keypageup() {
151
+ var menu = getFocusedMenu();
152
+ if (menu) menu.moveFocus("pageup", true);
153
+ }
154
154
  function register() {
155
155
  var menu = this;
156
156
  // if (!root_menu) root_menu = this;
157
- bind('keydown.alt.')(menu, keyalt);
158
- bind('keydown.esc')(menu, keyesc);
159
- on('keydown.tab')(menu, keytab);
160
- on('keydown.left')(menu, keyleft);
161
- on('keydown.right')(menu, keyright);
162
- on('keydown.up')(menu, keyup);
163
- on('keydown.down')(menu, keydown);
164
- on('keydown.enter')(menu, keyspace);
165
- on('keydown.space')(menu, keyspace);
166
- on("contextmenu")(menu, e => e.preventDefault());
157
+ bind('keydown.only.alt.')(menu, keyalt);
158
+ bind('keydown.esc.only')(menu, keyesc);
159
+ on('keydown.pageup.only')(menu, keypageup);
160
+ on('keydown.pagedown.only')(menu, keypagedown);
161
+ on('keydown.home.only')(menu, keyhome);
162
+ on('keydown.end.only')(menu, keyend);
163
+ on('keydown.tab.only')(menu, keytab);
164
+ on('keydown.left.only')(menu, keyleft);
165
+ on('keydown.right.only')(menu, keyright);
166
+ on('keydown.up.only')(menu, keyup);
167
+ on('keydown.down.only')(menu, keydown);
168
+ on('keydown.enter.only')(menu, keyspace);
169
+ on('keydown.space.only')(menu, keyspace);
167
170
  }
168
171
  function main() {
169
172
  var page, items, active = _active, direction = 'y';
@@ -179,71 +182,64 @@ function main() {
179
182
  var main = this;
180
183
  if (direction == 'y') page.ispop = true;
181
184
  var istoolbar = direction === 't';
182
- function popMenu(item, target, emptyFocus) {
185
+ function popMenu(item, target) {
183
186
  if (page.actived) {
184
187
  clear();
185
188
  remove(page.actived);
186
189
  }
187
- if (emptyFocus !== false) page.setFocus(target);
188
190
  if (!item.length) return;
189
- page.setFocus(target);
190
- var clone = template.cloneNode();
191
- clone.$parentScopes = page.$parentScopes;
192
- clone.$scope = page.$scope;
193
- clone.$src = src;
194
- clone.innerHTML = template.innerHTML;
195
- var menu = main(clone, item.children, active);
191
+ var menu = item.menu;
192
+ if (!menu) {
193
+ var clone = template.cloneNode();
194
+ clone.$parentScopes = page.$parentScopes;
195
+ clone.$scope = page.$scope;
196
+ clone.$src = src;
197
+ clone.innerHTML = template.innerHTML;
198
+ menu = item.menu = main(clone, item.children, active);
199
+ }
196
200
  mounted_menus.push(menu);
197
201
  page.actived = menu;
198
202
  menu.root = page.root || page;
199
- menu.go(0);
203
+ if (menu.go) menu.go(0);
200
204
  popup(menu, target);
201
205
  if (page.ispop === true) {
202
206
  } else {
203
207
  page.ispop = 1;
204
- page.tabIndex = 0;
205
- page.focus();
206
208
  }
207
- on("mousedown")(menu, e => e.preventDefault());
208
- once("remove")(menu, function () {
209
+ on("remove")(menu, function () {
209
210
  removeFromList(mounted_menus, this);
211
+ menu.setFocus(null);
212
+ css(menu, "width:;height:;max-height:;max-width:;");
210
213
  });
214
+ return menu;
211
215
  }
212
216
  on("blur")(page, unfocus);
213
- var template = page.tempalte || document.createElement("ylist");
214
- if (!page.tempalte) {
217
+ var template = page.$template || document.createElement(page.tagName);
218
+ if (!page.$template) {
215
219
  template.className = '';
216
220
  template.removeAttribute('mode');
217
221
  template.innerHTML = page.innerHTML;
218
- page.tempalte = template;
222
+ page.$template = template;
219
223
  }
220
- var popTimer = 0, byMousedown;
221
- var open = function (time) {
222
- cancel();
223
- var elem = this;
224
- time = +time;
225
- if (byMousedown && !time) return;
226
- if (time) byMousedown = false;
227
-
228
- if (page.ispop || time) popTimer = setTimeout(function () {
229
- if (time) byMousedown = elem;
230
- page.setFocus(elem);
231
- popMenu(elem.menu, elem);
232
- }, time || 10);
224
+ var enterMenu = lazy(function (menu) {
225
+ if (page.ispop) {
226
+ page.setFocus(menu);
227
+ popMenu(menu.menu, menu);
228
+ }
229
+ }, 60);
230
+ on('pointerdown')(page, unblur);
231
+ var autoremove = function () {
232
+ document.activeElement.blur();
233
233
  };
234
- var cancel = function () {
235
- clear();
236
- clearTimeout(popTimer);
237
- }
238
- var fire = async function () {
239
- cancel();
234
+ var activeMenu = function () {
240
235
  if (this.menu.line) return;
241
- if (byMousedown) return;
242
236
  if (this.hasAttribute("disabled") || this.hasAttribute('line')) return;
243
237
  var pop = active(this.menu.value, this);
244
238
  if (pop === false) return;
245
239
  var root = page.root || page;
246
- if (root.direction === 't' || root.selected) {
240
+ var istool = root.direction === 't' || root.selected
241
+ if (root.ispop === 1) root.ispop = false;
242
+ if (istool) {
247
243
  var menu = this.menu;
248
244
  if (root.selected) root.selected.setActive(false);
249
245
  if (root !== page) {
@@ -257,130 +253,126 @@ function main() {
257
253
  }
258
254
  menu.setActive(true);
259
255
  root.selected = target.menu;
256
+ autoremove();
257
+ return;
260
258
  }
261
- if (root.ispop === 1) root.ispop = false;
262
259
  if (page.actived && page.actived.target === this) {
263
- while (mounted_menus.length && mounted_menus[mounted_menus.length - 1] !== page.actived) remove(mounted_menus.pop());
264
- if (!mounted_menus.length) {
265
- if (byMousedown === false) return;
260
+ if (mounted_menus.indexOf(page.actived) >= 0) while (mounted_menus.length && mounted_menus[mounted_menus.length - 1] !== page.actived) remove(mounted_menus.pop());
261
+ if (!mounted_menus.length || page === mounted_menus[mounted_menus.length - 1]) {
266
262
  popMenu(this.menu, this, false);
267
263
  }
268
264
  else {
269
265
  remove(mounted_menus.pop());
266
+ page.actived = null;
270
267
  }
271
268
  }
272
269
  else {
273
270
  while (mounted_menus.length && mounted_menus[mounted_menus.length - 1] !== page) remove(mounted_menus.pop());
274
- if (byMousedown === false) return;
271
+ page.actived = null;
275
272
  popMenu(this.menu, this, false);
276
273
  if (!page.actived) {
277
- (page.root || page).blur();
274
+ autoremove();
278
275
  }
279
276
  }
280
277
  };
281
- var open1 = function (event) {
282
- if (event.which === 3) event.preventDefault();
283
- if (istoolbar) open.call(this, event.which === 3 ? 20 : 600);
278
+ var pressMenu = function (event) {
279
+ if (event.which === 3) {
280
+ popMenu(this.menu, this);
281
+ }
282
+ else {
283
+ switchMenu.done = false;
284
+ switchMenu.call(this);
285
+ }
284
286
  };
285
- if (!page.children.length || page.menutype === 1) {
286
- page.menutype = 1;
287
- var hasIcon = function () {
288
- var menus = items;
289
- for (var menu of menus) {
290
- if (menu.icon) {
291
- return true;
292
- }
287
+ var clickMenu = function (event) {
288
+ switchMenu.cancel();
289
+ if (!switchMenu.done) activeMenu.call(this);
290
+ };
291
+
292
+
293
+ var switchMenu = lazy(function (event) {
294
+ if (onclick.preventClick) return;
295
+ popMenu(this.menu, this);
296
+ switchMenu.done = true;
297
+ }, 300);
298
+ var hasIcon = function () {
299
+ var menus = items;
300
+ for (var menu of menus) {
301
+ if (menu.icon) {
302
+ return true;
293
303
  }
294
- return false;
295
- };
296
- var $scope = {
297
- "menu-item"(e, s) {
298
- if (e && s === e.$scope) s = itemName ? s[itemName] : s.menu;
299
- var a = button(
300
- menuItem(e, s.value, this.hasIcon)
301
- );
302
- if (!page.firstMenu) {
303
- page.firstMenu = a;
304
- page.total = items.length;
305
- }
306
- a.menu = s;
307
- return a;
308
- },
309
- hasIcon: hasIcon(),
310
- open: fire,
311
- cancel,
312
- popMenu: open,
313
- popMenu1: open1
314
- };
315
- if (page.$src) {
316
- var src = page.$src;
317
- var itemName = src.itemName;
318
- var className = `{'has-children':${itemName}.children&&${itemName}.children.length,
304
+ }
305
+ return false;
306
+ };
307
+ var $scope = {
308
+ "menu-item"(e, s) {
309
+ if (e && s === e.$scope) s = itemName ? s[itemName] : s.menu;
310
+ var a = button(
311
+ menuItem(e, s, this.hasIcon)
312
+ );
313
+ a.menu = s;
314
+ return a;
315
+ },
316
+ hasIcon: hasIcon(),
317
+ enterMenu,
318
+ clickMenu,
319
+ pressMenu,
320
+ };
321
+ if (!page.$src) page.$src = render.parseRepeat("m in menus");
322
+ var src = page.$src;
323
+ var itemName = src.itemName;
324
+ var className = `{'has-children':${itemName}.children&&${itemName}.children.length,
319
325
  'warn':${itemName}.warn,
320
326
  actived:${itemName}.isActived()
321
327
  }`;
322
- var notHidden = `!${itemName}.hidden`;
323
- var generator = getGenerator(page, 'menu-item');
324
- page.$generatorScopes.push($scope);
325
- list(page, function (index) {
326
- var item = items[index];
327
- if (!item) return;
328
- if (!(item instanceof Item)) item = new Item(item);
329
- var a = $scope["menu-item"](null, item);
330
- if (src.itemName) a.setAttribute("e-if", notHidden);
331
- a.setAttribute("e-class", className);
332
- a.setAttribute("on-mouseleave", "cancel.call(this)");
333
- a.setAttribute("on-mouseenter", "popMenu.call(this)");
334
- a.setAttribute("on-pointermove", "popMenu.call(this)");
335
- a.setAttribute("on-click", "open.call(this)");
336
- a.setAttribute("_menu", src.itemName);
337
- if (istoolbar) a.setAttribute("on-pointerdown", "popMenu1");
338
- a = generator(index, item, a);
339
- return a;
340
- });
341
- }
342
- else {
343
- page.innerHTML = menuList;
344
- $scope.menus = items.map(i => i instanceof Item ? i : new Item(i));
345
- render(page, $scope);
346
- vbox(page);
347
- }
348
- page.total = items.length;
349
- page.renders.unshift(function () {
350
- this.$scope.hasIcon = hasIcon();
351
- });
352
- }
353
- else {
354
- var generator = getGenerator(page, 'menu-item');
355
- list(page, function (index) {
356
- var elem = generator(index);
357
- if (!elem) return;
358
- if (!page.firstMenu) {
359
- page.firstMenu = elem;
360
- page.total = this.src.length;
328
+ var notHidden = `!${itemName}.hidden`;
329
+ var ItemTemplate = document.createElement('menu-item');
330
+ ItemTemplate.setAttribute("on-click", "clickMenu.call(this,event)");
331
+ if (istoolbar) ItemTemplate.setAttribute("on-pointerdown", "pressMenu.call(this,event)");
332
+ else ItemTemplate.setAttribute("on-mouseenter", `enterMenu(this)`);
333
+ ItemTemplate.setAttribute("e-class", className);
334
+ if (src.itemName) ItemTemplate.setAttribute("e-if", notHidden);
335
+ ItemTemplate.setAttribute("_menu", src.itemName);
336
+ ItemTemplate.innerHTML = menuItem.template;
337
+ var generator = getGenerator(page, ItemTemplate);
338
+ page.$generatorScopes.push($scope);
339
+ list(page, function (index) {
340
+ var item = items[index];
341
+ if (!item) return;
342
+ if (item.constructor !== Item) item = new Item(item);
343
+ if (istoolbar) {
344
+ if (item.constructor === Item && item.length && !item.extended) {
345
+ item.extends(item[0]);
361
346
  }
362
- elem.menu = this.src[index];
363
- on("mouseleave")(elem, cancel);
364
- on("mouseenter")(elem, open);
365
- on("pointermove")(elem, cancel);
366
- if (istoolbar) on("pointerdown")(elem, open1);
367
- on("click")(elem, fire);
368
- return elem;
369
- }, direction);
370
- }
347
+ }
348
+ return generator(index, item);
349
+ }, direction);
350
+ page.renders.unshift(function () {
351
+ this.$scope.hasIcon = hasIcon();
352
+ });
371
353
  page.open = function (a) {
372
- open.call(a);
354
+ if (!a.menu || !a.menu.length) {
355
+ return;
356
+ }
357
+ var m = popMenu(a.menu, a);
358
+ m.moveFocus("home");
373
359
  };
374
360
  page.active = function (a) {
375
- fire.call(a);
361
+ activeMenu.call(a);
376
362
  };
377
- page.setFocus = setFocus;
378
- page.moveFocus = moveFocus;
363
+ on("focused")(page, function () {
364
+ var focused = page.focused;
365
+ if (page.ispop && page === root_menu) popMenu(focused.menu, focused, false);
366
+ });
379
367
  page.openFocus = openFocus;
380
368
  page.closeFocus = closeFocus;
381
369
  page.direction = direction;
382
- register.call(page);
370
+ on("contextmenu")(page, e => e.preventDefault());
371
+ on("mouseleave")(page, function () {
372
+ enterMenu.cancel();
373
+ });
383
374
  page.registerAsRoot = function () {
375
+ register.call(this);
384
376
  root_menu = this;
385
377
  };
386
378
  return page;
@@ -6,6 +6,7 @@
6
6
  box-shadow: 0 0 20px -6px rgba(0, 0, 0, .1);
7
7
  border: 1px solid #0003;
8
8
  padding: 6px 0;
9
+ outline: none;
9
10
 
10
11
  >menu-item {
11
12
  display: block;
@@ -64,5 +65,4 @@
64
65
 
65
66
  i {
66
67
  display: inline-block;
67
- width: 20px;
68
68
  }
@@ -30,6 +30,7 @@ if (/Firefox/.test(navigator.userAgent)) on('dragstart')(document, function (e)
30
30
  }
31
31
  });
32
32
  var locktouch = function (target) {
33
+ if (target.resizable) return false;
33
34
  if (/(input|textarea|select)/i.test(target.tagName) || getTargetIn(a => String(a.contentEditable) === 'true' || a.draggable, target)) {
34
35
  return true;
35
36
  } else {