cbvirtua 1.0.50 → 1.0.52

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 (139) hide show
  1. package/canvas-demo-master/canvas-demo-master/README.md +7 -0
  2. package/canvas-demo-master/canvas-demo-master/countShowBall/README.md +7 -0
  3. package/canvas-demo-master/canvas-demo-master/countShowBall/countdown.js +227 -0
  4. package/canvas-demo-master/canvas-demo-master/countShowBall/digit.js +135 -0
  5. package/canvas-demo-master/canvas-demo-master/countShowBall/index.html +23 -0
  6. package/canvas-demo-master/canvas-demo-master/write/README.md +17 -0
  7. package/canvas-demo-master/canvas-demo-master/write/css/write.css +40 -0
  8. package/canvas-demo-master/canvas-demo-master/write/index.html +26 -0
  9. package/canvas-demo-master/canvas-demo-master/write/js/controller.js +43 -0
  10. package/canvas-demo-master/canvas-demo-master/write/js/index.js +10 -0
  11. package/canvas-demo-master/canvas-demo-master/write/js/paper.js +63 -0
  12. package/canvas-demo-master/canvas-demo-master/write/js/require.js +36 -0
  13. package/canvas-demo-master/canvas-demo-master/write/js/write.js +143 -0
  14. package/canvas-demo-master/canvas-demo-master/writeRxJS/README.md +17 -0
  15. package/canvas-demo-master/canvas-demo-master/writeRxJS/css/write.css +40 -0
  16. package/canvas-demo-master/canvas-demo-master/writeRxJS/index.html +27 -0
  17. package/canvas-demo-master/canvas-demo-master/writeRxJS/js/controller.js +43 -0
  18. package/canvas-demo-master/canvas-demo-master/writeRxJS/js/index.js +10 -0
  19. package/canvas-demo-master/canvas-demo-master/writeRxJS/js/paper.js +65 -0
  20. package/canvas-demo-master/canvas-demo-master/writeRxJS/js/require.js +36 -0
  21. package/canvas-demo-master/canvas-demo-master/writeRxJS/js/write.js +107 -0
  22. package/drawingBoard-main/drawingBoard-main/README.md +32 -0
  23. package/drawingBoard-main/drawingBoard-main/index.html +13 -0
  24. package/drawingBoard-main/drawingBoard-main/package.json +31 -0
  25. package/drawingBoard-main/drawingBoard-main/pnpm-lock.yaml +2378 -0
  26. package/drawingBoard-main/drawingBoard-main/public/vite.svg +1 -0
  27. package/drawingBoard-main/drawingBoard-main/src/App.vue +64 -0
  28. package/drawingBoard-main/drawingBoard-main/src/assets/huabi.svg +1 -0
  29. package/drawingBoard-main/drawingBoard-main/src/assets/huabigongju-juxing.svg +1 -0
  30. package/drawingBoard-main/drawingBoard-main/src/assets/huabigongju-tuoyuan.svg +1 -0
  31. package/drawingBoard-main/drawingBoard-main/src/assets/huabigongju-wenben.svg +1 -0
  32. package/drawingBoard-main/drawingBoard-main/src/assets/jiantougongju-hover.svg +1 -0
  33. package/drawingBoard-main/drawingBoard-main/src/assets/layer.svg +1 -0
  34. package/drawingBoard-main/drawingBoard-main/src/assets/layer_1.svg +1 -0
  35. package/drawingBoard-main/drawingBoard-main/src/assets/tuceng.svg +1 -0
  36. package/drawingBoard-main/drawingBoard-main/src/assets/tuceng_1.svg +1 -0
  37. package/drawingBoard-main/drawingBoard-main/src/assets/wujiaoxing.svg +1 -0
  38. package/drawingBoard-main/drawingBoard-main/src/assets/xiangpigongju.svg +1 -0
  39. package/drawingBoard-main/drawingBoard-main/src/assets/xuanzegongju.svg +1 -0
  40. package/drawingBoard-main/drawingBoard-main/src/assets/zhixiangongju.svg +1 -0
  41. package/drawingBoard-main/drawingBoard-main/src/components/plugins/LayerOptions.tsx +67 -0
  42. package/drawingBoard-main/drawingBoard-main/src/components/plugins/LineSegmentBackgroundColorPlugin.tsx +25 -0
  43. package/drawingBoard-main/drawingBoard-main/src/components/plugins/LineSegmentColorPlugin.tsx +25 -0
  44. package/drawingBoard-main/drawingBoard-main/src/components/plugins/LineSegmentSizePlugin.tsx +26 -0
  45. package/drawingBoard-main/drawingBoard-main/src/components/plugins/TextColor.tsx +25 -0
  46. package/drawingBoard-main/drawingBoard-main/src/components/plugins/TextSize.tsx +27 -0
  47. package/drawingBoard-main/drawingBoard-main/src/components/tools/Menu.scss +10 -0
  48. package/drawingBoard-main/drawingBoard-main/src/components/tools/Menu.tsx +33 -0
  49. package/drawingBoard-main/drawingBoard-main/src/components/tools/Tips.scss +16 -0
  50. package/drawingBoard-main/drawingBoard-main/src/components/tools/Tips.tsx +5 -0
  51. package/drawingBoard-main/drawingBoard-main/src/components/tools/Toolbar.scss +26 -0
  52. package/drawingBoard-main/drawingBoard-main/src/components/tools/Toolbar.tsx +39 -0
  53. package/drawingBoard-main/drawingBoard-main/src/components/tools/ToolbarMenu.scss +45 -0
  54. package/drawingBoard-main/drawingBoard-main/src/components/tools/ToolbarMenu.tsx +61 -0
  55. package/drawingBoard-main/drawingBoard-main/src/components/tools/index.tsx +22 -0
  56. package/drawingBoard-main/drawingBoard-main/src/main.scss +4 -0
  57. package/drawingBoard-main/drawingBoard-main/src/main.ts +11 -0
  58. package/drawingBoard-main/drawingBoard-main/src/shims-vue.d.ts +5 -0
  59. package/drawingBoard-main/drawingBoard-main/src/utils/App.ts +24 -0
  60. package/drawingBoard-main/drawingBoard-main/src/utils/DrawingBoard.ts +213 -0
  61. package/drawingBoard-main/drawingBoard-main/src/utils/History.ts +70 -0
  62. package/drawingBoard-main/drawingBoard-main/src/utils/Tools.ts +241 -0
  63. package/drawingBoard-main/drawingBoard-main/src/utils/types.ts +55 -0
  64. package/drawingBoard-main/drawingBoard-main/src/vite-env.d.ts +1 -0
  65. package/drawingBoard-main/drawingBoard-main/tsconfig.app.json +36 -0
  66. package/drawingBoard-main/drawingBoard-main/tsconfig.json +7 -0
  67. package/drawingBoard-main/drawingBoard-main/tsconfig.node.json +23 -0
  68. package/drawingBoard-main/drawingBoard-main/vite.config.ts +16 -0
  69. package/hidpi-canvas-polyfill-master.zip +0 -0
  70. package/package.json +1 -1
  71. package//346/226/260/345/273/272 /346/226/207/346/234/254/346/226/207/346/241/243.txt" +53 -0
  72. package/canvas-example-main.zip +0 -0
  73. package/hanzi-writer/.prettierrc.json +0 -7
  74. package/hanzi-writer/COPYING.md +0 -11
  75. package/hanzi-writer/LICENSE +0 -20
  76. package/hanzi-writer/README.md +0 -37
  77. package/hanzi-writer/babel.config.js +0 -14
  78. package/hanzi-writer/dist/types/HanziWriter.d.ts +0 -108
  79. package/hanzi-writer/dist/types/LoadingManager.d.ts +0 -20
  80. package/hanzi-writer/dist/types/Positioner.d.ts +0 -22
  81. package/hanzi-writer/dist/types/Quiz.d.ts +0 -40
  82. package/hanzi-writer/dist/types/RenderState.d.ts +0 -74
  83. package/hanzi-writer/dist/types/__tests__/HanziWriter-test.d.ts +0 -1
  84. package/hanzi-writer/dist/types/__tests__/LoadingManager-test.d.ts +0 -1
  85. package/hanzi-writer/dist/types/__tests__/Mutation-test.d.ts +0 -1
  86. package/hanzi-writer/dist/types/__tests__/Positioner-test.d.ts +0 -1
  87. package/hanzi-writer/dist/types/__tests__/Quiz-test.d.ts +0 -1
  88. package/hanzi-writer/dist/types/__tests__/RenderState-test.d.ts +0 -1
  89. package/hanzi-writer/dist/types/__tests__/defaultCharDataLoader-test.d.ts +0 -1
  90. package/hanzi-writer/dist/types/__tests__/geometry-test.d.ts +0 -1
  91. package/hanzi-writer/dist/types/__tests__/parseCharData-test.d.ts +0 -1
  92. package/hanzi-writer/dist/types/__tests__/strokeMatches-test.d.ts +0 -1
  93. package/hanzi-writer/dist/types/__tests__/utils-test.d.ts +0 -1
  94. package/hanzi-writer/dist/types/characterActions.d.ts +0 -18
  95. package/hanzi-writer/dist/types/defaultCharDataLoader.d.ts +0 -3
  96. package/hanzi-writer/dist/types/defaultOptions.d.ts +0 -3
  97. package/hanzi-writer/dist/types/geometry.d.ts +0 -38
  98. package/hanzi-writer/dist/types/models/Character.d.ts +0 -6
  99. package/hanzi-writer/dist/types/models/Stroke.d.ts +0 -17
  100. package/hanzi-writer/dist/types/models/UserStroke.d.ts +0 -8
  101. package/hanzi-writer/dist/types/parseCharData.d.ts +0 -3
  102. package/hanzi-writer/dist/types/quizActions.d.ts +0 -10
  103. package/hanzi-writer/dist/types/renderers/HanziWriterRendererBase.d.ts +0 -14
  104. package/hanzi-writer/dist/types/renderers/RenderTargetBase.d.ts +0 -22
  105. package/hanzi-writer/dist/types/renderers/StrokeRendererBase.d.ts +0 -13
  106. package/hanzi-writer/dist/types/renderers/canvas/CharacterRenderer.d.ts +0 -14
  107. package/hanzi-writer/dist/types/renderers/canvas/HanziWriterRenderer.d.ts +0 -19
  108. package/hanzi-writer/dist/types/renderers/canvas/RenderTarget.d.ts +0 -6
  109. package/hanzi-writer/dist/types/renderers/canvas/StrokeRenderer.d.ts +0 -16
  110. package/hanzi-writer/dist/types/renderers/canvas/__tests__/CharacterRenderer-test.d.ts +0 -1
  111. package/hanzi-writer/dist/types/renderers/canvas/__tests__/HanziWriterRenderer-test.d.ts +0 -1
  112. package/hanzi-writer/dist/types/renderers/canvas/__tests__/RenderTarget-test.d.ts +0 -1
  113. package/hanzi-writer/dist/types/renderers/canvas/__tests__/StrokeRenderer-test.d.ts +0 -1
  114. package/hanzi-writer/dist/types/renderers/canvas/__tests__/canvasUtils-test.d.ts +0 -1
  115. package/hanzi-writer/dist/types/renderers/canvas/__tests__/renderUserStroke-test.d.ts +0 -1
  116. package/hanzi-writer/dist/types/renderers/canvas/canvasUtils.d.ts +0 -9
  117. package/hanzi-writer/dist/types/renderers/canvas/index.d.ts +0 -7
  118. package/hanzi-writer/dist/types/renderers/canvas/renderUserStroke.d.ts +0 -7
  119. package/hanzi-writer/dist/types/renderers/svg/CharacterRenderer.d.ts +0 -20
  120. package/hanzi-writer/dist/types/renderers/svg/HanziWriterRenderer.d.ts +0 -20
  121. package/hanzi-writer/dist/types/renderers/svg/RenderTarget.d.ts +0 -11
  122. package/hanzi-writer/dist/types/renderers/svg/StrokeRenderer.d.ts +0 -21
  123. package/hanzi-writer/dist/types/renderers/svg/UserStrokeRenderer.d.ts +0 -15
  124. package/hanzi-writer/dist/types/renderers/svg/__tests__/CharacterRenderer-test.d.ts +0 -1
  125. package/hanzi-writer/dist/types/renderers/svg/__tests__/HanziWriterRenderer-test.d.ts +0 -1
  126. package/hanzi-writer/dist/types/renderers/svg/__tests__/StrokeRenderer-test.d.ts +0 -1
  127. package/hanzi-writer/dist/types/renderers/svg/__tests__/svgUtils-test.d.ts +0 -1
  128. package/hanzi-writer/dist/types/renderers/svg/index.d.ts +0 -7
  129. package/hanzi-writer/dist/types/renderers/svg/svgUtils.d.ts +0 -5
  130. package/hanzi-writer/dist/types/strokeMatches.d.ts +0 -14
  131. package/hanzi-writer/dist/types/testUtils.d.ts +0 -1
  132. package/hanzi-writer/dist/types/typings/types.d.ts +0 -121
  133. package/hanzi-writer/dist/types/utils.d.ts +0 -26
  134. package/hanzi-writer/jest-jsdom-env.js +0 -20
  135. package/hanzi-writer/package.json +0 -66
  136. package/hanzi-writer/rollup.config.js +0 -58
  137. package/hanzi-writer/tsconfig.json +0 -79
  138. package/progress-master.zip +0 -0
  139. package/xbossdebug-wechat-master.zip +0 -0
@@ -0,0 +1,7 @@
1
+ # canvas-demo
2
+ > 一些canvas练习的效果图
3
+
4
+ ----------------------------------
5
+
6
+ > countShowBall -- 小球时钟动画
7
+ > write -- 毛笔字帖
@@ -0,0 +1,7 @@
1
+ # 小球时钟动画
2
+
3
+ 使用canvas绘图技术,做出小球爆散的倒计时效果
4
+ [在线演示](http://zjy.space/canvas-demo/countShowBall/)
5
+
6
+ ## 效果图
7
+ ![](http://i2.piimg.com/09c4035bd029e227.png)
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Created by zjy on 2016/4/3.
3
+ */
4
+ var WINDOW_WIDTH = 1024;
5
+ var WINDOW_HEIGHT = 768;
6
+ var R = 8;
7
+ var MARGIN_TOP = 60;
8
+ var MARGIN_LEFT = 30;
9
+
10
+ const endTime = new Date();
11
+ endTime.setHours(endTime.getHours()+1);
12
+ var curShowTimeSeconds = 0;
13
+
14
+ var balls = [];
15
+ const colors = ["#33B5E5","#0099CC","#AA66CC","#9933CC","#99CC00","#669900","#FFBB33","#FF8800","#FF4444","#CC0000"];
16
+
17
+ window.onload = function () {
18
+
19
+ WINDOW_WIDTH = document.body.clientWidth;
20
+ WINDOW_HEIGHT = document.body.clientHeight;
21
+
22
+ MARGIN_LEFT = Math.round(WINDOW_WIDTH/10);
23
+ MARGIN_TOP = Math.round(WINDOW_HEIGHT/5);
24
+
25
+ R = Math.round(WINDOW_WIDTH * 4 / 5 / 108) - 1;
26
+
27
+
28
+ var canvas = document.getElementById('canvas');
29
+ var context = canvas.getContext('2d');
30
+
31
+ canvas.width = WINDOW_WIDTH;
32
+ canvas.height = WINDOW_HEIGHT;
33
+ curShowTimeSeconds = getCurrentShowTimeSeconds();
34
+
35
+ setInterval(function () {
36
+ render(context);
37
+ update();
38
+ }, 50);
39
+ };
40
+
41
+ window.onresize = function () {
42
+ WINDOW_WIDTH = document.body.clientWidth;
43
+ WINDOW_HEIGHT = document.body.clientHeight;
44
+
45
+ MARGIN_LEFT = Math.round(WINDOW_WIDTH/10);
46
+ MARGIN_TOP = Math.round(WINDOW_HEIGHT/5);
47
+
48
+ R = Math.round(WINDOW_WIDTH * 4 / 5 / 108) - 1;
49
+
50
+
51
+ var canvas = document.getElementById('canvas');
52
+
53
+ canvas.width = WINDOW_WIDTH;
54
+ canvas.height = WINDOW_HEIGHT;
55
+ };
56
+
57
+
58
+ function getCurrentShowTimeSeconds() {
59
+ var curTime = new Date();
60
+ var ret = endTime.getTime() - curTime.getTime();
61
+ ret = Math.round(ret/1000);
62
+
63
+ return ret >= 0 ? ret : 0;
64
+ }
65
+
66
+ function update() {
67
+ var nextShowTimeSeconds = getCurrentShowTimeSeconds();
68
+
69
+ var nextHours = parseInt( nextShowTimeSeconds / 3600);
70
+ var nextMinutes = parseInt( (nextShowTimeSeconds - nextHours * 3600 )/60);
71
+ var nextSeconds = parseInt( nextShowTimeSeconds % 60);
72
+
73
+
74
+ var curHours = parseInt( curShowTimeSeconds / 3600);
75
+ var curMinutes = parseInt( (curShowTimeSeconds - curHours * 3600 )/60);
76
+ var curSeconds = parseInt( curShowTimeSeconds % 60);
77
+
78
+ if( nextSeconds != curSeconds ){
79
+ if( parseInt(curHours/10) != parseInt(nextHours/10) ){
80
+ addBalls( MARGIN_LEFT, MARGIN_TOP, parseInt(curHours/10) );
81
+ }
82
+ if( parseInt(curHours%10) != parseInt(nextHours%10) ){
83
+ addBalls( MARGIN_LEFT + 15*(R + 1), MARGIN_TOP, parseInt(curHours%10) );
84
+ }
85
+ if( parseInt(curMinutes/10) != parseInt(nextMinutes/10) ){
86
+ addBalls( MARGIN_LEFT + 39*(R + 1), MARGIN_TOP, parseInt(nextMinutes/10) );
87
+ }
88
+ if( parseInt(curMinutes%10) != parseInt(nextMinutes%10) ){
89
+ addBalls( MARGIN_LEFT + 54*(R + 1), MARGIN_TOP, parseInt(curMinutes%10) );
90
+ }
91
+ if( parseInt(curSeconds/10) != parseInt(nextSeconds/10) ){
92
+ addBalls( MARGIN_LEFT + 78*(R + 1), MARGIN_TOP, parseInt(curSeconds%10) );
93
+ }
94
+ if( parseInt(curSeconds%10) != parseInt(nextSeconds%10) ){
95
+ addBalls( MARGIN_LEFT + 93*(R + 1), MARGIN_TOP, parseInt(curSeconds%10) );
96
+ }
97
+
98
+ //时间改变交换
99
+ curShowTimeSeconds = nextShowTimeSeconds;
100
+ }
101
+
102
+ //更新小球数据
103
+ updateBalls();
104
+
105
+ console.log(balls.length);
106
+ }
107
+
108
+ function render( context ){
109
+
110
+ //对矩形屏幕进行刷新
111
+ context.clearRect(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
112
+
113
+ var hours = parseInt( curShowTimeSeconds / 3600);
114
+ var minutes = parseInt( (curShowTimeSeconds - hours * 3600 )/60);
115
+ var seconds = parseInt( curShowTimeSeconds % 60);
116
+ // 起点坐标x,y,数字,上下文
117
+
118
+ //时
119
+ renderDigit(MARGIN_LEFT, MARGIN_TOP, parseInt(hours/10), context);
120
+ renderDigit(MARGIN_LEFT + 15*(R + 1), MARGIN_TOP, parseInt(hours%10), context);
121
+
122
+ //:
123
+ renderDigit(MARGIN_LEFT + 30*(R + 1), MARGIN_TOP, 10, context);
124
+
125
+ //分
126
+ renderDigit(MARGIN_LEFT + 39*(R + 1), MARGIN_TOP, parseInt(minutes/10), context);
127
+ renderDigit(MARGIN_LEFT + 54*(R + 1), MARGIN_TOP, parseInt(minutes%10), context);
128
+
129
+ //:
130
+ renderDigit(MARGIN_LEFT + 69*(R + 1), MARGIN_TOP, 10, context);
131
+
132
+ //秒
133
+ renderDigit(MARGIN_LEFT + 78*(R + 1), MARGIN_TOP, parseInt(seconds/10), context);
134
+ renderDigit(MARGIN_LEFT + 93*(R + 1), MARGIN_TOP, parseInt(seconds%10), context);
135
+
136
+ //渲染小球
137
+ for( var i = 0; i<balls.length; i++){
138
+ context.fillStyle = balls[i].color;
139
+
140
+ context.beginPath();
141
+ context.arc( balls[i].x, balls[i].y, R, 0, 2*Math.PI);
142
+
143
+ context.fill();
144
+ }
145
+ }
146
+
147
+ function renderDigit(x, y, num, context) {
148
+ context.fillStyle = 'rgb(0,102,153)';
149
+
150
+ for( var i = 0; i < digit[num].length; i ++ ){
151
+ for(var j = 0; j < digit[num][i].length; j++){
152
+ if(digit[num][i][j] == 1 ) {
153
+ context.beginPath();
154
+ context.arc(x + j*2*(R+1) + (R+1),y + i*2*(R+1) + (R+1), R, 0, Math.PI * 2);
155
+ context.fill();
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ function addBalls(x, y, num){
162
+ for( var i = 0; i < digit[num].length; i ++ ){
163
+ for(var j = 0; j < digit[num][i].length; j++){
164
+ if(digit[num][i][j] == 1 ) {
165
+ //设置小球数据
166
+ var aBall = {
167
+ x: x + j*2*(R+1) + (R+1),
168
+ y: y + i*2*(R+1) + (R+1),
169
+ g: 1.5 + Math.random(),
170
+ vx: Math.pow(-1, Math.ceil( Math.random() * 1000 ) ) * Math.random() * 10,
171
+ vy: -5,
172
+ color: colors[Math.floor(Math.random()*colors.length)]
173
+ };
174
+
175
+ //加入数组中
176
+ balls.push( aBall );
177
+ }
178
+ }
179
+ }
180
+ }
181
+
182
+ function updateBalls(){
183
+
184
+ var len = balls.length;
185
+ for( var i = 0; i< len; i ++ ){
186
+ balls[i].x += balls[i].vx;
187
+ balls[i].y += balls[i].vy;
188
+ balls[i].vy += balls[i].g;
189
+
190
+
191
+ //碰撞检测
192
+
193
+ //底部碰撞
194
+ if (balls[i].y >= WINDOW_HEIGHT - R ){
195
+ balls[i].y = WINDOW_HEIGHT - R;
196
+ balls[i].vy = -0.6*balls[i].vy;
197
+ }
198
+
199
+ //
200
+ ////左边碰撞
201
+ //if (balls[i].x <= R ){
202
+ // balls[i].x = R;
203
+ // balls[i].vx = -0.6*balls[i].vx;
204
+ //}
205
+
206
+ //右边碰撞
207
+ if (balls[i].x >= WINDOW_WIDTH - R ){
208
+ balls[i].x = WINDOW_WIDTH - R ;
209
+ balls[i].vx = -0.6*balls[i].vx;
210
+ }
211
+
212
+ }
213
+
214
+
215
+ //小球消除
216
+ var cnt = 0;
217
+ for( var i = 0; i< len; i ++ ){
218
+ if(balls[i].x >= -R ){
219
+ balls[cnt++] = balls[i];
220
+ }
221
+ }
222
+
223
+ while (balls.length > cnt){
224
+ balls.pop();
225
+ }
226
+
227
+ }
@@ -0,0 +1,135 @@
1
+ digit =
2
+ [
3
+ [
4
+ [0, 0, 1, 1, 1, 0, 0],
5
+ [0, 1, 1, 0, 1, 1, 0],
6
+ [1, 1, 0, 0, 0, 1, 1],
7
+ [1, 1, 0, 0, 0, 1, 1],
8
+ [1, 1, 0, 0, 0, 1, 1],
9
+ [1, 1, 0, 0, 0, 1, 1],
10
+ [1, 1, 0, 0, 0, 1, 1],
11
+ [1, 1, 0, 0, 0, 1, 1],
12
+ [0, 1, 1, 0, 1, 1, 0],
13
+ [0, 0, 1, 1, 1, 0, 0]
14
+ ],//0
15
+ [
16
+ [0, 0, 0, 1, 1, 0, 0],
17
+ [0, 1, 1, 1, 1, 0, 0],
18
+ [0, 0, 0, 1, 1, 0, 0],
19
+ [0, 0, 0, 1, 1, 0, 0],
20
+ [0, 0, 0, 1, 1, 0, 0],
21
+ [0, 0, 0, 1, 1, 0, 0],
22
+ [0, 0, 0, 1, 1, 0, 0],
23
+ [0, 0, 0, 1, 1, 0, 0],
24
+ [0, 0, 0, 1, 1, 0, 0],
25
+ [1, 1, 1, 1, 1, 1, 1]
26
+ ],//1
27
+ [
28
+ [0, 1, 1, 1, 1, 1, 0],
29
+ [1, 1, 0, 0, 0, 1, 1],
30
+ [0, 0, 0, 0, 0, 1, 1],
31
+ [0, 0, 0, 0, 1, 1, 0],
32
+ [0, 0, 0, 1, 1, 0, 0],
33
+ [0, 0, 1, 1, 0, 0, 0],
34
+ [0, 1, 1, 0, 0, 0, 0],
35
+ [1, 1, 0, 0, 0, 0, 0],
36
+ [1, 1, 0, 0, 0, 1, 1],
37
+ [1, 1, 1, 1, 1, 1, 1]
38
+ ],//2
39
+ [
40
+ [1, 1, 1, 1, 1, 1, 1],
41
+ [0, 0, 0, 0, 0, 1, 1],
42
+ [0, 0, 0, 0, 1, 1, 0],
43
+ [0, 0, 0, 1, 1, 0, 0],
44
+ [0, 0, 1, 1, 1, 0, 0],
45
+ [0, 0, 0, 0, 1, 1, 0],
46
+ [0, 0, 0, 0, 0, 1, 1],
47
+ [0, 0, 0, 0, 0, 1, 1],
48
+ [1, 1, 0, 0, 0, 1, 1],
49
+ [0, 1, 1, 1, 1, 1, 0]
50
+ ],//3
51
+ [
52
+ [0, 0, 0, 0, 1, 1, 0],
53
+ [0, 0, 0, 1, 1, 1, 0],
54
+ [0, 0, 1, 1, 1, 1, 0],
55
+ [0, 1, 1, 0, 1, 1, 0],
56
+ [1, 1, 0, 0, 1, 1, 0],
57
+ [1, 1, 1, 1, 1, 1, 1],
58
+ [0, 0, 0, 0, 1, 1, 0],
59
+ [0, 0, 0, 0, 1, 1, 0],
60
+ [0, 0, 0, 0, 1, 1, 0],
61
+ [0, 0, 0, 1, 1, 1, 1]
62
+ ],//4
63
+ [
64
+ [1, 1, 1, 1, 1, 1, 1],
65
+ [1, 1, 0, 0, 0, 0, 0],
66
+ [1, 1, 0, 0, 0, 0, 0],
67
+ [1, 1, 1, 1, 1, 1, 0],
68
+ [0, 0, 0, 0, 0, 1, 1],
69
+ [0, 0, 0, 0, 0, 1, 1],
70
+ [0, 0, 0, 0, 0, 1, 1],
71
+ [0, 0, 0, 0, 0, 1, 1],
72
+ [1, 1, 0, 0, 0, 1, 1],
73
+ [0, 1, 1, 1, 1, 1, 0]
74
+ ],//5
75
+ [
76
+ [0, 0, 0, 0, 1, 1, 0],
77
+ [0, 0, 1, 1, 0, 0, 0],
78
+ [0, 1, 1, 0, 0, 0, 0],
79
+ [1, 1, 0, 0, 0, 0, 0],
80
+ [1, 1, 0, 1, 1, 1, 0],
81
+ [1, 1, 0, 0, 0, 1, 1],
82
+ [1, 1, 0, 0, 0, 1, 1],
83
+ [1, 1, 0, 0, 0, 1, 1],
84
+ [1, 1, 0, 0, 0, 1, 1],
85
+ [0, 1, 1, 1, 1, 1, 0]
86
+ ],//6
87
+ [
88
+ [1, 1, 1, 1, 1, 1, 1],
89
+ [1, 1, 0, 0, 0, 1, 1],
90
+ [0, 0, 0, 0, 1, 1, 0],
91
+ [0, 0, 0, 0, 1, 1, 0],
92
+ [0, 0, 0, 1, 1, 0, 0],
93
+ [0, 0, 0, 1, 1, 0, 0],
94
+ [0, 0, 1, 1, 0, 0, 0],
95
+ [0, 0, 1, 1, 0, 0, 0],
96
+ [0, 0, 1, 1, 0, 0, 0],
97
+ [0, 0, 1, 1, 0, 0, 0]
98
+ ],//7
99
+ [
100
+ [0, 1, 1, 1, 1, 1, 0],
101
+ [1, 1, 0, 0, 0, 1, 1],
102
+ [1, 1, 0, 0, 0, 1, 1],
103
+ [1, 1, 0, 0, 0, 1, 1],
104
+ [0, 1, 1, 1, 1, 1, 0],
105
+ [1, 1, 0, 0, 0, 1, 1],
106
+ [1, 1, 0, 0, 0, 1, 1],
107
+ [1, 1, 0, 0, 0, 1, 1],
108
+ [1, 1, 0, 0, 0, 1, 1],
109
+ [0, 1, 1, 1, 1, 1, 0]
110
+ ],//8
111
+ [
112
+ [0, 1, 1, 1, 1, 1, 0],
113
+ [1, 1, 0, 0, 0, 1, 1],
114
+ [1, 1, 0, 0, 0, 1, 1],
115
+ [1, 1, 0, 0, 0, 1, 1],
116
+ [0, 1, 1, 1, 0, 1, 1],
117
+ [0, 0, 0, 0, 0, 1, 1],
118
+ [0, 0, 0, 0, 0, 1, 1],
119
+ [0, 0, 0, 0, 1, 1, 0],
120
+ [0, 0, 0, 1, 1, 0, 0],
121
+ [0, 1, 1, 0, 0, 0, 0]
122
+ ],//9
123
+ [
124
+ [0, 0, 0, 0],
125
+ [0, 0, 0, 0],
126
+ [0, 1, 1, 0],
127
+ [0, 1, 1, 0],
128
+ [0, 0, 0, 0],
129
+ [0, 0, 0, 0],
130
+ [0, 1, 1, 0],
131
+ [0, 1, 1, 0],
132
+ [0, 0, 0, 0],
133
+ [0, 0, 0, 0]
134
+ ]//:
135
+ ];
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" style="height: 100%">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>canvas</title>
6
+ <style>
7
+ canvas{
8
+ transition: all 2s;
9
+ }
10
+ *{
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ overflow: hidden;
15
+ }
16
+ </style>
17
+ </head>
18
+ <body style="height: 100%">
19
+ <canvas id="canvas"></canvas>
20
+ <script src="digit.js"></script>
21
+ <script src="countdown.js"></script>
22
+ </body>
23
+ </html>
@@ -0,0 +1,17 @@
1
+ # 毛笔字帖
2
+
3
+ 使用canvas绘图技术,可用鼠标或者手指在屏幕区写字,模仿毛笔字效果
4
+ [在线演示](http://zjy.space/canvas-demo/write/)
5
+
6
+ ## 效果图
7
+
8
+ ### 电脑端
9
+ ![](http://i2.piimg.com/3aefad286a3e104a.png)
10
+
11
+ ### 手机端
12
+ ![](http://i2.piimg.com/811a35eaec95a37d.jpg)
13
+
14
+ ## 博客
15
+ 这里有对应的一篇教程博客,有兴趣的可以参考一下,博客里也有提供慕课网[@liuyubobobo老师](http://www.imooc.com/u/108955/courses?sort=publish)的视频教程连接
16
+
17
+ [利用canvas实现毛笔字帖](http://blog.zjy.space/2016/04/23/%E6%AF%9B%E7%AC%94%E5%AD%97%E5%B8%961/)
@@ -0,0 +1,40 @@
1
+ #canvas{
2
+ display: block; margin: 20px auto; border: #ff1722 5px solid;
3
+ }
4
+ /*控制器*/
5
+ #controller{
6
+ text-align: center;
7
+ }
8
+ #controller>div{
9
+ display: inline-block; width: 30px; height: 30px; border: gray 2px solid;
10
+ }
11
+ #black{
12
+ background: black;
13
+ }
14
+ #red{
15
+ background: red;
16
+ }
17
+ #green{
18
+ background: green;
19
+ }
20
+ #yellow{
21
+ background: yellow;
22
+ }
23
+ #purple{
24
+ background: purple;
25
+ }
26
+ #orange{
27
+ background: orange;
28
+ }
29
+ #blue{
30
+ background: blue;
31
+ }
32
+ #indigo{
33
+ background: indigo;
34
+ }
35
+ #controller>div.on{
36
+ border-color: red;
37
+ }
38
+ #reset{
39
+ display: inline-block; vertical-align: top; width: 50px; height: 34px;
40
+ }
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>毛笔字</title>
6
+ <meta name="viewport" content="width=device-width;height=device-height;initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
7
+ <link href="css/write.css" rel="stylesheet" type="text/css">
8
+ </head>
9
+ <body>
10
+ <canvas id="canvas">
11
+ 您的浏览器版本不支持canvas,请更新或者下载chrome
12
+ </canvas>
13
+ <div id="controller">
14
+ <div id="black" class="on"></div>
15
+ <div id="red"></div>
16
+ <div id="green"></div>
17
+ <div id="yellow"></div>
18
+ <div id="purple"></div>
19
+ <div id="orange"></div>
20
+ <div id="blue"></div>
21
+ <div id="indigo"></div>
22
+ <button id="reset">清除</button>
23
+ </div>
24
+ <script src="js/require.js" data-main="js/index"></script>
25
+ </body>
26
+ </html>
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Created by zjy on 2016/4/23.
3
+ */
4
+ define(['paper'], function (paper) {
5
+ var controller = {
6
+ canvas: null,
7
+ context: null,
8
+
9
+ init: function (canvas) {
10
+ this.canvas = canvas;
11
+ this.context = canvas.getContext('2d');
12
+ this.bindEvent();
13
+ },
14
+
15
+ bindEvent: function () {
16
+ var self = this;
17
+ document.getElementById('controller').addEventListener('click', function (event) {
18
+ var target = event.target;
19
+ if(target.nodeName.toLowerCase() == 'div'){
20
+ self.setColor(target);
21
+ }
22
+ else if(target.id == 'reset'){
23
+ self.clear();
24
+ }
25
+ });
26
+ },
27
+
28
+ setColor: function (target) {
29
+ //移除其他标签的class
30
+ document.querySelector('.on').className = '';
31
+ this.context.strokeStyle = target.id;
32
+ target.className += ' on';
33
+ },
34
+
35
+ clear: function () {
36
+ //清除
37
+ this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
38
+ //描写米字格
39
+ paper.drawPaper();
40
+ }
41
+ };
42
+ return controller;
43
+ });
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Created by zjy on 2016/4/22.
3
+ */
4
+ require(['paper','controller','write'], function (paper, controller, write) {
5
+ //初始化获取canvas和context
6
+ var canvas = document.getElementById('canvas');
7
+ paper.init(canvas);
8
+ controller.init(canvas);
9
+ write.init(canvas);
10
+ });
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Created by zjy on 2016/4/22.
3
+ */
4
+ define(function () {
5
+ var paper = {
6
+ canvas: null,//html中的canvas对象,主要标签
7
+ context: null, //canvas对象获取的context,用于绘图
8
+ init: function (canvas) {
9
+ this.canvas = canvas;//接收外界canvas,赋值给自己的属性``canvas``,在下面的其他方法中需要用到
10
+ this.context = canvas.getContext('2d');//通过canvas获取context,赋值给自己的属性``context``,在下面的其他方法中需要用到
11
+
12
+ //动态设置canvas大小,兼容手机和pc
13
+ this.canvas.width = Math.min(500, window.innerWidth - 20);// 米字格最大只能为500px
14
+ this.canvas.height = this.canvas.width;
15
+
16
+ this.drawPaper(); //绘制米字格背景,自己完善drawPaper方法
17
+ },
18
+ drawPaper: function(){
19
+ this.drawDotted(0, 0, this.canvas.width, this.canvas.height);//左上角到右下角的斜线
20
+ this.drawDotted(this.canvas.width, 0, 0, this.canvas.height);//左下角到右上角的斜线
21
+ this.drawDotted(this.canvas.width/2, 0, this.canvas.width/2, this.canvas.height);//中间的横线
22
+ this.drawDotted(0, this.canvas.height/2, this.canvas.width, this.canvas.height/2);//中间的竖线
23
+ },
24
+
25
+ drawDotted: function(sx, sy, ex, ey){
26
+ var lineInterval = 5;//虚线的间隔
27
+ this.context.save();//保存当前的context状态(快照,用于恢复,防止状态设置紊乱污染)
28
+
29
+ this.context.lineWidth = 3;//线宽
30
+ this.context.strokeStyle = '#ff1722';//线条颜色
31
+
32
+ //setLineDash 虚线设置接口比较新,为了保险起见,自己编写一下
33
+ if(this.context.setLineDash){ // 使用h5的setLineDash方法
34
+ this.context.setLineDash([lineInterval, lineInterval]);//[线宽, 间隔宽]
35
+ this.context.moveTo(sx,sy);
36
+ this.context.lineTo(ex,ey);
37
+ }
38
+ else{//setLineDash不存在,自己手动处理
39
+ //len 虚线要绘制成多少段
40
+ var len = Math.ceil(Math.sqrt((ex - sx)*(ex - sx) + (ey - sy)*(ey - sy)) / lineInterval /2);
41
+ var lineIntervalX = (ex - sx) / len;//每一段间x轴上的间隔
42
+ var lineIntervalY = (ey - sy) / len;//每一段间y轴上的间隔
43
+ var index = 0;//计数器
44
+ this.context.beginPath();
45
+ while (index < len) {//开始定制路线
46
+ var targetX = sx + lineIntervalX;//计算当前段绘制的终点
47
+ var targetY = sy + lineIntervalY;
48
+ this.context.moveTo(sx, sy);//起点
49
+ this.context.lineTo(targetX, targetY);//终点
50
+
51
+ sx = targetX + lineIntervalX;//计算下一段绘制的起点
52
+ sy = targetY + lineIntervalY;
53
+
54
+ index ++;
55
+ }
56
+ }
57
+
58
+ this.context.stroke();//绘制线条
59
+ this.context.restore();//恢复保存的状态,对应 save() 方法
60
+ }
61
+ };
62
+ return paper;
63
+ });
@@ -0,0 +1,36 @@
1
+ /*
2
+ RequireJS 2.2.0 Copyright jQuery Foundation and other contributors.
3
+ Released under MIT license, http://github.com/requirejs/requirejs/LICENSE
4
+ */
5
+ var requirejs,require,define;
6
+ (function(ga){function ka(b,c,d,g){return g||""}function K(b){return"[object Function]"===Q.call(b)}function L(b){return"[object Array]"===Q.call(b)}function y(b,c){if(b){var d;for(d=0;d<b.length&&(!b[d]||!c(b[d],d,b));d+=1);}}function X(b,c){if(b){var d;for(d=b.length-1;-1<d&&(!b[d]||!c(b[d],d,b));--d);}}function x(b,c){return la.call(b,c)}function e(b,c){return x(b,c)&&b[c]}function D(b,c){for(var d in b)if(x(b,d)&&c(b[d],d))break}function Y(b,c,d,g){c&&D(c,function(c,e){if(d||!x(b,e))!g||"object"!==
7
+ typeof c||!c||L(c)||K(c)||c instanceof RegExp?b[e]=c:(b[e]||(b[e]={}),Y(b[e],c,d,g))});return b}function z(b,c){return function(){return c.apply(b,arguments)}}function ha(b){throw b;}function ia(b){if(!b)return b;var c=ga;y(b.split("."),function(b){c=c[b]});return c}function F(b,c,d,g){c=Error(c+"\nhttp://requirejs.org/docs/errors.html#"+b);c.requireType=b;c.requireModules=g;d&&(c.originalError=d);return c}function ma(b){function c(a,n,b){var h,k,f,c,d,l,g,r;n=n&&n.split("/");var q=p.map,m=q&&q["*"];
8
+ if(a){a=a.split("/");k=a.length-1;p.nodeIdCompat&&U.test(a[k])&&(a[k]=a[k].replace(U,""));"."===a[0].charAt(0)&&n&&(k=n.slice(0,n.length-1),a=k.concat(a));k=a;for(f=0;f<k.length;f++)c=k[f],"."===c?(k.splice(f,1),--f):".."===c&&0!==f&&(1!==f||".."!==k[2])&&".."!==k[f-1]&&0<f&&(k.splice(f-1,2),f-=2);a=a.join("/")}if(b&&q&&(n||m)){k=a.split("/");f=k.length;a:for(;0<f;--f){d=k.slice(0,f).join("/");if(n)for(c=n.length;0<c;--c)if(b=e(q,n.slice(0,c).join("/")))if(b=e(b,d)){h=b;l=f;break a}!g&&m&&e(m,d)&&
9
+ (g=e(m,d),r=f)}!h&&g&&(h=g,l=r);h&&(k.splice(0,l,h),a=k.join("/"))}return(h=e(p.pkgs,a))?h:a}function d(a){E&&y(document.getElementsByTagName("script"),function(n){if(n.getAttribute("data-requiremodule")===a&&n.getAttribute("data-requirecontext")===l.contextName)return n.parentNode.removeChild(n),!0})}function m(a){var n=e(p.paths,a);if(n&&L(n)&&1<n.length)return n.shift(),l.require.undef(a),l.makeRequire(null,{skipMap:!0})([a]),!0}function r(a){var n,b=a?a.indexOf("!"):-1;-1<b&&(n=a.substring(0,
10
+ b),a=a.substring(b+1,a.length));return[n,a]}function q(a,n,b,h){var k,f,d=null,g=n?n.name:null,p=a,q=!0,m="";a||(q=!1,a="_@r"+(Q+=1));a=r(a);d=a[0];a=a[1];d&&(d=c(d,g,h),f=e(v,d));a&&(d?m=f&&f.normalize?f.normalize(a,function(a){return c(a,g,h)}):-1===a.indexOf("!")?c(a,g,h):a:(m=c(a,g,h),a=r(m),d=a[0],m=a[1],b=!0,k=l.nameToUrl(m)));b=!d||f||b?"":"_unnormalized"+(T+=1);return{prefix:d,name:m,parentMap:n,unnormalized:!!b,url:k,originalName:p,isDefine:q,id:(d?d+"!"+m:m)+b}}function u(a){var b=a.id,
11
+ c=e(t,b);c||(c=t[b]=new l.Module(a));return c}function w(a,b,c){var h=a.id,k=e(t,h);if(!x(v,h)||k&&!k.defineEmitComplete)if(k=u(a),k.error&&"error"===b)c(k.error);else k.on(b,c);else"defined"===b&&c(v[h])}function A(a,b){var c=a.requireModules,h=!1;if(b)b(a);else if(y(c,function(b){if(b=e(t,b))b.error=a,b.events.error&&(h=!0,b.emit("error",a))}),!h)g.onError(a)}function B(){V.length&&(y(V,function(a){var b=a[0];"string"===typeof b&&(l.defQueueMap[b]=!0);G.push(a)}),V=[])}function C(a){delete t[a];
12
+ delete Z[a]}function J(a,b,c){var h=a.map.id;a.error?a.emit("error",a.error):(b[h]=!0,y(a.depMaps,function(h,f){var d=h.id,g=e(t,d);!g||a.depMatched[f]||c[d]||(e(b,d)?(a.defineDep(f,v[d]),a.check()):J(g,b,c))}),c[h]=!0)}function H(){var a,b,c=(a=1E3*p.waitSeconds)&&l.startTime+a<(new Date).getTime(),h=[],k=[],f=!1,g=!0;if(!aa){aa=!0;D(Z,function(a){var l=a.map,e=l.id;if(a.enabled&&(l.isDefine||k.push(a),!a.error))if(!a.inited&&c)m(e)?f=b=!0:(h.push(e),d(e));else if(!a.inited&&a.fetched&&l.isDefine&&
13
+ (f=!0,!l.prefix))return g=!1});if(c&&h.length)return a=F("timeout","Load timeout for modules: "+h,null,h),a.contextName=l.contextName,A(a);g&&y(k,function(a){J(a,{},{})});c&&!b||!f||!E&&!ja||ba||(ba=setTimeout(function(){ba=0;H()},50));aa=!1}}function I(a){x(v,a[0])||u(q(a[0],null,!0)).init(a[1],a[2])}function O(a){a=a.currentTarget||a.srcElement;var b=l.onScriptLoad;a.detachEvent&&!ca?a.detachEvent("onreadystatechange",b):a.removeEventListener("load",b,!1);b=l.onScriptError;a.detachEvent&&!ca||a.removeEventListener("error",
14
+ b,!1);return{node:a,id:a&&a.getAttribute("data-requiremodule")}}function P(){var a;for(B();G.length;){a=G.shift();if(null===a[0])return A(F("mismatch","Mismatched anonymous define() module: "+a[a.length-1]));I(a)}l.defQueueMap={}}var aa,da,l,R,ba,p={waitSeconds:7,baseUrl:"./",paths:{},bundles:{},pkgs:{},shim:{},config:{}},t={},Z={},ea={},G=[],v={},W={},fa={},Q=1,T=1;R={require:function(a){return a.require?a.require:a.require=l.makeRequire(a.map)},exports:function(a){a.usingExports=!0;if(a.map.isDefine)return a.exports?
15
+ v[a.map.id]=a.exports:a.exports=v[a.map.id]={}},module:function(a){return a.module?a.module:a.module={id:a.map.id,uri:a.map.url,config:function(){return e(p.config,a.map.id)||{}},exports:a.exports||(a.exports={})}}};da=function(a){this.events=e(ea,a.id)||{};this.map=a;this.shim=e(p.shim,a.id);this.depExports=[];this.depMaps=[];this.depMatched=[];this.pluginMaps={};this.depCount=0};da.prototype={init:function(a,b,c,h){h=h||{};if(!this.inited){this.factory=b;if(c)this.on("error",c);else this.events.error&&
16
+ (c=z(this,function(a){this.emit("error",a)}));this.depMaps=a&&a.slice(0);this.errback=c;this.inited=!0;this.ignore=h.ignore;h.enabled||this.enabled?this.enable():this.check()}},defineDep:function(a,b){this.depMatched[a]||(this.depMatched[a]=!0,--this.depCount,this.depExports[a]=b)},fetch:function(){if(!this.fetched){this.fetched=!0;l.startTime=(new Date).getTime();var a=this.map;if(this.shim)l.makeRequire(this.map,{enableBuildCallback:!0})(this.shim.deps||[],z(this,function(){return a.prefix?this.callPlugin():
17
+ this.load()}));else return a.prefix?this.callPlugin():this.load()}},load:function(){var a=this.map.url;W[a]||(W[a]=!0,l.load(this.map.id,a))},check:function(){if(this.enabled&&!this.enabling){var a,b,c=this.map.id;b=this.depExports;var h=this.exports,k=this.factory;if(!this.inited)x(l.defQueueMap,c)||this.fetch();else if(this.error)this.emit("error",this.error);else if(!this.defining){this.defining=!0;if(1>this.depCount&&!this.defined){if(K(k)){if(this.events.error&&this.map.isDefine||g.onError!==
18
+ ha)try{h=l.execCb(c,k,b,h)}catch(d){a=d}else h=l.execCb(c,k,b,h);this.map.isDefine&&void 0===h&&((b=this.module)?h=b.exports:this.usingExports&&(h=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",A(this.error=a)}else h=k;this.exports=h;if(this.map.isDefine&&!this.ignore&&(v[c]=h,g.onResourceLoad)){var f=[];y(this.depMaps,function(a){f.push(a.normalizedMap||a)});g.onResourceLoad(l,this.map,f)}C(c);
19
+ this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}},callPlugin:function(){var a=this.map,b=a.id,d=q(a.prefix);this.depMaps.push(d);w(d,"defined",z(this,function(h){var k,f,d=e(fa,this.map.id),M=this.map.name,r=this.map.parentMap?this.map.parentMap.name:null,m=l.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(h.normalize&&(M=h.normalize(M,function(a){return c(a,r,!0)})||
20
+ ""),f=q(a.prefix+"!"+M,this.map.parentMap),w(f,"defined",z(this,function(a){this.map.normalizedMap=f;this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),h=e(t,f.id)){this.depMaps.push(f);if(this.events.error)h.on("error",z(this,function(a){this.emit("error",a)}));h.enable()}}else d?(this.map.url=l.nameToUrl(d),this.load()):(k=z(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),k.error=z(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];D(t,function(a){0===
21
+ a.map.id.indexOf(b+"_unnormalized")&&C(a.map.id)});A(a)}),k.fromText=z(this,function(h,c){var d=a.name,f=q(d),M=S;c&&(h=c);M&&(S=!1);u(f);x(p.config,b)&&(p.config[d]=p.config[b]);try{g.exec(h)}catch(e){return A(F("fromtexteval","fromText eval for "+b+" failed: "+e,e,[b]))}M&&(S=!0);this.depMaps.push(f);l.completeLoad(d);m([d],k)}),h.load(a.name,m,k,p))}));l.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){Z[this.map.id]=this;this.enabling=this.enabled=!0;y(this.depMaps,z(this,function(a,
22
+ b){var c,h;if("string"===typeof a){a=q(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=e(R,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;w(a,"defined",z(this,function(a){this.undefed||(this.defineDep(b,a),this.check())}));this.errback?w(a,"error",z(this,this.errback)):this.events.error&&w(a,"error",z(this,function(a){this.emit("error",a)}))}c=a.id;h=t[c];x(R,c)||!h||h.enabled||l.enable(a,this)}));D(this.pluginMaps,z(this,function(a){var b=e(t,a.id);
23
+ b&&!b.enabled&&l.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){y(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};l={config:p,contextName:b,registry:t,defined:v,urlFetched:W,defQueue:G,defQueueMap:{},Module:da,makeModuleMap:q,nextTick:g.nextTick,onError:A,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");if("string"===typeof a.urlArgs){var b=
24
+ a.urlArgs;a.urlArgs=function(a,c){return(-1===c.indexOf("?")?"?":"&")+b}}var c=p.shim,h={paths:!0,bundles:!0,config:!0,map:!0};D(a,function(a,b){h[b]?(p[b]||(p[b]={}),Y(p[b],a,!0,!0)):p[b]=a});a.bundles&&D(a.bundles,function(a,b){y(a,function(a){a!==b&&(fa[a]=b)})});a.shim&&(D(a.shim,function(a,b){L(a)&&(a={deps:a});!a.exports&&!a.init||a.exportsFn||(a.exportsFn=l.makeShimExports(a));c[b]=a}),p.shim=c);a.packages&&y(a.packages,function(a){var b;a="string"===typeof a?{name:a}:a;b=a.name;a.location&&
25
+ (p.paths[b]=a.location);p.pkgs[b]=a.name+"/"+(a.main||"main").replace(na,"").replace(U,"")});D(t,function(a,b){a.inited||a.map.unnormalized||(a.map=q(b,null,!0))});(a.deps||a.callback)&&l.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ga,arguments));return b||a.exports&&ia(a.exports)}},makeRequire:function(a,n){function m(c,d,f){var e,r;n.enableBuildCallback&&d&&K(d)&&(d.__requireJsBuild=!0);if("string"===typeof c){if(K(d))return A(F("requireargs",
26
+ "Invalid require call"),f);if(a&&x(R,c))return R[c](t[a.id]);if(g.get)return g.get(l,c,a,m);e=q(c,a,!1,!0);e=e.id;return x(v,e)?v[e]:A(F("notloaded",'Module name "'+e+'" has not been loaded yet for context: '+b+(a?"":". Use require([])")))}P();l.nextTick(function(){P();r=u(q(null,a));r.skipMap=n.skipMap;r.init(c,d,f,{enabled:!0});H()});return m}n=n||{};Y(m,{isBrowser:E,toUrl:function(b){var d,f=b.lastIndexOf("."),g=b.split("/")[0];-1!==f&&("."!==g&&".."!==g||1<f)&&(d=b.substring(f,b.length),b=b.substring(0,
27
+ f));return l.nameToUrl(c(b,a&&a.id,!0),d,!0)},defined:function(b){return x(v,q(b,a,!1,!0).id)},specified:function(b){b=q(b,a,!1,!0).id;return x(v,b)||x(t,b)}});a||(m.undef=function(b){B();var c=q(b,a,!0),f=e(t,b);f.undefed=!0;d(b);delete v[b];delete W[c.url];delete ea[b];X(G,function(a,c){a[0]===b&&G.splice(c,1)});delete l.defQueueMap[b];f&&(f.events.defined&&(ea[b]=f.events),C(b))});return m},enable:function(a){e(t,a.id)&&u(a).enable()},completeLoad:function(a){var b,c,d=e(p.shim,a)||{},g=d.exports;
28
+ for(B();G.length;){c=G.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);I(c)}l.defQueueMap={};c=e(t,a);if(!b&&!x(v,a)&&c&&!c.inited)if(!p.enforceDefine||g&&ia(g))I([a,d.deps||[],d.exportsFn]);else return m(a)?void 0:A(F("nodefine","No define call for "+a,null,[a]));H()},nameToUrl:function(a,b,c){var d,k,f,m;(d=e(p.pkgs,a))&&(a=d);if(d=e(fa,a))return l.nameToUrl(d,b,c);if(g.jsExtRegExp.test(a))d=a+(b||"");else{d=p.paths;k=a.split("/");for(f=k.length;0<f;--f)if(m=k.slice(0,f).join("/"),
29
+ m=e(d,m)){L(m)&&(m=m[0]);k.splice(0,f,m);break}d=k.join("/");d+=b||(/^data\:|^blob\:|\?/.test(d)||c?"":".js");d=("/"===d.charAt(0)||d.match(/^[\w\+\.\-]+:/)?"":p.baseUrl)+d}return p.urlArgs&&!/^blob\:/.test(d)?d+p.urlArgs(a,d):d},load:function(a,b){g.load(l,a,b)},execCb:function(a,b,c,d){return b.apply(d,c)},onScriptLoad:function(a){if("load"===a.type||oa.test((a.currentTarget||a.srcElement).readyState))N=null,a=O(a),l.completeLoad(a.id)},onScriptError:function(a){var b=O(a);if(!m(b.id)){var c=[];
30
+ D(t,function(a,d){0!==d.indexOf("_@r")&&y(a.depMaps,function(a){if(a.id===b.id)return c.push(d),!0})});return A(F("scripterror",'Script error for "'+b.id+(c.length?'", needed by: '+c.join(", "):'"'),a,[b.id]))}}};l.require=l.makeRequire();return l}function pa(){if(N&&"interactive"===N.readyState)return N;X(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return N=b});return N}var g,B,C,H,O,I,N,P,u,T,qa=/(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg,ra=/[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g,
31
+ U=/\.js$/,na=/^\.\//;B=Object.prototype;var Q=B.toString,la=B.hasOwnProperty,E=!("undefined"===typeof window||"undefined"===typeof navigator||!window.document),ja=!E&&"undefined"!==typeof importScripts,oa=E&&"PLAYSTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/,ca="undefined"!==typeof opera&&"[object Opera]"===opera.toString(),J={},w={},V=[],S=!1;if("undefined"===typeof define){if("undefined"!==typeof requirejs){if(K(requirejs))return;w=requirejs;requirejs=void 0}"undefined"===typeof require||
32
+ K(require)||(w=require,require=void 0);g=requirejs=function(b,c,d,m){var r,q="_";L(b)||"string"===typeof b||(r=b,L(c)?(b=c,c=d,d=m):b=[]);r&&r.context&&(q=r.context);(m=e(J,q))||(m=J[q]=g.s.newContext(q));r&&m.configure(r);return m.require(b,c,d)};g.config=function(b){return g(b)};g.nextTick="undefined"!==typeof setTimeout?function(b){setTimeout(b,4)}:function(b){b()};require||(require=g);g.version="2.2.0";g.jsExtRegExp=/^\/|:|\?|\.js$/;g.isBrowser=E;B=g.s={contexts:J,newContext:ma};g({});y(["toUrl",
33
+ "undef","defined","specified"],function(b){g[b]=function(){var c=J._;return c.require[b].apply(c,arguments)}});E&&(C=B.head=document.getElementsByTagName("head")[0],H=document.getElementsByTagName("base")[0])&&(C=B.head=H.parentNode);g.onError=ha;g.createNode=function(b,c,d){c=b.xhtml?document.createElementNS("http://www.w3.org/1999/xhtml","html:script"):document.createElement("script");c.type=b.scriptType||"text/javascript";c.charset="utf-8";c.async=!0;return c};g.load=function(b,c,d){var m=b&&b.config||
34
+ {},e;if(E){e=g.createNode(m,c,d);e.setAttribute("data-requirecontext",b.contextName);e.setAttribute("data-requiremodule",c);!e.attachEvent||e.attachEvent.toString&&0>e.attachEvent.toString().indexOf("[native code")||ca?(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)):(S=!0,e.attachEvent("onreadystatechange",b.onScriptLoad));e.src=d;if(m.onNodeCreated)m.onNodeCreated(e,m,c,d);P=e;H?C.insertBefore(e,H):C.appendChild(e);P=null;return e}if(ja)try{setTimeout(function(){},
35
+ 0),importScripts(d),b.completeLoad(c)}catch(q){b.onError(F("importscripts","importScripts failed for "+c+" at "+d,q,[c]))}};E&&!w.skipDataMain&&X(document.getElementsByTagName("script"),function(b){C||(C=b.parentNode);if(O=b.getAttribute("data-main"))return u=O,w.baseUrl||-1!==u.indexOf("!")||(I=u.split("/"),u=I.pop(),T=I.length?I.join("/")+"/":"./",w.baseUrl=T),u=u.replace(U,""),g.jsExtRegExp.test(u)&&(u=O),w.deps=w.deps?w.deps.concat(u):[u],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&
36
+ (d=c,c=b,b=null);L(c)||(d=c,c=null);!c&&K(d)&&(c=[],d.length&&(d.toString().replace(qa,ka).replace(ra,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));S&&(e=P||pa())&&(b||(b=e.getAttribute("data-requiremodule")),g=J[e.getAttribute("data-requirecontext")]);g?(g.defQueue.push([b,c,d]),g.defQueueMap[b]=!0):V.push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(w)}})(this);