From f47e1a4cc2223c4a23c8ef26e89d2c14dc371ce6 Mon Sep 17 00:00:00 2001 From: Matei Adriel Date: Thu, 25 Jul 2019 22:59:52 +0300 Subject: [PATCH] favicon --- README.md | 6 ++ docs/controls.md | 93 ------------------ docs/import.md | 13 --- docs/url.md | 13 --- package-lock.json | 44 +++++++++ package.json | 2 + src/assets/favicon.ico | Bin 0 -> 18729 bytes src/index.html | 22 +---- src/modules/core/components/App.tsx | 6 +- src/modules/core/components/Head.tsx | 32 ++++++ .../simulationRenderer/helpers/scaleCanvas.ts | 2 +- src/modules/splash/classes/Splash.scss | 2 +- webpack.config.js | 8 +- 13 files changed, 97 insertions(+), 146 deletions(-) delete mode 100644 docs/controls.md delete mode 100644 docs/import.md delete mode 100644 docs/url.md create mode 100644 src/assets/favicon.ico create mode 100644 src/modules/core/components/Head.tsx diff --git a/README.md b/README.md index 298323b..0d1b2e0 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,17 @@ This is a logic gate simulator made for infoeducatie 2019. +Many thanks to [Canara](http://canana.xyz/) for the logo! + ## Getting started Check out the [demo](https://mateiadrielrafael.github.io/logicGateSimulator/) Or read the [docs](./docs/main.md) (work in progess) +I've also made a [trello board](https://trello.com/b/LW3XSnGN/logic-gate-simulator) and a [discord-serber]() + +// TODO: make the server + ## Features - Simple & intuitive UI diff --git a/docs/controls.md b/docs/controls.md deleted file mode 100644 index b815ce9..0000000 --- a/docs/controls.md +++ /dev/null @@ -1,93 +0,0 @@ -# Controls - -## Moving around - -- To move around, just click anywhere in the enviroment, drag in the oposite of the direction you want to moe in. -- Release when you finished the desired movement. - -## Zooming - -- To zoom in, scroll upwards. -- To zoom out, scroll downwards. -- The zoom will be applied in the position pointed by the mouse. - -## Moving a component - -- To move a component, left click on it. -- The gate will follow your mouse -- Release when the gate got in the desired position - -## Deleting a component - -- To remove a component, right click on it. - -## Connection 2 pins - -- To connect 2 pins, first click on one of them. -- Click on the other pin - -> Note: You cannot connect 2 pins of the same type. - -## Deleting a wire - -- To delete a wire, click on it - -## Opening the command palette - -- To open the command palette, press ctrl + shift + p - -## Creating a simulation - -- To create a simulation, click the first button from the top of the sidebar, then type the desired name. - -## Saving a simulation - -- To save a simulation, follow one of the following actions: - 1. Press ctrl + s - 2. Open the command palette and type save, then press enter - 3. Click on the 'simulation' button, then click 'save' - -## Opening a simulation - -- To open a simulation, click 'open simulation', then click the name of the simulation - -## Deleting a simulation - -- To delete a simulation, click 'open simulation', and then click the 'delete' icon on the row of your desired simulation. - -## Rewind to the latest save (undo) - -- To rewind to the latest save, follow one of the following actions: - 1. Press ctrl + z - 2. Click 'simulation' and then click 'undo' - -## Downloading a simulation - -- To download a simulation, follow one of the following actions: - 1. Click 'simulation' and then type 'download' - 2. Open the command palette, type 'download' and then press enter - -> Note: You can also type 'download --save' or 'download -s' in the command palette to also save the simulation before downloading it - -## Deleting a simulation - -- To delete a simulation, press 'simulation' and then press 'delete' -- Press 'yes' - -## Refreshing the enviroment - -- To refresh the enviroment (reload all components), follow one of the following actions: - 1. Click 'simulation' and then click 'refresh' - 2. Press sfhit + delete - -> Note: this won't refresh the whole window. To refresh the whole window, use the ui built in your browser - -> Note 2: this can be useful if you just edited a custom logic gate and you want to see the changes without refreshing the whole window - -## Clearing a simulation - -> Note: cleaning = deleting all logic gates wich are not connected to anything - -- To clear a simulation follow one of the following actions: - 1. Click 'simulation'and then click 'clean' - 2. Press shift + delete diff --git a/docs/import.md b/docs/import.md deleted file mode 100644 index ccdd87b..0000000 --- a/docs/import.md +++ /dev/null @@ -1,13 +0,0 @@ -# importing a logic gate - -## Opening the import palette - -- To open the import palette, follow one of the following actions: - -1. Press ctrl + g -2. Press 'custom gates' and then press 'import new gate' - -## Importing a logic gate - -- Open the import palette -- Type a valid command (see **[the url parser](./url.md)**) diff --git a/docs/url.md b/docs/url.md deleted file mode 100644 index dac88a2..0000000 --- a/docs/url.md +++ /dev/null @@ -1,13 +0,0 @@ -# The url parser - -If the first word is 'gist', the parser will automatcally try to fetch the github gist with the id equl to the second word: - -**_Eg_**: - -``` -gist 8886faa6f99a7d2667ea8aa2f81ace04 -``` - -![example of a gist id](./assets/gist_url.png) - -Else, the parser will just try to fetch directly from the full string diff --git a/package-lock.json b/package-lock.json index 430a299..fac7031 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1647,6 +1647,15 @@ "csstype": "^2.2.0" } }, + "@types/react-helmet": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@types/react-helmet/-/react-helmet-5.0.8.tgz", + "integrity": "sha512-ZTr12eDAYI0yUiMx1K82EHqRYa8J1BOOLus+0gL+AkksUiIPwLE0wLiXa9FNqD8r9GXAi+yRPZImkRh1JNlTkQ==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/react-router": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.0.3.tgz", @@ -4057,6 +4066,11 @@ } } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -8532,6 +8546,22 @@ "scheduler": "^0.13.6" } }, + "react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "react-helmet": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz", + "integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==", + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.5.4", + "react-fast-compare": "^2.0.2", + "react-side-effect": "^1.1.0" + } + }, "react-is": { "version": "16.8.6", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", @@ -8588,6 +8618,15 @@ "tiny-warning": "^1.0.0" } }, + "react-side-effect": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.1.5.tgz", + "integrity": "sha512-Z2ZJE4p/jIfvUpiUMRydEVpQRf2f8GMHczT6qLcARmX7QRb28JDBTpnM2g/i5y/p7ZDEXYGHWg0RbhikE+hJRw==", + "requires": { + "exenv": "^1.2.1", + "shallowequal": "^1.0.1" + } + }, "react-toastify": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.3.2.tgz", @@ -9297,6 +9336,11 @@ } } }, + "shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", diff --git a/package.json b/package.json index 2f0b86d..47bbd33 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@types/deepmerge": "^2.2.0", "@types/gh-pages": "^2.0.0", "@types/mainloop.js": "^1.0.5", + "@types/react-helmet": "^5.0.8", "@types/react-router-dom": "^4.3.4", "babel-loader": "^8.0.6", "babel-plugin-transform-runtime": "^6.23.0", @@ -49,6 +50,7 @@ "react": "^16.8.6", "react-custom-scrollbars": "^4.2.1", "react-dom": "^16.8.6", + "react-helmet": "^5.2.1", "react-router-dom": "^5.0.1", "react-toastify": "^5.3.2", "rxjs": "^6.5.2", diff --git a/src/assets/favicon.ico b/src/assets/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df4658aa2bfae471bc0012298fdafa0a495b30a0 GIT binary patch literal 18729 zcmeIa^;^_m)HVtjfJh1q-Kd~4q#z;P-HI@PbT^DN(v7GLAtB8m-7u7r64DJK-8iIx zz`Muq^SuAS`RQEeaE+IHuf6uY*Sgo*F`t-74K;bfJ2ZE&u&@Xf6=bxqux`Szux_;A z-2jq1ZYilzb8*^J* zOM81u2L~%hM;m8nTUS?mcXvlmPiHvX#oOD}$H&dr*WJ(0!{6T{AOIc|^d>miCnUr> zG}JFV+&?lhASx;le4?X+Vq)IL#s49;qTu^eEb-hloW+PL?THp=^S_t#X1<5zrUI+N?`vL8Er#8U`l^LC})c$J=?xKrXu)}E1_ zn7F=ChOYSEsED2FgQ?+toWD%4uSrn#E>?#{Dl{1lA}BGgFz7~yG9EJW16#*kB_`P8 zVyIpiDc{3Dctwxem%Gds3ApIjQPYOh5R{V>%t9M9)NjsE}m!gvhWbWQ3fsRKB8gRYish2?MuM!B2u-Vi-<*8)8GV z)X7t6A`dS7>E>ZhOqOBtw-W%(T4hxCAi%uk- zUV>oXqgY}m{+frwrXm`F=W z0)gL?BuvU}$_ndZG2D`C3yFbK2Rriwh2T@76T|E)f&=l%(TOq66`_InWaz{Y=Zf$^ zd=fNolygO7AU+YAH^jaoCIp`V%^T=k5f_M$j~)qk#>d9KN3^s`_KWNe&VBNZXc8`F zW|OZHD0fn>&&(!L5~ylYE@l>!9ab0~!i1E2Lf|u3Vbfy3xKPQmfXENEb)+Mr5gDOu+60SmO`Cv7;w4* z?{^UV8d15avbz)y`I=YJgJ_gxgyt&0C*?kl!k8GwYHUm4g-YOJGO;Ch1Ax}7##{GX zfMA2!WQ)uJNa|%;#@Hs{%tk};fkm>P&{Fj#RM^_VRLh~xk~jx>-lSawn{Ul;s*Gnx zL%!ZB>On+xQbKbHx|mHkDfB`A?}H*u7WI#Nj59d^32@?n>e^VkN})G$jB|V1n5EtEdVlPHW9@a06;=AEq_R@ z0g!W)FPfzv__j!Owj`YZfZD`xx|*>7P!MD#+U*yx7Dv4YGWj+d09}!AJKmxMW}{e) zKizo*Q-HwbTI$Jl0MPF^Uzdlu07&B&PFIREpkGq92crKr5_J2>Y)psG4zzV5d|g-* zFiIQ;osry2q3)8MJrKy-2#gY|F&!Q=P#OygskigN_r4l_Q1)vsqdf`$rvYVSdEpq>40r2OeS}#Fy6*68AtJA3jIvRcPeQ>;V!dr z6c47L!fbq}f*PX(B;1%nKaiADVRTrG5BM+z6&7RHDhNggNO&=YejusDg!V40@c|E} zpu%eGT0w!)0TOOZp&v-f$w2`}qQ%_mA@JvBkZ*6l8lVX8=2_y$6yOiZ-2-;kN5CH@ zrWNI=w8w`mI8_ucG!VU}nVav&8ID3!C+FJ@#bz}FnJCvG&(Vu zwkv&swixqPdJz5}F;i&6rZgvK1U`&~g?@cDQt%yP)omu@QXP!RG(o-%Iz|A>8t-6L z$^w%NJpAjLFHsw9H_&EhEV`Wp(GY&Tvk`4gj1u`lUU4cIZ-_hfj8I<{wUKZ`wf!J3 zClLeM#cVu-#28N~)1pI$0gv=8!Z6JLfitW9Z+A42z!3jqV^lW=Qg8XN6SF>8m*=lX zuVWys34cIZF$Vn7!6#f5gtG9^3)P=aH!ONFMMn9((rbUD%onkYQpWpd*MH4}n+`Y@28d@4%Pba=sYq23V zLtlC6>rD!J5vv{J${~CEAo1w0OYCX|#!n|R=8YRmlbuaGH?OK{2A~yPD#3@H#=y#o zXEXEg<2H*gcbi&{7RN8ggHf-hcb}jFPmO&6t%$|+9n>3lH>FP4`=Ye?g`H0uH*S3? zI$PoZD{@wPfL~o@?j1oBo7MTrHYf99uGB7V)J7JI=z~{K1i`$`iJkY^s$N@Pau}EK z-wpuBP4Do$xybdY4SLhE@bqJ93KRx%3xDWW*Lzvr3Y+Lhw2}+DS`Pft@xW#&x5neS zp}eHtqztE9Ug|~f`XG$x?Bz(NPx~#k@Dhu}&DF^!Q=>hH*Dde}2qpBF(6q1N^r-8e zQ2^@A7bw}=+iTGm7#y_UrQ<++%?Cjbuid7WI6q{`Wjx4h8U(ZyBrDJUc2!Shp4HwF-h zKR=%GSVO}#;}_z}wlfEvE+7#q?5~drDPC7o>a}k6&5V`%x`34^+NgWqsrV+V*LM19 z7q+gFbbTy@Uh0Kg%Q4d*pP^~h`D=JS)KRS}395#%LG=QfgGv?|oFgcHposiv=}ZF^ z4lG~U`9}ZI@Y~!1_cUUxa5cIQr1a|_3!^V}U)>lGogOtU&s98I;s)t#H~9Q<@es}S zU|4f8HxhB*nF=Zl=Uy@qSag*2T7xlc1il!~T8(bP0DMQt6E^DdFN{f>xm7(oTLQZ+ zM0)UP@C^O;R`yrx3doc{&!QppLSy@X1gvCP*I=|WH2FMz5Pgu7ol*NgaOQkU?~JPN z?%W;y;Ohbwz-Uq*Lsvz?PPI=$*aB0&}m|c&{F!j9rt-B4B#9!~}bR8nZ1xJ4DOQPfsv^iQIZ%Nwg%3 zOW-l(lVu=@-B`{3b*WV-r6S0*$M1iEOTmoH=JiNlsnY_kIL zGyG#5g#MwG<0ivX=`dse%d-m4jF;9enE_q2MI{RCQ?e5c+ zbXnboV_DqV*A-A>r7n>7!gOMKx@{@);llOfTJ)VrbJPaYXDLH>^lR^$IA!j4P~-2I z*|y~e(-CW{p!E>7gm|@lh=Ppdxyp-fE)8GOz&NuEqO^+uA5yx5lU6!-zh8SF8-_RX zYJ$F)sTH-mphMA?*7@D42Famhu_POgJ1*ppyc4MZh(f%J_V6H22IOYZ814d>*1PR} z_nt@D-cg!pFh7v)&c<$x6fYJgP0M6D`VdR#Y_nia)M}z*UjAe;s)N?4g**<-ukq=E zTUoBkx{kMUQlr#=!H0u_yw>edo)x#X%ZgvM$u#+L&_ExwU{06 zjWeP|&c`fgU?KRL_v5_Pde^PHr=0dDzlwiHoo_Ealz|e8JNdj8IcM~(JbsRc*TGWy z#%j3jV}^!hS=_IA<96EDqRn~N!{+OvN>&TnnftCWj%SI2Fww`b!Synui-DSyR2Yk6 z&#;lIDV688!nf66IU~?sd2>Y$`XenuQIc4vu? zFdaPwU}Et{#RCTxdd7_H$!N{H^vD{al_&^3RzcW8-<4tO92-A%sP$G!*pG_BB&bJs z-{$YjM32kxHF%y=TpQ}hjkD}^v{VKhT|qZDq+x`u1`<4I1|lRx!Ax!%!|aqwY; z7iUFy*|S~jCX^kU^Q73{S5(6X>^`VJFHoNzAoR6oZag2xB|%XWJ4tGF$};(&Hi|`R z@_1+_VotCe6}sEL5pKbgpef6pecCcbPR|^qd?btoZ%UmQ+}Mh<BgmNlL$`gRo1 zvg||*FLjDqd=@~-pSr3%0Y_KDUylA}dsCPhId(QQ`W@ zW9uaFFk01-bZ2%&}nh%RgqNLwmj)$uzA2gkZA1qZqw3H;oD0Ng;7F(@;@{ipx-FSk!q8>_S!8qhI3?6-Qh@E=TpUtt(OS}&Kr_|t zw9J&;O8(_iXJ5l`{%!N@Cej*QxN7?n#Z@ED1#t2e!T2_j;_Xao@e)u9xQF` zDEI9p!HkYe6Z`nJ4YANtqwe4D)OK>@&ZT7~XcHN~+Owzol>Svm}lO6D3h{txU9CLWq z?2Rcgqz!{`FJ#=Lek&4@MiU|`-|7yot3k82BI5SSN;`V6j1PiA1 zQ$j6cLW|2UE@lGz)zZy;vUstz`HK4gKW-1n@EPCi^{yod|P(pjx| zaeQ2t%WrgG zXFS%Ohfj+fb>5s{aF)u^%z46K$3jkdg0X4i;pK5OpWp1kVBe+Bb9ybGwlgC?TmG^1 zkIl}8(-80$?@OSsQ25bye22Q zPeXd_lR!7mg5bHwbu)SbVb+GIjYYOpKLh)3trVA6mHlWY-jP-1PJ?Du7sKjzCaV`tLGMndRQc&?UA7oMyv zYR?q`NeGLZx!)Sme_%U^d#U5~=Tc?6u6asyl6eDqBB(iQ*pq2?q|%LmQus4k%B zN^rc>;|IDw^$=-bw}D;Hmsp*TI{e91zs2?^%O)}HJ1_t9r96j|%?*buhfBdpCBt`K zdkLpFCNW?4i8Nk@-Diin^MC)-^vl7WVN+b_R4+jCa**!%#~3P#W(euV^t)F0W;NTf z)2lZ-U(#HX(@(ItP$qA)*AF=R+y2BLYOkw3->i-=f3wt<155YzAy(0yt5=0z@2a?> zHWcc)YrZ70W%>y{ow*T5Fa9BhYJhTbss%)qW@#|!6)Nm@xSFm4958lQ0b5^o<{d1eBPOWYFr?;X2!fupDGE z6iMAkq=Pz$Uww0Or;>83S~>~rKKBVSWU$7upj?<9RzMjV(TW)pADPC9Q2(Ufyxp{& zou#V!xnC#e7gZ$0?_EZ4z+VFT$Sj>{2InoSU|0UO<9n*vUog##P={-}rR^z#*5AzH z-mw}}QTH|Vki*U@F$lfwl}+PK>yVtvlR%?dQwf)6jH7q8mHJw=X~tVDp^InMOZ!O@WQ!73}3SF98GSc$*8)Te<``TOAdr`}r| z#e<&=5;^=zeUri^!i1d~s14GxoX~-!HYb6uEfZ#e5x;IGdZ!CL zmNXJ+{oIQ6(B`>(bStL-iN$i>xbPdtCiY%!pEkQow1myGjCsQCr9KH1x!=%n^kxzp z6daV+)CoxAHuqEYs0;PJag#vLac+HTt-ZM0GiK$dfPhz!(tStIu#VeO(SfmArjv40 zjQnK0PLAYnsF`PGBgeVxqXBc5UcxWB>Ya$Qrt#D)oW!(B!rE<6)dtrm=6c?u!h-%^z=T|KRXf%gqL19O~jNWABScd1E1VYZ2 zu?i|3|7Lp=2Gzlz@xrfr6n(H}y}rd4#gt$pCrRMZ2oHKbC($O=c~9X?F9Yl5Jc4!%3$t&{K>ADOyk z>C#a2RPww-PN1UU!`+@N5xYqTb-16B=kn+(dMo#%krSef=*p~R^H+N(fdZFuZN+y5 zpX%1Ey@^2l5LTL4wI>!b3pdhv?Rns~iZnPB?dW5rXFois!Ts%xrDJ~Jb`J>Wy89G` zPW4@DaOZ}ca75G6grL$59=UKA`0_?coF<-YHLm?;9oB-X|Kno)+BFW?(PyISSg0Q(BbVo%rZR4Mmy*j;Ae8Wv$f{&Hc-FTEs zx6FRPjUH&h4DSKVf#TO&n!rYQdPQ>+jnOL0Fg`0@%S1l7BVD8md%hD%v=hfgkn?h=+uFL%E zd`sM@p-sY%gOu!u7r%1Zg7c2!f5OkLfzKMmnCiJWWnO#lER)S2)C`)UJ`HY^-+WXd zW}i0Q={*qH8*g^Fh8)zGNiR!3g|K1jLROC-u*uL265$t`- zKCKGgP;i4R$ipx1DTB9UdVV*muwK8dwjm1fEwG7N-hM+FeZW7qW6K%0K~e5dy0ltD zBu}1SdsKq6V2YzzUl5s`^`H7J`ZyuOYTQp<)%T?%Mow*ZfqL8$doAtbs^*hG!b|n6 z`%X>wcogx7TdJ2kJI$c+?%dftUQ=fVq()_O$w^Je9~Ic`Uy8tvO#6f)_u0durnQcm4&sQMY*w3CA36mD^2kVqRDza-)R$gF^C%ZUE7>yoz_?< z$?ZCxuD!`lX!sa3!q())X~?SW%etp8fs+jdzBAbX;|jg2l1 z8j57?x1Zt}Z%w}g$PhHy;QK>2!TnN{@1g1XMY2^%nds0yj;*`=s7uH{h1b4KJ<*}x zCwT}yvK64`iKGMbM>4)>4c05*}O|z$qJ{3I7J#iu!u)XkoYc^g4*XleCSyL8|J;sIJ?TC#4n*g?;rPE{aQvc71=Bk-^h4YV8 zzcT}9rS87$I0h8X5B%Fm@UbTL$4^`1 zLblK8q+x7=6@_7hk7%LlN0(Iw^?ujATTM^20i~jq1k%r~4T!V|Y4vzvYF0;=-Kj=~ z{(oOPn61A$Z|Ru$ea=r+nQik-0hrtir>?SU9|QM2=AvCoqP7Qc@#awZt4!nNrtHhB zo<26&tV3>oE^k&l&$|Zwg#dimd10X4}OgLL@H z)x@2*-`SyGtJC56vAKHIHnc@Uv169nRB7o#!M}i|w%8XX6Dc_P?Zam7;oG0Z5xXp~ z#2p(AY*tSJfs4y*mfC2z;(?sm9jc1_qGuAa_LIb1Fl^fN3mWaVh^Exk8vyq*i#Y1} zdI|&OO(fsP>TmC&rnr{aCDC%6ZSNga2mLu;H$@vgv zvI8st18^6R-s(>t|DP(g>^IW8O4cG;q_eW9nCxG8x0}b0c5*P9)HT`Yn|I&jZceY~ zAg3NLS&XU1J}^=Ex~Ie;qsb&diy{p`!Apj3 zs=O(}_qH(BwWmb$E(OWm(&hb9l@CLyGaVp%U>LI=OVD%D@z;S+$Q`Vj`&|B@f{de zG!~t8rRP6x&wWSna4h|X&3FHCd-SVFIJvH*cP0CJxcvj44qd!=BqfV^*q z_-EmdN3l#M6MU)@T>mW0q`*|$isSxq;Fl!uHt=O%>KCJbd_Aw@2US7-mreh*QevuZ z|F;#DO?qPUKNgjKvipnmEl$8lVtO$08_oKcVZ3Ol{EWVFciTt5&FLR``Wx0VSm)j};z$g4 zrC)5paOX?1vi1)3k!s<{?j)2@WQ5>yN{SR_Jmn5*IPUYW}p z7R#_R`Yf(X4OQ+-x^xS>J__;k*mjD0Y4r|h>$h#JHF(ub^E3wDkp1h1%BVZx;&(3e zh1ZTN6S{c|XiB^Cft}P+Tvm7tTo-!m9<;20BL8_ zRKRmHrg1dA5c%>j0^zUD9~P(?-*`_~z>WbuvR~6h!o6kTm5sC<0C4D1EUMF5K6Q1S zsx_ldf=SOer9^8UnaGP0+X+-L9Hfpdy$x8LPJ|D2DC`))<5jrECa=6wk*{}IVYh!T z5~vVtS3s65NQhh7s>>OCm|?fYCLiM5FLAfDdH4kT2KsABj^1{O94WU=37@iVIrc_0 zBnetFQ41uSW>!f^*bNEP-9@o-?%h}aTT7kb#-U8FUbkkNg?k-!6F`jX`3OfF_cboE zya^=&FfP_G*wSGK?|H2iB0V}vo2%{v3&cjbcVw;NkOuPA2J7e7{Y&rew5d7DYvYjzzPnpfgzSbWX-YMh@(5@bcjAVI7<3{IPVH$VjZeilo05qfGo5enQEYu7vSdL;JJDV^ySte(@&i7ThC&?mdC*2d zxLT@VHjlB*GHME}l*G-P_D+V&ChZ?$kZbvq0(sJQH;aVn5Ap=PE~c!BnP6cRIpi^0 zsAUBY;aouv+)tb0<56&Go`Uw9Dk+ZYgC8=o7y9YVKVMo4!Rr5ftudOap3C^udl?hn zoFdX8aWU+S;l9L{A6r{Et+`Ms{OJB(#Qyn@V`iA#?>R0NrRK_6KR<~?r}Lm05-6)0 ze`+9yyp4LZp(kHlVbi5G8$cZ~7<0x6Gjvi{rPxeZs8&7F6xVwH4wGmG!*HB1QEPS8 z@r|s#rudN!D_bd4%*+swqHO+27rvuC@-KBP^_9b|kedWus1qg9ljRU7&eO<%POhcm?Qul*aji z3i{aCTI4N8QHeQc&TU4p#iC^|~>dWz6 z`CjzbP6#ajw)8^NOO(z6LjoN@Q7hmtm$-~0Th8m@%$hmDT4L{{Cw#2Yl&81-1KIDN ziagUvg>s<3PLrnbw#6Vy2V;ei_ToyBz34 z8p6qQKM68uExOk1nQLfr%ZYQi#J;Pp#$9svLP5qpbRr_S2A0PU8K|qg$69{8OWuFA}cEe}MMYKHOL?jk$XR z`H#AtTw&{~{^t4t2Abp5xFpabwW%T6yj|O;gnv@kh4;taUAX1cDjl$k0rDG*(YK-u z#tdmZYg68M&MO+CR`x9EG-WTq&5m+kQ+19HHKh$778f%sjn-8c6qN!Ls3|a*n{fgy z5|X?3(p+j8ErhVeRfGj+CNed?2VHRobaenGWHYs~ycw+T=L!2a>l2_%W@Pp?f%*qZ+-^4)nL3Z>}b=#l68?2@e8#KeOG#Ei+A3`;jH(^!-z*?o9o=^1CDvn?4if=`9gM_m9qU~uRq4_9P zrh&etrG8MvZ|*$Uwj$oYpE_U{dl?fridepcNyxxw7EcDRvcu{nTify?(IbCW37~9} z*wanaeCPRZ$F7eg1A?XRVKPlym5Qm!a6V@Glb4$D^Nj%ba4|eQ0ukvcU>ewe;K^s{ zzETUQwOvTTOv-t!GDdk;iVe%^Hjj(p6%hWf8Oc3GF9dV2<7RL0b|^0+pxr2S!ZY$c z%P;d4$c5Ou7^9+_dJ0qo%?3VURxoPc@my?Pj_H9HP{b~{Sq)lqe8_P&zkBgb^qTre zBwE|Tr#Fv4aKPZMUd}gkOi*V52d6v!w?5S{T3}Ws`@Xs)k_LSLp2*d}4!QWg74KIXA7vMZm0$s7GtRtc9wsF?lx zP1Wg>oPG=|4#tZe>9NjF)6R3Zpbve(kZVh*Y zApwu;oYifV>}j_Z}6^P>5gkRP=yuUX3Qs& z+di#Y`$Td6B4srW*jNHdB@UGSk(kNFb4>OgwJU#yi5Wh$I^3;Fo+J9kfH19VE$#}2 zR1`nfUP-ga}8>7>o&&zaTSo|^3o^G{^pEp7? zl4gIhv8<}~7{kLLCBHym;+onBC6rNMc4rv(QCg!NlPBC7-Aj-F`!N_OyugTWIIt(kc*+D%QaMdus z6{c!0&dC5mYb_>aQztAKuA}wM`+a|I(6qj+&f*l~WcOWJvP?{`2mVq!WwA77(QYW*PUyN!%f)XM_m zv@a^a51UM1+YGE*_H_jsGsl`an3IOfy^sHnDc~XiIa6JCI(6=An&EU9^U%7g7AN5E z_Y4;K9EvW4b>x`rvrjJK8Bl%_Tox6lsV`fI1NKzYH|o z^R$e=W258cc#B1VRk`b*wLAs#4^3(huR6!pw^YGlO~Fo_lNKOt5K1toI|d4YH2Ha4 z5&j_-q>jTWW)V#inaApN!rj;y_~Pt4y3U{@jEN^A>=OfX!CsN(`BJAZcm$^7BxeMZ z7qO$PD`R2;=gqd(I$j2$?3=r6t00Y)XQfqXnBEUY#~QR2hRFHt4IeN_G5H`Tu=tt#V;53j>dc0ilx2LQ zw%qD_rVrpSc>Wh*h~c|d8&(_^v(|JPss--r4X0}|(>RK|l3{vyPB#!uA92kg;biXW z>0kNB7#7)p7w)Ku73?nW;dCwz5fjgwV*^63xsB)kVY$I(BknqSj4rElrnAj&k|Tpo zSOw8iE$(!Kwm8^DmMvZnqVGIVTrY{m-u~(LLlfofJ%-lg!&5l^ETTJ-IZ4=>)UxGM z4Q>M_LFrMHl=s|WXTrZO!{#&brgbmg6~md0g$I-PBLigwy_=&rQ)SW-UvKYKUiQ4i zAXSLx*xY1G-rFVncrY@Vv8R4h&A8JPq|T3yVv{Bu-uwF0Q7AlR+_ndccDb#l} z`x#b|Hw4y|LDT6ZB`6LlRL)xy@RQ z4;BIK@}-!#LY#=&BKFd-XLL9@q`+y-Wkm=>Ed9@+4>;y6htD@_d16QCn;D}zTb41i zvZi~~gNnOmHjO$!?{h95D$S)QavPB0UCUn_SPElZ&ehI&NC}nqnLU46TGm{>xo_R5 zpQRw|{?rm1?{oqXG|Lnn+LBC_amGb~Jt|oH92#OvtI16M|nUB|weqbpM12KMZfRO;=_o6;(-6O}9(zyhZH z1Cp^IJ3A(88xxRKs#>6t#AdA3+b<1f)z|3V;R(N&e&OF))BQ_5??H>q*H~da5ODc7 z?6yy7?@%hdJ$ucu>-}Xq@j2TdJQBjy+QX{K!#@!m&6iOjGUl;~TkKJN`ZA!I*#F;9 z)AXvm;OVI7G`aVCiglY0ik-_Z6a$KkL96dOvjx$4Yl1EQ@6NwE0|b|++Xq(}W+~9* z!2I6lbp^CL=bcYBBTsW@kKUK2`+5Z^vhx{($jY{i%ul@-HRi{^|MUITvHr2Bu#uw9t^6Nr3+%KtV{$SduP)jNAar;SDWNNUp>?VD*2#jYSkxF}%5a8PJm0jsM{m%So0#$g{_AMt>zSCUFn>p9*SrH5^8tt- zZ3}3d1exOc>qEB}?dpN)yxz94&fVqB@EZ;PnwX8bDw=fOKhCh8n$@|p>=5b!9B&0V zI-Hjyt12ergs!AuniboGzrk#(h#o}#hB`vg$4h?D4a86%Tm&; ziUW4X8=IBIIM(H$?z<`7(qYeJbd|gL(_FWM;A|w^H*!*<@o#qTPwS8WQy-UTbbeWv zlM4TJ;Fu|$Q5HQCyHB%NsuCMBT#UJFaKvo~5*b9%JHsXht=Djy)>doF@KbN$wO zM$kwX*mYzU5H>YOJ=d@Gz6H%04f5+qq`BB8^5N0${z&_wyOt4Vjqn=0N+#W$J*&+5 zE_a$(XeM^6X!Wk_A_y)iNXj>q*oYz3VXwtL5kUQtUO zWI)b>Ymgv`wjE97b9?`k!hEp!$n75731aH^n+QBUgQ(iwMLq&!YRW68wsG&QwGm)@ z`%mO{CCq@BPuEd|75 zdyv+NYkw(z{GPDflARd|^@=k$V*|YD`0U_lzwaE&BiKxQ_Ys(?mELR)UVAKp;EOcj z&B|Mt-v?UmO^;1D>x3+yAGB0|*}-7#{S_ccR#I)I^MkapkFfJe1CL@Vyk6Y{FBd4; z;A|}QKNL~M$PPXA+!!+kN(&aaZI_XbMERJwtpBda7e{#~oFqF!HWR~3z_?vAmYE#; zYx2gbKjRBFUBP>ID}67liVc^JZRh4Uh(_2M?J#hsm!)^G8Ro$I3u+Z*icvBBV3p); zmmf?JO}WmJ{uIWriQ4%m>Q(mqeq^%M8A;?!Gr}$y3_7bEqasOM<_<}sERS7if(Og_9q2S)Z^jq96j~`FJ)&)(dcWs{d;?P zZL&Ahm>fxq-x1Iq8p$X6bu(AlG;BFEuy^AIH0H@-SJ%p{EPZ!s%)>T!&~^Hg)6m0& z(XSWwzedih@>!zF>A_wpw@&-T#I+v%)U3YRe?&%x8N4j%+Zz?w`*_<%la_e&qnQ{8 zTK}Lp7t)`*D|Vp&*H^;L%6?2jeWR=^dQe}JC;jnOUCj4N%!!UcP_>0>vef}T;V%%%Doxw>kx#wun`f}{hM^)s*Jtg2!gP%{=Gp*U3QA31b zW4*{ET=w$=-PO77lR@ukr&WOo0@ zQRm@OWwdq>$PBHi)8jCAQLa)|UseN}j4_YL)o^ALr9THO=LlA#fGb(!TC9bGEdw|} z_~3kX*6Ts>I;6DBm&;pgto?*w@D|u5l{wZk8RXx5_F8i(vi~eO6HWpG$g#OI`o4$E za;;ad$lj*rD!1qs;wxA)^1dAY__3y&+MX70{>({z7|*l$h-C<5Jl&sj&bJvsdHS~) zovGU{t;MB4W^_h=^E$QCDZox`INj4Q&LyA0^2G;lQd7wf)*9bF%jnKS%(6r446_K^ z(gH!$UDn`c?1hkuCtvL8Hggd2w1MK_t>Ckzk*hRZNl|yf)5QTnKl2CmJ4>2Fz$2mB z>%DiI5h*@Lj>e4Rq_tzmoIAk%Igu&2?SVo6$Y`u@nu}F?aHD@HSnQ*T3q zT3c(iO-36c{U_+&Lfg9uu$TLWCyFm>GC2q40~%KMIQO!|t#R7Z@Id6z8*rap^nk%a z-&2o6^h|A;xsAy9PLMngST~lY&n8O{#KiyENJkSZtAfl0cb`|%B{!gcUkxkm~!6zF?@DBEhvR@prr{{CjD`^h zZ)`q0WNEwRA3jp<>pRuc%P1>txhSu4)7W5VR{Lb#($*RQe385@Zd03u1K#Gw4vwtP zf0b7cgzYZ^CPXC#SfU{~x6R7ki(a?`W|?ly4}XjX@3T{}y*5K^b%Hb@kaPZ4NTk^X z`bwf$OBmi^O3%e@wX$9hcM+W7{1RiWi4+7q+=oqdGLu0xu?L20qQIN<$z98mjRvxq zb8!xu$!OqpJaDodyjb-FyclduW2?R#f6fnH6;HmOEjaU5u7d!3lz&ITN?IDQX!GHx z-H>J#xRiP}LS^XAlk*HM)yDs=)wbGH;yq}OWGorZ=YIq`_qYsqCgp=ULB_+?_+qpk zB*N=XS%?n}6<7gc>Nj3%vI3hTi6BNQww5RoZWm_57+YIVK>rDrBVXeOrY8%LaD@px z1BKr%(3xsWkQw)$e(kK!#}rEaVww6`KpQtH7r1jNjF&w0SCJKWGy=hZbDwR;of>ax z6$ks?ov-Xv9eory_iv(_9x`<(i{o?&JIdmQ!l`B2UdTCVnnWN-*eCM+}@JG=wA6K9UZtMTxIXvVSj<5xsRBTOC9%542`esY1k=p`D`_itxq2BcANiLZAryy&U<3D8UUq;8P~uC&o` zba=>Tg2rDFkk(W>o(GH`BttqK(E+M4R9v-LvG5|f_bg!#T$wwRJ!nXH3SOO;O32O@sVCO6Sq#aYr}>;(6jU|ZmuDczwAK_wIH z3m&Vv|1U$lX;NryGGU6D>#YV-=>2KMl - - Logic gate simulator - - - - - - - + { return ( <> + + + @@ -25,7 +29,7 @@ const App = () => { - + { + return ( + + Logic gate simulator + + + + + + + + + + ) +} + +export default Head diff --git a/src/modules/simulationRenderer/helpers/scaleCanvas.ts b/src/modules/simulationRenderer/helpers/scaleCanvas.ts index b1976bd..2757710 100644 --- a/src/modules/simulationRenderer/helpers/scaleCanvas.ts +++ b/src/modules/simulationRenderer/helpers/scaleCanvas.ts @@ -14,7 +14,7 @@ export const updateMouse = (e: MouseEventInfo) => { } export const handleScroll = (e: WheelEvent, camera: Camera) => { - const sign = e.deltaY / Math.abs(e.deltaY) + const sign = -e.deltaY / Math.abs(e.deltaY) const zoom = scrollStep ** sign const mouseFraction = Screen.scale.map( diff --git a/src/modules/splash/classes/Splash.scss b/src/modules/splash/classes/Splash.scss index b5277e9..3cc74c9 100644 --- a/src/modules/splash/classes/Splash.scss +++ b/src/modules/splash/classes/Splash.scss @@ -66,5 +66,5 @@ } .mail { - color: $primary * 2; + color: #aaaaff; } diff --git a/webpack.config.js b/webpack.config.js index 033eb1a..c11cab2 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -18,7 +18,7 @@ const babelRule = { } const fileRule = { - test: /\.(png|svg|jpg|gif)$/, + test: /\.(png|svg|jpg|gif|ico)$/, use: ['file-loader'] } @@ -74,8 +74,7 @@ const baseConfig = { '.jpg', '.gif' ] - }, - plugins: [] + } } const devConfig = { @@ -84,6 +83,8 @@ const devConfig = { new HtmlWebpackPlugin({ template: htmlTemplateFile, chunksSortMode: 'dependency' + // favicon: faviconPath, + // inject: true }) ], devtool: 'inline-source-map', @@ -118,6 +119,7 @@ const prodConfig = { minifyURLs: true }, inject: true + // favicon: faviconPath }), new HtmlWebpackInlineSourcePlugin() ],