diff --git a/Makefile b/Makefile index 5d365e3..f4e9c05 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,6 @@ generate-svg-variants: @echo "SVG variants have been generated" # Generate PWA cache list -pwa-cache-list: +generate-pwa-cache-list: @echo "Generating PWA cache list..." $(DOCKER_COMPOSE) -f compose.dev.yml run --rm $(CONTAINER_NAME) npm run pwa-cache-list diff --git a/public/data/emblems.json b/public/data/emblems.json index 36162a5..7690e33 100644 --- a/public/data/emblems.json +++ b/public/data/emblems.json @@ -3,6 +3,15 @@ "name": "Escudo De España", "path": "Escudo_de_España.svg", "format": "SVG", - "disable": false + "disable": false, + "tags": [ + "Spain", + "Coat of arms", + "National emblem" + ], + "meta": { + "description": "The coat of arms of Spain, representing the historical kingdoms and the Pillars of Hercules.", + "wikipedia": "https://en.wikipedia.org/wiki/Coat_of_arms_of_Spain" + } } -] \ No newline at end of file +] diff --git a/public/images/pwa-files-to-cache.json b/public/images/pwa-files-to-cache.json deleted file mode 100644 index b9ad7d5..0000000 --- a/public/images/pwa-files-to-cache.json +++ /dev/null @@ -1,1533 +0,0 @@ -[ - "/flags/ad.svg", - "/flags/ae.svg", - "/flags/af.svg", - "/flags/ag.svg", - "/flags/ai.svg", - "/flags/al.svg", - "/flags/am.svg", - "/flags/ao.svg", - "/flags/aq.svg", - "/flags/ar.svg", - "/flags/arab.svg", - "/flags/as.svg", - "/flags/asean.svg", - "/flags/at.svg", - "/flags/au.svg", - "/flags/aw.svg", - "/flags/ax.svg", - "/flags/az.svg", - "/flags/ba.svg", - "/flags/bb.svg", - "/flags/bd.svg", - "/flags/be.svg", - "/flags/bf.svg", - "/flags/bg.svg", - "/flags/bh.svg", - "/flags/bi.svg", - "/flags/bj.svg", - "/flags/bl.svg", - "/flags/bm.svg", - "/flags/bn.svg", - "/flags/bo.svg", - "/flags/bq.svg", - "/flags/br.svg", - "/flags/bs.svg", - "/flags/bt.svg", - "/flags/bv.svg", - "/flags/bw.svg", - "/flags/by.svg", - "/flags/bz.svg", - "/flags/ca.svg", - "/flags/cc.svg", - "/flags/cd.svg", - "/flags/cefta.svg", - "/flags/cf.svg", - "/flags/cg.svg", - "/flags/ch.svg", - "/flags/ci.svg", - "/flags/ck.svg", - "/flags/cl.svg", - "/flags/cm.svg", - "/flags/cn.svg", - "/flags/co.svg", - "/flags/cp.svg", - "/flags/cr.svg", - "/flags/cu.svg", - "/flags/cv.svg", - "/flags/cw.svg", - "/flags/cx.svg", - "/flags/cy.svg", - "/flags/cz.svg", - "/flags/de.svg", - "/flags/dg.svg", - "/flags/dj.svg", - "/flags/dk.svg", - "/flags/dm.svg", - "/flags/do.svg", - "/flags/dz.svg", - "/flags/eac.svg", - "/flags/ec.svg", - "/flags/ee.svg", - "/flags/eg.svg", - "/flags/eh.svg", - "/flags/er.svg", - "/flags/es-ct.svg", - "/flags/es-ga.svg", - "/flags/es-pv.svg", - "/flags/es.svg", - "/flags/et.svg", - "/flags/eu.svg", - "/flags/fi.svg", - "/flags/fj.svg", - "/flags/fk.svg", - "/flags/fm.svg", - "/flags/fo.svg", - "/flags/fr.svg", - "/flags/ga.svg", - "/flags/gb-eng.svg", - "/flags/gb-nir.svg", - "/flags/gb-sct.svg", - "/flags/gb-wls.svg", - "/flags/gb.svg", - "/flags/gd.svg", - "/flags/ge.svg", - "/flags/gf.svg", - "/flags/gg.svg", - "/flags/gh.svg", - "/flags/gi.svg", - "/flags/gl.svg", - "/flags/gm.svg", - "/flags/gn.svg", - "/flags/gp.svg", - "/flags/gq.svg", - "/flags/gr.svg", - "/flags/gs.svg", - "/flags/gt.svg", - "/flags/gu.svg", - "/flags/gw.svg", - "/flags/gy.svg", - "/flags/hk.svg", - "/flags/hm.svg", - "/flags/hn.svg", - "/flags/hr.svg", - "/flags/ht.svg", - "/flags/hu.svg", - "/flags/ic.svg", - "/flags/id.svg", - "/flags/ie.svg", - "/flags/il.svg", - "/flags/im.svg", - "/flags/in.svg", - "/flags/io.svg", - "/flags/iq.svg", - "/flags/ir.svg", - "/flags/is.svg", - "/flags/it.svg", - "/flags/je.svg", - "/flags/jm.svg", - "/flags/jo.svg", - "/flags/jp.svg", - "/flags/ke.svg", - "/flags/kg.svg", - "/flags/kh.svg", - "/flags/ki.svg", - "/flags/km.svg", - "/flags/kn.svg", - "/flags/kp.svg", - "/flags/kr.svg", - "/flags/kw.svg", - "/flags/ky.svg", - "/flags/kz.svg", - "/flags/la.svg", - "/flags/lb.svg", - "/flags/lc.svg", - "/flags/li.svg", - "/flags/lk.svg", - "/flags/lr.svg", - "/flags/ls.svg", - "/flags/lt.svg", - "/flags/lu.svg", - "/flags/lv.svg", - "/flags/ly.svg", - "/flags/ma.svg", - "/flags/mc.svg", - "/flags/md-Chisinau.svg", - "/flags/md.svg", - "/flags/me.svg", - "/flags/mf.svg", - "/flags/mg.svg", - "/flags/mh.svg", - "/flags/mk.svg", - "/flags/ml.svg", - "/flags/mm.svg", - "/flags/mn.svg", - "/flags/mo.svg", - "/flags/mp.svg", - "/flags/mq.svg", - "/flags/mr.svg", - "/flags/ms.svg", - "/flags/mt.svg", - "/flags/mu.svg", - "/flags/mv.svg", - "/flags/mw.svg", - "/flags/mx.svg", - "/flags/my.svg", - "/flags/mz.svg", - "/flags/na.svg", - "/flags/nc.svg", - "/flags/ne.svg", - "/flags/nf.svg", - "/flags/ng.svg", - "/flags/ni.svg", - "/flags/nl.svg", - "/flags/no.svg", - "/flags/np.svg", - "/flags/nr.svg", - "/flags/nu.svg", - "/flags/nz.svg", - "/flags/om.svg", - "/flags/pa.svg", - "/flags/pc.svg", - "/flags/pe.svg", - "/flags/pf.svg", - "/flags/pg.svg", - "/flags/ph.svg", - "/flags/pk.svg", - "/flags/pl.svg", - "/flags/pm.svg", - "/flags/pn.svg", - "/flags/pr.svg", - "/flags/ps.svg", - "/flags/pt.svg", - "/flags/pw.svg", - "/flags/py.svg", - "/flags/qa.svg", - "/flags/re.svg", - "/flags/ro.svg", - "/flags/rs.svg", - "/flags/rw.svg", - "/flags/sa.svg", - "/flags/sb.svg", - "/flags/sc.svg", - "/flags/sd.svg", - "/flags/se.svg", - "/flags/sg.svg", - "/flags/sh-ac.svg", - "/flags/sh-hl.svg", - "/flags/sh-ta.svg", - "/flags/si.svg", - "/flags/sj.svg", - "/flags/sk.svg", - "/flags/sl.svg", - "/flags/sm.svg", - "/flags/sn.svg", - "/flags/so.svg", - "/flags/sr.svg", - "/flags/ss.svg", - "/flags/st.svg", - "/flags/sv.svg", - "/flags/sx.svg", - "/flags/sy.svg", - "/flags/sz.svg", - "/flags/tc.svg", - "/flags/td.svg", - "/flags/tf.svg", - "/flags/tg.svg", - "/flags/th.svg", - "/flags/tj.svg", - "/flags/tk.svg", - "/flags/tl.svg", - "/flags/tm.svg", - "/flags/tn.svg", - "/flags/to.svg", - "/flags/tr.svg", - "/flags/tt.svg", - "/flags/tv.svg", - "/flags/tw.svg", - "/flags/tz.svg", - "/flags/ua-BilaCerkva.svg", - "/flags/ua-Cherkasy.svg", - "/flags/ua-Chernihiv.svg", - "/flags/ua-IvanoFrankivsk.svg", - "/flags/ua-Kyiv.svg", - "/flags/ua-Lutsk.svg", - "/flags/ua-Lviv.svg", - "/flags/ua-Rivne.svg", - "/flags/ua-Ternopil.svg", - "/flags/ua-Uzhhorod.svg", - "/flags/ua-Vinnycia.svg", - "/flags/ua-Zhytomyr.svg", - "/flags/ua.svg", - "/flags/ug.svg", - "/flags/um.svg", - "/flags/un.svg", - "/flags/us.svg", - "/flags/uy.svg", - "/flags/uz.svg", - "/flags/va.svg", - "/flags/vc.svg", - "/flags/ve.svg", - "/flags/vg.svg", - "/flags/vi.svg", - "/flags/vn.svg", - "/flags/vu.svg", - "/flags/wf.svg", - "/flags/ws.svg", - "/flags/xk.svg", - "/flags/ye.svg", - "/flags/yt.svg", - "/flags/za.svg", - "/flags/zm.svg", - "/flags/zw.svg", - "/flags_variants/ad.jpg", - "/flags_variants/ad.png", - "/flags_variants/ae.jpg", - "/flags_variants/ae.png", - "/flags_variants/af.jpg", - "/flags_variants/af.png", - "/flags_variants/ag.jpg", - "/flags_variants/ag.png", - "/flags_variants/ai.jpg", - "/flags_variants/ai.png", - "/flags_variants/al.jpg", - "/flags_variants/al.png", - "/flags_variants/am.jpg", - "/flags_variants/am.png", - "/flags_variants/ao.jpg", - "/flags_variants/ao.png", - "/flags_variants/aq.jpg", - "/flags_variants/aq.png", - "/flags_variants/ar.jpg", - "/flags_variants/ar.png", - "/flags_variants/arab.jpg", - "/flags_variants/arab.png", - "/flags_variants/as.jpg", - "/flags_variants/as.png", - "/flags_variants/asean.jpg", - "/flags_variants/asean.png", - "/flags_variants/at.jpg", - "/flags_variants/at.png", - "/flags_variants/au.jpg", - "/flags_variants/au.png", - "/flags_variants/aw.jpg", - "/flags_variants/aw.png", - "/flags_variants/ax.jpg", - "/flags_variants/ax.png", - "/flags_variants/az.jpg", - "/flags_variants/az.png", - "/flags_variants/ba.jpg", - "/flags_variants/ba.png", - "/flags_variants/bb.jpg", - "/flags_variants/bb.png", - "/flags_variants/bd.jpg", - "/flags_variants/bd.png", - "/flags_variants/be.jpg", - "/flags_variants/be.png", - "/flags_variants/bf.jpg", - "/flags_variants/bf.png", - "/flags_variants/bg.jpg", - "/flags_variants/bg.png", - "/flags_variants/bh.jpg", - "/flags_variants/bh.png", - "/flags_variants/bi.jpg", - "/flags_variants/bi.png", - "/flags_variants/bj.jpg", - "/flags_variants/bj.png", - "/flags_variants/bl.jpg", - "/flags_variants/bl.png", - "/flags_variants/bm.jpg", - "/flags_variants/bm.png", - "/flags_variants/bn.jpg", - "/flags_variants/bn.png", - "/flags_variants/bo.jpg", - "/flags_variants/bo.png", - "/flags_variants/bq.jpg", - "/flags_variants/bq.png", - "/flags_variants/br.jpg", - "/flags_variants/br.png", - "/flags_variants/bs.jpg", - "/flags_variants/bs.png", - "/flags_variants/bt.jpg", - "/flags_variants/bt.png", - "/flags_variants/bv.jpg", - "/flags_variants/bv.png", - "/flags_variants/bw.jpg", - "/flags_variants/bw.png", - "/flags_variants/by.jpg", - "/flags_variants/by.png", - "/flags_variants/bz.jpg", - "/flags_variants/bz.png", - "/flags_variants/ca.jpg", - "/flags_variants/ca.png", - "/flags_variants/cc.jpg", - "/flags_variants/cc.png", - "/flags_variants/cd.jpg", - "/flags_variants/cd.png", - "/flags_variants/cefta.jpg", - "/flags_variants/cefta.png", - "/flags_variants/cf.jpg", - "/flags_variants/cf.png", - "/flags_variants/cg.jpg", - "/flags_variants/cg.png", - "/flags_variants/ch.jpg", - "/flags_variants/ch.png", - "/flags_variants/ci.jpg", - "/flags_variants/ci.png", - "/flags_variants/ck.jpg", - "/flags_variants/ck.png", - "/flags_variants/cl.jpg", - "/flags_variants/cl.png", - "/flags_variants/cm.jpg", - "/flags_variants/cm.png", - "/flags_variants/cn.jpg", - "/flags_variants/cn.png", - "/flags_variants/co.jpg", - "/flags_variants/co.png", - "/flags_variants/cp.jpg", - "/flags_variants/cp.png", - "/flags_variants/cr.jpg", - "/flags_variants/cr.png", - "/flags_variants/cu.jpg", - "/flags_variants/cu.png", - "/flags_variants/cv.jpg", - "/flags_variants/cv.png", - "/flags_variants/cw.jpg", - "/flags_variants/cw.png", - "/flags_variants/cx.jpg", - "/flags_variants/cx.png", - "/flags_variants/cy.jpg", - "/flags_variants/cy.png", - "/flags_variants/cz.jpg", - "/flags_variants/cz.png", - "/flags_variants/de.jpg", - "/flags_variants/de.png", - "/flags_variants/dg.jpg", - "/flags_variants/dg.png", - "/flags_variants/dj.jpg", - "/flags_variants/dj.png", - "/flags_variants/dk.jpg", - "/flags_variants/dk.png", - "/flags_variants/dm.jpg", - "/flags_variants/dm.png", - "/flags_variants/do.jpg", - "/flags_variants/do.png", - "/flags_variants/dz.jpg", - "/flags_variants/dz.png", - "/flags_variants/eac.jpg", - "/flags_variants/eac.png", - "/flags_variants/ec.jpg", - "/flags_variants/ec.png", - "/flags_variants/ee.jpg", - "/flags_variants/ee.png", - "/flags_variants/eg.jpg", - "/flags_variants/eg.png", - "/flags_variants/eh.jpg", - "/flags_variants/eh.png", - "/flags_variants/er.jpg", - "/flags_variants/er.png", - "/flags_variants/es-ct.jpg", - "/flags_variants/es-ct.png", - "/flags_variants/es-ga.jpg", - "/flags_variants/es-ga.png", - "/flags_variants/es-pv.jpg", - "/flags_variants/es-pv.png", - "/flags_variants/es.jpg", - "/flags_variants/es.png", - "/flags_variants/et.jpg", - "/flags_variants/et.png", - "/flags_variants/eu.jpg", - "/flags_variants/eu.png", - "/flags_variants/fi.jpg", - "/flags_variants/fi.png", - "/flags_variants/fj.jpg", - "/flags_variants/fj.png", - "/flags_variants/fk.jpg", - "/flags_variants/fk.png", - "/flags_variants/fm.jpg", - "/flags_variants/fm.png", - "/flags_variants/fo.jpg", - "/flags_variants/fo.png", - "/flags_variants/fr.jpg", - "/flags_variants/fr.png", - "/flags_variants/ga.jpg", - "/flags_variants/ga.png", - "/flags_variants/gb-eng.jpg", - "/flags_variants/gb-eng.png", - "/flags_variants/gb-nir.jpg", - "/flags_variants/gb-nir.png", - "/flags_variants/gb-sct.jpg", - "/flags_variants/gb-sct.png", - "/flags_variants/gb-wls.jpg", - "/flags_variants/gb-wls.png", - "/flags_variants/gb.jpg", - "/flags_variants/gb.png", - "/flags_variants/gd.jpg", - "/flags_variants/gd.png", - "/flags_variants/ge.jpg", - "/flags_variants/ge.png", - "/flags_variants/gf.jpg", - "/flags_variants/gf.png", - "/flags_variants/gg.jpg", - "/flags_variants/gg.png", - "/flags_variants/gh.jpg", - "/flags_variants/gh.png", - "/flags_variants/gi.jpg", - "/flags_variants/gi.png", - "/flags_variants/gl.jpg", - "/flags_variants/gl.png", - "/flags_variants/gm.jpg", - "/flags_variants/gm.png", - "/flags_variants/gn.jpg", - "/flags_variants/gn.png", - "/flags_variants/gp.jpg", - "/flags_variants/gp.png", - "/flags_variants/gq.jpg", - "/flags_variants/gq.png", - "/flags_variants/gr.jpg", - "/flags_variants/gr.png", - "/flags_variants/gs.jpg", - "/flags_variants/gs.png", - "/flags_variants/gt.jpg", - "/flags_variants/gt.png", - "/flags_variants/gu.jpg", - "/flags_variants/gu.png", - "/flags_variants/gw.jpg", - "/flags_variants/gw.png", - "/flags_variants/gy.jpg", - "/flags_variants/gy.png", - "/flags_variants/hk.jpg", - "/flags_variants/hk.png", - "/flags_variants/hm.jpg", - "/flags_variants/hm.png", - "/flags_variants/hn.jpg", - "/flags_variants/hn.png", - "/flags_variants/hr.jpg", - "/flags_variants/hr.png", - "/flags_variants/ht.jpg", - "/flags_variants/ht.png", - "/flags_variants/hu.jpg", - "/flags_variants/hu.png", - "/flags_variants/ic.jpg", - "/flags_variants/ic.png", - "/flags_variants/id.jpg", - "/flags_variants/id.png", - "/flags_variants/ie.jpg", - "/flags_variants/ie.png", - "/flags_variants/il.jpg", - "/flags_variants/il.png", - "/flags_variants/im.jpg", - "/flags_variants/im.png", - "/flags_variants/in.jpg", - "/flags_variants/in.png", - "/flags_variants/io.jpg", - "/flags_variants/io.png", - "/flags_variants/iq.jpg", - "/flags_variants/iq.png", - "/flags_variants/ir.jpg", - "/flags_variants/ir.png", - "/flags_variants/is.jpg", - "/flags_variants/is.png", - "/flags_variants/it.jpg", - "/flags_variants/it.png", - "/flags_variants/je.jpg", - "/flags_variants/je.png", - "/flags_variants/jm.jpg", - "/flags_variants/jm.png", - "/flags_variants/jo.jpg", - "/flags_variants/jo.png", - "/flags_variants/jp.jpg", - "/flags_variants/jp.png", - "/flags_variants/ke.jpg", - "/flags_variants/ke.png", - "/flags_variants/kg.jpg", - "/flags_variants/kg.png", - "/flags_variants/kh.jpg", - "/flags_variants/kh.png", - "/flags_variants/ki.jpg", - "/flags_variants/ki.png", - "/flags_variants/km.jpg", - "/flags_variants/km.png", - "/flags_variants/kn.jpg", - "/flags_variants/kn.png", - "/flags_variants/kp.jpg", - "/flags_variants/kp.png", - "/flags_variants/kr.jpg", - "/flags_variants/kr.png", - "/flags_variants/kw.jpg", - "/flags_variants/kw.png", - "/flags_variants/ky.jpg", - "/flags_variants/ky.png", - "/flags_variants/kz.jpg", - "/flags_variants/kz.png", - "/flags_variants/la.jpg", - "/flags_variants/la.png", - "/flags_variants/lb.jpg", - "/flags_variants/lb.png", - "/flags_variants/lc.jpg", - "/flags_variants/lc.png", - "/flags_variants/li.jpg", - "/flags_variants/li.png", - "/flags_variants/lk.jpg", - "/flags_variants/lk.png", - "/flags_variants/lr.jpg", - "/flags_variants/lr.png", - "/flags_variants/ls.jpg", - "/flags_variants/ls.png", - "/flags_variants/lt.jpg", - "/flags_variants/lt.png", - "/flags_variants/lu.jpg", - "/flags_variants/lu.png", - "/flags_variants/lv.jpg", - "/flags_variants/lv.png", - "/flags_variants/ly.jpg", - "/flags_variants/ly.png", - "/flags_variants/ma.jpg", - "/flags_variants/ma.png", - "/flags_variants/mc.jpg", - "/flags_variants/mc.png", - "/flags_variants/md-Chisinau.jpg", - "/flags_variants/md-Chisinau.png", - "/flags_variants/md.jpg", - "/flags_variants/md.png", - "/flags_variants/me.jpg", - "/flags_variants/me.png", - "/flags_variants/mf.jpg", - "/flags_variants/mf.png", - "/flags_variants/mg.jpg", - "/flags_variants/mg.png", - "/flags_variants/mh.jpg", - "/flags_variants/mh.png", - "/flags_variants/mk.jpg", - "/flags_variants/mk.png", - "/flags_variants/ml.jpg", - "/flags_variants/ml.png", - "/flags_variants/mm.jpg", - "/flags_variants/mm.png", - "/flags_variants/mn.jpg", - "/flags_variants/mn.png", - "/flags_variants/mo.jpg", - "/flags_variants/mo.png", - "/flags_variants/mp.jpg", - "/flags_variants/mp.png", - "/flags_variants/mq.jpg", - "/flags_variants/mq.png", - "/flags_variants/mr.jpg", - "/flags_variants/mr.png", - "/flags_variants/ms.jpg", - "/flags_variants/ms.png", - "/flags_variants/mt.jpg", - "/flags_variants/mt.png", - "/flags_variants/mu.jpg", - "/flags_variants/mu.png", - "/flags_variants/mv.jpg", - "/flags_variants/mv.png", - "/flags_variants/mw.jpg", - "/flags_variants/mw.png", - "/flags_variants/mx.jpg", - "/flags_variants/mx.png", - "/flags_variants/my.jpg", - "/flags_variants/my.png", - "/flags_variants/mz.jpg", - "/flags_variants/mz.png", - "/flags_variants/na.jpg", - "/flags_variants/na.png", - "/flags_variants/nc.jpg", - "/flags_variants/nc.png", - "/flags_variants/ne.jpg", - "/flags_variants/ne.png", - "/flags_variants/nf.jpg", - "/flags_variants/nf.png", - "/flags_variants/ng.jpg", - "/flags_variants/ng.png", - "/flags_variants/ni.jpg", - "/flags_variants/ni.png", - "/flags_variants/nl.jpg", - "/flags_variants/nl.png", - "/flags_variants/no.jpg", - "/flags_variants/no.png", - "/flags_variants/np.jpg", - "/flags_variants/np.png", - "/flags_variants/nr.jpg", - "/flags_variants/nr.png", - "/flags_variants/nu.jpg", - "/flags_variants/nu.png", - "/flags_variants/nz.jpg", - "/flags_variants/nz.png", - "/flags_variants/om.jpg", - "/flags_variants/om.png", - "/flags_variants/pa.jpg", - "/flags_variants/pa.png", - "/flags_variants/pc.jpg", - "/flags_variants/pc.png", - "/flags_variants/pe.jpg", - "/flags_variants/pe.png", - "/flags_variants/pf.jpg", - "/flags_variants/pf.png", - "/flags_variants/pg.jpg", - "/flags_variants/pg.png", - "/flags_variants/ph.jpg", - "/flags_variants/ph.png", - "/flags_variants/pk.jpg", - "/flags_variants/pk.png", - "/flags_variants/pl.jpg", - "/flags_variants/pl.png", - "/flags_variants/pm.jpg", - "/flags_variants/pm.png", - "/flags_variants/pn.jpg", - "/flags_variants/pn.png", - "/flags_variants/pr.jpg", - "/flags_variants/pr.png", - "/flags_variants/ps.jpg", - "/flags_variants/ps.png", - "/flags_variants/pt.jpg", - "/flags_variants/pt.png", - "/flags_variants/pw.jpg", - "/flags_variants/pw.png", - "/flags_variants/py.jpg", - "/flags_variants/py.png", - "/flags_variants/qa.jpg", - "/flags_variants/qa.png", - "/flags_variants/re.jpg", - "/flags_variants/re.png", - "/flags_variants/ro.jpg", - "/flags_variants/ro.png", - "/flags_variants/rs.jpg", - "/flags_variants/rs.png", - "/flags_variants/rw.jpg", - "/flags_variants/rw.png", - "/flags_variants/sa.jpg", - "/flags_variants/sa.png", - "/flags_variants/sb.jpg", - "/flags_variants/sb.png", - "/flags_variants/sc.jpg", - "/flags_variants/sc.png", - "/flags_variants/sd.jpg", - "/flags_variants/sd.png", - "/flags_variants/se.jpg", - "/flags_variants/se.png", - "/flags_variants/sg.jpg", - "/flags_variants/sg.png", - "/flags_variants/sh-ac.jpg", - "/flags_variants/sh-ac.png", - "/flags_variants/sh-hl.jpg", - "/flags_variants/sh-hl.png", - "/flags_variants/sh-ta.jpg", - "/flags_variants/sh-ta.png", - "/flags_variants/si.jpg", - "/flags_variants/si.png", - "/flags_variants/sj.jpg", - "/flags_variants/sj.png", - "/flags_variants/sk.jpg", - "/flags_variants/sk.png", - "/flags_variants/sl.jpg", - "/flags_variants/sl.png", - "/flags_variants/sm.jpg", - "/flags_variants/sm.png", - "/flags_variants/sn.jpg", - "/flags_variants/sn.png", - "/flags_variants/so.jpg", - "/flags_variants/so.png", - "/flags_variants/sr.jpg", - "/flags_variants/sr.png", - "/flags_variants/ss.jpg", - "/flags_variants/ss.png", - "/flags_variants/st.jpg", - "/flags_variants/st.png", - "/flags_variants/sv.jpg", - "/flags_variants/sv.png", - "/flags_variants/sx.jpg", - "/flags_variants/sx.png", - "/flags_variants/sy.jpg", - "/flags_variants/sy.png", - "/flags_variants/sz.jpg", - "/flags_variants/sz.png", - "/flags_variants/tc.jpg", - "/flags_variants/tc.png", - "/flags_variants/td.jpg", - "/flags_variants/td.png", - "/flags_variants/tf.jpg", - "/flags_variants/tf.png", - "/flags_variants/tg.jpg", - "/flags_variants/tg.png", - "/flags_variants/th.jpg", - "/flags_variants/th.png", - "/flags_variants/tj.jpg", - "/flags_variants/tj.png", - "/flags_variants/tk.jpg", - "/flags_variants/tk.png", - "/flags_variants/tl.jpg", - "/flags_variants/tl.png", - "/flags_variants/tm.jpg", - "/flags_variants/tm.png", - "/flags_variants/tn.jpg", - "/flags_variants/tn.png", - "/flags_variants/to.jpg", - "/flags_variants/to.png", - "/flags_variants/tr.jpg", - "/flags_variants/tr.png", - "/flags_variants/tt.jpg", - "/flags_variants/tt.png", - "/flags_variants/tv.jpg", - "/flags_variants/tv.png", - "/flags_variants/tw.jpg", - "/flags_variants/tw.png", - "/flags_variants/tz.jpg", - "/flags_variants/tz.png", - "/flags_variants/ua-BilaCerkva.jpg", - "/flags_variants/ua-BilaCerkva.png", - "/flags_variants/ua-Cherkasy.jpg", - "/flags_variants/ua-Cherkasy.png", - "/flags_variants/ua-Chernihiv.jpg", - "/flags_variants/ua-Chernihiv.png", - "/flags_variants/ua-IvanoFrankivsk.jpg", - "/flags_variants/ua-IvanoFrankivsk.png", - "/flags_variants/ua-Kyiv.jpg", - "/flags_variants/ua-Kyiv.png", - "/flags_variants/ua-Lutsk.jpg", - "/flags_variants/ua-Lutsk.png", - "/flags_variants/ua-Lviv.jpg", - "/flags_variants/ua-Lviv.png", - "/flags_variants/ua-Ternopil.jpg", - "/flags_variants/ua-Ternopil.png", - "/flags_variants/ua-Uzhhorod.jpg", - "/flags_variants/ua-Uzhhorod.png", - "/flags_variants/ua-Vinnycia.jpg", - "/flags_variants/ua-Vinnycia.png", - "/flags_variants/ua-Zhytomyr.jpg", - "/flags_variants/ua-Zhytomyr.png", - "/flags_variants/ua.jpg", - "/flags_variants/ua.png", - "/flags_variants/ug.jpg", - "/flags_variants/ug.png", - "/flags_variants/um.jpg", - "/flags_variants/um.png", - "/flags_variants/un.jpg", - "/flags_variants/un.png", - "/flags_variants/us.jpg", - "/flags_variants/us.png", - "/flags_variants/uy.jpg", - "/flags_variants/uy.png", - "/flags_variants/uz.jpg", - "/flags_variants/uz.png", - "/flags_variants/va.jpg", - "/flags_variants/va.png", - "/flags_variants/vc.jpg", - "/flags_variants/vc.png", - "/flags_variants/ve.jpg", - "/flags_variants/ve.png", - "/flags_variants/vg.jpg", - "/flags_variants/vg.png", - "/flags_variants/vi.jpg", - "/flags_variants/vi.png", - "/flags_variants/vn.jpg", - "/flags_variants/vn.png", - "/flags_variants/vu.jpg", - "/flags_variants/vu.png", - "/flags_variants/wf.jpg", - "/flags_variants/wf.png", - "/flags_variants/ws.jpg", - "/flags_variants/ws.png", - "/flags_variants/xk.jpg", - "/flags_variants/xk.png", - "/flags_variants/ye.jpg", - "/flags_variants/ye.png", - "/flags_variants/yt.jpg", - "/flags_variants/yt.png", - "/flags_variants/za.jpg", - "/flags_variants/za.png", - "/flags_variants/zm.jpg", - "/flags_variants/zm.png", - "/flags_variants/zw.jpg", - "/flags_variants/zw.png", - "/logos/1password.svg", - "/logos/adguard-logo.svg", - "/logos/adguard.svg", - "/logos/adidas.svg", - "/logos/affinity-designer.svg", - "/logos/affinity-photo.svg", - "/logos/affinity-publisher.svg", - "/logos/amazon.svg", - "/logos/android-auto.svg", - "/logos/apache.svg", - "/logos/apple.svg", - "/logos/apple_app_store.svg", - "/logos/apple_books.svg", - "/logos/apple_homekit.svg", - "/logos/apple_icloud.svg", - "/logos/apple_music.svg", - "/logos/arm.svg", - "/logos/atb.svg", - "/logos/authentik-logo.svg", - "/logos/authentik.svg", - "/logos/binance.svg", - "/logos/bitcoin.svg", - "/logos/bitwarden.svg", - "/logos/bluesky.svg", - "/logos/bmw.svg", - "/logos/bvr.svg", - "/logos/chromium.svg", - "/logos/coca-cola.svg", - "/logos/dalnoboy-service.svg", - "/logos/debian.svg", - "/logos/digital-ocean.svg", - "/logos/disney.svg", - "/logos/docker-icon.svg", - "/logos/docker.svg", - "/logos/dockge.svg", - "/logos/dodge.svg", - "/logos/duckduckgo.svg", - "/logos/enpass.svg", - "/logos/eufy.svg", - "/logos/facebook-messenger.svg", - "/logos/fastapi-logo.svg", - "/logos/fedora.svg", - "/logos/fedora_logo.svg", - "/logos/fiat.svg", - "/logos/firefox.svg", - "/logos/ford.svg", - "/logos/forgejo.svg", - "/logos/freebsd.svg", - "/logos/frigate-logo.svg", - "/logos/git.svg", - "/logos/gitea.svg", - "/logos/github-logo.svg", - "/logos/github.svg", - "/logos/gitlab-logo.svg", - "/logos/gitlab.svg", - "/logos/gmail.svg", - "/logos/go.dev.svg", - "/logos/google-cloud.svg", - "/logos/google-drive.svg", - "/logos/google-fit.svg", - "/logos/google-home.svg", - "/logos/google-maps.svg", - "/logos/google-meet.svg", - "/logos/google-photos.svg", - "/logos/google-play-icon.svg", - "/logos/google.svg", - "/logos/google_chrome.svg", - "/logos/google_chrome_icon.svg", - "/logos/grafana.svg", - "/logos/graphql.svg", - "/logos/guinness.svg", - "/logos/homarr.svg", - "/logos/home-assistant-logo.svg", - "/logos/home-assistant.svg", - "/logos/homebridge.svg", - "/logos/honda.svg", - "/logos/ibkr.svg", - "/logos/immich.svg", - "/logos/influxdb-logo.svg", - "/logos/influxdb.svg", - "/logos/jeep.svg", - "/logos/jellyfin.svg", - "/logos/jägermeister.svg", - "/logos/kubernetes.svg", - "/logos/kyivstar.svg", - "/logos/languagetool.svg", - "/logos/laravel-logo.svg", - "/logos/laravel.svg", - "/logos/lego.svg", - "/logos/letsencrypt-logo.svg", - "/logos/letsencrypt.svg", - "/logos/lg.svg", - "/logos/lifecell.svg", - "/logos/lifecell_logo.svg", - "/logos/linux-mint.svg", - "/logos/linux-tux.svg", - "/logos/mariadb-icon.svg", - "/logos/mariadb.svg", - "/logos/mastercard.svg", - "/logos/matter-icon.svg", - "/logos/matter.svg", - "/logos/mattermost-icon.svg", - "/logos/mattermost-line.svg", - "/logos/mattermost.svg", - "/logos/mcdonalds.svg", - "/logos/meest.svg", - "/logos/meta-facebook.svg", - "/logos/meta-icon.svg", - "/logos/meta-instagram.svg", - "/logos/meta-threads.svg", - "/logos/meta-whatsapp-icon.svg", - "/logos/meta.svg", - "/logos/microsoft-azure.svg", - "/logos/microsoft-edge.svg", - "/logos/microsoft-linkedin-icon.svg", - "/logos/microsoft-linkedin.svg", - "/logos/microsoft-onedrive.svg", - "/logos/microsoft-teams.svg", - "/logos/microsoft-windows-icon.svg", - "/logos/microsoft-windows.svg", - "/logos/microsoft.svg", - "/logos/microsoft_office_outlook.svg", - "/logos/microsoft_outlook.svg", - "/logos/mikrotik.svg", - "/logos/mikrotik_logo.svg", - "/logos/mongodb.svg", - "/logos/mono.svg", - "/logos/monobank_paw.svg", - "/logos/monobank_text.svg", - "/logos/mqtt.svg", - "/logos/mysql-icon.svg", - "/logos/mysql.svg", - "/logos/namecheap.svg", - "/logos/nationwide.svg", - "/logos/neo4j.svg", - "/logos/neocom.svg", - "/logos/netflix.svg", - "/logos/nikamebel.svg", - "/logos/nova_global.svg", - "/logos/nova_post.svg", - "/logos/novapay.svg", - "/logos/nvidia.svg", - "/logos/nvidia_vertical.svg", - "/logos/okko.svg", - "/logos/openai-icon.svg", - "/logos/openvpn.svg", - "/logos/opera.svg", - "/logos/paypal.svg", - "/logos/pepsi.svg", - "/logos/pepsi_2014-2023.svg", - "/logos/php.svg", - "/logos/postgresql.svg", - "/logos/privat24.svg", - "/logos/privat24bussiness.svg", - "/logos/privatbank.svg", - "/logos/privatbank_logo.svg", - "/logos/puma.svg", - "/logos/pumb.svg", - "/logos/python-logo.svg", - "/logos/python.svg", - "/logos/rabbitmq-logo.svg", - "/logos/rabbitmq.svg", - "/logos/raspberry-pi.svg", - "/logos/react.svg", - "/logos/reddit-icon.svg", - "/logos/redis-logo.svg", - "/logos/redis.svg", - "/logos/reebok.svg", - "/logos/reolink.svg", - "/logos/revolut.svg", - "/logos/roomerin.svg", - "/logos/sainsburys.svg", - "/logos/samsung.svg", - "/logos/sendpulse.svg", - "/logos/sendpulse_logo.svg", - "/logos/shadoll.svg", - "/logos/shkafnik.svg", - "/logos/shkafnik_logo.svg", - "/logos/siemens.svg", - "/logos/signal-logo.svg", - "/logos/signal.svg", - "/logos/silpo.svg", - "/logos/skechers.svg", - "/logos/slack.svg", - "/logos/slzb.svg", - "/logos/spotify-icon.svg", - "/logos/spotify.svg", - "/logos/stackoverflow-icon.svg", - "/logos/stackoverflow.svg", - "/logos/starbucks.svg", - "/logos/suzuki.svg", - "/logos/suzuki_vertical.svg", - "/logos/svelte-icon.svg", - "/logos/swagger.svg", - "/logos/swift.svg", - "/logos/tesla.svg", - "/logos/thread-net.svg", - "/logos/toyota.svg", - "/logos/toyota_logo.svg", - "/logos/traefik-logo.svg", - "/logos/traefik-proxy-logo.svg", - "/logos/traefik-proxy.svg", - "/logos/trakt.svg", - "/logos/ubuntu-logo.svg", - "/logos/ubuntu.svg", - "/logos/ukrnet.svg", - "/logos/ukrposhta.svg", - "/logos/unifi.svg", - "/logos/uptimekuma.svg", - "/logos/viber.svg", - "/logos/vintage.svg", - "/logos/visa.svg", - "/logos/visual-studio-code.svg", - "/logos/vodafone.svg", - "/logos/vue.svg", - "/logos/webhooks.svg", - "/logos/webkit.svg", - "/logos/webtorrent.svg", - "/logos/wifi.svg", - "/logos/wireguard.svg", - "/logos/wise-icon.svg", - "/logos/wise.svg", - "/logos/wog.svg", - "/logos/yahoo.svg", - "/logos/yahoo_logo.svg", - "/logos/yahoo_mail.svg", - "/logos/youtube.svg", - "/logos/zigbee2mqtt.svg", - "/logos/zoom-icon.svg", - "/logos/zoom.svg", - "/logos_variants/1password.jpg", - "/logos_variants/1password.png", - "/logos_variants/adguard-logo.jpg", - "/logos_variants/adguard-logo.png", - "/logos_variants/adguard.jpg", - "/logos_variants/adguard.png", - "/logos_variants/adidas.jpg", - "/logos_variants/adidas.png", - "/logos_variants/affinity-designer.jpg", - "/logos_variants/affinity-designer.png", - "/logos_variants/affinity-photo.jpg", - "/logos_variants/affinity-photo.png", - "/logos_variants/affinity-publisher.jpg", - "/logos_variants/affinity-publisher.png", - "/logos_variants/amazon.jpg", - "/logos_variants/amazon.png", - "/logos_variants/android-auto.jpg", - "/logos_variants/android-auto.png", - "/logos_variants/apache.jpg", - "/logos_variants/apache.png", - "/logos_variants/apple.jpg", - "/logos_variants/apple.png", - "/logos_variants/apple_app_store.jpg", - "/logos_variants/apple_app_store.png", - "/logos_variants/apple_books.jpg", - "/logos_variants/apple_books.png", - "/logos_variants/apple_homekit.jpg", - "/logos_variants/apple_homekit.png", - "/logos_variants/apple_icloud.jpg", - "/logos_variants/apple_icloud.png", - "/logos_variants/apple_music.jpg", - "/logos_variants/apple_music.png", - "/logos_variants/arm.jpg", - "/logos_variants/arm.png", - "/logos_variants/atb.jpg", - "/logos_variants/atb.png", - "/logos_variants/authentik-logo.jpg", - "/logos_variants/authentik-logo.png", - "/logos_variants/authentik.jpg", - "/logos_variants/authentik.png", - "/logos_variants/binance.jpg", - "/logos_variants/binance.png", - "/logos_variants/bitcoin.jpg", - "/logos_variants/bitcoin.png", - "/logos_variants/bitwarden.jpg", - "/logos_variants/bitwarden.png", - "/logos_variants/bluesky.jpg", - "/logos_variants/bluesky.png", - "/logos_variants/bmw.jpg", - "/logos_variants/bmw.png", - "/logos_variants/bvr.jpg", - "/logos_variants/bvr.png", - "/logos_variants/chromium.jpg", - "/logos_variants/chromium.png", - "/logos_variants/coca-cola.jpg", - "/logos_variants/coca-cola.png", - "/logos_variants/dalnoboy-service.jpg", - "/logos_variants/dalnoboy-service.png", - "/logos_variants/debian.jpg", - "/logos_variants/debian.png", - "/logos_variants/digital-ocean.jpg", - "/logos_variants/digital-ocean.png", - "/logos_variants/disney.jpg", - "/logos_variants/disney.png", - "/logos_variants/docker-icon.jpg", - "/logos_variants/docker-icon.png", - "/logos_variants/docker.jpg", - "/logos_variants/docker.png", - "/logos_variants/dockge.jpg", - "/logos_variants/dockge.png", - "/logos_variants/dodge.jpg", - "/logos_variants/dodge.png", - "/logos_variants/duckduckgo.jpg", - "/logos_variants/duckduckgo.png", - "/logos_variants/enpass.jpg", - "/logos_variants/enpass.png", - "/logos_variants/eufy.jpg", - "/logos_variants/eufy.png", - "/logos_variants/facebook-messenger.jpg", - "/logos_variants/facebook-messenger.png", - "/logos_variants/fastapi-logo.jpg", - "/logos_variants/fastapi-logo.png", - "/logos_variants/fedora.jpg", - "/logos_variants/fedora.png", - "/logos_variants/fedora_logo.jpg", - "/logos_variants/fedora_logo.png", - "/logos_variants/fiat.jpg", - "/logos_variants/fiat.png", - "/logos_variants/firefox.jpg", - "/logos_variants/firefox.png", - "/logos_variants/ford.jpg", - "/logos_variants/ford.png", - "/logos_variants/forgejo.jpg", - "/logos_variants/forgejo.png", - "/logos_variants/freebsd.jpg", - "/logos_variants/freebsd.png", - "/logos_variants/frigate-logo.jpg", - "/logos_variants/frigate-logo.png", - "/logos_variants/git.jpg", - "/logos_variants/git.png", - "/logos_variants/gitea.jpg", - "/logos_variants/gitea.png", - "/logos_variants/github-logo.jpg", - "/logos_variants/github-logo.png", - "/logos_variants/github.jpg", - "/logos_variants/github.png", - "/logos_variants/gitlab-logo.jpg", - "/logos_variants/gitlab-logo.png", - "/logos_variants/gitlab.jpg", - "/logos_variants/gitlab.png", - "/logos_variants/gmail.jpg", - "/logos_variants/gmail.png", - "/logos_variants/go.dev.jpg", - "/logos_variants/go.dev.png", - "/logos_variants/google-cloud.jpg", - "/logos_variants/google-cloud.png", - "/logos_variants/google-drive.jpg", - "/logos_variants/google-drive.png", - "/logos_variants/google-fit.jpg", - "/logos_variants/google-fit.png", - "/logos_variants/google-home.jpg", - "/logos_variants/google-home.png", - "/logos_variants/google-maps.jpg", - "/logos_variants/google-maps.png", - "/logos_variants/google-meet.jpg", - "/logos_variants/google-meet.png", - "/logos_variants/google-photos.jpg", - "/logos_variants/google-photos.png", - "/logos_variants/google-play-icon.jpg", - "/logos_variants/google-play-icon.png", - "/logos_variants/google.jpg", - "/logos_variants/google.png", - "/logos_variants/google_chrome.jpg", - "/logos_variants/google_chrome.png", - "/logos_variants/google_chrome_icon.jpg", - "/logos_variants/google_chrome_icon.png", - "/logos_variants/grafana.jpg", - "/logos_variants/grafana.png", - "/logos_variants/graphql.jpg", - "/logos_variants/graphql.png", - "/logos_variants/guinness.jpg", - "/logos_variants/guinness.png", - "/logos_variants/homarr.jpg", - "/logos_variants/homarr.png", - "/logos_variants/home-assistant-logo.jpg", - "/logos_variants/home-assistant-logo.png", - "/logos_variants/home-assistant.jpg", - "/logos_variants/home-assistant.png", - "/logos_variants/homebridge.jpg", - "/logos_variants/homebridge.png", - "/logos_variants/honda.jpg", - "/logos_variants/honda.png", - "/logos_variants/ibkr.jpg", - "/logos_variants/ibkr.png", - "/logos_variants/immich.jpg", - "/logos_variants/immich.png", - "/logos_variants/influxdb-logo.jpg", - "/logos_variants/influxdb-logo.png", - "/logos_variants/influxdb.jpg", - "/logos_variants/influxdb.png", - "/logos_variants/jeep.jpg", - "/logos_variants/jeep.png", - "/logos_variants/jellyfin.jpg", - "/logos_variants/jellyfin.png", - "/logos_variants/jägermeister.jpg", - "/logos_variants/jägermeister.png", - "/logos_variants/kubernetes.jpg", - "/logos_variants/kubernetes.png", - "/logos_variants/kyivstar.jpg", - "/logos_variants/kyivstar.png", - "/logos_variants/languagetool.jpg", - "/logos_variants/languagetool.png", - "/logos_variants/laravel-logo.jpg", - "/logos_variants/laravel-logo.png", - "/logos_variants/laravel.jpg", - "/logos_variants/laravel.png", - "/logos_variants/lego.jpg", - "/logos_variants/lego.png", - "/logos_variants/letsencrypt-logo.jpg", - "/logos_variants/letsencrypt-logo.png", - "/logos_variants/letsencrypt.jpg", - "/logos_variants/letsencrypt.png", - "/logos_variants/lg.jpg", - "/logos_variants/lg.png", - "/logos_variants/lifecell.jpg", - "/logos_variants/lifecell.png", - "/logos_variants/lifecell_logo.jpg", - "/logos_variants/lifecell_logo.png", - "/logos_variants/linux-mint.jpg", - "/logos_variants/linux-mint.png", - "/logos_variants/linux-tux.jpg", - "/logos_variants/linux-tux.png", - "/logos_variants/mariadb-icon.jpg", - "/logos_variants/mariadb-icon.png", - "/logos_variants/mariadb.jpg", - "/logos_variants/mariadb.png", - "/logos_variants/mastercard.jpg", - "/logos_variants/mastercard.png", - "/logos_variants/matter-icon.jpg", - "/logos_variants/matter-icon.png", - "/logos_variants/matter.jpg", - "/logos_variants/matter.png", - "/logos_variants/mattermost-icon.jpg", - "/logos_variants/mattermost-icon.png", - "/logos_variants/mattermost-line.jpg", - "/logos_variants/mattermost-line.png", - "/logos_variants/mattermost.jpg", - "/logos_variants/mattermost.png", - "/logos_variants/mcdonalds.jpg", - "/logos_variants/mcdonalds.png", - "/logos_variants/meest.jpg", - "/logos_variants/meest.png", - "/logos_variants/meta-facebook.jpg", - "/logos_variants/meta-facebook.png", - "/logos_variants/meta-icon.jpg", - "/logos_variants/meta-icon.png", - "/logos_variants/meta-instagram.jpg", - "/logos_variants/meta-instagram.png", - "/logos_variants/meta-threads.jpg", - "/logos_variants/meta-threads.png", - "/logos_variants/meta-whatsapp-icon.jpg", - "/logos_variants/meta-whatsapp-icon.png", - "/logos_variants/meta.jpg", - "/logos_variants/meta.png", - "/logos_variants/microsoft-azure.jpg", - "/logos_variants/microsoft-azure.png", - "/logos_variants/microsoft-edge.jpg", - "/logos_variants/microsoft-edge.png", - "/logos_variants/microsoft-linkedin-icon.jpg", - "/logos_variants/microsoft-linkedin-icon.png", - "/logos_variants/microsoft-linkedin.jpg", - "/logos_variants/microsoft-linkedin.png", - "/logos_variants/microsoft-onedrive.jpg", - "/logos_variants/microsoft-onedrive.png", - "/logos_variants/microsoft-teams.jpg", - "/logos_variants/microsoft-teams.png", - "/logos_variants/microsoft-windows-icon.jpg", - "/logos_variants/microsoft-windows-icon.png", - "/logos_variants/microsoft-windows.jpg", - "/logos_variants/microsoft-windows.png", - "/logos_variants/microsoft.jpg", - "/logos_variants/microsoft.png", - "/logos_variants/microsoft_office_outlook.jpg", - "/logos_variants/microsoft_office_outlook.png", - "/logos_variants/microsoft_outlook.jpg", - "/logos_variants/microsoft_outlook.png", - "/logos_variants/mikrotik.jpg", - "/logos_variants/mikrotik.png", - "/logos_variants/mikrotik_logo.jpg", - "/logos_variants/mikrotik_logo.png", - "/logos_variants/mongodb.jpg", - "/logos_variants/mongodb.png", - "/logos_variants/mono.jpg", - "/logos_variants/mono.png", - "/logos_variants/monobank_paw.jpg", - "/logos_variants/monobank_paw.png", - "/logos_variants/monobank_text.jpg", - "/logos_variants/monobank_text.png", - "/logos_variants/mqtt.jpg", - "/logos_variants/mqtt.png", - "/logos_variants/mysql-icon.jpg", - "/logos_variants/mysql-icon.png", - "/logos_variants/mysql.jpg", - "/logos_variants/mysql.png", - "/logos_variants/namecheap.jpg", - "/logos_variants/namecheap.png", - "/logos_variants/nationwide.jpg", - "/logos_variants/nationwide.png", - "/logos_variants/neo4j.jpg", - "/logos_variants/neo4j.png", - "/logos_variants/neocom.jpg", - "/logos_variants/neocom.png", - "/logos_variants/netflix.jpg", - "/logos_variants/netflix.png", - "/logos_variants/nikamebel.jpg", - "/logos_variants/nikamebel.png", - "/logos_variants/nova_global.jpg", - "/logos_variants/nova_global.png", - "/logos_variants/nova_post.jpg", - "/logos_variants/nova_post.png", - "/logos_variants/novapay.jpg", - "/logos_variants/novapay.png", - "/logos_variants/nvidia.jpg", - "/logos_variants/nvidia.png", - "/logos_variants/nvidia_vertical.jpg", - "/logos_variants/nvidia_vertical.png", - "/logos_variants/okko.jpg", - "/logos_variants/okko.png", - "/logos_variants/openai-icon.jpg", - "/logos_variants/openai-icon.png", - "/logos_variants/openvpn.jpg", - "/logos_variants/openvpn.png", - "/logos_variants/opera.jpg", - "/logos_variants/opera.png", - "/logos_variants/paypal.jpg", - "/logos_variants/paypal.png", - "/logos_variants/pepsi.jpg", - "/logos_variants/pepsi.png", - "/logos_variants/pepsi_2014-2023.jpg", - "/logos_variants/pepsi_2014-2023.png", - "/logos_variants/php.jpg", - "/logos_variants/php.png", - "/logos_variants/postgresql.jpg", - "/logos_variants/postgresql.png", - "/logos_variants/privat24.jpg", - "/logos_variants/privat24.png", - "/logos_variants/privat24bussiness.jpg", - "/logos_variants/privat24bussiness.png", - "/logos_variants/privatbank.jpg", - "/logos_variants/privatbank.png", - "/logos_variants/privatbank_logo.jpg", - "/logos_variants/privatbank_logo.png", - "/logos_variants/puma.jpg", - "/logos_variants/puma.png", - "/logos_variants/pumb.jpg", - "/logos_variants/pumb.png", - "/logos_variants/python-logo.jpg", - "/logos_variants/python-logo.png", - "/logos_variants/python.jpg", - "/logos_variants/python.png", - "/logos_variants/rabbitmq-logo.jpg", - "/logos_variants/rabbitmq-logo.png", - "/logos_variants/rabbitmq.jpg", - "/logos_variants/rabbitmq.png", - "/logos_variants/raspberry-pi.jpg", - "/logos_variants/raspberry-pi.png", - "/logos_variants/react.jpg", - "/logos_variants/react.png", - "/logos_variants/reddit-icon.jpg", - "/logos_variants/reddit-icon.png", - "/logos_variants/redis-logo.jpg", - "/logos_variants/redis-logo.png", - "/logos_variants/redis.jpg", - "/logos_variants/redis.png", - "/logos_variants/reebok.jpg", - "/logos_variants/reebok.png", - "/logos_variants/reolink.jpg", - "/logos_variants/reolink.png", - "/logos_variants/revolut.jpg", - "/logos_variants/revolut.png", - "/logos_variants/roomerin.jpg", - "/logos_variants/roomerin.png", - "/logos_variants/sainsburys.jpg", - "/logos_variants/sainsburys.png", - "/logos_variants/samsung.jpg", - "/logos_variants/samsung.png", - "/logos_variants/sendpulse.jpg", - "/logos_variants/sendpulse.png", - "/logos_variants/sendpulse_logo.jpg", - "/logos_variants/sendpulse_logo.png", - "/logos_variants/shadoll.jpg", - "/logos_variants/shadoll.png", - "/logos_variants/shkafnik.jpg", - "/logos_variants/shkafnik.png", - "/logos_variants/shkafnik_logo.jpg", - "/logos_variants/shkafnik_logo.png", - "/logos_variants/siemens.jpg", - "/logos_variants/siemens.png", - "/logos_variants/signal-logo.jpg", - "/logos_variants/signal-logo.png", - "/logos_variants/signal.jpg", - "/logos_variants/signal.png", - "/logos_variants/silpo.jpg", - "/logos_variants/silpo.png", - "/logos_variants/skechers.jpg", - "/logos_variants/skechers.png", - "/logos_variants/slack.jpg", - "/logos_variants/slack.png", - "/logos_variants/slzb.jpg", - "/logos_variants/slzb.png", - "/logos_variants/spotify-icon.jpg", - "/logos_variants/spotify-icon.png", - "/logos_variants/spotify.jpg", - "/logos_variants/spotify.png", - "/logos_variants/stackoverflow-icon.jpg", - "/logos_variants/stackoverflow-icon.png", - "/logos_variants/stackoverflow.jpg", - "/logos_variants/stackoverflow.png", - "/logos_variants/starbucks.jpg", - "/logos_variants/starbucks.png", - "/logos_variants/suzuki.jpg", - "/logos_variants/suzuki.png", - "/logos_variants/suzuki_vertical.jpg", - "/logos_variants/suzuki_vertical.png", - "/logos_variants/svelte-icon.jpg", - "/logos_variants/svelte-icon.png", - "/logos_variants/swagger.jpg", - "/logos_variants/swagger.png", - "/logos_variants/swift.jpg", - "/logos_variants/swift.png", - "/logos_variants/tesla.jpg", - "/logos_variants/tesla.png", - "/logos_variants/thread-net.jpg", - "/logos_variants/thread-net.png", - "/logos_variants/toyota.jpg", - "/logos_variants/toyota.png", - "/logos_variants/toyota_logo.jpg", - "/logos_variants/toyota_logo.png", - "/logos_variants/traefik-logo.jpg", - "/logos_variants/traefik-logo.png", - "/logos_variants/traefik-proxy-logo.jpg", - "/logos_variants/traefik-proxy-logo.png", - "/logos_variants/traefik-proxy.jpg", - "/logos_variants/traefik-proxy.png", - "/logos_variants/trakt.jpg", - "/logos_variants/trakt.png", - "/logos_variants/ubuntu-logo.jpg", - "/logos_variants/ubuntu-logo.png", - "/logos_variants/ubuntu.jpg", - "/logos_variants/ubuntu.png", - "/logos_variants/ukrnet.jpg", - "/logos_variants/ukrnet.png", - "/logos_variants/ukrposhta.jpg", - "/logos_variants/ukrposhta.png", - "/logos_variants/unifi.jpg", - "/logos_variants/unifi.png", - "/logos_variants/uptimekuma.jpg", - "/logos_variants/uptimekuma.png", - "/logos_variants/viber.jpg", - "/logos_variants/viber.png", - "/logos_variants/vintage.jpg", - "/logos_variants/vintage.png", - "/logos_variants/visa.jpg", - "/logos_variants/visa.png", - "/logos_variants/visual-studio-code.jpg", - "/logos_variants/visual-studio-code.png", - "/logos_variants/vodafone.jpg", - "/logos_variants/vodafone.png", - "/logos_variants/vue.jpg", - "/logos_variants/vue.png", - "/logos_variants/webhooks.jpg", - "/logos_variants/webhooks.png", - "/logos_variants/webkit.jpg", - "/logos_variants/webkit.png", - "/logos_variants/webtorrent.jpg", - "/logos_variants/webtorrent.png", - "/logos_variants/wifi.jpg", - "/logos_variants/wifi.png", - "/logos_variants/wireguard.jpg", - "/logos_variants/wireguard.png", - "/logos_variants/wise-icon.jpg", - "/logos_variants/wise-icon.png", - "/logos_variants/wise.jpg", - "/logos_variants/wise.png", - "/logos_variants/wog.jpg", - "/logos_variants/wog.png", - "/logos_variants/yahoo.jpg", - "/logos_variants/yahoo.png", - "/logos_variants/yahoo_logo.jpg", - "/logos_variants/yahoo_logo.png", - "/logos_variants/yahoo_mail.jpg", - "/logos_variants/yahoo_mail.png", - "/logos_variants/youtube.jpg", - "/logos_variants/youtube.png", - "/logos_variants/zigbee2mqtt.jpg", - "/logos_variants/zigbee2mqtt.png", - "/logos_variants/zoom-icon.jpg", - "/logos_variants/zoom-icon.png", - "/logos_variants/zoom.jpg", - "/logos_variants/zoom.png" -] \ No newline at end of file diff --git a/scripts/generate-pwa-cache-list.js b/scripts/generate-pwa-cache-list.js index e53e04e..4c42acf 100644 --- a/scripts/generate-pwa-cache-list.js +++ b/scripts/generate-pwa-cache-list.js @@ -2,11 +2,12 @@ // Node.js script to generate a list of all files in public and images for PWA caching const fs = require('fs'); const path = require('path'); +const { collections } = require('../src/collections.js'); const projectRoot = path.join(__dirname, '..'); -const publicDir = path.join(projectRoot, 'public/images'); -const logosDir = path.join(projectRoot, 'logos'); -const logosGenDir = path.join(projectRoot, 'logos_variants'); +const publicDir = path.join(projectRoot, 'public'); +const imagesDir = path.join(publicDir, 'images'); +const imagesVarDir = path.join(projectRoot, 'logos_variants'); // List of files to ignore const IGNORED_FILES = ['.DS_Store', 'CNAME', 'pwa-files-to-cache.json', '.gitignore']; @@ -31,11 +32,11 @@ function safeWalkDir(dir, baseUrl = '') { return walkDir(dir, baseUrl); } -const publicFiles = walkDir(publicDir, '').filter(f => !f.endsWith('sw.js')); -const logosFiles = safeWalkDir(logosDir, 'logos'); -const logosGenFiles = safeWalkDir(logosGenDir, 'logos_variants'); +// Recursively walk all files in public, skipping IGNORED_FILES and sw.js +let allFiles = walkDir(publicDir, '').filter(f => !f.endsWith('sw.js')); -const allFiles = Array.from(new Set([...publicFiles, ...logosFiles, ...logosGenFiles])); +// Remove duplicates +allFiles = Array.from(new Set(allFiles)); fs.writeFileSync( path.join(publicDir, 'pwa-files-to-cache.json'), diff --git a/scripts/generate-svg-variants.js b/scripts/generate-svg-variants.js index 6d49ef9..ec555b5 100644 --- a/scripts/generate-svg-variants.js +++ b/scripts/generate-svg-variants.js @@ -2,19 +2,8 @@ const fs = require('fs'); const path = require('path'); +const { collections } = require('../src/collections.js'); -const collections = [ - { name: 'logos', label: 'Logos', - baseDir: 'logos', - genDir: 'logos_variants', - dataFile: 'data/logos.json' - }, - { name: 'flags', label: 'Flags', - baseDir: 'flags', - genDir: 'flags_variants', - dataFile: 'data/flags.json' - } -]; // Accept collection as a CLI arg or env var const collectionArg = process.argv.find(arg => arg.startsWith('--collection=')); @@ -22,7 +11,7 @@ const collectionName = collectionArg ? collectionArg.split('=')[1] : (process.en const collection = collections.find(c => c.name === collectionName) || collections[0]; const LOGOS_DIR = path.join(__dirname, '..', 'public', collection.baseDir); -const LOGOS_GEN_DIR = path.join(__dirname, '..', 'public', collection.genDir); +const LOGOS_GEN_DIR = path.join(__dirname, '..', 'public', collection.varDir); // Try multiple possible locations for logos.json const POSSIBLE_LOGOS_JSON_PATHS = [ diff --git a/scripts/update-data.js b/scripts/update-data.js index d759388..0c1e659 100644 --- a/scripts/update-data.js +++ b/scripts/update-data.js @@ -12,9 +12,9 @@ const collectionArg = process.argv.find(arg => arg.startsWith('--collection=')); const collectionName = collectionArg ? collectionArg.split('=')[1] : (process.env.COLLECTION || 'logos'); const collection = collections.find(c => c.name === collectionName) || collections[0]; -const logosDir = path.join(__dirname, '..', 'public', collection.baseDir); +const imagesDir = path.join(__dirname, '..', 'public', collection.baseDir); const outputFile = path.join(__dirname, '..', 'public', collection.dataFile); -const genDir = path.join(__dirname, '..', 'public', collection.genDir); +const imagesVarDir = path.join(__dirname, '..', 'public', collection.imagesVarDir); // Remove old PNG/JPG folders if they exist const pngDir = path.join(__dirname, '..', 'public', collection.baseDir + '-png'); @@ -80,15 +80,15 @@ function svgToJpg(svgBuffer, width, height) { } // Pregenerate PNG and JPG images for SVG files -function pregenerateImages(logoFiles, logosDir, genDir) { - cleanDir(genDir); +function pregenerateImages(logoFiles, imagesDir, imagesVarDir) { + cleanDir(imagesVarDir); // Only process SVG files const svgFiles = logoFiles.filter(file => /\.svg$/i.test(file)); for (const file of svgFiles) { const base = getBaseName(file); - const svgPath = path.join(logosDir, file); - const pngPath = path.join(genDir, base + '.png'); - const jpgPath = path.join(genDir, base + '.jpg'); + const svgPath = path.join(imagesDir, file); + const pngPath = path.join(imagesVarDir, base + '.png'); + const jpgPath = path.join(imagesVarDir, base + '.jpg'); try { const svgBuffer = fs.readFileSync(svgPath); const pngBuffer = svgToPng(svgBuffer, 256, 256); @@ -103,7 +103,7 @@ function pregenerateImages(logoFiles, logosDir, genDir) { // Scan directory and update logo objects function scanLogos() { - console.log(`Scanning logos directory: ${logosDir}`); + console.log(`Scanning logos directory: ${imagesDir}`); let existing = []; if (fs.existsSync(outputFile)) { @@ -115,12 +115,12 @@ function scanLogos() { } try { - if (!fs.existsSync(logosDir)) { - console.error(`Directory does not exist: ${logosDir}`); + if (!fs.existsSync(imagesDir)) { + console.error(`Directory does not exist: ${imagesDir}`); return []; } - const files = fs.readdirSync(logosDir); + const files = fs.readdirSync(imagesDir); // Filter for image files (svg, png, jpg, jpeg) const logoFiles = files.filter(file => /\.(svg|png|jpg|jpeg)$/i.test(file) @@ -185,13 +185,13 @@ function main() { // If no collection is specified, process all collections if (!collectionArg && !process.env.COLLECTION) { for (const col of collections) { - const logosDir = path.join(__dirname, '..', 'public', col.baseDir); + const imagesDir = path.join(__dirname, '..', 'public', col.baseDir); const outputFile = path.join(__dirname, '..', 'public', col.dataFile); - const genDir = path.join(__dirname, '..', 'public', col.genDir); - if (!fs.existsSync(logosDir)) { - fs.mkdirSync(logosDir, { recursive: true }); + const varDir = path.join(__dirname, '..', 'public', col.varDir); + if (!fs.existsSync(imagesDir)) { + fs.mkdirSync(imagesDir, { recursive: true }); } - const files = fs.readdirSync(logosDir); + const files = fs.readdirSync(imagesDir); // Only update/disable/add, do not overwrite existing keys let existing = []; if (fs.existsSync(outputFile)) { @@ -231,7 +231,7 @@ function main() { }) .sort((a, b) => a.name.localeCompare(b.name)); let merged = [...existing, ...newLogos]; - pregenerateImages(files, logosDir, genDir); + pregenerateImages(files, imagesDir, varDir); try { const data = JSON.stringify(merged, null, 2); fs.writeFileSync(outputFile, data); @@ -243,8 +243,8 @@ function main() { } else { // Single collection mode (as before) const logos = scanLogos(); - const files = fs.readdirSync(logosDir); - pregenerateImages(files, logosDir, genDir); + const files = fs.readdirSync(imagesDir); + pregenerateImages(files, imagesDir, varDir); saveLogosToJson(logos); } } diff --git a/src/collections.js b/src/collections.js index 063f46e..a3fb397 100644 --- a/src/collections.js +++ b/src/collections.js @@ -4,21 +4,21 @@ export const collections = [ name: 'logos', label: 'Logos', baseDir: 'images/logos', - genDir: 'images/logos_variants', + varDir: 'images/logos_variants', dataFile: 'data/logos.json' }, { name: 'flags', label: 'Flags', baseDir: 'images/flags', - genDir: 'images/flags_variants', + varDir: 'images/flags_variants', dataFile: 'data/flags.json' }, { name: 'emblems', label: 'Emblems', baseDir: 'images/emblems', - genDir: 'images/emblems_variants', + varDir: 'images/emblems_variants', dataFile: 'data/emblems.json' } ]; diff --git a/src/components/Actions.svelte b/src/components/Actions.svelte index badc657..7883062 100644 --- a/src/components/Actions.svelte +++ b/src/components/Actions.svelte @@ -1,6 +1,7 @@ diff --git a/src/components/CardMiddle.svelte b/src/components/CardMiddle.svelte index 3699b49..b7a9ace 100644 --- a/src/components/CardMiddle.svelte +++ b/src/components/CardMiddle.svelte @@ -4,6 +4,7 @@ import ColorSwitcher from "./ColorSwitcher.svelte"; import { getDefaultLogoColor } from "../utils/colorTheme.js"; import { collections } from '../collections.js'; + import { getContext } from 'svelte'; export let logo; export let theme; @@ -31,9 +32,16 @@ return collection ? collection.baseDir : 'images/logos'; } + let collection = getContext('collection'); + if (!collection) { + if (typeof window !== 'undefined' && window.appData && window.appData.collection) { + collection = collections.find(c => c.name === window.appData.collection) || collections[0]; + } else { + collection = collections[0]; + } + } function getImageUrl(logo) { - const baseDir = getBaseDir(logo); - return `/${baseDir}/${logo.path.split('/').pop()}`; + return `/${collection.baseDir}/${logo.path}`; } $: getLogoThemeColor = (logo) => getDefaultLogoColor(logo.colors, theme); @@ -69,7 +77,7 @@ /> {/key} {:else} - {logo.title + {logo.title {/if}
diff --git a/src/components/CardSmall.svelte b/src/components/CardSmall.svelte index 9216160..9e9b2a2 100644 --- a/src/components/CardSmall.svelte +++ b/src/components/CardSmall.svelte @@ -4,6 +4,7 @@ import ColorSwitcher from "./ColorSwitcher.svelte"; import { getDefaultLogoColor } from "../utils/colorTheme.js"; import { collections } from '../collections.js'; + import { getContext } from 'svelte'; export let logo; export let theme; @@ -34,9 +35,16 @@ return collection ? collection.baseDir : 'images/logos'; } + let collection = getContext('collection'); + if (!collection) { + if (typeof window !== 'undefined' && window.appData && window.appData.collection) { + collection = collections.find(c => c.name === window.appData.collection) || collections[0]; + } else { + collection = collections[0]; + } + } function getImageUrl(logo) { - const baseDir = getBaseDir(logo); - return `/${baseDir}/${logo.path.split('/').pop()}`; + return `/${collection.baseDir}/${logo.path}`; } diff --git a/src/components/CardTiny.svelte b/src/components/CardTiny.svelte index 1402997..5c8dc6d 100644 --- a/src/components/CardTiny.svelte +++ b/src/components/CardTiny.svelte @@ -3,6 +3,7 @@ import { getDefaultLogoColor } from "../utils/colorTheme.js"; import ColorSwitcher from './ColorSwitcher.svelte'; import { collections } from '../collections.js'; + import { getContext } from 'svelte'; export let logo; export let theme; @@ -40,9 +41,16 @@ return collection ? collection.baseDir : 'images/logos'; } + let collection = getContext('collection'); + if (!collection) { + if (typeof window !== 'undefined' && window.appData && window.appData.collection) { + collection = collections.find(c => c.name === window.appData.collection) || collections[0]; + } else { + collection = collections[0]; + } + } function getImageUrl(logo) { - const baseDir = getBaseDir(logo); - return `/${baseDir}/${logo.path.split('/').pop()}`; + return `/${collection.baseDir}/${logo.path}`; }