ding-image-editor 3.15.3

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 (374) hide show
  1. package/README.md +193 -0
  2. package/dist/svg/icon-a.svg +376 -0
  3. package/dist/svg/icon-b.svg +369 -0
  4. package/dist/svg/icon-c.svg +369 -0
  5. package/dist/svg/icon-d.svg +369 -0
  6. package/dist/tui-image-editor.css +6 -0
  7. package/dist/tui-image-editor.js +62329 -0
  8. package/dist/tui-image-editor.min.css +5 -0
  9. package/dist/tui-image-editor.min.js +15 -0
  10. package/index.d.ts +334 -0
  11. package/package.json +52 -0
  12. package/src/css/buttons.styl +102 -0
  13. package/src/css/checkbox.styl +86 -0
  14. package/src/css/colorpicker.styl +98 -0
  15. package/src/css/gridtable.styl +45 -0
  16. package/src/css/icon.styl +44 -0
  17. package/src/css/index.styl +17 -0
  18. package/src/css/main.styl +163 -0
  19. package/src/css/position.styl +309 -0
  20. package/src/css/range.styl +91 -0
  21. package/src/css/submenu.styl +168 -0
  22. package/src/index.js +29 -0
  23. package/src/js/action.js +686 -0
  24. package/src/js/command/addIcon.js +42 -0
  25. package/src/js/command/addImageObject.js +34 -0
  26. package/src/js/command/addObject.js +43 -0
  27. package/src/js/command/addShape.js +51 -0
  28. package/src/js/command/addText.js +73 -0
  29. package/src/js/command/applyFilter.js +95 -0
  30. package/src/js/command/changeIconColor.js +48 -0
  31. package/src/js/command/changeSelection.js +31 -0
  32. package/src/js/command/changeShape.js +84 -0
  33. package/src/js/command/changeText.js +44 -0
  34. package/src/js/command/changeTextStyle.js +80 -0
  35. package/src/js/command/clearObjects.js +33 -0
  36. package/src/js/command/flip.js +36 -0
  37. package/src/js/command/loadImage.js +58 -0
  38. package/src/js/command/removeFilter.js +38 -0
  39. package/src/js/command/removeObject.js +37 -0
  40. package/src/js/command/resize.js +41 -0
  41. package/src/js/command/resizeCanvasDimension.js +40 -0
  42. package/src/js/command/rotate.js +64 -0
  43. package/src/js/command/setObjectPosition.js +50 -0
  44. package/src/js/command/setObjectProperties.js +55 -0
  45. package/src/js/component/cropper.js +407 -0
  46. package/src/js/component/filter.js +229 -0
  47. package/src/js/component/flip.js +146 -0
  48. package/src/js/component/freeDrawing.js +144 -0
  49. package/src/js/component/icon.js +246 -0
  50. package/src/js/component/imageLoader.js +84 -0
  51. package/src/js/component/line.js +205 -0
  52. package/src/js/component/resize.js +103 -0
  53. package/src/js/component/rotation.js +91 -0
  54. package/src/js/component/shape.js +601 -0
  55. package/src/js/component/text.js +572 -0
  56. package/src/js/component/zoom.js +708 -0
  57. package/src/js/consts.js +404 -0
  58. package/src/js/drawingMode/cropper.js +35 -0
  59. package/src/js/drawingMode/freeDrawing.js +36 -0
  60. package/src/js/drawingMode/icon.js +35 -0
  61. package/src/js/drawingMode/lineDrawing.js +36 -0
  62. package/src/js/drawingMode/resize.js +35 -0
  63. package/src/js/drawingMode/shape.js +35 -0
  64. package/src/js/drawingMode/text.js +35 -0
  65. package/src/js/drawingMode/zoom.js +37 -0
  66. package/src/js/extension/arrowLine.js +172 -0
  67. package/src/js/extension/blur.js +29 -0
  68. package/src/js/extension/colorFilter.js +104 -0
  69. package/src/js/extension/cropzone.js +568 -0
  70. package/src/js/extension/emboss.js +29 -0
  71. package/src/js/extension/mask.js +90 -0
  72. package/src/js/extension/sharpen.js +29 -0
  73. package/src/js/factory/command.js +36 -0
  74. package/src/js/factory/errorMessage.js +27 -0
  75. package/src/js/graphics.js +1539 -0
  76. package/src/js/helper/imagetracer.js +1396 -0
  77. package/src/js/helper/selectionModifyHelper.js +86 -0
  78. package/src/js/helper/shapeFilterFillHelper.js +564 -0
  79. package/src/js/helper/shapeResizeHelper.js +237 -0
  80. package/src/js/imageEditor.js +1795 -0
  81. package/src/js/interface/command.js +131 -0
  82. package/src/js/interface/component.js +127 -0
  83. package/src/js/interface/drawingMode.js +47 -0
  84. package/src/js/invoker.js +292 -0
  85. package/src/js/polyfill.js +498 -0
  86. package/src/js/ui/crop.js +139 -0
  87. package/src/js/ui/draw.js +187 -0
  88. package/src/js/ui/filter.js +510 -0
  89. package/src/js/ui/flip.js +87 -0
  90. package/src/js/ui/history.js +171 -0
  91. package/src/js/ui/icon.js +191 -0
  92. package/src/js/ui/locale/locale.js +19 -0
  93. package/src/js/ui/mask.js +96 -0
  94. package/src/js/ui/panelMenu.js +130 -0
  95. package/src/js/ui/resize.js +241 -0
  96. package/src/js/ui/rotate.js +123 -0
  97. package/src/js/ui/shape.js +265 -0
  98. package/src/js/ui/submenuBase.js +122 -0
  99. package/src/js/ui/template/controls.js +21 -0
  100. package/src/js/ui/template/mainContainer.js +38 -0
  101. package/src/js/ui/template/style.js +146 -0
  102. package/src/js/ui/template/submenu/crop.js +73 -0
  103. package/src/js/ui/template/submenu/draw.js +42 -0
  104. package/src/js/ui/template/submenu/filter.js +157 -0
  105. package/src/js/ui/template/submenu/flip.js +41 -0
  106. package/src/js/ui/template/submenu/history.js +22 -0
  107. package/src/js/ui/template/submenu/icon.js +108 -0
  108. package/src/js/ui/template/submenu/mask.js +30 -0
  109. package/src/js/ui/template/submenu/resize.js +54 -0
  110. package/src/js/ui/template/submenu/rotate.js +32 -0
  111. package/src/js/ui/template/submenu/shape.js +45 -0
  112. package/src/js/ui/template/submenu/text.js +67 -0
  113. package/src/js/ui/template/submenu/zoom.js +41 -0
  114. package/src/js/ui/text.js +279 -0
  115. package/src/js/ui/theme/standard.js +220 -0
  116. package/src/js/ui/theme/theme.js +249 -0
  117. package/src/js/ui/tools/colorpicker.js +250 -0
  118. package/src/js/ui/tools/range.js +390 -0
  119. package/src/js/ui.js +858 -0
  120. package/src/js/util.js +551 -0
  121. package/src/svg/default.svg +335 -0
  122. package/src/svg/icon-a/ic-apply.svg +6 -0
  123. package/src/svg/icon-a/ic-cancel.svg +6 -0
  124. package/src/svg/icon-a/ic-color-transparent-w.svg +12 -0
  125. package/src/svg/icon-a/ic-crop.svg +7 -0
  126. package/src/svg/icon-a/ic-delete-all.svg +6 -0
  127. package/src/svg/icon-a/ic-delete.svg +6 -0
  128. package/src/svg/icon-a/ic-draw-free.svg +5 -0
  129. package/src/svg/icon-a/ic-draw-line.svg +5 -0
  130. package/src/svg/icon-a/ic-draw.svg +6 -0
  131. package/src/svg/icon-a/ic-filter.svg +7 -0
  132. package/src/svg/icon-a/ic-flip-reset.svg +7 -0
  133. package/src/svg/icon-a/ic-flip-x.svg +6 -0
  134. package/src/svg/icon-a/ic-flip-y.svg +6 -0
  135. package/src/svg/icon-a/ic-flip.svg +6 -0
  136. package/src/svg/icon-a/ic-history-check.svg +5 -0
  137. package/src/svg/icon-a/ic-history-crop.svg +7 -0
  138. package/src/svg/icon-a/ic-history-delete.svg +9 -0
  139. package/src/svg/icon-a/ic-history-draw.svg +7 -0
  140. package/src/svg/icon-a/ic-history-filter.svg +8 -0
  141. package/src/svg/icon-a/ic-history-flip.svg +6 -0
  142. package/src/svg/icon-a/ic-history-group.svg +9 -0
  143. package/src/svg/icon-a/ic-history-icon.svg +6 -0
  144. package/src/svg/icon-a/ic-history-load.svg +7 -0
  145. package/src/svg/icon-a/ic-history-mask.svg +9 -0
  146. package/src/svg/icon-a/ic-history-resize.svg +12 -0
  147. package/src/svg/icon-a/ic-history-rotate.svg +16 -0
  148. package/src/svg/icon-a/ic-history-shape.svg +7 -0
  149. package/src/svg/icon-a/ic-history-text.svg +8 -0
  150. package/src/svg/icon-a/ic-history.svg +6 -0
  151. package/src/svg/icon-a/ic-icon-arrow-2.svg +5 -0
  152. package/src/svg/icon-a/ic-icon-arrow-3.svg +5 -0
  153. package/src/svg/icon-a/ic-icon-arrow.svg +5 -0
  154. package/src/svg/icon-a/ic-icon-bubble.svg +5 -0
  155. package/src/svg/icon-a/ic-icon-heart.svg +5 -0
  156. package/src/svg/icon-a/ic-icon-load.svg +8 -0
  157. package/src/svg/icon-a/ic-icon-location.svg +8 -0
  158. package/src/svg/icon-a/ic-icon-polygon.svg +5 -0
  159. package/src/svg/icon-a/ic-icon-star-2.svg +5 -0
  160. package/src/svg/icon-a/ic-icon-star.svg +5 -0
  161. package/src/svg/icon-a/ic-icon.svg +5 -0
  162. package/src/svg/icon-a/ic-mask-load.svg +8 -0
  163. package/src/svg/icon-a/ic-mask.svg +6 -0
  164. package/src/svg/icon-a/ic-redo.svg +7 -0
  165. package/src/svg/icon-a/ic-reset.svg +7 -0
  166. package/src/svg/icon-a/ic-resize.svg +13 -0
  167. package/src/svg/icon-a/ic-rotate-clockwise.svg +7 -0
  168. package/src/svg/icon-a/ic-rotate-counterclockwise.svg +7 -0
  169. package/src/svg/icon-a/ic-rotate.svg +7 -0
  170. package/src/svg/icon-a/ic-shape-circle.svg +5 -0
  171. package/src/svg/icon-a/ic-shape-rectangle.svg +5 -0
  172. package/src/svg/icon-a/ic-shape-triangle.svg +5 -0
  173. package/src/svg/icon-a/ic-shape.svg +6 -0
  174. package/src/svg/icon-a/ic-text-align-center.svg +6 -0
  175. package/src/svg/icon-a/ic-text-align-left.svg +6 -0
  176. package/src/svg/icon-a/ic-text-align-right.svg +6 -0
  177. package/src/svg/icon-a/ic-text-bold.svg +7 -0
  178. package/src/svg/icon-a/ic-text-italic.svg +6 -0
  179. package/src/svg/icon-a/ic-text-underline.svg +7 -0
  180. package/src/svg/icon-a/ic-text.svg +7 -0
  181. package/src/svg/icon-a/ic-undo.svg +7 -0
  182. package/src/svg/icon-a/ic-zoom-hand.svg +8 -0
  183. package/src/svg/icon-a/ic-zoom-zoom-in.svg +10 -0
  184. package/src/svg/icon-a/ic-zoom-zoom-out.svg +9 -0
  185. package/src/svg/icon-a/img-bi.svg +5 -0
  186. package/src/svg/icon-b/ic-apply.svg +6 -0
  187. package/src/svg/icon-b/ic-cancel.svg +6 -0
  188. package/src/svg/icon-b/ic-crop.svg +7 -0
  189. package/src/svg/icon-b/ic-delete-all.svg +6 -0
  190. package/src/svg/icon-b/ic-delete.svg +6 -0
  191. package/src/svg/icon-b/ic-draw-free.svg +5 -0
  192. package/src/svg/icon-b/ic-draw-line.svg +5 -0
  193. package/src/svg/icon-b/ic-draw.svg +6 -0
  194. package/src/svg/icon-b/ic-filter.svg +7 -0
  195. package/src/svg/icon-b/ic-flip-reset.svg +7 -0
  196. package/src/svg/icon-b/ic-flip-x.svg +6 -0
  197. package/src/svg/icon-b/ic-flip-y.svg +6 -0
  198. package/src/svg/icon-b/ic-flip.svg +6 -0
  199. package/src/svg/icon-b/ic-history-check.svg +5 -0
  200. package/src/svg/icon-b/ic-history-crop.svg +7 -0
  201. package/src/svg/icon-b/ic-history-delete.svg +9 -0
  202. package/src/svg/icon-b/ic-history-draw.svg +7 -0
  203. package/src/svg/icon-b/ic-history-filter.svg +8 -0
  204. package/src/svg/icon-b/ic-history-flip.svg +6 -0
  205. package/src/svg/icon-b/ic-history-group.svg +9 -0
  206. package/src/svg/icon-b/ic-history-icon.svg +6 -0
  207. package/src/svg/icon-b/ic-history-load.svg +7 -0
  208. package/src/svg/icon-b/ic-history-mask.svg +9 -0
  209. package/src/svg/icon-b/ic-history-resize.svg +12 -0
  210. package/src/svg/icon-b/ic-history-rotate.svg +16 -0
  211. package/src/svg/icon-b/ic-history-shape.svg +7 -0
  212. package/src/svg/icon-b/ic-history-text.svg +8 -0
  213. package/src/svg/icon-b/ic-history.svg +6 -0
  214. package/src/svg/icon-b/ic-icon-arrow-2.svg +5 -0
  215. package/src/svg/icon-b/ic-icon-arrow-3.svg +5 -0
  216. package/src/svg/icon-b/ic-icon-arrow.svg +5 -0
  217. package/src/svg/icon-b/ic-icon-bubble.svg +5 -0
  218. package/src/svg/icon-b/ic-icon-heart.svg +5 -0
  219. package/src/svg/icon-b/ic-icon-load.svg +8 -0
  220. package/src/svg/icon-b/ic-icon-location.svg +8 -0
  221. package/src/svg/icon-b/ic-icon-polygon.svg +5 -0
  222. package/src/svg/icon-b/ic-icon-star-2.svg +5 -0
  223. package/src/svg/icon-b/ic-icon-star.svg +5 -0
  224. package/src/svg/icon-b/ic-icon.svg +5 -0
  225. package/src/svg/icon-b/ic-mask-load.svg +8 -0
  226. package/src/svg/icon-b/ic-mask.svg +6 -0
  227. package/src/svg/icon-b/ic-redo.svg +7 -0
  228. package/src/svg/icon-b/ic-reset.svg +7 -0
  229. package/src/svg/icon-b/ic-resize.svg +13 -0
  230. package/src/svg/icon-b/ic-rotate-clockwise.svg +7 -0
  231. package/src/svg/icon-b/ic-rotate-counterclockwise.svg +7 -0
  232. package/src/svg/icon-b/ic-rotate.svg +7 -0
  233. package/src/svg/icon-b/ic-shape-circle.svg +5 -0
  234. package/src/svg/icon-b/ic-shape-rectangle.svg +5 -0
  235. package/src/svg/icon-b/ic-shape-triangle.svg +5 -0
  236. package/src/svg/icon-b/ic-shape.svg +6 -0
  237. package/src/svg/icon-b/ic-text-align-center.svg +6 -0
  238. package/src/svg/icon-b/ic-text-align-left.svg +6 -0
  239. package/src/svg/icon-b/ic-text-align-right.svg +6 -0
  240. package/src/svg/icon-b/ic-text-bold.svg +7 -0
  241. package/src/svg/icon-b/ic-text-italic.svg +6 -0
  242. package/src/svg/icon-b/ic-text-underline.svg +7 -0
  243. package/src/svg/icon-b/ic-text.svg +7 -0
  244. package/src/svg/icon-b/ic-undo.svg +7 -0
  245. package/src/svg/icon-b/ic-zoom-hand.svg +8 -0
  246. package/src/svg/icon-b/ic-zoom-zoom-in.svg +12 -0
  247. package/src/svg/icon-b/ic-zoom-zoom-out.svg +11 -0
  248. package/src/svg/icon-b/img-bi.svg +5 -0
  249. package/src/svg/icon-c/ic-apply.svg +6 -0
  250. package/src/svg/icon-c/ic-cancel.svg +6 -0
  251. package/src/svg/icon-c/ic-crop.svg +7 -0
  252. package/src/svg/icon-c/ic-delete-all.svg +6 -0
  253. package/src/svg/icon-c/ic-delete.svg +6 -0
  254. package/src/svg/icon-c/ic-draw-free.svg +5 -0
  255. package/src/svg/icon-c/ic-draw-line.svg +5 -0
  256. package/src/svg/icon-c/ic-draw.svg +6 -0
  257. package/src/svg/icon-c/ic-filter.svg +7 -0
  258. package/src/svg/icon-c/ic-flip-reset.svg +7 -0
  259. package/src/svg/icon-c/ic-flip-x.svg +6 -0
  260. package/src/svg/icon-c/ic-flip-y.svg +6 -0
  261. package/src/svg/icon-c/ic-flip.svg +6 -0
  262. package/src/svg/icon-c/ic-history-check.svg +5 -0
  263. package/src/svg/icon-c/ic-history-crop.svg +7 -0
  264. package/src/svg/icon-c/ic-history-delete.svg +9 -0
  265. package/src/svg/icon-c/ic-history-draw.svg +7 -0
  266. package/src/svg/icon-c/ic-history-filter.svg +8 -0
  267. package/src/svg/icon-c/ic-history-flip.svg +6 -0
  268. package/src/svg/icon-c/ic-history-group.svg +9 -0
  269. package/src/svg/icon-c/ic-history-icon.svg +6 -0
  270. package/src/svg/icon-c/ic-history-load.svg +7 -0
  271. package/src/svg/icon-c/ic-history-mask.svg +9 -0
  272. package/src/svg/icon-c/ic-history-resize.svg +12 -0
  273. package/src/svg/icon-c/ic-history-rotate.svg +16 -0
  274. package/src/svg/icon-c/ic-history-shape.svg +7 -0
  275. package/src/svg/icon-c/ic-history-text.svg +8 -0
  276. package/src/svg/icon-c/ic-history.svg +6 -0
  277. package/src/svg/icon-c/ic-icon-arrow-2.svg +5 -0
  278. package/src/svg/icon-c/ic-icon-arrow-3.svg +5 -0
  279. package/src/svg/icon-c/ic-icon-arrow.svg +5 -0
  280. package/src/svg/icon-c/ic-icon-bubble.svg +5 -0
  281. package/src/svg/icon-c/ic-icon-heart.svg +5 -0
  282. package/src/svg/icon-c/ic-icon-load.svg +8 -0
  283. package/src/svg/icon-c/ic-icon-location.svg +8 -0
  284. package/src/svg/icon-c/ic-icon-polygon.svg +5 -0
  285. package/src/svg/icon-c/ic-icon-star-2.svg +5 -0
  286. package/src/svg/icon-c/ic-icon-star.svg +5 -0
  287. package/src/svg/icon-c/ic-icon.svg +5 -0
  288. package/src/svg/icon-c/ic-mask-load.svg +8 -0
  289. package/src/svg/icon-c/ic-mask.svg +6 -0
  290. package/src/svg/icon-c/ic-redo.svg +7 -0
  291. package/src/svg/icon-c/ic-reset.svg +7 -0
  292. package/src/svg/icon-c/ic-resize.svg +13 -0
  293. package/src/svg/icon-c/ic-rotate-clockwise.svg +7 -0
  294. package/src/svg/icon-c/ic-rotate-counterclockwise.svg +7 -0
  295. package/src/svg/icon-c/ic-rotate.svg +7 -0
  296. package/src/svg/icon-c/ic-shape-circle.svg +5 -0
  297. package/src/svg/icon-c/ic-shape-rectangle.svg +5 -0
  298. package/src/svg/icon-c/ic-shape-triangle.svg +5 -0
  299. package/src/svg/icon-c/ic-shape.svg +6 -0
  300. package/src/svg/icon-c/ic-text-align-center.svg +6 -0
  301. package/src/svg/icon-c/ic-text-align-left.svg +6 -0
  302. package/src/svg/icon-c/ic-text-align-right.svg +6 -0
  303. package/src/svg/icon-c/ic-text-bold.svg +7 -0
  304. package/src/svg/icon-c/ic-text-italic.svg +6 -0
  305. package/src/svg/icon-c/ic-text-underline.svg +7 -0
  306. package/src/svg/icon-c/ic-text.svg +7 -0
  307. package/src/svg/icon-c/ic-undo.svg +7 -0
  308. package/src/svg/icon-c/ic-zoom-hand.svg +8 -0
  309. package/src/svg/icon-c/ic-zoom-zoom-in.svg +12 -0
  310. package/src/svg/icon-c/ic-zoom-zoom-out.svg +11 -0
  311. package/src/svg/icon-c/img-bi.svg +5 -0
  312. package/src/svg/icon-d/ic-apply.svg +6 -0
  313. package/src/svg/icon-d/ic-cancel.svg +6 -0
  314. package/src/svg/icon-d/ic-crop.svg +7 -0
  315. package/src/svg/icon-d/ic-delete-all.svg +6 -0
  316. package/src/svg/icon-d/ic-delete.svg +6 -0
  317. package/src/svg/icon-d/ic-draw-free.svg +5 -0
  318. package/src/svg/icon-d/ic-draw-line.svg +5 -0
  319. package/src/svg/icon-d/ic-draw.svg +6 -0
  320. package/src/svg/icon-d/ic-filter.svg +7 -0
  321. package/src/svg/icon-d/ic-flip-reset.svg +7 -0
  322. package/src/svg/icon-d/ic-flip-x.svg +6 -0
  323. package/src/svg/icon-d/ic-flip-y.svg +6 -0
  324. package/src/svg/icon-d/ic-flip.svg +6 -0
  325. package/src/svg/icon-d/ic-history-check.svg +5 -0
  326. package/src/svg/icon-d/ic-history-crop.svg +7 -0
  327. package/src/svg/icon-d/ic-history-delete.svg +9 -0
  328. package/src/svg/icon-d/ic-history-draw.svg +7 -0
  329. package/src/svg/icon-d/ic-history-filter.svg +8 -0
  330. package/src/svg/icon-d/ic-history-flip.svg +6 -0
  331. package/src/svg/icon-d/ic-history-group.svg +9 -0
  332. package/src/svg/icon-d/ic-history-icon.svg +6 -0
  333. package/src/svg/icon-d/ic-history-load.svg +7 -0
  334. package/src/svg/icon-d/ic-history-mask.svg +9 -0
  335. package/src/svg/icon-d/ic-history-resize.svg +12 -0
  336. package/src/svg/icon-d/ic-history-rotate.svg +16 -0
  337. package/src/svg/icon-d/ic-history-shape.svg +7 -0
  338. package/src/svg/icon-d/ic-history-text.svg +8 -0
  339. package/src/svg/icon-d/ic-history.svg +6 -0
  340. package/src/svg/icon-d/ic-icon-arrow-2.svg +5 -0
  341. package/src/svg/icon-d/ic-icon-arrow-3.svg +5 -0
  342. package/src/svg/icon-d/ic-icon-arrow.svg +5 -0
  343. package/src/svg/icon-d/ic-icon-bubble.svg +5 -0
  344. package/src/svg/icon-d/ic-icon-heart.svg +5 -0
  345. package/src/svg/icon-d/ic-icon-load.svg +8 -0
  346. package/src/svg/icon-d/ic-icon-location.svg +8 -0
  347. package/src/svg/icon-d/ic-icon-polygon.svg +5 -0
  348. package/src/svg/icon-d/ic-icon-star-2.svg +5 -0
  349. package/src/svg/icon-d/ic-icon-star.svg +5 -0
  350. package/src/svg/icon-d/ic-icon.svg +5 -0
  351. package/src/svg/icon-d/ic-mask-load.svg +8 -0
  352. package/src/svg/icon-d/ic-mask.svg +6 -0
  353. package/src/svg/icon-d/ic-redo.svg +7 -0
  354. package/src/svg/icon-d/ic-reset.svg +7 -0
  355. package/src/svg/icon-d/ic-resize.svg +13 -0
  356. package/src/svg/icon-d/ic-rotate-clockwise.svg +7 -0
  357. package/src/svg/icon-d/ic-rotate-counterclockwise.svg +7 -0
  358. package/src/svg/icon-d/ic-rotate.svg +7 -0
  359. package/src/svg/icon-d/ic-shape-circle.svg +5 -0
  360. package/src/svg/icon-d/ic-shape-rectangle.svg +5 -0
  361. package/src/svg/icon-d/ic-shape-triangle.svg +5 -0
  362. package/src/svg/icon-d/ic-shape.svg +6 -0
  363. package/src/svg/icon-d/ic-text-align-center.svg +6 -0
  364. package/src/svg/icon-d/ic-text-align-left.svg +6 -0
  365. package/src/svg/icon-d/ic-text-align-right.svg +6 -0
  366. package/src/svg/icon-d/ic-text-bold.svg +7 -0
  367. package/src/svg/icon-d/ic-text-italic.svg +6 -0
  368. package/src/svg/icon-d/ic-text-underline.svg +7 -0
  369. package/src/svg/icon-d/ic-text.svg +7 -0
  370. package/src/svg/icon-d/ic-undo.svg +7 -0
  371. package/src/svg/icon-d/ic-zoom-hand.svg +8 -0
  372. package/src/svg/icon-d/ic-zoom-zoom-in.svg +12 -0
  373. package/src/svg/icon-d/ic-zoom-zoom-out.svg +11 -0
  374. package/src/svg/icon-d/img-bi.svg +5 -0
@@ -0,0 +1,572 @@
1
+ import { fabric } from 'fabric';
2
+ import extend from 'tui-code-snippet/object/extend';
3
+ import isExisty from 'tui-code-snippet/type/isExisty';
4
+ import forEach from 'tui-code-snippet/collection/forEach';
5
+ import Component from '@/interface/component';
6
+ import { stamp } from '@/util';
7
+ import { componentNames, eventNames as events, fObjectOptions } from '@/consts';
8
+
9
+ const defaultStyles = {
10
+ fill: '#000000',
11
+ left: 0,
12
+ top: 0,
13
+ };
14
+ const resetStyles = {
15
+ fill: '#000000',
16
+ fontStyle: 'normal',
17
+ fontWeight: 'normal',
18
+ textAlign: 'tie-text-align-left',
19
+ underline: false,
20
+ };
21
+ const DBCLICK_TIME = 500;
22
+
23
+ /**
24
+ * Text
25
+ * @class Text
26
+ * @param {Graphics} graphics - Graphics instance
27
+ * @extends {Component}
28
+ * @ignore
29
+ */
30
+ class Text extends Component {
31
+ constructor(graphics) {
32
+ super(componentNames.TEXT, graphics);
33
+
34
+ /**
35
+ * Default text style
36
+ * @type {Object}
37
+ */
38
+ this._defaultStyles = defaultStyles;
39
+
40
+ /**
41
+ * Selected state
42
+ * @type {boolean}
43
+ */
44
+ this._isSelected = false;
45
+
46
+ /**
47
+ * Selected text object
48
+ * @type {Object}
49
+ */
50
+ this._selectedObj = {};
51
+
52
+ /**
53
+ * Editing text object
54
+ * @type {Object}
55
+ */
56
+ this._editingObj = {};
57
+
58
+ /**
59
+ * Listeners for fabric event
60
+ * @type {Object}
61
+ */
62
+ this._listeners = {
63
+ mousedown: this._onFabricMouseDown.bind(this),
64
+ select: this._onFabricSelect.bind(this),
65
+ selectClear: this._onFabricSelectClear.bind(this),
66
+ scaling: this._onFabricScaling.bind(this),
67
+ textChanged: this._onFabricTextChanged.bind(this),
68
+ };
69
+
70
+ /**
71
+ * Textarea element for editing
72
+ * @type {HTMLElement}
73
+ */
74
+ this._textarea = null;
75
+
76
+ /**
77
+ * Ratio of current canvas
78
+ * @type {number}
79
+ */
80
+ this._ratio = 1;
81
+
82
+ /**
83
+ * Last click time
84
+ * @type {Date}
85
+ */
86
+ this._lastClickTime = new Date().getTime();
87
+
88
+ /**
89
+ * Text object infos before editing
90
+ * @type {Object}
91
+ */
92
+ this._editingObjInfos = {};
93
+
94
+ /**
95
+ * Previous state of editing
96
+ * @type {boolean}
97
+ */
98
+ this.isPrevEditing = false;
99
+ }
100
+
101
+ /**
102
+ * Start input text mode
103
+ */
104
+ start() {
105
+ const canvas = this.getCanvas();
106
+
107
+ canvas.selection = false;
108
+ canvas.defaultCursor = 'text';
109
+ canvas.on({
110
+ 'mouse:down': this._listeners.mousedown,
111
+ 'selection:created': this._listeners.select,
112
+ 'selection:updated': this._listeners.select,
113
+ 'before:selection:cleared': this._listeners.selectClear,
114
+ 'object:scaling': this._listeners.scaling,
115
+ 'text:changed': this._listeners.textChanged,
116
+ });
117
+
118
+ canvas.forEachObject((obj) => {
119
+ if (obj.type === 'i-text') {
120
+ this.adjustOriginPosition(obj, 'start');
121
+ }
122
+ });
123
+
124
+ this.setCanvasRatio();
125
+ }
126
+
127
+ /**
128
+ * End input text mode
129
+ */
130
+ end() {
131
+ const canvas = this.getCanvas();
132
+
133
+ canvas.selection = true;
134
+ canvas.defaultCursor = 'default';
135
+
136
+ canvas.forEachObject((obj) => {
137
+ if (obj.type === 'i-text') {
138
+ if (obj.text === '') {
139
+ canvas.remove(obj);
140
+ } else {
141
+ this.adjustOriginPosition(obj, 'end');
142
+ }
143
+ }
144
+ });
145
+
146
+ canvas.off({
147
+ 'mouse:down': this._listeners.mousedown,
148
+ 'selection:created': this._listeners.select,
149
+ 'selection:updated': this._listeners.select,
150
+ 'before:selection:cleared': this._listeners.selectClear,
151
+ 'object:selected': this._listeners.select,
152
+ 'object:scaling': this._listeners.scaling,
153
+ 'text:changed': this._listeners.textChanged,
154
+ });
155
+ }
156
+
157
+ /**
158
+ * Adjust the origin position
159
+ * @param {fabric.Object} text - text object
160
+ * @param {string} editStatus - 'start' or 'end'
161
+ */
162
+ adjustOriginPosition(text, editStatus) {
163
+ let [originX, originY] = ['center', 'center'];
164
+ if (editStatus === 'start') {
165
+ [originX, originY] = ['left', 'top'];
166
+ }
167
+
168
+ const { x: left, y: top } = text.getPointByOrigin(originX, originY);
169
+ text.set({
170
+ left,
171
+ top,
172
+ originX,
173
+ originY,
174
+ });
175
+ text.setCoords();
176
+ }
177
+
178
+ /**
179
+ * Add new text on canvas image
180
+ * @param {string} text - Initial input text
181
+ * @param {Object} options - Options for generating text
182
+ * @param {Object} [options.styles] Initial styles
183
+ * @param {string} [options.styles.fill] Color
184
+ * @param {string} [options.styles.fontFamily] Font type for text
185
+ * @param {number} [options.styles.fontSize] Size
186
+ * @param {string} [options.styles.fontStyle] Type of inclination (normal / italic)
187
+ * @param {string} [options.styles.fontWeight] Type of thicker or thinner looking (normal / bold)
188
+ * @param {string} [options.styles.textAlign] Type of text align (left / center / right)
189
+ * @param {string} [options.styles.textDecoration] Type of line (underline / line-through / overline)
190
+ * @param {{x: number, y: number}} [options.position] - Initial position
191
+ * @returns {Promise}
192
+ */
193
+ add(text, options) {
194
+ return new Promise((resolve) => {
195
+ const canvas = this.getCanvas();
196
+ let newText = null;
197
+ let selectionStyle = fObjectOptions.SELECTION_STYLE;
198
+ let styles = this._defaultStyles;
199
+
200
+ this._setInitPos(options.position);
201
+
202
+ if (options.styles) {
203
+ styles = extend(styles, options.styles);
204
+ }
205
+
206
+ if (!isExisty(options.autofocus)) {
207
+ options.autofocus = true;
208
+ }
209
+
210
+ newText = new fabric.IText(text, styles);
211
+ selectionStyle = extend({}, selectionStyle, {
212
+ originX: 'left',
213
+ originY: 'top',
214
+ });
215
+
216
+ newText.set(selectionStyle);
217
+ newText.on({
218
+ mouseup: this._onFabricMouseUp.bind(this),
219
+ });
220
+
221
+ canvas.add(newText);
222
+
223
+ if (options.autofocus) {
224
+ newText.enterEditing();
225
+ newText.selectAll();
226
+ }
227
+
228
+ if (!canvas.getActiveObject()) {
229
+ canvas.setActiveObject(newText);
230
+ }
231
+
232
+ this.isPrevEditing = true;
233
+ resolve(this.graphics.createObjectProperties(newText));
234
+ });
235
+ }
236
+
237
+ /**
238
+ * Change text of activate object on canvas image
239
+ * @param {Object} activeObj - Current selected text object
240
+ * @param {string} text - Changed text
241
+ * @returns {Promise}
242
+ */
243
+ change(activeObj, text) {
244
+ return new Promise((resolve) => {
245
+ activeObj.set('text', text);
246
+
247
+ this.getCanvas().renderAll();
248
+ resolve();
249
+ });
250
+ }
251
+
252
+ /**
253
+ * Set style
254
+ * @param {Object} activeObj - Current selected text object
255
+ * @param {Object} styleObj - Initial styles
256
+ * @param {string} [styleObj.fill] Color
257
+ * @param {string} [styleObj.fontFamily] Font type for text
258
+ * @param {number} [styleObj.fontSize] Size
259
+ * @param {string} [styleObj.fontStyle] Type of inclination (normal / italic)
260
+ * @param {string} [styleObj.fontWeight] Type of thicker or thinner looking (normal / bold)
261
+ * @param {string} [styleObj.textAlign] Type of text align (left / center / right)
262
+ * @param {string} [styleObj.textDecoration] Type of line (underline / line-through / overline)
263
+ * @returns {Promise}
264
+ */
265
+ setStyle(activeObj, styleObj) {
266
+ return new Promise((resolve) => {
267
+ forEach(
268
+ styleObj,
269
+ (val, key) => {
270
+ if (activeObj[key] === val && key !== 'fontSize') {
271
+ styleObj[key] = resetStyles[key] || '';
272
+ }
273
+ },
274
+ this
275
+ );
276
+
277
+ if ('textDecoration' in styleObj) {
278
+ extend(styleObj, this._getTextDecorationAdaptObject(styleObj.textDecoration));
279
+ }
280
+
281
+ activeObj.set(styleObj);
282
+
283
+ this.getCanvas().renderAll();
284
+ resolve();
285
+ });
286
+ }
287
+
288
+ /**
289
+ * Get the text
290
+ * @param {Object} activeObj - Current selected text object
291
+ * @returns {String} text
292
+ */
293
+ getText(activeObj) {
294
+ return activeObj.text;
295
+ }
296
+
297
+ /**
298
+ * Set infos of the current selected object
299
+ * @param {fabric.Text} obj - Current selected text object
300
+ * @param {boolean} state - State of selecting
301
+ */
302
+ setSelectedInfo(obj, state) {
303
+ this._selectedObj = obj;
304
+ this._isSelected = state;
305
+ }
306
+
307
+ /**
308
+ * Whether object is selected or not
309
+ * @returns {boolean} State of selecting
310
+ */
311
+ isSelected() {
312
+ return this._isSelected;
313
+ }
314
+
315
+ /**
316
+ * Get current selected text object
317
+ * @returns {fabric.Text} Current selected text object
318
+ */
319
+ getSelectedObj() {
320
+ return this._selectedObj;
321
+ }
322
+
323
+ /**
324
+ * Set ratio value of canvas
325
+ */
326
+ setCanvasRatio() {
327
+ const canvasElement = this.getCanvasElement();
328
+ const cssWidth = parseInt(canvasElement.style.maxWidth, 10);
329
+ const originWidth = canvasElement.width;
330
+
331
+ this._ratio = originWidth / cssWidth;
332
+ }
333
+
334
+ /**
335
+ * Get ratio value of canvas
336
+ * @returns {number} Ratio value
337
+ */
338
+ getCanvasRatio() {
339
+ return this._ratio;
340
+ }
341
+
342
+ /**
343
+ * Get text decoration adapt object
344
+ * @param {string} textDecoration - text decoration option string
345
+ * @returns {object} adapt object for override
346
+ */
347
+ _getTextDecorationAdaptObject(textDecoration) {
348
+ return {
349
+ underline: textDecoration === 'underline',
350
+ linethrough: textDecoration === 'line-through',
351
+ overline: textDecoration === 'overline',
352
+ };
353
+ }
354
+
355
+ /**
356
+ * Set initial position on canvas image
357
+ * @param {{x: number, y: number}} [position] - Selected position
358
+ * @private
359
+ */
360
+ _setInitPos(position) {
361
+ position = position || this.getCanvasImage().getCenterPoint();
362
+
363
+ this._defaultStyles.left = position.x;
364
+ this._defaultStyles.top = position.y;
365
+ }
366
+
367
+ /**
368
+ * Input event handler
369
+ * @private
370
+ */
371
+ _onInput() {
372
+ const ratio = this.getCanvasRatio();
373
+ const obj = this._editingObj;
374
+ const textareaStyle = this._textarea.style;
375
+
376
+ textareaStyle.width = `${Math.ceil(obj.width / ratio)}px`;
377
+ textareaStyle.height = `${Math.ceil(obj.height / ratio)}px`;
378
+ }
379
+
380
+ /**
381
+ * Keydown event handler
382
+ * @private
383
+ */
384
+ _onKeyDown() {
385
+ const ratio = this.getCanvasRatio();
386
+ const obj = this._editingObj;
387
+ const textareaStyle = this._textarea.style;
388
+
389
+ setTimeout(() => {
390
+ obj.text(this._textarea.value);
391
+
392
+ textareaStyle.width = `${Math.ceil(obj.width / ratio)}px`;
393
+ textareaStyle.height = `${Math.ceil(obj.height / ratio)}px`;
394
+ }, 0);
395
+ }
396
+
397
+ /**
398
+ * Blur event handler
399
+ * @private
400
+ */
401
+ _onBlur() {
402
+ const ratio = this.getCanvasRatio();
403
+ const editingObj = this._editingObj;
404
+ const editingObjInfos = this._editingObjInfos;
405
+ const textContent = this._textarea.value;
406
+ let transWidth = editingObj.width / ratio - editingObjInfos.width / ratio;
407
+ let transHeight = editingObj.height / ratio - editingObjInfos.height / ratio;
408
+
409
+ if (ratio === 1) {
410
+ transWidth /= 2;
411
+ transHeight /= 2;
412
+ }
413
+
414
+ this._textarea.style.display = 'none';
415
+
416
+ editingObj.set({
417
+ left: editingObjInfos.left + transWidth,
418
+ top: editingObjInfos.top + transHeight,
419
+ });
420
+
421
+ if (textContent.length) {
422
+ this.getCanvas().add(editingObj);
423
+
424
+ const params = {
425
+ id: stamp(editingObj),
426
+ type: editingObj.type,
427
+ text: textContent,
428
+ };
429
+
430
+ this.fire(events.TEXT_CHANGED, params);
431
+ }
432
+ }
433
+
434
+ /**
435
+ * Scroll event handler
436
+ * @private
437
+ */
438
+ _onScroll() {
439
+ this._textarea.scrollLeft = 0;
440
+ this._textarea.scrollTop = 0;
441
+ }
442
+
443
+ /**
444
+ * Fabric scaling event handler
445
+ * @param {fabric.Event} fEvent - Current scaling event on selected object
446
+ * @private
447
+ */
448
+ _onFabricScaling(fEvent) {
449
+ const obj = fEvent.target;
450
+
451
+ obj.fontSize = obj.fontSize * obj.scaleY;
452
+ obj.scaleX = 1;
453
+ obj.scaleY = 1;
454
+ }
455
+
456
+ /**
457
+ * textChanged event handler
458
+ * @param {{target: fabric.Object}} props - changed text object
459
+ * @private
460
+ */
461
+ _onFabricTextChanged(props) {
462
+ this.fire(events.TEXT_CHANGED, props.target);
463
+ }
464
+
465
+ /**
466
+ * onSelectClear handler in fabric canvas
467
+ * @param {{target: fabric.Object, e: MouseEvent}} fEvent - Fabric event
468
+ * @private
469
+ */
470
+ _onFabricSelectClear(fEvent) {
471
+ const obj = this.getSelectedObj();
472
+
473
+ this.isPrevEditing = true;
474
+
475
+ this.setSelectedInfo(fEvent.target, false);
476
+
477
+ if (obj) {
478
+ // obj is empty object at initial time, will be set fabric object
479
+ if (obj.text === '') {
480
+ this.getCanvas().remove(obj);
481
+ }
482
+ }
483
+ }
484
+
485
+ /**
486
+ * onSelect handler in fabric canvas
487
+ * @param {{target: fabric.Object, e: MouseEvent}} fEvent - Fabric event
488
+ * @private
489
+ */
490
+ _onFabricSelect(fEvent) {
491
+ this.isPrevEditing = true;
492
+
493
+ this.setSelectedInfo(fEvent.target, true);
494
+ }
495
+
496
+ /**
497
+ * Fabric 'mousedown' event handler
498
+ * @param {fabric.Event} fEvent - Current mousedown event on selected object
499
+ * @private
500
+ */
501
+ _onFabricMouseDown(fEvent) {
502
+ const obj = fEvent.target;
503
+
504
+ if (obj && !obj.isType('text')) {
505
+ return;
506
+ }
507
+
508
+ if (this.isPrevEditing) {
509
+ this.isPrevEditing = false;
510
+
511
+ return;
512
+ }
513
+
514
+ this._fireAddText(fEvent);
515
+ }
516
+
517
+ /**
518
+ * Fire 'addText' event if object is not selected.
519
+ * @param {fabric.Event} fEvent - Current mousedown event on selected object
520
+ * @private
521
+ */
522
+ _fireAddText(fEvent) {
523
+ const obj = fEvent.target;
524
+ const e = fEvent.e || {};
525
+ const originPointer = this.getCanvas().getPointer(e);
526
+
527
+ if (!obj) {
528
+ this.fire(events.ADD_TEXT, {
529
+ originPosition: {
530
+ x: originPointer.x,
531
+ y: originPointer.y,
532
+ },
533
+ clientPosition: {
534
+ x: e.clientX || 0,
535
+ y: e.clientY || 0,
536
+ },
537
+ });
538
+ }
539
+ }
540
+
541
+ /**
542
+ * Fabric mouseup event handler
543
+ * @param {fabric.Event} fEvent - Current mousedown event on selected object
544
+ * @private
545
+ */
546
+ _onFabricMouseUp(fEvent) {
547
+ const { target } = fEvent;
548
+ const newClickTime = new Date().getTime();
549
+
550
+ if (this._isDoubleClick(newClickTime) && !target.isEditing) {
551
+ target.enterEditing();
552
+ }
553
+
554
+ if (target.isEditing) {
555
+ this.fire(events.TEXT_EDITING); // fire editing text event
556
+ }
557
+
558
+ this._lastClickTime = newClickTime;
559
+ }
560
+
561
+ /**
562
+ * Get state of firing double click event
563
+ * @param {Date} newClickTime - Current clicked time
564
+ * @returns {boolean} Whether double clicked or not
565
+ * @private
566
+ */
567
+ _isDoubleClick(newClickTime) {
568
+ return newClickTime - this._lastClickTime < DBCLICK_TIME;
569
+ }
570
+ }
571
+
572
+ export default Text;