eis-ui-render 0.34.3 → 0.35.1

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.
Files changed (576) hide show
  1. package/README.md +411 -18
  2. package/THIRD-PARTY-NOTICES.md +127 -0
  3. package/dist/THIRD-PARTY-LICENSES.txt +429 -0
  4. package/dist/contract.d.ts +299 -0
  5. package/dist/index.d.ts +42 -5
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.LICENSE.txt +0 -15
  8. package/dist/index.js.map +1 -1
  9. package/dist/sbom.cdx.json +338 -0
  10. package/dist/static/all.css +2 -39
  11. package/dist/static/font.css +2 -8
  12. package/docs/BUILT-IN-PHRASES.md +79 -0
  13. package/docs/SUPPORTED-PROPS.md +422 -0
  14. package/docs/SUPPORTED-VIEWS.md +140 -0
  15. package/meta.schema.json +494 -0
  16. package/package.json +113 -73
  17. package/static/all.css +4 -22
  18. package/static/all.css.map +1 -1
  19. package/dist/UIRender.d.ts +0 -43
  20. package/dist/static/all.css.map +0 -1
  21. package/dist/static/fonts/icons/fonts/iconsOpenL.eot +0 -0
  22. package/dist/static/fonts/icons/fonts/iconsOpenL.svg +0 -95
  23. package/dist/static/fonts/icons/fonts/iconsOpenL.ttf +0 -0
  24. package/dist/static/fonts/icons/fonts/iconsOpenL.woff +0 -0
  25. package/dist/static/images/diamonds-dimmed-flipped.png +0 -0
  26. package/dist/static/images/diamonds-dimmed.png +0 -0
  27. package/dist/static/images/diamonds.png +0 -0
  28. package/dist/static/images/flags/ad.svg +0 -150
  29. package/dist/static/images/flags/ae.svg +0 -6
  30. package/dist/static/images/flags/af.svg +0 -81
  31. package/dist/static/images/flags/ag.svg +0 -14
  32. package/dist/static/images/flags/ai.svg +0 -767
  33. package/dist/static/images/flags/al.svg +0 -5
  34. package/dist/static/images/flags/am.svg +0 -5
  35. package/dist/static/images/flags/ao.svg +0 -13
  36. package/dist/static/images/flags/aq.svg +0 -6
  37. package/dist/static/images/flags/ar.svg +0 -31
  38. package/dist/static/images/flags/as.svg +0 -33
  39. package/dist/static/images/flags/at.svg +0 -6
  40. package/dist/static/images/flags/au.svg +0 -9
  41. package/dist/static/images/flags/aw.svg +0 -186
  42. package/dist/static/images/flags/ax.svg +0 -18
  43. package/dist/static/images/flags/az.svg +0 -8
  44. package/dist/static/images/flags/ba.svg +0 -12
  45. package/dist/static/images/flags/bb.svg +0 -6
  46. package/dist/static/images/flags/bd.svg +0 -4
  47. package/dist/static/images/flags/be.svg +0 -7
  48. package/dist/static/images/flags/bf.svg +0 -7
  49. package/dist/static/images/flags/bg.svg +0 -7
  50. package/dist/static/images/flags/bh.svg +0 -11
  51. package/dist/static/images/flags/bi.svg +0 -15
  52. package/dist/static/images/flags/bj.svg +0 -14
  53. package/dist/static/images/flags/bl.svg +0 -7
  54. package/dist/static/images/flags/bm.svg +0 -98
  55. package/dist/static/images/flags/bn.svg +0 -36
  56. package/dist/static/images/flags/bo.svg +0 -676
  57. package/dist/static/images/flags/bq.svg +0 -5
  58. package/dist/static/images/flags/br.svg +0 -45
  59. package/dist/static/images/flags/bs.svg +0 -13
  60. package/dist/static/images/flags/bt.svg +0 -89
  61. package/dist/static/images/flags/bv.svg +0 -13
  62. package/dist/static/images/flags/bw.svg +0 -7
  63. package/dist/static/images/flags/by.svg +0 -20
  64. package/dist/static/images/flags/bz.svg +0 -145
  65. package/dist/static/images/flags/ca.svg +0 -4
  66. package/dist/static/images/flags/cc.svg +0 -19
  67. package/dist/static/images/flags/cd.svg +0 -5
  68. package/dist/static/images/flags/cf.svg +0 -15
  69. package/dist/static/images/flags/cg.svg +0 -12
  70. package/dist/static/images/flags/ch.svg +0 -9
  71. package/dist/static/images/flags/ci.svg +0 -7
  72. package/dist/static/images/flags/ck.svg +0 -9
  73. package/dist/static/images/flags/cl.svg +0 -13
  74. package/dist/static/images/flags/cm.svg +0 -15
  75. package/dist/static/images/flags/cn.svg +0 -11
  76. package/dist/static/images/flags/co.svg +0 -7
  77. package/dist/static/images/flags/cr.svg +0 -7
  78. package/dist/static/images/flags/cu.svg +0 -13
  79. package/dist/static/images/flags/cv.svg +0 -13
  80. package/dist/static/images/flags/cw.svg +0 -14
  81. package/dist/static/images/flags/cx.svg +0 -15
  82. package/dist/static/images/flags/cy.svg +0 -6
  83. package/dist/static/images/flags/cz.svg +0 -12
  84. package/dist/static/images/flags/de.svg +0 -5
  85. package/dist/static/images/flags/dj.svg +0 -13
  86. package/dist/static/images/flags/dk.svg +0 -5
  87. package/dist/static/images/flags/dm.svg +0 -152
  88. package/dist/static/images/flags/do.svg +0 -6745
  89. package/dist/static/images/flags/dz.svg +0 -5
  90. package/dist/static/images/flags/ec.svg +0 -138
  91. package/dist/static/images/flags/ee.svg +0 -7
  92. package/dist/static/images/flags/eg.svg +0 -38
  93. package/dist/static/images/flags/eh.svg +0 -15
  94. package/dist/static/images/flags/el.svg +0 -22
  95. package/dist/static/images/flags/en.svg +0 -15
  96. package/dist/static/images/flags/er.svg +0 -8
  97. package/dist/static/images/flags/es-ct.svg +0 -4
  98. package/dist/static/images/flags/es.svg +0 -544
  99. package/dist/static/images/flags/et.svg +0 -14
  100. package/dist/static/images/flags/eu.svg +0 -28
  101. package/dist/static/images/flags/fa.svg +0 -219
  102. package/dist/static/images/flags/fi.svg +0 -5
  103. package/dist/static/images/flags/fj.svg +0 -120
  104. package/dist/static/images/flags/fk.svg +0 -89
  105. package/dist/static/images/flags/fm.svg +0 -11
  106. package/dist/static/images/flags/fo.svg +0 -12
  107. package/dist/static/images/flags/fr.svg +0 -7
  108. package/dist/static/images/flags/ga.svg +0 -7
  109. package/dist/static/images/flags/gb-eng.svg +0 -5
  110. package/dist/static/images/flags/gb-nir.svg +0 -131
  111. package/dist/static/images/flags/gb-sct.svg +0 -4
  112. package/dist/static/images/flags/gb-wls.svg +0 -9
  113. package/dist/static/images/flags/gb.svg +0 -15
  114. package/dist/static/images/flags/gd.svg +0 -27
  115. package/dist/static/images/flags/ge.svg +0 -6
  116. package/dist/static/images/flags/gf.svg +0 -5
  117. package/dist/static/images/flags/gg.svg +0 -9
  118. package/dist/static/images/flags/gh.svg +0 -6
  119. package/dist/static/images/flags/gi.svg +0 -32
  120. package/dist/static/images/flags/gl.svg +0 -4
  121. package/dist/static/images/flags/gm.svg +0 -14
  122. package/dist/static/images/flags/gn.svg +0 -7
  123. package/dist/static/images/flags/gp.svg +0 -7
  124. package/dist/static/images/flags/gq.svg +0 -23
  125. package/dist/static/images/flags/gr.svg +0 -22
  126. package/dist/static/images/flags/gs.svg +0 -201
  127. package/dist/static/images/flags/gt.svg +0 -204
  128. package/dist/static/images/flags/gu.svg +0 -39
  129. package/dist/static/images/flags/gw.svg +0 -13
  130. package/dist/static/images/flags/gy.svg +0 -9
  131. package/dist/static/images/flags/he.svg +0 -14
  132. package/dist/static/images/flags/hk.svg +0 -30
  133. package/dist/static/images/flags/hm.svg +0 -9
  134. package/dist/static/images/flags/hn.svg +0 -18
  135. package/dist/static/images/flags/hr.svg +0 -58
  136. package/dist/static/images/flags/ht.svg +0 -116
  137. package/dist/static/images/flags/hu.svg +0 -7
  138. package/dist/static/images/flags/id.svg +0 -6
  139. package/dist/static/images/flags/ie.svg +0 -7
  140. package/dist/static/images/flags/il.svg +0 -14
  141. package/dist/static/images/flags/im.svg +0 -36
  142. package/dist/static/images/flags/in.svg +0 -25
  143. package/dist/static/images/flags/io.svg +0 -138
  144. package/dist/static/images/flags/iq.svg +0 -10
  145. package/dist/static/images/flags/ir.svg +0 -219
  146. package/dist/static/images/flags/is.svg +0 -12
  147. package/dist/static/images/flags/it.svg +0 -7
  148. package/dist/static/images/flags/ja.svg +0 -11
  149. package/dist/static/images/flags/je.svg +0 -29
  150. package/dist/static/images/flags/jm.svg +0 -8
  151. package/dist/static/images/flags/jo.svg +0 -16
  152. package/dist/static/images/flags/jp.svg +0 -11
  153. package/dist/static/images/flags/ke.svg +0 -23
  154. package/dist/static/images/flags/kg.svg +0 -15
  155. package/dist/static/images/flags/kh.svg +0 -61
  156. package/dist/static/images/flags/ki.svg +0 -36
  157. package/dist/static/images/flags/km.svg +0 -16
  158. package/dist/static/images/flags/kn.svg +0 -14
  159. package/dist/static/images/flags/ko.svg +0 -24
  160. package/dist/static/images/flags/kp.svg +0 -15
  161. package/dist/static/images/flags/kr.svg +0 -24
  162. package/dist/static/images/flags/kw.svg +0 -13
  163. package/dist/static/images/flags/ky.svg +0 -63
  164. package/dist/static/images/flags/kz.svg +0 -23
  165. package/dist/static/images/flags/la.svg +0 -12
  166. package/dist/static/images/flags/lb.svg +0 -15
  167. package/dist/static/images/flags/lc.svg +0 -8
  168. package/dist/static/images/flags/li.svg +0 -43
  169. package/dist/static/images/flags/lk.svg +0 -22
  170. package/dist/static/images/flags/lr.svg +0 -14
  171. package/dist/static/images/flags/ls.svg +0 -8
  172. package/dist/static/images/flags/lt.svg +0 -7
  173. package/dist/static/images/flags/lu.svg +0 -5
  174. package/dist/static/images/flags/lv.svg +0 -6
  175. package/dist/static/images/flags/ly.svg +0 -13
  176. package/dist/static/images/flags/ma.svg +0 -4
  177. package/dist/static/images/flags/mc.svg +0 -6
  178. package/dist/static/images/flags/md.svg +0 -70
  179. package/dist/static/images/flags/me.svg +0 -116
  180. package/dist/static/images/flags/mf.svg +0 -7
  181. package/dist/static/images/flags/mg.svg +0 -7
  182. package/dist/static/images/flags/mh.svg +0 -7
  183. package/dist/static/images/flags/mk.svg +0 -5
  184. package/dist/static/images/flags/ml.svg +0 -7
  185. package/dist/static/images/flags/mm.svg +0 -16
  186. package/dist/static/images/flags/mn.svg +0 -13
  187. package/dist/static/images/flags/mo.svg +0 -9
  188. package/dist/static/images/flags/mp.svg +0 -86
  189. package/dist/static/images/flags/mq.svg +0 -7
  190. package/dist/static/images/flags/mr.svg +0 -6
  191. package/dist/static/images/flags/ms.svg +0 -39
  192. package/dist/static/images/flags/mt.svg +0 -49
  193. package/dist/static/images/flags/mu.svg +0 -8
  194. package/dist/static/images/flags/mv.svg +0 -6
  195. package/dist/static/images/flags/mw.svg +0 -10
  196. package/dist/static/images/flags/mx.svg +0 -382
  197. package/dist/static/images/flags/my.svg +0 -15
  198. package/dist/static/images/flags/mz.svg +0 -21
  199. package/dist/static/images/flags/na.svg +0 -16
  200. package/dist/static/images/flags/nc.svg +0 -7
  201. package/dist/static/images/flags/ne.svg +0 -6
  202. package/dist/static/images/flags/nf.svg +0 -9
  203. package/dist/static/images/flags/ng.svg +0 -6
  204. package/dist/static/images/flags/ni.svg +0 -129
  205. package/dist/static/images/flags/nl.svg +0 -7
  206. package/dist/static/images/flags/no.svg +0 -7
  207. package/dist/static/images/flags/np.svg +0 -14
  208. package/dist/static/images/flags/nr.svg +0 -12
  209. package/dist/static/images/flags/nu.svg +0 -26
  210. package/dist/static/images/flags/nz.svg +0 -41
  211. package/dist/static/images/flags/om.svg +0 -115
  212. package/dist/static/images/flags/pa.svg +0 -14
  213. package/dist/static/images/flags/pe.svg +0 -244
  214. package/dist/static/images/flags/pf.svg +0 -19
  215. package/dist/static/images/flags/pg.svg +0 -9
  216. package/dist/static/images/flags/ph.svg +0 -9
  217. package/dist/static/images/flags/pk.svg +0 -15
  218. package/dist/static/images/flags/pl.svg +0 -6
  219. package/dist/static/images/flags/pm.svg +0 -7
  220. package/dist/static/images/flags/pn.svg +0 -62
  221. package/dist/static/images/flags/pr.svg +0 -13
  222. package/dist/static/images/flags/ps.svg +0 -15
  223. package/dist/static/images/flags/pt.svg +0 -57
  224. package/dist/static/images/flags/pw.svg +0 -11
  225. package/dist/static/images/flags/py.svg +0 -157
  226. package/dist/static/images/flags/qa.svg +0 -4
  227. package/dist/static/images/flags/re.svg +0 -7
  228. package/dist/static/images/flags/ro.svg +0 -7
  229. package/dist/static/images/flags/rs.svg +0 -292
  230. package/dist/static/images/flags/ru.svg +0 -7
  231. package/dist/static/images/flags/rw.svg +0 -13
  232. package/dist/static/images/flags/sa.svg +0 -26
  233. package/dist/static/images/flags/sb.svg +0 -13
  234. package/dist/static/images/flags/sc.svg +0 -14
  235. package/dist/static/images/flags/sd.svg +0 -13
  236. package/dist/static/images/flags/se.svg +0 -16
  237. package/dist/static/images/flags/sg.svg +0 -13
  238. package/dist/static/images/flags/sh.svg +0 -74
  239. package/dist/static/images/flags/si.svg +0 -18
  240. package/dist/static/images/flags/sj.svg +0 -7
  241. package/dist/static/images/flags/sk.svg +0 -9
  242. package/dist/static/images/flags/sl.svg +0 -7
  243. package/dist/static/images/flags/sm.svg +0 -91
  244. package/dist/static/images/flags/sn.svg +0 -8
  245. package/dist/static/images/flags/so.svg +0 -11
  246. package/dist/static/images/flags/sr.svg +0 -6
  247. package/dist/static/images/flags/ss.svg +0 -8
  248. package/dist/static/images/flags/st.svg +0 -16
  249. package/dist/static/images/flags/sv.svg +0 -601
  250. package/dist/static/images/flags/sx.svg +0 -56
  251. package/dist/static/images/flags/sy.svg +0 -6
  252. package/dist/static/images/flags/sz.svg +0 -45
  253. package/dist/static/images/flags/tc.svg +0 -67
  254. package/dist/static/images/flags/td.svg +0 -7
  255. package/dist/static/images/flags/tf.svg +0 -15
  256. package/dist/static/images/flags/tg.svg +0 -14
  257. package/dist/static/images/flags/th.svg +0 -7
  258. package/dist/static/images/flags/tj.svg +0 -22
  259. package/dist/static/images/flags/tk.svg +0 -5
  260. package/dist/static/images/flags/tl.svg +0 -13
  261. package/dist/static/images/flags/tm.svg +0 -206
  262. package/dist/static/images/flags/tn.svg +0 -13
  263. package/dist/static/images/flags/to.svg +0 -10
  264. package/dist/static/images/flags/tr.svg +0 -8
  265. package/dist/static/images/flags/tt.svg +0 -5
  266. package/dist/static/images/flags/tv.svg +0 -27
  267. package/dist/static/images/flags/tw.svg +0 -14
  268. package/dist/static/images/flags/tz.svg +0 -13
  269. package/dist/static/images/flags/ua.svg +0 -6
  270. package/dist/static/images/flags/ug.svg +0 -30
  271. package/dist/static/images/flags/um.svg +0 -15
  272. package/dist/static/images/flags/un.svg +0 -16
  273. package/dist/static/images/flags/us.svg +0 -10
  274. package/dist/static/images/flags/uy.svg +0 -28
  275. package/dist/static/images/flags/uz.svg +0 -30
  276. package/dist/static/images/flags/va.svg +0 -479
  277. package/dist/static/images/flags/vc.svg +0 -8
  278. package/dist/static/images/flags/ve.svg +0 -26
  279. package/dist/static/images/flags/vg.svg +0 -127
  280. package/dist/static/images/flags/vi.svg +0 -28
  281. package/dist/static/images/flags/vn.svg +0 -11
  282. package/dist/static/images/flags/vu.svg +0 -18
  283. package/dist/static/images/flags/wf.svg +0 -7
  284. package/dist/static/images/flags/ws.svg +0 -7
  285. package/dist/static/images/flags/xk.svg +0 -16
  286. package/dist/static/images/flags/ye.svg +0 -7
  287. package/dist/static/images/flags/yi.svg +0 -12
  288. package/dist/static/images/flags/yt.svg +0 -7
  289. package/dist/static/images/flags/za.svg +0 -17
  290. package/dist/static/images/flags/zh-HK.svg +0 -30
  291. package/dist/static/images/flags/zh.svg +0 -11
  292. package/dist/static/images/flags/zm.svg +0 -27
  293. package/dist/static/images/flags/zw.svg +0 -21
  294. package/dist/static/images/flags.png +0 -0
  295. package/dist/static/images/home.jpg +0 -0
  296. package/dist/static/images/logo.svg +0 -1
  297. package/dist/static/images/showIf.png +0 -0
  298. package/dist/static/images/ui-architecture.png +0 -0
  299. package/dist/static/images/ui-render-inspect.png +0 -0
  300. package/dist/static/images/ui-render-version.png +0 -0
  301. package/static/images/diamonds-dimmed-flipped.png +0 -0
  302. package/static/images/diamonds-dimmed.png +0 -0
  303. package/static/images/diamonds.png +0 -0
  304. package/static/images/flags/ad.svg +0 -150
  305. package/static/images/flags/ae.svg +0 -6
  306. package/static/images/flags/af.svg +0 -81
  307. package/static/images/flags/ag.svg +0 -14
  308. package/static/images/flags/ai.svg +0 -767
  309. package/static/images/flags/al.svg +0 -5
  310. package/static/images/flags/am.svg +0 -5
  311. package/static/images/flags/ao.svg +0 -13
  312. package/static/images/flags/aq.svg +0 -6
  313. package/static/images/flags/ar.svg +0 -31
  314. package/static/images/flags/as.svg +0 -33
  315. package/static/images/flags/at.svg +0 -6
  316. package/static/images/flags/au.svg +0 -9
  317. package/static/images/flags/aw.svg +0 -186
  318. package/static/images/flags/ax.svg +0 -18
  319. package/static/images/flags/az.svg +0 -8
  320. package/static/images/flags/ba.svg +0 -12
  321. package/static/images/flags/bb.svg +0 -6
  322. package/static/images/flags/bd.svg +0 -4
  323. package/static/images/flags/be.svg +0 -7
  324. package/static/images/flags/bf.svg +0 -7
  325. package/static/images/flags/bg.svg +0 -7
  326. package/static/images/flags/bh.svg +0 -11
  327. package/static/images/flags/bi.svg +0 -15
  328. package/static/images/flags/bj.svg +0 -14
  329. package/static/images/flags/bl.svg +0 -7
  330. package/static/images/flags/bm.svg +0 -98
  331. package/static/images/flags/bn.svg +0 -36
  332. package/static/images/flags/bo.svg +0 -676
  333. package/static/images/flags/bq.svg +0 -5
  334. package/static/images/flags/br.svg +0 -45
  335. package/static/images/flags/bs.svg +0 -13
  336. package/static/images/flags/bt.svg +0 -89
  337. package/static/images/flags/bv.svg +0 -13
  338. package/static/images/flags/bw.svg +0 -7
  339. package/static/images/flags/by.svg +0 -20
  340. package/static/images/flags/bz.svg +0 -145
  341. package/static/images/flags/ca.svg +0 -4
  342. package/static/images/flags/cc.svg +0 -19
  343. package/static/images/flags/cd.svg +0 -5
  344. package/static/images/flags/cf.svg +0 -15
  345. package/static/images/flags/cg.svg +0 -12
  346. package/static/images/flags/ch.svg +0 -9
  347. package/static/images/flags/ci.svg +0 -7
  348. package/static/images/flags/ck.svg +0 -9
  349. package/static/images/flags/cl.svg +0 -13
  350. package/static/images/flags/cm.svg +0 -15
  351. package/static/images/flags/cn.svg +0 -11
  352. package/static/images/flags/co.svg +0 -7
  353. package/static/images/flags/cr.svg +0 -7
  354. package/static/images/flags/cu.svg +0 -13
  355. package/static/images/flags/cv.svg +0 -13
  356. package/static/images/flags/cw.svg +0 -14
  357. package/static/images/flags/cx.svg +0 -15
  358. package/static/images/flags/cy.svg +0 -6
  359. package/static/images/flags/cz.svg +0 -12
  360. package/static/images/flags/de.svg +0 -5
  361. package/static/images/flags/dj.svg +0 -13
  362. package/static/images/flags/dk.svg +0 -5
  363. package/static/images/flags/dm.svg +0 -152
  364. package/static/images/flags/do.svg +0 -6745
  365. package/static/images/flags/dz.svg +0 -5
  366. package/static/images/flags/ec.svg +0 -138
  367. package/static/images/flags/ee.svg +0 -7
  368. package/static/images/flags/eg.svg +0 -38
  369. package/static/images/flags/eh.svg +0 -15
  370. package/static/images/flags/el.svg +0 -22
  371. package/static/images/flags/en.svg +0 -15
  372. package/static/images/flags/er.svg +0 -8
  373. package/static/images/flags/es-ct.svg +0 -4
  374. package/static/images/flags/es.svg +0 -544
  375. package/static/images/flags/et.svg +0 -14
  376. package/static/images/flags/eu.svg +0 -28
  377. package/static/images/flags/fa.svg +0 -219
  378. package/static/images/flags/fi.svg +0 -5
  379. package/static/images/flags/fj.svg +0 -120
  380. package/static/images/flags/fk.svg +0 -89
  381. package/static/images/flags/fm.svg +0 -11
  382. package/static/images/flags/fo.svg +0 -12
  383. package/static/images/flags/fr.svg +0 -7
  384. package/static/images/flags/ga.svg +0 -7
  385. package/static/images/flags/gb-eng.svg +0 -5
  386. package/static/images/flags/gb-nir.svg +0 -131
  387. package/static/images/flags/gb-sct.svg +0 -4
  388. package/static/images/flags/gb-wls.svg +0 -9
  389. package/static/images/flags/gb.svg +0 -15
  390. package/static/images/flags/gd.svg +0 -27
  391. package/static/images/flags/ge.svg +0 -6
  392. package/static/images/flags/gf.svg +0 -5
  393. package/static/images/flags/gg.svg +0 -9
  394. package/static/images/flags/gh.svg +0 -6
  395. package/static/images/flags/gi.svg +0 -32
  396. package/static/images/flags/gl.svg +0 -4
  397. package/static/images/flags/gm.svg +0 -14
  398. package/static/images/flags/gn.svg +0 -7
  399. package/static/images/flags/gp.svg +0 -7
  400. package/static/images/flags/gq.svg +0 -23
  401. package/static/images/flags/gr.svg +0 -22
  402. package/static/images/flags/gs.svg +0 -201
  403. package/static/images/flags/gt.svg +0 -204
  404. package/static/images/flags/gu.svg +0 -39
  405. package/static/images/flags/gw.svg +0 -13
  406. package/static/images/flags/gy.svg +0 -9
  407. package/static/images/flags/he.svg +0 -14
  408. package/static/images/flags/hk.svg +0 -30
  409. package/static/images/flags/hm.svg +0 -9
  410. package/static/images/flags/hn.svg +0 -18
  411. package/static/images/flags/hr.svg +0 -58
  412. package/static/images/flags/ht.svg +0 -116
  413. package/static/images/flags/hu.svg +0 -7
  414. package/static/images/flags/id.svg +0 -6
  415. package/static/images/flags/ie.svg +0 -7
  416. package/static/images/flags/il.svg +0 -14
  417. package/static/images/flags/im.svg +0 -36
  418. package/static/images/flags/in.svg +0 -25
  419. package/static/images/flags/io.svg +0 -138
  420. package/static/images/flags/iq.svg +0 -10
  421. package/static/images/flags/ir.svg +0 -219
  422. package/static/images/flags/is.svg +0 -12
  423. package/static/images/flags/it.svg +0 -7
  424. package/static/images/flags/ja.svg +0 -11
  425. package/static/images/flags/je.svg +0 -29
  426. package/static/images/flags/jm.svg +0 -8
  427. package/static/images/flags/jo.svg +0 -16
  428. package/static/images/flags/jp.svg +0 -11
  429. package/static/images/flags/ke.svg +0 -23
  430. package/static/images/flags/kg.svg +0 -15
  431. package/static/images/flags/kh.svg +0 -61
  432. package/static/images/flags/ki.svg +0 -36
  433. package/static/images/flags/km.svg +0 -16
  434. package/static/images/flags/kn.svg +0 -14
  435. package/static/images/flags/ko.svg +0 -24
  436. package/static/images/flags/kp.svg +0 -15
  437. package/static/images/flags/kr.svg +0 -24
  438. package/static/images/flags/kw.svg +0 -13
  439. package/static/images/flags/ky.svg +0 -63
  440. package/static/images/flags/kz.svg +0 -23
  441. package/static/images/flags/la.svg +0 -12
  442. package/static/images/flags/lb.svg +0 -15
  443. package/static/images/flags/lc.svg +0 -8
  444. package/static/images/flags/li.svg +0 -43
  445. package/static/images/flags/lk.svg +0 -22
  446. package/static/images/flags/lr.svg +0 -14
  447. package/static/images/flags/ls.svg +0 -8
  448. package/static/images/flags/lt.svg +0 -7
  449. package/static/images/flags/lu.svg +0 -5
  450. package/static/images/flags/lv.svg +0 -6
  451. package/static/images/flags/ly.svg +0 -13
  452. package/static/images/flags/ma.svg +0 -4
  453. package/static/images/flags/mc.svg +0 -6
  454. package/static/images/flags/md.svg +0 -70
  455. package/static/images/flags/me.svg +0 -116
  456. package/static/images/flags/mf.svg +0 -7
  457. package/static/images/flags/mg.svg +0 -7
  458. package/static/images/flags/mh.svg +0 -7
  459. package/static/images/flags/mk.svg +0 -5
  460. package/static/images/flags/ml.svg +0 -7
  461. package/static/images/flags/mm.svg +0 -16
  462. package/static/images/flags/mn.svg +0 -13
  463. package/static/images/flags/mo.svg +0 -9
  464. package/static/images/flags/mp.svg +0 -86
  465. package/static/images/flags/mq.svg +0 -7
  466. package/static/images/flags/mr.svg +0 -6
  467. package/static/images/flags/ms.svg +0 -39
  468. package/static/images/flags/mt.svg +0 -49
  469. package/static/images/flags/mu.svg +0 -8
  470. package/static/images/flags/mv.svg +0 -6
  471. package/static/images/flags/mw.svg +0 -10
  472. package/static/images/flags/mx.svg +0 -382
  473. package/static/images/flags/my.svg +0 -15
  474. package/static/images/flags/mz.svg +0 -21
  475. package/static/images/flags/na.svg +0 -16
  476. package/static/images/flags/nc.svg +0 -7
  477. package/static/images/flags/ne.svg +0 -6
  478. package/static/images/flags/nf.svg +0 -9
  479. package/static/images/flags/ng.svg +0 -6
  480. package/static/images/flags/ni.svg +0 -129
  481. package/static/images/flags/nl.svg +0 -7
  482. package/static/images/flags/no.svg +0 -7
  483. package/static/images/flags/np.svg +0 -14
  484. package/static/images/flags/nr.svg +0 -12
  485. package/static/images/flags/nu.svg +0 -26
  486. package/static/images/flags/nz.svg +0 -41
  487. package/static/images/flags/om.svg +0 -115
  488. package/static/images/flags/pa.svg +0 -14
  489. package/static/images/flags/pe.svg +0 -244
  490. package/static/images/flags/pf.svg +0 -19
  491. package/static/images/flags/pg.svg +0 -9
  492. package/static/images/flags/ph.svg +0 -9
  493. package/static/images/flags/pk.svg +0 -15
  494. package/static/images/flags/pl.svg +0 -6
  495. package/static/images/flags/pm.svg +0 -7
  496. package/static/images/flags/pn.svg +0 -62
  497. package/static/images/flags/pr.svg +0 -13
  498. package/static/images/flags/ps.svg +0 -15
  499. package/static/images/flags/pt.svg +0 -57
  500. package/static/images/flags/pw.svg +0 -11
  501. package/static/images/flags/py.svg +0 -157
  502. package/static/images/flags/qa.svg +0 -4
  503. package/static/images/flags/re.svg +0 -7
  504. package/static/images/flags/ro.svg +0 -7
  505. package/static/images/flags/rs.svg +0 -292
  506. package/static/images/flags/ru.svg +0 -7
  507. package/static/images/flags/rw.svg +0 -13
  508. package/static/images/flags/sa.svg +0 -26
  509. package/static/images/flags/sb.svg +0 -13
  510. package/static/images/flags/sc.svg +0 -14
  511. package/static/images/flags/sd.svg +0 -13
  512. package/static/images/flags/se.svg +0 -16
  513. package/static/images/flags/sg.svg +0 -13
  514. package/static/images/flags/sh.svg +0 -74
  515. package/static/images/flags/si.svg +0 -18
  516. package/static/images/flags/sj.svg +0 -7
  517. package/static/images/flags/sk.svg +0 -9
  518. package/static/images/flags/sl.svg +0 -7
  519. package/static/images/flags/sm.svg +0 -91
  520. package/static/images/flags/sn.svg +0 -8
  521. package/static/images/flags/so.svg +0 -11
  522. package/static/images/flags/sr.svg +0 -6
  523. package/static/images/flags/ss.svg +0 -8
  524. package/static/images/flags/st.svg +0 -16
  525. package/static/images/flags/sv.svg +0 -601
  526. package/static/images/flags/sx.svg +0 -56
  527. package/static/images/flags/sy.svg +0 -6
  528. package/static/images/flags/sz.svg +0 -45
  529. package/static/images/flags/tc.svg +0 -67
  530. package/static/images/flags/td.svg +0 -7
  531. package/static/images/flags/tf.svg +0 -15
  532. package/static/images/flags/tg.svg +0 -14
  533. package/static/images/flags/th.svg +0 -7
  534. package/static/images/flags/tj.svg +0 -22
  535. package/static/images/flags/tk.svg +0 -5
  536. package/static/images/flags/tl.svg +0 -13
  537. package/static/images/flags/tm.svg +0 -206
  538. package/static/images/flags/tn.svg +0 -13
  539. package/static/images/flags/to.svg +0 -10
  540. package/static/images/flags/tr.svg +0 -8
  541. package/static/images/flags/tt.svg +0 -5
  542. package/static/images/flags/tv.svg +0 -27
  543. package/static/images/flags/tw.svg +0 -14
  544. package/static/images/flags/tz.svg +0 -13
  545. package/static/images/flags/ua.svg +0 -6
  546. package/static/images/flags/ug.svg +0 -30
  547. package/static/images/flags/um.svg +0 -15
  548. package/static/images/flags/un.svg +0 -16
  549. package/static/images/flags/us.svg +0 -10
  550. package/static/images/flags/uy.svg +0 -28
  551. package/static/images/flags/uz.svg +0 -30
  552. package/static/images/flags/va.svg +0 -479
  553. package/static/images/flags/vc.svg +0 -8
  554. package/static/images/flags/ve.svg +0 -26
  555. package/static/images/flags/vg.svg +0 -127
  556. package/static/images/flags/vi.svg +0 -28
  557. package/static/images/flags/vn.svg +0 -11
  558. package/static/images/flags/vu.svg +0 -18
  559. package/static/images/flags/wf.svg +0 -7
  560. package/static/images/flags/ws.svg +0 -7
  561. package/static/images/flags/xk.svg +0 -16
  562. package/static/images/flags/ye.svg +0 -7
  563. package/static/images/flags/yi.svg +0 -12
  564. package/static/images/flags/yt.svg +0 -7
  565. package/static/images/flags/za.svg +0 -17
  566. package/static/images/flags/zh-HK.svg +0 -30
  567. package/static/images/flags/zh.svg +0 -11
  568. package/static/images/flags/zm.svg +0 -27
  569. package/static/images/flags/zw.svg +0 -21
  570. package/static/images/flags.png +0 -0
  571. package/static/images/home.jpg +0 -0
  572. package/static/images/logo.svg +0 -1
  573. package/static/images/showIf.png +0 -0
  574. package/static/images/ui-architecture.png +0 -0
  575. package/static/images/ui-render-inspect.png +0 -0
  576. 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. Versions matter: keeping a single shared instance of
12
- React and Moment in the application is required for the library to work correctly.
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 come from the same install as `react` for the renderer pair to match. |
18
- | `moment` | `~2.29.4` | The library renders dates and accepts `moment` instances on its API. If the application also uses Moment with a different copy, `value instanceof moment` checks fail (silent UI bugs in date pickers). |
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@^16.14.0 react-dom@^16.14.0 moment@~2.29.4
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@^16.14.0 react-dom@^16.14.0 moment@~2.29.4
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`, `prop-types`) are now bundled as regular
39
- dependencies of `eis-ui-render`, so the host project does not need to install them.
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
- 1. Install [Node.js](https://nodejs.org/), if you haven't already (version v22).
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 app in the development mode.<br>
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
- The page will reload if you make edits.<br>
58
- You will also see any lint errors in the console.
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
- - Run `npm run build-lib`
69
- - Login to npm `npm login`
70
- - Publish new version `npm publish`
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).