From c95c8b08eab44785de1d2071754c59472941a0dc Mon Sep 17 00:00:00 2001 From: MivoDev Date: Sun, 18 Jan 2026 11:00:36 +0700 Subject: [PATCH] feat: Implement a core plugin system, integrate flag icon assets, and establish a GitHub release workflow. --- .github/workflows/docker-publish.yml | 23 +- .github/workflows/release.yml | 14 + DOCKER_README.md | 8 +- README.md | 6 +- app/Config/SiteConfig.php | 6 +- app/Core/Hooks.php | 120 ++ app/Core/PluginManager.php | 78 + app/Core/Router.php | 3 + app/Helpers/TemplateHelper.php | 47 +- app/Views/layouts/footer_main.php | 7 +- app/Views/layouts/footer_public.php | 7 +- app/Views/layouts/header_main.php | 6 +- app/Views/layouts/header_public.php | 1 + app/Views/layouts/sidebar_session.php | 6 +- app/Views/settings/voucher_templates/edit.php | 214 +- composer.json | 6 +- docker/aapanel-template.yml | 2 +- docs/INSTALLATION.md | 6 +- docs/guide/docker-aapanel.md | 2 +- docs/guide/docker.md | 6 +- docs/guide/installation.md | 6 +- docs/id/guide/docker-aapanel.md | 2 +- docs/id/guide/docker.md | 6 +- docs/id/guide/installation.md | 6 +- package-lock.json | 1125 ++++++++-- package.json | 14 +- plugins/example-plugin/plugin.php | 27 + public/assets/js/modules/i18n.js | 2 +- public/assets/js/modules/updater.js | 2 +- public/assets/js/vendor/editor.bundle.js | 38 + .../vendor/flag-icons/css/flag-icons.css | 1915 +++++++++++++++++ .../vendor/flag-icons/css/flag-icons.min.css | 1 + .../assets/vendor/flag-icons/flags/1x1/ad.svg | 148 ++ .../assets/vendor/flag-icons/flags/1x1/ae.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/af.svg | 81 + .../assets/vendor/flag-icons/flags/1x1/ag.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/ai.svg | 29 + .../assets/vendor/flag-icons/flags/1x1/al.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/am.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/ao.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/aq.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/ar.svg | 32 + .../vendor/flag-icons/flags/1x1/arab.svg | 109 + .../assets/vendor/flag-icons/flags/1x1/as.svg | 73 + .../vendor/flag-icons/flags/1x1/asean.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/at.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/au.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/aw.svg | 186 ++ .../assets/vendor/flag-icons/flags/1x1/ax.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/az.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/ba.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/bb.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/bd.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/be.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/bf.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/bg.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/bh.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/bi.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/bj.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/bl.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/bm.svg | 97 + .../assets/vendor/flag-icons/flags/1x1/bn.svg | 36 + .../assets/vendor/flag-icons/flags/1x1/bo.svg | 674 ++++++ .../assets/vendor/flag-icons/flags/1x1/bq.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/br.svg | 45 + .../assets/vendor/flag-icons/flags/1x1/bs.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/bt.svg | 89 + .../assets/vendor/flag-icons/flags/1x1/bv.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/bw.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/by.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/bz.svg | 145 ++ .../assets/vendor/flag-icons/flags/1x1/ca.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/cc.svg | 19 + .../assets/vendor/flag-icons/flags/1x1/cd.svg | 12 + .../vendor/flag-icons/flags/1x1/cefta.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/cf.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/cg.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/ch.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/ci.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/ck.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/cl.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/cm.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/cn.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/co.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/cp.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/cr.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/cu.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/cv.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/cw.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/cx.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/cy.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/cz.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/de.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/dg.svg | 130 ++ .../assets/vendor/flag-icons/flags/1x1/dj.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/dk.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/dm.svg | 152 ++ .../assets/vendor/flag-icons/flags/1x1/do.svg | 122 ++ .../assets/vendor/flag-icons/flags/1x1/dz.svg | 5 + .../vendor/flag-icons/flags/1x1/eac.svg | 48 + .../assets/vendor/flag-icons/flags/1x1/ec.svg | 138 ++ .../assets/vendor/flag-icons/flags/1x1/ee.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/eg.svg | 38 + .../assets/vendor/flag-icons/flags/1x1/eh.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/er.svg | 13 + .../vendor/flag-icons/flags/1x1/es-ct.svg | 4 + .../vendor/flag-icons/flags/1x1/es-ga.svg | 187 ++ .../vendor/flag-icons/flags/1x1/es-pv.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/es.svg | 547 +++++ .../assets/vendor/flag-icons/flags/1x1/et.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/eu.svg | 28 + .../assets/vendor/flag-icons/flags/1x1/fi.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/fj.svg | 123 ++ .../assets/vendor/flag-icons/flags/1x1/fk.svg | 89 + .../assets/vendor/flag-icons/flags/1x1/fm.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/fo.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/fr.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/ga.svg | 7 + .../vendor/flag-icons/flags/1x1/gb-eng.svg | 5 + .../vendor/flag-icons/flags/1x1/gb-nir.svg | 131 ++ .../vendor/flag-icons/flags/1x1/gb-sct.svg | 4 + .../vendor/flag-icons/flags/1x1/gb-wls.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/gb.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/gd.svg | 27 + .../assets/vendor/flag-icons/flags/1x1/ge.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/gf.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/gg.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/gh.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/gi.svg | 32 + .../assets/vendor/flag-icons/flags/1x1/gl.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/gm.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/gn.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/gp.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/gq.svg | 23 + .../assets/vendor/flag-icons/flags/1x1/gr.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/gs.svg | 132 ++ .../assets/vendor/flag-icons/flags/1x1/gt.svg | 204 ++ .../assets/vendor/flag-icons/flags/1x1/gu.svg | 19 + .../assets/vendor/flag-icons/flags/1x1/gw.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/gy.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/hk.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/hm.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/hn.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/hr.svg | 56 + .../assets/vendor/flag-icons/flags/1x1/ht.svg | 116 + .../assets/vendor/flag-icons/flags/1x1/hu.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/ic.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/id.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/ie.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/il.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/im.svg | 36 + .../assets/vendor/flag-icons/flags/1x1/in.svg | 25 + .../assets/vendor/flag-icons/flags/1x1/io.svg | 130 ++ .../assets/vendor/flag-icons/flags/1x1/iq.svg | 10 + .../assets/vendor/flag-icons/flags/1x1/ir.svg | 219 ++ .../assets/vendor/flag-icons/flags/1x1/is.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/it.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/je.svg | 62 + .../assets/vendor/flag-icons/flags/1x1/jm.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/jo.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/jp.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/ke.svg | 23 + .../assets/vendor/flag-icons/flags/1x1/kg.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/kh.svg | 61 + .../assets/vendor/flag-icons/flags/1x1/ki.svg | 36 + .../assets/vendor/flag-icons/flags/1x1/km.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/kn.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/kp.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/kr.svg | 17 + .../assets/vendor/flag-icons/flags/1x1/kw.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/ky.svg | 103 + .../assets/vendor/flag-icons/flags/1x1/kz.svg | 36 + .../assets/vendor/flag-icons/flags/1x1/la.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/lb.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/lc.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/li.svg | 43 + .../assets/vendor/flag-icons/flags/1x1/lk.svg | 22 + .../assets/vendor/flag-icons/flags/1x1/lr.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/ls.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/lt.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/lu.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/lv.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/ly.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/ma.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/mc.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/md.svg | 71 + .../assets/vendor/flag-icons/flags/1x1/me.svg | 118 + .../assets/vendor/flag-icons/flags/1x1/mf.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/mg.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/mh.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/mk.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/ml.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/mm.svg | 10 + .../assets/vendor/flag-icons/flags/1x1/mn.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/mo.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/mp.svg | 86 + .../assets/vendor/flag-icons/flags/1x1/mq.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/mr.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/ms.svg | 25 + .../assets/vendor/flag-icons/flags/1x1/mt.svg | 56 + .../assets/vendor/flag-icons/flags/1x1/mu.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/mv.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/mw.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/mx.svg | 377 ++++ .../assets/vendor/flag-icons/flags/1x1/my.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/mz.svg | 21 + .../assets/vendor/flag-icons/flags/1x1/na.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/nc.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/ne.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/nf.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/ng.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/ni.svg | 129 ++ .../assets/vendor/flag-icons/flags/1x1/nl.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/no.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/np.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/nr.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/nu.svg | 10 + .../assets/vendor/flag-icons/flags/1x1/nz.svg | 36 + .../assets/vendor/flag-icons/flags/1x1/om.svg | 115 + .../assets/vendor/flag-icons/flags/1x1/pa.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/pc.svg | 33 + .../assets/vendor/flag-icons/flags/1x1/pe.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/pf.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/pg.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/ph.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/pk.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/pl.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/pm.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/pn.svg | 53 + .../assets/vendor/flag-icons/flags/1x1/pr.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/ps.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/pt.svg | 57 + .../assets/vendor/flag-icons/flags/1x1/pw.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/py.svg | 156 ++ .../assets/vendor/flag-icons/flags/1x1/qa.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/re.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/ro.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/rs.svg | 296 +++ .../assets/vendor/flag-icons/flags/1x1/ru.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/rw.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/sa.svg | 25 + .../assets/vendor/flag-icons/flags/1x1/sb.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/sc.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/sd.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/se.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/sg.svg | 13 + .../vendor/flag-icons/flags/1x1/sh-ac.svg | 690 ++++++ .../vendor/flag-icons/flags/1x1/sh-hl.svg | 164 ++ .../vendor/flag-icons/flags/1x1/sh-ta.svg | 76 + .../assets/vendor/flag-icons/flags/1x1/sh.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/si.svg | 18 + .../assets/vendor/flag-icons/flags/1x1/sj.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/sk.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/sl.svg | 12 + .../assets/vendor/flag-icons/flags/1x1/sm.svg | 73 + .../assets/vendor/flag-icons/flags/1x1/sn.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/so.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/sr.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/ss.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/st.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/sv.svg | 593 +++++ .../assets/vendor/flag-icons/flags/1x1/sx.svg | 56 + .../assets/vendor/flag-icons/flags/1x1/sy.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/sz.svg | 34 + .../assets/vendor/flag-icons/flags/1x1/tc.svg | 50 + .../assets/vendor/flag-icons/flags/1x1/td.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/tf.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/tg.svg | 14 + .../assets/vendor/flag-icons/flags/1x1/th.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/tj.svg | 26 + .../assets/vendor/flag-icons/flags/1x1/tk.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/tl.svg | 13 + .../assets/vendor/flag-icons/flags/1x1/tm.svg | 205 ++ .../assets/vendor/flag-icons/flags/1x1/tn.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/to.svg | 10 + .../assets/vendor/flag-icons/flags/1x1/tr.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/tt.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/tv.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/tw.svg | 32 + .../assets/vendor/flag-icons/flags/1x1/tz.svg | 15 + .../assets/vendor/flag-icons/flags/1x1/ua.svg | 6 + .../assets/vendor/flag-icons/flags/1x1/ug.svg | 30 + .../assets/vendor/flag-icons/flags/1x1/um.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/un.svg | 16 + .../assets/vendor/flag-icons/flags/1x1/us.svg | 9 + .../assets/vendor/flag-icons/flags/1x1/uy.svg | 28 + .../assets/vendor/flag-icons/flags/1x1/uz.svg | 30 + .../assets/vendor/flag-icons/flags/1x1/va.svg | 190 ++ .../assets/vendor/flag-icons/flags/1x1/vc.svg | 8 + .../assets/vendor/flag-icons/flags/1x1/ve.svg | 26 + .../assets/vendor/flag-icons/flags/1x1/vg.svg | 59 + .../assets/vendor/flag-icons/flags/1x1/vi.svg | 28 + .../assets/vendor/flag-icons/flags/1x1/vn.svg | 11 + .../assets/vendor/flag-icons/flags/1x1/vu.svg | 21 + .../assets/vendor/flag-icons/flags/1x1/wf.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/ws.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/xk.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/xx.svg | 4 + .../assets/vendor/flag-icons/flags/1x1/ye.svg | 7 + .../assets/vendor/flag-icons/flags/1x1/yt.svg | 5 + .../assets/vendor/flag-icons/flags/1x1/za.svg | 17 + .../assets/vendor/flag-icons/flags/1x1/zm.svg | 27 + .../assets/vendor/flag-icons/flags/1x1/zw.svg | 21 + .../assets/vendor/flag-icons/flags/4x3/ad.svg | 150 ++ .../assets/vendor/flag-icons/flags/4x3/ae.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/af.svg | 81 + .../assets/vendor/flag-icons/flags/4x3/ag.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/ai.svg | 29 + .../assets/vendor/flag-icons/flags/4x3/al.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/am.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ao.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/aq.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ar.svg | 32 + .../vendor/flag-icons/flags/4x3/arab.svg | 109 + .../assets/vendor/flag-icons/flags/4x3/as.svg | 72 + .../vendor/flag-icons/flags/4x3/asean.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/at.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/au.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/aw.svg | 186 ++ .../assets/vendor/flag-icons/flags/4x3/ax.svg | 18 + .../assets/vendor/flag-icons/flags/4x3/az.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/ba.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/bb.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/bd.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/be.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/bf.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/bg.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/bh.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/bi.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/bj.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/bl.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/bm.svg | 97 + .../assets/vendor/flag-icons/flags/4x3/bn.svg | 36 + .../assets/vendor/flag-icons/flags/4x3/bo.svg | 673 ++++++ .../assets/vendor/flag-icons/flags/4x3/bq.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/br.svg | 45 + .../assets/vendor/flag-icons/flags/4x3/bs.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/bt.svg | 89 + .../assets/vendor/flag-icons/flags/4x3/bv.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/bw.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/by.svg | 18 + .../assets/vendor/flag-icons/flags/4x3/bz.svg | 145 ++ .../assets/vendor/flag-icons/flags/4x3/ca.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/cc.svg | 19 + .../assets/vendor/flag-icons/flags/4x3/cd.svg | 5 + .../vendor/flag-icons/flags/4x3/cefta.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/cf.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/cg.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/ch.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/ci.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/ck.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/cl.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/cm.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/cn.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/co.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/cp.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/cr.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/cu.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/cv.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/cw.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/cx.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/cy.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/cz.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/de.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/dg.svg | 130 ++ .../assets/vendor/flag-icons/flags/4x3/dj.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/dk.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/dm.svg | 152 ++ .../assets/vendor/flag-icons/flags/4x3/do.svg | 121 ++ .../assets/vendor/flag-icons/flags/4x3/dz.svg | 5 + .../vendor/flag-icons/flags/4x3/eac.svg | 48 + .../assets/vendor/flag-icons/flags/4x3/ec.svg | 138 ++ .../assets/vendor/flag-icons/flags/4x3/ee.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/eg.svg | 38 + .../assets/vendor/flag-icons/flags/4x3/eh.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/er.svg | 8 + .../vendor/flag-icons/flags/4x3/es-ct.svg | 4 + .../vendor/flag-icons/flags/4x3/es-ga.svg | 187 ++ .../vendor/flag-icons/flags/4x3/es-pv.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/es.svg | 544 +++++ .../assets/vendor/flag-icons/flags/4x3/et.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/eu.svg | 28 + .../assets/vendor/flag-icons/flags/4x3/fi.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/fj.svg | 120 ++ .../assets/vendor/flag-icons/flags/4x3/fk.svg | 90 + .../assets/vendor/flag-icons/flags/4x3/fm.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/fo.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/fr.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ga.svg | 7 + .../vendor/flag-icons/flags/4x3/gb-eng.svg | 5 + .../vendor/flag-icons/flags/4x3/gb-nir.svg | 132 ++ .../vendor/flag-icons/flags/4x3/gb-sct.svg | 4 + .../vendor/flag-icons/flags/4x3/gb-wls.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/gb.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/gd.svg | 27 + .../assets/vendor/flag-icons/flags/4x3/ge.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/gf.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/gg.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/gh.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/gi.svg | 32 + .../assets/vendor/flag-icons/flags/4x3/gl.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/gm.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/gn.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/gp.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/gq.svg | 23 + .../assets/vendor/flag-icons/flags/4x3/gr.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/gs.svg | 133 ++ .../assets/vendor/flag-icons/flags/4x3/gt.svg | 204 ++ .../assets/vendor/flag-icons/flags/4x3/gu.svg | 19 + .../assets/vendor/flag-icons/flags/4x3/gw.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/gy.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/hk.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/hm.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/hn.svg | 18 + .../assets/vendor/flag-icons/flags/4x3/hr.svg | 58 + .../assets/vendor/flag-icons/flags/4x3/ht.svg | 116 + .../assets/vendor/flag-icons/flags/4x3/hu.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/ic.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/id.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/ie.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/il.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/im.svg | 36 + .../assets/vendor/flag-icons/flags/4x3/in.svg | 25 + .../assets/vendor/flag-icons/flags/4x3/io.svg | 130 ++ .../assets/vendor/flag-icons/flags/4x3/iq.svg | 10 + .../assets/vendor/flag-icons/flags/4x3/ir.svg | 219 ++ .../assets/vendor/flag-icons/flags/4x3/is.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/it.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/je.svg | 62 + .../assets/vendor/flag-icons/flags/4x3/jm.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/jo.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/jp.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/ke.svg | 23 + .../assets/vendor/flag-icons/flags/4x3/kg.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/kh.svg | 61 + .../assets/vendor/flag-icons/flags/4x3/ki.svg | 36 + .../assets/vendor/flag-icons/flags/4x3/km.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/kn.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/kp.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/kr.svg | 24 + .../assets/vendor/flag-icons/flags/4x3/kw.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/ky.svg | 103 + .../assets/vendor/flag-icons/flags/4x3/kz.svg | 36 + .../assets/vendor/flag-icons/flags/4x3/la.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/lb.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/lc.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/li.svg | 43 + .../assets/vendor/flag-icons/flags/4x3/lk.svg | 22 + .../assets/vendor/flag-icons/flags/4x3/lr.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/ls.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/lt.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/lu.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/lv.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/ly.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/ma.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/mc.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/md.svg | 70 + .../assets/vendor/flag-icons/flags/4x3/me.svg | 116 + .../assets/vendor/flag-icons/flags/4x3/mf.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/mg.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/mh.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/mk.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ml.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/mm.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/mn.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/mo.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/mp.svg | 86 + .../assets/vendor/flag-icons/flags/4x3/mq.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/mr.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/ms.svg | 29 + .../assets/vendor/flag-icons/flags/4x3/mt.svg | 58 + .../assets/vendor/flag-icons/flags/4x3/mu.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/mv.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/mw.svg | 10 + .../assets/vendor/flag-icons/flags/4x3/mx.svg | 382 ++++ .../assets/vendor/flag-icons/flags/4x3/my.svg | 26 + .../assets/vendor/flag-icons/flags/4x3/mz.svg | 21 + .../assets/vendor/flag-icons/flags/4x3/na.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/nc.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/ne.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/nf.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/ng.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/ni.svg | 129 ++ .../assets/vendor/flag-icons/flags/4x3/nl.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/no.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/np.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/nr.svg | 12 + .../assets/vendor/flag-icons/flags/4x3/nu.svg | 10 + .../assets/vendor/flag-icons/flags/4x3/nz.svg | 36 + .../assets/vendor/flag-icons/flags/4x3/om.svg | 115 + .../assets/vendor/flag-icons/flags/4x3/pa.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/pc.svg | 33 + .../assets/vendor/flag-icons/flags/4x3/pe.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/pf.svg | 19 + .../assets/vendor/flag-icons/flags/4x3/pg.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/ph.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/pk.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/pl.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/pm.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/pn.svg | 53 + .../assets/vendor/flag-icons/flags/4x3/pr.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/ps.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/pt.svg | 57 + .../assets/vendor/flag-icons/flags/4x3/pw.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/py.svg | 157 ++ .../assets/vendor/flag-icons/flags/4x3/qa.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/re.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ro.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/rs.svg | 292 +++ .../assets/vendor/flag-icons/flags/4x3/ru.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/rw.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/sa.svg | 25 + .../assets/vendor/flag-icons/flags/4x3/sb.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/sc.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/sd.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/se.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/sg.svg | 13 + .../vendor/flag-icons/flags/4x3/sh-ac.svg | 689 ++++++ .../vendor/flag-icons/flags/4x3/sh-hl.svg | 164 ++ .../vendor/flag-icons/flags/4x3/sh-ta.svg | 76 + .../assets/vendor/flag-icons/flags/4x3/sh.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/si.svg | 18 + .../assets/vendor/flag-icons/flags/4x3/sj.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/sk.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/sl.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/sm.svg | 75 + .../assets/vendor/flag-icons/flags/4x3/sn.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/so.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/sr.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/ss.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/st.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/sv.svg | 593 +++++ .../assets/vendor/flag-icons/flags/4x3/sx.svg | 56 + .../assets/vendor/flag-icons/flags/4x3/sy.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/sz.svg | 34 + .../assets/vendor/flag-icons/flags/4x3/tc.svg | 50 + .../assets/vendor/flag-icons/flags/4x3/td.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/tf.svg | 15 + .../assets/vendor/flag-icons/flags/4x3/tg.svg | 14 + .../assets/vendor/flag-icons/flags/4x3/th.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/tj.svg | 22 + .../assets/vendor/flag-icons/flags/4x3/tk.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/tl.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/tm.svg | 204 ++ .../assets/vendor/flag-icons/flags/4x3/tn.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/to.svg | 10 + .../assets/vendor/flag-icons/flags/4x3/tr.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/tt.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/tv.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/tw.svg | 34 + .../assets/vendor/flag-icons/flags/4x3/tz.svg | 13 + .../assets/vendor/flag-icons/flags/4x3/ua.svg | 6 + .../assets/vendor/flag-icons/flags/4x3/ug.svg | 30 + .../assets/vendor/flag-icons/flags/4x3/um.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/un.svg | 16 + .../assets/vendor/flag-icons/flags/4x3/us.svg | 9 + .../assets/vendor/flag-icons/flags/4x3/uy.svg | 28 + .../assets/vendor/flag-icons/flags/4x3/uz.svg | 30 + .../assets/vendor/flag-icons/flags/4x3/va.svg | 190 ++ .../assets/vendor/flag-icons/flags/4x3/vc.svg | 8 + .../assets/vendor/flag-icons/flags/4x3/ve.svg | 26 + .../assets/vendor/flag-icons/flags/4x3/vg.svg | 59 + .../assets/vendor/flag-icons/flags/4x3/vi.svg | 28 + .../assets/vendor/flag-icons/flags/4x3/vn.svg | 11 + .../assets/vendor/flag-icons/flags/4x3/vu.svg | 21 + .../assets/vendor/flag-icons/flags/4x3/wf.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/ws.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/xk.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/xx.svg | 4 + .../assets/vendor/flag-icons/flags/4x3/ye.svg | 7 + .../assets/vendor/flag-icons/flags/4x3/yt.svg | 5 + .../assets/vendor/flag-icons/flags/4x3/za.svg | 17 + .../assets/vendor/flag-icons/flags/4x3/zm.svg | 27 + .../assets/vendor/flag-icons/flags/4x3/zw.svg | 21 + public/index.php | 4 + public/lang/en.json | 8 +- public/lang/id.json | 8 +- scripts/sync-assets.js | 51 + src/js/editor.js | 74 + 579 files changed, 25054 insertions(+), 313 deletions(-) create mode 100644 app/Core/Hooks.php create mode 100644 app/Core/PluginManager.php create mode 100644 plugins/example-plugin/plugin.php create mode 100644 public/assets/js/vendor/editor.bundle.js create mode 100644 public/assets/vendor/flag-icons/css/flag-icons.css create mode 100644 public/assets/vendor/flag-icons/css/flag-icons.min.css create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ad.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ae.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/af.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ag.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ai.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/al.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/am.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ao.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/aq.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ar.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/arab.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/as.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/asean.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/at.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/au.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/aw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ax.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/az.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ba.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bb.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bd.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/be.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bi.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bj.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bo.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bq.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/br.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bs.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/by.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/bz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ca.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cd.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cefta.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ch.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ci.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ck.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/co.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cp.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cx.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cy.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/cz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/de.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/dg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/dj.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/dk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/dm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/do.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/dz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/eac.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ec.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ee.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/eg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/eh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/er.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/es-ct.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/es-ga.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/es-pv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/es.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/et.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/eu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fi.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fj.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fo.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/fr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ga.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gb-eng.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gb-nir.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gb-sct.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gb-wls.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gb.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gd.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ge.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gi.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gp.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gq.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gs.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/gy.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/hk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/hm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/hn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/hr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ht.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/hu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ic.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/id.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ie.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/il.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/im.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/in.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/io.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/iq.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ir.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/is.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/it.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/je.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/jm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/jo.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/jp.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ke.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ki.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/km.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kp.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ky.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/kz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/la.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lb.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/li.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ls.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/lv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ly.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ma.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/md.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/me.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ml.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mo.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mp.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mq.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ms.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mx.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/my.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/mz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/na.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ne.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ng.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ni.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/no.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/np.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/nz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/om.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pa.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pe.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ph.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ps.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/pw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/py.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/qa.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/re.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ro.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/rs.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ru.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/rw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sa.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sb.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sd.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/se.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sh-ac.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sh-hl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sh-ta.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sh.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/si.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sj.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/so.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ss.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/st.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sx.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sy.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/sz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/td.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/th.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tj.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tl.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/to.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tr.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tv.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tw.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/tz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ua.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ug.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/um.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/un.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/us.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/uy.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/uz.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/va.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/vc.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ve.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/vg.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/vi.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/vn.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/vu.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/wf.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ws.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/xk.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/xx.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/ye.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/yt.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/za.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/zm.svg create mode 100644 public/assets/vendor/flag-icons/flags/1x1/zw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ad.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ae.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/af.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ag.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ai.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/al.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/am.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ao.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/aq.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ar.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/arab.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/as.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/asean.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/at.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/au.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/aw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ax.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/az.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ba.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bb.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bd.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/be.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bi.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bj.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bo.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bq.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/br.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bs.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/by.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/bz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ca.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cd.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cefta.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ch.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ci.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ck.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/co.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cp.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cx.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cy.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/cz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/de.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/dg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/dj.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/dk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/dm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/do.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/dz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/eac.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ec.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ee.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/eg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/eh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/er.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/es-ct.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/es-ga.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/es-pv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/es.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/et.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/eu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fi.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fj.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fo.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/fr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ga.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gb-eng.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gb-nir.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gb-sct.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gb-wls.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gb.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gd.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ge.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gi.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gp.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gq.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gs.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/gy.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/hk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/hm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/hn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/hr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ht.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/hu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ic.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/id.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ie.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/il.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/im.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/in.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/io.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/iq.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ir.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/is.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/it.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/je.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/jm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/jo.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/jp.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ke.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ki.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/km.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kp.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ky.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/kz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/la.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lb.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/li.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ls.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/lv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ly.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ma.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/md.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/me.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ml.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mo.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mp.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mq.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ms.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mx.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/my.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/mz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/na.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ne.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ng.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ni.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/no.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/np.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/nz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/om.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pa.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pe.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ph.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ps.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/pw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/py.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/qa.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/re.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ro.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/rs.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ru.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/rw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sa.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sb.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sd.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/se.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sh-ac.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sh-hl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sh-ta.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sh.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/si.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sj.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/so.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ss.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/st.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sx.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sy.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/sz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/td.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/th.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tj.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tl.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/to.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tr.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tv.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tw.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/tz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ua.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ug.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/um.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/un.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/us.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/uy.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/uz.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/va.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/vc.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ve.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/vg.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/vi.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/vn.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/vu.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/wf.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ws.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/xk.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/xx.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/ye.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/yt.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/za.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/zm.svg create mode 100644 public/assets/vendor/flag-icons/flags/4x3/zw.svg create mode 100644 scripts/sync-assets.js create mode 100644 src/js/editor.js diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 8295500..7f95d5e 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -10,9 +10,9 @@ on: env: # Use docker.io for Docker Hub if empty - REGISTRY: docker.io + REGISTRY: ghcr.io # github.repository as / - IMAGE_NAME: dyzulk/mivo + IMAGE_NAME: ${{ github.repository }} jobs: build: @@ -30,13 +30,21 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - # Login against a Docker registry except on PR - # https://github.com/docker/login-action + # Login against GHCR - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + # Login against Docker Hub (Optional fallback if secrets exist) + - name: Log into Docker Hub + if: github.event_name != 'pull_request' && secrets.DOCKER_USERNAME != '' + uses: docker/login-action@v3 + with: + registry: docker.io username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} @@ -46,13 +54,12 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + images: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + docker.io/${{ env.IMAGE_NAME }} tags: | - # Branch main -> dyzulk/mivo:edge type=raw,value=edge,enable={{is_default_branch}} - # Tag v1.0.0 -> dyzulk/mivo:1.0.0 type=ref,event=tag - # Tag v1.0.0 -> dyzulk/mivo:latest type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }} # Build and push Docker image with Buildx (don't push on PR) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6af229d..774acb0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -32,11 +32,25 @@ jobs: # Export source using git archive (respects .gitattributes) git archive --format=tar HEAD | tar -x -C release_temp + - name: Install Development Dependencies (for Build) + run: npm install + + - name: Build Localized Assets & Editor Bundle + run: | + npm run sync:assets + npm run build:editor + - name: Install Production Dependencies run: | cd release_temp composer install --no-dev --optimize-autoloader --no-interaction --ignore-platform-reqs + - name: Copy Build Artifacts to Release + run: | + cp -r public/assets/vendor/ release_temp/public/assets/ + mkdir -p release_temp/public/assets/js/vendor/ + cp public/assets/js/vendor/editor.bundle.js release_temp/public/assets/js/vendor/ + - name: Build Zip Artifact run: | cd release_temp diff --git a/DOCKER_README.md b/DOCKER_README.md index 8cdaf9d..3cc9657 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -1,5 +1,5 @@

- MIVO Logo + MIVO Logo

# MIVO (Mikrotik Voucher) Docker Image @@ -24,7 +24,7 @@ docker run -d \ -e APP_ENV=production \ -v mivo_data:/var/www/html/app/Database \ -v mivo_config:/var/www/html/.env \ - dyzulk/mivo:latest + ghcr.io/mivodev/mivo:latest ``` Open your browser and navigate to `http://localhost:8080`. @@ -39,7 +39,7 @@ For a more permanent setup, use `docker-compose.yml`: ```yaml services: mivo: - image: dyzulk/mivo:latest + image: ghcr.io/mivodev/mivo:latest container_name: mivo restart: unless-stopped ports: @@ -111,4 +111,4 @@ If you find MIVO useful, please consider supporting its development. Your contri [![SociaBuzz Tribe](https://img.shields.io/badge/SociaBuzz-Tribe-green?style=for-the-badge&logo=sociabuzz&logoColor=white)](https://sociabuzz.com/dyzulkdev/tribe) --- -*Created by DyzulkDev* +*Created by MivoDev* diff --git a/README.md b/README.md index cfda3c6..85d7121 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ MIVO is a next-generation **Mikrotik Voucher Management System** with a modern M 1. **Install via Composer** ```bash - composer create-project dyzulk/mivo + composer create-project mivodev/mivo cd mivo ``` > **Alternative (Docker):** > ```bash - > docker pull dyzulk/mivo + > docker pull ghcr.io/mivodev/mivo > ``` > *See [INSTALLATION.md](docs/INSTALLATION.md) for more tags.* @@ -83,4 +83,4 @@ If you find MIVO useful, please consider supporting its development. Your contri This project is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT). --- -*Created by DyzulkDev* +*Created by MivoDev* diff --git a/app/Config/SiteConfig.php b/app/Config/SiteConfig.php index a974164..8d202c1 100644 --- a/app/Config/SiteConfig.php +++ b/app/Config/SiteConfig.php @@ -5,10 +5,10 @@ class SiteConfig { const APP_NAME = 'MIVO'; const APP_VERSION = 'v1.1.0'; const APP_FULL_NAME = 'MIVO - Mikrotik Voucher'; - const CREDIT_NAME = 'DyzulkDev'; - const CREDIT_URL = 'https://dyzulk.com'; + const CREDIT_NAME = 'MivoDev'; + const CREDIT_URL = 'https://github.com/mivodev'; const YEAR = '2026'; - const REPO_URL = 'https://github.com/dyzulk/mivo'; + const REPO_URL = 'https://github.com/mivodev/mivo'; // Security Keys // Fetched from .env or fallback to default diff --git a/app/Core/Hooks.php b/app/Core/Hooks.php new file mode 100644 index 0000000..40e5525 --- /dev/null +++ b/app/Core/Hooks.php @@ -0,0 +1,120 @@ + $callback, + 'accepted_args' => $accepted_args + ]; + } + + /** + * Execute an action + * + * @param string $tag The name of the action hook + * @param mixed ...$args Optional arguments to pass to the callback + */ + public static function doAction($tag, ...$args) + { + if (empty(self::$actions[$tag])) { + return; + } + + // Sort by priority + ksort(self::$actions[$tag]); + + foreach (self::$actions[$tag] as $priority => $callbacks) { + foreach ($callbacks as $callbackData) { + call_user_func_array($callbackData['function'], array_slice($args, 0, $callbackData['accepted_args'])); + } + } + } + + /** + * Register a new filter + * + * @param string $tag The name of the filter hook + * @param callable $callback The function to call + * @param int $priority Lower numbers correspond to earlier execution + * @param int $accepted_args The number of arguments the function accepts + */ + public static function addFilter($tag, $callback, $priority = 10, $accepted_args = 1) + { + self::$filters[$tag][$priority][] = [ + 'function' => $callback, + 'accepted_args' => $accepted_args + ]; + } + + /** + * Apply filters to a value + * + * @param string $tag The name of the filter hook + * @param mixed $value The value to be filtered + * @param mixed ...$args Optional extra arguments + * @return mixed The filtered value + */ + public static function applyFilters($tag, $value, ...$args) + { + if (empty(self::$filters[$tag])) { + return $value; + } + + // Sort by priority + ksort(self::$filters[$tag]); + + foreach (self::$filters[$tag] as $priority => $callbacks) { + foreach ($callbacks as $callbackData) { + // Prepend value to args + $params = array_merge([$value], array_slice($args, 0, $callbackData['accepted_args'] - 1)); + $value = call_user_func_array($callbackData['function'], $params); + } + } + + return $value; + } + + /** + * Check if any action has been registered for a hook. + * + * @param string $tag The name of the action hook. + * @return bool True if action exists, false otherwise. + */ + public static function hasAction($tag) + { + return isset(self::$actions[$tag]); + } + + /** + * Check if any filter has been registered for a hook. + * + * @param string $tag The name of the filter hook. + * @return bool True if filter exists, false otherwise. + */ + public static function hasFilter($tag) + { + return isset(self::$filters[$tag]); + } +} diff --git a/app/Core/PluginManager.php b/app/Core/PluginManager.php new file mode 100644 index 0000000..deef5e6 --- /dev/null +++ b/app/Core/PluginManager.php @@ -0,0 +1,78 @@ +pluginsDir = dirname(__DIR__, 2) . '/plugins'; // Root/plugins + } + + /** + * Load all active plugins + */ + public function loadPlugins() + { + // Ensure plugins directory exists + if (!is_dir($this->pluginsDir)) { + return; + } + + // 1. Get List of Active Plugins (For now, we load ALL folders as active) + // TODO: Implement database/config check for active status + $plugins = scandir($this->pluginsDir); + + foreach ($plugins as $pluginName) { + if ($pluginName === '.' || $pluginName === '..') { + continue; + } + + $pluginPath = $this->pluginsDir . '/' . $pluginName; + + // Check if it is a directory and has specific plugin file + if (is_dir($pluginPath) && file_exists($pluginPath . '/plugin.php')) { + $this->loadPlugin($pluginName, $pluginPath); + } + } + + // Fire 'plugins_loaded' action after all plugins are loaded + Hooks::doAction('plugins_loaded'); + } + + /** + * Load a single plugin + * + * @param string $name Plugin folder name + * @param string $path Full path to plugin directory + */ + private function loadPlugin($name, $path) + { + try { + require_once $path . '/plugin.php'; + $this->activePlugins[] = $name; + } catch (\Exception $e) { + error_log("Failed to load plugin [$name]: " . $e->getMessage()); + } + } + + /** + * Get list of loaded plugins + * + * @return array + */ + public function getActivePlugins() + { + return $this->activePlugins; + } +} diff --git a/app/Core/Router.php b/app/Core/Router.php index 437bc01..a277032 100644 --- a/app/Core/Router.php +++ b/app/Core/Router.php @@ -92,6 +92,9 @@ class Router { } public function dispatch($uri, $method) { + // Fire hook to allow plugins to register routes + \App\Core\Hooks::doAction('router_init', $this); + $path = parse_url($uri, PHP_URL_PATH); // Handle subdirectory diff --git a/app/Helpers/TemplateHelper.php b/app/Helpers/TemplateHelper.php index 2ee1ec8..0069721 100644 --- a/app/Helpers/TemplateHelper.php +++ b/app/Helpers/TemplateHelper.php @@ -51,8 +51,8 @@ class TemplateHelper { $content = str_replace(array_keys($dummyData), array_values($dummyData), $content); - // QR Code replacement - $content = preg_replace('/\{\{\s*qrcode.*?\}\}/i', '', $content); + // QR Code replacement - Using canvas for client-side rendering with QRious + $content = preg_replace('/\{\{\s*qrcode\s*(.*?)\s*\}\}/i', '', $content); return $content; } @@ -69,6 +69,7 @@ class TemplateHelper { body { display: flex; align-items: center; justify-content: center; background-color: transparent; } #wrapper { display: inline-block; transform-origin: center center; box-shadow: 0 1px 3px rgba(0,0,0,0.1); } +
' . $mockContent . '
@@ -76,6 +77,48 @@ class TemplateHelper { window.addEventListener("load", () => { const wrap = document.getElementById("wrapper"); if(!wrap) return; + + // Render QR Codes + document.querySelectorAll(".qrcode-placeholder").forEach(canvas => { + const optionsStr = canvas.dataset.options || ""; + const options = {}; + + // Robust parser for "fg=red bg=#fff size=100" format + const regex = /([a-z]+)=([^ \t\r\n\f\v"]+|"[^"]*"|\'[^\']*\')/gi; + let match; + while ((match = regex.exec(optionsStr)) !== null) { + let key = match[1].toLowerCase(); + let val = match[2].replace(/["\']/g, ""); + options[key] = val; + } + + new QRious({ + element: canvas, + value: "http://hotspot.lan/login?username=u-5829&password=5912", + size: parseInt(options.size) || 100, + foreground: options.fg || "#000000", + backgroundAlpha: 0, + level: "M" + }); + + // Handle styles via CSS for better compatibility with rounding and padding + if (options.size) { + canvas.style.width = options.size + "px"; + canvas.style.height = options.size + "px"; + } + + if (options.bg) { + canvas.style.backgroundColor = options.bg; + } + + if (options.padding) { + canvas.style.padding = options.padding + "px"; + } + + if (options.rounded) { + canvas.style.borderRadius = options.rounded + "px"; + } + }); const updateScale = () => { const w = wrap.offsetWidth; diff --git a/app/Views/layouts/footer_main.php b/app/Views/layouts/footer_main.php index 7b7785a..c551f8d 100644 --- a/app/Views/layouts/footer_main.php +++ b/app/Views/layouts/footer_main.php @@ -9,15 +9,15 @@