├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .gitmodules ├── .gitreview ├── .mailmap ├── .phan ├── config.php └── stubs │ └── FlaggedRevs.php ├── .phpcs.xml ├── .stylelintrc.json ├── AUTHORS.txt ├── CONTRIBUTING.md ├── Gruntfile.js ├── LICENSE.txt ├── README.md ├── VisualEditor.i18n.alias.php ├── bin ├── listRecentCommits.sh ├── pre-commit.sh └── updateSubmodule.sh ├── build ├── .eslintrc.json ├── checkModules.js ├── screenshots-client │ ├── .eslintrc.json │ ├── diffs.js │ ├── userGuide.js │ └── utils.js ├── screenshots.diffs.js ├── screenshots.js ├── screenshots.userGuide.js ├── screenshots.yml ├── tasks │ └── screenshotLangs.json └── typos.json ├── bundlesize.config.json ├── composer.json ├── editcheck ├── i18n │ ├── af.json │ ├── api │ │ ├── en.json │ │ └── qqq.json │ ├── ar.json │ ├── az.json │ ├── be-tarask.json │ ├── bn.json │ ├── br.json │ ├── ce.json │ ├── cs.json │ ├── cy.json │ ├── da.json │ ├── de.json │ ├── en.json │ ├── eo.json │ ├── es.json │ ├── et.json │ ├── fa.json │ ├── fi.json │ ├── fr.json │ ├── gl.json │ ├── he.json │ ├── hr.json │ ├── ia.json │ ├── ig.json │ ├── io.json │ ├── is.json │ ├── it.json │ ├── ja.json │ ├── ka.json │ ├── kn.json │ ├── ko.json │ ├── lb.json │ ├── lt.json │ ├── lv.json │ ├── mk.json │ ├── ms.json │ ├── nb.json │ ├── ne.json │ ├── nl-informal.json │ ├── nl.json │ ├── nn.json │ ├── ojb.json │ ├── pa.json │ ├── pl.json │ ├── pt-br.json │ ├── pt.json │ ├── qqq.json │ ├── ro.json │ ├── ru.json │ ├── sdh.json │ ├── sl.json │ ├── sr-ec.json │ ├── sr-el.json │ ├── sv.json │ ├── tr.json │ ├── uk.json │ ├── vi.json │ ├── zh-hans.json │ └── zh-hant.json ├── includes │ ├── ApiEditCheckReferenceUrl.php │ ├── Hooks.php │ └── ResourceLoaderData.php └── modules │ ├── .eslintrc.json │ ├── BaseEditCheck.js │ ├── EditCheck.less │ ├── EditCheckAction.js │ ├── EditCheckDialog.js │ ├── EditCheckFactory.js │ ├── EditCheckGutterSidebarDialog.js │ ├── controller.js │ ├── editchecks │ ├── AddReferenceEditCheck.js │ └── experimental │ │ ├── ConvertReferenceEditCheck.js │ │ ├── DisambiguationEditCheck.js │ │ ├── ExternalLinksEditCheck.js │ │ ├── ImportCopyvioEditCheck.js │ │ └── TextMatchEditCheck.js │ └── init.js ├── extension.json ├── i18n ├── ve-mw │ ├── aae.json │ ├── ab.json │ ├── abr.json │ ├── abs.json │ ├── ace.json │ ├── acf.json │ ├── acm.json │ ├── ady-cyrl.json │ ├── aeb-arab.json │ ├── aeb-latn.json │ ├── af.json │ ├── ajg.json │ ├── alt.json │ ├── am.json │ ├── ami.json │ ├── an.json │ ├── ang.json │ ├── ann.json │ ├── anp.json │ ├── apc.json │ ├── api │ │ ├── af.json │ │ ├── ar.json │ │ ├── as.json │ │ ├── ast.json │ │ ├── ay.json │ │ ├── az.json │ │ ├── ba.json │ │ ├── be-tarask.json │ │ ├── bg.json │ │ ├── bn.json │ │ ├── bqi.json │ │ ├── br.json │ │ ├── bs.json │ │ ├── ca.json │ │ ├── cdo-hant.json │ │ ├── ce.json │ │ ├── cs.json │ │ ├── cy.json │ │ ├── da.json │ │ ├── de.json │ │ ├── diq.json │ │ ├── dty.json │ │ ├── el.json │ │ ├── en-gb.json │ │ ├── en.json │ │ ├── eo.json │ │ ├── es.json │ │ ├── et.json │ │ ├── eu.json │ │ ├── fa.json │ │ ├── fi.json │ │ ├── fo.json │ │ ├── fr.json │ │ ├── fur.json │ │ ├── gl.json │ │ ├── gor.json │ │ ├── gu.json │ │ ├── he.json │ │ ├── hi.json │ │ ├── hu-formal.json │ │ ├── hu.json │ │ ├── hy.json │ │ ├── ia.json │ │ ├── id.json │ │ ├── ig.json │ │ ├── ilo.json │ │ ├── io.json │ │ ├── is.json │ │ ├── it.json │ │ ├── ja.json │ │ ├── jv.json │ │ ├── ka.json │ │ ├── kaa.json │ │ ├── kab.json │ │ ├── kk-cyrl.json │ │ ├── km.json │ │ ├── kn.json │ │ ├── ko.json │ │ ├── krc.json │ │ ├── ksh.json │ │ ├── ku-latn.json │ │ ├── lb.json │ │ ├── lki.json │ │ ├── lt.json │ │ ├── luz.json │ │ ├── lv.json │ │ ├── mg.json │ │ ├── min.json │ │ ├── mk.json │ │ ├── ml.json │ │ ├── mni.json │ │ ├── mr.json │ │ ├── ms.json │ │ ├── mwl.json │ │ ├── my.json │ │ ├── nap.json │ │ ├── nb.json │ │ ├── ne.json │ │ ├── nl.json │ │ ├── nn.json │ │ ├── oc.json │ │ ├── olo.json │ │ ├── om.json │ │ ├── os.json │ │ ├── pa.json │ │ ├── pl.json │ │ ├── pms.json │ │ ├── ps.json │ │ ├── pt-br.json │ │ ├── pt.json │ │ ├── qqq.json │ │ ├── ro.json │ │ ├── roa-tara.json │ │ ├── rsk.json │ │ ├── ru.json │ │ ├── sa.json │ │ ├── sah.json │ │ ├── sat.json │ │ ├── scn.json │ │ ├── sco.json │ │ ├── sd.json │ │ ├── sh-latn.json │ │ ├── sk.json │ │ ├── sl.json │ │ ├── sms.json │ │ ├── sq.json │ │ ├── sr-ec.json │ │ ├── sr-el.json │ │ ├── sv.json │ │ ├── szy.json │ │ ├── ta.json │ │ ├── tay.json │ │ ├── te.json │ │ ├── tl.json │ │ ├── tr.json │ │ ├── tt-cyrl.json │ │ ├── tw.json │ │ ├── uk.json │ │ ├── ur.json │ │ ├── vi.json │ │ ├── war.json │ │ ├── xmf.json │ │ ├── yi.json │ │ ├── yue-hant.json │ │ ├── zh-hans.json │ │ └── zh-hant.json │ ├── ar.json │ ├── arc.json │ ├── arn.json │ ├── arq.json │ ├── ary.json │ ├── arz.json │ ├── as.json │ ├── ase.json │ ├── ast.json │ ├── atj.json │ ├── av.json │ ├── avk.json │ ├── awa.json │ ├── ay.json │ ├── az.json │ ├── azb.json │ ├── ba.json │ ├── ban-bali.json │ ├── ban.json │ ├── bar.json │ ├── bbc-latn.json │ ├── bcc.json │ ├── bci.json │ ├── bcl.json │ ├── bdr.json │ ├── be-tarask.json │ ├── be.json │ ├── bew.json │ ├── bg.json │ ├── bgc-arab.json │ ├── bgc.json │ ├── bgn.json │ ├── bho.json │ ├── bjn.json │ ├── blc.json │ ├── blk.json │ ├── bn.json │ ├── bo.json │ ├── bol.json │ ├── bpy.json │ ├── bqi.json │ ├── br.json │ ├── brh.json │ ├── brx.json │ ├── bs.json │ ├── btm.json │ ├── bto.json │ ├── bug-bugi.json │ ├── bug.json │ ├── bxr.json │ ├── ca.json │ ├── cak.json │ ├── cbk-zam.json │ ├── ccp.json │ ├── cdo-hans.json │ ├── cdo-hant.json │ ├── cdo-latn.json │ ├── ce.json │ ├── ceb.json │ ├── chn.json │ ├── ckb.json │ ├── cko.json │ ├── cnr-latn.json │ ├── co.json │ ├── cop.json │ ├── cpx-hans.json │ ├── cpx-hant.json │ ├── crh-cyrl.json │ ├── crh-latn.json │ ├── crh-ro.json │ ├── cs.json │ ├── csb.json │ ├── cu.json │ ├── cv.json │ ├── cy.json │ ├── da.json │ ├── dag.json │ ├── dar.json │ ├── de-ch.json │ ├── de-formal.json │ ├── de.json │ ├── dga.json │ ├── din.json │ ├── diq.json │ ├── dsb.json │ ├── dtp.json │ ├── dty.json │ ├── dua.json │ ├── dv.json │ ├── dz.json │ ├── ee.json │ ├── efi.json │ ├── egl.json │ ├── ekp.json │ ├── el.json │ ├── eml.json │ ├── en-gb.json │ ├── en.json │ ├── eo.json │ ├── es-formal.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── ext.json │ ├── fa.json │ ├── fat.json │ ├── ff.json │ ├── fi.json │ ├── fit.json │ ├── fo.json │ ├── fon.json │ ├── fr.json │ ├── frc.json │ ├── frp.json │ ├── frr.json │ ├── fur.json │ ├── fvr.json │ ├── fy.json │ ├── ga.json │ ├── gaa.json │ ├── gan-hant.json │ ├── gbm.json │ ├── gcf.json │ ├── gcr.json │ ├── gd.json │ ├── gl.json │ ├── gld.json │ ├── glk.json │ ├── gn.json │ ├── gom-deva.json │ ├── gom-latn.json │ ├── gor.json │ ├── got.json │ ├── gpe.json │ ├── grc.json │ ├── gsw.json │ ├── gu.json │ ├── guc.json │ ├── gur.json │ ├── guw.json │ ├── gv.json │ ├── ha.json │ ├── hak-latn.json │ ├── hav.json │ ├── he.json │ ├── hi.json │ ├── hif-latn.json │ ├── hil.json │ ├── hke.json │ ├── hno.json │ ├── hoc-latn.json │ ├── hoc.json │ ├── hr.json │ ├── hrx.json │ ├── hsb.json │ ├── hsn.json │ ├── ht.json │ ├── hu-formal.json │ ├── hu.json │ ├── hy.json │ ├── hyw.json │ ├── ia.json │ ├── iba.json │ ├── ibb.json │ ├── id.json │ ├── ie.json │ ├── ig.json │ ├── igl.json │ ├── ike-cans.json │ ├── ike-latn.json │ ├── ilo.json │ ├── inh.json │ ├── io.json │ ├── is.json │ ├── ish.json │ ├── isv-cyrl.json │ ├── isv-latn.json │ ├── it.json │ ├── ja.json │ ├── jam.json │ ├── jbo.json │ ├── jje.json │ ├── jut.json │ ├── jv.json │ ├── ka.json │ ├── kaa.json │ ├── kab.json │ ├── kac.json │ ├── kai.json │ ├── kaj.json │ ├── kbd-cyrl.json │ ├── kbp.json │ ├── kcg.json │ ├── kck.json │ ├── kea.json │ ├── kg.json │ ├── kge.json │ ├── khw.json │ ├── kip.json │ ├── kiu.json │ ├── kjh.json │ ├── kjp.json │ ├── kk-cyrl.json │ ├── km.json │ ├── kn.json │ ├── knc.json │ ├── ko-kp.json │ ├── ko.json │ ├── koi.json │ ├── krc.json │ ├── kri.json │ ├── krj.json │ ├── krl.json │ ├── ksh.json │ ├── ksw.json │ ├── ku-latn.json │ ├── kum.json │ ├── kus.json │ ├── kv.json │ ├── kw.json │ ├── ky.json │ ├── la.json │ ├── lad.json │ ├── lag.json │ ├── lb.json │ ├── lbe.json │ ├── lez.json │ ├── lfn.json │ ├── lg.json │ ├── li.json │ ├── lij.json │ ├── liv.json │ ├── ljp.json │ ├── lki.json │ ├── lkt.json │ ├── lld.json │ ├── lmo.json │ ├── ln.json │ ├── lo.json │ ├── lrc.json │ ├── lt.json │ ├── lua.json │ ├── lus.json │ ├── luz.json │ ├── lv.json │ ├── lzh.json │ ├── lzz.json │ ├── mad.json │ ├── mag.json │ ├── mai.json │ ├── mak.json │ ├── maw.json │ ├── mdf.json │ ├── mdh.json │ ├── mey.json │ ├── mfa.json │ ├── mg.json │ ├── mhr.json │ ├── mi.json │ ├── min.json │ ├── mk.json │ ├── ml.json │ ├── mn.json │ ├── mnc-mong.json │ ├── mnc.json │ ├── mni.json │ ├── mns.json │ ├── mnw.json │ ├── mo.json │ ├── mos.json │ ├── mr.json │ ├── mrh.json │ ├── mrj.json │ ├── ms-arab.json │ ├── ms.json │ ├── msi.json │ ├── mt.json │ ├── mui.json │ ├── mvf.json │ ├── mwl.json │ ├── mwlanguagevariant │ │ ├── af.json │ │ ├── ami.json │ │ ├── anp.json │ │ ├── ar.json │ │ ├── arn.json │ │ ├── as.json │ │ ├── ast.json │ │ ├── az.json │ │ ├── azb.json │ │ ├── ban.json │ │ ├── be-tarask.json │ │ ├── be.json │ │ ├── bg.json │ │ ├── blk.json │ │ ├── bn.json │ │ ├── br.json │ │ ├── bs.json │ │ ├── ca.json │ │ ├── ce.json │ │ ├── ckb.json │ │ ├── crh-latn.json │ │ ├── cs.json │ │ ├── cy.json │ │ ├── da.json │ │ ├── de.json │ │ ├── diq.json │ │ ├── el.json │ │ ├── en.json │ │ ├── eo.json │ │ ├── es.json │ │ ├── eu.json │ │ ├── fa.json │ │ ├── fi.json │ │ ├── fit.json │ │ ├── fr.json │ │ ├── fur.json │ │ ├── fy.json │ │ ├── gcr.json │ │ ├── gl.json │ │ ├── he.json │ │ ├── hi.json │ │ ├── hr.json │ │ ├── hu.json │ │ ├── hy.json │ │ ├── hyw.json │ │ ├── ia.json │ │ ├── id.json │ │ ├── ig.json │ │ ├── io.json │ │ ├── is.json │ │ ├── it.json │ │ ├── ja.json │ │ ├── jv.json │ │ ├── ka.json │ │ ├── kab.json │ │ ├── kcg.json │ │ ├── kjp.json │ │ ├── kn.json │ │ ├── ko-kp.json │ │ ├── ko.json │ │ ├── ku-latn.json │ │ ├── ky.json │ │ ├── lag.json │ │ ├── lb.json │ │ ├── lfn.json │ │ ├── lij.json │ │ ├── lmo.json │ │ ├── lt.json │ │ ├── lv.json │ │ ├── min.json │ │ ├── mk.json │ │ ├── ml.json │ │ ├── mr.json │ │ ├── ms.json │ │ ├── mt.json │ │ ├── my.json │ │ ├── nb.json │ │ ├── nds-nl.json │ │ ├── ne.json │ │ ├── nl.json │ │ ├── nn.json │ │ ├── nqo.json │ │ ├── pl.json │ │ ├── pnb.json │ │ ├── ps.json │ │ ├── pt-br.json │ │ ├── pt.json │ │ ├── pwn.json │ │ ├── qqq.json │ │ ├── rmc.json │ │ ├── ro.json │ │ ├── roa-tara.json │ │ ├── rsk.json │ │ ├── ru.json │ │ ├── sah.json │ │ ├── sc.json │ │ ├── scn.json │ │ ├── sd.json │ │ ├── se.json │ │ ├── sh-latn.json │ │ ├── sk.json │ │ ├── skr-arab.json │ │ ├── sl.json │ │ ├── sma.json │ │ ├── smn.json │ │ ├── sms.json │ │ ├── sq.json │ │ ├── sr-ec.json │ │ ├── sr-el.json │ │ ├── st.json │ │ ├── sv.json │ │ ├── szy.json │ │ ├── ta.json │ │ ├── tay.json │ │ ├── tg-cyrl.json │ │ ├── th.json │ │ ├── ti.json │ │ ├── tly.json │ │ ├── tok.json │ │ ├── tr.json │ │ ├── trv.json │ │ ├── tt-cyrl.json │ │ ├── tw.json │ │ ├── ug-arab.json │ │ ├── uk.json │ │ ├── ur.json │ │ ├── uz.json │ │ ├── vec.json │ │ ├── vi.json │ │ ├── xsy.json │ │ ├── yi.json │ │ ├── zgh.json │ │ ├── zh-hans.json │ │ └── zh-hant.json │ ├── my.json │ ├── myv.json │ ├── mzn.json │ ├── nah.json │ ├── nan-hans.json │ ├── nan-hant.json │ ├── nan-latn-pehoeji.json │ ├── nan-latn-tailo.json │ ├── nap.json │ ├── nb.json │ ├── nds-nl.json │ ├── nds.json │ ├── ne.json │ ├── ng.json │ ├── nia.json │ ├── nit.json │ ├── nl-informal.json │ ├── nl.json │ ├── nmz.json │ ├── nn.json │ ├── nod.json │ ├── nog.json │ ├── nqo.json │ ├── nr.json │ ├── nso.json │ ├── nup.json │ ├── ny.json │ ├── nyn.json │ ├── nyo.json │ ├── nys.json │ ├── nzi.json │ ├── oc.json │ ├── ojb.json │ ├── olo.json │ ├── om.json │ ├── or.json │ ├── os.json │ ├── osi.json │ ├── pa.json │ ├── pag.json │ ├── pam.json │ ├── pap.json │ ├── pcd.json │ ├── pcm.json │ ├── pfl.json │ ├── piu.json │ ├── pl.json │ ├── pms.json │ ├── pnb.json │ ├── ppl.json │ ├── prg.json │ ├── prs.json │ ├── ps.json │ ├── pt-br.json │ ├── pt.json │ ├── pwn.json │ ├── qqq.json │ ├── qu.json │ ├── qwh.json │ ├── rej.json │ ├── rif.json │ ├── rki.json │ ├── rm.json │ ├── rmc.json │ ├── rn.json │ ├── ro.json │ ├── roa-tara.json │ ├── rsk.json │ ├── ru.json │ ├── rue.json │ ├── rut.json │ ├── rw.json │ ├── ryu.json │ ├── sa.json │ ├── sah.json │ ├── sat.json │ ├── sc.json │ ├── scn.json │ ├── sco.json │ ├── sd.json │ ├── sdc.json │ ├── sdh.json │ ├── se.json │ ├── ses.json │ ├── sg.json │ ├── sgs.json │ ├── sh-latn.json │ ├── shi.json │ ├── shn.json │ ├── shy-latn.json │ ├── si.json │ ├── sjd.json │ ├── sje.json │ ├── sk.json │ ├── skr-arab.json │ ├── sl.json │ ├── sli.json │ ├── sma.json │ ├── smj.json │ ├── smn.json │ ├── sms.json │ ├── sn.json │ ├── so.json │ ├── sq.json │ ├── sr-ec.json │ ├── sr-el.json │ ├── sro.json │ ├── ss.json │ ├── st.json │ ├── stq.json │ ├── sty.json │ ├── su.json │ ├── sv.json │ ├── sw.json │ ├── sxu.json │ ├── syl.json │ ├── szl.json │ ├── szy.json │ ├── ta.json │ ├── tay.json │ ├── tcy.json │ ├── tdd.json │ ├── te.json │ ├── tg-cyrl.json │ ├── th.json │ ├── ti.json │ ├── tig.json │ ├── tk.json │ ├── tl.json │ ├── tly.json │ ├── tn.json │ ├── tok.json │ ├── tr.json │ ├── trv.json │ ├── tsg.json │ ├── tt-cyrl.json │ ├── tt-latn.json │ ├── ttj.json │ ├── tum.json │ ├── tw.json │ ├── tyv.json │ ├── tzm.json │ ├── udm.json │ ├── ug-arab.json │ ├── uk.json │ ├── ur.json │ ├── uz.json │ ├── vec.json │ ├── vep.json │ ├── vi.json │ ├── vmw.json │ ├── vo.json │ ├── vro.json │ ├── wa.json │ ├── wal.json │ ├── war.json │ ├── wls.json │ ├── wlx.json │ ├── wo.json │ ├── wsg.json │ ├── wuu-hans.json │ ├── wuu-hant.json │ ├── xal.json │ ├── xh.json │ ├── xmf.json │ ├── xmm.json │ ├── xsy.json │ ├── yi.json │ ├── yo.json │ ├── yoi.json │ ├── yrl.json │ ├── yua.json │ ├── yue-hant.json │ ├── za.json │ ├── zgh.json │ ├── zh-hans.json │ ├── zh-hant.json │ ├── zh-hk.json │ ├── zmi.json │ └── zu.json └── ve-wmf │ ├── abs.json │ ├── ace.json │ ├── acm.json │ ├── ady-cyrl.json │ ├── af.json │ ├── alt.json │ ├── ami.json │ ├── an.json │ ├── anp.json │ ├── ar.json │ ├── arn.json │ ├── arq.json │ ├── ary.json │ ├── arz.json │ ├── as.json │ ├── ast.json │ ├── atj.json │ ├── av.json │ ├── avk.json │ ├── awa.json │ ├── az.json │ ├── azb.json │ ├── ba.json │ ├── ban.json │ ├── bar.json │ ├── bbc-latn.json │ ├── bcc.json │ ├── bci.json │ ├── bcl.json │ ├── be-tarask.json │ ├── be.json │ ├── bew.json │ ├── bg.json │ ├── bgn.json │ ├── bho.json │ ├── bjn.json │ ├── blk.json │ ├── bn.json │ ├── bqi.json │ ├── br.json │ ├── bs.json │ ├── btm.json │ ├── ca.json │ ├── ccp.json │ ├── cdo-hant.json │ ├── cdo-latn.json │ ├── ce.json │ ├── ceb.json │ ├── ckb.json │ ├── cnr-latn.json │ ├── co.json │ ├── cop.json │ ├── crh-latn.json │ ├── cs.json │ ├── csb.json │ ├── cu.json │ ├── cv.json │ ├── cy.json │ ├── da.json │ ├── dag.json │ ├── de-formal.json │ ├── de.json │ ├── dga.json │ ├── din.json │ ├── diq.json │ ├── dsb.json │ ├── dty.json │ ├── el.json │ ├── eml.json │ ├── en.json │ ├── eo.json │ ├── es.json │ ├── et.json │ ├── eu.json │ ├── ext.json │ ├── fa.json │ ├── ff.json │ ├── fi.json │ ├── fit.json │ ├── fo.json │ ├── fon.json │ ├── fr.json │ ├── frp.json │ ├── frr.json │ ├── fur.json │ ├── fy.json │ ├── gcr.json │ ├── gd.json │ ├── gl.json │ ├── gld.json │ ├── glk.json │ ├── gn.json │ ├── gom-deva.json │ ├── gom-latn.json │ ├── gor.json │ ├── grc.json │ ├── gsw.json │ ├── gu.json │ ├── guc.json │ ├── gur.json │ ├── guw.json │ ├── gv.json │ ├── ha.json │ ├── hak-latn.json │ ├── he.json │ ├── hi.json │ ├── hr.json │ ├── hrx.json │ ├── hsb.json │ ├── hsn.json │ ├── ht.json │ ├── hu-formal.json │ ├── hu.json │ ├── hy.json │ ├── hyw.json │ ├── ia.json │ ├── id.json │ ├── ie.json │ ├── ig.json │ ├── ilo.json │ ├── inh.json │ ├── io.json │ ├── is.json │ ├── it.json │ ├── ja.json │ ├── jam.json │ ├── jje.json │ ├── jut.json │ ├── jv.json │ ├── ka.json │ ├── kaa.json │ ├── kab.json │ ├── kbp.json │ ├── kcg.json │ ├── khw.json │ ├── kjp.json │ ├── kk-cyrl.json │ ├── km.json │ ├── kn.json │ ├── ko-kp.json │ ├── ko.json │ ├── koi.json │ ├── krc.json │ ├── krl.json │ ├── ksh.json │ ├── ku-latn.json │ ├── kum.json │ ├── kus.json │ ├── kw.json │ ├── ky.json │ ├── la.json │ ├── lad.json │ ├── lb.json │ ├── lbe.json │ ├── lez.json │ ├── lfn.json │ ├── li.json │ ├── lij.json │ ├── lki.json │ ├── lld.json │ ├── lmo.json │ ├── lo.json │ ├── lrc.json │ ├── lt.json │ ├── luz.json │ ├── lv.json │ ├── lzh.json │ ├── mad.json │ ├── mag.json │ ├── mai.json │ ├── mg.json │ ├── min.json │ ├── mk.json │ ├── ml.json │ ├── mnc-mong.json │ ├── mnc.json │ ├── mni.json │ ├── mnw.json │ ├── mos.json │ ├── mr.json │ ├── mrh.json │ ├── ms-arab.json │ ├── ms.json │ ├── mt.json │ ├── mui.json │ ├── mwl.json │ ├── my.json │ ├── mzn.json │ ├── nan-latn-pehoeji.json │ ├── nap.json │ ├── nb.json │ ├── nds-nl.json │ ├── nds.json │ ├── ne.json │ ├── nia.json │ ├── nl.json │ ├── nn.json │ ├── nqo.json │ ├── nys.json │ ├── oc.json │ ├── ojb.json │ ├── olo.json │ ├── om.json │ ├── or.json │ ├── pa.json │ ├── pap.json │ ├── pcd.json │ ├── pfl.json │ ├── pl.json │ ├── pms.json │ ├── pnb.json │ ├── prg.json │ ├── ps.json │ ├── pt-br.json │ ├── pt.json │ ├── pwn.json │ ├── qqq.json │ ├── qu.json │ ├── rmc.json │ ├── ro.json │ ├── roa-tara.json │ ├── rsk.json │ ├── ru.json │ ├── rue.json │ ├── rw.json │ ├── ryu.json │ ├── sa.json │ ├── sah.json │ ├── sat.json │ ├── sc.json │ ├── scn.json │ ├── sco.json │ ├── sd.json │ ├── sdc.json │ ├── sdh.json │ ├── se.json │ ├── ses.json │ ├── sgs.json │ ├── sh-latn.json │ ├── shi.json │ ├── shn.json │ ├── shy-latn.json │ ├── si.json │ ├── sjd.json │ ├── sk.json │ ├── skr-arab.json │ ├── sl.json │ ├── sli.json │ ├── smn.json │ ├── sms.json │ ├── sn.json │ ├── so.json │ ├── sq.json │ ├── sr-ec.json │ ├── sr-el.json │ ├── sty.json │ ├── su.json │ ├── sv.json │ ├── sw.json │ ├── syl.json │ ├── szl.json │ ├── szy.json │ ├── tay.json │ ├── tcy.json │ ├── tdd.json │ ├── te.json │ ├── tg-cyrl.json │ ├── th.json │ ├── ti.json │ ├── tig.json │ ├── tk.json │ ├── tl.json │ ├── tly.json │ ├── tr.json │ ├── trv.json │ ├── tsg.json │ ├── tt-cyrl.json │ ├── tt-latn.json │ ├── tum.json │ ├── tw.json │ ├── udm.json │ ├── uk.json │ ├── ur.json │ ├── uz.json │ ├── vec.json │ ├── vep.json │ ├── vi.json │ ├── vmw.json │ ├── vo.json │ ├── vro.json │ ├── wa.json │ ├── wal.json │ ├── war.json │ ├── wls.json │ ├── wo.json │ ├── wuu-hans.json │ ├── xmf.json │ ├── xsy.json │ ├── yi.json │ ├── yo.json │ ├── yue-hant.json │ ├── zgh.json │ ├── zh-hans.json │ └── zh-hant.json ├── images ├── betafeatures-icon-collab-ltr.svg └── betafeatures-icon-collab-rtl.svg ├── includes ├── ApiParsoidTrait.php ├── ApiVisualEditor.php ├── ApiVisualEditorEdit.php ├── BetaPreferenceHooks.php ├── DirectParsoidClient.php ├── Hooks.php ├── ParsoidClient.php ├── ServiceWiring.php ├── SpecialCollabPad.php ├── VisualEditorApiVisualEditorEditPostSaveHook.php ├── VisualEditorApiVisualEditorEditPreSaveHook.php ├── VisualEditorBeforeEditorHook.php ├── VisualEditorDataModule.php ├── VisualEditorDesktopArticleTargetInitModule.php ├── VisualEditorHookRunner.php └── VisualEditorParsoidClientFactory.php ├── jsdoc.json ├── lib └── foreign-resources.yaml ├── modules ├── .eslintrc.json ├── eslint-shared.json ├── ve-mw-collab │ ├── ve.init.mw.CollabTarget.css │ ├── ve.init.mw.CollabTarget.init.js │ ├── ve.init.mw.CollabTarget.js │ ├── ve.init.mw.DesktopCollabTarget.js │ ├── ve.init.mw.MobileCollabTarget.js │ ├── ve.init.mw.collab.init.js │ └── ve.ui.MWExportWikitextDialog.js └── ve-mw │ ├── ce │ ├── annotations │ │ ├── ve.ce.MWExternalLinkAnnotation.js │ │ ├── ve.ce.MWInternalLinkAnnotation.js │ │ └── ve.ce.MWNowikiAnnotation.js │ ├── nodes │ │ ├── ve.ce.MWAlienAnnotationNode.js │ │ ├── ve.ce.MWAlienBlockExtensionNode.js │ │ ├── ve.ce.MWAlienExtensionNode.js │ │ ├── ve.ce.MWAlienInlineExtensionNode.js │ │ ├── ve.ce.MWAnnotationNode.js │ │ ├── ve.ce.MWBlockExtensionNode.js │ │ ├── ve.ce.MWBlockImageNode.js │ │ ├── ve.ce.MWEntityNode.js │ │ ├── ve.ce.MWExtensionNode.js │ │ ├── ve.ce.MWGalleryCaptionNode.js │ │ ├── ve.ce.MWGalleryImageCaptionNode.js │ │ ├── ve.ce.MWGalleryImageNode.js │ │ ├── ve.ce.MWGalleryNode.js │ │ ├── ve.ce.MWHeadingNode.js │ │ ├── ve.ce.MWImageCaptionNode.js │ │ ├── ve.ce.MWImageNode.js │ │ ├── ve.ce.MWIncludesNode.js │ │ ├── ve.ce.MWInlineExtensionNode.js │ │ ├── ve.ce.MWInlineImageNode.js │ │ ├── ve.ce.MWLanguageVariantBlockNode.js │ │ ├── ve.ce.MWLanguageVariantHiddenNode.js │ │ ├── ve.ce.MWLanguageVariantInlineNode.js │ │ ├── ve.ce.MWLanguageVariantNode.js │ │ ├── ve.ce.MWMagicLinkNode.js │ │ ├── ve.ce.MWNumberedExternalLinkNode.js │ │ ├── ve.ce.MWPreNode.js │ │ ├── ve.ce.MWPreformattedNode.js │ │ ├── ve.ce.MWSignatureNode.js │ │ ├── ve.ce.MWTableNode.js │ │ ├── ve.ce.MWTransclusionBlockNode.js │ │ ├── ve.ce.MWTransclusionInlineNode.js │ │ ├── ve.ce.MWTransclusionNode.js │ │ └── ve.ce.MWTransclusionTableCellNode.js │ ├── styles │ │ ├── annotations │ │ │ └── ve.ce.MWExternalLinkAnnotation.less │ │ └── nodes │ │ │ ├── images │ │ │ └── audioPlayer.svg │ │ │ ├── ve.ce.MWAnnotationNode.less │ │ │ ├── ve.ce.MWBlockImageNode.less │ │ │ ├── ve.ce.MWEntityNode.less │ │ │ ├── ve.ce.MWImageNode.less │ │ │ ├── ve.ce.MWIncludesNode.less │ │ │ ├── ve.ce.MWInlineImageNode.less │ │ │ ├── ve.ce.MWTableNode.less │ │ │ └── ve.ce.MWTransclusionNode.less │ ├── ve.ce.MWResizableNode.js │ ├── ve.ce.MWWikitextClipboardHandler.js │ └── ve.ce.MWWikitextSurface.js │ ├── dm │ ├── .eslintrc.json │ ├── annotations │ │ ├── ve.dm.MWExternalLinkAnnotation.js │ │ ├── ve.dm.MWInternalLinkAnnotation.js │ │ └── ve.dm.MWNowikiAnnotation.js │ ├── metaitems │ │ ├── ve.dm.MWAlienMetaItem.js │ │ ├── ve.dm.MWCategoryMetaItem.js │ │ ├── ve.dm.MWDefaultSortMetaItem.js │ │ ├── ve.dm.MWDisplayTitleMetaItem.js │ │ ├── ve.dm.MWFlaggedMetaItem.js │ │ ├── ve.dm.MWHiddenCategoryMetaItem.js │ │ ├── ve.dm.MWIndexMetaItem.js │ │ ├── ve.dm.MWLanguageMetaItem.js │ │ ├── ve.dm.MWNewSectionEditMetaItem.js │ │ ├── ve.dm.MWNoContentConvertMetaItem.js │ │ ├── ve.dm.MWNoEditSectionMetaItem.js │ │ ├── ve.dm.MWNoGalleryMetaItem.js │ │ ├── ve.dm.MWNoTitleConvertMetaItem.js │ │ ├── ve.dm.MWRedirectMetaItem.js │ │ ├── ve.dm.MWStaticRedirectMetaItem.js │ │ └── ve.dm.MWTOCMetaItem.js │ ├── models │ │ ├── ve.dm.MWImageModel.js │ │ ├── ve.dm.MWParameterModel.js │ │ ├── ve.dm.MWTemplateModel.js │ │ ├── ve.dm.MWTemplatePlaceholderModel.js │ │ ├── ve.dm.MWTemplateSpecModel.js │ │ ├── ve.dm.MWTransclusionContentModel.js │ │ ├── ve.dm.MWTransclusionModel.js │ │ └── ve.dm.MWTransclusionPartModel.js │ ├── nodes │ │ ├── ve.dm.MWAlienAnnotationNode.js │ │ ├── ve.dm.MWAlienBlockExtensionNode.js │ │ ├── ve.dm.MWAlienExtensionNode.js │ │ ├── ve.dm.MWAlienInlineExtensionNode.js │ │ ├── ve.dm.MWAnnotationNode.js │ │ ├── ve.dm.MWBlockExtensionNode.js │ │ ├── ve.dm.MWBlockImageNode.js │ │ ├── ve.dm.MWEntityNode.js │ │ ├── ve.dm.MWExtensionNode.js │ │ ├── ve.dm.MWGalleryCaptionNode.js │ │ ├── ve.dm.MWGalleryImageCaptionNode.js │ │ ├── ve.dm.MWGalleryImageNode.js │ │ ├── ve.dm.MWGalleryNode.js │ │ ├── ve.dm.MWHeadingNode.js │ │ ├── ve.dm.MWImageCaptionNode.js │ │ ├── ve.dm.MWImageNode.js │ │ ├── ve.dm.MWIncludesNode.js │ │ ├── ve.dm.MWInlineExtensionNode.js │ │ ├── ve.dm.MWInlineImageNode.js │ │ ├── ve.dm.MWLanguageVariantBlockNode.js │ │ ├── ve.dm.MWLanguageVariantHiddenNode.js │ │ ├── ve.dm.MWLanguageVariantInlineNode.js │ │ ├── ve.dm.MWLanguageVariantNode.js │ │ ├── ve.dm.MWMagicLinkNode.js │ │ ├── ve.dm.MWNumberedExternalLinkNode.js │ │ ├── ve.dm.MWPreNode.js │ │ ├── ve.dm.MWPreformattedNode.js │ │ ├── ve.dm.MWSignatureNode.js │ │ ├── ve.dm.MWTableNode.js │ │ ├── ve.dm.MWTransclusionBlockNode.js │ │ ├── ve.dm.MWTransclusionInlineNode.js │ │ ├── ve.dm.MWTransclusionNode.js │ │ └── ve.dm.MWTransclusionTableCellNode.js │ ├── ve.dm.MWWikitextSurface.js │ └── ve.dm.MWWikitextSurfaceFragment.js │ ├── init │ ├── apiresponsecache │ │ ├── ve.init.mw.ApiResponseCache.js │ │ ├── ve.init.mw.GalleryImageInfoCache.js │ │ ├── ve.init.mw.ImageInfoCache.js │ │ └── ve.init.mw.LinkCache.js │ ├── styles │ │ ├── ve.init.mw.DesktopArticleTarget-minerva.less │ │ ├── ve.init.mw.DesktopArticleTarget-monobook.less │ │ ├── ve.init.mw.DesktopArticleTarget-vector.less │ │ ├── ve.init.mw.DesktopArticleTarget.less │ │ ├── ve.init.mw.DesktopArticleTarget.noscript.less │ │ ├── ve.init.mw.DesktopTarget-monobook.less │ │ ├── ve.init.mw.DesktopTarget-vector.less │ │ ├── ve.init.mw.MobileArticleTarget.less │ │ └── ve.init.mw.Target.less │ ├── targets │ │ ├── ve.init.mw.ArticleTarget.js │ │ ├── ve.init.mw.DesktopArticleTarget.js │ │ ├── ve.init.mw.MobileArticleTarget.js │ │ └── ve.init.mw.Target.js │ ├── ve.init.mw.ArticleTargetEvents.js │ ├── ve.init.mw.Platform.init.js │ ├── ve.init.mw.Platform.js │ ├── ve.init.mw.SaveErrorHandler.js │ ├── ve.init.mw.TargetFactory.js │ ├── ve.init.mw.ViewportZoomHandler.js │ └── ve.init.mw.js │ ├── preinit │ ├── .eslintrc.json │ ├── styles │ │ ├── ve.init.MWVESwitchConfirmDialog-apex.less │ │ ├── ve.init.MWVESwitchConfirmDialog-wikimedia.less │ │ ├── ve.init.MWVESwitchConfirmDialog.css │ │ ├── ve.init.MWVESwitchPopupWidget.less │ │ ├── ve.init.mw.DesktopArticleTarget.init-apextheme.css │ │ ├── ve.init.mw.DesktopArticleTarget.init-monobook.css │ │ ├── ve.init.mw.DesktopArticleTarget.init-vector-2022.less │ │ ├── ve.init.mw.DesktopArticleTarget.init-vector.less │ │ ├── ve.init.mw.DesktopArticleTarget.init-wikimediatheme.css │ │ ├── ve.init.mw.DesktopArticleTarget.init.less │ │ ├── ve.init.mw.DiffPage.less │ │ ├── ve.init.mw.ProgressBarWidget-apextheme.css │ │ ├── ve.init.mw.ProgressBarWidget-wikimediatheme.css │ │ ├── ve.init.mw.ProgressBarWidget.css │ │ └── ve.init.mw.TempWikitextEditorWidget.less │ ├── ve.init.MWEditModeTool.js │ ├── ve.init.MWEditingTabDialog.js │ ├── ve.init.MWVESwitchPopupWidget.js │ ├── ve.init.MWWelcomeDialog.js │ ├── ve.init.mw.ArticleTargetLoader.js │ ├── ve.init.mw.ArticleTargetSaver.js │ ├── ve.init.mw.DesktopArticleTarget.init.js │ ├── ve.init.mw.DiffLoader.js │ ├── ve.init.mw.DiffPage.init.js │ ├── ve.init.mw.ProgressBarWidget.js │ ├── ve.init.mw.TempWikitextEditorWidget.js │ └── ve.utils.parsoid.js │ ├── tests │ ├── .eslintrc.json │ ├── ce │ │ ├── ve.ce.ClipboardHandler.test.js │ │ ├── ve.ce.ContentBranchNode.test.js │ │ └── ve.ce.Document.test.js │ ├── dm │ │ ├── annotations │ │ │ └── ve.dm.MWInternalLinkAnnotation.test.js │ │ ├── models │ │ │ ├── ve.dm.MWImageModel.test.js │ │ │ ├── ve.dm.MWTemplateModel.test.js │ │ │ ├── ve.dm.MWTemplateSpecModel.test.js │ │ │ ├── ve.dm.MWTransclusionContentModel.test.js │ │ │ └── ve.dm.MWTransclusionModel.test.js │ │ ├── nodes │ │ │ └── ve.dm.MWTransclusionNode.test.js │ │ ├── ve.dm.Converter.test.js │ │ ├── ve.dm.Document.test.js │ │ ├── ve.dm.SurfaceFragment.test.js │ │ └── ve.dm.mwExample.js │ ├── init │ │ └── targets │ │ │ └── ve.init.mw.DesktopArticleTarget.test.js │ ├── preinit │ │ └── ve.utils.parsoid.test.js │ ├── ui │ │ ├── actions │ │ │ ├── ve.ui.FormatAction.test.js │ │ │ └── ve.ui.MWLinkAction.test.js │ │ ├── datatransferhandlers │ │ │ ├── ve.ui.MWWikitextStringTransferHandler.test.js │ │ │ └── ve.ui.UrlStringTransferHandler.test.js │ │ ├── dialogs │ │ │ └── ve.ui.MWTransclusionDialog.test.js │ │ ├── inspectors │ │ │ └── ve.ui.FragmentInspector.test.js │ │ ├── layouts │ │ │ └── ve.ui.MWTwoPaneTransclusionDialogLayout.test.js │ │ ├── pages │ │ │ ├── ve.ui.MWAddParameterPage.test.js │ │ │ └── ve.ui.MWParameterPage.test.js │ │ ├── ve.ui.DiffElement.test.js │ │ └── widgets │ │ │ ├── ve.ui.MWParameterCheckboxInputWidget.test.js │ │ │ ├── ve.ui.MWTemplateTitleInputWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlineButtonWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlineParameterSelectWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlineParameterWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlinePartWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlinePlaceholderWidget.test.js │ │ │ ├── ve.ui.MWTransclusionOutlineTemplateWidget.test.js │ │ │ └── ve.ui.MWTransclusionOutlineWidget.test.js │ └── ve.test.utils.js │ ├── themes │ ├── apex.css │ └── wikimediaui.css │ ├── treeDiffer-global.js │ ├── ui │ ├── actions │ │ ├── ve.ui.MWLinkAction.js │ │ ├── ve.ui.MWSaveDialogAction.js │ │ └── ve.ui.MWWikitextAction.js │ ├── commands │ │ ├── ve.ui.MWLinkCommand.js │ │ └── ve.ui.MWWikitextWarningCommand.js │ ├── contextitems │ │ ├── ve.ui.MWAlienAnnotationContextItem.js │ │ ├── ve.ui.MWAlienExtensionContextItem.js │ │ ├── ve.ui.MWAnnotationContextItem.js │ │ ├── ve.ui.MWDefinedTransclusionContextItem.js │ │ ├── ve.ui.MWGalleryContextItem.js │ │ ├── ve.ui.MWIncludesContextItem.js │ │ ├── ve.ui.MWInternalLinkContextItem.js │ │ ├── ve.ui.MWLanguageVariantNodeContextItem.js │ │ ├── ve.ui.MWMagicLinkNodeContextItem.js │ │ ├── ve.ui.MWMediaContextItem.js │ │ ├── ve.ui.MWNumberedExternalLinkNodeContextItem.js │ │ ├── ve.ui.MWPreContextItem.js │ │ ├── ve.ui.MWSignatureContextItem.js │ │ ├── ve.ui.MWTransclusionContextItem.js │ │ └── ve.ui.MWWikitextPasteContextItem.js │ ├── datatransferhandlers │ │ ├── ve.ui.MWMediaTransferHandler.js │ │ ├── ve.ui.MWWikitextPlainTextStringTransferHandler.js │ │ └── ve.ui.MWWikitextStringTransferHandler.js │ ├── dialogs │ │ ├── ve.ui.MWCommandHelpDialog.js │ │ ├── ve.ui.MWExtensionDialog.js │ │ ├── ve.ui.MWExtensionPreviewDialog.js │ │ ├── ve.ui.MWFloatingHelpDialog.js │ │ ├── ve.ui.MWGalleryDialog.js │ │ ├── ve.ui.MWMediaDialog.js │ │ ├── ve.ui.MWMetaDialog.js │ │ ├── ve.ui.MWMobileSaveDialog.js │ │ ├── ve.ui.MWPreDialog.js │ │ ├── ve.ui.MWRequiredParamBlankConfirmDialog.js │ │ ├── ve.ui.MWSaveDialog.js │ │ ├── ve.ui.MWTableDialog.js │ │ ├── ve.ui.MWTemplateDialog.js │ │ └── ve.ui.MWTransclusionDialog.js │ ├── elements │ │ ├── ve.ui.MWExpandableContentElement.js │ │ ├── ve.ui.MWExpandableErrorElement.js │ │ ├── ve.ui.MWFloatingHelpElement.js │ │ └── ve.ui.MWPreviewElement.js │ ├── inspectors │ │ ├── ve.ui.MWAlienExtensionInspector.js │ │ ├── ve.ui.MWCommentInspector.js │ │ ├── ve.ui.MWExtensionInspector.js │ │ ├── ve.ui.MWLanguageVariantInspector.js │ │ ├── ve.ui.MWLinkAnnotationInspector.js │ │ ├── ve.ui.MWLinkNodeInspector.js │ │ ├── ve.ui.MWLiveExtensionInspector.js │ │ ├── ve.ui.MWMagicLinkNodeInspector.js │ │ └── ve.ui.MWWikitextLinkAnnotationInspector.js │ ├── layouts │ │ ├── ve.ui.MWTwoPaneTransclusionDialogLayout.js │ │ └── ve.ui.MWVerticalLayout.js │ ├── pages │ │ ├── ve.ui.MWAddParameterPage.js │ │ ├── ve.ui.MWAdvancedSettingsPage.js │ │ ├── ve.ui.MWCategoriesPage.js │ │ ├── ve.ui.MWLanguagesPage.js │ │ ├── ve.ui.MWParameterPage.js │ │ ├── ve.ui.MWSettingsPage.js │ │ ├── ve.ui.MWTemplatePage.js │ │ ├── ve.ui.MWTemplatePlaceholderPage.js │ │ ├── ve.ui.MWTemplatesUsedPage.js │ │ └── ve.ui.MWTransclusionContentPage.js │ ├── styles │ │ ├── apex │ │ │ ├── ve.ui.Icons.json │ │ │ └── ve.ui.Indicators.json │ │ ├── contextitems │ │ │ ├── ve.ui.MWInternalLinkContextItem.less │ │ │ └── ve.ui.MWLanguageVariantNodeContextItem.less │ │ ├── dialogs │ │ │ ├── images │ │ │ │ ├── welcomeSplash-ltr.png │ │ │ │ └── welcomeSplash-rtl.png │ │ │ ├── ve.ui.MWGalleryDialog.less │ │ │ ├── ve.ui.MWMediaDialog.less │ │ │ ├── ve.ui.MWMetaDialog.less │ │ │ ├── ve.ui.MWMobileSaveDialog.less │ │ │ ├── ve.ui.MWPreDialog.less │ │ │ ├── ve.ui.MWSaveDialog.less │ │ │ ├── ve.ui.MWTransclusionDialog.less │ │ │ └── ve.ui.MWWelcomeDialog.less │ │ ├── elements │ │ │ ├── images │ │ │ │ └── vector-bullet-icon-disabled.svg │ │ │ ├── ve.ui.DiffElement-minerva.less │ │ │ ├── ve.ui.DiffElement-vector.less │ │ │ ├── ve.ui.MWExpandableContentElement.less │ │ │ ├── ve.ui.MWExpandableErrorElement.less │ │ │ ├── ve.ui.MWFloatingHelpElement.less │ │ │ └── ve.ui.MWPreviewElement.less │ │ ├── images │ │ │ ├── icons │ │ │ │ ├── parameter-ltr.svg │ │ │ │ ├── parameter-rtl.svg │ │ │ │ └── public-domain.svg │ │ │ └── indicators │ │ │ │ └── alert.svg │ │ ├── inspectors │ │ │ ├── ve.ui.MWAlienExtensionInspector.less │ │ │ ├── ve.ui.MWExtensionInspector.less │ │ │ └── ve.ui.MWLinkAnnotationInspector.less │ │ ├── layouts │ │ │ ├── ve.ui.MWTwoPaneTransclusionDialogLayout-minerva.less │ │ │ └── ve.ui.MWTwoPaneTransclusionDialogLayout.less │ │ ├── pages │ │ │ ├── ve.ui.MWAddParameterPage.less │ │ │ ├── ve.ui.MWParameterPage-default.less │ │ │ ├── ve.ui.MWParameterPage-minerva.less │ │ │ ├── ve.ui.MWParameterPage.less │ │ │ ├── ve.ui.MWTemplatePage-default.less │ │ │ ├── ve.ui.MWTemplatePage-minerva.less │ │ │ ├── ve.ui.MWTemplatePage.less │ │ │ ├── ve.ui.MWTemplatePlaceholderPage.less │ │ │ └── ve.ui.MWTransclusionContentPage.less │ │ ├── toolgroups │ │ │ └── ve.ui.MWHelpListToolGroup.less │ │ ├── tools │ │ │ ├── images │ │ │ │ ├── link-ltr.png │ │ │ │ └── link-rtl.png │ │ │ ├── ve.ui.MWFormatTool-minerva.css │ │ │ ├── ve.ui.MWFormatTool-monobook.css │ │ │ ├── ve.ui.MWFormatTool-vector.css │ │ │ ├── ve.ui.MWLinkInspectorTool.css │ │ │ └── ve.ui.MWPopupTool.css │ │ ├── ve.ui.MWWikitextSurface.css │ │ ├── widgets │ │ │ ├── images │ │ │ │ └── broken-image.png │ │ │ ├── ve.ui.MWAceEditorWidget.less │ │ │ ├── ve.ui.MWCategoryInputWidget.less │ │ │ ├── ve.ui.MWCategoryItemWidget.less │ │ │ ├── ve.ui.MWCategoryPopupWidget.less │ │ │ ├── ve.ui.MWCategoryWidget.less │ │ │ ├── ve.ui.MWEducationPopupWidget.less │ │ │ ├── ve.ui.MWMediaInfoFieldWidget.less │ │ │ ├── ve.ui.MWTocWidget.css │ │ │ ├── ve.ui.MWTransclusionOutlineControlsWidget.less │ │ │ └── ve.ui.MWTransclusionOutlineWidget.less │ │ └── wikimediaui │ │ │ ├── ve.ui.Icons.json │ │ │ └── ve.ui.Indicators.json │ ├── toolgroups │ │ └── ve.ui.MWHelpListToolGroup.js │ ├── tools │ │ ├── ve.ui.MWBackTool.js │ │ ├── ve.ui.MWEditModeTool.js │ │ ├── ve.ui.MWFormatTool.js │ │ ├── ve.ui.MWGalleryDialogTool.js │ │ ├── ve.ui.MWLinkInspectorTool.js │ │ ├── ve.ui.MWMediaDialogTool.js │ │ ├── ve.ui.MWMetaDialogTool.js │ │ ├── ve.ui.MWMobileLinkInspectorTool.js │ │ ├── ve.ui.MWPopupTool.js │ │ ├── ve.ui.MWSaveTool.js │ │ ├── ve.ui.MWSignatureTool.js │ │ └── ve.ui.MWTransclusionDialogTool.js │ ├── ve.ui.MWAriaDescribe.js │ ├── ve.ui.MWCommandRegistry.js │ ├── ve.ui.MWExtensionWindow.js │ ├── ve.ui.MWSequenceRegistry.js │ ├── ve.ui.MWSurface.js │ ├── ve.ui.MWWikitextCommandRegistry.js │ ├── ve.ui.MWWikitextDataTransferHandlerFactory.js │ ├── ve.ui.MWWikitextSequenceRegistry.js │ ├── ve.ui.MWWikitextSurface.js │ ├── ve.ui.MWWikitextTransferRegistry.js │ └── widgets │ │ ├── ve.ui.MWAceEditorWidget.js │ │ ├── ve.ui.MWCategoryInputWidget.js │ │ ├── ve.ui.MWCategoryItemWidget.js │ │ ├── ve.ui.MWCategoryPopupWidget.js │ │ ├── ve.ui.MWCategoryWidget.js │ │ ├── ve.ui.MWEditSummaryWidget.js │ │ ├── ve.ui.MWEducationPopupWidget.js │ │ ├── ve.ui.MWExternalLinkAnnotationWidget.js │ │ ├── ve.ui.MWGalleryGroupWidget.js │ │ ├── ve.ui.MWGalleryItemWidget.js │ │ ├── ve.ui.MWInternalLinkAnnotationWidget.js │ │ ├── ve.ui.MWLazyMultilineTextInputWidget.js │ │ ├── ve.ui.MWMediaInfoFieldWidget.js │ │ ├── ve.ui.MWParameterCheckboxInputWidget.js │ │ ├── ve.ui.MWPreTextInputWidget.js │ │ ├── ve.ui.MWTargetWidget.js │ │ ├── ve.ui.MWTemplateTitleInputWidget.js │ │ ├── ve.ui.MWTocWidget.js │ │ ├── ve.ui.MWTransclusionOutlineButtonWidget.js │ │ ├── ve.ui.MWTransclusionOutlineControlsWidget.js │ │ ├── ve.ui.MWTransclusionOutlineParameterSelectWidget.js │ │ ├── ve.ui.MWTransclusionOutlineParameterWidget.js │ │ ├── ve.ui.MWTransclusionOutlinePartWidget.js │ │ ├── ve.ui.MWTransclusionOutlinePlaceholderWidget.js │ │ ├── ve.ui.MWTransclusionOutlineTemplateWidget.js │ │ ├── ve.ui.MWTransclusionOutlineToggleUnusedWidget.js │ │ ├── ve.ui.MWTransclusionOutlineWidget.js │ │ └── ve.ui.MWTransclusionOutlineWikitextWidget.js │ └── ve.track.js ├── package-lock.json ├── package.json ├── screenshots └── README.md └── tests ├── api-testing └── edit.js ├── phpunit ├── ApiVisualEditorTest.php ├── integration │ ├── DirectParsoidClientTest.php │ ├── HooksTest.php │ └── VisualEditorParsoidClientFactoryTest.php └── unit │ └── VisualEditorHookRunnerTest.php └── selenium ├── .eslintrc.json ├── README.md ├── pageobjects └── edit.page.js ├── specs ├── content_editable.js └── toolbar.js └── wdio.conf.js /.eslintignore: -------------------------------------------------------------------------------- 1 | # Upstream code 2 | /lib/ 3 | 4 | # Build 5 | /vendor/ 6 | /docs/ 7 | 8 | # Language files written automatically by TranslateWiki 9 | **/i18n/**/*.json 10 | !**/i18n/**/en.json 11 | !**/i18n/**/qqq.json 12 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "wikimedia/server" 5 | ], 6 | "env": { 7 | "commonjs": true, 8 | "node": true, 9 | "mocha": true 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Editors 2 | *~ 3 | *.kate-swp 4 | .*.swp 5 | sublime-* 6 | .project 7 | .settings 8 | \#*# 9 | .#* 10 | /.idea 11 | .vscode 12 | 13 | # Install and build artifacts 14 | /docs 15 | node_modules 16 | composer.lock 17 | vendor 18 | screenshots/*.png 19 | .eslintcache 20 | tests/selenium/log 21 | .api-testing.config.json 22 | 23 | # OS 24 | .DS_Store 25 | /.stylelintcache 26 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/ve"] 2 | path = lib/ve 3 | url = https://gerrit.wikimedia.org/r/VisualEditor/VisualEditor.git 4 | -------------------------------------------------------------------------------- /.gitreview: -------------------------------------------------------------------------------- 1 | [gerrit] 2 | host=gerrit.wikimedia.org 3 | port=29418 4 | project=mediawiki/extensions/VisualEditor.git 5 | track=1 6 | defaultrebase=0 7 | -------------------------------------------------------------------------------- /.phan/config.php: -------------------------------------------------------------------------------- 1 | { 2 | ve.collab.join(); 3 | } ); 4 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWAnnotationNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWAnnotationNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwAnnotationNode { 9 | display: inline-block; 10 | opacity: 0.5; 11 | /* Support: Blink, Gecko, Webkit */ 12 | /* Specify a valid second value to fix size, see T176636 */ 13 | font-family: monospace, monospace; 14 | } 15 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWBlockImageNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWBlockImageNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwBlockImageNode { 9 | /* Override paragraph margins inside of captions */ 10 | > figcaption p { 11 | margin: 0 !important; /* stylelint-disable-line declaration-no-important */ 12 | } 13 | 14 | /* Disable zoom link */ 15 | > a::after { 16 | pointer-events: none; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWEntityNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWEntityNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwEntityNode-nbsp { 9 | background-color: #ccc; 10 | cursor: help; 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWIncludesNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWIncludesNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwIncludesNode { 9 | display: inline-block; 10 | opacity: 0.5; 11 | /* Support: Blink, Gecko, Webkit */ 12 | /* Specify a valid second value to fix size, see T176636 */ 13 | font-family: monospace, monospace; 14 | } 15 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWInlineImageNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWInlineImageNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwInlineImageNode { 9 | display: inline-block; 10 | } 11 | -------------------------------------------------------------------------------- /modules/ve-mw/ce/styles/nodes/ve.ce.MWTransclusionNode.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor ContentEditable MediaWiki MWTransclusionNode styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ce-mwTransclusionNode { 9 | > .ve-ce-focusableNode-invisibleIcon.oo-ui-iconElement { 10 | font-size: 1em; 11 | width: auto; 12 | } 13 | 14 | &.ve-ce-focusableNode-invisible { 15 | width: auto; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/ve-mw/dm/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": false, 4 | "shared-node-browser": true 5 | }, 6 | "globals": { 7 | "HTMLElement": "readonly", 8 | "Node": "readonly", 9 | "document": "readonly", 10 | "$": "off" 11 | }, 12 | "rules": { 13 | "no-jquery/no-append-html": "warn", 14 | "no-jquery/no-done-fail": "warn" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /modules/ve-mw/init/styles/ve.init.mw.DesktopArticleTarget-minerva.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Initialization DesktopArticleTarget Minerva skin styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-desktopArticleTarget .ve-init-mw-target-surface { 9 | > .ve-ce-attachedRootNode, 10 | > .ve-ce-surface .ve-ui-surface-placeholder { 11 | padding: 0; 12 | /* Provide clickable gutter */ 13 | padding-left: 1000px; 14 | margin-left: -1000px; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /modules/ve-mw/init/ve.init.mw.Platform.init.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Platform init. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | // eslint-disable-next-line no-new 9 | new ve.init.mw.Platform(); 10 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "globals": { 3 | "ve": "off" 4 | }, 5 | "rules": { 6 | "no-jquery/no-extend": "off", 7 | "no-jquery/no-deferred": "off", 8 | "no-jquery/no-when": "off", 9 | "no-jquery/no-done-fail": "warn" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.MWVESwitchConfirmDialog-wikimedia.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Initialization edit switching styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-editSwitch .oo-ui-popupToolGroup { 9 | height: 32px; 10 | border: 0; 11 | margin: 0; 12 | border-radius: 0; 13 | 14 | &.oo-ui-iconElement .oo-ui-popupToolGroup-handle { 15 | padding-top: 32px; 16 | height: 0; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.MWVESwitchConfirmDialog.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Initialization edit switching styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-editSwitch .oo-ui-toolbar-bar { 9 | background: transparent; 10 | box-shadow: none; 11 | border: 0; 12 | } 13 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.MWVESwitchPopupWidget.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Initialization edit switching styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-switchPopupWidget { 9 | white-space: normal; 10 | z-index: 4; 11 | 12 | .oo-ui-popupWidget-anchor { 13 | margin-left: 1.25em; 14 | } 15 | 16 | .oo-ui-popupWidget-head { 17 | font-weight: bold; 18 | } 19 | 20 | .oo-ui-fieldLayout:last-child { 21 | margin-bottom: 12px; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.mw.ProgressBarWidget-wikimediatheme.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor progress bar widget WikimediaUI theme styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-progressBarWidget { 9 | background-color: #fff; 10 | box-sizing: border-box; 11 | height: 0.875em; 12 | border: 1px solid #36c; 13 | border-radius: 0.875em; 14 | box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.15 ); 15 | } 16 | 17 | .ve-init-mw-progressBarWidget-bar { 18 | background-color: #36c; 19 | height: 0.875em; 20 | } 21 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.mw.ProgressBarWidget.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor progress bar widget styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-progressBarWidget { 9 | height: 1em; 10 | overflow: hidden; 11 | margin: 0 25%; 12 | } 13 | 14 | .ve-init-mw-progressBarWidget-bar { 15 | height: 1em; 16 | width: 0; 17 | } 18 | -------------------------------------------------------------------------------- /modules/ve-mw/preinit/styles/ve.init.mw.TempWikitextEditorWidget.less: -------------------------------------------------------------------------------- 1 | .ve-init-mw-tempWikitextEditorWidget { 2 | border: 0; 3 | padding: 0; 4 | color: inherit; 5 | line-height: 1.5em; 6 | width: 100%; 7 | -moz-tab-size: 4; 8 | tab-size: 4; 9 | 10 | &:focus { 11 | outline: 0; 12 | padding: 0; 13 | } 14 | 15 | /* Mimics ve-ce-attachedRootNode */ 16 | /* stylelint-disable-next-line plugin/no-unsupported-browser-features */ 17 | &::selection { 18 | background: rgba( 109, 169, 247, 0.5 ); /* #6da9f7 */ 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /modules/ve-mw/treeDiffer-global.js: -------------------------------------------------------------------------------- 1 | // Back-compat: Export module as global 2 | window.treeDiffer = module.exports; 3 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/apex/ve.ui.Icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": { 3 | "parameter": { 4 | "file": "../images/icons/parameter-ltr.svg" 5 | }, 6 | "public-domain": { 7 | "file": "../images/icons/public-domain.svg" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/apex/ve.ui.Indicators.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": { 3 | "alert": { 4 | "file": "../images/indicators/alert.svg" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/dialogs/images/welcomeSplash-ltr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-VisualEditor/58d76f0225dfe7abe67fb7e3ef0be7073e12d757/modules/ve-mw/ui/styles/dialogs/images/welcomeSplash-ltr.png -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/dialogs/images/welcomeSplash-rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-VisualEditor/58d76f0225dfe7abe67fb7e3ef0be7073e12d757/modules/ve-mw/ui/styles/dialogs/images/welcomeSplash-rtl.png -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/dialogs/ve.ui.MWMobileSaveDialog.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface MWMobileSaveDialog styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | /* stylelint-disable-next-line selector-class-pattern */ 9 | .ve-ui-mwMobileSaveDialog .content { 10 | margin: 0; 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/dialogs/ve.ui.MWWelcomeDialog.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface beta welcome dialog styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-init-mw-welcomeDialog-content { 9 | display: block; 10 | text-align: center; 11 | 12 | &::before { 13 | content: ''; 14 | background: url( images/welcomeSplash-ltr.png ) center no-repeat; 15 | background-size: contain; 16 | display: block; 17 | height: 8em; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/elements/images/vector-bullet-icon-disabled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/elements/ve.ui.DiffElement-vector.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor Vector-specific UserInterface DiffElement styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | ul > li[ data-diff-list-none ] { 9 | list-style-image: url( images/vector-bullet-icon-disabled.svg ); 10 | } 11 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/elements/ve.ui.MWPreviewElement.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface preview element styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .mw-body-content .ve-ui-mwPreviewElement { 9 | /* Don't apply font adjustment twice if already inside a content area */ 10 | font-size: inherit; 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/images/icons/parameter-ltr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/images/icons/parameter-rtl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/images/indicators/alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | alert 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/inspectors/ve.ui.MWAlienExtensionInspector.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface alien extension inspector styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-mwAlienExtensionInspector-attributes { 9 | margin-top: 1em; 10 | 11 | .oo-ui-textInputWidget { 12 | width: 100%; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/inspectors/ve.ui.MWExtensionInspector.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface Inspector styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | .ve-ui-mwExtensionInspector .ve-ui-mwExtensionWindow-input { 8 | width: 100%; 9 | 10 | textarea { 11 | height: 8em; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/layouts/ve.ui.MWTwoPaneTransclusionDialogLayout-minerva.less: -------------------------------------------------------------------------------- 1 | .ve-ui-mwTwoPaneTransclusionDialogLayout { 2 | &-stackLayout { 3 | /* We don't want anything to collapse left/right, so shouldn't use margin */ 4 | padding: 0 20px; 5 | 6 | /* Allow inputs to use the full width */ 7 | .oo-ui-textInputWidget, 8 | .ve-ui-mwParameterPage-inlineDescription, 9 | .oo-ui-actionFieldLayout.oo-ui-fieldLayout-align-top { 10 | max-width: none; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/pages/ve.ui.MWTemplatePage-default.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface TemplatePage styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | @import 'mediawiki.skin.variables.less'; 8 | 9 | .ve-ui-mwTemplatePage-description { 10 | color: @color-subtle; 11 | overflow-wrap: break-word; 12 | 13 | &-extra, 14 | &-missing { 15 | font-style: italic; 16 | } 17 | } 18 | 19 | .ve-ui-mwTemplatePage-favorite { 20 | text-align: end; 21 | } 22 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/pages/ve.ui.MWTemplatePage-minerva.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface TemplatePage styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-mwTransclusionDialog-multipart-message { 9 | &, 10 | + .oo-ui-panelLayout { 11 | margin-top: 20px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/pages/ve.ui.MWTemplatePlaceholderPage.less: -------------------------------------------------------------------------------- 1 | .ve-ui-mwTemplatePlaceholderPage { 2 | .ve-ui-mwTransclusionDialog-addButton { 3 | white-space: nowrap; 4 | } 5 | 6 | .ve-ui-mwTransclusionDialog-addTemplateFieldset { 7 | .mw-widget-titleInputWidget { 8 | min-width: 10em; 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/pages/ve.ui.MWTransclusionContentPage.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface MWTransclusionContentPage styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-mwTransclusionContentPage .oo-ui-textInputWidget { 9 | display: block; 10 | width: 100%; 11 | 12 | textarea { 13 | height: 2.5em; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/tools/images/link-ltr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-VisualEditor/58d76f0225dfe7abe67fb7e3ef0be7073e12d757/modules/ve-mw/ui/styles/tools/images/link-ltr.png -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/tools/images/link-rtl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-VisualEditor/58d76f0225dfe7abe67fb7e3ef0be7073e12d757/modules/ve-mw/ui/styles/tools/images/link-rtl.png -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/tools/ve.ui.MWFormatTool-minerva.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Minerva-specific FormatTool styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .oo-ui-menuToolGroup-tools .oo-ui-tool-name-heading1 .oo-ui-tool-title, 9 | .oo-ui-menuToolGroup-tools .oo-ui-tool-name-heading2 .oo-ui-tool-title { 10 | font-family: 'Linux Libertine', 'Georgia', 'Times', serif; 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/tools/ve.ui.MWLinkInspectorTool.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface link inspector tool styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-educationPopup-image-link { 9 | background: url( images/link-ltr.png ) no-repeat center/90%; 10 | height: 150px; 11 | } 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/ve.ui.MWWikitextSurface.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki Initialization WikitextSurface styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-mwWikitextSurface .ve-ce-paragraphNode { 9 | line-height: 1.5em; 10 | } 11 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/widgets/images/broken-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wikimedia/mediawiki-extensions-VisualEditor/58d76f0225dfe7abe67fb7e3ef0be7073e12d757/modules/ve-mw/ui/styles/widgets/images/broken-image.png -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/widgets/ve.ui.MWCategoryInputWidget.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface MWCategoryInputWidget styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | 8 | .ve-ui-mwCategoryInputWidget { 9 | width: 15em; 10 | margin-bottom: 0.5em; 11 | display: inline-block; 12 | 13 | input { 14 | line-height: 1.35em; 15 | } 16 | 17 | .ve-ui-mwCategoryWidget.oo-ui-draggableGroupElement-dragging & { 18 | opacity: 0.5; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/widgets/ve.ui.MWCategoryItemWidget.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor MediaWiki UserInterface MWCategoryItemWidget styles. 3 | * 4 | * @copyright See AUTHORS.txt 5 | * @license The MIT License (MIT); see LICENSE.txt 6 | */ 7 | @import 'mediawiki.skin.variables.less'; 8 | 9 | .ve-ui-mwCategoryItemWidget { 10 | margin: 0 0.5em 0.5em 0; 11 | padding: 0; 12 | 13 | /* stylelint-disable-next-line selector-class-pattern */ 14 | .oo-ui-labelElement-label.new { 15 | color: @color-error; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/widgets/ve.ui.MWTocWidget.css: -------------------------------------------------------------------------------- 1 | .ve-ui-mwTocWidget { 2 | cursor: default; 3 | user-select: none; 4 | -moz-user-select: none; 5 | -webkit-user-select: none; 6 | } 7 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/wikimediaui/ve.ui.Icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "variants": { 3 | "invert": { 4 | "color": "#fff", 5 | "global": true 6 | }, 7 | "progressive": { 8 | "color": "#36c", 9 | "global": true 10 | } 11 | }, 12 | "images": { 13 | "parameter": { 14 | "file": "../images/icons/parameter-ltr.svg" 15 | }, 16 | "public-domain": { 17 | "file": "../images/icons/public-domain.svg" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/styles/wikimediaui/ve.ui.Indicators.json: -------------------------------------------------------------------------------- 1 | { 2 | "images": { 3 | "alert": { 4 | "file": "../images/indicators/alert.svg" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /modules/ve-mw/ui/ve.ui.MWWikitextSequenceRegistry.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * VisualEditor Wikitext sequence registry 3 | * 4 | * This should probably never have anything in it. 5 | * 6 | * @copyright See AUTHORS.txt 7 | */ 8 | 9 | /* Initialization */ 10 | 11 | ve.ui.wikitextSequenceRegistry = new ve.ui.SequenceRegistry(); 12 | -------------------------------------------------------------------------------- /modules/ve-mw/ve.track.js: -------------------------------------------------------------------------------- 1 | // In VE-MW, track events using MediaWiki's system instead of VisualEditor's 2 | ve.track = mw.track; 3 | ve.trackSubscribe = mw.trackSubscribe; 4 | 5 | ve.trackSubscribe( 'activity.', ( topic, data ) => { 6 | mw.track( 'visualEditorFeatureUse', ve.extendObject( data, { 7 | feature: topic.split( '.' )[ 1 ] 8 | } ) ); 9 | } ); 10 | -------------------------------------------------------------------------------- /screenshots/README.md: -------------------------------------------------------------------------------- 1 | Generated screenshots will be put here. 2 | -------------------------------------------------------------------------------- /tests/selenium/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "wikimedia/selenium" 5 | ], 6 | "globals": { 7 | "mw": "readonly", 8 | "ve": "readonly" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tests/selenium/README.md: -------------------------------------------------------------------------------- 1 | # Selenium tests 2 | 3 | For more information see https://www.mediawiki.org/wiki/Selenium 4 | 5 | ## Setup 6 | 7 | See https://www.mediawiki.org/wiki/MediaWiki-Docker/Extension/VisualEditor 8 | 9 | ## Run all tests 10 | 11 | npm run selenium-test 12 | 13 | ## Run specific tests 14 | 15 | Filter by file name: 16 | 17 | npm run selenium-test -- --spec tests/selenium/specs/[FILE-NAME] 18 | 19 | Filter by file name and test name: 20 | 21 | npm run selenium-test -- --spec tests/selenium/specs/[FILE-NAME] --mochaOpts.grep [TEST-NAME] 22 | -------------------------------------------------------------------------------- /tests/selenium/wdio.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { config } = require( 'wdio-mediawiki/wdio-defaults.conf.js' ); 4 | 5 | exports.config = { ...config, 6 | // Override, or add to, the setting from wdio-mediawiki. 7 | // Learn more at https://webdriver.io/docs/configurationfile/ 8 | // 9 | // Example: 10 | // logLevel: 'info', 11 | 12 | maxInstances: 4 13 | }; 14 | --------------------------------------------------------------------------------