From 6c3b5e36b99683f4da4c73e10b5d09e4df5ef7da Mon Sep 17 00:00:00 2001 From: ordinarthur <@arthurbarre.js@gmail.com> Date: Thu, 7 May 2026 13:38:32 +0200 Subject: [PATCH] =?UTF-8?q?feat(pwa):=20manifest=20installable=20+=20icons?= =?UTF-8?q?=20gem=20rubis=20sur=20fond=20cr=C3=A8me?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'app est désormais installable sur écran d'accueil (Android via Chrome, iOS via Safari → Partager → Sur l'écran d'accueil). Identité visuelle strictement alignée sur le SPA : - background_color : crème (#FAF7F2) - theme_color : rubis primaire (#9F1239) - icon : gem 4-facettes sur canvas crème, padding 15% pour safe-area maskable Android tout en remplissant suffisamment iOS qui ne masque pas 3 formats générés depuis le SVG via @resvg/resvg-js : - icon-192.png + icon-512.png (manifest, splashscreen Android) - apple-touch-icon.png 180×180 (iOS home screen) Plus la SVG vectorielle servie en favicon. Le script `pnpm --filter @rubis/web run icons` re-génère tout depuis `public/icon.svg` — utile si on retouche le design. Drop le favicon.svg de 1.1 MB hérité du landing (vestige), remplacé par notre gem propre à 1.1 KB. Co-Authored-By: Claude Opus 4.7 --- apps/web/index.html | 14 ++- apps/web/package.json | 4 +- apps/web/public/apple-touch-icon.png | Bin 0 -> 1664 bytes apps/web/public/favicon.svg | 25 +++++- apps/web/public/icon-192.png | Bin 0 -> 1733 bytes apps/web/public/icon-512.png | Bin 0 -> 5104 bytes apps/web/public/icon.svg | 22 +++++ apps/web/public/site.webmanifest | 32 +++++++ apps/web/scripts/generate-icons.mjs | 36 ++++++++ pnpm-lock.yaml | 130 +++++++++++++++++++++++++++ 10 files changed, 257 insertions(+), 6 deletions(-) create mode 100644 apps/web/public/apple-touch-icon.png create mode 100644 apps/web/public/icon-192.png create mode 100644 apps/web/public/icon-512.png create mode 100644 apps/web/public/icon.svg create mode 100644 apps/web/public/site.webmanifest create mode 100644 apps/web/scripts/generate-icons.mjs diff --git a/apps/web/index.html b/apps/web/index.html index a4a4648..f528865 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -2,13 +2,23 @@ - - + + + + + + + + + + + + Rubis Sur l'Ongle diff --git a/apps/web/package.json b/apps/web/package.json index f3a0467..f3650da 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -14,7 +14,8 @@ "typecheck": "tsc -b --noEmit", "test": "vitest run", "test:watch": "vitest", - "msw:init": "msw init public --save" + "msw:init": "msw init public --save", + "icons": "node scripts/generate-icons.mjs" }, "dependencies": { "@fontsource-variable/bricolage-grotesque": "^5.2.5", @@ -45,6 +46,7 @@ }, "devDependencies": { "@eslint/js": "^10.0.1", + "@resvg/resvg-js": "^2.6.2", "@tailwindcss/vite": "^4.1.0", "@tanstack/router-cli": "^1.114.3", "@tanstack/router-plugin": "^1.114.3", diff --git a/apps/web/public/apple-touch-icon.png b/apps/web/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..361d968ff931eb063c49231afdf78b11d7e31a30 GIT binary patch literal 1664 zcmcJQ>r)d~6u^^^L`;lSFd`^Y6%d0#6oMKExj`I6MnFn-y73jU#+8S*mY@ZpiL_Sb zHKUWdMX3vvadDGqB`FFb;@cSGj)IJ|Xdk29E(3H%7zTn&ul*a^5BJ{Roco(I=YBZn zp2*5bm572x91cg4wlO6eo{sm+R|t32W8rEJN0^$HqRBaYZs@7}(jx8LW52Bn&r!r_ z%(9lq`N95q!ExBE$WMJ))9*i*_+DM|cbNY2O+RwEnxl~lD>z#|ES&xJ2YFfPWV!qP z%h-IC_r~4R_019A4KlAfzFc%DC4yUL<;9@_?23r~L`poAfzw)31jX5m{FfIc=JFfU z+OF;6lVg6~<~nZs!M3F7>m6^0YTr?Vo-QwPXrhvOSD7bZPQI(1V911$H#vunj3kj! zGnh?P)-7& zB;TMAK=~@C^FlV>n*-(BKBG08a*@xW>?fwT%Bs=FP%c{w&XYoemIvi&PUjZ6`{G-rRgWWtPC(ngB%An_5MZiZkZB$ zZBm9XRk&72%M#ceqBR#m0p%v2nLJhK9-i$=V+L25V6aFWuH(u?Y=&F56thT-7#)pk z5n2|&UMA{eC^w;<*RxpDu?u;jp=Ob{&Bb@D3jxKD>&?Y?t=j17|b}YdbYDu>2+Nz z?`-#aLkBLsnxY3rc6CiYEFHK@jg0ph#a!LMB-1+VIi!BkSnShzVqz-cK=GNbDMy!m z=X}}~n^CO&+0gslg(2xT=%^j1||)Xjv4yf{5LX`~|2gGS=j&L7Vxu zD-AWX`?;-~#JWAnAwdqY!4m9n9aYM(Wp0@Yvv7?m^nTnTz@#C@IJyS6NHA%TF^sn3 z7AYo`8t2j;+!BIG=NS3)Fm4IQq>{0IV(U$7fri>h_VEWqhCLG922JNY=G&O4Qd-7i z6`<`Hs^IEu)g}9Ac`owUgyc8w@Gqip?MFnfjy%H~SZ(NCh&hF9IB2Uu6*G16>h^dn zMopr0URsYrQ!(+`<_aXe!7d1PXFgBFoP0Kz=$>~=`;AQ1Cq z3n3+eK=uRnG^Ax9uppG(OzZ7|aQKMFmO@%UL^&i*P;sr?WbaAq*}J1;j$6!UP8K#M zDUG7{=u#!yZf;Y9mGn^l8t+hh`WpLay29swpT7T2__5G$*4Bl!FA(IzpM{gQAtS|} HtUvk>U03pK literal 0 HcmV?d00001 diff --git a/apps/web/public/favicon.svg b/apps/web/public/favicon.svg index 162a2cd..88d7213 100644 --- a/apps/web/public/favicon.svg +++ b/apps/web/public/favicon.svg @@ -1,3 +1,22 @@ -RealFaviconGeneratorhttps://realfavicongenerator.net \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/apps/web/public/icon-192.png b/apps/web/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..487ef8b1abdb7c876a36813bb16e3159f38effa0 GIT binary patch literal 1733 zcmciDi&GOv7y$6^l0yy<$k8fEP`D)E0Hr3SVnK>rYzR?Wq|~VvY!hv0(Mov?_^6tm z5in>>kW!v^|Fh4R}8V&%Fi*=e}G`j!q#5D9RzOgP8V48KYM!jrf+t@(%ukV(L8}F2LG^{RK zm)71u9ZBm>Z0IuLg>KR!6opbYci3P=Z*k(_^|j-#yd92_6}35uxkE!kJL>qthm$v! zb6k|~%$?1nx7mcLSFpnb3_OeG?D%4b{qBYX4;G%zWk8!Q6xkv1EXT$k}%Nt)TDe=Pu!O?<^h}jSO}#lipHMrDGT-_g3P>ta56{zjxMxIYd&O; zN!ac%+Tu(T46b^}msKG8FOgfDi(G`SYTZ!LMjOgxsSblXD+d7@L7-kDjJ16+AT10zEx8y~SG6T^o z8lkW}!*pZ@qU-Rg&cFDs4^V`IbZ;B*JN`gMTRtou7qc#cw)o}=_KizfS2&vHO<;jp ztP9D$O#@gUo^?f`spL9n#cbgJ*f1|>C2Ro2x>d{`k1|IndQ5Z+#1+BI*-&kB&tb?u zr2?mpkt=Z3eZH&}etF3pz^t#DBq>n6i>iYTyIvbXx5;&JbUo*_V3qD2N1lm@DXn#8Ui_(6Z3f zG?Ovzq}GANqa=mRX=MF$%F8FMg%+8)3NuPsO%&apFG^+B`5g!yCVs-3tAi~vXp*We z&|}m0;1sD4FJyl6J6^|hE}}7tn&gv8AtuGVN?0XkjnnCNjmijf{f=%-S5GuXxYq<* zvOtn!J|sB3i7)?$`|kK%Z~g=ftIT%xY0dYOzJIsuUNs2sZN4`)dNlgs@5?{l@Zg7R z_RP&KQ&$3gO7?s#wz7^7sj*O-VTb=-gsb^2e7{h$lIskIJ{-+RX zzuYp54sZqikXV4fDePC7!r~aCg<1{oc$9~P%_F2Hg1W*dZGo69vko)Hv7H3nt`#LQ zR=;B&ru&7EfuTNSim*AEv`U$u`J@Vnk(o(hm4xk# zqP2E|3)(!&QDO5Qg*XLHal7&$eJ$RB`!Y@6hS6H9p&nNDDc{EW%gI2LdsA?AEMt9M zeF1LtDfeRi$z&j$;c{2SF;zt8SYd* z>~7oTn-8Abq1e3IQ~`Q{Ng3m@DKs{~j ztmj?t-fQ8=o0m1>{xSCh7?C~O@-)EHBM%{j{`8lh8vsIEvMp)z%Nu_Ap{;7lsTbTz z!9;CA{$;^n9A6;h%)YWIMAKd>)||*NkE}K0(=>TiU9n^K?5=-SFF(BWrQBa``ZjdG zJFV=?&TH2X4y3wr^A3LXM&(y4Ze_WG{cW}YU=acBY``4J0dFvX>Hhu0|Ct`<1D%!r zYu-D3eWz}>4VLqNVAyoW-xj$2)8b(N#E8n@R%89(Bvkg@w%zJm**$R88(K39=9(UF z(8A1PIYdp^9t;&xz`$Ck268R9qD9`NF2!cxBj1E{{9je7`<4ddR($KT^(*ZUn1cV@ z*8Yzi16G70@9b`+r1I{%?zKKwZZMsxMe$AXBf+aXx(6?x2nKHiEoyz_o!q08Jdeo+ z{3c-B(qDbax!hShP8!fCEp)f7HDQd1X$<3Ub}1!$?lT*Qus8ph6ga(7U3efD@_*c< zZJ$>6Al&9gBZbAQVXHOB?|91Fy=a(}$;@+kjDGcsFL@!~C~|q#kTSwk1E;(2vIXZ1 zuyU#Hwu_H5F5x~7kDQ(nIBi$6bH<@@$Hn%xum@EcK4o~V z`M59HIJB?|(wl!y44m#AS{Mb7Iexn>DP2wHOdLFsACr|cWW~UP_$ph{GeedUo_QaW zwQ$IyxRLSIwxngMH4uu@eSdFndv}T|!v+mn(>5z5g{ll@6OT0q3GRj}LvK3dk-OY& z1ySn4b~@vyjwmGyG^z~5vN-RL{`y_&sg{Owcy9h9!NMad%Ww*N__1o+;iW3tO=7w6 zy0^P&jGEk_fbtAVE?!m7vxdi>?66?rEj8>?CggSRxZ6I`stfNjtbcr!zy2|m$b~G( z`@U969vjm23C?`%oKkXd$at7De}08Ls>Yt_oVlr=JVVARUYhL=#_v*PEPWS|Rf=tY zh05r~IM|o^O*@BhY8fUugE^0?Fuoc@Zd7b943+d{5j%_g6LZuWmY-wzFf7;-qi$?Q zUY*i5K^4zTfZ1+a{S}q}DTe>n2Y>la#rr^qolE_lL>(q z5fM5rTEzHHU-vv5i{@uXA^$z4ts3R;3z2WYTHp>=@}5M|yqcF{!h*{Lsl|cELNUJG z7mi(t*2cPu!p#cMD5dt%|%avf%z-LAM?&=bUaXdLEk3*i!W3)W~({>d4f&g61~^c2IE z#K1}sWm?V|i4>=@xEgg^1Wz$9rR#%JG}2K!&P1cNURhj=x@y5Qo|pcj4<6A-(;PSx ziPm?O#V*v<3XRE}JlAO(!CPN3NP8Im5~f1W|HIo8I1Zj#L6;I6}`_=z~_ik@jD}M>Z&( zu~?zwileYG%*MnFBA4U%&jg8gnp)`hIQ~^Z`X}P`&>xG|T|z#c zFd+=*rFC|R4n`AZJ7Yj=t&mSO;Z%C&@RHFkQL#AmwllFv*(&5y6>UPT%6q|&?iOTn`P_oal7_1q^@#E5rN;kXI$3P zn%^#Z`-0wOkZ1GKfEpt>?y8dLO9l-aqNf!LDD|_b8hx zD+gSz)b#_e2mAZJ>6~d>Uy%)`5g`Nr6%n|2A~*0$cSOm=p#tu`_Jhwh__}TIr!B$X zTB?&XwYX=)oluX z!K&u!3{tKZ3yMM!{*CWY7UpEK(pXLwox%5*yonqlE`94el!G}>veFPvPIU%T@cOci8*a_Vo?TZp9Wtf25wPJ*ijXY z3&(xuqcJ*~PuU937%yGc{GEbFtqHw~aNL61IxJf1|2Y)fLb*%n=o{m8rD0Sg-?|H) zXzsuPmOEKem`dxaO(e z&Qykn9MS-jzjT^NonzVTTr9el`=@P$=P@ylBqZ|VcxkSMnl$UX)KHEzU#+)Q z#o|H+J4fA?)qgDw&Go{8baZt3zTXBjA;6V*icEY_5bj&FQrR4hv@as`uTkb|n|N!FBsj=%Ymh*PP-`Ur2G z;q4?&6D-t{$@y;A+YCS2r8^qwk95T}_)^DFKekM7D~v?%Jl2tehE8A7Fiw8dA~!Jk zsMC}rq9K!YWTBzmm-H|ve`JvtF?kv}bZDT6bo3Yb-`xePAW|E4wpJ-BNv89oBL3WQ%$|iPOg-=47yj9E6|n z9i}hwYZiGelkbv4hdJ4-Asv_6eTNe{`E!feMlFxq^>+>a6w43j&@w47KN59&gx)ON zDDrx4KsMkdFvD2T>9XCXqT30q*YGSgBt8M@>NEBk`$O9gZy`d zl($e`uk0s;&n)s?Ccor%U8g1>l%w|JP*NaTi}AVa615r2{n=3%m&T~kT7S~F!-BlG zgbTSiw#=Vx#JCK0!-%hz`m>`kE{he%!D%|m5aWIebEl4;U)14ik^428 zNy?V<8W8|)MZYXZI^bb`)pu1 zwzq;&GwO~|JJYTIDK@L@NknPH!AyCD8j!+c>Onmhe=pHoron~1&$A|#epMW-`=1n> zRRpy+9&ykj-=KiK5gd{aYPqEQDBvrGOG|DEb!rCvgfK5YOLnTehVvNNyn=O%rk&1E zdmb5|DbG@+nOSlh-ll z{Un`NgWlq+f?lNHtC8@q!-%LHlVmnwrR0sHZkXK%IO*NSRLAHIW3-nHKqN zHQ;d`v9GRS;SUmA7foG>MVYdwI%xcheQg1|^swrnQSIp>i=3)DR*|FY3I3H4lm)%D z6OQf?OLK_Ffi%c`MTUHt&NOcejf?$uNe$RLn!~VZ)A=t{2`XqZy?Ro(plY^4N5khn zgGa5r135I7R@tQ%BA!kNqt}$MMXF9TF6UoL75mgh)LhVzYxJyDpQF%dUuf{$B{X`S znxobkJ&#gyS48A>>=9lj;HVvtHhz&QC)<8b-fr4Nv-7##g0I(GqPGb#Xl!07mO7Lz z0}P{DlBtES){XxIw7;8m literal 0 HcmV?d00001 diff --git a/apps/web/public/icon.svg b/apps/web/public/icon.svg new file mode 100644 index 0000000..88d7213 --- /dev/null +++ b/apps/web/public/icon.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + diff --git a/apps/web/public/site.webmanifest b/apps/web/public/site.webmanifest new file mode 100644 index 0000000..d59cbcf --- /dev/null +++ b/apps/web/public/site.webmanifest @@ -0,0 +1,32 @@ +{ + "name": "Rubis.", + "short_name": "Rubis", + "description": "Vos factures relancées toutes seules pendant que vous travaillez.", + "start_url": "/", + "scope": "/", + "display": "standalone", + "orientation": "portrait", + "lang": "fr-FR", + "theme_color": "#9F1239", + "background_color": "#FAF7F2", + "icons": [ + { + "src": "/icon.svg", + "sizes": "any", + "type": "image/svg+xml", + "purpose": "any" + }, + { + "src": "/icon-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any maskable" + }, + { + "src": "/icon-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any maskable" + } + ] +} diff --git a/apps/web/scripts/generate-icons.mjs b/apps/web/scripts/generate-icons.mjs new file mode 100644 index 0000000..f99cf56 --- /dev/null +++ b/apps/web/scripts/generate-icons.mjs @@ -0,0 +1,36 @@ +/** + * Génère les PNGs d'icône PWA depuis `public/icon.svg`. + * + * Sort : + * - public/icon-192.png (Android mostly, manifest) + * - public/icon-512.png (Android, splashscreen) + * - public/apple-touch-icon.png (iOS, 180×180 — recommandation Apple) + * + * À relancer si on touche au design de la gem : + * pnpm --filter @rubis/web run icons + */ + +import { readFile, writeFile } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' +import { dirname, join } from 'node:path' +import { Resvg } from '@resvg/resvg-js' + +const __dirname = dirname(fileURLToPath(import.meta.url)) +const ROOT = join(__dirname, '..') +const SRC = join(ROOT, 'public/icon.svg') + +async function render(size, out) { + const svg = await readFile(SRC, 'utf-8') + const resvg = new Resvg(svg, { + fitTo: { mode: 'width', value: size }, + background: '#FAF7F2', + }) + const buf = resvg.render().asPng() + const dest = join(ROOT, 'public', out) + await writeFile(dest, buf) + console.log(`✓ ${out} (${size}×${size}, ${buf.byteLength.toLocaleString()} B)`) +} + +await render(192, 'icon-192.png') +await render(512, 'icon-512.png') +await render(180, 'apple-touch-icon.png') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10bf62f..46b4607 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -247,6 +247,9 @@ importers: '@eslint/js': specifier: ^10.0.1 version: 10.0.1(eslint@10.3.0(jiti@2.7.0)) + '@resvg/resvg-js': + specifier: ^2.6.2 + version: 2.6.2 '@tailwindcss/vite': specifier: ^4.1.0 version: 4.2.4(vite@8.0.10(@types/node@24.12.2)(esbuild@0.27.7)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.8.4)) @@ -2001,6 +2004,82 @@ packages: react-redux: optional: true + '@resvg/resvg-js-android-arm-eabi@2.6.2': + resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@resvg/resvg-js-android-arm64@2.6.2': + resolution: {integrity: sha512-VcOKezEhm2VqzXpcIJoITuvUS/fcjIw5NA/w3tjzWyzmvoCdd+QXIqy3FBGulWdClvp4g+IfUemigrkLThSjAQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@resvg/resvg-js-darwin-arm64@2.6.2': + resolution: {integrity: sha512-nmok2LnAd6nLUKI16aEB9ydMC6Lidiiq2m1nEBDR1LaaP7FGs4AJ90qDraxX+CWlVuRlvNjyYJTNv8qFjtL9+A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@resvg/resvg-js-darwin-x64@2.6.2': + resolution: {integrity: sha512-GInyZLjgWDfsVT6+SHxQVRwNzV0AuA1uqGsOAW+0th56J7Nh6bHHKXHBWzUrihxMetcFDmQMAX1tZ1fZDYSRsw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + resolution: {integrity: sha512-YIV3u/R9zJbpqTTNwTZM5/ocWetDKGsro0SWp70eGEM9eV2MerWyBRZnQIgzU3YBnSBQ1RcxRZvY/UxwESfZIw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + resolution: {integrity: sha512-zc2BlJSim7YR4FZDQ8OUoJg5holYzdiYMeobb9pJuGDidGL9KZUv7SbiD4E8oZogtYY42UZEap7dqkkYuA91pg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + resolution: {integrity: sha512-3h3dLPWNgSsD4lQBJPb4f+kvdOSJHa5PjTYVsWHxLUzH4IFTJUAnmuWpw4KqyQ3NA5QCyhw4TWgxk3jRkQxEKg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + resolution: {integrity: sha512-IVUe+ckIerA7xMZ50duAZzwf1U7khQe2E0QpUxu5MBJNao5RqC0zwV/Zm965vw6D3gGFUl7j4m+oJjubBVoftw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + resolution: {integrity: sha512-UOf83vqTzoYQO9SZ0fPl2ZIFtNIz/Rr/y+7X8XRX1ZnBYsQ/tTb+cj9TE+KHOdmlTFBxhYzVkP2lRByCzqi4jQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + resolution: {integrity: sha512-7C/RSgCa+7vqZ7qAbItfiaAWhyRSoD4l4BQAbVDqRRsRgY+S+hgS3in0Rxr7IorKUpGE69X48q6/nOAuTJQxeQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + resolution: {integrity: sha512-har4aPAlvjnLcil40AC77YDIk6loMawuJwFINEM7n0pZviwMkMvjb2W5ZirsNOZY4aDbo5tLx0wNMREp5Brk+w==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + resolution: {integrity: sha512-ZXtYhtUr5SSaBrUDq7DiyjOFJqBVL/dOBN7N/qmi/pO0IgiWW/f/ue3nbvu9joWE5aAKDoIzy/CxsY0suwGosQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@resvg/resvg-js@2.6.2': + resolution: {integrity: sha512-xBaJish5OeGmniDj9cW5PRa/PtmuVU3ziqrbr5xJj901ZDN4TosrVaNZpEiLZAxdfnhAe7uQ7QFWfjPe9d9K2Q==} + engines: {node: '>= 10'} + '@rolldown/binding-android-arm64@1.0.0-rc.17': resolution: {integrity: sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8051,6 +8130,57 @@ snapshots: react: 19.2.5 react-redux: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) + '@resvg/resvg-js-android-arm-eabi@2.6.2': + optional: true + + '@resvg/resvg-js-android-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-arm64@2.6.2': + optional: true + + '@resvg/resvg-js-darwin-x64@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm-gnueabihf@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-arm64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-gnu@2.6.2': + optional: true + + '@resvg/resvg-js-linux-x64-musl@2.6.2': + optional: true + + '@resvg/resvg-js-win32-arm64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-ia32-msvc@2.6.2': + optional: true + + '@resvg/resvg-js-win32-x64-msvc@2.6.2': + optional: true + + '@resvg/resvg-js@2.6.2': + optionalDependencies: + '@resvg/resvg-js-android-arm-eabi': 2.6.2 + '@resvg/resvg-js-android-arm64': 2.6.2 + '@resvg/resvg-js-darwin-arm64': 2.6.2 + '@resvg/resvg-js-darwin-x64': 2.6.2 + '@resvg/resvg-js-linux-arm-gnueabihf': 2.6.2 + '@resvg/resvg-js-linux-arm64-gnu': 2.6.2 + '@resvg/resvg-js-linux-arm64-musl': 2.6.2 + '@resvg/resvg-js-linux-x64-gnu': 2.6.2 + '@resvg/resvg-js-linux-x64-musl': 2.6.2 + '@resvg/resvg-js-win32-arm64-msvc': 2.6.2 + '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 + '@resvg/resvg-js-win32-x64-msvc': 2.6.2 + '@rolldown/binding-android-arm64@1.0.0-rc.17': optional: true