From 29a693152b5705f5f6b29437858ccfe69a3f3a39 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Mon, 18 Apr 2022 18:44:28 +0000 Subject: [PATCH] made a PWA --- serve.py | 3 +++ static/favicon.ico | Bin 0 -> 170048 bytes static/logo_256.png | Bin 0 -> 7933 bytes static/manifest.json | 19 ++++++++++++++++++ static/src/index.js | 6 ++++++ static/src/service-worker.js | 38 +++++++++++++++++++++++++++++++++++ templates/index.html | 3 +++ 7 files changed, 69 insertions(+) create mode 100644 static/favicon.ico create mode 100644 static/logo_256.png create mode 100644 static/manifest.json create mode 100644 static/src/service-worker.js diff --git a/serve.py b/serve.py index d62a27b..7edf313 100644 --- a/serve.py +++ b/serve.py @@ -107,3 +107,6 @@ def get_permalinked(link): response.headers['Cross-Origin-Opener-Policy'] = "same-origin" return response +@app.route("/manifest.json") +def get_manifest(): + return send_file("static/manifest.json", mimetype="application/json") \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cd2b089e405dbdcf6860b4988ccd2dde9df5f63e GIT binary patch literal 170048 zcmeHQ2V73wAHOXtm8_)fl@*C(R<^8UWQ2_DQAQCj8D;M%5!rjMl#$m=_KJu^MSEzk z|Mz!$ZvU$nt>>wydhW;9x%cVbbAIdWbAE?mq?qzdrAiFKy3ABrhS|w5OpO|u&uhvv zOget6TQ~Fh7~Zp2WSG{i1<#EbMzapX=<8=bYjk6nw>=o9PanbeL-D;m!0cyZ6@6VYthw0k2EB&Sj zOafj4+;`c-XZV{Lpa8J(9654CxD8+j1G~$P+W2i15J)yDKmbBpKpptyeJ&r;?}(fIn;_oK`0W~S8PFX# za3K4)!Gj00A@`l940o6JkiMmI21Ol%;*2eS*jP~J{i&Q`|IYglGR!Iu1Z9gZexowy zG@uPVvwzQC?(m}c?Jf5{qTu3J$Gt5;Wf7OBKjVH8pbBvBF;xEj>1x%gRn~igZ>TI9 z4?G9Bc(aFOtD^yVfc>86Bi{HI_cuW(i?9bkWfhfK+2hRqoQQYM0eXmA8X+4$mj=ou z#?a7^>C&YOrQaNI0wRIz@#ORzj&HUBO@J&}Aa9dhRmN`%k)}VwoZ`vp?;j9{C7=W_ zl+V_#T|3g;+&msU<>POhw#7vd2$paOt34N=3bt2>mBRFL_PpukrKJ zNk_evj50A1^%lR3FA)7){2VU`sa{JOI&^3v@@Q^!lPmhOrz5EM5>f9ZLAHOBS)SwP z(xSQ!^;Qb%#YE(t6zJx6vdVY-oXn6;I_k}2)SHQDCuP@7f#T=$f_ga3*48!&^-B`k zikxo9{(rGg;yb^fHUM;!x?sVA#NNGoCnMhwKSKd#+qP|tgM-6p)c?t-qnSy@#cGiHqS@ZrNh!3L=wZBfi?Anf6-Wkhia!bOoCov)86YbzejPSs$dIhx1@9;#oB%ur{*;C{{$>iu z1HXLFkDGrF9)Ecc-_-(^1786yozJ+p0aSsk_vzc*Ui4kIv^wB7YEzvB+H&oxe*OBf z@&75_R7Q`9Vw4z9MuxFPOR1n2#X)gVoD?^;!|DS10QCde3mw4Rw!<<%`2YV@r=U-j zRlnm|2RI8H1zG{@-%zIfrycYESn__y#mfuTaQ_d$Z&Og)U_MZt+EEBu8Ys-~#l=H$ z2v8B>Sl|ipyRtbQzuyOj1LXnkI|g-Np2*;T3p!-*YyeyYsQ&p~+Wg<*@yIJOD_ae~ULSf1`T!7BCPf3uN(% z{xp-3kwG@1gZy<0e@g)J5_ewS{fW2_0ZT z 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 literal 0 HcmV?d00001 diff --git a/static/logo_256.png b/static/logo_256.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d94be3d0877a2cca123164614c9808134f2b31 GIT binary patch literal 7933 zcmZ8m2{e@L+kenRykumn>k;Ay0pf-1Zfk%u-m~m;0cv-qD!Fa)%qyVa03&U1*q> z`bguH4{`hJ>1zGr^()~oO;w%S#C6}B-C(O18W@nu9=z(MS|n?%t$}WRT%~45b2wjB z&}jVF<-|kJu19C{Q>RKAZ-q5&YlsTE##TNmB#t&~w#aH<5898++Fx0DW8MNS%eRcS zRKI=u_9B)`D&?Ut&bDWIxm-Z+4VyCuP8>4F1_lcKEtFtHg3-m-zlAT5ui4qP7@&HX z8)jbZkI;sP-~8-W8x=}VP5RI)kAzf4DFkG;Ri)#up|P>CG|m*FU}-IP@XaG%zt&+# znu6jC^z}>l$u2yLe7LU7h~}YK?r>f}nu=nDAP4I$acbTV&HUi4{wHaZ} zF79}6(NunaLF1tFZ36=`vEw8L`wm7|j%tbK!;v8dR5kdl4eRk_ZG?rDEAeQcrrQyF z2r<6Axub{gXR^n<8|#9iz77s~M%pxwp2VQ5FIY+qk`;LDd+L8Hx)=M#Fm{%VKObyKvrW*)dGZwgC< ziI9%PTLeNaaJ>kh{k`2QJONd%V1Uf-Y_}zv&s5VsJv!5v+PR$YPrwb)vrpl^MV36&v(o|e&lJ_y|FNn`@*ka#;K>A2dS|1^cr#87l>hdC?7bOeq_N!%N#i{9V6 zP!kivxzF;d^YLjrL{4^gxDW{oWpq+77Y@+tp`0HxGwP?1iPpYMHqW#RiL9j8HMQ!x zwroot&o74*l$PE$!wS|Zd9yYQ`751SvGu}Xtrd4PI+{%b?2md8 zHFOS%+;(C0lSDu)rv<5zTqLsVv>#lU4CYh&_~06}miC8t4!WCrQ@S zRxKaVTjA-gOHNL%cfIMyjKD1~4rEpg1u}=c$R$({KQ$*ZYi0j@WE8p)yZ=>_+=h6qyoh=8sGIM}=Rr~`B# zrZXQXZ6w5l{R0#&3D zVr?scU3Jf4$T{*j(`?nq=Z%e_0`L)OBuAR}Q#>{hi`~11^CJB zGZ9E?bf2g(7KP=O3(bRmV49*YpcI&GgwhP ziNTc;$iysrJ4id%=Pmd6#fE?kVYj5~5@9vKxp53JH$Mj^c|q#PLAnGjG;8{eq0?v9-DR{eQ3-e*im6hp)fNpqr zc-ND&x0~N%nm%Cw_*kNY$gMG~MXm=^t-uv5DE!D>ZaE>xf_dZ`%iY7r9-A8+6jZFt zY~u*s(WQq;gdNf>>>7CUpE&bstNk$_>8=Ad2bMCcj8*-8Kttammb)!V&2DX}FYaV| zgP_6+iEc=VVy0{UUsN#>MXIi{lctwP5cdXH=w>QCZJ8Y1Y~qfJ;f#U5nHT>PO2Eip zUkc*Nfln?x@$R%8&4*FmfH76GmU;OBM4=h0#c1(pi1sG^I7TE2N|1 z&lq@k++X3%;=6zX%h}@)&+5J)MoKJCCp$AUgp)LS)KBvQyYtV%*K>%sE1!vp>iif6 zgZEdH#lCOzixUqhw1mPeRRQ}~$>C#TU*?d|Q>ZZ~g^_MQ0|mY>`WBV|TTc64+c zWMySt_$O%hnuIKW!uwTdgB_ zC<*xN+#K-&y03@uQ{bv>dPAXmaHgL>81wrxz30B_f`3(j8J&Oh`Y_W*iLGq|Xkvq(jEjpi0G|b^JPt%#e~^~7YJn3GNx(ooh?QmQWN*({=-@hY@OjNWLk=1%}!PfFzNw6~*tqNDd6nkt+y zU;I?EK5^r8RDOgcw8BUO2EE-@NLt%zqmtzIeR;=B(Ht zo6&VTOuWbP1=SsxblCJi_x%@gk% zX|m2=vkI;^OZA)$eT%tq!!N*B|b93{azDa-DO67!qqdm7Skv6R%02+T>MMo+e zODdsKsgE_s9jUKS1(r(R<=Q95nVoYCP*?Kv^A`?ta*nWY__P;LXOBQH=8M1{-k5xF zQPz5X`Br{ONwoK5d}*IYOG(M+;O;5V?Ul1h|CiA1T5$<2f|**|LFCN<{>q{s7 z8*?tp1m@?-Ja(GT^=_Tlt^*fqUkXCLRBq4ExW65`FU^fHPh~?uQ|C~DH++2+{VE)= zE?|j9(9MyZ3;du#s^ChI+3MQr>WJI-%nG<{`XzgG-;nDxh|Ev`%Udu(oZfTJfPjEP z&Yx#=yWMItI=TE*?V(S-9_Vh_{JiQ5BH9iw`nDHSiHq^TLY-?s#VaRi8kATLoQA1Js^PtfrH!9W6+>$d(T?W`^Kl=D+h^{AHduPsWRA1qMq|Nz zjbuWeO#XvB!_a@oH^63xYQs$WWoVwNtN?w5rrTg7hNp*%%lF-}v9WM`=dbC>vw2r# zZR?2Uk_}L%aQ8w@Ktdm;NncFD6^s2^GZJ|W+>K{}c42r{qLM@YcmKw=ri%J5O0^(Z zEq|bc&e#5a=^&GSwx$Ym;C6Pd(>C%5NXpLJ)05FjB9TUv$$?3a%!=Z!FU@Nw(V3lV zUN+iSAceR_flCXAH?}-1`!k2Ub-C39xc=7;9f6#BHQ06c0|HQOV#OTBAVq}mY6zS# z0ItJFQh!=Y)^ z-)2`3Txx0DC+7dXPB(Tmnl-;y#?;&#IbRcU>MEM>G&{R?Bu4wUqaA&Kf7I62mX8&s zp1mZMc9g|=aO%0+1hcb#@e9l1%V&Pl}P)qV14%}%2H&0K`XU$z^wG2fo$voPP z>H#Ta9J~P6!V`>m{`MDFnd!r&YsxwY`{roAizs*`z;*WN@V>S!a8b2I^M=w->d zLYW8oK0Bw|VI)cdK6!n0wcEtRBxF8dkM`-)rx#Fz+gV8g2$?awu@U0*2Re}cS*5+e zQce1Utog)2Bf(LIw<)HTK0Wd#BKYVRPgSBmmM!0psY=I!w?IvZtMa2;ZH`T6Eid-l zND+XlzaXi&`}dPm5)&6W_T}+1cJll!^7r!lcb@VI;Of(P;!!UuD;K!XXklW`i05oz zm@eDc#zmc*Z7{m&ReAolR_DdRO9kUiUDqW0JYK^uTG+2cX`%Lz$d%H*nbEaMdY-a*jU53Ad_Lo)ek_SnV0p^A z{95gULiZ2;jf{95BmxRvTFI=i_&mEJ1DTh_)0ur)MW|;DUtbfxjPA4e*Vjm6Ah^O} zTF-7q@1z>Y;zEON?qa}#&eLQe#13S{7V%Tl?sAZeKvr3!~P)i z%3M10!$iC#KQZ0pw*el$7-U5f50Th{^6hGVuVs;sh7A^gXeQ;yAY7Uu{QsKE@&g#_z{ z;I8I5nlvX->SS~X4*;~PLU(&okUcbI8PI4S46M|`g131%BN6|1gm#M+=rqQx7@sGz z6(B6P63?X zrFfJCPYQYAyOP892e;YI~>k;wle2kH4EqLQ7>*PA2t8^FaANOz&G{vYTcM7inTmHfYTy?R`>cj z#MD$(u`bTebZ?0!E3DvGK?&I~zu;W`kk`-`dqlr5SDepFtI~+Z1)eMusgKks$mSz9o;>KWNk23K=)qb^BMVLHc6$E3*O#LcCE(;O~*1L%)yx^UzRu zQK7qa7gt*%pibjY3P;3|aYq^(p_i9sgt!jI%!R5sSOe=gQf(pE9E$V!`9aR);~HLEwE72 zHsz|EB@SuM`G^tuaDUL)`MAQUE5{!iw*mJ$SZm58^WgJwt~hJgT3g4?HZz0Sz-vtZ zoIv7-2A=;HAmtG9#Z0L@Z-^<4@~0q)C&z?^ zBclOd6j@9XsxzDo+&Tb7)hedaV9#DqXMNR$nvKxtC^l)kSAgMEmdNUSr@9pK=|-Al z1XEp&^-*Ex2;K)5<}v5mICRl{69&mbr_9XEe%(~7lYf6>i5qIZ@d|exri-GbNt>@N zXCiK+B7<`|YXU-I#bLfbz7$IW(j6s2bxj%{i9{sgJCe>l7GLs^A8be`H(H0R3N+8)tDA&T^ZSO%1xe~QrPU2$AX+?|tc!=;wR z?X@)do~_(s(pjsWn~5P zUR+u+K#8Lckm?Li_;>yau#0>b8r8Bd2d&}av^0$^{_X{@m5z;6?n=eaG}_3o8ADBp zP|fI_*q-TdkdYsOGK?wjPp0*HF6);UHG(7RkRJ{H6Z&fnx=!O2(Sr=s*`+78A8M}BCkm2%sXA&8T z(?FugtaqmtnuGmlvCt1ea<0?Yld^JhqUx)HapSfJlyI?~SbcPYUXeU_)Xql@RZL?AV=ugCWQ1=4{x zE;XB3uq_>Kw4a|$O-(IfC>oD77-@+hv4wybwDo!Pd8Nct<7bli2WWXGYF}Tx-CJUu)oAcC2*5y6 zx}8C26FZ`Z{|S0HEsa4b`HgwdR3ACniPblWASi$^;5(pvzwTO995GM>-87EJK7GEu~L!*lhM+E(7+8YVc)Rscxd+n{EWdLmH zdiac14Egh??(Wr_%2^8U8l(4=A~rPk9cbr2jelv$ya-f-`u<$~_8}8nJbuMRS;GY7 z^pN0sln3=H0BG|2H^`Gjeg8-%NYvKq6Nb!xikCfFo4t(HtvCef>b1-TB+y z>WQ07_9u`jcJN+LiPV=Q+i+AM^8kO6zJV)i^`jzoXU9KsGINS>_6;|;DX)tbPk%k^ z5f^Vy1LyFJA*LKs15E+dzlB?m!Mu2qW;?8h?yJ5k8>GRAj!lOx4xh}h|Fv9Efk0yg zZGngg{quhkcLMbFBV{5Gm$Tku zBL&k(;;yQK451x_Eq#!%P3SC*P47g}&NJ?E(9Zy$TZXVq8*(&Tp$-ahI}zGwPU{FP ze+TpBT6KL-gv!zg?+dU}02Ym9-mq&}cUSFFRZ&?sxM<;7Jrjq2 zhkA8ZBqg|uGJe1wGOhw{V3+;m3BVu&EI;vOpNAws$9~PT^h%9B~X;VO7ckLYjW&zRz?dWUimzTW_MBQsf6}0nORH-jLcy%4ada zc@2Ub)Rxy%VT)-1n;l|eVjjd#Uk41p=LZxmF&PjgR_^&O-||1K}?0D*Eh=4+=~hr*TDqCmFFMlaGNCi6nqrc8M*x=NYVh z@zt8bs9>Cjw0@=PQFWUicYEWbf_qg{5i&wz0OXjxjA52yUKJq$T-*N^F|vX{_L)*(SzHR0*?doNfi!yn*#-HhE=NbQ zQ|zJRzGkMT7tfdyz2Ggcr0#7*qh4u&bWo5Gla<0jYUNK9)?sokfRp7jy2k7g!L8+Q zfyMk5hu@7YK7&uY0(qeU)MYfQKy6{O2vR-kFC<|J{PdJW)0$=rgGC}tnLi;&)gR$@ z7*qx=!4>+-5}7dS|C$5KTO*T;1(hlEVOCvej#AYte}G zOYTtc^+Qg_J)WonXVOkk$#s5lr1!X-RoQ?LS6p=N2bT@0+yqe4GzP5XLar5hHO}Vy zz!D9+E}mCEm%AL^{qe(hP!nv_74zkQ|2*hR;fn-%2^TFct^lZ7Cutm3)cRl*1VLoTJ<4-HB)F` Z)U0gOFfnXR2b8WMql;#!3O(n${{vt^MDG9q literal 0 HcmV?d00001 diff --git a/static/manifest.json b/static/manifest.json new file mode 100644 index 0000000..6efeb05 --- /dev/null +++ b/static/manifest.json @@ -0,0 +1,19 @@ +{ + "short_name": "Onyx Playground", + "name": "Onyx Playground - Try Onyx without Installing", + "icons": [ + { + "src": "/playground/static/logo_256.png", + "type": "image/png", + "sizes": "256x256" + } + ], + "start_url": "/playground/?source=pwa", + "background_color": "#111", + "display": "standalone", + "scope": "/playground", + "theme_color": "#111", + "shortcuts": [], + "description": "Onyx Playground", + "screenshots": [] +} \ No newline at end of file diff --git a/static/src/index.js b/static/src/index.js index a02789d..775b516 100644 --- a/static/src/index.js +++ b/static/src/index.js @@ -282,6 +282,12 @@ async function request_permalink() { } window.onload = () => { + if ('serviceWorker' in navigator) { + navigator.serviceWorker.register("/playground/static/src/service-worker.js", { + scope: "/playground" + }); + } + let editor = ace.edit('code-editor'); editor.setTheme('ace/theme/chrome'); diff --git a/static/src/service-worker.js b/static/src/service-worker.js new file mode 100644 index 0000000..56bbb8a --- /dev/null +++ b/static/src/service-worker.js @@ -0,0 +1,38 @@ +const cacheName = 'cache-v1'; +const precacheResources = [ + '/playground', + '/playground/static/css/index.css', + '/playground/static/vendor/fontawesome/css/all.min.css', + '/playground/static/vendor/fontawesome/css/v4-shims.min.css', + '/playground/static/vendor/jquery/jquery.modal.min.css', + '/playground/static/src/resizer.js', + '/playground/static/src/storage.js', + '/playground/static/src/canvas.js', + '/playground/static/src/index.js', + '/playground/static/vendor/ace/ace.js', + '/playground/static/vendor/jquery/jquery.min.js', + '/playground/static/vendor/jquery/jquery.modal.min.js', +]; + + +self.addEventListener('install', event => { + console.log("Service worker installed."); + event.waitUntil( + caches.open(cacheName) + .then(cache => { + return cache.addAll(precacheResources); + }) + ); +}); + +self.addEventListener("fetch", event => { + console.log('Fetch intercepted for:', event.request.url); + event.respondWith(caches.match(event.request) + .then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } + return fetch(event.request); + }) + ); +}); \ No newline at end of file diff --git a/templates/index.html b/templates/index.html index e90fc57..fd55860 100644 --- a/templates/index.html +++ b/templates/index.html @@ -2,6 +2,9 @@ Onyx compiler + + + -- 2.25.1