From 1e11d6f5e19af53e1d5041dd5c2014c3d6167118 Mon Sep 17 00:00:00 2001
From: Mateusz Tobiasz
Date: Fri, 24 Jul 2026 21:50:38 +0200
Subject: [PATCH] feat: implement PWA installation and adapt navbar UI
---
2023/js/main.js | 67 ++++++++++++++++++++++++++++------
assets/desktop-screenshot.png | Bin 0 -> 521572 bytes
assets/duco-192.png | Bin 0 -> 10043 bytes
assets/duco-512.png | Bin 0 -> 29973 bytes
assets/mobile-screenshot.png | Bin 0 -> 276345 bytes
css/style.css | 18 ++++-----
index.html | 36 ++++++++++++------
sw.js | 13 +++++++
wallet.webmanifest | 49 ++++++++++++++++++-------
9 files changed, 137 insertions(+), 46 deletions(-)
create mode 100644 assets/desktop-screenshot.png
create mode 100644 assets/duco-192.png
create mode 100644 assets/duco-512.png
create mode 100644 assets/mobile-screenshot.png
create mode 100644 sw.js
diff --git a/2023/js/main.js b/2023/js/main.js
index ed776747..3d70062c 100644
--- a/2023/js/main.js
+++ b/2023/js/main.js
@@ -381,7 +381,7 @@ let miner_template1 = `
{{HASH}}
- •
+ •
{{EFF}}
({{EFF_COUNT}} shares)
{{DIFF}}
@@ -418,7 +418,7 @@ const miner_template2 = `
{{HASH}}
-
+
@@ -662,7 +662,7 @@ function adblock_check() {
$(".ducoadspace").hide();
$('.adsbygoogle').fadeIn();
}
- }, 1000);
+ }, 1000);
}
@@ -2044,7 +2044,7 @@ function miner_details(miner_id) {
- ${miners[miner_id]["accepted"]}
+ ${miners[miner_id]["accepted"]}
/
${miners[miner_id]["accepted"]+miners[miner_id]["rejected"]}
(${round_to(1, (miners[miner_id]["accepted"]/
@@ -2070,8 +2070,8 @@ function miner_details(miner_id) {
Efficiency
-
@@ -3327,8 +3327,8 @@ function register_end_2() {
$("#register_button").removeClass("is-loading");
alert_bulma(`Your web browser couldn't connect to the Duino-Coin servers.
- We'd like to help, but there are many possible causes -
- before asking the support, try disabling your browser extensions
+ We'd like to help, but there are many possible causes -
+ before asking the support, try disabling your browser extensions
or similar programs and try again.
Make sure nothing blocks server2.duinocoin.com`);
@@ -3474,8 +3474,8 @@ function generatePassword() {
$("#reset_button").removeClass("is-loading");
alert_bulma(`Your web browser couldn't connect to the Duino-Coin servers.
- We'd like to help, but there are many possible causes -
- before asking the support, try disabling your browser extensions
+ We'd like to help, but there are many possible causes -
+ before asking the support, try disabling your browser extensions
or similar programs and try again.
Make sure nothing blocks server2.duinocoin.com`);
@@ -3506,8 +3506,8 @@ if (recovery_username && recovery_hash) {
.catch(err => {
alert_bulma(`Your web browser couldn't connect to the Duino-Coin servers.
- We'd like to help, but there are many possible causes -
- before asking the support, try disabling your browser extensions
+ We'd like to help, but there are many possible causes -
+ before asking the support, try disabling your browser extensions
or similar programs and try again.
Make sure nothing blocks server2.duinocoin.com`);
@@ -3745,3 +3745,46 @@ function updateValueDevices(e) {
if (localStorage.getItem("shop-open-duco-cube")) {
$(".info-dot").fadeOut();
}
+
+if ('serviceWorker' in navigator) {
+ window.addEventListener('load', () => {
+ navigator.serviceWorker.register('/sw.js')
+ .then((registration) => {
+ console.log('Service Worker registered successfully with scope: ', registration.scope);
+ })
+ .catch((error) => {
+ console.log('Service Worker registration failed: ', error);
+ });
+ });
+}
+
+let deferredPrompt;
+
+document.addEventListener('DOMContentLoaded', () => {
+ const installButton = document.getElementById('pwa-install-btn');
+
+ if (!installButton) return;
+
+ window.addEventListener('beforeinstallprompt', (e) => {
+ e.preventDefault();
+ deferredPrompt = e;
+
+ // Set to empty string to remove 'display: none' and let your CSS take over
+ installButton.style.display = '';
+ });
+
+ installButton.addEventListener('click', async () => {
+ if (!deferredPrompt) return;
+
+ deferredPrompt.prompt();
+
+ const { outcome } = await deferredPrompt.userChoice;
+ console.log(`User installation response: ${outcome}`);
+
+ if (outcome === 'accepted') {
+ installButton.style.display = 'none';
+ }
+
+ deferredPrompt = null;
+ });
+});
diff --git a/assets/desktop-screenshot.png b/assets/desktop-screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..55d6181148f1d3f70f44fbb4ba49f2d65bb9749f
GIT binary patch
literal 521572
zcmWh!1z3~c7v9Ez0i$Chr8`EaNOyM#j85s2axl6?0qJfK=@ew7v~+_gAuS>xrN2M_
zJ
9{>Ols;em(007vJZ$UE<(Bnbwi3afT0Ctww
zmInZuUK2dn{{K@vZ#8p20Dx%V|4$$#rv~bAkj!7%%-_(<$v?=}*AbxV>*(m|=i=pW
zZ47z5yuvW3`*6l&fXtZ+8}*iv$xt}t0|rov>(sT_{%yuNH(lMf*X!F
zL3#bLw$b`<-u?nkruNm7``)j%-owrGt=+O!q%zeiVLMe0)6J)PDNM)cEg5)*3!_
zH_dlz2CPd)38Kbs+L>!JRiegDC20fBxs&*#f?~3P2^;eES)->0__*>9{?U{ChGnOND7VD3NgP7s(Uq3UMn0Mx?$m!&fsKr7vn>!
zTO*=%>#ynpWK+b79e=sE$<|LNox27^)bnGC=du0okaU-K#akq$#eFo%wrD{Qk=T^V
z_%S-s65SR_xAyXuVhXbfWMZRa7guFGDbvk35)peP2a(l=TpBw=51{}fyvU2jLx4sN
zd6?1-qJ%TdKen-7j=p9LoUP4-?>FN?WTAzkwiSv=u1q7XX<%74tY)jA~=+bU7EV44_KNY(!gZ-AhA
zdS3a};sKsNFlCy!XqOxFWele}Kt5UJ$=rdWg`!z<8Wn$S;}*qi9y5;L0x}l6m#b7b
z7T76ULxF?!d_=!2XXLGCv*S!T?F-Ue1fe*a8wg2W#<%IBEpEn)618iL?Sj|q6Q!jO
zA^Rx--h05x!ZZ*88@OeUZ#(fwgfF^
zgJSNZBkDsoHA>M_QF1YipabFPCOxpa#LFluzfm{5{@6;?@NP#o$ixq$vWQ>XU!OV1
z;ImS8Agr)BPPB4LiXrup7!)Dp*8!;oMV~_Au-e)S;Pe{ga%ccRLPnExls8$BvP@C&%qw$
zH*DvpbUIx>w)8mi`(YjPrMDVccez$%UP#a&Y|I}
z42%;y6TYD>&p+{I39RpZiNzLRCx7$p!l^SHHJ^TVS-C@zB|eC!$K}Z>GqIx_EClqb
zTu$G+a1BS7htF4~Oxw3|>Vq7P>CGvoJqlQo2Jj9F7EJ4(8oE!+SO|;2
z35vz4472BqE34<=`ZQ%4ibl5aoR_4M3H-c+E{X;()KnCl(~cSYK#8D?O8*Kj#TdOj
zA(4G(JsbI(k|syj6LT8X_K}>jz&)3Zg0@0_8dK*K@^_+z)8~gO6FPFIllszrMsn@r
znS@2DbeT^r@f?8dyfK8bnb#hVXM334ZR`xfsvp(#l5WnRSeKSvqz{`BsJesO~1;J-x4cy-@rMkxT*HBrYS<(*QDEgMW3
z)`bgnN7R-)7pSiAdLI~r1(()9?iTZmYik@TgIsaW_X
zAmkYjrkk3)n$0EVrX)^LXK#%7~G>#uUqlUO~jgS
z$tv=DVy7oBCe-yx`MQo$zUudpzijVT)$+YOItOdHA1`uV!7BX*AKD)!R(XlfNFgpL
z_ZGWQOA_%pnkBwk4n;Z|`sNN4oI|GEY0^*0We;{0u_$GCmqJbexZ0G>H!Eb`Q6g_N
zBoTX)j7>|`{bY-lgCXu;53U%x;cUG1Bf|et
zwYRFZNdsCh|LL+6hfPd)jq~H-dWfc>@DJrPzwIE-e}hc>Ey}GLBapqtj6cj**fUmM
zP#SGUj8oc|#uRU>k%*lt^mFql6OF~RdfPl@4EZ2MYwlpiaW3dUkPHAEd6{i2QN<-^
zd%eypFHMGw6Fq5EMi|jIb}@}Pl&7)}y)o9eNs&nVDM^Q%t;VDk9LMF)HDZ0H+HM@A
zE|oVpO|)x>t@mJxW7}>87nopdZRuB>2+Zmu@Da8uCd&Oko*0vT!h!s(I9X0bIcl{0
z6>}$f0j~sSKh->-8+eVapT}Ysq(aBPiy;E@mScIB&J}#{kK-xO*Go-`8hXoB4p=uA
zDky};NzLLBeOL}-tgx(K
zRla6T+fzk-jcRs^x{I<^>HQbK{N&ednVPow{jd%##Nj4PpQZ=jUz`Ma3Ij`IQ$roG
z70rR=&5=kaK)B-q?3ABgPWje#RpnjY88)7(7*PTztwsq-5vj{-KXCGrh%rj?lU}Mo
z_73)}5=;`|^1?ZY@iXngNd^6iwxl;qz`(`=)gSo?sh-h13#*hz
zC(w(9tTJFk9(h;vF
zEQ0={x;Sl;Lwv>Vf$R@T)sxiRez9wBYuX*$-kV!kwl5Xdw>j6yYd6IQE_HUhY+AK`
z;HQBa*tF3m2sYcOptuN~7GSiGe;|g>(00mbMJThK*966-IBl{<(n?!bAn8)I*?Puc
z5k#EwQ5u`4_o<5uZtUcys9Lr>+RAECM{e(=)ZgD^#h1ba-vZqq?TU*NTE0!&AQ!G)
zRS%>4Nf~*J*=?7ZG}n7s{fzC@6=x};$w(7=SpN4yG}}D3fvcMnf{^f*P^Q(GjW$^5
zr!eMJ#=c%x-#ae9V5>2^#|Fl(2t@H<(xOftU5-k#mX7X52ZD&b+>++Q?AB(JZr^~k
z8YtHUAP5eSmIB-h3LH5ixK09R6a9Aq?bluN3Ip!DB1nNwXiR=5e-sO*XH*M%ld{ka
z&Q68-4EEruhI9>)BP%PWNs-lg*#LW7u^dUFWCR?9gSPPktSVOVm(MGDo7H`O1)+Hu
z1SjEsWZuJ+A16k#^z!HGdm5a((og3mVf?**v7{2+qfu>M3e4
z{gH!7JuU8s_fYXU8?>vl892_BAoUzgQ2LE9R|NiV1(Iy^v-Q{Kw=G?ulV6S>!%1#Z
zxG>uoX3(UA-@uk|_$Loc-szRYt&F*>z)(Kv3LMDW`@FHO`3_%!wxWO5Y9#WPkT_#<
zN5xRKCL()mDAb34halYh#*P?$x8<~eBahw&
zmuy@}>|;j*u<}s|UnB`K_3v9yGH;fT74;XLW2$WltK#D|lJsi8azgyyB`!=d*6&bx
zo*g{zO;RM=Uhn(A2Bb&@VmtjRfH2MEWjwp0ln2Zu6>rCci{qS>HN~7
zhjMk?W69+s+E{82zR99Mvdk0EbZFYCBFKV1WhMX*YVlfLRX(pVYpD1S4OAB0?<{fy
z4JnfUscKdEw^8noYE0c5tmmc0{R4$_rHF!@97L!BWc|M!?5nB$
z7ZV3h19;Vbb`^B{oMiEoo|twv;9>9WIt){?HGd&jK;?XGR|8TVeCYfmgt(rFI)#15
zbpF?}O4e>RU_xT`=`K+cv8bFwzUgS+BZo>nW`4v>F;$O!h;{oMfkTi>kFM#BgBp;aqHqyct+61=TeY!j8*g(rOYP$n5*d0rT{k
zT?i1AzFd&x$^JfRwLp6~R2NkfFG%>)dj+lV#(U!nwR*$jx)gW9&d#vbp@5ZVnV64z
zaivLpKj1m@O};>|Lzzq}`vez{;q`WRI>Loos{;793PsL67=T?e`W*!c?mht`5Xp|~p~mpRnu&UZBw
z5x7oEk>BAn=_
z3uReFQGP21g
z_8w68hJ!`oI!Rj0@9r53aO7{1Qxbx%E;0>RDq6$Is-JB0H6@bS2Xa+Qq
zl&U)^I82>ci5$k3_yk=(t-!+sSdjwRFOmj+{x{iTgKFH6I0t7pe?=y;r@bdCuYMS-
zl@o#>R=l);I+<&8dL$Cqc;3xWJVYWE%YEAp!>krvCj$ujeSG}IBS;TMKKkx&0(?Xe
zxd|%sJwTC{NEt1d0BL+O*kog-mlX4IC#@LJ!ahm;_A@y$m!toC&G9lhU3i`*{*8YcxO6eCO(vlzLBRG=K-s4!Z+hm)k_NNgyFb|4?M>FE?
z=OKuDm*WxCVerevxbwWri1dCh5pZ%WO8)2apriVKDsq1~aN{*i0Z$LI&gSwt2Og3E
zbpZe#Ovu6i*F%#HRmSw1Kq93uh}W(U55F-%0F&`ZJCmS$d;L;~I5<)A-{;8T4bBdo
z;!nX33eZu@Lbg-@0d^(_264^Q4j>4~QtAmCk4&j1kHfa>dy{=VA%S?xkje6)72tQ7
z87`DPU_!nkpo%IJ)1(-V9_%3$y!mB!nU^e^KISZRJLS|Da|+k;*W4dMbYXcaci-T%
zQd0$^^Qn8|`X?t-vyoh?u$MGipF>@Nm8Y<}2ENhgH#Il