@pdfme/schemas 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (419) hide show
  1. package/README.md +8 -0
  2. package/dist/cjs/__tests__/barcode.test.js +354 -0
  3. package/dist/cjs/__tests__/barcode.test.js.map +1 -0
  4. package/dist/cjs/__tests__/multiVariableText.test.js +102 -0
  5. package/dist/cjs/__tests__/multiVariableText.test.js.map +1 -0
  6. package/dist/cjs/__tests__/text.test.js +419 -0
  7. package/dist/cjs/__tests__/text.test.js.map +1 -0
  8. package/dist/cjs/__tests__/utils.test.js +193 -0
  9. package/dist/cjs/__tests__/utils.test.js.map +1 -0
  10. package/dist/cjs/src/barcodes/constants.js +21 -0
  11. package/dist/cjs/src/barcodes/constants.js.map +1 -0
  12. package/dist/cjs/src/barcodes/helper.js +161 -0
  13. package/dist/cjs/src/barcodes/helper.js.map +1 -0
  14. package/dist/cjs/src/barcodes/index.js +18 -0
  15. package/dist/cjs/src/barcodes/index.js.map +1 -0
  16. package/dist/cjs/src/barcodes/pdfRender.js +29 -0
  17. package/dist/cjs/src/barcodes/pdfRender.js.map +1 -0
  18. package/dist/cjs/src/barcodes/propPanel.js +241 -0
  19. package/dist/cjs/src/barcodes/propPanel.js.map +1 -0
  20. package/dist/cjs/src/barcodes/types.js +3 -0
  21. package/dist/cjs/src/barcodes/types.js.map +1 -0
  22. package/dist/cjs/src/barcodes/uiRender.js +91 -0
  23. package/dist/cjs/src/barcodes/uiRender.js.map +1 -0
  24. package/dist/cjs/src/checkbox/index.js +62 -0
  25. package/dist/cjs/src/checkbox/index.js.map +1 -0
  26. package/dist/cjs/src/constants.js +6 -0
  27. package/dist/cjs/src/constants.js.map +1 -0
  28. package/dist/cjs/src/date/date.js +9 -0
  29. package/dist/cjs/src/date/date.js.map +1 -0
  30. package/dist/cjs/src/date/dateTime.js +9 -0
  31. package/dist/cjs/src/date/dateTime.js.map +1 -0
  32. package/dist/cjs/src/date/helper.js +462 -0
  33. package/dist/cjs/src/date/helper.js.map +1 -0
  34. package/dist/cjs/src/date/time.js +9 -0
  35. package/dist/cjs/src/date/time.js.map +1 -0
  36. package/dist/cjs/src/date/types.js +3 -0
  37. package/dist/cjs/src/date/types.js.map +1 -0
  38. package/dist/cjs/src/graphics/image.js +172 -0
  39. package/dist/cjs/src/graphics/image.js.map +1 -0
  40. package/dist/cjs/src/graphics/imagehelper.js +124 -0
  41. package/dist/cjs/src/graphics/imagehelper.js.map +1 -0
  42. package/dist/cjs/src/graphics/svg.js +109 -0
  43. package/dist/cjs/src/graphics/svg.js.map +1 -0
  44. package/dist/cjs/src/index.js +41 -0
  45. package/dist/cjs/src/index.js.map +1 -0
  46. package/dist/cjs/src/multiVariableText/helper.js +55 -0
  47. package/dist/cjs/src/multiVariableText/helper.js.map +1 -0
  48. package/dist/cjs/src/multiVariableText/index.js +16 -0
  49. package/dist/cjs/src/multiVariableText/index.js.map +1 -0
  50. package/dist/cjs/src/multiVariableText/pdfRender.js +20 -0
  51. package/dist/cjs/src/multiVariableText/pdfRender.js.map +1 -0
  52. package/dist/cjs/src/multiVariableText/propPanel.js +148 -0
  53. package/dist/cjs/src/multiVariableText/propPanel.js.map +1 -0
  54. package/dist/cjs/src/multiVariableText/types.js +3 -0
  55. package/dist/cjs/src/multiVariableText/types.js.map +1 -0
  56. package/dist/cjs/src/multiVariableText/uiRender.js +146 -0
  57. package/dist/cjs/src/multiVariableText/uiRender.js.map +1 -0
  58. package/dist/cjs/src/radioGroup/index.js +93 -0
  59. package/dist/cjs/src/radioGroup/index.js.map +1 -0
  60. package/dist/cjs/src/select/index.js +170 -0
  61. package/dist/cjs/src/select/index.js.map +1 -0
  62. package/dist/cjs/src/shapes/line.js +76 -0
  63. package/dist/cjs/src/shapes/line.js.map +1 -0
  64. package/dist/cjs/src/shapes/rectAndEllipse.js +140 -0
  65. package/dist/cjs/src/shapes/rectAndEllipse.js.map +1 -0
  66. package/dist/cjs/src/tables/cell.js +126 -0
  67. package/dist/cjs/src/tables/cell.js.map +1 -0
  68. package/dist/cjs/src/tables/classes.js +467 -0
  69. package/dist/cjs/src/tables/classes.js.map +1 -0
  70. package/dist/cjs/src/tables/dynamicTemplate.js +66 -0
  71. package/dist/cjs/src/tables/dynamicTemplate.js.map +1 -0
  72. package/dist/cjs/src/tables/helper.js +189 -0
  73. package/dist/cjs/src/tables/helper.js.map +1 -0
  74. package/dist/cjs/src/tables/index.js +15 -0
  75. package/dist/cjs/src/tables/index.js.map +1 -0
  76. package/dist/cjs/src/tables/pdfRender.js +109 -0
  77. package/dist/cjs/src/tables/pdfRender.js.map +1 -0
  78. package/dist/cjs/src/tables/propPanel.js +108 -0
  79. package/dist/cjs/src/tables/propPanel.js.map +1 -0
  80. package/dist/cjs/src/tables/tableHelper.js +200 -0
  81. package/dist/cjs/src/tables/tableHelper.js.map +1 -0
  82. package/dist/cjs/src/tables/types.js +3 -0
  83. package/dist/cjs/src/tables/types.js.map +1 -0
  84. package/dist/cjs/src/tables/uiRender.js +368 -0
  85. package/dist/cjs/src/tables/uiRender.js.map +1 -0
  86. package/dist/cjs/src/text/constants.js +97 -0
  87. package/dist/cjs/src/text/constants.js.map +1 -0
  88. package/dist/cjs/src/text/extraFormatter.js +49 -0
  89. package/dist/cjs/src/text/extraFormatter.js.map +1 -0
  90. package/dist/cjs/src/text/helper.js +498 -0
  91. package/dist/cjs/src/text/helper.js.map +1 -0
  92. package/dist/cjs/src/text/icons/index.js +16 -0
  93. package/dist/cjs/src/text/icons/index.js.map +1 -0
  94. package/dist/cjs/src/text/index.js +15 -0
  95. package/dist/cjs/src/text/index.js.map +1 -0
  96. package/dist/cjs/src/text/pdfRender.js +167 -0
  97. package/dist/cjs/src/text/pdfRender.js.map +1 -0
  98. package/dist/cjs/src/text/propPanel.js +161 -0
  99. package/dist/cjs/src/text/propPanel.js.map +1 -0
  100. package/dist/cjs/src/text/types.js +3 -0
  101. package/dist/cjs/src/text/types.js.map +1 -0
  102. package/dist/cjs/src/text/uiRender.js +224 -0
  103. package/dist/cjs/src/text/uiRender.js.map +1 -0
  104. package/dist/cjs/src/utils.js +230 -0
  105. package/dist/cjs/src/utils.js.map +1 -0
  106. package/dist/esm/__tests__/barcode.test.js +349 -0
  107. package/dist/esm/__tests__/barcode.test.js.map +1 -0
  108. package/dist/esm/__tests__/multiVariableText.test.js +100 -0
  109. package/dist/esm/__tests__/multiVariableText.test.js.map +1 -0
  110. package/dist/esm/__tests__/text.test.js +384 -0
  111. package/dist/esm/__tests__/text.test.js.map +1 -0
  112. package/dist/esm/__tests__/utils.test.js +191 -0
  113. package/dist/esm/__tests__/utils.test.js.map +1 -0
  114. package/dist/esm/src/barcodes/constants.js +18 -0
  115. package/dist/esm/src/barcodes/constants.js.map +1 -0
  116. package/dist/esm/src/barcodes/helper.js +151 -0
  117. package/dist/esm/src/barcodes/helper.js.map +1 -0
  118. package/dist/esm/src/barcodes/index.js +16 -0
  119. package/dist/esm/src/barcodes/index.js.map +1 -0
  120. package/dist/esm/src/barcodes/pdfRender.js +25 -0
  121. package/dist/esm/src/barcodes/pdfRender.js.map +1 -0
  122. package/dist/esm/src/barcodes/propPanel.js +237 -0
  123. package/dist/esm/src/barcodes/propPanel.js.map +1 -0
  124. package/dist/esm/src/barcodes/types.js +2 -0
  125. package/dist/esm/src/barcodes/types.js.map +1 -0
  126. package/dist/esm/src/barcodes/uiRender.js +87 -0
  127. package/dist/esm/src/barcodes/uiRender.js.map +1 -0
  128. package/dist/esm/src/checkbox/index.js +57 -0
  129. package/dist/esm/src/checkbox/index.js.map +1 -0
  130. package/dist/esm/src/constants.js +3 -0
  131. package/dist/esm/src/constants.js.map +1 -0
  132. package/dist/esm/src/date/date.js +7 -0
  133. package/dist/esm/src/date/date.js.map +1 -0
  134. package/dist/esm/src/date/dateTime.js +7 -0
  135. package/dist/esm/src/date/dateTime.js.map +1 -0
  136. package/dist/esm/src/date/helper.js +422 -0
  137. package/dist/esm/src/date/helper.js.map +1 -0
  138. package/dist/esm/src/date/time.js +7 -0
  139. package/dist/esm/src/date/time.js.map +1 -0
  140. package/dist/esm/src/date/types.js +2 -0
  141. package/dist/esm/src/date/types.js.map +1 -0
  142. package/dist/esm/src/graphics/image.js +170 -0
  143. package/dist/esm/src/graphics/image.js.map +1 -0
  144. package/dist/esm/src/graphics/imagehelper.js +120 -0
  145. package/dist/esm/src/graphics/imagehelper.js.map +1 -0
  146. package/dist/esm/src/graphics/svg.js +107 -0
  147. package/dist/esm/src/graphics/svg.js.map +1 -0
  148. package/dist/esm/src/index.js +21 -0
  149. package/dist/esm/src/index.js.map +1 -0
  150. package/dist/esm/src/multiVariableText/helper.js +50 -0
  151. package/dist/esm/src/multiVariableText/helper.js.map +1 -0
  152. package/dist/esm/src/multiVariableText/index.js +14 -0
  153. package/dist/esm/src/multiVariableText/index.js.map +1 -0
  154. package/dist/esm/src/multiVariableText/pdfRender.js +16 -0
  155. package/dist/esm/src/multiVariableText/pdfRender.js.map +1 -0
  156. package/dist/esm/src/multiVariableText/propPanel.js +145 -0
  157. package/dist/esm/src/multiVariableText/propPanel.js.map +1 -0
  158. package/dist/esm/src/multiVariableText/types.js +2 -0
  159. package/dist/esm/src/multiVariableText/types.js.map +1 -0
  160. package/dist/esm/src/multiVariableText/uiRender.js +142 -0
  161. package/dist/esm/src/multiVariableText/uiRender.js.map +1 -0
  162. package/dist/esm/src/radioGroup/index.js +88 -0
  163. package/dist/esm/src/radioGroup/index.js.map +1 -0
  164. package/dist/esm/src/select/index.js +165 -0
  165. package/dist/esm/src/select/index.js.map +1 -0
  166. package/dist/esm/src/shapes/line.js +74 -0
  167. package/dist/esm/src/shapes/line.js.map +1 -0
  168. package/dist/esm/src/shapes/rectAndEllipse.js +137 -0
  169. package/dist/esm/src/shapes/rectAndEllipse.js.map +1 -0
  170. package/dist/esm/src/tables/cell.js +121 -0
  171. package/dist/esm/src/tables/cell.js.map +1 -0
  172. package/dist/esm/src/tables/classes.js +460 -0
  173. package/dist/esm/src/tables/classes.js.map +1 -0
  174. package/dist/esm/src/tables/dynamicTemplate.js +62 -0
  175. package/dist/esm/src/tables/dynamicTemplate.js.map +1 -0
  176. package/dist/esm/src/tables/helper.js +181 -0
  177. package/dist/esm/src/tables/helper.js.map +1 -0
  178. package/dist/esm/src/tables/index.js +13 -0
  179. package/dist/esm/src/tables/index.js.map +1 -0
  180. package/dist/esm/src/tables/pdfRender.js +102 -0
  181. package/dist/esm/src/tables/pdfRender.js.map +1 -0
  182. package/dist/esm/src/tables/propPanel.js +105 -0
  183. package/dist/esm/src/tables/propPanel.js.map +1 -0
  184. package/dist/esm/src/tables/tableHelper.js +197 -0
  185. package/dist/esm/src/tables/tableHelper.js.map +1 -0
  186. package/dist/esm/src/tables/types.js +2 -0
  187. package/dist/esm/src/tables/types.js.map +1 -0
  188. package/dist/esm/src/tables/uiRender.js +361 -0
  189. package/dist/esm/src/tables/uiRender.js.map +1 -0
  190. package/dist/esm/src/text/constants.js +94 -0
  191. package/dist/esm/src/text/constants.js.map +1 -0
  192. package/dist/esm/src/text/extraFormatter.js +45 -0
  193. package/dist/esm/src/text/extraFormatter.js.map +1 -0
  194. package/dist/esm/src/text/helper.js +451 -0
  195. package/dist/esm/src/text/helper.js.map +1 -0
  196. package/dist/esm/src/text/icons/index.js +13 -0
  197. package/dist/esm/src/text/icons/index.js.map +1 -0
  198. package/dist/esm/src/text/index.js +13 -0
  199. package/dist/esm/src/text/index.js.map +1 -0
  200. package/dist/esm/src/text/pdfRender.js +163 -0
  201. package/dist/esm/src/text/pdfRender.js.map +1 -0
  202. package/dist/esm/src/text/propPanel.js +158 -0
  203. package/dist/esm/src/text/propPanel.js.map +1 -0
  204. package/dist/esm/src/text/types.js +2 -0
  205. package/dist/esm/src/text/types.js.map +1 -0
  206. package/dist/esm/src/text/uiRender.js +217 -0
  207. package/dist/esm/src/text/uiRender.js.map +1 -0
  208. package/dist/esm/src/utils.js +218 -0
  209. package/dist/esm/src/utils.js.map +1 -0
  210. package/dist/node/__tests__/barcode.test.js +354 -0
  211. package/dist/node/__tests__/barcode.test.js.map +1 -0
  212. package/dist/node/__tests__/multiVariableText.test.js +102 -0
  213. package/dist/node/__tests__/multiVariableText.test.js.map +1 -0
  214. package/dist/node/__tests__/text.test.js +419 -0
  215. package/dist/node/__tests__/text.test.js.map +1 -0
  216. package/dist/node/__tests__/utils.test.js +193 -0
  217. package/dist/node/__tests__/utils.test.js.map +1 -0
  218. package/dist/node/src/barcodes/constants.js +21 -0
  219. package/dist/node/src/barcodes/constants.js.map +1 -0
  220. package/dist/node/src/barcodes/helper.js +161 -0
  221. package/dist/node/src/barcodes/helper.js.map +1 -0
  222. package/dist/node/src/barcodes/index.js +18 -0
  223. package/dist/node/src/barcodes/index.js.map +1 -0
  224. package/dist/node/src/barcodes/pdfRender.js +29 -0
  225. package/dist/node/src/barcodes/pdfRender.js.map +1 -0
  226. package/dist/node/src/barcodes/propPanel.js +241 -0
  227. package/dist/node/src/barcodes/propPanel.js.map +1 -0
  228. package/dist/node/src/barcodes/types.js +3 -0
  229. package/dist/node/src/barcodes/types.js.map +1 -0
  230. package/dist/node/src/barcodes/uiRender.js +91 -0
  231. package/dist/node/src/barcodes/uiRender.js.map +1 -0
  232. package/dist/node/src/checkbox/index.js +62 -0
  233. package/dist/node/src/checkbox/index.js.map +1 -0
  234. package/dist/node/src/constants.js +6 -0
  235. package/dist/node/src/constants.js.map +1 -0
  236. package/dist/node/src/date/date.js +9 -0
  237. package/dist/node/src/date/date.js.map +1 -0
  238. package/dist/node/src/date/dateTime.js +9 -0
  239. package/dist/node/src/date/dateTime.js.map +1 -0
  240. package/dist/node/src/date/helper.js +462 -0
  241. package/dist/node/src/date/helper.js.map +1 -0
  242. package/dist/node/src/date/time.js +9 -0
  243. package/dist/node/src/date/time.js.map +1 -0
  244. package/dist/node/src/date/types.js +3 -0
  245. package/dist/node/src/date/types.js.map +1 -0
  246. package/dist/node/src/graphics/image.js +172 -0
  247. package/dist/node/src/graphics/image.js.map +1 -0
  248. package/dist/node/src/graphics/imagehelper.js +124 -0
  249. package/dist/node/src/graphics/imagehelper.js.map +1 -0
  250. package/dist/node/src/graphics/svg.js +109 -0
  251. package/dist/node/src/graphics/svg.js.map +1 -0
  252. package/dist/node/src/index.js +41 -0
  253. package/dist/node/src/index.js.map +1 -0
  254. package/dist/node/src/multiVariableText/helper.js +55 -0
  255. package/dist/node/src/multiVariableText/helper.js.map +1 -0
  256. package/dist/node/src/multiVariableText/index.js +16 -0
  257. package/dist/node/src/multiVariableText/index.js.map +1 -0
  258. package/dist/node/src/multiVariableText/pdfRender.js +20 -0
  259. package/dist/node/src/multiVariableText/pdfRender.js.map +1 -0
  260. package/dist/node/src/multiVariableText/propPanel.js +148 -0
  261. package/dist/node/src/multiVariableText/propPanel.js.map +1 -0
  262. package/dist/node/src/multiVariableText/types.js +3 -0
  263. package/dist/node/src/multiVariableText/types.js.map +1 -0
  264. package/dist/node/src/multiVariableText/uiRender.js +146 -0
  265. package/dist/node/src/multiVariableText/uiRender.js.map +1 -0
  266. package/dist/node/src/radioGroup/index.js +93 -0
  267. package/dist/node/src/radioGroup/index.js.map +1 -0
  268. package/dist/node/src/select/index.js +170 -0
  269. package/dist/node/src/select/index.js.map +1 -0
  270. package/dist/node/src/shapes/line.js +76 -0
  271. package/dist/node/src/shapes/line.js.map +1 -0
  272. package/dist/node/src/shapes/rectAndEllipse.js +140 -0
  273. package/dist/node/src/shapes/rectAndEllipse.js.map +1 -0
  274. package/dist/node/src/tables/cell.js +126 -0
  275. package/dist/node/src/tables/cell.js.map +1 -0
  276. package/dist/node/src/tables/classes.js +467 -0
  277. package/dist/node/src/tables/classes.js.map +1 -0
  278. package/dist/node/src/tables/dynamicTemplate.js +66 -0
  279. package/dist/node/src/tables/dynamicTemplate.js.map +1 -0
  280. package/dist/node/src/tables/helper.js +189 -0
  281. package/dist/node/src/tables/helper.js.map +1 -0
  282. package/dist/node/src/tables/index.js +15 -0
  283. package/dist/node/src/tables/index.js.map +1 -0
  284. package/dist/node/src/tables/pdfRender.js +109 -0
  285. package/dist/node/src/tables/pdfRender.js.map +1 -0
  286. package/dist/node/src/tables/propPanel.js +108 -0
  287. package/dist/node/src/tables/propPanel.js.map +1 -0
  288. package/dist/node/src/tables/tableHelper.js +200 -0
  289. package/dist/node/src/tables/tableHelper.js.map +1 -0
  290. package/dist/node/src/tables/types.js +3 -0
  291. package/dist/node/src/tables/types.js.map +1 -0
  292. package/dist/node/src/tables/uiRender.js +368 -0
  293. package/dist/node/src/tables/uiRender.js.map +1 -0
  294. package/dist/node/src/text/constants.js +97 -0
  295. package/dist/node/src/text/constants.js.map +1 -0
  296. package/dist/node/src/text/extraFormatter.js +49 -0
  297. package/dist/node/src/text/extraFormatter.js.map +1 -0
  298. package/dist/node/src/text/helper.js +498 -0
  299. package/dist/node/src/text/helper.js.map +1 -0
  300. package/dist/node/src/text/icons/index.js +16 -0
  301. package/dist/node/src/text/icons/index.js.map +1 -0
  302. package/dist/node/src/text/index.js +15 -0
  303. package/dist/node/src/text/index.js.map +1 -0
  304. package/dist/node/src/text/pdfRender.js +167 -0
  305. package/dist/node/src/text/pdfRender.js.map +1 -0
  306. package/dist/node/src/text/propPanel.js +161 -0
  307. package/dist/node/src/text/propPanel.js.map +1 -0
  308. package/dist/node/src/text/types.js +3 -0
  309. package/dist/node/src/text/types.js.map +1 -0
  310. package/dist/node/src/text/uiRender.js +224 -0
  311. package/dist/node/src/text/uiRender.js.map +1 -0
  312. package/dist/node/src/utils.js +230 -0
  313. package/dist/node/src/utils.js.map +1 -0
  314. package/dist/types/__tests__/barcode.test.d.ts +1 -0
  315. package/dist/types/__tests__/multiVariableText.test.d.ts +1 -0
  316. package/dist/types/__tests__/text.test.d.ts +1 -0
  317. package/dist/types/__tests__/utils.test.d.ts +1 -0
  318. package/dist/types/src/barcodes/constants.d.ts +4 -0
  319. package/dist/types/src/barcodes/helper.d.ts +21 -0
  320. package/dist/types/src/barcodes/index.d.ts +4 -0
  321. package/dist/types/src/barcodes/pdfRender.d.ts +3 -0
  322. package/dist/types/src/barcodes/propPanel.d.ts +3 -0
  323. package/dist/types/src/barcodes/types.d.ts +10 -0
  324. package/dist/types/src/barcodes/uiRender.d.ts +3 -0
  325. package/dist/types/src/checkbox/index.d.ts +6 -0
  326. package/dist/types/src/constants.d.ts +2 -0
  327. package/dist/types/src/date/date.d.ts +2 -0
  328. package/dist/types/src/date/dateTime.d.ts +2 -0
  329. package/dist/types/src/date/helper.d.ts +8 -0
  330. package/dist/types/src/date/time.d.ts +2 -0
  331. package/dist/types/src/date/types.d.ts +17 -0
  332. package/dist/types/src/graphics/image.d.ts +5 -0
  333. package/dist/types/src/graphics/imagehelper.d.ts +4 -0
  334. package/dist/types/src/graphics/svg.d.ts +4 -0
  335. package/dist/types/src/index.d.ts +19 -0
  336. package/dist/types/src/multiVariableText/helper.d.ts +3 -0
  337. package/dist/types/src/multiVariableText/index.d.ts +4 -0
  338. package/dist/types/src/multiVariableText/pdfRender.d.ts +3 -0
  339. package/dist/types/src/multiVariableText/propPanel.d.ts +3 -0
  340. package/dist/types/src/multiVariableText/types.d.ts +5 -0
  341. package/dist/types/src/multiVariableText/uiRender.d.ts +3 -0
  342. package/dist/types/src/radioGroup/index.d.ts +7 -0
  343. package/dist/types/src/select/index.d.ts +7 -0
  344. package/dist/types/src/shapes/line.d.ts +6 -0
  345. package/dist/types/src/shapes/rectAndEllipse.d.ts +175 -0
  346. package/dist/types/src/tables/cell.d.ts +4 -0
  347. package/dist/types/src/tables/classes.d.ts +69 -0
  348. package/dist/types/src/tables/dynamicTemplate.d.ts +7 -0
  349. package/dist/types/src/tables/helper.d.ts +265 -0
  350. package/dist/types/src/tables/index.d.ts +4 -0
  351. package/dist/types/src/tables/pdfRender.d.ts +3 -0
  352. package/dist/types/src/tables/propPanel.d.ts +3 -0
  353. package/dist/types/src/tables/tableHelper.d.ts +10 -0
  354. package/dist/types/src/tables/types.d.ts +88 -0
  355. package/dist/types/src/tables/uiRender.d.ts +3 -0
  356. package/dist/types/src/text/constants.d.ts +23 -0
  357. package/dist/types/src/text/extraFormatter.d.ts +25 -0
  358. package/dist/types/src/text/helper.d.ts +39 -0
  359. package/dist/types/src/text/icons/index.d.ts +9 -0
  360. package/dist/types/src/text/index.d.ts +4 -0
  361. package/dist/types/src/text/pdfRender.d.ts +3 -0
  362. package/dist/types/src/text/propPanel.d.ts +3 -0
  363. package/dist/types/src/text/types.d.ts +28 -0
  364. package/dist/types/src/text/uiRender.d.ts +11 -0
  365. package/dist/types/src/utils.d.ts +40 -0
  366. package/eslint.config.mjs +22 -0
  367. package/package.json +97 -0
  368. package/src/barcodes/constants.ts +20 -0
  369. package/src/barcodes/helper.ts +187 -0
  370. package/src/barcodes/index.ts +23 -0
  371. package/src/barcodes/pdfRender.ts +37 -0
  372. package/src/barcodes/propPanel.ts +249 -0
  373. package/src/barcodes/types.ts +12 -0
  374. package/src/barcodes/uiRender.ts +94 -0
  375. package/src/checkbox/index.ts +70 -0
  376. package/src/constants.ts +2 -0
  377. package/src/date/date.ts +9 -0
  378. package/src/date/dateTime.ts +9 -0
  379. package/src/date/helper.ts +496 -0
  380. package/src/date/time.ts +9 -0
  381. package/src/date/types.ts +19 -0
  382. package/src/graphics/image.ts +201 -0
  383. package/src/graphics/imagehelper.ts +156 -0
  384. package/src/graphics/svg.ts +118 -0
  385. package/src/index.ts +39 -0
  386. package/src/multiVariableText/helper.ts +65 -0
  387. package/src/multiVariableText/index.ts +16 -0
  388. package/src/multiVariableText/pdfRender.ts +21 -0
  389. package/src/multiVariableText/propPanel.ts +160 -0
  390. package/src/multiVariableText/types.ts +6 -0
  391. package/src/multiVariableText/uiRender.ts +170 -0
  392. package/src/radioGroup/index.ts +115 -0
  393. package/src/select/index.ts +204 -0
  394. package/src/shapes/line.ts +94 -0
  395. package/src/shapes/rectAndEllipse.ts +152 -0
  396. package/src/tables/cell.ts +152 -0
  397. package/src/tables/classes.ts +402 -0
  398. package/src/tables/dynamicTemplate.ts +88 -0
  399. package/src/tables/helper.ts +216 -0
  400. package/src/tables/index.ts +15 -0
  401. package/src/tables/pdfRender.ts +144 -0
  402. package/src/tables/propPanel.ts +111 -0
  403. package/src/tables/tableHelper.ts +288 -0
  404. package/src/tables/types.ts +87 -0
  405. package/src/tables/uiRender.ts +436 -0
  406. package/src/text/constants.ts +104 -0
  407. package/src/text/extraFormatter.ts +83 -0
  408. package/src/text/helper.ts +550 -0
  409. package/src/text/icons/index.ts +30 -0
  410. package/src/text/index.ts +16 -0
  411. package/src/text/pdfRender.ts +239 -0
  412. package/src/text/propPanel.ts +184 -0
  413. package/src/text/types.ts +30 -0
  414. package/src/text/uiRender.ts +288 -0
  415. package/src/utils.ts +281 -0
  416. package/tsconfig.cjs.json +10 -0
  417. package/tsconfig.esm.json +11 -0
  418. package/tsconfig.json +6 -0
  419. package/tsconfig.node.json +11 -0
@@ -0,0 +1,160 @@
1
+ import { propPanel as parentPropPanel } from '../text/propPanel.js';
2
+ import { PropPanel, PropPanelWidgetProps } from '@pdfme/common';
3
+ import { MultiVariableTextSchema } from './types.js';
4
+
5
+ const mapDynamicVariables = (props: PropPanelWidgetProps) => {
6
+ const { rootElement, changeSchemas, activeSchema, i18n, options } = props;
7
+
8
+ const mvtSchema = activeSchema as unknown as MultiVariableTextSchema;
9
+ const text = mvtSchema.text || '';
10
+ const variables = JSON.parse(mvtSchema.content || '{}') as Record<string, string>;
11
+ const variablesChanged = updateVariablesFromText(text, variables);
12
+ const varNames = Object.keys(variables);
13
+
14
+ if (variablesChanged) {
15
+ changeSchemas([
16
+ { key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id },
17
+ { key: 'variables', value: varNames, schemaId: activeSchema.id },
18
+ { key: 'readOnly', value: varNames.length === 0, schemaId: activeSchema.id },
19
+ ]);
20
+ }
21
+
22
+ const placeholderRowEl = document
23
+ .getElementById('placeholder-dynamic-var')
24
+ ?.closest('.ant-form-item') as HTMLElement;
25
+ if (!placeholderRowEl) {
26
+ throw new Error('Failed to find Ant form placeholder row to create dynamic variables inputs.');
27
+ }
28
+ placeholderRowEl.style.display = 'none';
29
+
30
+ // The wrapping form element has a display:flex which limits the width of the form fields, removing.
31
+ (rootElement.parentElement as HTMLElement).style.display = 'block';
32
+
33
+ if (varNames.length > 0) {
34
+ for (let variableName of varNames) {
35
+ const varRow = placeholderRowEl.cloneNode(true) as HTMLElement;
36
+
37
+ const textarea = varRow.querySelector('textarea') as HTMLTextAreaElement;
38
+ textarea.id = 'dynamic-var-' + variableName;
39
+ textarea.value = variables[variableName];
40
+ textarea.addEventListener('change', (e: Event) => {
41
+ if (variableName in variables) {
42
+ variables[variableName] = (e.target as HTMLTextAreaElement).value;
43
+ changeSchemas([
44
+ { key: 'content', value: JSON.stringify(variables), schemaId: activeSchema.id },
45
+ ]);
46
+ }
47
+ });
48
+
49
+ const label = varRow.querySelector('label') as HTMLLabelElement;
50
+ label.innerText = variableName;
51
+
52
+ varRow.style.display = 'block';
53
+ rootElement.appendChild(varRow);
54
+ }
55
+ } else {
56
+ const para = document.createElement('p');
57
+ // Extract color value to avoid unsafe property access
58
+ const colorValue = options?.theme?.token?.colorPrimary || '#168fe3';
59
+ const isValidColor =
60
+ /^#[0-9A-F]{6}$/i.test(colorValue) ||
61
+ /^(rgb|hsl)a?\(\s*([+-]?\d+%?\s*,\s*){2,3}[+-]?\d+%?\s*\)$/i.test(colorValue);
62
+ const safeColorValue = isValidColor ? colorValue : '#168fe3';
63
+
64
+ // Use safe string concatenation for innerHTML
65
+ const typingInstructions = i18n('schemas.mvt.typingInstructions');
66
+ const sampleField = i18n('schemas.mvt.sampleField');
67
+ para.innerHTML =
68
+ typingInstructions +
69
+ ` <code style="color:${safeColorValue}; font-weight:bold;">{` +
70
+ sampleField +
71
+ '}</code>';
72
+ rootElement.appendChild(para);
73
+ }
74
+ };
75
+
76
+ export const propPanel: PropPanel<MultiVariableTextSchema> = {
77
+ schema: (propPanelProps: Omit<PropPanelWidgetProps, 'rootElement'>) => {
78
+ if (typeof parentPropPanel.schema !== 'function') {
79
+ throw new Error('Oops, is text schema no longer a function?');
80
+ }
81
+ // Safely call schema function with proper type handling
82
+ const parentSchema =
83
+ typeof parentPropPanel.schema === 'function' ? parentPropPanel.schema(propPanelProps) : {};
84
+ return {
85
+ ...parentSchema,
86
+ '-------': { type: 'void', widget: 'Divider' },
87
+ dynamicVarContainer: {
88
+ title: 'Variables Sample Data',
89
+ type: 'string',
90
+ widget: 'Card',
91
+ span: 24,
92
+ properties: {
93
+ dynamicVariables: {
94
+ type: 'object',
95
+ widget: 'mapDynamicVariables',
96
+ bind: false,
97
+ span: 24,
98
+ },
99
+ placeholderDynamicVar: {
100
+ title: 'Placeholder Dynamic Variable',
101
+ type: 'string',
102
+ format: 'textarea',
103
+ props: {
104
+ id: 'placeholder-dynamic-var',
105
+ autoSize: {
106
+ minRows: 2,
107
+ maxRows: 5,
108
+ },
109
+ },
110
+ span: 24,
111
+ },
112
+ },
113
+ },
114
+ };
115
+ },
116
+ widgets: { ...(parentPropPanel.widgets || {}), mapDynamicVariables },
117
+ defaultSchema: {
118
+ ...parentPropPanel.defaultSchema,
119
+ readOnly: false,
120
+ type: 'multiVariableText',
121
+ text: 'Add text here using {} for variables ',
122
+ width: 50,
123
+ height: 15,
124
+ content: '{}',
125
+ variables: [],
126
+ },
127
+ };
128
+
129
+ const updateVariablesFromText = (text: string, variables: Record<string, string>): boolean => {
130
+ const regex = /\{([^{}]+)}/g;
131
+ const matches = text.match(regex);
132
+ let changed = false;
133
+
134
+ if (matches) {
135
+ // Add any new variables
136
+ for (const match of matches) {
137
+ const variableName = match.replace('{', '').replace('}', '');
138
+ if (!(variableName in variables)) {
139
+ // NOTE: We upper case the variable name as the default value
140
+ variables[variableName] = variableName.toUpperCase();
141
+ changed = true;
142
+ }
143
+ }
144
+ // Remove any that no longer exist
145
+ Object.keys(variables).forEach((variableName) => {
146
+ if (!matches.includes('{' + variableName + '}')) {
147
+ delete variables[variableName];
148
+ changed = true;
149
+ }
150
+ });
151
+ } else {
152
+ // No matches at all, so clear all variables
153
+ Object.keys(variables).forEach((variableName) => {
154
+ delete variables[variableName];
155
+ changed = true;
156
+ });
157
+ }
158
+
159
+ return changed;
160
+ };
@@ -0,0 +1,6 @@
1
+ import type { TextSchema } from '../text/types.js';
2
+
3
+ export interface MultiVariableTextSchema extends TextSchema {
4
+ text: string;
5
+ variables: string[];
6
+ }
@@ -0,0 +1,170 @@
1
+ import { getDefaultFont, UIRenderProps } from '@pdfme/common';
2
+ import { MultiVariableTextSchema } from './types.js';
3
+ import {
4
+ uiRender as parentUiRender,
5
+ buildStyledTextContainer,
6
+ makeElementPlainTextContentEditable,
7
+ } from '../text/uiRender.js';
8
+ import { isEditable } from '../utils.js';
9
+ import { getFontKitFont } from '../text/helper.js';
10
+ import { substituteVariables } from './helper.js';
11
+
12
+ export const uiRender = async (arg: UIRenderProps<MultiVariableTextSchema>) => {
13
+ const { value, schema, rootElement, mode, onChange, ...rest } = arg;
14
+
15
+ let text = schema.text;
16
+ let numVariables = schema.variables.length;
17
+
18
+ if (mode === 'form' && numVariables > 0) {
19
+ await formUiRender(arg);
20
+ return;
21
+ }
22
+
23
+ await parentUiRender({
24
+ value: isEditable(mode, schema) ? text : substituteVariables(text, value),
25
+ schema,
26
+ mode: mode === 'form' ? 'viewer' : mode, // if no variables for form it's just a viewer
27
+ rootElement,
28
+ onChange: (arg: { key: string; value: unknown } | { key: string; value: unknown }[]) => {
29
+ if (!Array.isArray(arg)) {
30
+ if (onChange) {
31
+ onChange({ key: 'text', value: arg.value });
32
+ }
33
+ } else {
34
+ throw new Error('onChange is not an array, the parent text plugin has changed...');
35
+ }
36
+ },
37
+ ...rest,
38
+ });
39
+
40
+ const textBlock = rootElement.querySelector('#text-' + String(schema.id)) as HTMLDivElement;
41
+ if (!textBlock) {
42
+ throw new Error('Text block not found. Ensure the text block has an id of "text-" + schema.id');
43
+ }
44
+
45
+ if (mode === 'designer') {
46
+ textBlock.addEventListener('keyup', (event: KeyboardEvent) => {
47
+ text = textBlock.textContent || '';
48
+ if (keyPressShouldBeChecked(event)) {
49
+ const newNumVariables = countUniqueVariableNames(text);
50
+ if (numVariables !== newNumVariables) {
51
+ // If variables were modified during this keypress, we trigger a change
52
+ if (onChange) {
53
+ onChange({ key: 'text', value: text });
54
+ }
55
+ numVariables = newNumVariables;
56
+ }
57
+ }
58
+ });
59
+ }
60
+ };
61
+
62
+ const formUiRender = async (arg: UIRenderProps<MultiVariableTextSchema>) => {
63
+ const { value, schema, rootElement, onChange, stopEditing, theme, _cache, options } = arg;
64
+ const rawText = schema.text;
65
+
66
+ if (rootElement.parentElement) {
67
+ // remove the outline for the whole schema, we'll apply outlines on each individual variable field instead
68
+ rootElement.parentElement.style.outline = '';
69
+ }
70
+
71
+ const variables: Record<string, string> = value
72
+ ? (JSON.parse(value) as Record<string, string>) || {}
73
+ : {};
74
+ const variableIndices = getVariableIndices(rawText);
75
+ const substitutedText = substituteVariables(rawText, variables);
76
+ const font = options?.font || getDefaultFont();
77
+ const fontKitFont = await getFontKitFont(
78
+ schema.fontName,
79
+ font,
80
+ _cache as Map<string, import('fontkit').Font>,
81
+ );
82
+
83
+ const textBlock = buildStyledTextContainer(arg, fontKitFont, substitutedText);
84
+
85
+ // Construct content-editable spans for each variable within the string
86
+ let inVarString = false;
87
+
88
+ for (let i = 0; i < rawText.length; i++) {
89
+ if (variableIndices[i]) {
90
+ inVarString = true;
91
+ let span = document.createElement('span');
92
+ span.style.outline = `${theme.colorPrimary} dashed 1px`;
93
+ makeElementPlainTextContentEditable(span);
94
+ span.textContent = variables[variableIndices[i]];
95
+ span.addEventListener('blur', (e: Event) => {
96
+ const newValue = (e.target as HTMLSpanElement).textContent || '';
97
+ if (newValue !== variables[variableIndices[i]]) {
98
+ variables[variableIndices[i]] = newValue;
99
+ if (onChange) onChange({ key: 'content', value: JSON.stringify(variables) });
100
+ if (stopEditing) stopEditing();
101
+ }
102
+ });
103
+ textBlock.appendChild(span);
104
+ } else if (inVarString) {
105
+ if (rawText[i] === '}') {
106
+ inVarString = false;
107
+ }
108
+ } else {
109
+ let span = document.createElement('span');
110
+ span.style.letterSpacing = rawText.length === i + 1 ? '0' : 'inherit';
111
+ span.textContent = rawText[i];
112
+ textBlock.appendChild(span);
113
+ }
114
+ }
115
+ };
116
+
117
+ const getVariableIndices = (content: string) => {
118
+ const regex = /\{([^}]+)}/g;
119
+ const indices = [];
120
+ let match;
121
+
122
+ while ((match = regex.exec(content)) !== null) {
123
+ indices[match.index] = match[1];
124
+ }
125
+
126
+ return indices;
127
+ };
128
+
129
+ const countUniqueVariableNames = (content: string) => {
130
+ const regex = /\{([^}]+)}/g;
131
+ const uniqueMatchesSet = new Set();
132
+ let match;
133
+
134
+ while ((match = regex.exec(content)) !== null) {
135
+ uniqueMatchesSet.add(match[1]);
136
+ }
137
+
138
+ return uniqueMatchesSet.size;
139
+ };
140
+
141
+ /**
142
+ * An optimisation to try to minimise jank while typing.
143
+ * Only check whether variables were modified based on certain key presses.
144
+ * Regex would otherwise be performed on every key press (which isn't terrible, but this code helps).
145
+ */
146
+ const keyPressShouldBeChecked = (event: KeyboardEvent) => {
147
+ if (
148
+ event.key === 'ArrowUp' ||
149
+ event.key === 'ArrowDown' ||
150
+ event.key === 'ArrowLeft' ||
151
+ event.key === 'ArrowRight'
152
+ ) {
153
+ return false;
154
+ }
155
+
156
+ const selection = window.getSelection();
157
+ const contenteditable = event.target as HTMLDivElement;
158
+
159
+ const isCursorAtEnd = selection?.focusOffset === contenteditable?.textContent?.length;
160
+ if (isCursorAtEnd) {
161
+ return event.key === '}' || event.key === 'Backspace' || event.key === 'Delete';
162
+ }
163
+
164
+ const isCursorAtStart = selection?.anchorOffset === 0;
165
+ if (isCursorAtStart) {
166
+ return event.key === '{' || event.key === 'Backspace' || event.key === 'Delete';
167
+ }
168
+
169
+ return true;
170
+ };
@@ -0,0 +1,115 @@
1
+ import { Plugin, Schema } from '@pdfme/common';
2
+ import { Circle, CircleDot } from 'lucide';
3
+ import svg from '../graphics/svg.js';
4
+ import { isEditable, createSvgStr } from '../utils.js';
5
+ import { HEX_COLOR_PATTERN } from '../constants.js';
6
+
7
+ const defaultStroke = 'currentColor';
8
+
9
+ const getCheckedIcon = (stroke = defaultStroke) => createSvgStr(CircleDot, { stroke });
10
+ const getUncheckedIcon = (stroke = defaultStroke) => createSvgStr(Circle, { stroke });
11
+
12
+ interface RadioGroup extends Schema {
13
+ group: string;
14
+ color: string;
15
+ }
16
+
17
+ const getIcon = ({ value, color }: { value: string; color: string }) =>
18
+ value === 'true' ? getCheckedIcon(color) : getUncheckedIcon(color);
19
+
20
+ const eventEmitter = new EventTarget();
21
+
22
+ interface RadioButtonState {
23
+ value: string;
24
+ onChange: (arg: { key: string; value: string }) => void;
25
+ }
26
+
27
+ const radioButtonStates = new Map<string, RadioButtonState>();
28
+ const eventListeners = new Map<string, EventListener>();
29
+
30
+ const schema: Plugin<RadioGroup> = {
31
+ ui: (arg) => {
32
+ const { schema, value, onChange, rootElement, mode } = arg;
33
+ const container = document.createElement('div');
34
+ container.style.width = '100%';
35
+ container.style.height = '100%';
36
+
37
+ if (onChange) {
38
+ radioButtonStates.set(schema.name, { value, onChange });
39
+ }
40
+
41
+ const oldListener = eventListeners.get(schema.name);
42
+ if (oldListener) {
43
+ eventEmitter.removeEventListener(`group-${schema.group}`, oldListener);
44
+ }
45
+
46
+ const handleGroupEvent = (event: Event) => {
47
+ const customEvent = event as CustomEvent<string>;
48
+ const selectedSchemaName = customEvent.detail;
49
+ if (selectedSchemaName !== schema.name) {
50
+ const radioButtonState = radioButtonStates.get(schema.name);
51
+ if (!radioButtonState) return;
52
+ if (radioButtonState.value === 'true') {
53
+ radioButtonState.onChange({ key: 'content', value: 'false' });
54
+ }
55
+ }
56
+ };
57
+
58
+ eventListeners.set(schema.name, handleGroupEvent);
59
+ eventEmitter.addEventListener(`group-${schema.group}`, handleGroupEvent);
60
+
61
+ if (isEditable(mode, schema)) {
62
+ container.addEventListener('click', () => {
63
+ if (value !== 'true' && onChange) {
64
+ onChange({ key: 'content', value: 'true' });
65
+ radioButtonStates.set(schema.name, { value: 'true', onChange });
66
+ eventEmitter.dispatchEvent(
67
+ new CustomEvent(`group-${schema.group}`, { detail: schema.name }),
68
+ );
69
+ }
70
+ });
71
+ }
72
+
73
+ void svg.ui({
74
+ ...arg,
75
+ rootElement: container,
76
+ mode: 'viewer',
77
+ value: getIcon({ value, color: schema.color }),
78
+ });
79
+
80
+ rootElement.appendChild(container);
81
+ },
82
+ pdf: (arg) =>
83
+ svg.pdf(Object.assign(arg, { value: getIcon({ value: arg.value, color: arg.schema.color }) })),
84
+ propPanel: {
85
+ schema: ({ i18n }) => ({
86
+ color: {
87
+ title: i18n('schemas.color'),
88
+ type: 'string',
89
+ widget: 'color',
90
+ props: {
91
+ disabledAlpha: true,
92
+ },
93
+ required: true,
94
+ rules: [{ pattern: HEX_COLOR_PATTERN, message: i18n('validation.hexColor') }],
95
+ },
96
+ group: {
97
+ title: i18n('schemas.radioGroup.groupName'),
98
+ type: 'string',
99
+ },
100
+ }),
101
+ defaultSchema: {
102
+ name: '',
103
+ type: 'radioGroup',
104
+ content: 'false',
105
+ position: { x: 0, y: 0 },
106
+ width: 8,
107
+ height: 8,
108
+ group: 'MyGroup',
109
+ color: '#000000',
110
+ },
111
+ },
112
+ icon: getCheckedIcon(),
113
+ };
114
+
115
+ export default schema;
@@ -0,0 +1,204 @@
1
+ import type * as CSS from 'csstype';
2
+ import { propPanel as parentPropPanel } from '../text/propPanel.js';
3
+ import { Plugin, PropPanelWidgetProps, SchemaForUI } from '@pdfme/common';
4
+ import text from '../text/index.js';
5
+ import { TextSchema } from '../text/types.js';
6
+ import { ChevronDown } from 'lucide';
7
+ import { createSvgStr } from '../utils.js';
8
+
9
+ const selectIcon = createSvgStr(ChevronDown);
10
+
11
+ interface Select extends TextSchema {
12
+ options: string[];
13
+ }
14
+
15
+ const addOptions = (props: PropPanelWidgetProps) => {
16
+ const { rootElement, changeSchemas, activeSchema, i18n } = props;
17
+
18
+ rootElement.style.width = '100%';
19
+
20
+ const selectSchema = activeSchema as SchemaForUI & Select;
21
+ const currentOptions = selectSchema.options ? [...selectSchema.options] : [];
22
+
23
+ const inputStyle = {
24
+ width: '100%',
25
+ padding: '6.25px 11px',
26
+ border: '1px solid #ccc',
27
+ borderRadius: '4px',
28
+ };
29
+
30
+ const buttonStyle = { border: 'none', borderRadius: '4px', cursor: 'pointer' };
31
+
32
+ const updateSchemas = () => {
33
+ changeSchemas([
34
+ { key: 'options', value: currentOptions, schemaId: activeSchema.id },
35
+ { key: 'content', value: currentOptions[0] || '', schemaId: activeSchema.id },
36
+ ]);
37
+ };
38
+
39
+ const formContainer = document.createElement('div');
40
+ Object.assign(formContainer.style, {
41
+ width: '100%',
42
+ display: 'flex',
43
+ alignItems: 'center',
44
+ marginBottom: '10px',
45
+ });
46
+
47
+ const input = document.createElement('input');
48
+ input.type = 'text';
49
+ input.placeholder = i18n('schemas.select.optionPlaceholder');
50
+ Object.assign(input.style, inputStyle, { marginRight: '10px' });
51
+
52
+ const addButton = document.createElement('button');
53
+ addButton.textContent = '+';
54
+ Object.assign(addButton.style, buttonStyle, {
55
+ width: '25px',
56
+ height: '25px',
57
+ padding: '4px 8px',
58
+ });
59
+
60
+ addButton.addEventListener('click', () => {
61
+ const newValue = input.value.trim();
62
+ if (newValue) {
63
+ currentOptions.push(newValue);
64
+ updateSchemas();
65
+ renderOptions();
66
+ input.value = '';
67
+ }
68
+ });
69
+
70
+ formContainer.appendChild(input);
71
+ formContainer.appendChild(addButton);
72
+
73
+ const optionsList = document.createElement('ul');
74
+ Object.assign(optionsList.style, { listStyle: 'none', padding: '0' });
75
+
76
+ const renderOptions = () => {
77
+ optionsList.innerHTML = '';
78
+ currentOptions.forEach((option, index) => {
79
+ const li = document.createElement('li');
80
+ Object.assign(li.style, { display: 'flex', alignItems: 'center', marginBottom: '5px' });
81
+
82
+ const optionInput = document.createElement('input');
83
+ optionInput.type = 'text';
84
+ optionInput.value = option;
85
+ Object.assign(optionInput.style, inputStyle, { marginRight: '10px' });
86
+
87
+ optionInput.addEventListener('change', () => {
88
+ currentOptions[index] = optionInput.value;
89
+ updateSchemas();
90
+ });
91
+
92
+ const removeButton = document.createElement('button');
93
+ removeButton.textContent = 'x';
94
+ Object.assign(removeButton.style, buttonStyle, { padding: '4px 8px' });
95
+
96
+ removeButton.addEventListener('click', () => {
97
+ currentOptions.splice(index, 1);
98
+ updateSchemas();
99
+ renderOptions();
100
+ });
101
+
102
+ li.appendChild(optionInput);
103
+ li.appendChild(removeButton);
104
+ optionsList.appendChild(li);
105
+ });
106
+ };
107
+
108
+ rootElement.appendChild(formContainer);
109
+ rootElement.appendChild(optionsList);
110
+
111
+ renderOptions();
112
+ };
113
+
114
+ const schema: Plugin<Select> = {
115
+ ui: async (arg) => {
116
+ const { schema, value, onChange, rootElement, mode } = arg;
117
+ await text.ui(Object.assign(arg, { mode: 'viewer' }));
118
+
119
+ if (mode !== 'viewer' && !(mode === 'form' && schema.readOnly)) {
120
+ const buttonWidth = 30;
121
+ const selectButton = document.createElement('button');
122
+ selectButton.innerHTML = selectIcon;
123
+ const selectButtonStyle: CSS.Properties = {
124
+ position: 'absolute',
125
+ zIndex: -1,
126
+ right: `-${buttonWidth}px`,
127
+ top: '0',
128
+ padding: '0',
129
+ margin: '0',
130
+ cursor: 'pointer',
131
+ height: `${buttonWidth}px`,
132
+ width: `${buttonWidth}px`,
133
+ };
134
+ Object.assign(selectButton.style, selectButtonStyle);
135
+
136
+ rootElement.appendChild(selectButton);
137
+
138
+ const selectElement = document.createElement('select');
139
+ const selectElementStyle: CSS.Properties = {
140
+ opacity: '0',
141
+ position: 'absolute',
142
+ width: `calc(100% + ${buttonWidth}px)`,
143
+ height: '100%',
144
+ top: '0',
145
+ left: '0',
146
+ appearance: 'initial',
147
+ };
148
+ Object.assign(selectElement.style, selectElementStyle);
149
+ selectElement.value = value;
150
+
151
+ selectElement.addEventListener('change', (e) => {
152
+ if (onChange && e.target instanceof HTMLSelectElement) {
153
+ if (onChange) onChange({ key: 'content', value: e.target.value });
154
+ }
155
+ });
156
+
157
+ // Ensure schema.options is an array before mapping
158
+ const options = Array.isArray(schema.options) ? schema.options : [];
159
+ selectElement.innerHTML = options
160
+ .map(
161
+ (option) =>
162
+ `<option value="${option}" ${option === value ? 'selected' : ''}>${option}</option>`,
163
+ )
164
+ .join('');
165
+ rootElement.appendChild(selectElement);
166
+ }
167
+ },
168
+ pdf: text.pdf,
169
+ propPanel: {
170
+ ...text.propPanel,
171
+ widgets: { ...parentPropPanel.widgets, addOptions },
172
+ schema: (propPanelProps: Omit<PropPanelWidgetProps, 'rootElement'>) => {
173
+ if (typeof parentPropPanel.schema !== 'function') {
174
+ throw Error('Oops, is text schema no longer a function?');
175
+ }
176
+
177
+ // Safely call the parent schema function with proper type checking
178
+ const parentSchema = parentPropPanel.schema(propPanelProps);
179
+
180
+ // Create a type-safe return object
181
+ return {
182
+ ...parentSchema,
183
+ '-------': { type: 'void', widget: 'Divider' },
184
+
185
+ optionsContainer: {
186
+ title: (propPanelProps as PropPanelWidgetProps).i18n('schemas.select.options'),
187
+ type: 'string',
188
+ widget: 'Card',
189
+ span: 24,
190
+ properties: { options: { widget: 'addOptions', span: 24 } },
191
+ },
192
+ };
193
+ },
194
+ defaultSchema: {
195
+ ...(text.propPanel.defaultSchema as TextSchema),
196
+ type: 'select',
197
+ content: 'option1',
198
+ options: ['option1', 'option2'],
199
+ },
200
+ },
201
+ icon: selectIcon,
202
+ };
203
+
204
+ export default schema;