efront 3.3.8 → 3.4.3

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 (65) hide show
  1. package/apps/pivot/api.yml +3 -0
  2. package/apps/pivot/auth/login.html +9 -0
  3. package/apps/pivot/auth/login.js +30 -0
  4. package/apps/pivot/auth/login.less +11 -0
  5. package/apps/pivot/home/short.html +1 -0
  6. package/apps/pivot/home/short.js +5 -0
  7. package/apps/pivot/home/short.less +1 -0
  8. package/apps/pivot/home/welcome.html +14 -0
  9. package/apps/pivot/home/welcome.js +24 -0
  10. package/apps/pivot/home/welcome.less +8 -0
  11. package/apps/pivot/index.html +41 -0
  12. package/apps/pivot/main.js +18 -0
  13. package/apps/pivot/menu.yml +3 -0
  14. package/apps/zimoli/book/main.js +1 -1
  15. package/apps/zimoli/broadcast/main.js +1 -1
  16. package/apps/zimoli/index.html +1 -0
  17. package/apps/zimoli/main.js +1 -1
  18. package/apps/zimoli/nearby/main.js +1 -1
  19. package/apps/zimoli/yuanfen/main.js +1 -1
  20. package/coms/basic/crypt.js +1 -1
  21. package/coms/basic/refilm_decode.js +13 -2
  22. package/coms/basic/valid.js +10 -0
  23. package/coms/compile/common.js +12 -0
  24. package/coms/compile/scanner2.js +1 -1
  25. package/coms/crypt/encode62.js +23 -33
  26. package/coms/crypt/encode62_test.js +2 -1
  27. package/coms/frame/left.html +11 -6
  28. package/coms/frame/left.js +6 -3
  29. package/coms/frame/left.less +38 -36
  30. package/coms/frame/main.js +1 -1
  31. package/coms/frame/route.js +52 -4
  32. package/coms/frame/top.less +12 -13
  33. package/coms/kugou/buildList.js +1 -0
  34. package/coms/kugou/player.js +3 -0
  35. package/coms/layer/glance.less +4 -2
  36. package/coms/zimoli/alert.js +8 -4
  37. package/coms/zimoli/avatar.js +0 -1
  38. package/coms/zimoli/checker.html +1 -1
  39. package/coms/zimoli/checker.less +8 -13
  40. package/coms/zimoli/cross.js +1 -1
  41. package/coms/zimoli/css.js +1 -0
  42. package/coms/zimoli/data.js +8 -3
  43. package/coms/zimoli/encode62.js +13 -0
  44. package/coms/zimoli/field.html +2 -0
  45. package/coms/zimoli/field.js +41 -17
  46. package/coms/zimoli/field.less +19 -0
  47. package/coms/zimoli/form.js +8 -0
  48. package/coms/zimoli/menu.js +11 -1
  49. package/coms/zimoli/menu.less +1 -1
  50. package/coms/zimoli/menuItem.js +4 -1
  51. package/coms/zimoli/model.js +1 -0
  52. package/coms/zimoli/radio.html +1 -3
  53. package/coms/zimoli/radio.less +10 -22
  54. package/coms/zimoli/render.js +34 -63
  55. package/coms/zimoli/renderDefaults.js +1 -0
  56. package/coms/zimoli/submit.js +41 -0
  57. package/coms/zimoli/view.js +0 -5
  58. package/coms/zimoli/view.less +17 -11
  59. package/coms/zimoli/zimoli.js +11 -9
  60. package/data/mime.json +3 -0
  61. package/package.json +1 -1
  62. package/public/efront.js +1 -1
  63. package/coms/zimoli/beian.html +0 -1
  64. package/coms/zimoli/beian.js +0 -5
  65. package/coms/zimoli/beian.less +0 -13
@@ -0,0 +1,3 @@
1
+ ./aapi/ authorization:
2
+ login: options /::login-:a
3
+ run: options /:::run
@@ -0,0 +1,9 @@
1
+ <div head>
2
+ 请输入服务器密码
3
+ </div>
4
+ <div body>
5
+ <field ng-repeat="f in fields" ng-src="[f,data]"></field>
6
+ </div>
7
+ <div foot>
8
+ <button pending.="pending" type="submit">登录</button>
9
+ </div>
@@ -0,0 +1,30 @@
1
+ var fields = refilm`
2
+ 密码/password* password
3
+ `;
4
+
5
+ function main() {
6
+ var page = view();
7
+ page.innerHTML = login;
8
+ drag.on(page);
9
+ on("append")(page, function () {
10
+ move.bindPosition(page, [.5, .5]);
11
+ });
12
+ renderWithDefaults(page, { fields, data: {}, pending: false });
13
+ on("submit")(page, async function () {
14
+ var { password } = submit(fields, this.$scope.data);
15
+ this.$scope.pending = true;
16
+ page.disabled = true;
17
+ try {
18
+ var info = await data.from("login", {
19
+ a: encode62.timeencode(encode62.geta(password))
20
+ }).loading_promise;
21
+ info = encode62.timeupdate(info);
22
+ data.setSource({ authorization: info });
23
+ user.login({})
24
+ go('/main')
25
+ } catch {
26
+ }
27
+ this.$scope.pending = false;
28
+ })
29
+ return page;
30
+ }
@@ -0,0 +1,11 @@
1
+ & {
2
+ position: absolute;
3
+ }
4
+
5
+ [foot],
6
+ [head] {
7
+ text-align: center;
8
+ }
9
+ .button{
10
+ padding: 0px 40px;
11
+ }
@@ -0,0 +1 @@
1
+ <div>短链接管理,敬请期待</div>
@@ -0,0 +1,5 @@
1
+ function main() {
2
+ var page = div();
3
+ page.innerHTML = template;
4
+ return page;
5
+ }
@@ -0,0 +1 @@
1
+ &{}
@@ -0,0 +1,14 @@
1
+
2
+ <div>
3
+ 已登录到服务器,您可以进行如下操作
4
+ </div>
5
+ <block>
6
+ <padding>
7
+ 清理服务器缓存 <btn @click="run('clear-cache',this)">清理</btn>
8
+ </padding>
9
+ </block>
10
+ <block>
11
+ <padding>
12
+ 退出登录 <btn @click="logout()">退出</btn>
13
+ </padding>
14
+ </block>
@@ -0,0 +1,24 @@
1
+ function main() {
2
+ var page = div();
3
+ page.innerHTML = template;
4
+ renderWithDefaults(page, {
5
+ status: [],
6
+ async run(id, target) {
7
+ target.setAttribute('pending', '')
8
+ try {
9
+ var info = await data.from("run", {
10
+ run: id
11
+ }).loading_promise;
12
+ if (info) alert(info, 'pass');
13
+ } catch { }
14
+ target.removeAttribute('pending');
15
+ },
16
+ logout() {
17
+ data.setSource('authorization', null);
18
+ user.logout();
19
+ location.reload();
20
+ }
21
+ });
22
+ console.log(page)
23
+ return page;
24
+ }
@@ -0,0 +1,8 @@
1
+ &{
2
+ line-height: 28px;
3
+ }
4
+ btn{
5
+ padding: 0 16px;
6
+ vertical-align: top;
7
+ margin-left: 20px;
8
+ }
@@ -0,0 +1,41 @@
1
+ <!DOCTYPE html>
2
+ <!--
3
+ http://efront.cc
4
+ -->
5
+ <html lang="zh-CN">
6
+
7
+ <head>
8
+ <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
9
+ <meta charset="utf-8" />
10
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
11
+ <link rel="Shortcut Icon" href="/favicon.ico" type="image/x-icon" />
12
+ <meta name="viewport" content="initial-scale=1,maximum-scale=1,width=device-width" />
13
+ <title>Efront 服务器管控平台</title>
14
+ <script deleteoncompile efrontloader>
15
+ // 若要在开发环境使用内置组件,请保留此script标签中的代码,在编译发布时,这里的代码会自动删除
16
+ </script>
17
+ <style>
18
+ html {
19
+ height: 100%;
20
+ font-family: "SF Pro SC", "SF Pro Text", "SF Pro Icons", "PingFang SC", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
21
+ }
22
+
23
+ *,
24
+ ::before,
25
+ ::after {
26
+ box-sizing: border-box;
27
+ }
28
+
29
+ body {
30
+ border: none;
31
+ margin: 0;
32
+ padding: 0;
33
+ height: 100%;
34
+ overflow: hidden;
35
+ }
36
+ </style>
37
+ </head>
38
+
39
+ <body scroll=no menu="menu.yml"></body>
40
+
41
+ </html>
@@ -0,0 +1,18 @@
1
+ data.loadConfig("api.yml");
2
+ user.loginPath = '/auth/login';
3
+ // user.token = data.getSource('authorization');
4
+ setInterval(function () {
5
+ var auth = data.getSource('authorization');
6
+ if (!auth) return;
7
+ var auth1 = encode62.timeupdate(auth);
8
+ if (auth1 !== auth) data.setSource("authorization", auth1);
9
+ user.token = auth1;
10
+ }, 2000);
11
+ login();
12
+ var layer = layer$glance({
13
+ left: "frame$left",
14
+ top: 'frame$top'
15
+ });
16
+ function main() {
17
+ return layer;
18
+ }
@@ -0,0 +1,3 @@
1
+ 首页: /home/welcome
2
+ 工作台: /home/short
3
+ # 用户列表: /user/list
@@ -1,6 +1,6 @@
1
1
  // 中文编码 utf-8
2
2
  var tbar = titlebar("预订", null, false);
3
- var page = createElement(div, beian, tbar);
3
+ var page = createElement(div, tbar);
4
4
  css(page, "font-size:40px;color:#fff;");
5
5
 
6
6
  function main() {
@@ -1,6 +1,6 @@
1
1
  // 中文编码 utf-8
2
2
  var tbar = titlebar("大厅", null, false);
3
- var page = createElement(div, beian, tbar);
3
+ var page = createElement(div, tbar);
4
4
  css(page, "font-size:40px;color:#fff;");
5
5
 
6
6
  function main() {
@@ -34,6 +34,7 @@
34
34
  overflow: hidden;
35
35
  }
36
36
  </style>
37
+ <script>window.e=0</script>
37
38
  </head>
38
39
 
39
40
  <body scroll=no max-render=1440></body>
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  var menu = div();
4
4
  var config = require("./config");
5
- appendChild(menu, kugou$menu, kugou$page, beian);
5
+ appendChild(menu, kugou$menu, kugou$page);
6
6
  i18n.loadSource({
7
7
  zh: {
8
8
  "name": "用户名"
@@ -1,6 +1,6 @@
1
1
  // 中文编码 utf-8
2
2
  var tbar = titlebar("附近", null, false);
3
- var page = createElement(div, beian, tbar);
3
+ var page = createElement(div, tbar);
4
4
  css(page, "font-size:40px;color:#fff;");
5
5
 
6
6
  function main() {
@@ -8,7 +8,7 @@ css(qq_icon, "width:28px;height:28px;margin:-14px;top:50%;left:50%;position:abso
8
8
  css(loginBtn, "display:inline-block;position:absolute;right:0;top:0;height:100%;width:60px;background-color:transparent");
9
9
  var tbar = titlebar("EFRONT.cc", [loginBtn], false);
10
10
  css(tbar,"text-align:left;padding-left:20px;")
11
- var page = createElement(div, beian, tbar, slider());
11
+ var page = createElement(div, tbar, slider());
12
12
  css(page, "font-size:40px;color:#fff;padding-top:50px;");
13
13
 
14
14
  var group_sample = createElement(div);
@@ -58,6 +58,6 @@ module.exports = {
58
58
  checksign: function (data, mask) {
59
59
  var sign = data.sign;
60
60
  delete data.sign;
61
- return sign = signonly(data, mask);
61
+ return sign === signonly(data, mask);
62
62
  }
63
63
  };
@@ -260,8 +260,16 @@ function parse(piece) {
260
260
  }
261
261
  var [name, type, options] = piece, key, repeat;
262
262
  if (piece.length === 1 && isObject(name)) {
263
- var { name, needs, type, key, size, unit, endwith, ratio, value, repeat, comment, options } = name;
263
+ var { name, needs, required, checks, type, key, size, unit, endwith, ratio, value, repeat, comment, options } = name;
264
264
  } else {
265
+ var is_require = a => {
266
+ if (/^\*|\*$/.test(a)) {
267
+ required = true;
268
+ return a.replace(/^\*|\*$/, '');
269
+ }
270
+ return a;
271
+ };
272
+ type = is_require(type);
265
273
  if (typeof name === 'string') {
266
274
  if (!isContainer) {
267
275
  if (!type) {
@@ -362,14 +370,17 @@ function parse(piece) {
362
370
  type = type.slice(1);
363
371
  }
364
372
  if (typeof options === "string") {
373
+ options = is_require(options);
365
374
  var needUnfold = /^\[|\]$/.test(options);
366
375
  options = options.replace(/^\[|\]$/g, '');
367
376
  if (/,/.test(options)) options = scanSlant(options, ',');
368
377
  else options = scanSlant(options, "");
369
378
  if (needUnfold) unfoldOptions(size, options);
370
379
  }
380
+ name = is_require(name);
381
+ key = is_require(key);
371
382
  }
372
- var field = { name, needs, type, key, size, unit, endwith, ratio, value, repeat, comment, options };
383
+ var field = { name, checks, required, needs, type, key, size, unit, endwith, ratio, value, repeat, comment, options };
373
384
  var parent = piecepath[piecepath.length - 1];
374
385
  if (parent) {
375
386
  field.parent = parent;
@@ -0,0 +1,10 @@
1
+ function valid(field, data) {
2
+ var error;
3
+ if (isEmpty(data[field.key])) {
4
+ if (field.required) {
5
+ return "empty";
6
+ }
7
+ return;
8
+ }
9
+ return error;
10
+ }
@@ -15,6 +15,7 @@ var number_reg = /^[\+\-]?(0x[0-9a-f]+|0b\d+|0o\d+|(\d*\.\d+|\d+\.?)(e[\+\-]?\d+
15
15
  var skipAssignment = function (o) {
16
16
  var needpunc = false;
17
17
  var o0 = o;
18
+ var qcount = 0;
18
19
  loop: while (o) switch (o.type) {
19
20
  case STAMP:
20
21
  switch (o.text) {
@@ -32,6 +33,17 @@ var skipAssignment = function (o) {
32
33
  o = o.next;
33
34
  needpunc = false;
34
35
  break;
36
+ case "?":
37
+ qcount++;
38
+ needpunc = false;
39
+ o = o.next;
40
+ break;
41
+ case ":":
42
+ qcount--;
43
+ if (qcount < 0) break loop;
44
+ needpunc = false;
45
+ o = o.next;
46
+ break;
35
47
  default:
36
48
  if (/^[!~\+\-]+$/.test(o.text)) {
37
49
  needpunc = false;
@@ -152,7 +152,7 @@ var detour = function (o, ie) {
152
152
  class Program extends Array {
153
153
  COMMENT = COMMENT
154
154
  SPACE = SPACE
155
- STAMP = STRAP
155
+ STRAP = STRAP
156
156
  STAMP = STAMP
157
157
  VALUE = VALUE
158
158
  QUOTED = QUOTED
@@ -7,7 +7,7 @@ src.split("").forEach((s, i) => map[s] = i);
7
7
  function encode62(string) {
8
8
  string = String(string)
9
9
  string = string.length + string + "2017-08-19";
10
- var buff = Buffer.from(src);
10
+ var buff = src.split('');
11
11
  for (var cx = 0, dx = buff.length + src.length, sl = string.length, cl = buff.length; cx < dx; cx++) {
12
12
  var s1 = string.charCodeAt(cx % sl) % cl;
13
13
  var s2 = cx % cl;
@@ -15,7 +15,7 @@ function encode62(string) {
15
15
  buff[s1] = buff[s2];
16
16
  buff[s2] = btemp;
17
17
  }
18
- return buff.toString();
18
+ return buff.join('');
19
19
  };
20
20
 
21
21
 
@@ -35,9 +35,23 @@ Object.assign(encode62, {
35
35
  },
36
36
  timeencode(string) {
37
37
  var { time_delta } = this;
38
- var time_stamp = +new Date();
38
+ var time_free = time_delta / 6 | 0;
39
+ var time_stamp = +new Date() - time_free;
39
40
  var time_rest = time_stamp % time_delta;
40
- return this.encode62(string, time_stamp.toString(36)) + time_rest.toString(36).padStart(time_delta.toString(36).length, '0');
41
+ var time_rest_str = time_rest.toString(36);
42
+ var time_delta_str = time_delta.toString(36);
43
+ return this.encode62(string, time_stamp.toString(36)) + repeat("0", time_delta_str.length - time_rest_str.length) + time_rest_str;
44
+ },
45
+ timeupdate(string) {
46
+ var { time_delta } = this;
47
+ var time_rest = string.slice(string.length - time_delta.toString(36).length, string.length);
48
+ var time_start = parseInt((new Date() - parseInt(time_rest, 36)) / time_delta) * time_delta;
49
+ var time_stamp = time_start + parseInt(time_rest, 36);
50
+ if (time_stamp + (time_delta >> 1) > +new Date()) {
51
+ return string;
52
+ } else {
53
+ return this.timeencode(this.timedecode(string));
54
+ }
41
55
  },
42
56
  encode62(data, sign) {
43
57
  if (!sign) return data;
@@ -53,15 +67,6 @@ Object.assign(encode62, {
53
67
  });
54
68
  return result;
55
69
  },
56
- encode(data, sign) {
57
- if (!sign) return data;
58
- var result = Buffer.from(data);
59
- sign = Buffer.from(sign);
60
- for (var cx = 0, dx = data.length; cx < dx; cx++) {
61
- result[cx] = result[cx] ^ sign[cx % sign.length];
62
- }
63
- return result;
64
- },
65
70
  decode(data, sign) {
66
71
  if (!sign) return data;
67
72
  var result = Buffer.from(data);
@@ -75,7 +80,7 @@ Object.assign(encode62, {
75
80
  return encode62(string);
76
81
  },
77
82
  genb() {
78
- return encode62(Date.now() + "" + Math.random());
83
+ return encode62(Date.now() * Math.random() + "" + Math.random().toString(36) + Math.random().toString(36).toUpperCase());
79
84
  },
80
85
  huan(x, y) {
81
86
  return x.split("").map(s => y[map[s]]).join("");
@@ -90,24 +95,9 @@ Object.assign(encode62, {
90
95
  y.split("").forEach((a, j) => y_map[a] = j);
91
96
  return z.split("").map(c => src[y_map[c]]).join("");
92
97
  },
93
- ab2c(a, b) {
94
- return this.huan(a, b);
95
- },
96
- ba2d(a, b) {
97
- return this.huan(b, a);
98
- },
99
- ca2b(c, a) {
100
- return this.yuan(c, a);
101
- },
102
- cb2a(c, b) {
103
- return this.suan(c, b);
104
- },
105
- da2b(d, a) {
106
- return this.suan(d, a);
107
- },
108
- db2a(d, b) {
109
- return this.yuan(d, b);
110
- }
111
98
  });
112
-
99
+ encode62.ab2c = encode62.ba2d = encode62.huan;
100
+ encode62.db2a = encode62.ca2b = encode62.yuan;
101
+ encode62.da2b = encode62.cb2a = encode62.suan;
102
+ encode62.encode = encode62.decode;
113
103
  encode62.decode62 = encode62.encode62;
@@ -32,7 +32,8 @@ describe("encode62_test", function () {
32
32
  c = encode62.ab2c(a, b);
33
33
  });
34
34
  it("ba2d", function () {
35
- d = encode62.ba2d(a, b);
35
+ // 注意,参数顺序已变更
36
+ d = encode62.ba2d(b, a);
36
37
  });
37
38
  it("ca2b", function () {
38
39
  expect(encode62.ca2b(c, a)).to.be.eq(b);
@@ -1,8 +1,13 @@
1
- <div class="navbar-header">
2
- <span class="fa fa-area-chart"></span>
3
- GRINCH
4
- <span class="dashboard_text">efront.cc</span>
1
+ <div ng-if="!user.isLogin" class="navbar-header">
2
+ <!-- <avatar></avatar> -->
3
+ <a @click="popup('#/user/login')" class="dashboard_text">请登录</a>
4
+ </div>
5
+ <div -else class="navbar-header">
6
+ <span class="dashboard_text" @click="go('/user/profile')">
7
+ <avatar ng-src="user.avatar" size=30></avatar>
8
+ <span ng-bind="user.name"></span>
9
+ <span ng-bind="user.roles"></span>
10
+ </span>
5
11
  </div>
6
12
  <ylist mode=inline ng-src="menu in menus" class="sidebar-menu" ng-active="menus.open(event.value)">
7
- </ylist>
8
- <btn class="setting" ng-click="go('/user/setting')"><i class="fa fa-gear"></i>设置</btn>
13
+ </ylist>
@@ -1,12 +1,15 @@
1
- var page = div();
1
+ var page = document.createElement("都说我负天下人_可你们天下人_又何曾善待过我");
2
2
  page.innerHTML = left;
3
- var route = frame$route;
3
+ if (!user.avatar) user.avatar = "user/avatar.png";
4
+ frame$route.fetch('menu.yml')
4
5
  render(page, {
5
6
  ylist: menu,
6
7
  btn: button,
7
8
  go,
8
9
  user,
9
- menus: route,
10
+ avatar,
11
+ popup,
12
+ menus: frame$route,
10
13
  });
11
14
  function main() {
12
15
  return page;
@@ -1,43 +1,45 @@
1
1
  & {
2
- padding : 50px 0 0 0;
2
+ padding: 50px 0 0 0;
3
3
  position: relative;
4
4
  }
5
5
 
6
6
  .navbar-header {
7
- height : 50px;
8
- padding : 10px 15px 10px 25px;
9
- font-size : 25px;
10
- line-height : 25px;
7
+ height: 50px;
8
+ padding: 10px 15px 10px 25px;
9
+ font-size: 25px;
10
+ line-height: 25px;
11
11
  text-transform: uppercase;
12
- color : #b8c7ce;
13
- margin-top : -50px;
12
+ color: #b8c7ce;
13
+ margin-top: -50px;
14
14
  }
15
15
 
16
16
  .dashboard_text {
17
- font-size : 12px;
17
+ font-size: 12px;
18
18
  text-transform: capitalize;
19
- display : block;
19
+ display: block;
20
20
  letter-spacing: 1px;
21
- padding-left : 35px;
22
- display : none;
21
+ padding-left: 35px;
22
+ display: none;
23
23
  }
24
24
 
25
-
25
+ ylist {
26
+ width: 100%;
27
+ }
26
28
 
27
29
  .sidebar-menu {
28
- height : 100%;
30
+ height: 100%;
29
31
  box-shadow: none;
30
32
  }
31
33
 
32
34
  .label {
33
35
  border-radius: 4px;
34
- height : 18px;
35
- line-height : 18px;
36
- margin : 12px 2px;
37
- float : right;
38
- top : 50%;
39
- padding : 0 8px;
40
- color : #fff;
36
+ height: 18px;
37
+ line-height: 18px;
38
+ margin: 12px 2px;
39
+ float: right;
40
+ top: 50%;
41
+ padding: 0 8px;
42
+ color: #fff;
41
43
 
42
44
  &.label-primary {
43
45
  background-color: #cd3213;
@@ -57,9 +59,9 @@
57
59
  }
58
60
 
59
61
  .fa-angle-left {
60
- width : auto;
61
- height : auto;
62
- padding : 0;
62
+ width: auto;
63
+ height: auto;
64
+ padding: 0;
63
65
  line-height: inherit;
64
66
  }
65
67
 
@@ -72,10 +74,10 @@
72
74
  }
73
75
 
74
76
  .tab1.header {
75
- font-size : 12px;
76
- color : #4b646f;
77
- background : #1a2226;
78
- height : 32px;
77
+ font-size: 12px;
78
+ color: #4b646f;
79
+ background: #1a2226;
80
+ height: 32px;
79
81
  line-height: 32px;
80
82
 
81
83
  &:hover {
@@ -84,18 +86,18 @@
84
86
  }
85
87
 
86
88
  &>.setting {
87
- position : absolute;
88
- bottom : 0;
89
- right : 0;
90
- left : 0;
91
- background : transparent;
92
- text-align : left;
89
+ position: absolute;
90
+ bottom: 0;
91
+ right: 0;
92
+ left: 0;
93
+ background: transparent;
94
+ text-align: left;
93
95
  line-height: 40px;
94
- height : 40px;
96
+ height: 40px;
95
97
 
96
98
  i {
97
- height : 40px;
98
- opacity : .9;
99
+ height: 40px;
100
+ opacity: .9;
99
101
  margin-right: 10px;
100
102
  line-height: inherit;
101
103
  }
@@ -2,7 +2,7 @@ function main(mainpath) {
2
2
  var page = layer$glance({
3
3
  left: 'frame$left',
4
4
  top: 'frame$top',
5
- main: mainpath || 'page$grinch'
5
+ main: mainpath
6
6
  });
7
7
  return page;
8
8
  }