eis-ui-render 0.34.3 → 0.35.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/README.md +411 -18
- package/THIRD-PARTY-NOTICES.md +127 -0
- package/dist/THIRD-PARTY-LICENSES.txt +429 -0
- package/dist/contract.d.ts +299 -0
- package/dist/index.d.ts +42 -5
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +0 -15
- package/dist/index.js.map +1 -1
- package/dist/sbom.cdx.json +338 -0
- package/dist/static/all.css +2 -39
- package/dist/static/font.css +2 -8
- package/docs/BUILT-IN-PHRASES.md +79 -0
- package/docs/SUPPORTED-PROPS.md +422 -0
- package/docs/SUPPORTED-VIEWS.md +140 -0
- package/meta.schema.json +494 -0
- package/package.json +113 -73
- package/static/all.css +4 -22
- package/static/all.css.map +1 -1
- package/dist/UIRender.d.ts +0 -43
- package/dist/static/all.css.map +0 -1
- package/dist/static/fonts/icons/fonts/iconsOpenL.eot +0 -0
- package/dist/static/fonts/icons/fonts/iconsOpenL.svg +0 -95
- package/dist/static/fonts/icons/fonts/iconsOpenL.ttf +0 -0
- package/dist/static/fonts/icons/fonts/iconsOpenL.woff +0 -0
- package/dist/static/images/diamonds-dimmed-flipped.png +0 -0
- package/dist/static/images/diamonds-dimmed.png +0 -0
- package/dist/static/images/diamonds.png +0 -0
- package/dist/static/images/flags/ad.svg +0 -150
- package/dist/static/images/flags/ae.svg +0 -6
- package/dist/static/images/flags/af.svg +0 -81
- package/dist/static/images/flags/ag.svg +0 -14
- package/dist/static/images/flags/ai.svg +0 -767
- package/dist/static/images/flags/al.svg +0 -5
- package/dist/static/images/flags/am.svg +0 -5
- package/dist/static/images/flags/ao.svg +0 -13
- package/dist/static/images/flags/aq.svg +0 -6
- package/dist/static/images/flags/ar.svg +0 -31
- package/dist/static/images/flags/as.svg +0 -33
- package/dist/static/images/flags/at.svg +0 -6
- package/dist/static/images/flags/au.svg +0 -9
- package/dist/static/images/flags/aw.svg +0 -186
- package/dist/static/images/flags/ax.svg +0 -18
- package/dist/static/images/flags/az.svg +0 -8
- package/dist/static/images/flags/ba.svg +0 -12
- package/dist/static/images/flags/bb.svg +0 -6
- package/dist/static/images/flags/bd.svg +0 -4
- package/dist/static/images/flags/be.svg +0 -7
- package/dist/static/images/flags/bf.svg +0 -7
- package/dist/static/images/flags/bg.svg +0 -7
- package/dist/static/images/flags/bh.svg +0 -11
- package/dist/static/images/flags/bi.svg +0 -15
- package/dist/static/images/flags/bj.svg +0 -14
- package/dist/static/images/flags/bl.svg +0 -7
- package/dist/static/images/flags/bm.svg +0 -98
- package/dist/static/images/flags/bn.svg +0 -36
- package/dist/static/images/flags/bo.svg +0 -676
- package/dist/static/images/flags/bq.svg +0 -5
- package/dist/static/images/flags/br.svg +0 -45
- package/dist/static/images/flags/bs.svg +0 -13
- package/dist/static/images/flags/bt.svg +0 -89
- package/dist/static/images/flags/bv.svg +0 -13
- package/dist/static/images/flags/bw.svg +0 -7
- package/dist/static/images/flags/by.svg +0 -20
- package/dist/static/images/flags/bz.svg +0 -145
- package/dist/static/images/flags/ca.svg +0 -4
- package/dist/static/images/flags/cc.svg +0 -19
- package/dist/static/images/flags/cd.svg +0 -5
- package/dist/static/images/flags/cf.svg +0 -15
- package/dist/static/images/flags/cg.svg +0 -12
- package/dist/static/images/flags/ch.svg +0 -9
- package/dist/static/images/flags/ci.svg +0 -7
- package/dist/static/images/flags/ck.svg +0 -9
- package/dist/static/images/flags/cl.svg +0 -13
- package/dist/static/images/flags/cm.svg +0 -15
- package/dist/static/images/flags/cn.svg +0 -11
- package/dist/static/images/flags/co.svg +0 -7
- package/dist/static/images/flags/cr.svg +0 -7
- package/dist/static/images/flags/cu.svg +0 -13
- package/dist/static/images/flags/cv.svg +0 -13
- package/dist/static/images/flags/cw.svg +0 -14
- package/dist/static/images/flags/cx.svg +0 -15
- package/dist/static/images/flags/cy.svg +0 -6
- package/dist/static/images/flags/cz.svg +0 -12
- package/dist/static/images/flags/de.svg +0 -5
- package/dist/static/images/flags/dj.svg +0 -13
- package/dist/static/images/flags/dk.svg +0 -5
- package/dist/static/images/flags/dm.svg +0 -152
- package/dist/static/images/flags/do.svg +0 -6745
- package/dist/static/images/flags/dz.svg +0 -5
- package/dist/static/images/flags/ec.svg +0 -138
- package/dist/static/images/flags/ee.svg +0 -7
- package/dist/static/images/flags/eg.svg +0 -38
- package/dist/static/images/flags/eh.svg +0 -15
- package/dist/static/images/flags/el.svg +0 -22
- package/dist/static/images/flags/en.svg +0 -15
- package/dist/static/images/flags/er.svg +0 -8
- package/dist/static/images/flags/es-ct.svg +0 -4
- package/dist/static/images/flags/es.svg +0 -544
- package/dist/static/images/flags/et.svg +0 -14
- package/dist/static/images/flags/eu.svg +0 -28
- package/dist/static/images/flags/fa.svg +0 -219
- package/dist/static/images/flags/fi.svg +0 -5
- package/dist/static/images/flags/fj.svg +0 -120
- package/dist/static/images/flags/fk.svg +0 -89
- package/dist/static/images/flags/fm.svg +0 -11
- package/dist/static/images/flags/fo.svg +0 -12
- package/dist/static/images/flags/fr.svg +0 -7
- package/dist/static/images/flags/ga.svg +0 -7
- package/dist/static/images/flags/gb-eng.svg +0 -5
- package/dist/static/images/flags/gb-nir.svg +0 -131
- package/dist/static/images/flags/gb-sct.svg +0 -4
- package/dist/static/images/flags/gb-wls.svg +0 -9
- package/dist/static/images/flags/gb.svg +0 -15
- package/dist/static/images/flags/gd.svg +0 -27
- package/dist/static/images/flags/ge.svg +0 -6
- package/dist/static/images/flags/gf.svg +0 -5
- package/dist/static/images/flags/gg.svg +0 -9
- package/dist/static/images/flags/gh.svg +0 -6
- package/dist/static/images/flags/gi.svg +0 -32
- package/dist/static/images/flags/gl.svg +0 -4
- package/dist/static/images/flags/gm.svg +0 -14
- package/dist/static/images/flags/gn.svg +0 -7
- package/dist/static/images/flags/gp.svg +0 -7
- package/dist/static/images/flags/gq.svg +0 -23
- package/dist/static/images/flags/gr.svg +0 -22
- package/dist/static/images/flags/gs.svg +0 -201
- package/dist/static/images/flags/gt.svg +0 -204
- package/dist/static/images/flags/gu.svg +0 -39
- package/dist/static/images/flags/gw.svg +0 -13
- package/dist/static/images/flags/gy.svg +0 -9
- package/dist/static/images/flags/he.svg +0 -14
- package/dist/static/images/flags/hk.svg +0 -30
- package/dist/static/images/flags/hm.svg +0 -9
- package/dist/static/images/flags/hn.svg +0 -18
- package/dist/static/images/flags/hr.svg +0 -58
- package/dist/static/images/flags/ht.svg +0 -116
- package/dist/static/images/flags/hu.svg +0 -7
- package/dist/static/images/flags/id.svg +0 -6
- package/dist/static/images/flags/ie.svg +0 -7
- package/dist/static/images/flags/il.svg +0 -14
- package/dist/static/images/flags/im.svg +0 -36
- package/dist/static/images/flags/in.svg +0 -25
- package/dist/static/images/flags/io.svg +0 -138
- package/dist/static/images/flags/iq.svg +0 -10
- package/dist/static/images/flags/ir.svg +0 -219
- package/dist/static/images/flags/is.svg +0 -12
- package/dist/static/images/flags/it.svg +0 -7
- package/dist/static/images/flags/ja.svg +0 -11
- package/dist/static/images/flags/je.svg +0 -29
- package/dist/static/images/flags/jm.svg +0 -8
- package/dist/static/images/flags/jo.svg +0 -16
- package/dist/static/images/flags/jp.svg +0 -11
- package/dist/static/images/flags/ke.svg +0 -23
- package/dist/static/images/flags/kg.svg +0 -15
- package/dist/static/images/flags/kh.svg +0 -61
- package/dist/static/images/flags/ki.svg +0 -36
- package/dist/static/images/flags/km.svg +0 -16
- package/dist/static/images/flags/kn.svg +0 -14
- package/dist/static/images/flags/ko.svg +0 -24
- package/dist/static/images/flags/kp.svg +0 -15
- package/dist/static/images/flags/kr.svg +0 -24
- package/dist/static/images/flags/kw.svg +0 -13
- package/dist/static/images/flags/ky.svg +0 -63
- package/dist/static/images/flags/kz.svg +0 -23
- package/dist/static/images/flags/la.svg +0 -12
- package/dist/static/images/flags/lb.svg +0 -15
- package/dist/static/images/flags/lc.svg +0 -8
- package/dist/static/images/flags/li.svg +0 -43
- package/dist/static/images/flags/lk.svg +0 -22
- package/dist/static/images/flags/lr.svg +0 -14
- package/dist/static/images/flags/ls.svg +0 -8
- package/dist/static/images/flags/lt.svg +0 -7
- package/dist/static/images/flags/lu.svg +0 -5
- package/dist/static/images/flags/lv.svg +0 -6
- package/dist/static/images/flags/ly.svg +0 -13
- package/dist/static/images/flags/ma.svg +0 -4
- package/dist/static/images/flags/mc.svg +0 -6
- package/dist/static/images/flags/md.svg +0 -70
- package/dist/static/images/flags/me.svg +0 -116
- package/dist/static/images/flags/mf.svg +0 -7
- package/dist/static/images/flags/mg.svg +0 -7
- package/dist/static/images/flags/mh.svg +0 -7
- package/dist/static/images/flags/mk.svg +0 -5
- package/dist/static/images/flags/ml.svg +0 -7
- package/dist/static/images/flags/mm.svg +0 -16
- package/dist/static/images/flags/mn.svg +0 -13
- package/dist/static/images/flags/mo.svg +0 -9
- package/dist/static/images/flags/mp.svg +0 -86
- package/dist/static/images/flags/mq.svg +0 -7
- package/dist/static/images/flags/mr.svg +0 -6
- package/dist/static/images/flags/ms.svg +0 -39
- package/dist/static/images/flags/mt.svg +0 -49
- package/dist/static/images/flags/mu.svg +0 -8
- package/dist/static/images/flags/mv.svg +0 -6
- package/dist/static/images/flags/mw.svg +0 -10
- package/dist/static/images/flags/mx.svg +0 -382
- package/dist/static/images/flags/my.svg +0 -15
- package/dist/static/images/flags/mz.svg +0 -21
- package/dist/static/images/flags/na.svg +0 -16
- package/dist/static/images/flags/nc.svg +0 -7
- package/dist/static/images/flags/ne.svg +0 -6
- package/dist/static/images/flags/nf.svg +0 -9
- package/dist/static/images/flags/ng.svg +0 -6
- package/dist/static/images/flags/ni.svg +0 -129
- package/dist/static/images/flags/nl.svg +0 -7
- package/dist/static/images/flags/no.svg +0 -7
- package/dist/static/images/flags/np.svg +0 -14
- package/dist/static/images/flags/nr.svg +0 -12
- package/dist/static/images/flags/nu.svg +0 -26
- package/dist/static/images/flags/nz.svg +0 -41
- package/dist/static/images/flags/om.svg +0 -115
- package/dist/static/images/flags/pa.svg +0 -14
- package/dist/static/images/flags/pe.svg +0 -244
- package/dist/static/images/flags/pf.svg +0 -19
- package/dist/static/images/flags/pg.svg +0 -9
- package/dist/static/images/flags/ph.svg +0 -9
- package/dist/static/images/flags/pk.svg +0 -15
- package/dist/static/images/flags/pl.svg +0 -6
- package/dist/static/images/flags/pm.svg +0 -7
- package/dist/static/images/flags/pn.svg +0 -62
- package/dist/static/images/flags/pr.svg +0 -13
- package/dist/static/images/flags/ps.svg +0 -15
- package/dist/static/images/flags/pt.svg +0 -57
- package/dist/static/images/flags/pw.svg +0 -11
- package/dist/static/images/flags/py.svg +0 -157
- package/dist/static/images/flags/qa.svg +0 -4
- package/dist/static/images/flags/re.svg +0 -7
- package/dist/static/images/flags/ro.svg +0 -7
- package/dist/static/images/flags/rs.svg +0 -292
- package/dist/static/images/flags/ru.svg +0 -7
- package/dist/static/images/flags/rw.svg +0 -13
- package/dist/static/images/flags/sa.svg +0 -26
- package/dist/static/images/flags/sb.svg +0 -13
- package/dist/static/images/flags/sc.svg +0 -14
- package/dist/static/images/flags/sd.svg +0 -13
- package/dist/static/images/flags/se.svg +0 -16
- package/dist/static/images/flags/sg.svg +0 -13
- package/dist/static/images/flags/sh.svg +0 -74
- package/dist/static/images/flags/si.svg +0 -18
- package/dist/static/images/flags/sj.svg +0 -7
- package/dist/static/images/flags/sk.svg +0 -9
- package/dist/static/images/flags/sl.svg +0 -7
- package/dist/static/images/flags/sm.svg +0 -91
- package/dist/static/images/flags/sn.svg +0 -8
- package/dist/static/images/flags/so.svg +0 -11
- package/dist/static/images/flags/sr.svg +0 -6
- package/dist/static/images/flags/ss.svg +0 -8
- package/dist/static/images/flags/st.svg +0 -16
- package/dist/static/images/flags/sv.svg +0 -601
- package/dist/static/images/flags/sx.svg +0 -56
- package/dist/static/images/flags/sy.svg +0 -6
- package/dist/static/images/flags/sz.svg +0 -45
- package/dist/static/images/flags/tc.svg +0 -67
- package/dist/static/images/flags/td.svg +0 -7
- package/dist/static/images/flags/tf.svg +0 -15
- package/dist/static/images/flags/tg.svg +0 -14
- package/dist/static/images/flags/th.svg +0 -7
- package/dist/static/images/flags/tj.svg +0 -22
- package/dist/static/images/flags/tk.svg +0 -5
- package/dist/static/images/flags/tl.svg +0 -13
- package/dist/static/images/flags/tm.svg +0 -206
- package/dist/static/images/flags/tn.svg +0 -13
- package/dist/static/images/flags/to.svg +0 -10
- package/dist/static/images/flags/tr.svg +0 -8
- package/dist/static/images/flags/tt.svg +0 -5
- package/dist/static/images/flags/tv.svg +0 -27
- package/dist/static/images/flags/tw.svg +0 -14
- package/dist/static/images/flags/tz.svg +0 -13
- package/dist/static/images/flags/ua.svg +0 -6
- package/dist/static/images/flags/ug.svg +0 -30
- package/dist/static/images/flags/um.svg +0 -15
- package/dist/static/images/flags/un.svg +0 -16
- package/dist/static/images/flags/us.svg +0 -10
- package/dist/static/images/flags/uy.svg +0 -28
- package/dist/static/images/flags/uz.svg +0 -30
- package/dist/static/images/flags/va.svg +0 -479
- package/dist/static/images/flags/vc.svg +0 -8
- package/dist/static/images/flags/ve.svg +0 -26
- package/dist/static/images/flags/vg.svg +0 -127
- package/dist/static/images/flags/vi.svg +0 -28
- package/dist/static/images/flags/vn.svg +0 -11
- package/dist/static/images/flags/vu.svg +0 -18
- package/dist/static/images/flags/wf.svg +0 -7
- package/dist/static/images/flags/ws.svg +0 -7
- package/dist/static/images/flags/xk.svg +0 -16
- package/dist/static/images/flags/ye.svg +0 -7
- package/dist/static/images/flags/yi.svg +0 -12
- package/dist/static/images/flags/yt.svg +0 -7
- package/dist/static/images/flags/za.svg +0 -17
- package/dist/static/images/flags/zh-HK.svg +0 -30
- package/dist/static/images/flags/zh.svg +0 -11
- package/dist/static/images/flags/zm.svg +0 -27
- package/dist/static/images/flags/zw.svg +0 -21
- package/dist/static/images/flags.png +0 -0
- package/dist/static/images/home.jpg +0 -0
- package/dist/static/images/logo.svg +0 -1
- package/dist/static/images/showIf.png +0 -0
- package/dist/static/images/ui-architecture.png +0 -0
- package/dist/static/images/ui-render-inspect.png +0 -0
- package/dist/static/images/ui-render-version.png +0 -0
- package/static/images/diamonds-dimmed-flipped.png +0 -0
- package/static/images/diamonds-dimmed.png +0 -0
- package/static/images/diamonds.png +0 -0
- package/static/images/flags/ad.svg +0 -150
- package/static/images/flags/ae.svg +0 -6
- package/static/images/flags/af.svg +0 -81
- package/static/images/flags/ag.svg +0 -14
- package/static/images/flags/ai.svg +0 -767
- package/static/images/flags/al.svg +0 -5
- package/static/images/flags/am.svg +0 -5
- package/static/images/flags/ao.svg +0 -13
- package/static/images/flags/aq.svg +0 -6
- package/static/images/flags/ar.svg +0 -31
- package/static/images/flags/as.svg +0 -33
- package/static/images/flags/at.svg +0 -6
- package/static/images/flags/au.svg +0 -9
- package/static/images/flags/aw.svg +0 -186
- package/static/images/flags/ax.svg +0 -18
- package/static/images/flags/az.svg +0 -8
- package/static/images/flags/ba.svg +0 -12
- package/static/images/flags/bb.svg +0 -6
- package/static/images/flags/bd.svg +0 -4
- package/static/images/flags/be.svg +0 -7
- package/static/images/flags/bf.svg +0 -7
- package/static/images/flags/bg.svg +0 -7
- package/static/images/flags/bh.svg +0 -11
- package/static/images/flags/bi.svg +0 -15
- package/static/images/flags/bj.svg +0 -14
- package/static/images/flags/bl.svg +0 -7
- package/static/images/flags/bm.svg +0 -98
- package/static/images/flags/bn.svg +0 -36
- package/static/images/flags/bo.svg +0 -676
- package/static/images/flags/bq.svg +0 -5
- package/static/images/flags/br.svg +0 -45
- package/static/images/flags/bs.svg +0 -13
- package/static/images/flags/bt.svg +0 -89
- package/static/images/flags/bv.svg +0 -13
- package/static/images/flags/bw.svg +0 -7
- package/static/images/flags/by.svg +0 -20
- package/static/images/flags/bz.svg +0 -145
- package/static/images/flags/ca.svg +0 -4
- package/static/images/flags/cc.svg +0 -19
- package/static/images/flags/cd.svg +0 -5
- package/static/images/flags/cf.svg +0 -15
- package/static/images/flags/cg.svg +0 -12
- package/static/images/flags/ch.svg +0 -9
- package/static/images/flags/ci.svg +0 -7
- package/static/images/flags/ck.svg +0 -9
- package/static/images/flags/cl.svg +0 -13
- package/static/images/flags/cm.svg +0 -15
- package/static/images/flags/cn.svg +0 -11
- package/static/images/flags/co.svg +0 -7
- package/static/images/flags/cr.svg +0 -7
- package/static/images/flags/cu.svg +0 -13
- package/static/images/flags/cv.svg +0 -13
- package/static/images/flags/cw.svg +0 -14
- package/static/images/flags/cx.svg +0 -15
- package/static/images/flags/cy.svg +0 -6
- package/static/images/flags/cz.svg +0 -12
- package/static/images/flags/de.svg +0 -5
- package/static/images/flags/dj.svg +0 -13
- package/static/images/flags/dk.svg +0 -5
- package/static/images/flags/dm.svg +0 -152
- package/static/images/flags/do.svg +0 -6745
- package/static/images/flags/dz.svg +0 -5
- package/static/images/flags/ec.svg +0 -138
- package/static/images/flags/ee.svg +0 -7
- package/static/images/flags/eg.svg +0 -38
- package/static/images/flags/eh.svg +0 -15
- package/static/images/flags/el.svg +0 -22
- package/static/images/flags/en.svg +0 -15
- package/static/images/flags/er.svg +0 -8
- package/static/images/flags/es-ct.svg +0 -4
- package/static/images/flags/es.svg +0 -544
- package/static/images/flags/et.svg +0 -14
- package/static/images/flags/eu.svg +0 -28
- package/static/images/flags/fa.svg +0 -219
- package/static/images/flags/fi.svg +0 -5
- package/static/images/flags/fj.svg +0 -120
- package/static/images/flags/fk.svg +0 -89
- package/static/images/flags/fm.svg +0 -11
- package/static/images/flags/fo.svg +0 -12
- package/static/images/flags/fr.svg +0 -7
- package/static/images/flags/ga.svg +0 -7
- package/static/images/flags/gb-eng.svg +0 -5
- package/static/images/flags/gb-nir.svg +0 -131
- package/static/images/flags/gb-sct.svg +0 -4
- package/static/images/flags/gb-wls.svg +0 -9
- package/static/images/flags/gb.svg +0 -15
- package/static/images/flags/gd.svg +0 -27
- package/static/images/flags/ge.svg +0 -6
- package/static/images/flags/gf.svg +0 -5
- package/static/images/flags/gg.svg +0 -9
- package/static/images/flags/gh.svg +0 -6
- package/static/images/flags/gi.svg +0 -32
- package/static/images/flags/gl.svg +0 -4
- package/static/images/flags/gm.svg +0 -14
- package/static/images/flags/gn.svg +0 -7
- package/static/images/flags/gp.svg +0 -7
- package/static/images/flags/gq.svg +0 -23
- package/static/images/flags/gr.svg +0 -22
- package/static/images/flags/gs.svg +0 -201
- package/static/images/flags/gt.svg +0 -204
- package/static/images/flags/gu.svg +0 -39
- package/static/images/flags/gw.svg +0 -13
- package/static/images/flags/gy.svg +0 -9
- package/static/images/flags/he.svg +0 -14
- package/static/images/flags/hk.svg +0 -30
- package/static/images/flags/hm.svg +0 -9
- package/static/images/flags/hn.svg +0 -18
- package/static/images/flags/hr.svg +0 -58
- package/static/images/flags/ht.svg +0 -116
- package/static/images/flags/hu.svg +0 -7
- package/static/images/flags/id.svg +0 -6
- package/static/images/flags/ie.svg +0 -7
- package/static/images/flags/il.svg +0 -14
- package/static/images/flags/im.svg +0 -36
- package/static/images/flags/in.svg +0 -25
- package/static/images/flags/io.svg +0 -138
- package/static/images/flags/iq.svg +0 -10
- package/static/images/flags/ir.svg +0 -219
- package/static/images/flags/is.svg +0 -12
- package/static/images/flags/it.svg +0 -7
- package/static/images/flags/ja.svg +0 -11
- package/static/images/flags/je.svg +0 -29
- package/static/images/flags/jm.svg +0 -8
- package/static/images/flags/jo.svg +0 -16
- package/static/images/flags/jp.svg +0 -11
- package/static/images/flags/ke.svg +0 -23
- package/static/images/flags/kg.svg +0 -15
- package/static/images/flags/kh.svg +0 -61
- package/static/images/flags/ki.svg +0 -36
- package/static/images/flags/km.svg +0 -16
- package/static/images/flags/kn.svg +0 -14
- package/static/images/flags/ko.svg +0 -24
- package/static/images/flags/kp.svg +0 -15
- package/static/images/flags/kr.svg +0 -24
- package/static/images/flags/kw.svg +0 -13
- package/static/images/flags/ky.svg +0 -63
- package/static/images/flags/kz.svg +0 -23
- package/static/images/flags/la.svg +0 -12
- package/static/images/flags/lb.svg +0 -15
- package/static/images/flags/lc.svg +0 -8
- package/static/images/flags/li.svg +0 -43
- package/static/images/flags/lk.svg +0 -22
- package/static/images/flags/lr.svg +0 -14
- package/static/images/flags/ls.svg +0 -8
- package/static/images/flags/lt.svg +0 -7
- package/static/images/flags/lu.svg +0 -5
- package/static/images/flags/lv.svg +0 -6
- package/static/images/flags/ly.svg +0 -13
- package/static/images/flags/ma.svg +0 -4
- package/static/images/flags/mc.svg +0 -6
- package/static/images/flags/md.svg +0 -70
- package/static/images/flags/me.svg +0 -116
- package/static/images/flags/mf.svg +0 -7
- package/static/images/flags/mg.svg +0 -7
- package/static/images/flags/mh.svg +0 -7
- package/static/images/flags/mk.svg +0 -5
- package/static/images/flags/ml.svg +0 -7
- package/static/images/flags/mm.svg +0 -16
- package/static/images/flags/mn.svg +0 -13
- package/static/images/flags/mo.svg +0 -9
- package/static/images/flags/mp.svg +0 -86
- package/static/images/flags/mq.svg +0 -7
- package/static/images/flags/mr.svg +0 -6
- package/static/images/flags/ms.svg +0 -39
- package/static/images/flags/mt.svg +0 -49
- package/static/images/flags/mu.svg +0 -8
- package/static/images/flags/mv.svg +0 -6
- package/static/images/flags/mw.svg +0 -10
- package/static/images/flags/mx.svg +0 -382
- package/static/images/flags/my.svg +0 -15
- package/static/images/flags/mz.svg +0 -21
- package/static/images/flags/na.svg +0 -16
- package/static/images/flags/nc.svg +0 -7
- package/static/images/flags/ne.svg +0 -6
- package/static/images/flags/nf.svg +0 -9
- package/static/images/flags/ng.svg +0 -6
- package/static/images/flags/ni.svg +0 -129
- package/static/images/flags/nl.svg +0 -7
- package/static/images/flags/no.svg +0 -7
- package/static/images/flags/np.svg +0 -14
- package/static/images/flags/nr.svg +0 -12
- package/static/images/flags/nu.svg +0 -26
- package/static/images/flags/nz.svg +0 -41
- package/static/images/flags/om.svg +0 -115
- package/static/images/flags/pa.svg +0 -14
- package/static/images/flags/pe.svg +0 -244
- package/static/images/flags/pf.svg +0 -19
- package/static/images/flags/pg.svg +0 -9
- package/static/images/flags/ph.svg +0 -9
- package/static/images/flags/pk.svg +0 -15
- package/static/images/flags/pl.svg +0 -6
- package/static/images/flags/pm.svg +0 -7
- package/static/images/flags/pn.svg +0 -62
- package/static/images/flags/pr.svg +0 -13
- package/static/images/flags/ps.svg +0 -15
- package/static/images/flags/pt.svg +0 -57
- package/static/images/flags/pw.svg +0 -11
- package/static/images/flags/py.svg +0 -157
- package/static/images/flags/qa.svg +0 -4
- package/static/images/flags/re.svg +0 -7
- package/static/images/flags/ro.svg +0 -7
- package/static/images/flags/rs.svg +0 -292
- package/static/images/flags/ru.svg +0 -7
- package/static/images/flags/rw.svg +0 -13
- package/static/images/flags/sa.svg +0 -26
- package/static/images/flags/sb.svg +0 -13
- package/static/images/flags/sc.svg +0 -14
- package/static/images/flags/sd.svg +0 -13
- package/static/images/flags/se.svg +0 -16
- package/static/images/flags/sg.svg +0 -13
- package/static/images/flags/sh.svg +0 -74
- package/static/images/flags/si.svg +0 -18
- package/static/images/flags/sj.svg +0 -7
- package/static/images/flags/sk.svg +0 -9
- package/static/images/flags/sl.svg +0 -7
- package/static/images/flags/sm.svg +0 -91
- package/static/images/flags/sn.svg +0 -8
- package/static/images/flags/so.svg +0 -11
- package/static/images/flags/sr.svg +0 -6
- package/static/images/flags/ss.svg +0 -8
- package/static/images/flags/st.svg +0 -16
- package/static/images/flags/sv.svg +0 -601
- package/static/images/flags/sx.svg +0 -56
- package/static/images/flags/sy.svg +0 -6
- package/static/images/flags/sz.svg +0 -45
- package/static/images/flags/tc.svg +0 -67
- package/static/images/flags/td.svg +0 -7
- package/static/images/flags/tf.svg +0 -15
- package/static/images/flags/tg.svg +0 -14
- package/static/images/flags/th.svg +0 -7
- package/static/images/flags/tj.svg +0 -22
- package/static/images/flags/tk.svg +0 -5
- package/static/images/flags/tl.svg +0 -13
- package/static/images/flags/tm.svg +0 -206
- package/static/images/flags/tn.svg +0 -13
- package/static/images/flags/to.svg +0 -10
- package/static/images/flags/tr.svg +0 -8
- package/static/images/flags/tt.svg +0 -5
- package/static/images/flags/tv.svg +0 -27
- package/static/images/flags/tw.svg +0 -14
- package/static/images/flags/tz.svg +0 -13
- package/static/images/flags/ua.svg +0 -6
- package/static/images/flags/ug.svg +0 -30
- package/static/images/flags/um.svg +0 -15
- package/static/images/flags/un.svg +0 -16
- package/static/images/flags/us.svg +0 -10
- package/static/images/flags/uy.svg +0 -28
- package/static/images/flags/uz.svg +0 -30
- package/static/images/flags/va.svg +0 -479
- package/static/images/flags/vc.svg +0 -8
- package/static/images/flags/ve.svg +0 -26
- package/static/images/flags/vg.svg +0 -127
- package/static/images/flags/vi.svg +0 -28
- package/static/images/flags/vn.svg +0 -11
- package/static/images/flags/vu.svg +0 -18
- package/static/images/flags/wf.svg +0 -7
- package/static/images/flags/ws.svg +0 -7
- package/static/images/flags/xk.svg +0 -16
- package/static/images/flags/ye.svg +0 -7
- package/static/images/flags/yi.svg +0 -12
- package/static/images/flags/yt.svg +0 -7
- package/static/images/flags/za.svg +0 -17
- package/static/images/flags/zh-HK.svg +0 -30
- package/static/images/flags/zh.svg +0 -11
- package/static/images/flags/zm.svg +0 -27
- package/static/images/flags/zw.svg +0 -21
- package/static/images/flags.png +0 -0
- package/static/images/home.jpg +0 -0
- package/static/images/logo.svg +0 -1
- package/static/images/showIf.png +0 -0
- package/static/images/ui-architecture.png +0 -0
- package/static/images/ui-render-inspect.png +0 -0
- package/static/images/ui-render-version.png +0 -0
package/README.md
CHANGED
|
@@ -5,42 +5,400 @@ Check the [docs](https://eisgroup.github.io/ui-render/configuration) folder to g
|
|
|
5
5
|
|
|
6
6
|
https://eisgroup.github.io/ui-render/
|
|
7
7
|
|
|
8
|
+
## Supported `view` names
|
|
9
|
+
|
|
10
|
+
[`docs/SUPPORTED-VIEWS.md`](docs/SUPPORTED-VIEWS.md) lists every name a `meta.json` may use — the
|
|
11
|
+
`view` of a node, the value of a `render*` attribute, and the action names accepted by `onClick`,
|
|
12
|
+
`onChange` and `onDone` — and puts any view that is declared as a constant but that no resolver case
|
|
13
|
+
handles in a table of its own. The page is generated from the `FIELD` constants plus the resolver
|
|
14
|
+
source, so run `npm run docs:views` after adding or removing either; a contract test fails while the
|
|
15
|
+
page and the source disagree.
|
|
16
|
+
|
|
17
|
+
## Supported props on `Table`, `Tooltip` and `Select` / `Dropdown`
|
|
18
|
+
|
|
19
|
+
[`docs/SUPPORTED-PROPS.md`](docs/SUPPORTED-PROPS.md) documents the prop surface of the three views
|
|
20
|
+
the `semantic-ui-react` exit replaced, split by what actually happens to each prop: consumed by our
|
|
21
|
+
component, stripped before the DOM, or deliberately dropped. All three — `Table`, `Tooltip` and
|
|
22
|
+
`Select`/`Dropdown` — are in-house now, and no file in `src` references the package by any
|
|
23
|
+
mechanism, so the page reads as a record of what each component emits and what it no longer accepts
|
|
24
|
+
rather than as a parity checklist. It is generated from the component source and the call sites —
|
|
25
|
+
run `npm run docs:props` after changing one — and a contract test additionally checks it against the
|
|
26
|
+
example corpus.
|
|
27
|
+
|
|
8
28
|
## Installation (consumer)
|
|
9
29
|
|
|
10
30
|
`eis-ui-render` declares the following **peer dependencies**. The host application must install
|
|
11
|
-
them explicitly — they are not bundled.
|
|
12
|
-
|
|
31
|
+
them explicitly — they are not bundled. React must remain a single shared instance, while Moment
|
|
32
|
+
must be supplied by the host because the library build externalizes it. The bundle also imports
|
|
33
|
+
`react/jsx-runtime`, which every React in the range ships, from the host's React: a build that
|
|
34
|
+
aliases `react` to one copy must alias `react/jsx-runtime` the same way.
|
|
13
35
|
|
|
14
36
|
| Package | Required version | Why it must be a peer |
|
|
15
37
|
|---|---|---|
|
|
16
|
-
| `react` | `^16.14.0` | A second copy of React in the tree triggers `Invalid hook call` and breaks Context (forms, providers). pnpm with strict node_modules will not deduplicate copies across non-overlapping ranges. |
|
|
17
|
-
| `react-dom` | `^16.14.0` | Must
|
|
18
|
-
| `moment` |
|
|
38
|
+
| `react` | `^16.14.0 \|\| ^17.0.0 \|\| ^18.0.0 \|\| ^19.0.0` | A second copy of React in the tree triggers `Invalid hook call` and breaks Context (forms, providers). pnpm with strict node_modules will not deduplicate copies across non-overlapping ranges. |
|
|
39
|
+
| `react-dom` | `^16.14.0 \|\| ^17.0.0 \|\| ^18.0.0 \|\| ^19.0.0` | Must use the same major version as `react` so the renderer pair matches. |
|
|
40
|
+
| `moment` | `^2.29.4` | The library externalizes Moment and uses it for date pickers and formatters, so the host must provide a compatible 2.x version. |
|
|
19
41
|
|
|
20
42
|
Install (npm):
|
|
21
43
|
|
|
22
44
|
```bash
|
|
23
|
-
npm install eis-ui-render react@^
|
|
45
|
+
npm install eis-ui-render react@^18.0.0 react-dom@^18.0.0 moment@^2.29.4
|
|
24
46
|
```
|
|
25
47
|
|
|
26
48
|
Install (pnpm) — note that with `auto-install-peers=false` (the strict default in some setups)
|
|
27
49
|
peer dependencies are **not installed automatically**, so they must be listed explicitly:
|
|
28
50
|
|
|
29
51
|
```bash
|
|
30
|
-
pnpm add eis-ui-render react@^
|
|
52
|
+
pnpm add eis-ui-render react@^18.0.0 react-dom@^18.0.0 moment@^2.29.4
|
|
31
53
|
```
|
|
32
54
|
|
|
55
|
+
React 16.14, 17 and 19 hosts are supported as well, and may keep matching `react@^16.14.0`,
|
|
56
|
+
`react@^17.0.0` or `react@^19.0.0` dependencies. The library is developed against React 18.3, and the
|
|
57
|
+
whole test suite runs on 16.14, 17, 18 and 19 in CI.
|
|
58
|
+
|
|
33
59
|
If the host project relies on transitive copies of `react`/`react-dom`/`moment` from another
|
|
34
60
|
package instead of declaring them directly, pnpm in isolated mode will not resolve our peer
|
|
35
61
|
through them — the application must declare these three packages itself.
|
|
36
62
|
|
|
37
63
|
Other libraries previously listed as peer dependencies (`final-form`, `final-form-arrays`,
|
|
38
|
-
`react-final-form`, `react-final-form-arrays
|
|
39
|
-
dependencies of
|
|
64
|
+
`react-final-form`, `react-final-form-arrays`) are bundled into `dist/index.js`, and the package
|
|
65
|
+
declares no dependencies of its own, so the host project installs nothing beside the three peers.
|
|
66
|
+
`prop-types`, also listed once, is not used at all any more: the props are TypeScript types.
|
|
67
|
+
|
|
68
|
+
`eis-ui-render` is consumed by a bundler — imported as a React component into a host application. Dropping
|
|
69
|
+
`dist/index.js` into a page with a `<script>` tag is **not supported**: the UMD global lookup never matched
|
|
70
|
+
React's real global name, so it has never worked.
|
|
71
|
+
|
|
72
|
+
The bundle is built for current browsers: the last two versions of Chrome, Edge and Firefox, and the last
|
|
73
|
+
two major versions of Safari, on macOS and on iOS (`browserslist` in `package.json`). That is what the host
|
|
74
|
+
applications support, so an older browser is not a target.
|
|
75
|
+
|
|
76
|
+
## Styles and assets (consumer)
|
|
77
|
+
|
|
78
|
+
The library entry deliberately does not inject CSS, so the host loads the stylesheet itself. Both
|
|
79
|
+
paths below work and resolve to the same rules — `dist/static/all.css` and `font.css` are one-line
|
|
80
|
+
`@import` re-exports, so the bytes ship only once (`semantic.css` is an empty stub in both folders):
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
import 'eis-ui-render/static/all.css' // or 'eis-ui-render/dist/static/all.css'
|
|
84
|
+
import 'eis-ui-render/static/font.css' // icon font — only if the host does not provide its own
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Copy the package's `static/` folder into the web root as part of the build. It holds the
|
|
88
|
+
stylesheets and the icon font, and is self-contained:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
cp -R node_modules/eis-ui-render/static ./public/
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
An `Image` given only a `name` loads it from `/static/images/<name>`, relative to the host's web
|
|
95
|
+
root, with the name lower-cased and each whitespace character replaced by `-`. The package ships no
|
|
96
|
+
images, so those files are the host's own. Earlier releases also carried `static/images/flags/`, 266
|
|
97
|
+
country-flag SVGs that nothing in the library used; a host that links them now ships its own copy.
|
|
98
|
+
|
|
99
|
+
A host that serves `static/` under a sub-path or a CDN sets `path` (the images folder, ending in `/`,
|
|
100
|
+
which the name is appended to) or `src` on the `Image` in its meta; the library build fixes its
|
|
101
|
+
environment at build time, so no host environment variable reaches it. Releases 0.32.4 to 0.34.3
|
|
102
|
+
resolved a name-only `Image` to a page-relative `undefined/static/images/<name>` instead, which 404s.
|
|
103
|
+
|
|
104
|
+
## The meta.json contract (consumer)
|
|
105
|
+
|
|
106
|
+
The package ships the UI declaration contract as a JSON Schema (draft 2020-12) at
|
|
107
|
+
`eis-ui-render/meta.schema.json`, so `meta.json` authors get autocomplete and validation in
|
|
108
|
+
their editor instead of discovering a typo at render time.
|
|
109
|
+
|
|
110
|
+
The quickest way in is a pointer inside the file itself — no workspace configuration, and it
|
|
111
|
+
works in VS Code and the JetBrains IDEs alike:
|
|
112
|
+
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"$schema": "./node_modules/eis-ui-render/meta.schema.json",
|
|
116
|
+
"view": "Col",
|
|
117
|
+
"items": [{ "view": "Text", "name": "customer.name" }]
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Or map it once for every meta file, in `.vscode/settings.json`:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"json.schemas": [
|
|
126
|
+
{
|
|
127
|
+
"fileMatch": ["**/*_meta.json", "**/meta.json"],
|
|
128
|
+
"url": "./node_modules/eis-ui-render/meta.schema.json"
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
The schema is **permissive on purpose**. Component attributes are forwarded to the underlying
|
|
135
|
+
React component, so nodes accept properties the schema does not list, and `view`, render-method,
|
|
136
|
+
action and normalizer names suggest the built-in vocabulary without rejecting an unlisted string —
|
|
137
|
+
the renderer accepts those too. What the schema does constrain is the handful of shapes the engine
|
|
138
|
+
genuinely requires (`items`/`headers`/`extraItems`/`extraHeaders` must be arrays, `name` must be a
|
|
139
|
+
string), each of which is otherwise a render-time crash, plus the type of a few attributes the engine
|
|
140
|
+
reads, such as `relativeData` and `showIf`, and the format of `metaVersion`.
|
|
141
|
+
|
|
142
|
+
`$schema` is stripped before rendering, so adding it changes no output. So is a `_comment` attribute
|
|
143
|
+
on any node, a note for the next author; the schema does not declare it, so an editor will not
|
|
144
|
+
suggest it.
|
|
145
|
+
|
|
146
|
+
### Dev-mode validation
|
|
147
|
+
|
|
148
|
+
The same rules run at runtime behind an opt-in prop. It is off by default and walks nothing until
|
|
149
|
+
asked, so it costs a default host nothing:
|
|
150
|
+
|
|
151
|
+
```jsx
|
|
152
|
+
<UIRender data={data} meta={meta} validateMeta={process.env.NODE_ENV !== 'production'} />
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Each problem is reported to `console.warn` on one line, naming the JSON path of the offending
|
|
156
|
+
node rather than leaving a stack trace inside a minified bundle:
|
|
157
|
+
|
|
158
|
+
```text
|
|
159
|
+
[ui-render] meta error at "items[3].items[0].name": name must be a string key path, got number …
|
|
160
|
+
[ui-render] meta warning at "headers[2].renderCell": unknown render method "double5" …
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
`error` means the engine will fail on that node; `warning` means it will render, but silently
|
|
164
|
+
degraded — an unknown `view` becomes a "field does not exist" placeholder, an unknown
|
|
165
|
+
`render*` method falls back to plain text, and a prop the select, table or tooltip no longer reads
|
|
166
|
+
(`DROPPED_PROP`, see `docs/SUPPORTED-PROPS.md`) is ignored. Upgrading from 0.34, turn it on once
|
|
167
|
+
to find those. Pass a function instead of `true` to collect the
|
|
168
|
+
problems yourself (`validateMeta={problems => …}`), and keep it a stable reference: the check runs
|
|
169
|
+
again whenever `meta` or this prop changes identity. The reporter never throws into the host
|
|
170
|
+
application, whatever it finds.
|
|
171
|
+
|
|
172
|
+
### Contract version
|
|
173
|
+
|
|
174
|
+
`meta.json` may declare an optional root-level `metaVersion` (`"MAJOR"` or `"MAJOR.MINOR"`) to
|
|
175
|
+
record which contract it was authored against. The current contract version is **`2`**.
|
|
176
|
+
|
|
177
|
+
Version `2` changed one thing: a table header without a `label` shows no text, where `1` showed its
|
|
178
|
+
`id`. The `id` stays as hidden text, which names the column for screen readers. A header that should
|
|
179
|
+
show text needs a `label`.
|
|
180
|
+
|
|
181
|
+
- **Absence means "current"** — the file targets whatever contract the installed
|
|
182
|
+
`eis-ui-render` implements. That is the right choice when meta and library ship together, and
|
|
183
|
+
it is why no existing `meta.json` has to declare one.
|
|
184
|
+
- **MAJOR** changes only for a change that would break existing meta; **MINOR** for additive
|
|
185
|
+
ones. Declaring a version equal to or below what the library implements is always compatible.
|
|
186
|
+
- The engine **ignores the value** and strips the field before rendering: declaring it never
|
|
187
|
+
changes output. Dev-mode validation is the only thing that reads it, and only to report a
|
|
188
|
+
malformed value, a major version newer than the installed library implements, or a `metaVersion`
|
|
189
|
+
placed on a nested node, where it means nothing.
|
|
190
|
+
|
|
191
|
+
There is no negotiation beyond that, deliberately: the field exists so a future contract change
|
|
192
|
+
can be additive and announced, not so hosts can request a different renderer.
|
|
193
|
+
|
|
194
|
+
Note the unrelated legacy `version` attribute seen in older meta files: it is not a contract
|
|
195
|
+
version (existing files use it both as a producer version at the root and as a node label deeper
|
|
196
|
+
in the tree), the engine discards it, and new files should use `metaVersion`.
|
|
197
|
+
|
|
198
|
+
## Security model (consumer)
|
|
199
|
+
|
|
200
|
+
**A meta is code, not content.** Load only metas you would trust as much as your own code: the
|
|
201
|
+
renderer does what a meta tells it to.
|
|
202
|
+
|
|
203
|
+
- **It sets attributes on the elements it renders, raw HTML included.** A `Text` node with
|
|
204
|
+
`dangerouslySetInnerHTML: {__html: "…"}` renders that HTML. The renderer checks no URL scheme
|
|
205
|
+
in an attribute a meta gives.
|
|
206
|
+
- **It calls functions.** A meta calls the actions the renderer has built in, the `methods` you
|
|
207
|
+
pass and the `apiCalls` you hand it, whenever it declares. One built-in action is `fetch`:
|
|
208
|
+
`{name: "fetch", mapArgs: ["https://…", options]}` calls the page's `fetch` with that URL and
|
|
209
|
+
those options.
|
|
210
|
+
- **Data is text, unless a meta makes it an attribute.** A value from `data` renders as text,
|
|
211
|
+
which React escapes. A meta that binds one to an attribute with `{name: "path"}` sets the value
|
|
212
|
+
there as it is.
|
|
213
|
+
- **Upload checks run in the browser only.** `formats` and `maxSize` decide what the drop zone
|
|
214
|
+
accepts, and your `uploadFile` receives the files as the user chose them. Check their type and
|
|
215
|
+
size again on your server.
|
|
216
|
+
- **Downloads come from your `downloadFile`.** The renderer requests no URL for one: it saves what
|
|
217
|
+
your function answers through a temporary `<a download>`.
|
|
218
|
+
|
|
219
|
+
To report a vulnerability, see [SECURITY.md](SECURITY.md).
|
|
220
|
+
|
|
221
|
+
## Renderer configuration (consumer)
|
|
222
|
+
|
|
223
|
+
Four props configure how values are formatted and how the shell is labelled. They are
|
|
224
|
+
published to every component the renderer draws, so a nested `Table` cell honours them
|
|
225
|
+
exactly like a top-level field:
|
|
226
|
+
|
|
227
|
+
```jsx
|
|
228
|
+
<UIRender data={data} meta={meta} dateFormat="DD/MM/YYYY" currency="EUR" language="fr" locale="fr-FR" />
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
| Prop | Default | Effect |
|
|
232
|
+
|---|---|---|
|
|
233
|
+
| `dateFormat` | `MM-DD-YYYY` | [`moment` format tokens](https://momentjs.com/docs/#/displaying/format/) for every date the renderer **displays** (an ISO value in a `Text` node, a `render*: "Date"` value) and **edits** (the date picker's display and parsing) |
|
|
234
|
+
| `currency` | `USD` | published as a CSS class on the renderer's shell (`.app.EUR`), for currency-specific styling |
|
|
235
|
+
| `language` | `en` | published as a CSS class on the renderer's shell (`.app.lang--fr`). Where `locale` names no moment locale you loaded, it names the one a date field's month and day names are in. A change renders again every text the document translated, in the new language (see [Switching language](#switching-language-while-a-document-is-on-the-page)) |
|
|
236
|
+
| `locale` | none: the browser's | the [language tag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument) numbers are **displayed** in: their decimal and grouping separators. A Java-style `de_DE` is read as `de-DE`. It also names the moment locale a date field's month and day names are in (see [Translating the built-in texts](#translating-the-built-in-texts-consumer)) |
|
|
237
|
+
|
|
238
|
+
Each is merged, not replaced: passing only `dateFormat` leaves the others at their defaults.
|
|
239
|
+
`currency` is **not** `meta.currencyCode` — that one selects the currency symbol
|
|
240
|
+
the `Currency` value renderer prints, in either form (`"Currency"` or `{"name": "Currency"}`), and is
|
|
241
|
+
declared in meta rather than passed as a prop.
|
|
242
|
+
|
|
243
|
+
`locale` is where a host passes its user's number format. With `locale="de-DE"`:
|
|
244
|
+
|
|
245
|
+
- the `Currency`, `Float`, `Double5` and `Percent` renderers, a `Counter`, a pie chart's values and a
|
|
246
|
+
slider's labels write `1.234,5`;
|
|
247
|
+
- a number shown as it is, by a `Text` node or in short form (a pie chart's total, an upload's size limit),
|
|
248
|
+
takes the decimal separator only: `1234,5`, `1,2k`.
|
|
249
|
+
|
|
250
|
+
Number **inputs** take and show a point either way. Without `locale`, or with a value that is no language
|
|
251
|
+
tag, numbers show as they did before the prop existed: the renderers in the browser's locale, every other
|
|
252
|
+
number with a point.
|
|
253
|
+
|
|
254
|
+
> These props used to be accepted and then silently ignored — every date rendered as
|
|
255
|
+
> `MM-DD-YYYY` whatever was passed. If your application has been passing `dateFormat` and
|
|
256
|
+
> compensating for it elsewhere, it now takes effect.
|
|
257
|
+
|
|
258
|
+
## Translating the built-in texts (consumer)
|
|
259
|
+
|
|
260
|
+
Your `translate` prop is handed the labels, titles and options of a meta, and the values a document
|
|
261
|
+
shows as text. Some texts are UI Render's own: a select's `Select`, a popup's `Ok`, the validation
|
|
262
|
+
messages, the upload's and the table's texts, a date field's calendar, the names screen readers give
|
|
263
|
+
the controls, and the `Total` under a pie chart's total. `translate` is asked for each of them under a
|
|
264
|
+
key of its own, `ui-render:<ID>`, so an i18next-based host translates them by registering a
|
|
265
|
+
`ui-render` namespace:
|
|
266
|
+
|
|
267
|
+
```js
|
|
268
|
+
i18next.addResourceBundle('de', 'ui-render', {
|
|
269
|
+
OK: 'OK',
|
|
270
|
+
REQUIRED: 'Pflichtfeld',
|
|
271
|
+
MUST_BE_MINIMUM: 'Mindestens {min}',
|
|
272
|
+
SELECT: 'Bitte wählen',
|
|
273
|
+
TOTAL: 'Gesamt',
|
|
274
|
+
})
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
[`docs/BUILT-IN-PHRASES.md`](docs/BUILT-IN-PHRASES.md) lists every id with its English text and
|
|
278
|
+
where it shows, and the package's types list the ids as `UIRender.UIRenderPhraseId`.
|
|
279
|
+
|
|
280
|
+
When a key is missing, UI Render shows its English text. It takes what `translate` answers as a
|
|
281
|
+
translation only when that is a non-empty string other than the key itself (`ui-render:TOTAL`, which
|
|
282
|
+
an i18next-based host answers for a key it does not have) or the key without its namespace (`TOTAL`,
|
|
283
|
+
which plain i18next answers). So a host with no `ui-render` namespace, or with no `translate`, sees
|
|
284
|
+
these texts in English. Each key is asked for once, and what comes back is shown as it is: neither
|
|
285
|
+
the English text nor your translation goes to `translate` again.
|
|
286
|
+
|
|
287
|
+
A text may have a placeholder, written `{name}`. UI Render fills it after your translation comes
|
|
288
|
+
back, so keep it in single braces in your translation, or leave it out. A few fill it with an element
|
|
289
|
+
of their own, such as the file name in bold in `FILE_MUST_BE_UNDER`: your translation decides where it
|
|
290
|
+
goes.
|
|
291
|
+
|
|
292
|
+
The validation messages reach `getValidationErrors` as the field shows them, in your language. A
|
|
293
|
+
required field is the exception: it is reported as `<Field Name> is Required`, with the name taken from
|
|
294
|
+
the field's `name`, as before.
|
|
295
|
+
|
|
296
|
+
A date field's calendar asks for its texts the same way: `TODAY`, and the names a screen reader gives
|
|
297
|
+
its buttons, such as `PREVIOUS_MONTH` and `CHOOSE_A_YEAR`. Its month and day names come from moment
|
|
298
|
+
instead, and so do the month names of a date whose `dateFormat` names the month (`DD MMMM YYYY`). They
|
|
299
|
+
are in the moment locale your `locale` prop names, `de` for `de-DE`, or else the one your `language`
|
|
300
|
+
names, and the calendar's weeks start as that locale starts them. What a user types is read in that
|
|
301
|
+
locale too: a German field takes `15 März 2024`, not `15 Mar 2024`. moment is your dependency, and its
|
|
302
|
+
locale data is yours to load before the document renders:
|
|
303
|
+
|
|
304
|
+
```js
|
|
305
|
+
import 'moment/locale/de'
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Without it, the names stay English. moment's global locale plays no part, so documents in two
|
|
309
|
+
languages can share a page; a `Text` that shows a date still follows it. Loading a moment locale makes
|
|
310
|
+
it moment's global locale too, so call `moment.locale()` afterwards if your page needs another.
|
|
311
|
+
|
|
312
|
+
### Switching language while a document is on the page
|
|
313
|
+
|
|
314
|
+
Pass your current language as `language`. When your `translate` stays the same function as the
|
|
315
|
+
language changes, as i18next's own `t` does, `language` is what tells the document:
|
|
316
|
+
|
|
317
|
+
```jsx
|
|
318
|
+
// `t` is one function for the life of the page, and answers in the language your i18n is in now.
|
|
319
|
+
<UIRender meta={meta} data={data} translate={t} language={currentLanguage} />
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
When `language` changes, the document renders again every text it translated, in the language
|
|
323
|
+
`translate` answers in now: the labels, titles, placeholders and options of the meta, the table
|
|
324
|
+
headers, the values it shows as text, a popup's title and content, and the built-in texts, the
|
|
325
|
+
validation messages under the fields and a date field's calendar included. A date field's month and
|
|
326
|
+
day names follow `language` too, where it is what names their moment locale. Nothing is mounted
|
|
327
|
+
again: what the user typed, the fields they left and the errors they see stay as they are.
|
|
328
|
+
`getValidationErrors` is handed the errors again when they read differently in the new language.
|
|
329
|
+
|
|
330
|
+
A new `translate` does the same, so a host whose `translate` is a new function for each language,
|
|
331
|
+
such as one from i18next's `getFixedT`, need not pass `language`. Keep `translate` the same function
|
|
332
|
+
between renders otherwise: every new one renders every text of the document again. Wrap one you
|
|
333
|
+
write inline in `useCallback`.
|
|
334
|
+
|
|
335
|
+
## Error reporting (consumer)
|
|
336
|
+
|
|
337
|
+
The renderer catches a failure per node rather than letting one bad declaration blank the
|
|
338
|
+
page: the failing node is replaced by a one-line diagnostic and everything around it keeps
|
|
339
|
+
rendering. Pass `onError` to receive the same diagnostic as a structured report:
|
|
340
|
+
|
|
341
|
+
```jsx
|
|
342
|
+
<UIRender data={data} meta={meta} onError={report => Sentry.captureException(report.error, {
|
|
343
|
+
extra: { metaPath: report.path, componentStack: report.errorInfo.componentStack },
|
|
344
|
+
})} />
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
```js
|
|
348
|
+
{
|
|
349
|
+
error, // the thrown value
|
|
350
|
+
errorInfo, // React's {componentStack}
|
|
351
|
+
path, // JSON path of the node in `meta`, e.g. 'items[3].items[0]' ('' = the root)
|
|
352
|
+
props, // that node's resolved props: its meta declaration plus what the engine added
|
|
353
|
+
message, // the one-line diagnostic, also rendered in place of the failed node
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
`path` is the point of the report — a stack trace out of a minified bundle names React
|
|
358
|
+
internals, while `items[3].items[0]` names the declaration to go and fix. It is exact for a
|
|
359
|
+
failure inside the component a node resolved to; for a failure the renderer hits while
|
|
360
|
+
preparing a node (a malformed `items`, say) it names the closest enclosing node, which is
|
|
361
|
+
the most precise position available.
|
|
362
|
+
|
|
363
|
+
The library logs the report itself as well, so `onError` adds a channel rather than
|
|
364
|
+
silencing the console. It never has to be defensive: a reporter that throws is caught, and
|
|
365
|
+
the render failure is still reported.
|
|
366
|
+
|
|
367
|
+
## Several documents on one page (consumer)
|
|
368
|
+
|
|
369
|
+
Each `UIRender` on a page keeps what it owns to itself:
|
|
370
|
+
|
|
371
|
+
- its form data, and the validation errors `getValidationErrors` reports, which reach the
|
|
372
|
+
document that owns the field;
|
|
373
|
+
- its popup, which opens in its own shell, under its own `language` and `currency` classes;
|
|
374
|
+
- its `translate`, when it was given one: what it translates, it translates with that function
|
|
375
|
+
and never with another document's, its popup's title, message and Ok included.
|
|
376
|
+
|
|
377
|
+
Two things are shared with the rest of the page:
|
|
378
|
+
|
|
379
|
+
- **A document without `translate` uses another's.** It translates with the function of the
|
|
380
|
+
last document constructed with one, as every document did in 0.34, or shows its text as
|
|
381
|
+
given when no document has one. Give each document its own `translate` when they differ.
|
|
382
|
+
- **An id a field derives is unique on the page, not only in its document.** A field with no
|
|
383
|
+
`id` in meta takes its `name` for one, or one made from its `label`. When another element on
|
|
384
|
+
the page already has that id, from another document or from a name the same document repeats
|
|
385
|
+
(the nested rows of a `dataKind`), the field takes `<id>-2`, `<id>-3` and so on, and its label
|
|
386
|
+
and help text follow it. The field that had the id first keeps it, so a page with one
|
|
387
|
+
document that repeats no name renders the ids it always did. An `id` given in meta is kept
|
|
388
|
+
as given: give one wherever the host needs a fixed id. Each document's popup root follows
|
|
389
|
+
the same rule: `render-popup-root`, then `render-popup-root-2`.
|
|
40
390
|
|
|
41
391
|
## Development Installation
|
|
42
392
|
|
|
43
|
-
|
|
393
|
+
The published package declares `engines.node >= 22`: that is the floor for *consuming* it. Node 22 is the oldest
|
|
394
|
+
line still supported upstream, and CI server-renders the packed package on it. On an older Node, npm warns at
|
|
395
|
+
install, and refuses to install where `engine-strict` is set. Building this repository is a different matter and
|
|
396
|
+
uses the version in `.nvmrc`, which is what CI installs: Babel 8, which compiles it, needs Node 24.11 or later.
|
|
397
|
+
|
|
398
|
+
1. Install [Node.js](https://nodejs.org/), if you haven't already — use the version in `.nvmrc` (v24).
|
|
399
|
+
Node 24.14.0 comes with npm 11.9.0, the version `package.json` pins in `packageManager`. npm itself
|
|
400
|
+
ignores that field. Corepack reads it once it is enabled for npm (`corepack enable npm`), and then
|
|
401
|
+
runs exactly that version. CI does not enable corepack: it runs the npm that comes with its Node 24.
|
|
44
402
|
2. Navigate to project root folder and install dependencies by running this command in terminal:
|
|
45
403
|
|
|
46
404
|
### `npm install`
|
|
@@ -51,11 +409,29 @@ In the project directory, you can run:
|
|
|
51
409
|
|
|
52
410
|
### `npm run start`
|
|
53
411
|
|
|
54
|
-
Runs the
|
|
55
|
-
Open [http://localhost:3001](http://localhost:3001) to view it in Chrome browser, then activate LiveReload extension.
|
|
412
|
+
Runs the demo in development mode on [http://localhost:3001](http://localhost:3001).
|
|
56
413
|
|
|
57
|
-
|
|
58
|
-
|
|
414
|
+
Edits apply in place through React Fast Refresh, without a reload. Compile errors show in the
|
|
415
|
+
terminal and over the page; lint does not run here, so run `npm run lint:js` for it.
|
|
416
|
+
|
|
417
|
+
### `npm run test:e2e`
|
|
418
|
+
|
|
419
|
+
Runs the browser leg of the contract suite (Playwright, Chromium) over a production build of the
|
|
420
|
+
demo. It records what the tooltip actually does in a real browser — where the bubble lands relative
|
|
421
|
+
to its trigger, whether it flips at a viewport edge, whether it is clipped, whether our CSS paints
|
|
422
|
+
it — which is the class of fact the jsdom suites cannot express at all. It also drives the keyboard
|
|
423
|
+
through the tooltip, the dropdown, the tabs, an Expand title and the upload drop zone, and the views
|
|
424
|
+
a user acts on: the date input's calendar, the popup, the slider, a toggle, a checkbox, the dropdown
|
|
425
|
+
by pointer, table sorting and pages, and progress steps. `e2e/view-coverage.js` names, for each
|
|
426
|
+
`view`, the tests that drive it or why none needs to, and a contract test keeps that map complete.
|
|
427
|
+
|
|
428
|
+
Run `npm run test:e2e:install` once per machine first: it downloads Chromium into the Playwright
|
|
429
|
+
cache (~570 MB on disk). That download is deliberately **not** wired into `npm install`, so a plain
|
|
430
|
+
`npm ci` costs nothing extra for anyone who never runs this leg.
|
|
431
|
+
|
|
432
|
+
Specs live in `e2e/`; every expected value is in `e2e/reference.js`, tagged as a reference (current
|
|
433
|
+
behaviour, expected to change), an invariant (must not change), or a pinned defect. Read that file
|
|
434
|
+
before changing an assertion.
|
|
59
435
|
|
|
60
436
|
### Live build mode
|
|
61
437
|
|
|
@@ -65,11 +441,28 @@ You will also see any lint errors in the console.
|
|
|
65
441
|
|
|
66
442
|
### How to publish the library
|
|
67
443
|
|
|
68
|
-
-
|
|
69
|
-
|
|
70
|
-
-
|
|
444
|
+
- Bump the package version with `npm version patch` (or `minor`, `major`, or an explicit version).
|
|
445
|
+
This also synchronizes every tracked `data-version` attribute.
|
|
446
|
+
- Inspect the package contents with `npm pack --dry-run`.
|
|
447
|
+
The `prepack` lifecycle verifies version synchronization, checks that the generated
|
|
448
|
+
`docs/SUPPORTED-VIEWS.md` and `docs/SUPPORTED-PROPS.md` are current, and builds the library
|
|
449
|
+
automatically.
|
|
450
|
+
- The build writes what the bundle carries from other packages into `dist/`: the licence file of
|
|
451
|
+
each one in `THIRD-PARTY-LICENSES.txt`, and a CycloneDX SBOM in `sbom.cdx.json`. A bundled package
|
|
452
|
+
with no licence file fails the build.
|
|
453
|
+
- Verify the artifact with `npm run test:pack`. It enforces the packaging budgets and then packs,
|
|
454
|
+
extracts and server-renders the tarball in a throwaway consumer that has only the three peer
|
|
455
|
+
dependencies available. CI runs both gates on every pull request. After a build,
|
|
456
|
+
`npm run test:pack:peers` repeats that server render against React 16.14, 17 and 19, and CI runs
|
|
457
|
+
it too.
|
|
458
|
+
- Login to npm with `npm login` if needed.
|
|
459
|
+
- Publish the verified version with `npm publish`. The same `prepack` checks and build run again
|
|
460
|
+
immediately before npm creates the published package.
|
|
461
|
+
|
|
462
|
+
Do not edit the version in `package.json` manually: use `npm version` so source metadata, the
|
|
463
|
+
release commit, and the Git tag stay in sync.
|
|
71
464
|
|
|
72
465
|
### How to publish on GitHub Pages
|
|
73
466
|
|
|
74
467
|
- Run `npm run build` to prepare artifacts
|
|
75
|
-
- Run `npm run deploy` to upload artifacts to GitHub
|
|
468
|
+
- Run `npm run deploy` to upload artifacts to GitHub
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Third-party notices
|
|
2
|
+
|
|
3
|
+
`eis-ui-render` is licensed under Apache-2.0 (see `LICENSE`). It also distributes CSS derived from
|
|
4
|
+
the third-party works below, in `static/all.css` and in the sources under `src/style/`.
|
|
5
|
+
|
|
6
|
+
The JavaScript bundle, `dist/index.js`, carries third-party packages as well. Their licence files are
|
|
7
|
+
not transcribed here: the build writes them into `dist/THIRD-PARTY-LICENSES.txt`, from the packages
|
|
8
|
+
webpack actually bundles. It also lists every third-party component, the CSS below included, in the
|
|
9
|
+
CycloneDX SBOM `dist/sbom.cdx.json` (`scripts/third-party-inventory.js`).
|
|
10
|
+
|
|
11
|
+
This file exists because §9.7-F1 step 4 copies compiled `semantic-ui-less` CSS into this repository
|
|
12
|
+
rather than importing it from `node_modules`. While the CSS was imported, each module carried its
|
|
13
|
+
own `/*!` banner into the build and the banners survived minification. Once the CSS is vendored,
|
|
14
|
+
nothing keeps those banners current automatically, so the notices are recorded here — and here
|
|
15
|
+
rather than in `static/all.css`, which is a build artifact and is gitignored.
|
|
16
|
+
|
|
17
|
+
`float-label-css` is not vendored but adapted: `src/style/components/input.less` rewrites its float-label
|
|
18
|
+
technique in our own LESS, so its notice is recorded here as well.
|
|
19
|
+
|
|
20
|
+
**The icon font is not listed, and why.** `iconsOpenL` (`src/style/fonts/icons/`, shipped in
|
|
21
|
+
`static/fonts/icons/`) was generated with the IcoMoon app from a single icon set of this project's own:
|
|
22
|
+
`selection.json` holds its 85 glyphs, named for this project (`logo`, `logo-brand`, `dropdown-chevron`…).
|
|
23
|
+
The set was exported without IcoMoon's metadata (`includeMetadata: false`), so it records no icon
|
|
24
|
+
library and no licence for any glyph, and the font itself says only "Generated by IcoMoon". If a glyph
|
|
25
|
+
turns out to come from an icon library, its licence belongs in this file.
|
|
26
|
+
|
|
27
|
+
The licence texts below are transcribed verbatim from the upstream repositories, fetched rather
|
|
28
|
+
than recalled.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Semantic UI (`semantic-ui-less` 2.5.0) — MIT
|
|
33
|
+
|
|
34
|
+
Derived CSS: the compiled output of `definitions/globals/reset` and `definitions/modules/dropdown`.
|
|
35
|
+
|
|
36
|
+
**On the copyright holder, stated plainly because the upstream record is incomplete.** The
|
|
37
|
+
`semantic-ui-less` package ships no licence file at all; its `package.json` declares
|
|
38
|
+
`"license": "MIT"` and `"author": "Jack Lukic <jack@semantic-ui.com>"`. The licence text below is
|
|
39
|
+
taken from the Semantic-Org/Semantic-UI repository, which is the source these LESS definitions are
|
|
40
|
+
published from — and that file **contains no `Copyright (c)` line of its own**, only the permission
|
|
41
|
+
text. It is reproduced here exactly as upstream publishes it, with the author recorded from the
|
|
42
|
+
package manifest rather than invented.
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
# The MIT License
|
|
46
|
+
|
|
47
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
48
|
+
|
|
49
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
50
|
+
|
|
51
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Author, per the `package.json` of `semantic-ui-less` 2.5.0, which is no longer installed here: Jack Lukic <jack@semantic-ui.com>.
|
|
55
|
+
Source: https://github.com/Semantic-Org/Semantic-UI-LESS — licence text from
|
|
56
|
+
https://github.com/Semantic-Org/Semantic-UI/blob/master/LICENSE
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## normalize.css v7.0.0 — MIT
|
|
61
|
+
|
|
62
|
+
Derived CSS: `definitions/globals/reset` in `semantic-ui-less` is largely normalize.css, and its
|
|
63
|
+
own one-line banner (`normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css`)
|
|
64
|
+
travels into our compiled output.
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
# The MIT License (MIT)
|
|
68
|
+
|
|
69
|
+
Copyright © Nicolas Gallagher and Jonathan Neal
|
|
70
|
+
|
|
71
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
72
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
73
|
+
the Software without restriction, including without limitation the rights to
|
|
74
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
75
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
76
|
+
so, subject to the following conditions:
|
|
77
|
+
|
|
78
|
+
The above copyright notice and this permission notice shall be included in all
|
|
79
|
+
copies or substantial portions of the Software.
|
|
80
|
+
|
|
81
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
82
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
83
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
84
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
85
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
86
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
87
|
+
SOFTWARE.
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Source: https://github.com/necolas/normalize.css
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## float-label-css 1.0.2 — MIT
|
|
95
|
+
|
|
96
|
+
Derived CSS: the float-label rules of `src/style/components/input.less` (`.input--wrapper.float`). They
|
|
97
|
+
adapt the technique of its `scss/float-label.scss` to LESS: the label sits over the field while its
|
|
98
|
+
placeholder is shown and the field is not focused (`:placeholder-shown:not(:focus) ~ label`), and floats
|
|
99
|
+
above it otherwise.
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
MIT License
|
|
103
|
+
|
|
104
|
+
Copyright (c) 2016 Anton Staroverov
|
|
105
|
+
|
|
106
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
107
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
108
|
+
in the Software without restriction, including without limitation the rights
|
|
109
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
110
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
111
|
+
furnished to do so, subject to the following conditions:
|
|
112
|
+
|
|
113
|
+
The above copyright notice and this permission notice shall be included in all
|
|
114
|
+
copies or substantial portions of the Software.
|
|
115
|
+
|
|
116
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
117
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
118
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
119
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
120
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
121
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
122
|
+
SOFTWARE.
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
Source: https://github.com/anyblades/float-label-css, published as `tonystar/float-label-css` until the
|
|
126
|
+
repository moved; licence text from its `LICENSE`, version from npm (`float-label-css@1.0.2`, the last
|
|
127
|
+
release, from 2017).
|