efront 3.7.6 → 3.8.2

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 (40) hide show
  1. package/apps/kugou/api.js +1 -1
  2. package/apps/kugou/index.html +3 -0
  3. package/apps/pivot/api.yml +2 -2
  4. package/apps/pivot/menu.yml +9 -5
  5. package/apps/pivot/task/edit.js +1 -0
  6. package/apps/pivot/task/list.js +6 -0
  7. package/apps/pivot/tick/list.js +5 -0
  8. package/apps/pivot/token/edit.js +1 -10
  9. package/apps/pivot/token/list.js +2 -9
  10. package/coms/basic/strings.js +1 -1
  11. package/coms/compile/common.js +24 -6
  12. package/coms/compile/scanner2.js +129 -28
  13. package/coms/crypt/encode62.js +1 -1
  14. package/coms/frame/list.js +36 -34
  15. package/coms/frame/list.less +3 -1
  16. package/coms/kugou/buildScroll.less +3 -0
  17. package/coms/pivot/pedit.js +13 -0
  18. package/coms/pivot/plist.js +13 -0
  19. package/coms/zimoli/bggrid-func.less +16 -0
  20. package/coms/zimoli/color.js +18 -4
  21. package/coms/zimoli/colorlabel.js +3 -2
  22. package/coms/zimoli/colorlabel.less +24 -3
  23. package/coms/zimoli/colorpad.html +4 -0
  24. package/coms/zimoli/colorpad.js +120 -103
  25. package/coms/zimoli/colorpad.less +49 -47
  26. package/coms/zimoli/colorpicker.js +1 -1
  27. package/coms/zimoli/createElement.js +1 -1
  28. package/coms/zimoli/data.js +5 -1
  29. package/coms/zimoli/model.js +22 -2
  30. package/coms/zimoli/popup.js +2 -2
  31. package/coms/zimoli/render.js +2 -1
  32. package/coms/zimoli/select.js +3 -3
  33. package/coms/zimoli/selectList.js +35 -24
  34. package/coms/zimoli/selectList.less +4 -0
  35. package/coms/zimoli/selectListEdit.js +0 -1
  36. package/coms/zimoli/swap.less +1 -1
  37. package/coms/zimoli/table.html +2 -2
  38. package/coms/zimoli/table.js +1 -0
  39. package/package.json +2 -2
  40. package/public/efront.js +1 -1
@@ -215,14 +215,24 @@ function hsl2rgb([h, s, l]) {
215
215
  var b = h - 1 / 3;
216
216
  return [r, g, b].map(t => t2rgb(t, p, q));
217
217
  }
218
+ function percent(a) {
219
+ if (/%$/.test(a)) {
220
+ a = a.replace(/%$/, '') / 100;
221
+ }
222
+ return +a;
223
+ }
218
224
  function parse(color) {
219
225
  if (hslReg.test(color)) {
220
226
  var [_, H, S, L, a] = hslReg.exec(color);
227
+ H = parseFloat(H);
228
+ S = percent(S);
229
+ L = percent(L);
230
+ a = percent(a);
221
231
  [R, G, B] = hsl2rgb([H, S, L]);
222
232
  return [R, G, B, a || 1];
223
233
  } else if (rgbReg.test(color)) {
224
234
  var [_, R, G, B, a] = rgbReg.exec(color);
225
- return [R > 255 ? 255 : R, G > 255 ? 255 : G, B > 255 ? 255 : B, a || 1];
235
+ return [R > 255 ? 255 : +R, G > 255 ? 255 : +G, B > 255 ? 255 : +B, a ? +a : 1];
226
236
  } else if (rgbHex.test(color)) {
227
237
  var [_, R, G, B, A] = rgbHex.exec(color).map(a => parseInt(a + a, 16));
228
238
  return [R, G, B, A >= 0 ? A / 0xff : 1];
@@ -234,6 +244,10 @@ function parse(color) {
234
244
  function stringify(color) {
235
245
  var [R, G, B, a] = color;
236
246
  if (a >= 0 && a < 1) {
247
+ R = R.toFixed();
248
+ G = G.toFixed();
249
+ B = B.toFixed();
250
+ a = +a.toFixed(3);
237
251
  return `rgba(${R},${G},${B},${a})`;
238
252
  } else {
239
253
  return "#" + [R, G, B].map(hex256).join("");
@@ -291,12 +305,12 @@ function equal(c1, c2) {
291
305
  var [r2, g2, b2, a2] = parse(c2);
292
306
  return abs(r1 - r2) < 1 && abs(g1 - g2) < 1 && abs(b1 - b2) < 1 && abs(a1 - a2) < .01;
293
307
  }
294
- var hslReg = /^hsla?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:,\s*([\d\.]+))?\)$/i;
295
- var rgbReg = /^rgba?\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)(?:,\s*([\d\.]+))?\)$/i;
308
+ var hslReg = /^hsla?\s*\(\s*([\d\.]+(?:deg)?)\s*[,\s]\s*([\d\.]+%?)\s*[,\s]\s*([\d\.]+%?)(?:[,\/\s]\s*([\d\.]+%?))?\)$/i;
309
+ var rgbReg = /^rgba?\s*\(\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)\s*[,\s]\s*([\d\.]+)(?:[,\s]\s*([\d\.]+))?\)$/i;
296
310
  var rgbHex = /^#([\da-f])([\da-f])([\da-f])([\da-f])?$/i;
297
311
  var rgbHex2 = /^#([\da-f]{2})([\da-f]{2})([\da-f]{2})([\da-f]{2})?$/i;
298
312
  var rotated_base_color = "#d16969";
299
- var colorReg = /rgba?\s*\([\,\.\d]+\)|#[\da-f]{3,8}/ig;
313
+ var colorReg = /(?:rgb|hsl)a?\s*\([\,\.\d\s%]+\)|#[\da-f]{3,8}/ig;
300
314
  function isColor(text) {
301
315
  return rgbReg.test(text) || rgbHex.test(text) || rgbHex2.test(text) || hslReg.test(text);
302
316
  }
@@ -1,6 +1,7 @@
1
1
  function main(elem = div()) {
2
- care(elem, function (color) {
3
- css(this, 'background', color);
2
+ care(elem, function (c) {
3
+ css(this, 'background-color', c);
4
+ css(this, 'color', color.pair(c));
4
5
  });
5
6
  return elem;
6
7
  }
@@ -1,7 +1,28 @@
1
1
  & {
2
- width: 40px;
2
+ width: 180px;
3
3
  height: 20px;
4
- background: #ccc;
5
4
  display: inline-block;
5
+ text-align: center;
6
+ font-size: 10px;
7
+ line-height: 20px;
8
+ position: relative;
9
+ .grid();
10
+ background-color: transparent;
6
11
 
7
- }
12
+ >option {
13
+ position: relative;
14
+ }
15
+
16
+ &:before {
17
+ position: absolute;
18
+ left: 0;
19
+ top: 0;
20
+ right: 0;
21
+ bottom: 0;
22
+ content: "";
23
+ display: block;
24
+ background-color: inherit;
25
+ }
26
+ }
27
+
28
+ @import "./bggrid-func.less";
@@ -7,6 +7,10 @@
7
7
  <canvas></canvas>
8
8
  <pointer tabindex="-1"></pointer>
9
9
  </div>
10
+ <div class="opa">
11
+ <canvas></canvas>
12
+ <pointer tabindex="-1"></pointer>
13
+ </div>
10
14
  <div class="val">
11
15
  <input class="hex" />
12
16
  <input class="rgb" />
@@ -13,12 +13,6 @@ var rgb2l = function (r, g, b) {
13
13
  var max = Math.max(r, g, b), min = Math.min(r, g, b);
14
14
  return (max + min) / 2;
15
15
  };
16
- // var rgb2s = function (r, g, b) {
17
- // var l = rgb2l(r, g, b);
18
- // var max = Math.max(r, g, b), min = Math.min(r, g, b);
19
- // var m = Math.sqrt((r * r + g * g + b * b));
20
- // return Math.sqrt((Math.pow(r - m, 2) + Math.pow(g - m, 2) + Math.pow(b - m, 2)) / 3);
21
- // };
22
16
  var rgb2v = color.rgb2v;
23
17
  var rgb2s = function (r, g, b) {
24
18
  var u = Math.sqrt((r * r + g * g + b * b) / 3);
@@ -34,8 +28,6 @@ var c4c = function (c, dark, light) {
34
28
  };
35
29
 
36
30
  var c2xy = function (c1, c2) {
37
- var left = 0, right = 1, top = 0, bottom = 1;
38
- var delta = 1 / 0xfffffff;
39
31
  var [r1, g1, b1] = color.parse(c1);
40
32
  var [r2, g2, b2] = color.parse(c2);
41
33
  var s = function (x, y) {
@@ -52,41 +44,13 @@ var c2xy = function (c1, c2) {
52
44
  }
53
45
  }
54
46
  }
55
- // while (right - left > delta || bottom - top > delta) {
56
- // var dx = (right - left) / 3;
57
- // var dy = (bottom - top) / 3;
58
- // var lx = left + dx;
59
- // var rx = right - dx;
60
- // var ty = top + dy;
61
- // var by = bottom - dy;
62
- // var res = [
63
- // [lx, ty],
64
- // [rx, ty],
65
- // [lx, by],
66
- // [rx, by]
67
- // ];
68
- // do {
69
- // var [x, y] = res.pop();
70
- // var r = s(x, y);
71
- // if (r < t) {
72
- // t = r;
73
- // mx = x;
74
- // my = y;
75
- // }
76
- // }
77
- // while (res.length);
78
- // left = mx - dx;
79
- // right = mx + dx;
80
- // top = my - dy;
81
- // bottom = my + dy;
82
- // }
83
47
  return [mx, my];
84
48
  };
85
49
  var getCanvas = function (e) {
86
50
  return e.getElementsByTagName('canvas')[0];
87
51
  };
88
52
  var sample = "#ff0000";
89
- var buildpad = function (pad, c = sample) {
53
+ var buildpad = lazy(function (pad, c = sample) {
90
54
  var canvas = getCanvas(pad);
91
55
  canvas.width = 256;
92
56
  canvas.height = 256;
@@ -126,7 +90,24 @@ var buildpad = function (pad, c = sample) {
126
90
  }
127
91
  }
128
92
  context.putImageData(imagedata, 0, 0);
129
- };
93
+ }, {});
94
+ var buildopa = lazy(function (pad, c = sample) {
95
+ var canvas = getCanvas(pad);
96
+ canvas.width = 1;
97
+ canvas.height = 256;
98
+ var [r, g, b] = color.parse(c);
99
+ var context = canvas.getContext("2d");
100
+ var imagedata = context.getImageData(0, 0, 1, 256);
101
+ var data = imagedata.data;
102
+ for (var cx = 0, dx = data.length; cx < dx;) {
103
+ data[cx++] = r;
104
+ data[cx++] = g;
105
+ data[cx++] = b;
106
+ data[cx++] = 255 - (cx >> 2);
107
+ }
108
+ context.putImageData(imagedata, 0, 0);
109
+
110
+ }, {});
130
111
  var buildhue = function (hue) {
131
112
  var canvas = getCanvas(hue);
132
113
  canvas.width = 10;
@@ -149,86 +130,106 @@ var getpointer = function (e) {
149
130
  return e.getElementsByTagName('pointer')[0];
150
131
  };
151
132
  var bindinput = function (input, callback) {
152
- var key = 'oninput' in input ? 'oninput' : 'onkeyup';
153
- input[key] = input.onchange = input.onpaste = input.oncut = callback;
133
+ on("keydown.enter")(input, callback);
134
+ };
135
+ var color2xyz = function (c) {
136
+ var [r, g, b, a] = color.parse(c);
137
+ var z = color.rgb2h(r, g, b) / 360;
138
+ var c1 = z2c(z);
139
+ var [x, y] = c2xy(c1, c);
140
+ return [x, y, z, a];
154
141
  };
155
-
156
142
  function main(e) {
157
143
  var elem = e || div();
158
144
  elem.innerHTML = colorpad;
159
- var [bg, pad, hue, val] = elem.children;
145
+ var [bg, pad, hue, opa, val] = elem.children;
160
146
  buildpad(pad);
161
147
  buildhue(hue);
148
+ buildopa(opa);
162
149
  var [hex, rgb, hsl] = val.getElementsByTagName("input");
163
-
164
- bindinput(hex, function (e) {
165
- var { value } = this;
166
- if (!/^#[\da-f]{6}$/i.test(value)) {
167
- var match = /[\da-f]+/i.exec(value);
168
- value = "#" + (match ? match[0] : '');
169
- if (value.length > 7) value = value.slice(0, 7);
170
- if (value !== this.value) this.value = value;
171
- } else {
172
- var angle = color.angle(sample, value) / (Math.PI + Math.PI)
173
- if (angle >= 0) {
174
- z = angle;
175
- }
176
- [x, y] = c2xy(z2c(z), value);
177
- render();
150
+ var Hex = a => a > 15 ? a.toString(16) : "0" + a.toString(16);
151
+ hex.setValue = function (v) {
152
+ var [r, g, b, a] = color.parse(v);
153
+ var value = [r, g, b];
154
+ if (isFinite(a) && a !== 1) {
155
+ a = a * 255;
156
+ value[3] = a;
178
157
  }
179
- });
180
- bindinput(rgb, function (e) {
181
- var { value } = this;
182
- if (!/^rgb\(\d+,\s*\d+,\s*\d+\)$/i.test(value)) {
183
- var match = /rgb\((.*)\)?/i.exec(value);
184
- if (match) {
185
- value = match[0];
186
- }
187
- if (value !== this.value) this.value = value;
188
- } else {
189
- z = color.angle(sample, value) / (Math.PI + Math.PI);
190
- [x, y] = c2xy(z2c(z), value);
191
- render();
192
- }
193
-
194
- });
195
- bindinput(hsl, function (e) {
196
- });
197
- var x = 1, y = 0, z = 0, requester = 0;
158
+ this.value = "#" + value.map(a => +a.toFixed()).map(Hex).join("");
159
+ };
160
+ rgb.setValue = function (v) {
161
+ var [r, g, b, a] = color.parse(v);
162
+ r = r.toFixed();
163
+ g = g.toFixed();
164
+ b = b.toFixed();
165
+ a = +a.toFixed(3);
166
+ var o = +a;
167
+ this.value = `rgb${o !== 1 ? 'a' : ''}(${r}, ${g}, ${b}${o !== 1 ? ', ' + a : ''})`;
168
+ };
169
+ hsl.setValue = function (v) {
170
+ var [r, g, b, a] = color.parse(v);
171
+ var [h, s, l] = color.rgb2hsl([r, g, b]);
172
+ s *= 100;
173
+ l *= 100;
174
+ a *= 100;
175
+ s = +s.toFixed();
176
+ l = +l.toFixed();
177
+ a = +a.toFixed();
178
+ h = h.toFixed();
179
+ var o = a !== 100;
180
+ this.value = `hsl${o ? 'a' : ''}(${h}deg ${s}% ${l}%${o ? " / " + a + "%" : ""})`;
181
+ };
182
+ elem.setValue = function (v) {
183
+ var [_x, _y, z, a] = color2xyz(v);
184
+ hue.value = z;
185
+ opa.value = 1 - a;
186
+ css(huepointer, { top: +(z * 100).toFixed(6) + '%' })
187
+ css(opapointer, { top: +(100 - a * 100).toFixed(6) + '%' })
188
+ x = _x;
189
+ y = _y;
190
+ render();
191
+ };
192
+ var inputv = function () {
193
+ elem.setValue(this.value);
194
+ };
195
+ bindinput(hex, inputv);
196
+ bindinput(hsl, inputv);
197
+ bindinput(rgb, inputv);
198
+ var x = 1, y = 0, z = 0;
198
199
  var padpointer = getpointer(pad);
199
200
  var huepointer = getpointer(hue);
201
+ var opapointer = getpointer(opa);
200
202
  var render = function () {
201
- z = trim(z);
203
+ z = trim(hue.value || 0);
202
204
  x = trim(x);
203
205
  y = trim(y);
206
+ var a = trim(1 - (opa.value || 0));
204
207
  var c = z2c(z);
205
- var [r, g, b] = color.parse(c).map(a => xy2c(a, x, y));
206
- var p = color.stringify([r, g, b]);
207
- [r, g, b] = color.parse(p);
208
- var [h = 0, s = 0, l] = color.rgb2hsl([r, g, b]);
209
- cancelAnimationFrame(requester);
210
- requester = requestAnimationFrame(function () {
211
- buildpad(pad, c);
212
- });
208
+ var c0 = color.parse(c).slice(0, 3).map(a => xy2c(a, x, y));
209
+ c0[3] = a;
210
+ var p = color.stringify(c0);
213
211
  var value = p;
214
- var valuergb = `rgb(${r}, ${g}, ${b})`;
215
- var valuehsl = `hsl(${h.toFixed(0)}, ${(s * 100).toFixed(0)}%, ${(l * 100).toFixed(0)}%)`;
216
212
  css(padpointer, {
217
213
  left: +(x * 100).toFixed(6) + "%",
218
214
  top: +(y * 100).toFixed(6) + "%",
219
- background: value,
220
- borderColor: c4rgb(r, g, b, pad.dark, pad.light),
215
+ background: p,
216
+ outlineColor: color.pair(p),
221
217
  });
222
218
  css(huepointer, {
223
- top: +(z * 100).toFixed(6) + "%",
224
- borderColor: c4c(c),
219
+ outlineColor: color.pair(c),
225
220
  background: c
226
221
  });
227
- if (!color.equal(value, hex.value)) hex.value = value;
228
- if (!color.equal(valuergb, rgb.value)) rgb.value = valuergb;
229
- if (!color.equal(valuehsl, hsl.value)) hsl.value = valuehsl;
222
+ css(opapointer, {
223
+ outlineColor: color.pair(p),
224
+ background: p
225
+ });
226
+ buildopa(opa, p);
227
+
228
+ hex.setValue(value);
229
+ rgb.setValue(value);
230
+ hsl.setValue(value);
230
231
  bg.style.borderColor = value;
231
- val.style.color = c4rgb(r, g, b);
232
+ val.style.color = color.pair(value);
232
233
  elem.value = value;
233
234
  dispatch(elem, 'change');
234
235
  // console.log(value, hex.value, valuergb, valuehsl);
@@ -237,12 +238,25 @@ function main(e) {
237
238
  if (a < 0) a = 0;
238
239
  if (a > 1) a = 1;
239
240
  return a || 0;
240
- }
241
- var sethue = function (event) {
241
+ };
242
+ var sethue = function (z) {
243
+ var c = z2c(z);
244
+ buildpad(pad, c);
245
+ };
246
+ var setpointer = function (event) {
242
247
  var { clientY } = event;
243
- var { top, height } = getScreenPosition(hue);
244
- z = (clientY - top) / height;
245
- if (document.activeElement !== huepointer) huepointer.focus();
248
+ var { top, height } = getScreenPosition(this);
249
+ var z = (clientY - top) / height;
250
+ if (z > 1) z = 1;
251
+ if (z < 0) z = 0;
252
+ this.value = z;
253
+ if (this === hue) {
254
+ sethue(z);
255
+ }
256
+ var pointer = getpointer(this);
257
+ css(pointer, {
258
+ top: +(z * 100).toFixed(6) + "%",
259
+ });
246
260
  render();
247
261
  };
248
262
  var setpad = function (event) {
@@ -250,17 +264,20 @@ function main(e) {
250
264
  var { top, left, height, width } = getScreenPosition(pad);
251
265
  x = (clientX - left) / width;
252
266
  y = (clientY - top) / height;
253
- if (document.activeElement !== padpointer) padpointer.focus();
254
267
  render();
255
268
  };
256
269
  moveupon(hue, {
257
- start: sethue,
258
- move: sethue
270
+ start: setpointer,
271
+ move: setpointer
259
272
  });
260
273
  moveupon(pad, {
261
274
  start: setpad,
262
275
  move: setpad
263
276
  });
277
+ moveupon(opa, {
278
+ start: setpointer,
279
+ move: setpointer
280
+ });
264
281
  render();
265
282
  onmousedown(elem, e => /^input$/i.test(e.target.tagName) || e.preventDefault());
266
283
  return elem;
@@ -1,16 +1,18 @@
1
+ @import "./bggrid-func.less";
2
+
1
3
  pointer {
2
- display : block;
3
- height : 6px;
4
- border : 1px solid #fff;
4
+ display: block;
5
+ height: 6px;
6
+ outline: 1px solid #fff;
5
7
  background: #ccc;
6
- top : 0;
7
- left : 0;
8
+ top: 0;
9
+ left: 0;
8
10
  box-sizing: border-box;
9
- position : absolute;
11
+ position: absolute;
10
12
  }
11
13
 
12
14
  >div {
13
- display : inline-block;
15
+ display: inline-block;
14
16
  position: relative;
15
17
 
16
18
 
@@ -22,34 +24,38 @@ pointer {
22
24
  font-size: 0;
23
25
 
24
26
  >pointer {
25
- width : 6px;
27
+ width: 6px;
26
28
  margin: -3px;
27
29
  }
28
30
 
29
31
  >canvas {
30
- width : 256px;
31
- height : 256px;
32
+ width: 256px;
33
+ height: 256px;
32
34
  background: #fff;
33
35
  }
34
36
  }
35
37
 
36
- &.hue {
38
+ &.hue,
39
+ &.opa {
37
40
  font-size: 0;
38
41
 
39
42
  >pointer {
40
43
  margin: -3px -1px;
41
- width : 12px;
44
+ width: 10px;
45
+ padding: 0 1px;
46
+ box-sizing: content-box;
42
47
  }
43
48
 
44
49
  >canvas {
45
- background: #000;
46
- width : 10px;
47
- height : 256px;
50
+ background: #fff;
51
+ width: 10px;
52
+ height: 256px;
53
+ .grid();
48
54
  }
49
55
  }
50
56
 
51
57
  &.val {
52
- margin : 0;
58
+ margin: 0;
53
59
  padding: 10px 0 0 0;
54
60
 
55
61
  >input {
@@ -59,55 +65,51 @@ pointer {
59
65
  }
60
66
 
61
67
  color: inherit;
62
- text-transform : lowercase;
68
+ text-transform : lowercase;
63
69
  background-color: transparent;
64
- box-sizing : border-box;
65
- padding : 0 3px;
66
- position : relative;
67
- font-size : 12px;
68
- border : none;
69
- text-align : left;
70
- min-width : 40px;
71
- width : 30%;
72
-
73
- &+input {
74
- margin-left: 6px;
75
- }
70
+ box-sizing : border-box;
71
+ padding : 0 3px;
72
+ position : relative;
73
+ font-size : 12px;
74
+ border : none;
75
+ text-align : left;
76
+ min-width : 40px;
77
+ width : 30%;
76
78
  }
77
79
 
78
80
  >.hex {
79
- width: 56px;
81
+ width: 76px;
80
82
  }
81
83
 
82
84
  >.rgb {
83
- width: 114px;
85
+ width: 156px;
84
86
  }
85
87
 
86
88
  >.hsl {
87
- width: 114px;
89
+ width: 186px;
88
90
  }
89
91
  }
90
92
  }
91
93
 
92
94
  & {
93
- width : 312px;
94
- background : #fff;
95
- padding : 17px 0 7px 0;
96
- text-align : center;
97
- user-select : none;
95
+ width: 462px;
96
+ min-width: 372px;
97
+ background: #fff;
98
+ padding: 17px 0 7px 0;
99
+ text-align: center;
100
+ user-select: none;
98
101
  border-radius: 3px;
99
- position : relative;
102
+ position: relative;
100
103
  }
101
104
 
102
105
  &>.bg {
103
- display : block;
104
- left : 2px;
105
- top : 2px;
106
- right : 2px;
107
- bottom : 2px;
108
- border-radius : 2px;
109
- border-color : inherit;
110
- border : 2px solid;
106
+ display: block;
107
+ left: 0;
108
+ top: 0;
109
+ right: 0;
110
+ bottom: 0;
111
+ border-color: inherit;
112
+ border: 2px solid;
111
113
  border-bottom-width: 26px;
112
- position : absolute;
114
+ position: absolute;
113
115
  }
@@ -2,7 +2,7 @@ function main(element = document.createElement("div")) {
2
2
  element.innerHTML = colorpicker;
3
3
  var saved_value;
4
4
  var selector = element.firstChild;
5
- select(selector, colorpad(), false);
5
+ select(selector, colorpad(), false, 'y');
6
6
  render(element, {
7
7
  a: button,
8
8
  colorlabel,
@@ -58,7 +58,7 @@ var prototype = {
58
58
 
59
59
  function createElement(name) {
60
60
  var node = isNode(name) ? name.cloneNode() : isFunction(name) ? name() : document.createElement(name);
61
- if (name.className) node.className = name.className;
61
+ if (name.className) addClass(node, name.className);
62
62
  appendChild(node, slice.call(arguments, 1));
63
63
  extend(node, prototype);
64
64
  return node;
@@ -155,6 +155,7 @@ function getUrlParamsForApi(api, url) {
155
155
  cap.push(a.slice(1));
156
156
  return r;
157
157
  });
158
+ if (api.base) base = api.base + base;
158
159
  var params = {};
159
160
  url = url.replace(/[\?#]*$/g, function (match) {
160
161
  match.split(/[&#\?]+/).forEach(function (s) {
@@ -844,7 +845,10 @@ var data = {
844
845
  this.responseLoading(instance);
845
846
  var params = privates.pack(sid, params1);
846
847
  if (!privates.validApi(api, params)) throw aborted;
847
- var { method, uri, params, selector } = privates.prepare(api.method, api.url, params);
848
+ let url = api.url;
849
+ var base = api.base;
850
+ if (base) url = base + api.path;
851
+ var { method, uri, params, selector } = privates.prepare(api.method, url, params);
848
852
  var promise = new Promise(function (ok, oh) {
849
853
  var headers = api.headers;
850
854
  if (headers) {
@@ -37,6 +37,17 @@ var renderModel = function (field, data) {
37
37
  var constructors = {
38
38
  input,
39
39
  raw: input,
40
+ swap(e) {
41
+ var { field } = e;
42
+ e = swap(e);
43
+ if (field.options) {
44
+ e.getValue = function () {
45
+ return field.options[+this.checked].value;
46
+ };
47
+ }
48
+ return e;
49
+ },
50
+ switch: swap,
40
51
  row: textarea,
41
52
  password,
42
53
  text: textarea,
@@ -134,8 +145,18 @@ var readonly_types = {
134
145
  "size"({ field }, data) {
135
146
  var f = data[field.key];
136
147
  return size(f);
137
- }
148
+ },
149
+ swap(e, data) {
150
+ var { field } = e;
151
+ var v = data[field.key];
152
+ if (field.options) {
153
+ var o = field.options[v];
154
+ if (o) return o.name;
155
+ }
156
+ return v;
157
+ },
138
158
  };
159
+ readonly_types.select = readonly_types.swap;
139
160
  function main(elem) {
140
161
  var build = function () {
141
162
  var { data, readonly, field } = elem;
@@ -222,7 +243,6 @@ function main(elem) {
222
243
  }
223
244
  };
224
245
  on("changes")(elem, function ({ changes }) {
225
-
226
246
  if (changes.data || changes.field || changes.readonly) {
227
247
  build();
228
248
  }
@@ -262,12 +262,12 @@ var _as_yextra = function (global, innerWidth, innerHeight, element, target, poi
262
262
  viewrect.right = viewrect.left + viewrect.width;
263
263
  viewrect.bottom = viewrect.top + viewrect.height;
264
264
  }
265
- var maxHeight = Math.max(position.top, innerHeight - position.top - position.height);
265
+ var maxHeight = Math.max(position.top, innerHeight - position.top - position.height) | 0;
266
266
  var maxWidth = Math.max(position.left + position.width, innerWidth - position.left);
267
267
  var height = element.offsetHeight;
268
268
  //如果高度超出可视区,调整高度
269
269
  if (height > maxHeight) {
270
- css(element, { height: fromOffset(maxHeight) });
270
+ css(element, { height: fromOffset(maxHeight), maxHeight: fromOffset(maxHeight) });
271
271
  }
272
272
 
273
273
  css(element, `min-width:auto;`);