efront 3.16.1 → 3.18.0

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 (71) hide show
  1. package/apps/pivot/api/edit.js +1 -0
  2. package/apps/pivot/api/list.js +20 -0
  3. package/apps/pivot/api.yml +8 -4
  4. package/apps/pivot/dict/edit.js +1 -0
  5. package/apps/pivot/dict/list.js +12 -0
  6. package/apps/pivot/link/chat.js +29 -0
  7. package/apps/pivot/link/chat.less +5 -0
  8. package/apps/pivot/link/list.html +8 -3
  9. package/apps/pivot/link/list.js +23 -2
  10. package/apps/pivot/link/list.less +3 -0
  11. package/apps/pivot/log/boot.js +13 -10
  12. package/apps/pivot/main.less +1 -0
  13. package/apps/pivot/menu.yml +4 -1
  14. package/apps/pivot/proxy/list.js +9 -8
  15. package/apps/pivot/task/list.js +1 -1
  16. package/apps/pivot/user/api.html +2 -0
  17. package/apps/pivot/user/api.js +14 -0
  18. package/apps/pivot/user/api.less +0 -0
  19. package/coms/basic/Speed.js +2 -3
  20. package/coms/basic/assert.js +5 -3
  21. package/coms/basic/lazy.js +21 -7
  22. package/coms/basic/lazy_test.js +62 -0
  23. package/coms/basic/parseURL.js +21 -2
  24. package/coms/basic/refilm_decode.js +4 -2
  25. package/coms/frame/chat.html +13 -0
  26. package/coms/frame/chat.js +39 -0
  27. package/coms/frame/chat.less +125 -0
  28. package/coms/frame/design.html +7 -0
  29. package/coms/frame/design.js +23 -0
  30. package/coms/frame/design.less +17 -0
  31. package/coms/frame/dict.js +21 -0
  32. package/coms/frame/edit.js +1 -1
  33. package/coms/frame/left.html +1 -1
  34. package/coms/frame/list.js +1 -1
  35. package/coms/frame/route.js +1 -0
  36. package/coms/kugou/song.html +1 -1
  37. package/coms/kugou/song.js +4 -3
  38. package/coms/pivot/pedit.js +3 -3
  39. package/coms/pivot/plist.js +2 -2
  40. package/coms/zimoli/Item.js +40 -25
  41. package/coms/zimoli/appendChild.js +6 -8
  42. package/coms/zimoli/cloneVisible.js +1 -0
  43. package/coms/zimoli/container.js +10 -0
  44. package/coms/zimoli/createItemTarget.js +7 -0
  45. package/coms/zimoli/data.js +26 -12
  46. package/coms/zimoli/design.html +5 -4
  47. package/coms/zimoli/design.less +8 -3
  48. package/coms/zimoli/drag.js +5 -3
  49. package/coms/zimoli/field.html +1 -1
  50. package/coms/zimoli/getGenerator.js +4 -4
  51. package/coms/zimoli/getTreeFromData.js +3 -0
  52. package/coms/zimoli/list.js +5 -5
  53. package/coms/zimoli/menu.js +16 -13
  54. package/coms/zimoli/menuItem.js +2 -2
  55. package/coms/zimoli/menuList.html +1 -1
  56. package/coms/zimoli/menuList.js +14 -14
  57. package/coms/zimoli/menuList.less +1 -1
  58. package/coms/zimoli/model.js +4 -3
  59. package/coms/zimoli/on.js +1 -1
  60. package/coms/zimoli/once.js +6 -5
  61. package/coms/zimoli/onmounted.js +1 -1
  62. package/coms/zimoli/render.js +61 -24
  63. package/coms/zimoli/renderDefaults.js +1 -0
  64. package/coms/zimoli/resize.js +18 -0
  65. package/coms/zimoli/scrollbar.js +20 -8
  66. package/coms/zimoli/scrollbar.less +22 -1
  67. package/coms/zimoli/tree.js +3 -3
  68. package/coms/zimoli/vbox.js +7 -3
  69. package/coms/zimoli/zimoli.js +1 -1
  70. package/package.json +1 -1
  71. package/public/efront.js +1 -1
@@ -47,8 +47,8 @@ var getGenerator = function (container, tagName = 'item') {
47
47
  [itemName || '$item']: com,
48
48
  [indexName || '$index']: index
49
49
  };
50
- var newItem = render(element, newScope, scopes);
51
- if (element.with) newItem.with = render(element.with, newScope, scopes);
50
+ var newItem = render(element, newScope, scopes, false);
51
+ if (element.with) newItem.with = render(element.with, newScope, scopes, false);
52
52
  } else {
53
53
  var newScope = container.src[index];
54
54
  if (!isObject(newScope)) newScope = {
@@ -68,8 +68,8 @@ var getGenerator = function (container, tagName = 'item') {
68
68
  return this.$item;
69
69
  }
70
70
  }
71
- var newItem = render(element, newScope, scopes);
72
- if (element.with) newItem.with = render(newItem.with = element.with, newScope, scopes);
71
+ var newItem = render(element, newScope, scopes, false);
72
+ if (element.with) newItem.with = render(newItem.with = element.with, newScope, scopes, false);
73
73
  }
74
74
  return newItem;
75
75
  };
@@ -5,8 +5,10 @@ function getTreeFromData(array) {
5
5
  root.count = 0;
6
6
  var map = {};
7
7
  array = array.filter(a => !!a);
8
+ var active_item = null;
8
9
  array.forEach(function (data) {
9
10
  var item = new Item(data);
11
+ if (!active_item && item.isActived()) active_item = item;
10
12
  if (data.id) {
11
13
  map[data.id] = item;
12
14
  } else {
@@ -46,5 +48,6 @@ function getTreeFromData(array) {
46
48
  return item.count = count;
47
49
  };
48
50
  run(root);
51
+ root.actived = active_item;
49
52
  return root;
50
53
  }
@@ -379,12 +379,12 @@ function ylist(container, generator, $Y) {
379
379
  if (deltay >= delta) {
380
380
  return false;
381
381
  }
382
- if (deltay < 1) y = target_y;
383
- else if (deltay > count || deltay > 3) {
384
- y = last_y + (target_y > last_y ? .8 : -.8);
385
- }
382
+ if (deltay < 2) y = target_y;
386
383
  else {
387
- y = (target_y + last_y) / 2;
384
+ var speed = Math.abs(spd.read()[0]);
385
+ if (speed < 1) speed = 1;
386
+ if (deltay < 3) speed = .5;
387
+ y = last_y + (target_y > last_y ? speed : -speed);
388
388
  }
389
389
  list.Top(y);
390
390
  if (target_y === y) {
@@ -90,7 +90,11 @@ var getTreeNodes = function (elem) {
90
90
  [].forEach.call(elem.children, run);
91
91
  return nodes;
92
92
  };
93
-
93
+ var emitEvent = function (item, event) {
94
+ event.preventDefault(true);
95
+ if (item.disabled) return;
96
+ active(this, item, item, createItemTarget.call(this, item));
97
+ }
94
98
  function bindGlobalkey(elem, keymap, emit) {
95
99
  if (elem.keymap) {
96
100
  for (var off of elem.keyoff) {
@@ -99,14 +103,6 @@ function bindGlobalkey(elem, keymap, emit) {
99
103
  }
100
104
  if (!keymap) return;
101
105
  var keyoff = [];
102
- var emitEvent = function (item, event) {
103
- event.preventDefault(true);
104
- var $scope = {};
105
- var { itemName } = this.$src;
106
- if (itemName) $scope[itemName] = item;
107
- else $scope.menu = item, $scope.$item = item;
108
- emit(item, { $scope });
109
- }
110
106
  for (let k in keymap) {
111
107
  keyoff.push(bind("keydown." + k)(elem, emitEvent.bind(elem, keymap[k])));
112
108
  }
@@ -153,10 +149,10 @@ function main(elem, mode) {
153
149
  mode = "inline";
154
150
  if (elem) {
155
151
  var generator = getGenerator(elem, 'menu-item');
156
- tree(elem, function (index, item) {
152
+ tree(elem, function (index, item, menu) {
157
153
  var e = generator(index, item);
158
154
  if (!e || e.children.length) return e;
159
- var m = menuItem(e, item, elem.useIcon);
155
+ var m = menuItem(e, menu, elem.useIcon);
160
156
  return m;
161
157
  });
162
158
  care(elem, function (data) {
@@ -198,8 +194,8 @@ function main(elem, mode) {
198
194
  case "y":
199
195
  case "vertical":
200
196
  if (!direction) mode = "vertical", direction = 'y';
201
- var emit = function (item, target) {
202
- active(elem, item.value, item, target);
197
+ var emit = function (item) {
198
+ active(elem, item.value, item, createItemTarget.call(elem, item.value));
203
199
  };
204
200
  if ("$src" in elem) {
205
201
  getGenerator(elem, 'menu-item');
@@ -209,6 +205,13 @@ function main(elem, mode) {
209
205
  bindGlobalkey(elem, src.keymap, emit);
210
206
  src0.splice(0, src0.length);
211
207
  var s = getTreeFromData(src);
208
+ if (s.actived) {
209
+ elem.selected = s.actived;
210
+ }
211
+ else if (direction === 't') {
212
+ elem.selected = s[0];
213
+ if (elem.selected) elem.selected.setActive(true);
214
+ }
212
215
  var i = 0;
213
216
  while (i < s.length) {
214
217
  src0.push.apply(src0, s.slice(i, i += 1000));
@@ -4,7 +4,7 @@ function main(elem, scope, hasIcon) {
4
4
  item.innerHTML = menuItem;
5
5
  if (isObject(scope) && scope !== item.$scope) {
6
6
  }
7
- else {
7
+ else if (item.$scope) {
8
8
  var scope = item.$scope;
9
9
  }
10
10
  if (scope.menu) scope = scope.menu;
@@ -17,7 +17,7 @@ function main(elem, scope, hasIcon) {
17
17
  else {
18
18
  item.removeAttribute("disabled");
19
19
  }
20
- render(item.children, scope, hasIcon instanceof Array ? hasIcon : [{ useIcon: hasIcon, hasIcon, name, icon }]);
20
+ render(item.children, scope, hasIcon instanceof Array ? hasIcon : [{ useIcon: hasIcon, hasIcon, name, icon }], false);
21
21
  if (scope.line) item.setAttribute("line", ''), on("click")(item, preventDefault);
22
22
  if (scope.hotkey) bindAccesskey(item, scope.hotkey);
23
23
  return item;
@@ -1,6 +1,6 @@
1
1
  <menu-item ng-repeat="menu in menus" ng-if="!menu.hidden" ng-click="open.call(this)" ng-mouseleave="cancel()"
2
2
  ng-mouseenter="popMenu.call(this)" ng-mousedown="popMenu1.call(this,event)" ng-class="{'has-children':menu.children&&menu.children.length,
3
3
  'warn':menu.type==='danger'||menu.type==='warn'||menu.type==='red',
4
- 'selected':menu.selected
4
+ 'actived':menu.isActived()
5
5
  }">
6
6
  </menu-item>
@@ -166,18 +166,19 @@ function register() {
166
166
  }
167
167
  function main(page, items, active, direction = 'y') {
168
168
  if (!isNode(page)) {
169
- var page = div();
169
+ var page = document.createElement("menu-list");
170
170
  }
171
171
  var main = this;
172
172
  if (direction == 'y') page.ispop = true;
173
173
  var istoolbar = direction === 't';
174
- function popMenu(item, target) {
174
+ function popMenu(item, target, emptyFocus) {
175
175
  if (page.actived) {
176
176
  clear();
177
177
  remove(page.actived);
178
178
  }
179
+ if (emptyFocus !== false) page.setFocus(target);
180
+ if (!item.length) return;
179
181
  page.setFocus(target);
180
- if (!item.children || !item.children.length) return;
181
182
  var clone = template.cloneNode();
182
183
  clone.$parentScopes = page.$parentScopes;
183
184
  clone.$scope = page.$scope;
@@ -188,7 +189,6 @@ function main(page, items, active, direction = 'y') {
188
189
  page.actived = menu;
189
190
  menu.root = page.root || page;
190
191
  popup(menu, target);
191
- menu.setFocus(menu.firstMenu);
192
192
  if (page.ispop === true) {
193
193
  } else {
194
194
  page.ispop = 1;
@@ -234,18 +234,19 @@ function main(page, items, active, direction = 'y') {
234
234
  var pop = active(this.menu, this);
235
235
  if (pop === false) return;
236
236
  var root = page.root || page;
237
- if (root.direction === 't') {
237
+ if (root.direction === 't' || root.selected) {
238
238
  var menu = this.menu;
239
+ if (root.selected) root.selected.setActive(false);
239
240
  if (root !== page) {
240
- delete menu.children;
241
241
  var target = root.actived.target;
242
- menu = extend(target.menu, menu);
242
+ if (isObject(menu.value)) delete menu.value.children;
243
+ target.menu.extends(menu.value);
244
+ menu = target.menu;
243
245
  }
244
246
  else {
245
247
  target = this;
246
248
  }
247
- if (root.selected) root.selected.selected = false;
248
- menu.selected = true;
249
+ menu.setActive(true);
249
250
  root.selected = target.menu;
250
251
  }
251
252
  if (root.ispop === 1) root.ispop = false;
@@ -253,7 +254,7 @@ function main(page, items, active, direction = 'y') {
253
254
  while (mounted_menus.length && mounted_menus[mounted_menus.length - 1] !== page.actived) remove(mounted_menus.pop());
254
255
  if (!mounted_menus.length) {
255
256
  if (byMousedown === false) return;
256
- popMenu(this.menu, this);
257
+ popMenu(this.menu, this, false);
257
258
  }
258
259
  else {
259
260
  remove(mounted_menus.pop());
@@ -262,7 +263,7 @@ function main(page, items, active, direction = 'y') {
262
263
  else {
263
264
  while (mounted_menus.length && mounted_menus[mounted_menus.length - 1] !== page) remove(mounted_menus.pop());
264
265
  if (byMousedown === false) return;
265
- popMenu(this.menu, this);
266
+ popMenu(this.menu, this, false);
266
267
  if (!page.actived) {
267
268
  (page.root || page).blur();
268
269
  }
@@ -286,7 +287,7 @@ function main(page, items, active, direction = 'y') {
286
287
  var $scope = {
287
288
  "menu-item"(e, s) {
288
289
  var a = button(
289
- menuItem(e, s, this.hasIcon)
290
+ menuItem(e, s.value, this.hasIcon)
290
291
  );
291
292
  if (!page.firstMenu) {
292
293
  page.firstMenu = a;
@@ -307,14 +308,13 @@ function main(page, items, active, direction = 'y') {
307
308
  var itemName = src.itemName;
308
309
  var className = `{'has-children':${itemName}.children&&${itemName}.children.length,
309
310
  'warn':${itemName}.type==='danger'||${itemName}.type==='warn'||${itemName}.type==='red',
310
- 'selected':${itemName}.selected
311
+ actived:${itemName}.isActived()
311
312
  }`;
312
313
  var notHidden = `!${itemName}.hidden`;
313
314
  var generator = getGenerator(page, 'menu-item');
314
315
  list(page, function (index) {
315
316
  var item = items[index];
316
317
  if (!item) return;
317
- if (item instanceof Item) item = item.value;
318
318
  var a = $scope["menu-item"](null, item);
319
319
  if (src.itemName) a.setAttribute("e-if", notHidden);
320
320
  a.setAttribute("e-class", className);
@@ -29,7 +29,7 @@
29
29
  color: #29c;
30
30
  }
31
31
 
32
- &.selected {
32
+ &.actived {
33
33
  background: #29c;
34
34
  color: #fff;
35
35
  }
@@ -212,9 +212,9 @@ function main(elem) {
212
212
  if (create) {
213
213
  var e = create(elem, data, field_ref);
214
214
  if (isNode(e)) {
215
- appendChild(elem, e);
215
+ if (e !== elem) appendChild(elem, e);
216
216
  }
217
- else {
217
+ else if (!isEmpty(e)) {
218
218
  elem.innerHTML = e;
219
219
  }
220
220
  return;
@@ -222,6 +222,7 @@ function main(elem) {
222
222
  elem.innerHTML = '<span ng-bind=get()></span>';
223
223
  render(elem, {
224
224
  get() {
225
+ if (!field.key) return;
225
226
  var value = seek(data, field.key);
226
227
  if (field.options) {
227
228
  if (!field.optionsMap) {
@@ -243,7 +244,7 @@ function main(elem) {
243
244
  }
244
245
  } else {
245
246
  var create = field_type === "function" ? field_editor : constructors[field_type];
246
- var ipt = create ? create(elem, field_ref) : input();
247
+ var ipt = create ? create(elem, field_ref) : field.key ? input() : null;
247
248
 
248
249
  if (ipt) {
249
250
  if (ipt !== elem) appendChild(elem, ipt);
package/coms/zimoli/on.js CHANGED
@@ -253,7 +253,7 @@ var checkroot = function (element, k) {
253
253
  if (!(k in element)) {
254
254
  if (element === window && k in document) {
255
255
  element = document;
256
- if (!checkroot[k]) checkroot[k] = true, console.warn("use ", k, "on document instead of on window");
256
+ if (!checkroot[k]) checkroot[k] = true, console.warn("使用 document 的", k, "替代 window ");
257
257
  }
258
258
  }
259
259
  return element;
@@ -1,15 +1,16 @@
1
+ "use strict";
1
2
  var oncetree = {};
2
3
  function _once(key) {
3
4
  if (oncetree[key]) return oncetree[key];
4
- return oncetree[key] = function (target, handler) {
5
- var off = on(key)(target, function (event) {
5
+ return oncetree[key] = function (target, handler, firstmost) {
6
+ var off = on(key).call(this, target, function (event) {
6
7
  off();
7
8
  return handler.call(this, event);
8
- });
9
+ }, firstmost);
9
10
  return off;
10
11
  };
11
12
  }
12
- function once(key, target, handler) {
13
- if (isFunction(handler) && isNode(target)) return _once(key)(target, handler);
13
+ function once(key, target, handler, firstmost) {
14
+ if (isFunction(handler) && isNode(target)) return _once(key).call(this, target, handler, firstmost);
14
15
  return _once(key);
15
16
  }
@@ -9,5 +9,5 @@ function onmounted(target, handle) {
9
9
  if (isMounted(target)) {
10
10
  handle.call(target);
11
11
  }
12
- onappend(target, handle);
12
+ on("mounted")(target, handle);
13
13
  }
@@ -10,7 +10,7 @@ presets.template = function (t) {
10
10
  node.innerHTML = t.innerHTML;
11
11
  comment.with = [].slice.call(node.childNodes, 0);
12
12
  appendChild.after(comment, comment.with);
13
- renderElement(comment.with, comment.$scope, comment.$parentScopes);
13
+ renderElement(comment.with, comment.$scope, comment.$parentScopes, this.renderid === 9);
14
14
  });
15
15
  return comment;
16
16
  };
@@ -20,8 +20,11 @@ var renderidClosed = 0;
20
20
  var addRenderElement = function () {
21
21
  var element = this;
22
22
  if (!isNode(element)) return;
23
- if (element.renderid < 10 && element.renderid > 0) element.renderid = ++renderidOffset;
24
- renderElements[element.renderid] = element;
23
+ if (element.renderid !== 9) {
24
+ // 只渲染一次
25
+ if (element.renderid < 10 && element.renderid > 0) element.renderid = ++renderidOffset;
26
+ renderElements[element.renderid] = element;
27
+ }
25
28
  rebuild(element);
26
29
  };
27
30
  var removeRenderElement = function () {
@@ -78,12 +81,19 @@ var createGetter = function (search, isprop = true) {
78
81
  var initialComment = function (renders, type, expression) {
79
82
  var comment = document.createComment(`${type} ${expression}`);
80
83
  comment.renders = renders;
81
- comment.renderid = ++renderidOffset;
82
- onappend(comment, addRenderElement);
83
- onremove(comment, removeRenderElement);
84
84
  appendChild.after(this, comment);
85
85
  if (!/if/i.test(type)) remove(this);
86
- rebuild(comment);
86
+ if (!this.$struct.once) {
87
+ comment.renderid = ++renderidOffset;
88
+ onmounted(comment, addRenderElement);
89
+ onremove(comment, removeRenderElement);
90
+ if (isMounted(comment) || eagermount) rebuild(comment);
91
+ }
92
+ else {
93
+ comment.renderid = 9;
94
+ rebuild(comment);
95
+ remove(comment);
96
+ }
87
97
  return comment;
88
98
  };
89
99
  var parseRepeat = function (expression) {
@@ -228,7 +238,7 @@ var createIf = function (search, id = 0) {
228
238
  appendChild.before(this, element);
229
239
  if (element.renderid < 0) {
230
240
  element.renderid = id;
231
- elements[cx] = render(element);
241
+ elements[cx] = render(element, this.$scope, this.$parentScopes);
232
242
  }
233
243
  }
234
244
  else {
@@ -442,7 +452,7 @@ var directives = {
442
452
  } else if (/^(select|input|textarea)$/i.test(this.tagName) || "value" in this) {
443
453
  this.renders.push(setter || function () {
444
454
  var value = getter();
445
- if (value === undefined) value = "";
455
+ if (isEmpty(value)) value = "";
446
456
  if (deepEqual(oldValue, value)) return;
447
457
  oldValue = value;
448
458
  if (this.value !== value) this.value = value;
@@ -599,17 +609,17 @@ function getFromScopes(key, scope, parentScopes) {
599
609
  }
600
610
  }
601
611
 
602
- function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes) {
612
+ function renderElement(element, scope = element.$scope, parentScopes = element.$parentScopes, once) {
603
613
  if (!isNode(element) && element.length) {
604
614
  return [].concat.apply([], element).map(function (element) {
605
- return renderElement(element, scope, parentScopes);
615
+ return renderElement(element, scope, parentScopes, once);
606
616
  });
607
617
  }
608
618
  if (!isElement(element)) {
609
619
  return element;
610
620
  }
611
621
  if (!isNumber(element.renderid)) {
612
- renderStructure(element, scope, parentScopes);
622
+ renderStructure(element, scope, parentScopes, once);
613
623
  }
614
624
  var elementid = element.getAttribute("renderid") || element.getAttribute("elementid") || element.getAttribute("id");
615
625
  if (elementid) {
@@ -631,7 +641,8 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
631
641
  if (parentNode.renderid > 1 || isMounted(parentNode)) element.renderid = 2;
632
642
  }
633
643
  element.renders = element.renders ? [].concat(element.renders) : [];
634
- var { ons, copys, attrs, props, binds, context: withContext, ids } = element.$struct;
644
+ var { ons, copys, attrs, props, binds, context: withContext, ids, once } = element.$struct;
645
+ if (once) element.renderid = 9;
635
646
  delete element.$struct;
636
647
  if (binds.src) {
637
648
  element.$src = parseRepeat(binds.src);
@@ -679,7 +690,7 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
679
690
  }
680
691
  }
681
692
  }
682
- if (element.children && element.children.length) renderElement(element.children, scope, parentScopes);
693
+ if (element.children && element.children.length) renderElement(element.children, scope, parentScopes, once);
683
694
  if (!isFirstRender) return element;
684
695
  for (var k in binds) {
685
696
  if (directives.hasOwnProperty(k)) {
@@ -699,10 +710,15 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
699
710
  }
700
711
  ons.forEach(([on, key, value]) => on.call(element, key, [withContext, value]));
701
712
  if (element.renders.length) {
702
- rebuild(element);
703
- onappend(element, addRenderElement);
704
- onremove(element, removeRenderElement);
705
- if (isMounted(element) || element.renderid > 1) addRenderElement.call(element);
713
+ if (element.renderid !== 9) {
714
+ onmounted(element, addRenderElement);
715
+ onremove(element, removeRenderElement);
716
+ if (isMounted(element) || element.renderid > 1) addRenderElement.call(element);
717
+ else if (eagermount) rebuild(element);
718
+ }
719
+ else {
720
+ rebuild(element);
721
+ }
706
722
  }
707
723
  if (elementid) scope[elementid] = element;
708
724
  for (var id of ids) {
@@ -710,7 +726,7 @@ function renderElement(element, scope = element.$scope, parentScopes = element.$
710
726
  }
711
727
  return element;
712
728
  }
713
- function renderStructure(element, scope, parentScopes = []) {
729
+ function renderStructure(element, scope, parentScopes = [], once) {
714
730
  // 处理结构流
715
731
  if (parentScopes !== null && !isArray(parentScopes)) {
716
732
  throw new Error('父级作用域链应以数组的类型传入');
@@ -791,19 +807,40 @@ function renderStructure(element, scope, parentScopes = []) {
791
807
  if (!/\-/.test(name) || value === '') {
792
808
  copys.push(attr);
793
809
  }
794
- props[name.replace(/\-(\w)/g, (_, w) => w.toUpperCase())] = value === "" ? true : value;
810
+ var k = name.replace(/\-(\w)/g, (_, w) => w.toUpperCase());
811
+ if (!(k in element)) {
812
+ props[k] = value === "" ? true : value;
813
+ }
814
+ else {
815
+ props[k] = element[k];
816
+ }
795
817
  }
796
818
  }
797
- if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext, ids };
819
+ if (props["zimoli"] || props["fresh"] || props["once"]) once = true;
820
+ else if (props["refresh"] || props["digest"] || props["mount"]) once = false;
821
+ if (!element.$struct) element.$struct = { ons, copys, binds, attrs: attr1, props, context: withContext, ids, once };
798
822
  if (element.renderid <= -1) createStructure.call(element, types.if, types.repeat, withContext);
799
823
  }
800
- function render(element, scope, parentScopes) {
824
+ var eagermount = false, renderlock = false;
825
+ function render(element, scope, parentScopes, lazy = true) {
801
826
  var if_top_length = if_top.length;
802
- var e = renderElement(element, scope, parentScopes);
827
+ var haslock = false;
828
+ if (isFinite(scope) && arguments.length === 2) lazy = scope, scope = undefined;
829
+ else if (isFinite(parentScopes) && arguments.length === 3) lazy = parentScopes, parentScopes = undefined;
830
+ var renderonce = lazy === 0;
831
+ if (!renderlock) {
832
+ haslock = true;
833
+ renderlock = true;
834
+ eagermount = !+lazy;
835
+ }
836
+ var e = renderElement(element, scope, parentScopes, renderonce);
837
+ if (haslock) {
838
+ renderlock = false;
839
+ eagermount = false;
840
+ }
803
841
  if (if_top_length < if_top.length) if_top.splice(if_top_length, if_top.length - if_top_length);
804
842
  return e;
805
843
  }
806
-
807
844
  var digest = lazy(refresh, -{});
808
845
  render.digest = render.apply = render.refresh = digest;
809
846
  render.parseRepeat = parseRepeat;
@@ -8,6 +8,7 @@ extend(renderDefaults, {
8
8
  go: zimoli.go,
9
9
  care,
10
10
  cast,
11
+ container,
11
12
  input,
12
13
  padding,
13
14
  block,
@@ -142,6 +142,7 @@ function resize(elem, initialEvent) {
142
142
  }
143
143
  moveupon(window, handle);
144
144
 
145
+
145
146
  resize.on = function (elem, dragHandle) {
146
147
  if (elem) {
147
148
  elem.dragHandle = dragHandle;
@@ -150,6 +151,23 @@ resize.on = function (elem, dragHandle) {
150
151
  var off = onmousemove(window, getResizer);
151
152
  onremove(elem, off);
152
153
  });
154
+ var computed = getComputedStyle(elem);
155
+ var resizeh = function () {
156
+ var elem = this;
157
+ if (elem.scrollWidth > elem.clientWidth) {
158
+ css(elem, { width: elem.offsetWidth });
159
+ dispatch(elem, 'resize');
160
+ }
161
+ if (elem.scrollHeight > elem.clientHeight) {
162
+ css(elem, { height: elem.offsetHeight });
163
+ dispatch(elem, 'resize');
164
+ }
165
+ if (unbind && parseInt(computed.height) && parseInt(computed.width)) {
166
+ unbind();
167
+ unbind = null;
168
+ };
169
+ }
170
+ if (!parseInt(computed.height) || !parseInt(computed.width)) var unbind = bind('render')(elem, resizeh);
153
171
  if (!~resizingElements.indexOf(elem)) {
154
172
  resizingElements.push(elem);
155
173
  once('remove')(elem, function () {
@@ -2,7 +2,7 @@ var scrollbary = function () {
2
2
  var reshape = function (scrollHeight, offsetHeight) {
3
3
  var target = this.target;
4
4
  if (target) {
5
- this.style.height = target.offsetHeight + "px";
5
+ css(this, { height: target.offsetHeight });
6
6
  }
7
7
  var scrollbarHeight = this.offsetHeight;
8
8
  var ratio = offsetHeight / scrollHeight;
@@ -10,11 +10,14 @@ var scrollbary = function () {
10
10
  if (thumbHeight < 14) thumbHeight = 14;
11
11
  if (thumbHeight < 0) thumbHeight = 0;
12
12
  this.restHeight = scrollHeight - offsetHeight;
13
- this.thumb.style.height = thumbHeight + "px";
13
+ css(this.thumb, {
14
+ height: thumbHeight
15
+ });
14
16
  if (thumbHeight >= this.clientHeight) {
15
17
  this.style.opacity = 0;
16
18
  } else {
17
19
  this.style.opacity = 1;
20
+ this.autoshow();
18
21
  }
19
22
  };
20
23
  var getTop = function () {
@@ -59,7 +62,7 @@ var scrollbary = function () {
59
62
  deltaY = targetY - thumbTop;
60
63
  moving.y += deltaY;
61
64
  if (targetY !== thumbTop) {
62
- thumb.style.top = targetY + "px";
65
+ css(thumb, { top: targetY });
63
66
  dispatch(target, "change");
64
67
  }
65
68
  };
@@ -138,7 +141,7 @@ var scrollbary = function () {
138
141
  return { Height, height };
139
142
  };
140
143
 
141
- function bindTarget(_container) {
144
+ function bindTarget(_container, followResize = _container) {
142
145
  var _scrollbar = this;
143
146
  _container.with = _scrollbar;
144
147
  onappend(_container, _scrollbar.reshape);
@@ -146,24 +149,33 @@ var scrollbary = function () {
146
149
  on("scroll")(_container, function () {
147
150
  var top = getTargetTop(_container);
148
151
  _scrollbar.scrollTo(top);
152
+ _scrollbar.autoshow();
149
153
  });
150
154
  on("change")(_scrollbar, function () {
151
155
  var top = _scrollbar.Top();
152
156
  setTargetTop(_container, top);
153
157
  });
154
- _scrollbar.reshape();
158
+ if (followResize) on("resize")(followResize, _scrollbar.reshape);
155
159
  }
156
- function scrollbar() {
157
- var _scrollbar = div();
160
+ function scrollbar(elem) {
161
+ var _scrollbar = elem || document.createElement("scrollbar");
158
162
  _scrollbar.reshape = function () {
159
163
  var _container = _scrollbar.target;
160
164
  var { Height, height } = getTargetHeight(_container);
161
165
  reshape.call(_scrollbar, Height, height);
162
166
  };
163
167
  _scrollbar.scrollTo = scrollTo;
164
- var _handler = div();
168
+ var _handler = document.createElement("scrollbar-thumb");
165
169
  _handler.className = "thumb";
166
170
  _scrollbar.Top = getTop;
171
+ _scrollbar.autohide = lazy(function () {
172
+ this.thumb.style.opacity = 0;
173
+ }, 600);
174
+ _scrollbar.autoshow = function () {
175
+ this.autohide();
176
+ this.thumb.style.opacity = 1;
177
+ };
178
+
167
179
  moveupon(_handler, {
168
180
  start: mousedown,
169
181
  move: mousemove,
@@ -1,10 +1,31 @@
1
1
  & {
2
2
  position: absolute;
3
- width: 14px;
3
+ width: 6px;
4
4
  background-color: rgba(0, 0, 0, .1);
5
5
  border-radius: 7px;
6
6
  height: 100px;
7
+ border-left: 3px solid transparent;
8
+
9
+ &:hover {
10
+ >.thumb {
11
+ opacity: 1 !important;
12
+ overflow: visible;
13
+ }
14
+ }
15
+
7
16
  >.thumb {
17
+ &:after {
18
+ position: absolute;
19
+ top: 0;
20
+ bottom: 0;
21
+ left: -4px;
22
+ right: -4px;
23
+ width: auto;
24
+ display: block;
25
+ content: "";
26
+ }
27
+
28
+ transition: opacity .2s;
8
29
  position: absolute;
9
30
  border-radius: 7px;
10
31
  height: 100%;