From d45d42dad7b3ce30779d5342acef768aba7e1fc5 Mon Sep 17 00:00:00 2001 From: Ewa Date: Thu, 21 Sep 2017 19:22:47 +0200 Subject: [PATCH] Initial checkin for the code for Blockly for the Web codelab (#1273) * Add Blockly for the Web codelab code * Adding licences and comments as per review * Renaming a4/b4 sounds to a5/b5 * Define blocks with defineBlocksWithJsonArray istead of jsonInit --- demos/codelab/README.md | 16 ++++ demos/codelab/app/index.html | 53 +++++++++++ demos/codelab/app/scripts/main.js | 61 ++++++++++++ demos/codelab/app/scripts/music_maker.js | 33 +++++++ demos/codelab/app/sounds/c4.m4a | Bin 0 -> 8833 bytes demos/codelab/app/sounds/c5.m4a | Bin 0 -> 8635 bytes demos/codelab/app/sounds/d4.m4a | Bin 0 -> 8509 bytes demos/codelab/app/sounds/e4.m4a | Bin 0 -> 8454 bytes demos/codelab/app/sounds/f4.m4a | Bin 0 -> 8530 bytes demos/codelab/app/sounds/g4.m4a | Bin 0 -> 8306 bytes demos/codelab/app/styles/index.css | 75 +++++++++++++++ demos/codelab/completed/finish/index.html | 73 +++++++++++++++ .../codelab/completed/finish/scripts/main.js | 88 ++++++++++++++++++ .../completed/finish/scripts/music_maker.js | 33 +++++++ .../completed/finish/scripts/sound_blocks.js | 50 ++++++++++ demos/codelab/completed/finish/sounds/c4.m4a | Bin 0 -> 8833 bytes demos/codelab/completed/finish/sounds/c5.m4a | Bin 0 -> 8635 bytes demos/codelab/completed/finish/sounds/d4.m4a | Bin 0 -> 8509 bytes demos/codelab/completed/finish/sounds/e4.m4a | Bin 0 -> 8454 bytes demos/codelab/completed/finish/sounds/f4.m4a | Bin 0 -> 8530 bytes demos/codelab/completed/finish/sounds/g4.m4a | Bin 0 -> 8306 bytes .../codelab/completed/finish/styles/index.css | 75 +++++++++++++++ 22 files changed, 557 insertions(+) create mode 100644 demos/codelab/README.md create mode 100644 demos/codelab/app/index.html create mode 100644 demos/codelab/app/scripts/main.js create mode 100644 demos/codelab/app/scripts/music_maker.js create mode 100644 demos/codelab/app/sounds/c4.m4a create mode 100644 demos/codelab/app/sounds/c5.m4a create mode 100644 demos/codelab/app/sounds/d4.m4a create mode 100644 demos/codelab/app/sounds/e4.m4a create mode 100644 demos/codelab/app/sounds/f4.m4a create mode 100644 demos/codelab/app/sounds/g4.m4a create mode 100644 demos/codelab/app/styles/index.css create mode 100644 demos/codelab/completed/finish/index.html create mode 100644 demos/codelab/completed/finish/scripts/main.js create mode 100644 demos/codelab/completed/finish/scripts/music_maker.js create mode 100644 demos/codelab/completed/finish/scripts/sound_blocks.js create mode 100644 demos/codelab/completed/finish/sounds/c4.m4a create mode 100644 demos/codelab/completed/finish/sounds/c5.m4a create mode 100644 demos/codelab/completed/finish/sounds/d4.m4a create mode 100644 demos/codelab/completed/finish/sounds/e4.m4a create mode 100644 demos/codelab/completed/finish/sounds/f4.m4a create mode 100644 demos/codelab/completed/finish/sounds/g4.m4a create mode 100644 demos/codelab/completed/finish/styles/index.css diff --git a/demos/codelab/README.md b/demos/codelab/README.md new file mode 100644 index 000000000..2a5e91315 --- /dev/null +++ b/demos/codelab/README.md @@ -0,0 +1,16 @@ +# Blockly for the Web codelab + +Code for the [Blockly for the Web codelab](https://developers.google.com/TODO). + +In this codelab, you'll learn how to use Blockly JavaScript library +to add a block code editor to a web application. + +## What you'll learn + +* How to add Blockly to a sample web app. +* How to set up a Blockly workspace. +* How to create a new block in Blockly. +* How to generate and run JavaScript code from blocks. + +Example code for each step of the codelab is available from +the [completed](completed/) directory. diff --git a/demos/codelab/app/index.html b/demos/codelab/app/index.html new file mode 100644 index 000000000..31eeff776 --- /dev/null +++ b/demos/codelab/app/index.html @@ -0,0 +1,53 @@ + + + + + + + + Blockly for the Web Codelab + + + + + + +
+

Music Maker

+

Music Maker Configuration

+
+ +
+ + + +

Tap any button to edit its code.
When complete, press Done.

+ +
+
+
1
+
2
+
3
+
+
+
4
+
5
+
6
+
+
+
7
+
8
+
9
+
+
+ +
+
+
+
+ + + + + + diff --git a/demos/codelab/app/scripts/main.js b/demos/codelab/app/scripts/main.js new file mode 100644 index 000000000..31fba5a97 --- /dev/null +++ b/demos/codelab/app/scripts/main.js @@ -0,0 +1,61 @@ +/** + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + (function() { + + let currentButton; + + function handlePlay(event) { + // Add code for playing sound. + } + + function save(button) { + // Add code for saving the behavior of a button. + } + + function handleSave() { + document.body.setAttribute('mode', 'edit'); + save(currentButton); + } + + function enableEditMode() { + document.body.setAttribute('mode', 'edit'); + document.querySelectorAll('.button').forEach(btn => { + btn.removeEventListener('click', handlePlay); + btn.addEventListener('click', enableBlocklyMode); + }); + } + + function enableMakerMode() { + document.body.setAttribute('mode', 'maker'); + document.querySelectorAll('.button').forEach(btn => { + btn.addEventListener('click', handlePlay); + btn.removeEventListener('click', enableBlocklyMode); + }); + } + + function enableBlocklyMode(e) { + document.body.setAttribute('mode', 'blockly'); + currentButton = e.target; + } + + document.querySelector('#edit').addEventListener('click', enableEditMode); + document.querySelector('#done').addEventListener('click', enableMakerMode); + document.querySelector('#save').addEventListener('click', handleSave); + + enableMakerMode(); + +})(); diff --git a/demos/codelab/app/scripts/music_maker.js b/demos/codelab/app/scripts/music_maker.js new file mode 100644 index 000000000..50a8a3b7f --- /dev/null +++ b/demos/codelab/app/scripts/music_maker.js @@ -0,0 +1,33 @@ +/** + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MusicMaker = { + queue_: [], + player_: new Audio(), + queueSound: function(soundUrl) { + this.queue_.push(soundUrl); + }, + play: function() { + let next = this.queue_.shift(); + if (next) { + this.player_.src = next; + this.player_.play(); + } + }, +}; + +MusicMaker.player_.addEventListener( + 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/app/sounds/c4.m4a b/demos/codelab/app/sounds/c4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..33941cfae1550c1971a1713664e5f41cbd74531c GIT binary patch literal 8833 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 C(LC1x literal 0 HcmV?d00001 diff --git a/demos/codelab/app/sounds/c5.m4a b/demos/codelab/app/sounds/c5.m4a new file mode 100644 index 0000000000000000000000000000000000000000..49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3 GIT binary patch literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S literal 0 HcmV?d00001 diff --git a/demos/codelab/app/sounds/e4.m4a b/demos/codelab/app/sounds/e4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..d910052ef9fe9dbededf8bb949e813d2491c608e GIT binary patch literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* literal 0 HcmV?d00001 diff --git a/demos/codelab/app/sounds/f4.m4a b/demos/codelab/app/sounds/f4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7 GIT binary patch literal 8530 zcmbt)bzD@>_xD}OC8bNyW$BWX5|CKByJP9@6#;>zLsYs11f)TvyE_C#LJ$xEX%VCZ z44w;qKHu-}`MsY1p7Y|p=iGBzcy-JkcSvKrbPz5T#;NpyzP535p{m^&2R7VUu)yrBSBfk+atlm zecuT*i2F`ilHSv5C^||oq+d3ofwPHn-{%L;>6IaG-aNYBqP0e{Z|`JGy6=&G!9tZ zscFl4%r@fBauOGygC!jXc|;lER~8>E`g@b0x9xK0E%j-;C5L1>{ue)L<>SN2{nbe7 z)5(~E#6G)Vz=IUoVnR$Oe#XzmPeAcwEp>%nwq~;f2dne;6AFMZ7bs`9)MmvRQ3}0` z2iVYtcU90O03O8dPV{GRIG+~EArt3pL+=sCVZkwpb{-!471f#L@#srrD;wmh+-H<; zusAeULKwgID##D%9OBHZ2a=t3J{f4~y~X6Vn75?b6@XXz5YR~h{C|E{QEmMorTOz5 z=C@J#G-K8{``m@)Lb4XuVY(h~Cev!0F^y04V+_@!{c%3znk|gOvPoB>WwDa4!wM^?Ll0*he&BU&9vYE zFh2ko31n(h2-bn*glPTxKmxfE45H1ClP#+x9|iWGZ{O6e~1~AX{RBepC!K zsuTL*v0Zk6Hz$3l5p5Ld=6&SE8;Py~JBdaHudt4up@zr8204P5^IOT1COz247QsWD z4@w{=_kZc$>r|n@8=Wp`&RAm^SxB=oEb;Xk@NY~RcixGyyEWDrJ9FaW^u5yk!~BwO zy2d6w#?cJ@X8`z!%}ym#C<(en2qOg`THF76H&djBOe&?8m%)ohV3LH;uHCnHv)73J zY% zG1evQwm-`I<&VfvmiNJ>N{-0tiVnQGxR}x|W`2s})4s)H5^gSdpQY*u(Vsxx&oJQ? z6&-8~&LRMl4WR0dU%)Xg1~OEcf0JW(E5!pyo1f9q|U;mkmjBk8NKRsA(yK#xyZ1ft{sORB(Y3vOSYP8;d#7Q27%ew9` zZZOX$*4fegf z(alA|bkqgckN+$QY-W#n99hRerjPB%X!&2~BLoF>7xEsPY6NFV@KvglX=c{H(Pd z?F{U~cn?%rLn5yRBJzjtH0*ib@v+%|-s z3oDqObUwQ+DBUcWamui*=JIuBV&znY+}#$74-c)OS$+?cn#!`8*=p%_3G3MgtRJh3 z=PnPN8DM5p67s1$xur9uPe@4q<6v|gAQ*A(_)N;ws%L0*f?pH*EjirXB%I++)r=!) z1=7=!jRJ@-p@du~+t-!GJ<{w@WfE#~87$SKBaNg{HQZhWs`8nG$b~+`S%;rr93e8>wzxJ=q{|ncnx^V&hHMV&V7;bkTVmF)3cW8}QLZsrk`(C=d^ZgMO(3OtC--=v#equ;9oO@_m$qX{Or_p>|h zsxf<{i8U9FwyI79$=*H7wcJTzSwudlEqPwS$mX3j!AX8D#b71;XE9ld>XPu8ay(bY>vb%_+v}myR!mbY3bHuF4q)OCP-g5ZG(_vUz zRs~;&_`%Y@ht?O@Z9^=f0D*rv#MJd3&stHgOj4w-_T}!}gcP0_5vM0{q$jg^v zL>6RB6pRR?*&ck|O2}G%b-=`rzJ%ohIU3)HDa;pQEk{k}E43Sct7s*w38wI%t$>gp zQ_kU<(k|~mbwQ6$C#QPf&!~%HU^VQvR7h3XKsQd@&X#gIT?CkwFlczSE2~>8&$1%R z(vY=cl>KY;TubMYGBXUt2S8!&bvnU9|C>$<`mH_ZOyenUMPTItB?x60TR4GEkid~^ zfMXt0yCa>aNMUCPW_C6=ec>RX>ug0XUfE;4O?<<86Ty#<^u=Dvq&wQ)IkuA$`o;Qk zaYP2<6rD>>(s$X+$kVu~ILfmMWx9jqFOxhgsWC7e5vfqTgtC%H;OB9EBMJMhB>957 zk=j--kyv|%(6T}L*O*U~QvBn`eCy%y(B$1;TZo7>XE1v7*!g&yqn{t)BL-&TxODM} zuQ$J^HHN*?Y(wfK#KiJgWZf1;O^3^JPG39=cQ&E!54Z>)9H)F%aND$b{$8jQ%i7hTZm5O+c7vd6Mi1u@KF%!`c%d`&7$c_&gabCKt*=u(1T7E z5V&859$fdi6-(iIl1HKOqBKErZSzSut1D@vvy^ccQx$l`F#Q|tfi)^fFHJ)aa?Z~FXwf|$@4R#vbH{6E z9vn;~+i^{N!Ul)S4suvCf-%Y8k8JoYooJuJ3)Yg|r2sCuBm)v?G={6shx3?H#k&S1 zdEDJ>K%Qc)w`h{duROL-Lh}G=GOa^dpMi@EB1I@;K(5Em*a`~T@oL(mGo5oSxKS! z^6S!qX(3n^J?ywM9411X7%;zxa3}OaM-XGJ zimdUWg(Lz7O1znlk%p6b>k*dd zv5R>7grWNn(^#uHol#NP8^h_Xg8_PPTh@jNfOD!=8T_AOVcV?y+&n|G0Up8CPkDD}ji} z;wwd;s8xy5@_P{i3!OI8{pGfD5tWv5X<;1Q6b70QKl5*5am*q}w4AUo$HXJ{vRm1C zGn?4DdWimoz2#a0pQ)%%&TvgG8Yw^%AGpo}fi-egu=(_HBr&lJ4%_CG@TSQJIwEet zjyj$j58zMV*7R-ebbXavk{)&w=VVZW)a8?9sj%r_L-Y@rhOD0uKQCM7jXS!>e&D_` z*mSNuD>Xp$7_w_g>wt#CDcS1_q)?2KoA?yQFr?Al>TblauefJZN+p>nOt`cY5>FiOdm{pVs*n5<g`f*(mq8m!CC)Qd!M(_yG(&P;LP6tMvZGjw8YR>eb2pN4}0ZC}wSjYVEufmGe zskg1$MzBvfGr8M#UnEPjnD<2ehywv(j_ zVjOt_w&{8KILx@`=Nq}Xmbq`B1WeiDyiM*+YmzPqr<%HJ2@CkmYRSdMQ?(`?s^L~MuVde;_%vgc zU@M@7V`bPnwM_8Kw?7guW2%pWBINoI0E-wKw{HebrT)4_T{&Ceko@T0R17Ss)$yVCZ!-LxB`bba=Z7)00wgb$Jr)}U ziDxI@w|yC-hJ-a*hv7*cYHoZp^e3k4N)FcCLVrKNu~@Wxg?x6RzI(15D7rPE@B!~tg+?Wp zXNYWAjwE)b56z)osJtvEkItX>qJZ|AAB-1xBr_om#Po-z)lJgkOz(Z*raNbuf5`30 z1#qK&uEas}Ujc_$737B9|Cj7G%MSxG{iCWa(kkkY+IEs=}y=D&dCJI#doVDqH z#%!q5tKHTS((!q(Q(CAv2^}Ejh?L8|J6`OL(kqpz5AkB8!fQO!#f_aF3=B3J8;9#% zbS6h)!c?0{H{$jBsY@IcSLchYGNaRjMbc?$6?m_U+ioJbZb- z=whjOt$s7#q(aoHC%q(rAQ$=Tgj-M}Y-AcQ%gN^3&N^OtOH-*Vm#!)e>+N@O@gpB} ztKvyVY4p(S)ET zHqI79;5=aHbX^*ptonj&BF?CwqtABuRoNo%j#o@n_NVY8Ae0|+`L@8(^`v%XYch9$ zfKTDVJ_{RyOol6_E)-5v6h<%pvd|=peL?D^ z?nT?3mK^?B>heq{G0ulLH%MC>bQn2!NqPNUOI*nrNFM}sK@B|kgkG#htriU7~CnM#!|dd*03I(@Tea&?+V9%94A@xyqeX zx@yLS8{hwo_idhINStRDkGVs&$AE?hyz~f02|Wy3EOU>2M{xQ2EUn;eaKggkpv;7B zQHhQ@zGz#W-sT%Nm-ZQ*=R_sIzHfEW<+5JE&d2O{wi9m5q$M2;NjjS`#(N z>}ioZ;AI53$Ky4vbVqWUIfiM7WF(gcR_*ia9%j^xr;rR#V-)w)-u(?Hd7G<~o8wsP zN;XSbzuEo=QQsM=qhYM8#jSs+RG9DC(^}MB`l|U=x2~Rads20RRCGx1E9L1TvbZIy zB5~C*vs>0&wa)MpQCar)0s&(^!|{e&x|BdBxv8%5`x1(k>+FXrk+p@*Im8PwhQGt3 zh;SiXRr6$KCGnDB*akF5Dp%f#A-b=A{b5Ju+znIF zxwo=Z?XiazQcg^)bncNV%*qb5m^DK02B-zN1{EZjsO*!sBdZjjg?T47l%*m(Y2&_0 zOJUg6En|@ zP$Z2H%_G4W^*RxkET(~f@$^S=%DjTeXreG4W7WMSt7i378I399NPp$2QLjkO&7#H1 z-bVA(!A67q1)a1b!wGVP2rq)<7@(_O|2n86^JT~or4xTM7OqkDMiiR$N>C$2gKZcJ zO;i7*Xc)I7JlGm>;Jwz8eH5^?6yeKCAY&G`^8$Ea=~h6s>_7TF0XK;^3>n zhWT3iFUO{4dnP|4lV3el&c3P{#OXOzA}?KMDu=pMcu9HVpYE+4WTs&?Ahc-e`QEx@I&X> z$G>KT7^yI8CM*&wq~;@Fd|2$S%{oM-A4txo6r}L-hz^W?C!scu4KffDJtm|w<@Te* z==z)G3&Cj2>zaEez{cHguhaO^b7rXKcsB8jO$UR1%(r(78%v{8_`9O`ZCGmCR1*5flAbtuWNjdU{1o$6SM_<_0I`K3skW0%q!B%d zWi`~1LEcJ{y&oS4O5;MDU&g4@=m`4l^hO%Owo6XJeeWgic ztIEOnY+1TVE%DQJX@I|_U0%?h8JgVRe$P@*Tnmh=-&uk5lRsMZP@^q|M z&Pud9OuOyjSm52BmZZX+4ONyKT+4DjcIUxW8o9ZQCRDGo@wZn$F)zn0jg)cuA zG4`Utbv7_QVt5j{ytJoq|H&J+=s0|X&E`ikcu%RJ6a87=yuJlQbS3v~%42OgL;_Bv zqM3yy(%D-2{;2*E>dh_k2xAWQFbc*5`xh*?;7uDX&r965G{hV9dW=@)lR^KykJey3|(K2^J;UF&H~DJL0y+n&vrp(B9bD)cAm?Tefw5eeXo&*Lt;#5IjYUP?Eu9pfx(@ z+hDW)8p$XFZM#K^abDGSfs##-Nl+~tqHOgMU0+~<^=E6Ga~W2Xk~`ug?6(_Qf>wxj zj3R%Pv%g6~n5kWUc)fxUHyQo;$O-=>+}Fl$w|OQ$bHz+uhH_L?={CNRdM`=Xy7zeL z2zy!V1XcT5k^R!wPrmsB&QdXTZ>bC)8b_Dpkzv2pO3ckCd6BilVjx_|WZ*JwW*Azn z4N$UQ9|F0^BZ|_ntid<*MYhF{e@s4+)FGNf5+Hks0OZ6#WG zxunfM^pT6?DJ}Kr24c_O+v``t=X@VHT2iRO*iyyqP5bUsC=(2-G&YzN@uo`zaAT%{ z>OWPCBZs1$^=QLTCqbyg*R|CaQ^PgeGjpQ z{4_2uKk1Rrlm*_dh6AH~1gVy{xT+j|2B_{NrgAIP#%ydDZ%qGar?)MvaQKt`up?z- z_rL_`%}@RIqw_|R!vZxnpKSW1=Cf6u!IIlps+Kq;5H#d%TJ|$e9JlYhEb>PObZ;ms z9J5}&Z#X3)%T0I`U`tORV(*xxU2DxZLLxjZtem_w!&S|=tgq?U)@@j8He;LU+xJ|x zE9ym`NG;iX)aM6KdjDxDEdN6`;ARtp<<-|z0Kk0j>hAs!{MPE?`q04!zOWq%&wV^>My#6Y}3S|GgX7?*E|c zCjM7D|Cao>nAE?*HOBy4Z5)xH2y?ahfAuRD(CfP{$md|=;`MJ;Z+Dd2zw#BAb@#G` zso8>ef=Q!n9Nj?`q}bKb%?=cZyqtS4XV}YDpiUObp z>l|ML8`NNs661gj0**64?d{`pT?Le{Zp#K%0vSLDHgA0;fOMt*$9B!@K%4)ykUHs_vC<EYpGd)HAH36k6#t*X{{bas BFa`hs literal 0 HcmV?d00001 diff --git a/demos/codelab/app/sounds/g4.m4a b/demos/codelab/app/sounds/g4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..45ea4483021bdee6827f4f2cdaea22e5983979d6 GIT binary patch literal 8306 zcmbt(bzD^6^Y_w?#FBz6jg+L6NSAa-NiFQsOD`Y-0@B@xba!{jQj(%{NGc$rgoKp9 zbJ5S|`~5w?*Yn>qFW$`DnRD)$bIzQ(bN7NkAUbQ0=Pv3(G7u0zw;bUjBw*+6i~ufi zz3gCcph*A%2K8WsU`X52F=~91#reF!lDjv>Le{EGH0fNCcU=>gv*nAZxv3q#{CV*f zt$z`h@Abi<#4!I1yUY`!*iZLcfEOS@miD|!I(A}P3)CPN3)sz zRMm}dLtEb#Skr1!EOj zUOJiQBQl)GF;0i-3qd_yk;Yrig&J!EwTWkp50&(B9&!#4rdlSX4`5*5O@MrjQwbg< z^HX*OnSj{9Z*WSWlrwb% z!p*7rvm0jf)`#P4wX;io=N!LPjI`XBm1-H*^80A7W|Ps6*mHBaE#H~3eWVlPo$}?$ zDWIZq?d|gt>Z5EP?W%M2c}CG4{45{|Z%{HQFY7=i`TOZB@LESd2Z+3B$rvGjP0?60 zl@%@F^uZPltx*&cE7zYn0PwD;R1T_bDE*Lz3r{hK^ggCEBME)am$z*P?}=!icRY(x z{T>24sS}+OViB>NqDxTS8AcWd4fh%9HD!g*WHO^GHz@5)FNo|G1W*i3rP@IFP+^S~f+!&9s(uWnWLHDXpb9hdSW#UE7u}E@XJcLO`Yj zLj?21Yy=ex>h>ecU&PA`?zVR=ihMy|3l#II5(q@;pnsGiMF9?1C5Kp%%)@u$Nur56 zv-UNc&7xm$X$qXB&6;Ju^Y$c{XMOs#B+^J~?VkAFu_MN=CXbk_Wp-X%5or2`8NytA zK195F%8jZ~4d7kF4tp@iGLTw`^kL@M_NGex)a0%mTPGnSFrK7Vip^BiG~sue6Z6&yBG zcai#59z)u7y%9!r<1CM}autk!WL}KV2O2HfLW!KR$-@!%2KVE6g`2%P3?yc<)F!k; z-UqqpB(>(-i#_M0a_y+*36~p}wA}Dqc&!r|owntg@~$EU{g`=Stg(QTbEQ$%pZa;w zUB1tmC}|93)pqVzf5S8-%#vgtmP+#kPd1Q=2DKlvcIx@9A-Kgvqa@YUM{N#iRQtiu z+;u|Dx@%4;y)P=wCtuSmJ+TH&b|R_mgtt=j=&rO#zIHTr*hU@16ZJq08@%Z=6mncw z(So7fv+4H6Ad1J5%#>75wdkkm$ZFk}Zm_N9j=a$zm)2aLk1P&MezGhDM8JgmvWWx? z0{LpQl}1p_dTc*hd4;WPOfL!|2mlGaYUl3z<8BP#E@U3A#c~&0){2n^^~HN^W!dLh z(Wg&J`my))+@H-GRTBsnur@E`a1|9bsvSo;=_G4j1#@*;B|T?n;A3E$$Gmpfalt`( z`vw}!YzKB{@W~SybBPs^!8w%62)4wcw95p)54LxxR;?3igWdI+RX&rMcQ@K3?>75f zyxt_bQ{n5&z1txQswMXtDG4yj0-txOTCHhv9icbaYJH0G{Fn7Cg|*n=>w{pTF@kvTUW2iR8`6tVhU-3Eu$3MR;zk7ZdW zsm-10MiiJ0y0M^^c~>gaHayAjo5>2ug!%B;Ht}VLO9BJ(=q%=)cfcKqI~mHU50;%i ztvWL=6&nlA=p>l?f8&!@1Azjt`h)uap1C3*lu2)sgajUT59GD-69^=jc>NhehU?+? z!j^ZjZ{{!sf6zFz`Opd6`xMf`RXaNLGP-!{g_Gp?s~qKx6T75GqM6A)kCdg{!7&aT2AYk092cHgMR{-BB^{K1H#gSBjpZ#x%8N6MrE zMfOAPDU8$w=f*qf8xs){OdYLxu5W_G-^4M;T`(>BcI3V3O=0)X=J@KyQu9jaj#x@S zZU!#?!EYsC^7;qdk)Po+<_Qb>gYKAAb=`ZLhsZEH?jP?H#}V`(J9t|x|KLZx zCo`_Wtqwg4W~xOzcSvKei9_*KiFCSpP~d=n(nn040u(e4i)W(_2`*ry0m+hxLf6;7 z+9W>SYMfJ*af1r+7vdZ)Y{@E%a{g*%}INHxFBMPrr>z4qWHVca0i-_Ihj~%6!8= zNz7!$tIKZAKej@Uis|y(%Ib_8RE8a?l@6o0s>G3}>#)Qt?bNTCF3go7DKBN~DxhYy zIG|%uwVeN<=2bo2q8uSqbUE;7Sa<@P3Cg=&_1A4=shnjBU%Y()V=!?<_JgB_BHa>l z6QzcbQJf)n-PEG0u(`~#=hO;!#|cO$o%2g*`u3%?G6=L^`}NvVQ4Jx<54c01*j=n`H>UDqoA}{y2y% zd4bPbXw_1Xi%te_XCI;x@3>j+N*{$woU)9U!4^G*;{ zkXbvEFs*Afaugmecq?`lh6v$f=5zhc-yuLs;r~;2PzUu0qG3YZbfhFcjW6yr`P!S) zs^l89>Q-lTTE?90Hr87S`Q+QeRv^93=jm0g@s^w>NyDd5sVq8_0vm0jI8O6(r~|2kcU0ZlZ7)q({w zaTzh*j6FO~7I!FaH8(KeF3YiS{Ov;|II!=|R{Zi@rmFGLS{dqeMlJ+`A@U@O0)w!Q zs&XoV<|Shh2+ocjFGSIQWyvaRXz=X?LAdD=eybg&z=dEEziCVKFVgMR!t_C@^SQR2 zeScUD*6`>W8}~^_i@j$tJ2&}Y(uhC#!PrW#w(atg96ZTg*ub>Dx7hl4nGF^QwF@dF zO|e$ioneIIf}{=pK6+y6LV!>)vE?Kn!Y*Ls2nZq(M;=k^kaQ?b+P8k*Ff7@C%uVar z^z452V}bLKlH;;+7hJLhch4p8Qj;?FMbs|Al+cyhQ69Ng6j#F)BlL4WCT(=_KV8!| z4c7R~WWVJTO^Y?y!l-ym>ZBUbV;_5?KVtwnYR+r%!;Z3lz<(pEs5Y?g)VZNwb*DNf zqTsBOI>$4=f3dl9ZRHDTeKm<1*Tmf*OF@?6I#o~3yH6gcCkS+MBz)vk)+I>C#b5iA z#SygwP{=&2k&*^4$eIz<4{=%YSE6t4u${x3PUB`iCVmoqB8(swwB}99M!?(c7T!Oy zd%dvGub5`B6JY7dd)Z!a^+ff0Vne$nE40Ocv%-pF{Ho!L?YMii*VQL9a2Ihqk2E$_ z@@6TRN8Nm%8W&?yof(%OGqZ?m7s^!obn3grJ*Da&;#hq87{YE0L3dfDGN2L!i^qLc zZ{Ofr&)R*jFiQCGUDT|AC7q%>ptU3fdVvrJ&%vf5u`K=`*`{VCXd=Is8WUbJ5I!4Cw9mu_goK--6rnJT&v)=A zerH5Ll-OeLS*Sh#FkA^mR$Q$>nr&9E1}J05Gkzbq^S}A*CIf13Yc}DKr`wLMZq4V3 z_p*9^q+qSe+YHBhNFBwe(m9z&uA4MFgw1FdP4attIFW%3uV~A`yWydjp~^GASlUzp zM~{e|PDu;nfbg1sk|W@I0$--fQ)xn3oCo|bv#rWiCNJ!l44$MCU51K1ypw9S)TFLV z=ziuKMs30?$A5P^TULX>7;Q|*nmR>O=C?Rfb&5XG>j%!5g2+7|%1r za+#rU5YCHWMZxlk!(XEIMse5&$!jfNV=iZa>folFOP*5vZGIm z8{4zZir;0(^v_y4tnTl@@0*be>KJ@qeu>E?_vI7>x-Fv-KpcYRa~+W!;XpALsuX$N z9jhBgCyo?0Zf0_p#7${E6bcMBNhFuM!=uWq(L^_lU8UTdqDmK$#vnu@C6dmm>K85= zvU#E|`nol-^-~ws;lmhd3}TN0@HZ^z>)_t)v*uTVnN2zb^h5ZREFHZz{f9Fi-8sb@x8o_tnBalH9Sl=r!JvOuQ9LXqK5m zOhI=o9eE8QTy7OQ*08pz2lmM*m)8X7=&gS%>zH~KAgSd#y3rEK68O?j&B8LWgxt}h5lGFF=_~7jo+Szuf-prh(3!R@TKELF->FSajAx4x=AFP#2F zjls_EL0pD*7`z9PO( z1X~nuz99a>I6Z}CEpwh|O8C_et=E5_G`Deg2Es%F4|k}cGH|FOLeMO8!$TpK9NDkG z4?I^aIw@H2kO_(@O}FVXy8af3*Hb)yGLG8vdH027QJ#84M0@}_Jit!b(k|!1{1PF{ z_?+Eoyv!?x;jrrg7pY;-09v$2eC+r*SFt4QJNk&~<}UU+zv-6G$6i&l>QC|%Q^{#1 zfeOXvWc0lgvhhTt4$$Lunn~-FZaEV6L)xi^^p&;r{Ofqi`!Se|=(y5f_2Y8Je96nQ zjW+#F6lse6f^njYPI}6y7adsjzeXc56k#UGL~Xtm^CG= z_i&NMVw?-^CNw`2DlE&ontIPKJIIx$CKi^LKspAdCjAA?-Bc&2 z**fOiMC&t&G05$(1J~UTjvpvFd@pWN*~^6b6L|k52t@xYOW5mhTRx*6!5615+=bu4 z4|dLw*0Z3ps|#AIK%*|2mX==?i$>)4-97GPi`j5lD(8+5DGwhh!));FAjyR66E zWW7@*yjw-v6xL2t*FO>W;)Zos&93y|8)=*z6q!6_mr0pvP8%+L!dE%?nFRPkgGT23 zU#lL>`G?D~WoeOv4{E1`_PSsH5}gpsgf0-9a_hTB)}CFVK*ayaeh456-3+ya*tC*q zGu3k>Q#~eTj;D;N^{8;@{bFz|+~j)-MH7C8%@CCD; zeQ1$7U69$u`xTw)6tTj+%tkis-<68g3kqFaH0wMJ&*#9u*mOt@X@0_6&cV4oQWA=; z-=!;8gm9Lu!HFda;p40pdDDcUDo=P>@#^1XjM5CXi z7i<`(sp5>&d{6rgo^jqtXCX%TxPGWW4HoR4O!M4gZ@=5v%h7nfI#tJ_;GtrU2F`q# zeT1Zt!S{=9RmM_#q?IK9J*+UvsTSY*qel|fFP={zTbgQ~EOl7yCG3>^q9vEZX3>xg ztjWMSG?ns&KVmm(X~UhrU*K8sMNLOC*vJgS9h4P>Ui&xu!GW1U=3nbklape@u(=Vd z)|sYlJFcQ06CL_z*e8>p>O1w0kx!Le{E|Z6pblV>GselmJ%cr>>BOE?qRd#d*eE{2 zdLd2ers{y~-J?liwu+LdK`(U}i&7U$k3fG% zmF%O$pYl)G_tiGCTfoKTA2;Jidsq_o)IUg>DqQH+!om3a~2 z@LrbfreG`Ad@ij-ku?u=cpabn&m?@p07%eA(?+ zMZZ^%YBFQ(=@)}`R- zLM!<*<(cP29A1M*ES{K+{DKjvOhj_`$STQt2eo3%HgXX5INLmRM`Im*6c1(}Kfb)+ zEX(A3V^-!?*5A;!Se%%W=lzRNse?GG^;c|c9qB&Xw%GeI_W>G2;bGp(y^a8cF*g_hKl2`=586R0pOZcfd_*c&WAJ6V#*SdX_9x2 zi%e;)PpR7m@?jzGUeuOtwr&*(>K?vWs>Kpj5SrTfg&aMfaYfU%jvlFS(V$Z4(`^5O zr*Yr5{``Z0NoS#^WlE|T?pCDG+Pf!S6N3>O^7XpeNyVPZf%am95#>x+_NrWBSjr+K?+fesW`mahd zz8PgPX=NDJ!ahxVPY=Z~5L|$0Ss_}*DY$ZywG(C!H z$h4+Tf{pEyYUE7QQ$|*Xay-9#jh{1UPLC?Lt2@j(9h@SfDFuWw_mtmWOpf>PKEl6;zA!18V&Au%$fSXIX+floZUmF=Lf(wd)_LX%-+7fa)U$a@vJOS zhLNPAJiA!l)$l0;_;=lcaFjmIV5x=oqrJ!G`wy2HYOYSdJ}xb&(e3-zwsgX3nod|k z%Yuy?Ha<%xs~gJxA#672m=IIg$+yxTWdxqKF$&)!_V)V z_}k2CHCbL#Drt5vyWDRJ5Kz6$M9iw53Gm-knU9?do-^o8U%oos$@6p=-H#bgA=Yy# z2|X0BeB$L{Z`^-Mq(0Zmvk8a3nanbsB3__*7mhh1!t>b2dz(*q5_;c*MDqUl&7Cl7 zu7tV0qi}L%OD*~CxfF;$3BAv>G{}TeuTCIz%|s7OrSY_E>OiB|3I&Squ1(_qW*^P)&^^oSi*^?~#rOPg@wkK{IqR?{5JD zRmy`v2@4=J(Cy!U>HoR_)c@;R`oAszUlKY9gl^&C26X_8CLRud#zgz?nE&1l825kB zpCSI&IRCc%x0&?6!XJ+I8v(O}0wM$f`+v)zqQ}et;>W+H%G`{8O_Gs z!_pCu0q*{1vH$8p2Ed2mTW4?Sztcnqk=!b7w*eqQxI4`KR=@}d2w(y@Ccwec6d-D# z&+#8%0UC5N5^R8>0qYE+cK7i3(*=-kZ_5sJ0vL!67~bku0O(f#kL?ey1#CWlEPww2 zeL&a%iUITj$OcdcpbS9GKd1+I2Y_w>O#nIpv;e3E@D{+Wt`)!lfIa}X_PKws2=H+L z9|24Om<6y5;8ypq?Y8ah^(KH1044ym1CRs&cK5Kl-IrUsod-973na_~3h+Y&{0|32 z5YzwMXCOBIv*)+QKh$sM=moDKnpI^9~VoDsZG7Z*o3ubm#!34XhxU?(U7 z_<9cl-D-5zwPXP?82FHXJL;_$APC<-^j8oS;`=M`D~SBZblXCVUta7#ivLgH{{Wsj BLdyUE literal 0 HcmV?d00001 diff --git a/demos/codelab/app/styles/index.css b/demos/codelab/app/styles/index.css new file mode 100644 index 000000000..0ef8f3bfc --- /dev/null +++ b/demos/codelab/app/styles/index.css @@ -0,0 +1,75 @@ +main { + width: 400px; + position: relative; + margin: 0 auto; + overflow:hidden; + height: 600px; +} + +header { + background-color: green; + width: 100%; +} + +h1 { + width: 400px; + position: relative; + margin: 0 auto; + color: #fff; + font-size: 1.8em; + line-height: 2.4em; +} + +.mode-edit, +.mode-maker, +.mode-blockly { + display: none; +} + +[mode="maker"] .mode-maker, +[mode="edit"] .mode-edit, +[mode="blockly"] .mode-blockly { + display: block; +} + +.blockly-editor { + position: absolute; + top: 64px; + left: -400px; + transition: left .4s; + height: 460px; + width: 400px; + background-color: #eee; +} + +[mode="blockly"] .blockly-editor { + left: 0; +} + +.maker { + display: flex; + flex-flow: column; + justify-content: space-between; + height: 460px; + width: 400px; +} + +.maker > div { + display: flex; + justify-content: space-between; +} + +.button { + width: 120px; + height: 140px; + color: #fff; + font-size: 3em; + text-align: center; + vertical-align: middle; + line-height: 140px; +} + +.mdl-button { + margin: 1em 0; + float: right; +} diff --git a/demos/codelab/completed/finish/index.html b/demos/codelab/completed/finish/index.html new file mode 100644 index 000000000..e2d12af1b --- /dev/null +++ b/demos/codelab/completed/finish/index.html @@ -0,0 +1,73 @@ + + + + + + + + Blockly for the Web Codelab + + + + + + +

+

Music Maker

+

Music Maker Configuration

+
+ +
+ + + +

Tap any button to edit its code.
When complete, press Done.

+ +
+
+
1
+
2
+
3
+
+
+
4
+
5
+
6
+
+
+
7
+
8
+
9
+
+
+ +
+
+ +
+
+ + + + + + + + + + + + diff --git a/demos/codelab/completed/finish/scripts/main.js b/demos/codelab/completed/finish/scripts/main.js new file mode 100644 index 000000000..03a47e050 --- /dev/null +++ b/demos/codelab/completed/finish/scripts/main.js @@ -0,0 +1,88 @@ +/** + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + (function() { + + let currentButton; + + function handlePlay(event) { + loadWorkspace(event.target); + Blockly.JavaScript.addReservedWords('code'); + var code = Blockly.JavaScript.workspaceToCode(Blockly.getMainWorkspace()); + code += 'MusicMaker.play();'; + // Eval can be dangerous. For more controlled execution, check + // https://github.com/NeilFraser/JS-Interpreter. + try { + eval(code); + } catch (error) { + console.log(error); + } + } + + function loadWorkspace(button) { + let workspace = Blockly.getMainWorkspace(); + workspace.clear(); + if (button.blocklyXml) { + Blockly.Xml.domToWorkspace(button.blocklyXml, workspace); + } + } + + function save(button) { + let xml = Blockly.Xml.workspaceToDom(Blockly.getMainWorkspace()); + button.blocklyXml = xml; + } + + function handleSave() { + document.body.setAttribute('mode', 'edit'); + save(currentButton); + } + + function enableEditMode() { + document.body.setAttribute('mode', 'edit'); + document.querySelectorAll('.button').forEach(btn => { + btn.removeEventListener('click', handlePlay); + btn.addEventListener('click', enableBlocklyMode); + }); + } + + function enableMakerMode() { + document.body.setAttribute('mode', 'maker'); + document.querySelectorAll('.button').forEach(btn => { + btn.addEventListener('click', handlePlay); + btn.removeEventListener('click', enableBlocklyMode); + }); + } + + function enableBlocklyMode(e) { + document.body.setAttribute('mode', 'blockly'); + currentButton = e.target; + loadWorkspace(currentButton); + } + + document.querySelector('#edit').addEventListener('click', enableEditMode); + document.querySelector('#done').addEventListener('click', enableMakerMode); + document.querySelector('#save').addEventListener('click', handleSave); + + enableMakerMode(); + + Blockly.inject('blockly-div', { + media: '/media/', + toolbox: document.getElementById('toolbox'), + toolboxPosition: 'end', + horizontalLayout: true, + scrollbars: false + }); +})(); diff --git a/demos/codelab/completed/finish/scripts/music_maker.js b/demos/codelab/completed/finish/scripts/music_maker.js new file mode 100644 index 000000000..50a8a3b7f --- /dev/null +++ b/demos/codelab/completed/finish/scripts/music_maker.js @@ -0,0 +1,33 @@ +/** + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + const MusicMaker = { + queue_: [], + player_: new Audio(), + queueSound: function(soundUrl) { + this.queue_.push(soundUrl); + }, + play: function() { + let next = this.queue_.shift(); + if (next) { + this.player_.src = next; + this.player_.play(); + } + }, +}; + +MusicMaker.player_.addEventListener( + 'ended', MusicMaker.play.bind(MusicMaker)); diff --git a/demos/codelab/completed/finish/scripts/sound_blocks.js b/demos/codelab/completed/finish/scripts/sound_blocks.js new file mode 100644 index 000000000..b666d4f4d --- /dev/null +++ b/demos/codelab/completed/finish/scripts/sound_blocks.js @@ -0,0 +1,50 @@ +/** + * Copyright 2017 Google Inc. + * https://developers.google.com/blockly/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +Blockly.defineBlocksWithJsonArray([ + // Block for colour picker. + { + "type": "play_sound", + "message0": "Play %1", + "args0": [ + { + "type": "field_dropdown", + "name": "VALUE", + "options": [ + ["C4", "sounds/c4.m4a"], + ["D4", "sounds/d4.m4a"], + ["E4", "sounds/e4.m4a"], + ["F4", "sounds/f4.m4a"], + ["G4", "sounds/g4.m4a"], + ["A5", "sounds/a5.m4a"], + ["B5", "sounds/b5.m4a"], + ["C5", "sounds/c5.m4a"] + ] + } + ], + "previousStatement": null, + "nextStatement": null, + "colour": 355, + "tooltip": "", + "helpUrl": "" + } +]); + +Blockly.JavaScript['play_sound'] = function(block) { + var value = '\'' + block.getFieldValue('VALUE') + '\''; + return 'MusicMaker.queueSound(' + value + ');\n'; +}; diff --git a/demos/codelab/completed/finish/sounds/c4.m4a b/demos/codelab/completed/finish/sounds/c4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..33941cfae1550c1971a1713664e5f41cbd74531c GIT binary patch literal 8833 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 C(LC1x literal 0 HcmV?d00001 diff --git a/demos/codelab/completed/finish/sounds/c5.m4a b/demos/codelab/completed/finish/sounds/c5.m4a new file mode 100644 index 0000000000000000000000000000000000000000..49721cd31dfcb6154563e05a4ddfb4c3c7c03fa3 GIT binary patch literal 8635 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

xg=QnTcLx$HKyyHsf>6T3T9C?@=D(8NpNtf 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 J68=Ax{|DjmhLr#S literal 0 HcmV?d00001 diff --git a/demos/codelab/completed/finish/sounds/e4.m4a b/demos/codelab/completed/finish/sounds/e4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..d910052ef9fe9dbededf8bb949e813d2491c608e GIT binary patch literal 8454 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⪚9^ zJv{zq0qon$G6R_a1)>6qx4bm~x%K}O_g6OpalU_J?tXwgAWQ%y0Ga^Q0_Xrx3?Lss z6@XjcZMYRc+dt?A^sT=gz}tWD4$!ypJpe`lbOGoEFb-fEzyN?T0CNB){;?MTy$awq z{S<&%080RF(@z5M0RVCLu)H0cTe)ouJAf-B!owWUXO32XHDH2Z|8uMXe*E{i-$wqG zeme(u55Vf+00hufj#lP>8DZ({$Z784;$X#T_XO!=b=#{DCv!*O9|a)Ltw&o`Lkcj% ofIk=9mU>$Y5H0sVa%TwhbN}Pv=l}1h+Y}-~Lel^3`2RHi3zKjz?*IS* literal 0 HcmV?d00001 diff --git a/demos/codelab/completed/finish/sounds/f4.m4a b/demos/codelab/completed/finish/sounds/f4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..c80a0bfd3b28a1cfe18f5eaab27a7829b78b48c7 GIT binary patch literal 8530 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 BFa`hs literal 0 HcmV?d00001 diff --git a/demos/codelab/completed/finish/sounds/g4.m4a b/demos/codelab/completed/finish/sounds/g4.m4a new file mode 100644 index 0000000000000000000000000000000000000000..45ea4483021bdee6827f4f2cdaea22e5983979d6 GIT binary patch literal 8306 zcmbt(bzD^6^Y_w?#FBz6jg+L6NSAa-NiFQsOD`Y-0@B@xba!{jQj(%{NGc$rgoKp9 zbJ5S|`~5w?*Yn>qFW$`DnRD)$bIzQ(bN7NkAUbQ0=Pv3(G7u0zw;bUjBw*+6i~ufi zz3gCcph*A%2K8WsU`X52F=~91#reF!lDjv>Le{EGH0fNCcU=>gv*nAZxv3q#{CV*f zt$z`h@Abi<#4!I1yUY`!*iZLcfEOS@miD|!I(A}P3)CPN3)sz zRMm}dLtEb#Skr1!EOj zUOJiQBQl)GF;0i-3qd_yk;Yrig&J!EwTWkp50&(B9&!#4rdlSX4`5*5O@MrjQwbg< z^HX*OnSj{9Z*WSWlrwb% z!p*7rvm0jf)`#P4wX;io=N!LPjI`XBm1-H*^80A7W|Ps6*mHBaE#H~3eWVlPo$}?$ zDWIZq?d|gt>Z5EP?W%M2c}CG4{45{|Z%{HQFY7=i`TOZB@LESd2Z+3B$rvGjP0?60 zl@%@F^uZPltx*&cE7zYn0PwD;R1T_bDE*Lz3r{hK^ggCEBME)am$z*P?}=!icRY(x z{T>24sS}+OViB>NqDxTS8AcWd4fh%9HD!g*WHO^GHz@5)FNo|G1W*i3rP@IFP+^S~f+!&9s(uWnWLHDXpb9hdSW#UE7u}E@XJcLO`Yj zLj?21Yy=ex>h>ecU&PA`?zVR=ihMy|3l#II5(q@;pnsGiMF9?1C5Kp%%)@u$Nur56 zv-UNc&7xm$X$qXB&6;Ju^Y$c{XMOs#B+^J~?VkAFu_MN=CXbk_Wp-X%5or2`8NytA zK195F%8jZ~4d7kF4tp@iGLTw`^kL@M_NGex)a0%mTPGnSFrK7Vip^BiG~sue6Z6&yBG zcai#59z)u7y%9!r<1CM}autk!WL}KV2O2HfLW!KR$-@!%2KVE6g`2%P3?yc<)F!k; z-UqqpB(>(-i#_M0a_y+*36~p}wA}Dqc&!r|owntg@~$EU{g`=Stg(QTbEQ$%pZa;w zUB1tmC}|93)pqVzf5S8-%#vgtmP+#kPd1Q=2DKlvcIx@9A-Kgvqa@YUM{N#iRQtiu z+;u|Dx@%4;y)P=wCtuSmJ+TH&b|R_mgtt=j=&rO#zIHTr*hU@16ZJq08@%Z=6mncw z(So7fv+4H6Ad1J5%#>75wdkkm$ZFk}Zm_N9j=a$zm)2aLk1P&MezGhDM8JgmvWWx? z0{LpQl}1p_dTc*hd4;WPOfL!|2mlGaYUl3z<8BP#E@U3A#c~&0){2n^^~HN^W!dLh z(Wg&J`my))+@H-GRTBsnur@E`a1|9bsvSo;=_G4j1#@*;B|T?n;A3E$$Gmpfalt`( z`vw}!YzKB{@W~SybBPs^!8w%62)4wcw95p)54LxxR;?3igWdI+RX&rMcQ@K3?>75f zyxt_bQ{n5&z1txQswMXtDG4yj0-txOTCHhv9icbaYJH0G{Fn7Cg|*n=>w{pTF@kvTUW2iR8`6tVhU-3Eu$3MR;zk7ZdW zsm-10MiiJ0y0M^^c~>gaHayAjo5>2ug!%B;Ht}VLO9BJ(=q%=)cfcKqI~mHU50;%i ztvWL=6&nlA=p>l?f8&!@1Azjt`h)uap1C3*lu2)sgajUT59GD-69^=jc>NhehU?+? z!j^ZjZ{{!sf6zFz`Opd6`xMf`RXaNLGP-!{g_Gp?s~qKx6T75GqM6A)kCdg{!7&aT2AYk092cHgMR{-BB^{K1H#gSBjpZ#x%8N6MrE zMfOAPDU8$w=f*qf8xs){OdYLxu5W_G-^4M;T`(>BcI3V3O=0)X=J@KyQu9jaj#x@S zZU!#?!EYsC^7;qdk)Po+<_Qb>gYKAAb=`ZLhsZEH?jP?H#}V`(J9t|x|KLZx zCo`_Wtqwg4W~xOzcSvKei9_*KiFCSpP~d=n(nn040u(e4i)W(_2`*ry0m+hxLf6;7 z+9W>SYMfJ*af1r+7vdZ)Y{@E%a{g*%}INHxFBMPrr>z4qWHVca0i-_Ihj~%6!8= zNz7!$tIKZAKej@Uis|y(%Ib_8RE8a?l@6o0s>G3}>#)Qt?bNTCF3go7DKBN~DxhYy zIG|%uwVeN<=2bo2q8uSqbUE;7Sa<@P3Cg=&_1A4=shnjBU%Y()V=!?<_JgB_BHa>l z6QzcbQJf)n-PEG0u(`~#=hO;!#|cO$o%2g*`u3%?G6=L^`}NvVQ4Jx<54c01*j=n`H>UDqoA}{y2y% zd4bPbXw_1Xi%te_XCI;x@3>j+N*{$woU)9U!4^G*;{ zkXbvEFs*Afaugmecq?`lh6v$f=5zhc-yuLs;r~;2PzUu0qG3YZbfhFcjW6yr`P!S) zs^l89>Q-lTTE?90Hr87S`Q+QeRv^93=jm0g@s^w>NyDd5sVq8_0vm0jI8O6(r~|2kcU0ZlZ7)q({w zaTzh*j6FO~7I!FaH8(KeF3YiS{Ov;|II!=|R{Zi@rmFGLS{dqeMlJ+`A@U@O0)w!Q zs&XoV<|Shh2+ocjFGSIQWyvaRXz=X?LAdD=eybg&z=dEEziCVKFVgMR!t_C@^SQR2 zeScUD*6`>W8}~^_i@j$tJ2&}Y(uhC#!PrW#w(atg96ZTg*ub>Dx7hl4nGF^QwF@dF zO|e$ioneIIf}{=pK6+y6LV!>)vE?Kn!Y*Ls2nZq(M;=k^kaQ?b+P8k*Ff7@C%uVar z^z452V}bLKlH;;+7hJLhch4p8Qj;?FMbs|Al+cyhQ69Ng6j#F)BlL4WCT(=_KV8!| z4c7R~WWVJTO^Y?y!l-ym>ZBUbV;_5?KVtwnYR+r%!;Z3lz<(pEs5Y?g)VZNwb*DNf zqTsBOI>$4=f3dl9ZRHDTeKm<1*Tmf*OF@?6I#o~3yH6gcCkS+MBz)vk)+I>C#b5iA z#SygwP{=&2k&*^4$eIz<4{=%YSE6t4u${x3PUB`iCVmoqB8(swwB}99M!?(c7T!Oy zd%dvGub5`B6JY7dd)Z!a^+ff0Vne$nE40Ocv%-pF{Ho!L?YMii*VQL9a2Ihqk2E$_ z@@6TRN8Nm%8W&?yof(%OGqZ?m7s^!obn3grJ*Da&;#hq87{YE0L3dfDGN2L!i^qLc zZ{Ofr&)R*jFiQCGUDT|AC7q%>ptU3fdVvrJ&%vf5u`K=`*`{VCXd=Is8WUbJ5I!4Cw9mu_goK--6rnJT&v)=A zerH5Ll-OeLS*Sh#FkA^mR$Q$>nr&9E1}J05Gkzbq^S}A*CIf13Yc}DKr`wLMZq4V3 z_p*9^q+qSe+YHBhNFBwe(m9z&uA4MFgw1FdP4attIFW%3uV~A`yWydjp~^GASlUzp zM~{e|PDu;nfbg1sk|W@I0$--fQ)xn3oCo|bv#rWiCNJ!l44$MCU51K1ypw9S)TFLV z=ziuKMs30?$A5P^TULX>7;Q|*nmR>O=C?Rfb&5XG>j%!5g2+7|%1r za+#rU5YCHWMZxlk!(XEIMse5&$!jfNV=iZa>folFOP*5vZGIm z8{4zZir;0(^v_y4tnTl@@0*be>KJ@qeu>E?_vI7>x-Fv-KpcYRa~+W!;XpALsuX$N z9jhBgCyo?0Zf0_p#7${E6bcMBNhFuM!=uWq(L^_lU8UTdqDmK$#vnu@C6dmm>K85= zvU#E|`nol-^-~ws;lmhd3}TN0@HZ^z>)_t)v*uTVnN2zb^h5ZREFHZz{f9Fi-8sb@x8o_tnBalH9Sl=r!JvOuQ9LXqK5m zOhI=o9eE8QTy7OQ*08pz2lmM*m)8X7=&gS%>zH~KAgSd#y3rEK68O?j&B8LWgxt}h5lGFF=_~7jo+Szuf-prh(3!R@TKELF->FSajAx4x=AFP#2F zjls_EL0pD*7`z9PO( z1X~nuz99a>I6Z}CEpwh|O8C_et=E5_G`Deg2Es%F4|k}cGH|FOLeMO8!$TpK9NDkG z4?I^aIw@H2kO_(@O}FVXy8af3*Hb)yGLG8vdH027QJ#84M0@}_Jit!b(k|!1{1PF{ z_?+Eoyv!?x;jrrg7pY;-09v$2eC+r*SFt4QJNk&~<}UU+zv-6G$6i&l>QC|%Q^{#1 zfeOXvWc0lgvhhTt4$$Lunn~-FZaEV6L)xi^^p&;r{Ofqi`!Se|=(y5f_2Y8Je96nQ zjW+#F6lse6f^njYPI}6y7adsjzeXc56k#UGL~Xtm^CG= z_i&NMVw?-^CNw`2DlE&ontIPKJIIx$CKi^LKspAdCjAA?-Bc&2 z**fOiMC&t&G05$(1J~UTjvpvFd@pWN*~^6b6L|k52t@xYOW5mhTRx*6!5615+=bu4 z4|dLw*0Z3ps|#AIK%*|2mX==?i$>)4-97GPi`j5lD(8+5DGwhh!));FAjyR66E zWW7@*yjw-v6xL2t*FO>W;)Zos&93y|8)=*z6q!6_mr0pvP8%+L!dE%?nFRPkgGT23 zU#lL>`G?D~WoeOv4{E1`_PSsH5}gpsgf0-9a_hTB)}CFVK*ayaeh456-3+ya*tC*q zGu3k>Q#~eTj;D;N^{8;@{bFz|+~j)-MH7C8%@CCD; zeQ1$7U69$u`xTw)6tTj+%tkis-<68g3kqFaH0wMJ&*#9u*mOt@X@0_6&cV4oQWA=; z-=!;8gm9Lu!HFda;p40pdDDcUDo=P>@#^1XjM5CXi z7i<`(sp5>&d{6rgo^jqtXCX%TxPGWW4HoR4O!M4gZ@=5v%h7nfI#tJ_;GtrU2F`q# zeT1Zt!S{=9RmM_#q?IK9J*+UvsTSY*qel|fFP={zTbgQ~EOl7yCG3>^q9vEZX3>xg ztjWMSG?ns&KVmm(X~UhrU*K8sMNLOC*vJgS9h4P>Ui&xu!GW1U=3nbklape@u(=Vd z)|sYlJFcQ06CL_z*e8>p>O1w0kx!Le{E|Z6pblV>GselmJ%cr>>BOE?qRd#d*eE{2 zdLd2ers{y~-J?liwu+LdK`(U}i&7U$k3fG% zmF%O$pYl)G_tiGCTfoKTA2;Jidsq_o)IUg>DqQH+!om3a~2 z@LrbfreG`Ad@ij-ku?u=cpabn&m?@p07%eA(?+ zMZZ^%YBFQ(=@)}`R- zLM!<*<(cP29A1M*ES{K+{DKjvOhj_`$STQt2eo3%HgXX5INLmRM`Im*6c1(}Kfb)+ zEX(A3V^-!?*5A;!Se%%W=lzRNse?GG^;c|c9qB&Xw%GeI_W>G2;bGp(y^a8cF*g_hKl2`=586R0pOZcfd_*c&WAJ6V#*SdX_9x2 zi%e;)PpR7m@?jzGUeuOtwr&*(>K?vWs>Kpj5SrTfg&aMfaYfU%jvlFS(V$Z4(`^5O zr*Yr5{``Z0NoS#^WlE|T?pCDG+Pf!S6N3>O^7XpeNyVPZf%am95#>x+_NrWBSjr+K?+fesW`mahd zz8PgPX=NDJ!ahxVPY=Z~5L|$0Ss_}*DY$ZywG(C!H z$h4+Tf{pEyYUE7QQ$|*Xay-9#jh{1UPLC?Lt2@j(9h@SfDFuWw_mtmWOpf>PKEl6;zA!18V&Au%$fSXIX+floZUmF=Lf(wd)_LX%-+7fa)U$a@vJOS zhLNPAJiA!l)$l0;_;=lcaFjmIV5x=oqrJ!G`wy2HYOYSdJ}xb&(e3-zwsgX3nod|k z%Yuy?Ha<%xs~gJxA#672m=IIg$+yxTWdxqKF$&)!_V)V z_}k2CHCbL#Drt5vyWDRJ5Kz6$M9iw53Gm-knU9?do-^o8U%oos$@6p=-H#bgA=Yy# z2|X0BeB$L{Z`^-Mq(0Zmvk8a3nanbsB3__*7mhh1!t>b2dz(*q5_;c*MDqUl&7Cl7 zu7tV0qi}L%OD*~CxfF;$3BAv>G{}TeuTCIz%|s7OrSY_E>OiB|3I&Squ1(_qW*^P)&^^oSi*^?~#rOPg@wkK{IqR?{5JD zRmy`v2@4=J(Cy!U>HoR_)c@;R`oAszUlKY9gl^&C26X_8CLRud#zgz?nE&1l825kB zpCSI&IRCc%x0&?6!XJ+I8v(O}0wM$f`+v)zqQ}et;>W+H%G`{8O_Gs z!_pCu0q*{1vH$8p2Ed2mTW4?Sztcnqk=!b7w*eqQxI4`KR=@}d2w(y@Ccwec6d-D# z&+#8%0UC5N5^R8>0qYE+cK7i3(*=-kZ_5sJ0vL!67~bku0O(f#kL?ey1#CWlEPww2 zeL&a%iUITj$OcdcpbS9GKd1+I2Y_w>O#nIpv;e3E@D{+Wt`)!lfIa}X_PKws2=H+L z9|24Om<6y5;8ypq?Y8ah^(KH1044ym1CRs&cK5Kl-IrUsod-973na_~3h+Y&{0|32 z5YzwMXCOBIv*)+QKh$sM=moDKnpI^9~VoDsZG7Z*o3ubm#!34XhxU?(U7 z_<9cl-D-5zwPXP?82FHXJL;_$APC<-^j8oS;`=M`D~SBZblXCVUta7#ivLgH{{Wsj BLdyUE literal 0 HcmV?d00001 diff --git a/demos/codelab/completed/finish/styles/index.css b/demos/codelab/completed/finish/styles/index.css new file mode 100644 index 000000000..0ef8f3bfc --- /dev/null +++ b/demos/codelab/completed/finish/styles/index.css @@ -0,0 +1,75 @@ +main { + width: 400px; + position: relative; + margin: 0 auto; + overflow:hidden; + height: 600px; +} + +header { + background-color: green; + width: 100%; +} + +h1 { + width: 400px; + position: relative; + margin: 0 auto; + color: #fff; + font-size: 1.8em; + line-height: 2.4em; +} + +.mode-edit, +.mode-maker, +.mode-blockly { + display: none; +} + +[mode="maker"] .mode-maker, +[mode="edit"] .mode-edit, +[mode="blockly"] .mode-blockly { + display: block; +} + +.blockly-editor { + position: absolute; + top: 64px; + left: -400px; + transition: left .4s; + height: 460px; + width: 400px; + background-color: #eee; +} + +[mode="blockly"] .blockly-editor { + left: 0; +} + +.maker { + display: flex; + flex-flow: column; + justify-content: space-between; + height: 460px; + width: 400px; +} + +.maker > div { + display: flex; + justify-content: space-between; +} + +.button { + width: 120px; + height: 140px; + color: #fff; + font-size: 3em; + text-align: center; + vertical-align: middle; + line-height: 140px; +} + +.mdl-button { + margin: 1em 0; + float: right; +}