telpick 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.es.md +225 -0
- package/README.md +225 -0
- package/dist/assets/country-code.json +94 -0
- package/dist/assets/flags/ad.webp +0 -0
- package/dist/assets/flags/ae.webp +0 -0
- package/dist/assets/flags/af.png +0 -0
- package/dist/assets/flags/ag.webp +0 -0
- package/dist/assets/flags/ai.webp +0 -0
- package/dist/assets/flags/al.webp +0 -0
- package/dist/assets/flags/am.webp +0 -0
- package/dist/assets/flags/ao.webp +0 -0
- package/dist/assets/flags/aq.webp +0 -0
- package/dist/assets/flags/ar.webp +0 -0
- package/dist/assets/flags/as.webp +0 -0
- package/dist/assets/flags/at.webp +0 -0
- package/dist/assets/flags/au.webp +0 -0
- package/dist/assets/flags/aw.webp +0 -0
- package/dist/assets/flags/ax.webp +0 -0
- package/dist/assets/flags/az.webp +0 -0
- package/dist/assets/flags/ba.webp +0 -0
- package/dist/assets/flags/bb.webp +0 -0
- package/dist/assets/flags/bd.webp +0 -0
- package/dist/assets/flags/be.webp +0 -0
- package/dist/assets/flags/bf.webp +0 -0
- package/dist/assets/flags/bg.webp +0 -0
- package/dist/assets/flags/bh.webp +0 -0
- package/dist/assets/flags/bi.webp +0 -0
- package/dist/assets/flags/bj.webp +0 -0
- package/dist/assets/flags/bl.webp +0 -0
- package/dist/assets/flags/bm.webp +0 -0
- package/dist/assets/flags/bn.webp +0 -0
- package/dist/assets/flags/bo.webp +0 -0
- package/dist/assets/flags/bq.webp +0 -0
- package/dist/assets/flags/br.webp +0 -0
- package/dist/assets/flags/bs.webp +0 -0
- package/dist/assets/flags/bt.webp +0 -0
- package/dist/assets/flags/bv.webp +0 -0
- package/dist/assets/flags/bw.webp +0 -0
- package/dist/assets/flags/by.webp +0 -0
- package/dist/assets/flags/bz.webp +0 -0
- package/dist/assets/flags/ca.webp +0 -0
- package/dist/assets/flags/cc.webp +0 -0
- package/dist/assets/flags/cd.webp +0 -0
- package/dist/assets/flags/cf.webp +0 -0
- package/dist/assets/flags/cg.webp +0 -0
- package/dist/assets/flags/ch.webp +0 -0
- package/dist/assets/flags/ci.webp +0 -0
- package/dist/assets/flags/ck.webp +0 -0
- package/dist/assets/flags/cl.webp +0 -0
- package/dist/assets/flags/cm.webp +0 -0
- package/dist/assets/flags/cn.webp +0 -0
- package/dist/assets/flags/co.webp +0 -0
- package/dist/assets/flags/cr.webp +0 -0
- package/dist/assets/flags/cu.webp +0 -0
- package/dist/assets/flags/cv.webp +0 -0
- package/dist/assets/flags/cw.webp +0 -0
- package/dist/assets/flags/cx.webp +0 -0
- package/dist/assets/flags/cy.webp +0 -0
- package/dist/assets/flags/cz.webp +0 -0
- package/dist/assets/flags/de.webp +0 -0
- package/dist/assets/flags/dj.webp +0 -0
- package/dist/assets/flags/dk.webp +0 -0
- package/dist/assets/flags/dm.webp +0 -0
- package/dist/assets/flags/do.webp +0 -0
- package/dist/assets/flags/dz.webp +0 -0
- package/dist/assets/flags/ec.webp +0 -0
- package/dist/assets/flags/ee.webp +0 -0
- package/dist/assets/flags/eg.webp +0 -0
- package/dist/assets/flags/eh.webp +0 -0
- package/dist/assets/flags/er.webp +0 -0
- package/dist/assets/flags/es.webp +0 -0
- package/dist/assets/flags/et.webp +0 -0
- package/dist/assets/flags/fi.webp +0 -0
- package/dist/assets/flags/fj.webp +0 -0
- package/dist/assets/flags/fk.webp +0 -0
- package/dist/assets/flags/fm.webp +0 -0
- package/dist/assets/flags/fo.webp +0 -0
- package/dist/assets/flags/fr.webp +0 -0
- package/dist/assets/flags/ga.webp +0 -0
- package/dist/assets/flags/gb-eng.webp +0 -0
- package/dist/assets/flags/gb-nir.webp +0 -0
- package/dist/assets/flags/gb-sct.webp +0 -0
- package/dist/assets/flags/gb-wls.webp +0 -0
- package/dist/assets/flags/gb.webp +0 -0
- package/dist/assets/flags/gd.webp +0 -0
- package/dist/assets/flags/ge.webp +0 -0
- package/dist/assets/flags/gf.webp +0 -0
- package/dist/assets/flags/gg.webp +0 -0
- package/dist/assets/flags/gh.webp +0 -0
- package/dist/assets/flags/gi.webp +0 -0
- package/dist/assets/flags/gl.webp +0 -0
- package/dist/assets/flags/gm.webp +0 -0
- package/dist/assets/flags/gn.webp +0 -0
- package/dist/assets/flags/gp.webp +0 -0
- package/dist/assets/flags/gq.webp +0 -0
- package/dist/assets/flags/gr.webp +0 -0
- package/dist/assets/flags/gs.webp +0 -0
- package/dist/assets/flags/gt.webp +0 -0
- package/dist/assets/flags/gu.webp +0 -0
- package/dist/assets/flags/gw.webp +0 -0
- package/dist/assets/flags/gy.webp +0 -0
- package/dist/assets/flags/hk.webp +0 -0
- package/dist/assets/flags/hm.webp +0 -0
- package/dist/assets/flags/hn.webp +0 -0
- package/dist/assets/flags/hr.webp +0 -0
- package/dist/assets/flags/ht.webp +0 -0
- package/dist/assets/flags/hu.webp +0 -0
- package/dist/assets/flags/id.webp +0 -0
- package/dist/assets/flags/ie.webp +0 -0
- package/dist/assets/flags/il.webp +0 -0
- package/dist/assets/flags/im.webp +0 -0
- package/dist/assets/flags/in.webp +0 -0
- package/dist/assets/flags/io.webp +0 -0
- package/dist/assets/flags/iq.webp +0 -0
- package/dist/assets/flags/ir.webp +0 -0
- package/dist/assets/flags/is.webp +0 -0
- package/dist/assets/flags/it.webp +0 -0
- package/dist/assets/flags/je.webp +0 -0
- package/dist/assets/flags/jm.webp +0 -0
- package/dist/assets/flags/jo.webp +0 -0
- package/dist/assets/flags/jp.webp +0 -0
- package/dist/assets/flags/ke.webp +0 -0
- package/dist/assets/flags/kg.webp +0 -0
- package/dist/assets/flags/kh.webp +0 -0
- package/dist/assets/flags/ki.webp +0 -0
- package/dist/assets/flags/km.webp +0 -0
- package/dist/assets/flags/kn.webp +0 -0
- package/dist/assets/flags/kp.webp +0 -0
- package/dist/assets/flags/kr.webp +0 -0
- package/dist/assets/flags/kw.webp +0 -0
- package/dist/assets/flags/ky.webp +0 -0
- package/dist/assets/flags/kz.webp +0 -0
- package/dist/assets/flags/la.webp +0 -0
- package/dist/assets/flags/lb.webp +0 -0
- package/dist/assets/flags/lc.webp +0 -0
- package/dist/assets/flags/li.webp +0 -0
- package/dist/assets/flags/lista.txt +0 -0
- package/dist/assets/flags/lk.webp +0 -0
- package/dist/assets/flags/lr.webp +0 -0
- package/dist/assets/flags/ls.webp +0 -0
- package/dist/assets/flags/lt.webp +0 -0
- package/dist/assets/flags/lu.webp +0 -0
- package/dist/assets/flags/lv.webp +0 -0
- package/dist/assets/flags/ly.webp +0 -0
- package/dist/assets/flags/ma.webp +0 -0
- package/dist/assets/flags/mc.webp +0 -0
- package/dist/assets/flags/md.webp +0 -0
- package/dist/assets/flags/me.webp +0 -0
- package/dist/assets/flags/mf.webp +0 -0
- package/dist/assets/flags/mg.webp +0 -0
- package/dist/assets/flags/mh.webp +0 -0
- package/dist/assets/flags/mk.webp +0 -0
- package/dist/assets/flags/ml.webp +0 -0
- package/dist/assets/flags/mm.webp +0 -0
- package/dist/assets/flags/mn.webp +0 -0
- package/dist/assets/flags/mo.webp +0 -0
- package/dist/assets/flags/mp.webp +0 -0
- package/dist/assets/flags/mq.webp +0 -0
- package/dist/assets/flags/mr.webp +0 -0
- package/dist/assets/flags/ms.webp +0 -0
- package/dist/assets/flags/mt.webp +0 -0
- package/dist/assets/flags/mu.webp +0 -0
- package/dist/assets/flags/mv.webp +0 -0
- package/dist/assets/flags/mw.webp +0 -0
- package/dist/assets/flags/mx.webp +0 -0
- package/dist/assets/flags/my.webp +0 -0
- package/dist/assets/flags/mz.webp +0 -0
- package/dist/assets/flags/na.webp +0 -0
- package/dist/assets/flags/nc.webp +0 -0
- package/dist/assets/flags/ne.webp +0 -0
- package/dist/assets/flags/nf.webp +0 -0
- package/dist/assets/flags/ng.webp +0 -0
- package/dist/assets/flags/ni.webp +0 -0
- package/dist/assets/flags/nl.webp +0 -0
- package/dist/assets/flags/no.webp +0 -0
- package/dist/assets/flags/np.webp +0 -0
- package/dist/assets/flags/nr.webp +0 -0
- package/dist/assets/flags/nu.webp +0 -0
- package/dist/assets/flags/nz.webp +0 -0
- package/dist/assets/flags/om.webp +0 -0
- package/dist/assets/flags/pa.webp +0 -0
- package/dist/assets/flags/pe.webp +0 -0
- package/dist/assets/flags/pf.webp +0 -0
- package/dist/assets/flags/pg.webp +0 -0
- package/dist/assets/flags/ph.webp +0 -0
- package/dist/assets/flags/pk.webp +0 -0
- package/dist/assets/flags/pl.webp +0 -0
- package/dist/assets/flags/pm.webp +0 -0
- package/dist/assets/flags/pn.webp +0 -0
- package/dist/assets/flags/pr.webp +0 -0
- package/dist/assets/flags/ps.webp +0 -0
- package/dist/assets/flags/pt.webp +0 -0
- package/dist/assets/flags/pw.webp +0 -0
- package/dist/assets/flags/py.webp +0 -0
- package/dist/assets/flags/qa.webp +0 -0
- package/dist/assets/flags/re.webp +0 -0
- package/dist/assets/flags/ro.webp +0 -0
- package/dist/assets/flags/rs.webp +0 -0
- package/dist/assets/flags/ru.webp +0 -0
- package/dist/assets/flags/rw.webp +0 -0
- package/dist/assets/flags/sa.webp +0 -0
- package/dist/assets/flags/sb.webp +0 -0
- package/dist/assets/flags/sc.webp +0 -0
- package/dist/assets/flags/sd.webp +0 -0
- package/dist/assets/flags/se (1).webp +0 -0
- package/dist/assets/flags/se.webp +0 -0
- package/dist/assets/flags/sg.webp +0 -0
- package/dist/assets/flags/sh.webp +0 -0
- package/dist/assets/flags/si.webp +0 -0
- package/dist/assets/flags/sj.webp +0 -0
- package/dist/assets/flags/sk.webp +0 -0
- package/dist/assets/flags/sl.webp +0 -0
- package/dist/assets/flags/sm.webp +0 -0
- package/dist/assets/flags/sn.webp +0 -0
- package/dist/assets/flags/so.webp +0 -0
- package/dist/assets/flags/sr.webp +0 -0
- package/dist/assets/flags/ss.webp +0 -0
- package/dist/assets/flags/st.webp +0 -0
- package/dist/assets/flags/sv.webp +0 -0
- package/dist/assets/flags/sx.webp +0 -0
- package/dist/assets/flags/sy.webp +0 -0
- package/dist/assets/flags/sz.webp +0 -0
- package/dist/assets/flags/tc.webp +0 -0
- package/dist/assets/flags/td.webp +0 -0
- package/dist/assets/flags/tf.webp +0 -0
- package/dist/assets/flags/tg.webp +0 -0
- package/dist/assets/flags/th.webp +0 -0
- package/dist/assets/flags/tj.webp +0 -0
- package/dist/assets/flags/tk.webp +0 -0
- package/dist/assets/flags/tl.webp +0 -0
- package/dist/assets/flags/tm.webp +0 -0
- package/dist/assets/flags/tn.webp +0 -0
- package/dist/assets/flags/to.webp +0 -0
- package/dist/assets/flags/tr.webp +0 -0
- package/dist/assets/flags/tt.webp +0 -0
- package/dist/assets/flags/tv.webp +0 -0
- package/dist/assets/flags/tw.webp +0 -0
- package/dist/assets/flags/tz.webp +0 -0
- package/dist/assets/flags/ua.webp +0 -0
- package/dist/assets/flags/ug.webp +0 -0
- package/dist/assets/flags/um.webp +0 -0
- package/dist/assets/flags/us.webp +0 -0
- package/dist/assets/flags/uy.webp +0 -0
- package/dist/assets/flags/uz.webp +0 -0
- package/dist/assets/flags/va.webp +0 -0
- package/dist/assets/flags/vc.webp +0 -0
- package/dist/assets/flags/ve.webp +0 -0
- package/dist/assets/flags/vg.webp +0 -0
- package/dist/assets/flags/vi.webp +0 -0
- package/dist/assets/flags/vn.webp +0 -0
- package/dist/assets/flags/vu.webp +0 -0
- package/dist/assets/flags/wf.webp +0 -0
- package/dist/assets/flags/ws.webp +0 -0
- package/dist/assets/flags/xk.webp +0 -0
- package/dist/assets/flags/ye.webp +0 -0
- package/dist/assets/flags/yt.webp +0 -0
- package/dist/assets/flags/za.webp +0 -0
- package/dist/assets/flags/zm.webp +0 -0
- package/dist/assets/flags/zw.webp +0 -0
- package/dist/style.css +1 -0
- package/dist/telpick.es.js +787 -0
- package/dist/telpick.react.es.js +14 -0
- package/dist/telpick.umd.js +1 -0
- package/dist/telpick.vue.es.js +27 -0
- package/package.json +103 -0
- package/src/assets/country-code.json +94 -0
- package/src/assets/flags/ad.webp +0 -0
- package/src/assets/flags/ae.webp +0 -0
- package/src/assets/flags/af.png +0 -0
- package/src/assets/flags/ag.webp +0 -0
- package/src/assets/flags/ai.webp +0 -0
- package/src/assets/flags/al.webp +0 -0
- package/src/assets/flags/am.webp +0 -0
- package/src/assets/flags/ao.webp +0 -0
- package/src/assets/flags/aq.webp +0 -0
- package/src/assets/flags/ar.webp +0 -0
- package/src/assets/flags/as.webp +0 -0
- package/src/assets/flags/at.webp +0 -0
- package/src/assets/flags/au.webp +0 -0
- package/src/assets/flags/aw.webp +0 -0
- package/src/assets/flags/ax.webp +0 -0
- package/src/assets/flags/az.webp +0 -0
- package/src/assets/flags/ba.webp +0 -0
- package/src/assets/flags/bb.webp +0 -0
- package/src/assets/flags/bd.webp +0 -0
- package/src/assets/flags/be.webp +0 -0
- package/src/assets/flags/bf.webp +0 -0
- package/src/assets/flags/bg.webp +0 -0
- package/src/assets/flags/bh.webp +0 -0
- package/src/assets/flags/bi.webp +0 -0
- package/src/assets/flags/bj.webp +0 -0
- package/src/assets/flags/bl.webp +0 -0
- package/src/assets/flags/bm.webp +0 -0
- package/src/assets/flags/bn.webp +0 -0
- package/src/assets/flags/bo.webp +0 -0
- package/src/assets/flags/bq.webp +0 -0
- package/src/assets/flags/br.webp +0 -0
- package/src/assets/flags/bs.webp +0 -0
- package/src/assets/flags/bt.webp +0 -0
- package/src/assets/flags/bv.webp +0 -0
- package/src/assets/flags/bw.webp +0 -0
- package/src/assets/flags/by.webp +0 -0
- package/src/assets/flags/bz.webp +0 -0
- package/src/assets/flags/ca.webp +0 -0
- package/src/assets/flags/cc.webp +0 -0
- package/src/assets/flags/cd.webp +0 -0
- package/src/assets/flags/cf.webp +0 -0
- package/src/assets/flags/cg.webp +0 -0
- package/src/assets/flags/ch.webp +0 -0
- package/src/assets/flags/ci.webp +0 -0
- package/src/assets/flags/ck.webp +0 -0
- package/src/assets/flags/cl.webp +0 -0
- package/src/assets/flags/cm.webp +0 -0
- package/src/assets/flags/cn.webp +0 -0
- package/src/assets/flags/co.webp +0 -0
- package/src/assets/flags/cr.webp +0 -0
- package/src/assets/flags/cu.webp +0 -0
- package/src/assets/flags/cv.webp +0 -0
- package/src/assets/flags/cw.webp +0 -0
- package/src/assets/flags/cx.webp +0 -0
- package/src/assets/flags/cy.webp +0 -0
- package/src/assets/flags/cz.webp +0 -0
- package/src/assets/flags/de.webp +0 -0
- package/src/assets/flags/dj.webp +0 -0
- package/src/assets/flags/dk.webp +0 -0
- package/src/assets/flags/dm.webp +0 -0
- package/src/assets/flags/do.webp +0 -0
- package/src/assets/flags/dz.webp +0 -0
- package/src/assets/flags/ec.webp +0 -0
- package/src/assets/flags/ee.webp +0 -0
- package/src/assets/flags/eg.webp +0 -0
- package/src/assets/flags/eh.webp +0 -0
- package/src/assets/flags/er.webp +0 -0
- package/src/assets/flags/es.webp +0 -0
- package/src/assets/flags/et.webp +0 -0
- package/src/assets/flags/fi.webp +0 -0
- package/src/assets/flags/fj.webp +0 -0
- package/src/assets/flags/fk.webp +0 -0
- package/src/assets/flags/fm.webp +0 -0
- package/src/assets/flags/fo.webp +0 -0
- package/src/assets/flags/fr.webp +0 -0
- package/src/assets/flags/ga.webp +0 -0
- package/src/assets/flags/gb-eng.webp +0 -0
- package/src/assets/flags/gb-nir.webp +0 -0
- package/src/assets/flags/gb-sct.webp +0 -0
- package/src/assets/flags/gb-wls.webp +0 -0
- package/src/assets/flags/gb.webp +0 -0
- package/src/assets/flags/gd.webp +0 -0
- package/src/assets/flags/ge.webp +0 -0
- package/src/assets/flags/gf.webp +0 -0
- package/src/assets/flags/gg.webp +0 -0
- package/src/assets/flags/gh.webp +0 -0
- package/src/assets/flags/gi.webp +0 -0
- package/src/assets/flags/gl.webp +0 -0
- package/src/assets/flags/gm.webp +0 -0
- package/src/assets/flags/gn.webp +0 -0
- package/src/assets/flags/gp.webp +0 -0
- package/src/assets/flags/gq.webp +0 -0
- package/src/assets/flags/gr.webp +0 -0
- package/src/assets/flags/gs.webp +0 -0
- package/src/assets/flags/gt.webp +0 -0
- package/src/assets/flags/gu.webp +0 -0
- package/src/assets/flags/gw.webp +0 -0
- package/src/assets/flags/gy.webp +0 -0
- package/src/assets/flags/hk.webp +0 -0
- package/src/assets/flags/hm.webp +0 -0
- package/src/assets/flags/hn.webp +0 -0
- package/src/assets/flags/hr.webp +0 -0
- package/src/assets/flags/ht.webp +0 -0
- package/src/assets/flags/hu.webp +0 -0
- package/src/assets/flags/id.webp +0 -0
- package/src/assets/flags/ie.webp +0 -0
- package/src/assets/flags/il.webp +0 -0
- package/src/assets/flags/im.webp +0 -0
- package/src/assets/flags/in.webp +0 -0
- package/src/assets/flags/io.webp +0 -0
- package/src/assets/flags/iq.webp +0 -0
- package/src/assets/flags/ir.webp +0 -0
- package/src/assets/flags/is.webp +0 -0
- package/src/assets/flags/it.webp +0 -0
- package/src/assets/flags/je.webp +0 -0
- package/src/assets/flags/jm.webp +0 -0
- package/src/assets/flags/jo.webp +0 -0
- package/src/assets/flags/jp.webp +0 -0
- package/src/assets/flags/ke.webp +0 -0
- package/src/assets/flags/kg.webp +0 -0
- package/src/assets/flags/kh.webp +0 -0
- package/src/assets/flags/ki.webp +0 -0
- package/src/assets/flags/km.webp +0 -0
- package/src/assets/flags/kn.webp +0 -0
- package/src/assets/flags/kp.webp +0 -0
- package/src/assets/flags/kr.webp +0 -0
- package/src/assets/flags/kw.webp +0 -0
- package/src/assets/flags/ky.webp +0 -0
- package/src/assets/flags/kz.webp +0 -0
- package/src/assets/flags/la.webp +0 -0
- package/src/assets/flags/lb.webp +0 -0
- package/src/assets/flags/lc.webp +0 -0
- package/src/assets/flags/li.webp +0 -0
- package/src/assets/flags/lista.txt +0 -0
- package/src/assets/flags/lk.webp +0 -0
- package/src/assets/flags/lr.webp +0 -0
- package/src/assets/flags/ls.webp +0 -0
- package/src/assets/flags/lt.webp +0 -0
- package/src/assets/flags/lu.webp +0 -0
- package/src/assets/flags/lv.webp +0 -0
- package/src/assets/flags/ly.webp +0 -0
- package/src/assets/flags/ma.webp +0 -0
- package/src/assets/flags/mc.webp +0 -0
- package/src/assets/flags/md.webp +0 -0
- package/src/assets/flags/me.webp +0 -0
- package/src/assets/flags/mf.webp +0 -0
- package/src/assets/flags/mg.webp +0 -0
- package/src/assets/flags/mh.webp +0 -0
- package/src/assets/flags/mk.webp +0 -0
- package/src/assets/flags/ml.webp +0 -0
- package/src/assets/flags/mm.webp +0 -0
- package/src/assets/flags/mn.webp +0 -0
- package/src/assets/flags/mo.webp +0 -0
- package/src/assets/flags/mp.webp +0 -0
- package/src/assets/flags/mq.webp +0 -0
- package/src/assets/flags/mr.webp +0 -0
- package/src/assets/flags/ms.webp +0 -0
- package/src/assets/flags/mt.webp +0 -0
- package/src/assets/flags/mu.webp +0 -0
- package/src/assets/flags/mv.webp +0 -0
- package/src/assets/flags/mw.webp +0 -0
- package/src/assets/flags/mx.webp +0 -0
- package/src/assets/flags/my.webp +0 -0
- package/src/assets/flags/mz.webp +0 -0
- package/src/assets/flags/na.webp +0 -0
- package/src/assets/flags/nc.webp +0 -0
- package/src/assets/flags/ne.webp +0 -0
- package/src/assets/flags/nf.webp +0 -0
- package/src/assets/flags/ng.webp +0 -0
- package/src/assets/flags/ni.webp +0 -0
- package/src/assets/flags/nl.webp +0 -0
- package/src/assets/flags/no.webp +0 -0
- package/src/assets/flags/np.webp +0 -0
- package/src/assets/flags/nr.webp +0 -0
- package/src/assets/flags/nu.webp +0 -0
- package/src/assets/flags/nz.webp +0 -0
- package/src/assets/flags/om.webp +0 -0
- package/src/assets/flags/pa.webp +0 -0
- package/src/assets/flags/pe.webp +0 -0
- package/src/assets/flags/pf.webp +0 -0
- package/src/assets/flags/pg.webp +0 -0
- package/src/assets/flags/ph.webp +0 -0
- package/src/assets/flags/pk.webp +0 -0
- package/src/assets/flags/pl.webp +0 -0
- package/src/assets/flags/pm.webp +0 -0
- package/src/assets/flags/pn.webp +0 -0
- package/src/assets/flags/pr.webp +0 -0
- package/src/assets/flags/ps.webp +0 -0
- package/src/assets/flags/pt.webp +0 -0
- package/src/assets/flags/pw.webp +0 -0
- package/src/assets/flags/py.webp +0 -0
- package/src/assets/flags/qa.webp +0 -0
- package/src/assets/flags/re.webp +0 -0
- package/src/assets/flags/ro.webp +0 -0
- package/src/assets/flags/rs.webp +0 -0
- package/src/assets/flags/ru.webp +0 -0
- package/src/assets/flags/rw.webp +0 -0
- package/src/assets/flags/sa.webp +0 -0
- package/src/assets/flags/sb.webp +0 -0
- package/src/assets/flags/sc.webp +0 -0
- package/src/assets/flags/sd.webp +0 -0
- package/src/assets/flags/se (1).webp +0 -0
- package/src/assets/flags/se.webp +0 -0
- package/src/assets/flags/sg.webp +0 -0
- package/src/assets/flags/sh.webp +0 -0
- package/src/assets/flags/si.webp +0 -0
- package/src/assets/flags/sj.webp +0 -0
- package/src/assets/flags/sk.webp +0 -0
- package/src/assets/flags/sl.webp +0 -0
- package/src/assets/flags/sm.webp +0 -0
- package/src/assets/flags/sn.webp +0 -0
- package/src/assets/flags/so.webp +0 -0
- package/src/assets/flags/sr.webp +0 -0
- package/src/assets/flags/ss.webp +0 -0
- package/src/assets/flags/st.webp +0 -0
- package/src/assets/flags/sv.webp +0 -0
- package/src/assets/flags/sx.webp +0 -0
- package/src/assets/flags/sy.webp +0 -0
- package/src/assets/flags/sz.webp +0 -0
- package/src/assets/flags/tc.webp +0 -0
- package/src/assets/flags/td.webp +0 -0
- package/src/assets/flags/tf.webp +0 -0
- package/src/assets/flags/tg.webp +0 -0
- package/src/assets/flags/th.webp +0 -0
- package/src/assets/flags/tj.webp +0 -0
- package/src/assets/flags/tk.webp +0 -0
- package/src/assets/flags/tl.webp +0 -0
- package/src/assets/flags/tm.webp +0 -0
- package/src/assets/flags/tn.webp +0 -0
- package/src/assets/flags/to.webp +0 -0
- package/src/assets/flags/tr.webp +0 -0
- package/src/assets/flags/tt.webp +0 -0
- package/src/assets/flags/tv.webp +0 -0
- package/src/assets/flags/tw.webp +0 -0
- package/src/assets/flags/tz.webp +0 -0
- package/src/assets/flags/ua.webp +0 -0
- package/src/assets/flags/ug.webp +0 -0
- package/src/assets/flags/um.webp +0 -0
- package/src/assets/flags/us.webp +0 -0
- package/src/assets/flags/uy.webp +0 -0
- package/src/assets/flags/uz.webp +0 -0
- package/src/assets/flags/va.webp +0 -0
- package/src/assets/flags/vc.webp +0 -0
- package/src/assets/flags/ve.webp +0 -0
- package/src/assets/flags/vg.webp +0 -0
- package/src/assets/flags/vi.webp +0 -0
- package/src/assets/flags/vn.webp +0 -0
- package/src/assets/flags/vu.webp +0 -0
- package/src/assets/flags/wf.webp +0 -0
- package/src/assets/flags/ws.webp +0 -0
- package/src/assets/flags/xk.webp +0 -0
- package/src/assets/flags/ye.webp +0 -0
- package/src/assets/flags/yt.webp +0 -0
- package/src/assets/flags/za.webp +0 -0
- package/src/assets/flags/zm.webp +0 -0
- package/src/assets/flags/zw.webp +0 -0
- package/src/demo-init.js +34 -0
- package/src/telpick.cdn.js +7 -0
- package/src/telpick.css +289 -0
- package/src/telpick.js +314 -0
- package/src/telpick.react.tsx +140 -0
- package/src/telpick.ts +157 -0
- package/src/telpick.vanilla.js +199 -0
- package/src/telpick.vue.ts +144 -0
- package/src/telpick.wrappers.jsx +37 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import React, { useState, useEffect, useRef, useMemo } from 'react'
|
|
2
|
+
import { getDefaultCountry, useClickOutside, CountryCode, TelpickProps } from './telpick'
|
|
3
|
+
import './telpick.css'
|
|
4
|
+
|
|
5
|
+
export function TelpickReact({ code, onChange, styleOverrides }: TelpickProps) {
|
|
6
|
+
const [codes, setCodes] = useState<CountryCode[]>([])
|
|
7
|
+
const [selectedCode, setSelectedCode] = useState(code)
|
|
8
|
+
const [isDropdownOpen, setDropdownOpen] = useState(false)
|
|
9
|
+
const [searchQuery, setSearchQuery] = useState('')
|
|
10
|
+
const dropdownRef = useRef<HTMLDivElement>(null)
|
|
11
|
+
const searchInputRef = useRef<HTMLInputElement>(null)
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
fetch('/resources/api/country-codes.json')
|
|
15
|
+
.then(res => res.json())
|
|
16
|
+
.then(data => {
|
|
17
|
+
const sorted = data.sort((a, b) => a.country.localeCompare(b.country, 'es'))
|
|
18
|
+
setCodes(sorted)
|
|
19
|
+
if (!code) {
|
|
20
|
+
getDefaultCountry(data).then(def => {
|
|
21
|
+
if (def) {
|
|
22
|
+
setSelectedCode(def.country_code)
|
|
23
|
+
onChange && onChange(def)
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
} else {
|
|
27
|
+
setSelectedCode(code)
|
|
28
|
+
}
|
|
29
|
+
})
|
|
30
|
+
}, [code, onChange])
|
|
31
|
+
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (code !== undefined && code !== selectedCode) {
|
|
34
|
+
setSelectedCode(code)
|
|
35
|
+
}
|
|
36
|
+
}, [code])
|
|
37
|
+
|
|
38
|
+
useEffect(() => {
|
|
39
|
+
if (dropdownRef.current) {
|
|
40
|
+
const remove = useClickOutside(dropdownRef.current, () => setDropdownOpen(false))
|
|
41
|
+
return remove
|
|
42
|
+
}
|
|
43
|
+
}, [dropdownRef])
|
|
44
|
+
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (isDropdownOpen && searchInputRef.current) {
|
|
47
|
+
searchInputRef.current.focus()
|
|
48
|
+
}
|
|
49
|
+
}, [isDropdownOpen])
|
|
50
|
+
|
|
51
|
+
const selectCode = (item: CountryCode) => {
|
|
52
|
+
setSelectedCode(item.country_code)
|
|
53
|
+
onChange && onChange(item)
|
|
54
|
+
setDropdownOpen(false)
|
|
55
|
+
setSearchQuery('')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const selectedCountry = codes.find(c => c.country_code === selectedCode) || {
|
|
59
|
+
country_code: selectedCode,
|
|
60
|
+
flag: '',
|
|
61
|
+
country: '',
|
|
62
|
+
code: '',
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const filteredCodes = useMemo(() => {
|
|
66
|
+
if (!searchQuery) return codes
|
|
67
|
+
return codes.filter(c => c.country.toLowerCase().includes(searchQuery.toLowerCase()))
|
|
68
|
+
}, [codes, searchQuery])
|
|
69
|
+
|
|
70
|
+
const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
|
71
|
+
const cursorPosition = e.target.selectionStart || 0
|
|
72
|
+
const newValue = e.target.value
|
|
73
|
+
setSearchQuery(newValue)
|
|
74
|
+
requestAnimationFrame(() => {
|
|
75
|
+
if (searchInputRef.current) {
|
|
76
|
+
searchInputRef.current.focus()
|
|
77
|
+
const newCursorPos = Math.min(cursorPosition + 1, newValue.length)
|
|
78
|
+
searchInputRef.current.setSelectionRange(newCursorPos, newCursorPos)
|
|
79
|
+
}
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return (
|
|
84
|
+
<div className="telpick-wrapper relative" ref={dropdownRef}>
|
|
85
|
+
<button
|
|
86
|
+
onClick={() => setDropdownOpen(!isDropdownOpen)}
|
|
87
|
+
className="telpick-btn"
|
|
88
|
+
style={styleOverrides}
|
|
89
|
+
aria-expanded={isDropdownOpen}
|
|
90
|
+
aria-haspopup="listbox"
|
|
91
|
+
>
|
|
92
|
+
<div className="telpick-flag">
|
|
93
|
+
{selectedCountry.flag && <img src={selectedCountry.flag} alt={selectedCountry.country || 'flag'} />}
|
|
94
|
+
</div>
|
|
95
|
+
<span>{selectedCountry.code}</span>
|
|
96
|
+
<span className="telpick-arrow ml-auto">▼</span>
|
|
97
|
+
</button>
|
|
98
|
+
{isDropdownOpen && (
|
|
99
|
+
<div
|
|
100
|
+
className="telpick-dropdown"
|
|
101
|
+
role="listbox"
|
|
102
|
+
onClick={(e) => e.stopPropagation()}
|
|
103
|
+
onMouseDown={(e) => e.stopPropagation()}
|
|
104
|
+
>
|
|
105
|
+
<input
|
|
106
|
+
ref={searchInputRef}
|
|
107
|
+
value={searchQuery}
|
|
108
|
+
onChange={handleSearchChange}
|
|
109
|
+
onClick={(e) => e.stopPropagation()}
|
|
110
|
+
onMouseDown={(e) => e.stopPropagation()}
|
|
111
|
+
type="text"
|
|
112
|
+
placeholder="Buscar país..."
|
|
113
|
+
className="telpick-search"
|
|
114
|
+
autoFocus
|
|
115
|
+
/>
|
|
116
|
+
<ul>
|
|
117
|
+
{filteredCodes.map((item, index) => {
|
|
118
|
+
const isSelected = item.country_code === selectedCode && selectedCode !== null && selectedCode !== undefined
|
|
119
|
+
return (
|
|
120
|
+
<li
|
|
121
|
+
key={`${item.country_code}-${index}`}
|
|
122
|
+
onClick={() => selectCode(item)}
|
|
123
|
+
className={`telpick-item ${isSelected ? 'telpick-item-selected' : ''}`}
|
|
124
|
+
role="option"
|
|
125
|
+
aria-selected={isSelected}
|
|
126
|
+
>
|
|
127
|
+
<div className="telpick-flag">
|
|
128
|
+
<img src={item.flag} alt={item.country} />
|
|
129
|
+
</div>
|
|
130
|
+
<span>{item.country}</span>
|
|
131
|
+
<span className="ml-auto">{item.code}</span>
|
|
132
|
+
</li>
|
|
133
|
+
)
|
|
134
|
+
})}
|
|
135
|
+
</ul>
|
|
136
|
+
</div>
|
|
137
|
+
)}
|
|
138
|
+
</div>
|
|
139
|
+
)
|
|
140
|
+
}
|
package/src/telpick.ts
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
export interface CountryCode {
|
|
2
|
+
country_code: string;
|
|
3
|
+
flag: string;
|
|
4
|
+
country: string;
|
|
5
|
+
code: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface TelpickProps {
|
|
9
|
+
code?: string;
|
|
10
|
+
onChange?: (country: CountryCode) => void;
|
|
11
|
+
styleOverrides?: Partial<Record<string, string>>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export async function getDefaultCountry(codes: CountryCode[]): Promise<CountryCode | null> {
|
|
15
|
+
const services = [
|
|
16
|
+
async () => {
|
|
17
|
+
try {
|
|
18
|
+
const res = await fetch('https://ip-api.com/json/?fields=countryCode')
|
|
19
|
+
const data = await res.json()
|
|
20
|
+
if (data.countryCode) {
|
|
21
|
+
return codes.find(c => c.country_code === data.countryCode) || null
|
|
22
|
+
}
|
|
23
|
+
} catch {}
|
|
24
|
+
return null
|
|
25
|
+
},
|
|
26
|
+
async () => {
|
|
27
|
+
try {
|
|
28
|
+
const res = await fetch('https://get.geojs.io/v1/ip/country.json')
|
|
29
|
+
const data = await res.json()
|
|
30
|
+
if (data.country) {
|
|
31
|
+
return codes.find(c => c.country_code === data.country) || null
|
|
32
|
+
}
|
|
33
|
+
} catch {}
|
|
34
|
+
return null
|
|
35
|
+
},
|
|
36
|
+
async () => {
|
|
37
|
+
try {
|
|
38
|
+
const res = await fetch('https://ipapi.co/json/')
|
|
39
|
+
const data = await res.json()
|
|
40
|
+
if (data.country_code) {
|
|
41
|
+
return codes.find(c => c.country_code === data.country_code) || null
|
|
42
|
+
}
|
|
43
|
+
} catch {}
|
|
44
|
+
return null
|
|
45
|
+
},
|
|
46
|
+
async () => {
|
|
47
|
+
try {
|
|
48
|
+
const res = await fetch('https://ip-api.io/json/')
|
|
49
|
+
const data = await res.json()
|
|
50
|
+
if (data.country_code) {
|
|
51
|
+
return codes.find(c => c.country_code === data.country_code) || null
|
|
52
|
+
}
|
|
53
|
+
} catch {}
|
|
54
|
+
return null
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
for (const service of services) {
|
|
59
|
+
try {
|
|
60
|
+
const result = await Promise.race([
|
|
61
|
+
service(),
|
|
62
|
+
new Promise<null>((resolve) => setTimeout(() => resolve(null), 3000))
|
|
63
|
+
])
|
|
64
|
+
if (result) return result
|
|
65
|
+
} catch {
|
|
66
|
+
continue
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
|
72
|
+
const timezoneToCountry: Record<string, string> = {
|
|
73
|
+
'America/Lima': 'PE',
|
|
74
|
+
'America/Bogota': 'CO',
|
|
75
|
+
'America/Mexico_City': 'MX',
|
|
76
|
+
'America/Argentina/Buenos_Aires': 'AR',
|
|
77
|
+
'America/Santiago': 'CL',
|
|
78
|
+
'America/Caracas': 'VE',
|
|
79
|
+
'America/Montevideo': 'UY',
|
|
80
|
+
'America/Asuncion': 'PY',
|
|
81
|
+
'America/La_Paz': 'BO',
|
|
82
|
+
'America/Guayaquil': 'EC',
|
|
83
|
+
'America/Panama': 'PA',
|
|
84
|
+
'America/Costa_Rica': 'CR',
|
|
85
|
+
'America/Managua': 'NI',
|
|
86
|
+
'America/Tegucigalpa': 'HN',
|
|
87
|
+
'America/Guatemala': 'GT',
|
|
88
|
+
'America/El_Salvador': 'SV',
|
|
89
|
+
'America/Havana': 'CU',
|
|
90
|
+
'America/Santo_Domingo': 'DO',
|
|
91
|
+
'America/Jamaica': 'JM',
|
|
92
|
+
'America/Port-au-Prince': 'HT',
|
|
93
|
+
'Europe/Madrid': 'ES',
|
|
94
|
+
'Europe/London': 'GB',
|
|
95
|
+
'Europe/Paris': 'FR',
|
|
96
|
+
'Europe/Berlin': 'DE',
|
|
97
|
+
'Europe/Rome': 'IT',
|
|
98
|
+
'Europe/Amsterdam': 'NL',
|
|
99
|
+
'Europe/Brussels': 'BE',
|
|
100
|
+
'Europe/Vienna': 'AT',
|
|
101
|
+
'Europe/Zurich': 'CH',
|
|
102
|
+
'Europe/Stockholm': 'SE',
|
|
103
|
+
'Europe/Oslo': 'NO',
|
|
104
|
+
'Europe/Copenhagen': 'DK',
|
|
105
|
+
'Europe/Helsinki': 'FI',
|
|
106
|
+
'Europe/Warsaw': 'PL',
|
|
107
|
+
'Europe/Prague': 'CZ',
|
|
108
|
+
'Europe/Bucharest': 'RO',
|
|
109
|
+
'Europe/Moscow': 'RU',
|
|
110
|
+
'America/New_York': 'US',
|
|
111
|
+
'America/Chicago': 'US',
|
|
112
|
+
'America/Denver': 'US',
|
|
113
|
+
'America/Los_Angeles': 'US',
|
|
114
|
+
'America/Toronto': 'CA',
|
|
115
|
+
'America/Vancouver': 'CA',
|
|
116
|
+
'Asia/Tokyo': 'JP',
|
|
117
|
+
'Asia/Shanghai': 'CN',
|
|
118
|
+
'Asia/Hong_Kong': 'CN',
|
|
119
|
+
'Asia/Seoul': 'KR',
|
|
120
|
+
'Asia/Singapore': 'SG',
|
|
121
|
+
'Asia/Bangkok': 'TH',
|
|
122
|
+
'Asia/Jakarta': 'ID',
|
|
123
|
+
'Asia/Manila': 'PH',
|
|
124
|
+
'Asia/Kolkata': 'IN',
|
|
125
|
+
'Asia/Dubai': 'AE',
|
|
126
|
+
'Asia/Riyadh': 'SA',
|
|
127
|
+
'Australia/Sydney': 'AU',
|
|
128
|
+
'Australia/Melbourne': 'AU',
|
|
129
|
+
'Pacific/Auckland': 'NZ',
|
|
130
|
+
'Africa/Cairo': 'EG',
|
|
131
|
+
'Africa/Johannesburg': 'ZA',
|
|
132
|
+
'Africa/Nairobi': 'KE',
|
|
133
|
+
'Africa/Lagos': 'NG'
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const countryCode = timezoneToCountry[timezone]
|
|
137
|
+
if (countryCode) {
|
|
138
|
+
return codes.find(c => c.country_code === countryCode) || null
|
|
139
|
+
}
|
|
140
|
+
} catch {}
|
|
141
|
+
|
|
142
|
+
return codes.find(c => c.country_code === 'CO') || null
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function useClickOutside(ref: HTMLElement, cb: () => void) {
|
|
146
|
+
function handler(e: MouseEvent) {
|
|
147
|
+
const target = e.target as Node
|
|
148
|
+
if (ref && target && !ref.contains(target)) {
|
|
149
|
+
const dropdown = ref.querySelector('.telpick-dropdown')
|
|
150
|
+
if (!dropdown || !dropdown.contains(target)) {
|
|
151
|
+
cb()
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
document.addEventListener('click', handler, true)
|
|
156
|
+
return () => document.removeEventListener('click', handler, true)
|
|
157
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { getDefaultCountry, useClickOutside, CountryCode, TelpickProps } from './telpick'
|
|
2
|
+
import './telpick.css'
|
|
3
|
+
|
|
4
|
+
export class TelpickVanilla {
|
|
5
|
+
constructor(options = {}) {
|
|
6
|
+
this.code = options.code || null
|
|
7
|
+
this.onChange = options.onChange || (() => {})
|
|
8
|
+
this.styleOverrides = options.styleOverrides || {}
|
|
9
|
+
this.codes = []
|
|
10
|
+
this.selectedCode = this.code
|
|
11
|
+
this.isDropdownOpen = false
|
|
12
|
+
this.searchQuery = ''
|
|
13
|
+
this.container = null
|
|
14
|
+
this.dropdown = null
|
|
15
|
+
this.searchInput = null
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async init(container) {
|
|
19
|
+
this.container = container
|
|
20
|
+
const res = await fetch('/resources/api/country-codes.json')
|
|
21
|
+
const data = await res.json()
|
|
22
|
+
this.codes = data.sort((a, b) => a.country.localeCompare(b.country, 'es'))
|
|
23
|
+
if (!this.code) {
|
|
24
|
+
const def = await getDefaultCountry(this.codes)
|
|
25
|
+
if (def) this.selectedCode = def.country_code
|
|
26
|
+
}
|
|
27
|
+
this.render()
|
|
28
|
+
useClickOutside(this.container, () => {
|
|
29
|
+
this.closeDropdown()
|
|
30
|
+
})
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
render() {
|
|
34
|
+
if (this.isDropdownOpen && this.dropdown && this.searchInput) {
|
|
35
|
+
const ul = this.dropdown.querySelector('ul')
|
|
36
|
+
if (ul) {
|
|
37
|
+
ul.innerHTML = ''
|
|
38
|
+
const filtered = !this.searchQuery
|
|
39
|
+
? this.codes
|
|
40
|
+
: this.codes.filter(c => c.country.toLowerCase().includes(this.searchQuery.toLowerCase()))
|
|
41
|
+
|
|
42
|
+
filtered.forEach((item, index) => {
|
|
43
|
+
const li = document.createElement('li')
|
|
44
|
+
const isSelected = item.country_code === this.selectedCode && this.selectedCode !== null && this.selectedCode !== undefined
|
|
45
|
+
li.className = `telpick-item ${isSelected ? 'telpick-item-selected' : ''}`
|
|
46
|
+
li.setAttribute('role', 'option')
|
|
47
|
+
li.setAttribute('aria-selected', isSelected)
|
|
48
|
+
li.onclick = () => {
|
|
49
|
+
this.selectedCode = item.country_code
|
|
50
|
+
this.onChange(item)
|
|
51
|
+
this.isDropdownOpen = false
|
|
52
|
+
this.searchQuery = ''
|
|
53
|
+
this.render()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const flag = document.createElement('div')
|
|
57
|
+
flag.className = 'telpick-flag'
|
|
58
|
+
const img = document.createElement('img')
|
|
59
|
+
img.src = item.flag
|
|
60
|
+
img.alt = item.country
|
|
61
|
+
flag.appendChild(img)
|
|
62
|
+
li.appendChild(flag)
|
|
63
|
+
|
|
64
|
+
const countrySpan = document.createElement('span')
|
|
65
|
+
countrySpan.textContent = item.country
|
|
66
|
+
li.appendChild(countrySpan)
|
|
67
|
+
|
|
68
|
+
const codeSpan = document.createElement('span')
|
|
69
|
+
codeSpan.className = 'ml-auto'
|
|
70
|
+
codeSpan.textContent = item.code
|
|
71
|
+
li.appendChild(codeSpan)
|
|
72
|
+
|
|
73
|
+
ul.appendChild(li)
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
return
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.container.innerHTML = ''
|
|
80
|
+
this.container.className = 'telpick-wrapper relative'
|
|
81
|
+
|
|
82
|
+
const btn = document.createElement('button')
|
|
83
|
+
btn.className = 'telpick-btn'
|
|
84
|
+
btn.setAttribute('aria-expanded', this.isDropdownOpen)
|
|
85
|
+
btn.setAttribute('aria-haspopup', 'listbox')
|
|
86
|
+
Object.assign(btn.style, this.styleOverrides)
|
|
87
|
+
btn.onclick = () => {
|
|
88
|
+
this.isDropdownOpen = !this.isDropdownOpen
|
|
89
|
+
this.render()
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const flagDiv = document.createElement('div')
|
|
93
|
+
flagDiv.className = 'telpick-flag'
|
|
94
|
+
const selectedCountry = this.codes.find(c => c.country_code === this.selectedCode) || { flag: '', code: '', country: '' }
|
|
95
|
+
if (selectedCountry.flag) {
|
|
96
|
+
const img = document.createElement('img')
|
|
97
|
+
img.src = selectedCountry.flag
|
|
98
|
+
img.alt = selectedCountry.country || 'flag'
|
|
99
|
+
flagDiv.appendChild(img)
|
|
100
|
+
}
|
|
101
|
+
btn.appendChild(flagDiv)
|
|
102
|
+
|
|
103
|
+
const codeSpan = document.createElement('span')
|
|
104
|
+
codeSpan.textContent = selectedCountry.code
|
|
105
|
+
btn.appendChild(codeSpan)
|
|
106
|
+
|
|
107
|
+
const arrowSpan = document.createElement('span')
|
|
108
|
+
arrowSpan.className = 'telpick-arrow ml-auto'
|
|
109
|
+
arrowSpan.textContent = '▼'
|
|
110
|
+
btn.appendChild(arrowSpan)
|
|
111
|
+
this.container.appendChild(btn)
|
|
112
|
+
|
|
113
|
+
if (this.isDropdownOpen) {
|
|
114
|
+
this.dropdown = document.createElement('div')
|
|
115
|
+
this.dropdown.className = 'telpick-dropdown'
|
|
116
|
+
this.dropdown.setAttribute('role', 'listbox')
|
|
117
|
+
this.dropdown.onclick = e => e.stopPropagation()
|
|
118
|
+
this.dropdown.onmousedown = e => e.stopPropagation()
|
|
119
|
+
|
|
120
|
+
const input = document.createElement('input')
|
|
121
|
+
input.className = 'telpick-search'
|
|
122
|
+
input.type = 'text'
|
|
123
|
+
input.placeholder = 'Buscar país...'
|
|
124
|
+
input.value = this.searchQuery
|
|
125
|
+
input.autofocus = true
|
|
126
|
+
this.searchInput = input
|
|
127
|
+
input.oninput = e => {
|
|
128
|
+
e.stopPropagation()
|
|
129
|
+
const inputEl = e.target
|
|
130
|
+
const cursorPos = inputEl.selectionStart || 0
|
|
131
|
+
const newValue = inputEl.value
|
|
132
|
+
this.searchQuery = newValue
|
|
133
|
+
this.render()
|
|
134
|
+
requestAnimationFrame(() => {
|
|
135
|
+
if (this.searchInput) {
|
|
136
|
+
this.searchInput.focus()
|
|
137
|
+
const newCursorPos = Math.min(cursorPos + 1, newValue.length)
|
|
138
|
+
this.searchInput.setSelectionRange(newCursorPos, newCursorPos)
|
|
139
|
+
}
|
|
140
|
+
})
|
|
141
|
+
}
|
|
142
|
+
input.onclick = e => e.stopPropagation()
|
|
143
|
+
input.onmousedown = e => e.stopPropagation()
|
|
144
|
+
this.dropdown.appendChild(input)
|
|
145
|
+
|
|
146
|
+
const ul = document.createElement('ul')
|
|
147
|
+
const filtered = !this.searchQuery
|
|
148
|
+
? this.codes
|
|
149
|
+
: this.codes.filter(c => c.country.toLowerCase().includes(this.searchQuery.toLowerCase()))
|
|
150
|
+
|
|
151
|
+
filtered.forEach((item, index) => {
|
|
152
|
+
const li = document.createElement('li')
|
|
153
|
+
const isSelected = item.country_code === this.selectedCode && this.selectedCode !== null && this.selectedCode !== undefined
|
|
154
|
+
li.className = `telpick-item ${isSelected ? 'telpick-item-selected' : ''}`
|
|
155
|
+
li.setAttribute('role', 'option')
|
|
156
|
+
li.setAttribute('aria-selected', isSelected)
|
|
157
|
+
li.onclick = () => {
|
|
158
|
+
this.selectedCode = item.country_code
|
|
159
|
+
this.onChange(item)
|
|
160
|
+
this.isDropdownOpen = false
|
|
161
|
+
this.searchQuery = ''
|
|
162
|
+
this.render()
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const flag = document.createElement('div')
|
|
166
|
+
flag.className = 'telpick-flag'
|
|
167
|
+
const img = document.createElement('img')
|
|
168
|
+
img.src = item.flag
|
|
169
|
+
img.alt = item.country
|
|
170
|
+
flag.appendChild(img)
|
|
171
|
+
li.appendChild(flag)
|
|
172
|
+
|
|
173
|
+
const countrySpan = document.createElement('span')
|
|
174
|
+
countrySpan.textContent = item.country
|
|
175
|
+
li.appendChild(countrySpan)
|
|
176
|
+
|
|
177
|
+
const codeSpan = document.createElement('span')
|
|
178
|
+
codeSpan.className = 'ml-auto'
|
|
179
|
+
codeSpan.textContent = item.code
|
|
180
|
+
li.appendChild(codeSpan)
|
|
181
|
+
|
|
182
|
+
ul.appendChild(li)
|
|
183
|
+
})
|
|
184
|
+
this.dropdown.appendChild(ul)
|
|
185
|
+
this.container.appendChild(this.dropdown)
|
|
186
|
+
|
|
187
|
+
requestAnimationFrame(() => {
|
|
188
|
+
if (this.searchInput) {
|
|
189
|
+
this.searchInput.focus()
|
|
190
|
+
}
|
|
191
|
+
})
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
closeDropdown() {
|
|
196
|
+
this.isDropdownOpen = false
|
|
197
|
+
this.render()
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { defineComponent, ref, computed, watch, onMounted, onUnmounted, nextTick } from 'vue'
|
|
2
|
+
import { getDefaultCountry, useClickOutside, CountryCode, TelpickProps } from './telpick'
|
|
3
|
+
import './telpick.css'
|
|
4
|
+
|
|
5
|
+
export const TelpickVue = defineComponent({
|
|
6
|
+
name: 'TelpickVue',
|
|
7
|
+
props: {
|
|
8
|
+
code: { type: String, default: null },
|
|
9
|
+
styleOverrides: { type: Object, default: () => ({}) }
|
|
10
|
+
},
|
|
11
|
+
emits: ['update:code'],
|
|
12
|
+
setup(props, { emit }) {
|
|
13
|
+
const codes = ref<CountryCode[]>([])
|
|
14
|
+
const selectedCode = ref(props.code)
|
|
15
|
+
const isDropdownOpen = ref(false)
|
|
16
|
+
const searchQuery = ref('')
|
|
17
|
+
const dropdownRef = ref<HTMLElement | null>(null)
|
|
18
|
+
const searchInputRef = ref<HTMLInputElement | null>(null)
|
|
19
|
+
|
|
20
|
+
const handleSearchInput = (e: Event) => {
|
|
21
|
+
const input = e.target as HTMLInputElement
|
|
22
|
+
const cursorPos = input.selectionStart || 0
|
|
23
|
+
const newValue = input.value
|
|
24
|
+
searchQuery.value = newValue
|
|
25
|
+
requestAnimationFrame(() => {
|
|
26
|
+
if (searchInputRef.value) {
|
|
27
|
+
searchInputRef.value.focus()
|
|
28
|
+
const newCursorPos = Math.min(cursorPos + 1, newValue.length)
|
|
29
|
+
searchInputRef.value.setSelectionRange(newCursorPos, newCursorPos)
|
|
30
|
+
}
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const selectCode = (item: CountryCode) => {
|
|
35
|
+
selectedCode.value = item.country_code
|
|
36
|
+
emit('update:code', item)
|
|
37
|
+
isDropdownOpen.value = false
|
|
38
|
+
searchQuery.value = ''
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const selectedCountry = computed(() => {
|
|
42
|
+
return (
|
|
43
|
+
codes.value.find((c) => c.country_code === selectedCode.value) || {
|
|
44
|
+
country_code: selectedCode.value,
|
|
45
|
+
flag: '',
|
|
46
|
+
country: '',
|
|
47
|
+
code: '',
|
|
48
|
+
}
|
|
49
|
+
)
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const filteredCodes = computed(() => {
|
|
53
|
+
if (!searchQuery.value) return codes.value
|
|
54
|
+
return codes.value.filter((c) =>
|
|
55
|
+
c.country.toLowerCase().includes(searchQuery.value.toLowerCase())
|
|
56
|
+
)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
watch(() => props.code, (newCode) => {
|
|
60
|
+
if (newCode !== undefined && newCode !== null) {
|
|
61
|
+
selectedCode.value = newCode
|
|
62
|
+
}
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
watch(isDropdownOpen, async () => {
|
|
66
|
+
if (isDropdownOpen.value) {
|
|
67
|
+
await nextTick()
|
|
68
|
+
if (searchInputRef.value) {
|
|
69
|
+
searchInputRef.value.focus()
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
onMounted(async () => {
|
|
75
|
+
const response = await fetch('/resources/api/country-codes.json')
|
|
76
|
+
const data = await response.json()
|
|
77
|
+
codes.value = data.sort((a, b) => a.country.localeCompare(b.country, 'es'))
|
|
78
|
+
if (!props.code) {
|
|
79
|
+
const def = await getDefaultCountry(codes.value)
|
|
80
|
+
if (def) selectCode(def)
|
|
81
|
+
}
|
|
82
|
+
if (dropdownRef.value) {
|
|
83
|
+
const remove = useClickOutside(dropdownRef.value, () => {
|
|
84
|
+
isDropdownOpen.value = false
|
|
85
|
+
})
|
|
86
|
+
onUnmounted(remove)
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
codes,
|
|
92
|
+
selectedCode,
|
|
93
|
+
isDropdownOpen,
|
|
94
|
+
searchQuery,
|
|
95
|
+
selectCode,
|
|
96
|
+
selectedCountry,
|
|
97
|
+
filteredCodes,
|
|
98
|
+
dropdownRef,
|
|
99
|
+
searchInputRef,
|
|
100
|
+
handleSearchInput
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
template: `
|
|
104
|
+
<div class="telpick-wrapper relative" ref="dropdownRef">
|
|
105
|
+
<button
|
|
106
|
+
@click="isDropdownOpen = !isDropdownOpen"
|
|
107
|
+
class="telpick-btn"
|
|
108
|
+
:style="styleOverrides"
|
|
109
|
+
:aria-expanded="isDropdownOpen"
|
|
110
|
+
aria-haspopup="listbox"
|
|
111
|
+
>
|
|
112
|
+
<div class="telpick-flag">
|
|
113
|
+
<img v-if="selectedCountry.flag" :src="selectedCountry.flag" :alt="selectedCountry.country || 'flag'" />
|
|
114
|
+
</div>
|
|
115
|
+
<span>{{ selectedCountry.code }}</span>
|
|
116
|
+
<span class="telpick-arrow ml-auto">▼</span>
|
|
117
|
+
</button>
|
|
118
|
+
<Transition name="telpick-dropdown">
|
|
119
|
+
<div v-if="isDropdownOpen" class="telpick-dropdown" role="listbox" @click.stop @mousedown.stop>
|
|
120
|
+
<input
|
|
121
|
+
ref="searchInputRef"
|
|
122
|
+
v-model="searchQuery"
|
|
123
|
+
type="text"
|
|
124
|
+
placeholder="Buscar país..."
|
|
125
|
+
class="telpick-search"
|
|
126
|
+
@input="handleSearchInput"
|
|
127
|
+
@click.stop
|
|
128
|
+
@mousedown.stop
|
|
129
|
+
autofocus
|
|
130
|
+
/>
|
|
131
|
+
<ul>
|
|
132
|
+
<li v-for="(item, index) in filteredCodes" :key="\`\${item.country_code}-\${index}\`" @click="selectCode(item)" :class="['telpick-item', { 'telpick-item-selected': item.country_code === selectedCode && selectedCode !== null && selectedCode !== undefined }]" role="option" :aria-selected="item.country_code === selectedCode && selectedCode !== null && selectedCode !== undefined">
|
|
133
|
+
<div class="telpick-flag">
|
|
134
|
+
<img :src="item.flag" :alt="item.country" />
|
|
135
|
+
</div>
|
|
136
|
+
<span>{{ item.country }}</span>
|
|
137
|
+
<span class="ml-auto">{{ item.code }}</span>
|
|
138
|
+
</li>
|
|
139
|
+
</ul>
|
|
140
|
+
</div>
|
|
141
|
+
</Transition>
|
|
142
|
+
</div>
|
|
143
|
+
`
|
|
144
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Wrapper para Vue, React y CDN usando Vanilla JS
|
|
2
|
+
// Vue y React pueden usar el componente vanilla vía ref
|
|
3
|
+
|
|
4
|
+
// Vue wrapper
|
|
5
|
+
export function TelpickVue(props, { emit }) {
|
|
6
|
+
let telpickInstance = null
|
|
7
|
+
return {
|
|
8
|
+
mounted() {
|
|
9
|
+
telpickInstance = new window.Telpick({
|
|
10
|
+
code: props.code,
|
|
11
|
+
onChange: country => emit('update:code', country),
|
|
12
|
+
styleOverrides: props.styleOverrides || {}
|
|
13
|
+
})
|
|
14
|
+
telpickInstance.init(this.$el)
|
|
15
|
+
},
|
|
16
|
+
beforeUnmount() {
|
|
17
|
+
telpickInstance && telpickInstance.destroy()
|
|
18
|
+
},
|
|
19
|
+
render() {
|
|
20
|
+
return null // Render handled by vanilla
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// React wrapper
|
|
26
|
+
import React, { useRef, useEffect } from 'react'
|
|
27
|
+
export function TelpickReact({ code, onChange, styleOverrides }) {
|
|
28
|
+
const ref = useRef()
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const telpickInstance = new window.Telpick({ code, onChange, styleOverrides })
|
|
31
|
+
telpickInstance.init(ref.current)
|
|
32
|
+
return () => telpickInstance.destroy()
|
|
33
|
+
}, [code, onChange, styleOverrides])
|
|
34
|
+
return <div ref={ref}></div>
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// CDN usage: window.Telpick
|