@antv/infographic 0.1.2 → 0.1.4

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 (676) hide show
  1. package/README.md +26 -2
  2. package/README.zh-CN.md +26 -3
  3. package/dist/infographic.min.js +491 -81
  4. package/dist/infographic.min.js.map +1 -1
  5. package/esm/constants/components.d.ts +1 -0
  6. package/esm/constants/components.js +1 -0
  7. package/esm/constants/element.d.ts +17 -6
  8. package/esm/constants/index.d.ts +3 -0
  9. package/esm/constants/index.js +3 -0
  10. package/esm/constants/service.d.ts +1 -0
  11. package/esm/constants/service.js +1 -0
  12. package/esm/constants/shape.d.ts +16 -0
  13. package/esm/designs/components/Btn.js +2 -2
  14. package/esm/designs/components/BtnsGroup.js +1 -1
  15. package/esm/designs/components/Illus.js +2 -2
  16. package/esm/designs/components/ItemDesc.js +1 -2
  17. package/esm/designs/components/ItemIcon.js +1 -1
  18. package/esm/designs/components/ItemLabel.js +1 -2
  19. package/esm/designs/components/ItemValue.js +1 -2
  20. package/esm/designs/components/ItemsGroup.js +1 -1
  21. package/esm/designs/components/Title.js +2 -5
  22. package/esm/designs/items/CandyCardLite.js +1 -1
  23. package/esm/designs/items/CircularProgress.js +2 -1
  24. package/esm/designs/items/HorizontalIconArrow.js +1 -2
  25. package/esm/designs/items/HorizontalIconLine.js +1 -1
  26. package/esm/designs/items/IconBadge.js +1 -1
  27. package/esm/designs/items/LinedText.d.ts +12 -0
  28. package/esm/designs/items/LinedText.js +57 -0
  29. package/esm/designs/items/PlainText.d.ts +1 -0
  30. package/esm/designs/items/PlainText.js +16 -3
  31. package/esm/designs/items/QuarterCircular.js +1 -31
  32. package/esm/designs/items/index.d.ts +1 -0
  33. package/esm/designs/items/index.js +1 -0
  34. package/esm/designs/layouts/Align.js +31 -45
  35. package/esm/designs/layouts/Flex.js +33 -29
  36. package/esm/designs/structures/chart-bar.d.ts +15 -0
  37. package/esm/designs/structures/chart-bar.js +99 -0
  38. package/esm/designs/structures/chart-line.d.ts +12 -0
  39. package/esm/designs/structures/chart-line.js +164 -0
  40. package/esm/designs/structures/chart-pie.d.ts +9 -0
  41. package/esm/designs/structures/chart-pie.js +127 -0
  42. package/esm/designs/structures/chart-wordcloud.d.ts +11 -0
  43. package/esm/designs/structures/chart-wordcloud.js +156 -0
  44. package/esm/designs/structures/compare-binary-horizontal/dividers/pros-cons-arrow.js +1 -1
  45. package/esm/designs/structures/hierarchy-mindmap.d.ts +24 -0
  46. package/esm/designs/structures/hierarchy-mindmap.js +199 -0
  47. package/esm/designs/structures/hierarchy-tree.d.ts +2 -0
  48. package/esm/designs/structures/hierarchy-tree.js +179 -50
  49. package/esm/designs/structures/index.d.ts +6 -0
  50. package/esm/designs/structures/index.js +6 -0
  51. package/esm/designs/structures/list-sector.js +1 -1
  52. package/esm/designs/structures/sequence-circular.js +1 -1
  53. package/esm/designs/structures/sequence-cylinders-3d.js +4 -4
  54. package/esm/designs/structures/sequence-roadmap-vertical.js +1 -1
  55. package/esm/designs/structures/sequence-stairs-front.d.ts +8 -0
  56. package/esm/designs/structures/sequence-stairs-front.js +116 -0
  57. package/esm/designs/structures/sequence-zigzag-pucks-3d.js +5 -5
  58. package/esm/designs/types.d.ts +8 -0
  59. package/esm/editor/commands/Batch.d.ts +11 -0
  60. package/esm/editor/commands/Batch.js +21 -0
  61. package/esm/editor/commands/UpdateElement.d.ts +16 -0
  62. package/esm/editor/commands/UpdateElement.js +83 -0
  63. package/esm/editor/commands/UpdateOptions.d.ts +14 -0
  64. package/esm/editor/commands/UpdateOptions.js +25 -0
  65. package/esm/editor/commands/UpdateText.d.ts +16 -0
  66. package/esm/editor/commands/UpdateText.js +40 -0
  67. package/esm/editor/commands/index.d.ts +4 -0
  68. package/esm/editor/commands/index.js +4 -0
  69. package/esm/editor/editor.d.ts +16 -0
  70. package/esm/editor/editor.js +50 -0
  71. package/esm/editor/index.d.ts +4 -0
  72. package/esm/editor/index.js +3 -0
  73. package/esm/editor/interactions/base.d.ts +12 -0
  74. package/esm/editor/interactions/base.js +5 -0
  75. package/esm/editor/interactions/brush-select.d.ts +23 -0
  76. package/esm/editor/interactions/brush-select.js +167 -0
  77. package/esm/editor/interactions/click-select.d.ts +12 -0
  78. package/esm/editor/interactions/click-select.js +67 -0
  79. package/esm/editor/interactions/dblclick-edit-text.d.ts +10 -0
  80. package/esm/editor/interactions/dblclick-edit-text.js +204 -0
  81. package/esm/editor/interactions/drag-element.d.ts +41 -0
  82. package/esm/editor/interactions/drag-element.js +391 -0
  83. package/esm/editor/interactions/hotkey-history.d.ts +10 -0
  84. package/esm/editor/interactions/hotkey-history.js +27 -0
  85. package/esm/editor/interactions/index.d.ts +8 -0
  86. package/esm/editor/interactions/index.js +8 -0
  87. package/esm/editor/interactions/select-highlight.d.ts +16 -0
  88. package/esm/editor/interactions/select-highlight.js +99 -0
  89. package/esm/editor/interactions/zoom-wheel.d.ts +8 -0
  90. package/esm/editor/interactions/zoom-wheel.js +46 -0
  91. package/esm/editor/managers/command.d.ts +19 -0
  92. package/esm/editor/managers/command.js +63 -0
  93. package/esm/editor/managers/index.d.ts +4 -0
  94. package/esm/editor/managers/index.js +4 -0
  95. package/esm/editor/managers/interaction.d.ts +33 -0
  96. package/esm/editor/managers/interaction.js +196 -0
  97. package/esm/editor/managers/plugin.d.ts +14 -0
  98. package/esm/editor/managers/plugin.js +45 -0
  99. package/esm/editor/managers/state.d.ts +22 -0
  100. package/esm/editor/managers/state.js +141 -0
  101. package/esm/editor/plugins/base.d.ts +12 -0
  102. package/esm/editor/plugins/base.js +5 -0
  103. package/esm/editor/plugins/edit-bar/components/button.d.ts +12 -0
  104. package/esm/editor/plugins/edit-bar/components/button.js +53 -0
  105. package/esm/editor/plugins/edit-bar/components/color-picker.d.ts +10 -0
  106. package/esm/editor/plugins/edit-bar/components/color-picker.js +351 -0
  107. package/esm/editor/plugins/edit-bar/components/icons.d.ts +26 -0
  108. package/esm/editor/plugins/edit-bar/components/icons.js +30 -0
  109. package/esm/editor/plugins/edit-bar/components/index.d.ts +5 -0
  110. package/esm/editor/plugins/edit-bar/components/index.js +5 -0
  111. package/esm/editor/plugins/edit-bar/components/popover.d.ts +23 -0
  112. package/esm/editor/plugins/edit-bar/components/popover.js +378 -0
  113. package/esm/editor/plugins/edit-bar/components/select.d.ts +22 -0
  114. package/esm/editor/plugins/edit-bar/components/select.js +201 -0
  115. package/esm/editor/plugins/edit-bar/edit-bar.d.ts +32 -0
  116. package/esm/editor/plugins/edit-bar/edit-bar.js +211 -0
  117. package/esm/editor/plugins/edit-bar/edit-items/align-elements.d.ts +2 -0
  118. package/esm/editor/plugins/edit-bar/edit-items/align-elements.js +312 -0
  119. package/esm/editor/plugins/edit-bar/edit-items/font-align.d.ts +3 -0
  120. package/esm/editor/plugins/edit-bar/edit-items/font-align.js +81 -0
  121. package/esm/editor/plugins/edit-bar/edit-items/font-color.d.ts +3 -0
  122. package/esm/editor/plugins/edit-bar/edit-items/font-color.js +77 -0
  123. package/esm/editor/plugins/edit-bar/edit-items/font-family.d.ts +3 -0
  124. package/esm/editor/plugins/edit-bar/edit-items/font-family.js +115 -0
  125. package/esm/editor/plugins/edit-bar/edit-items/font-size.d.ts +3 -0
  126. package/esm/editor/plugins/edit-bar/edit-items/font-size.js +88 -0
  127. package/esm/editor/plugins/edit-bar/edit-items/icon-color.d.ts +3 -0
  128. package/esm/editor/plugins/edit-bar/edit-items/icon-color.js +77 -0
  129. package/esm/editor/plugins/edit-bar/edit-items/index.d.ts +7 -0
  130. package/esm/editor/plugins/edit-bar/edit-items/index.js +6 -0
  131. package/esm/editor/plugins/edit-bar/edit-items/types.d.ts +3 -0
  132. package/esm/editor/plugins/edit-bar/index.d.ts +4 -0
  133. package/esm/editor/plugins/edit-bar/index.js +2 -0
  134. package/esm/editor/plugins/edit-bar/utils.d.ts +4 -0
  135. package/esm/editor/plugins/edit-bar/utils.js +14 -0
  136. package/esm/editor/plugins/index.d.ts +3 -0
  137. package/esm/editor/plugins/index.js +3 -0
  138. package/esm/editor/plugins/resize-element.d.ts +45 -0
  139. package/esm/editor/plugins/resize-element.js +393 -0
  140. package/esm/editor/types/command.d.ts +28 -0
  141. package/esm/editor/types/command.js +1 -0
  142. package/esm/editor/types/editor.d.ts +4 -0
  143. package/esm/editor/types/editor.js +1 -0
  144. package/esm/editor/types/index.d.ts +7 -0
  145. package/esm/editor/types/index.js +1 -0
  146. package/esm/editor/types/interaction.d.ts +44 -0
  147. package/esm/editor/types/interaction.js +1 -0
  148. package/esm/editor/types/plugin.d.ts +30 -0
  149. package/esm/editor/types/plugin.js +1 -0
  150. package/esm/editor/types/selection.d.ts +2 -0
  151. package/esm/editor/types/selection.js +1 -0
  152. package/esm/editor/types/shape.d.ts +16 -0
  153. package/esm/editor/types/shape.js +1 -0
  154. package/esm/editor/types/state.d.ts +57 -0
  155. package/esm/editor/types/state.js +1 -0
  156. package/esm/editor/utils/click-handler.d.ts +28 -0
  157. package/esm/editor/utils/click-handler.js +97 -0
  158. package/esm/editor/utils/coordinate.d.ts +6 -0
  159. package/esm/editor/utils/coordinate.js +31 -0
  160. package/esm/editor/utils/data.d.ts +10 -0
  161. package/esm/editor/utils/data.js +18 -0
  162. package/esm/editor/utils/element.d.ts +2 -0
  163. package/esm/editor/utils/element.js +9 -0
  164. package/esm/editor/utils/event.d.ts +3 -0
  165. package/esm/editor/utils/event.js +63 -0
  166. package/esm/editor/utils/extension.d.ts +13 -0
  167. package/esm/editor/utils/extension.js +39 -0
  168. package/esm/editor/utils/hotkey.d.ts +20 -0
  169. package/esm/editor/utils/hotkey.js +109 -0
  170. package/esm/editor/utils/index.d.ts +7 -0
  171. package/esm/editor/utils/index.js +7 -0
  172. package/esm/exporter/svg.js +7 -5
  173. package/esm/index.d.ts +7 -2
  174. package/esm/index.js +3 -0
  175. package/esm/jsx/components/Polygon.js +2 -1
  176. package/esm/jsx/components/Text.js +66 -68
  177. package/esm/options/parser.d.ts +1 -1
  178. package/esm/options/parser.js +33 -15
  179. package/esm/options/types.d.ts +15 -2
  180. package/esm/renderer/composites/background.js +2 -2
  181. package/esm/renderer/composites/button.js +4 -3
  182. package/esm/renderer/composites/icon.d.ts +1 -1
  183. package/esm/renderer/composites/icon.js +3 -1
  184. package/esm/renderer/composites/illus.js +1 -1
  185. package/esm/renderer/composites/text.js +2 -1
  186. package/esm/renderer/renderer.js +3 -2
  187. package/esm/renderer/stylize/rough.js +3 -7
  188. package/esm/renderer/types/index.d.ts +0 -1
  189. package/esm/resource/loader.d.ts +2 -2
  190. package/esm/resource/loader.js +22 -11
  191. package/esm/resource/loaders/index.d.ts +1 -0
  192. package/esm/resource/loaders/index.js +1 -0
  193. package/esm/resource/loaders/remote.d.ts +1 -1
  194. package/esm/resource/loaders/remote.js +10 -2
  195. package/esm/resource/loaders/search.d.ts +1 -0
  196. package/esm/resource/loaders/search.js +51 -0
  197. package/esm/resource/types/index.d.ts +1 -0
  198. package/esm/resource/types/resource.d.ts +8 -1
  199. package/esm/resource/types/scene.d.ts +1 -0
  200. package/esm/resource/types/scene.js +1 -0
  201. package/esm/resource/utils/data-uri.js +20 -11
  202. package/esm/resource/utils/index.d.ts +0 -1
  203. package/esm/resource/utils/index.js +0 -1
  204. package/esm/resource/utils/parser.js +92 -1
  205. package/esm/resource/utils/ref.js +3 -3
  206. package/esm/runtime/Infographic.d.ts +14 -7
  207. package/esm/runtime/Infographic.js +70 -10
  208. package/esm/runtime/options.d.ts +2 -0
  209. package/esm/runtime/options.js +24 -0
  210. package/esm/runtime/utils.d.ts +4 -0
  211. package/esm/runtime/utils.js +38 -0
  212. package/esm/syntax/index.d.ts +3 -0
  213. package/esm/syntax/index.js +101 -0
  214. package/esm/syntax/mapper.d.ts +3 -0
  215. package/esm/syntax/mapper.js +238 -0
  216. package/esm/syntax/parser.d.ts +14 -0
  217. package/esm/syntax/parser.js +142 -0
  218. package/esm/syntax/schema.d.ts +6 -0
  219. package/esm/syntax/schema.js +74 -0
  220. package/esm/syntax/types.d.ts +61 -0
  221. package/esm/syntax/types.js +1 -0
  222. package/esm/templates/built-in.js +116 -1
  223. package/esm/templates/hierarchy-mindmap.d.ts +2 -0
  224. package/esm/templates/hierarchy-mindmap.js +61 -0
  225. package/esm/templates/hierarchy-tree.js +25 -11
  226. package/esm/templates/sequence-stairs.d.ts +2 -0
  227. package/esm/templates/sequence-stairs.js +42 -0
  228. package/esm/templates/word-cloud.d.ts +2 -0
  229. package/esm/templates/word-cloud.js +19 -0
  230. package/esm/themes/types.d.ts +1 -1
  231. package/esm/types/attrs.d.ts +15 -13
  232. package/esm/types/data.d.ts +2 -0
  233. package/esm/types/element.d.ts +1 -1
  234. package/esm/types/event.d.ts +6 -0
  235. package/esm/types/event.js +1 -0
  236. package/esm/types/index.d.ts +2 -0
  237. package/esm/{renderer/types → types}/text.d.ts +0 -1
  238. package/esm/types/text.js +1 -0
  239. package/esm/utils/attrs.d.ts +1 -0
  240. package/esm/utils/attrs.js +9 -0
  241. package/esm/utils/design.d.ts +2 -0
  242. package/esm/utils/design.js +10 -0
  243. package/esm/utils/element.d.ts +4 -0
  244. package/esm/utils/element.js +13 -0
  245. package/esm/utils/font.js +11 -1
  246. package/esm/utils/icon.d.ts +5 -3
  247. package/esm/utils/icon.js +38 -19
  248. package/esm/utils/index.d.ts +6 -0
  249. package/esm/utils/index.js +6 -0
  250. package/esm/utils/measure-text.d.ts +5 -0
  251. package/esm/utils/measure-text.js +22 -0
  252. package/esm/utils/recognizer.d.ts +15 -0
  253. package/esm/utils/recognizer.js +61 -1
  254. package/esm/utils/style.d.ts +1 -0
  255. package/esm/utils/style.js +8 -0
  256. package/esm/utils/text.d.ts +7 -0
  257. package/esm/utils/text.js +110 -35
  258. package/lib/constants/components.d.ts +1 -0
  259. package/lib/constants/components.js +4 -0
  260. package/lib/constants/element.d.ts +17 -6
  261. package/lib/constants/index.d.ts +3 -0
  262. package/lib/constants/index.js +3 -0
  263. package/lib/constants/service.d.ts +1 -0
  264. package/lib/constants/service.js +4 -0
  265. package/lib/constants/shape.d.ts +16 -0
  266. package/lib/designs/components/Btn.js +2 -2
  267. package/lib/designs/components/BtnsGroup.js +1 -1
  268. package/lib/designs/components/Illus.js +2 -2
  269. package/lib/designs/components/ItemDesc.js +1 -2
  270. package/lib/designs/components/ItemIcon.js +1 -1
  271. package/lib/designs/components/ItemLabel.js +1 -2
  272. package/lib/designs/components/ItemValue.js +1 -2
  273. package/lib/designs/components/ItemsGroup.js +1 -1
  274. package/lib/designs/components/Title.js +2 -5
  275. package/lib/designs/items/CandyCardLite.js +1 -1
  276. package/lib/designs/items/CircularProgress.js +2 -1
  277. package/lib/designs/items/HorizontalIconArrow.js +1 -2
  278. package/lib/designs/items/HorizontalIconLine.js +1 -1
  279. package/lib/designs/items/IconBadge.js +1 -1
  280. package/lib/designs/items/LinedText.d.ts +12 -0
  281. package/lib/designs/items/LinedText.js +61 -0
  282. package/lib/designs/items/PlainText.d.ts +1 -0
  283. package/lib/designs/items/PlainText.js +16 -3
  284. package/lib/designs/items/QuarterCircular.js +1 -31
  285. package/lib/designs/items/index.d.ts +1 -0
  286. package/lib/designs/items/index.js +1 -0
  287. package/lib/designs/layouts/Align.js +31 -45
  288. package/lib/designs/layouts/Flex.js +33 -29
  289. package/lib/designs/structures/chart-bar.d.ts +15 -0
  290. package/lib/designs/structures/chart-bar.js +103 -0
  291. package/lib/designs/structures/chart-line.d.ts +12 -0
  292. package/lib/designs/structures/chart-line.js +168 -0
  293. package/lib/designs/structures/chart-pie.d.ts +9 -0
  294. package/lib/designs/structures/chart-pie.js +131 -0
  295. package/lib/designs/structures/chart-wordcloud.d.ts +11 -0
  296. package/lib/designs/structures/chart-wordcloud.js +160 -0
  297. package/lib/designs/structures/compare-binary-horizontal/dividers/pros-cons-arrow.js +1 -1
  298. package/lib/designs/structures/hierarchy-mindmap.d.ts +24 -0
  299. package/lib/designs/structures/hierarchy-mindmap.js +203 -0
  300. package/lib/designs/structures/hierarchy-tree.d.ts +2 -0
  301. package/lib/designs/structures/hierarchy-tree.js +179 -50
  302. package/lib/designs/structures/index.d.ts +6 -0
  303. package/lib/designs/structures/index.js +6 -0
  304. package/lib/designs/structures/list-sector.js +1 -1
  305. package/lib/designs/structures/sequence-circular.js +1 -1
  306. package/lib/designs/structures/sequence-cylinders-3d.js +4 -4
  307. package/lib/designs/structures/sequence-roadmap-vertical.js +1 -1
  308. package/lib/designs/structures/sequence-stairs-front.d.ts +8 -0
  309. package/lib/designs/structures/sequence-stairs-front.js +120 -0
  310. package/lib/designs/structures/sequence-zigzag-pucks-3d.js +5 -5
  311. package/lib/designs/types.d.ts +8 -0
  312. package/lib/editor/commands/Batch.d.ts +11 -0
  313. package/lib/editor/commands/Batch.js +25 -0
  314. package/lib/editor/commands/UpdateElement.d.ts +16 -0
  315. package/lib/editor/commands/UpdateElement.js +87 -0
  316. package/lib/editor/commands/UpdateOptions.d.ts +14 -0
  317. package/lib/editor/commands/UpdateOptions.js +29 -0
  318. package/lib/editor/commands/UpdateText.d.ts +16 -0
  319. package/lib/editor/commands/UpdateText.js +44 -0
  320. package/lib/editor/commands/index.d.ts +4 -0
  321. package/lib/editor/commands/index.js +20 -0
  322. package/lib/editor/editor.d.ts +16 -0
  323. package/lib/editor/editor.js +54 -0
  324. package/lib/editor/index.d.ts +4 -0
  325. package/lib/editor/index.js +21 -0
  326. package/lib/editor/interactions/base.d.ts +12 -0
  327. package/lib/editor/interactions/base.js +9 -0
  328. package/lib/editor/interactions/brush-select.d.ts +23 -0
  329. package/lib/editor/interactions/brush-select.js +171 -0
  330. package/lib/editor/interactions/click-select.d.ts +12 -0
  331. package/lib/editor/interactions/click-select.js +71 -0
  332. package/lib/editor/interactions/dblclick-edit-text.d.ts +10 -0
  333. package/lib/editor/interactions/dblclick-edit-text.js +208 -0
  334. package/lib/editor/interactions/drag-element.d.ts +41 -0
  335. package/lib/editor/interactions/drag-element.js +395 -0
  336. package/lib/editor/interactions/hotkey-history.d.ts +10 -0
  337. package/lib/editor/interactions/hotkey-history.js +31 -0
  338. package/lib/editor/interactions/index.d.ts +8 -0
  339. package/lib/editor/interactions/index.js +19 -0
  340. package/lib/editor/interactions/select-highlight.d.ts +16 -0
  341. package/lib/editor/interactions/select-highlight.js +103 -0
  342. package/lib/editor/interactions/zoom-wheel.d.ts +8 -0
  343. package/lib/editor/interactions/zoom-wheel.js +50 -0
  344. package/lib/editor/managers/command.d.ts +19 -0
  345. package/lib/editor/managers/command.js +67 -0
  346. package/lib/editor/managers/index.d.ts +4 -0
  347. package/lib/editor/managers/index.js +20 -0
  348. package/lib/editor/managers/interaction.d.ts +33 -0
  349. package/lib/editor/managers/interaction.js +200 -0
  350. package/lib/editor/managers/plugin.d.ts +14 -0
  351. package/lib/editor/managers/plugin.js +49 -0
  352. package/lib/editor/managers/state.d.ts +22 -0
  353. package/lib/editor/managers/state.js +145 -0
  354. package/lib/editor/plugins/base.d.ts +12 -0
  355. package/lib/editor/plugins/base.js +9 -0
  356. package/lib/editor/plugins/edit-bar/components/button.d.ts +12 -0
  357. package/lib/editor/plugins/edit-bar/components/button.js +57 -0
  358. package/lib/editor/plugins/edit-bar/components/color-picker.d.ts +10 -0
  359. package/lib/editor/plugins/edit-bar/components/color-picker.js +354 -0
  360. package/lib/editor/plugins/edit-bar/components/icons.d.ts +26 -0
  361. package/lib/editor/plugins/edit-bar/components/icons.js +33 -0
  362. package/lib/editor/plugins/edit-bar/components/index.d.ts +5 -0
  363. package/lib/editor/plugins/edit-bar/components/index.js +21 -0
  364. package/lib/editor/plugins/edit-bar/components/popover.d.ts +23 -0
  365. package/lib/editor/plugins/edit-bar/components/popover.js +381 -0
  366. package/lib/editor/plugins/edit-bar/components/select.d.ts +22 -0
  367. package/lib/editor/plugins/edit-bar/components/select.js +204 -0
  368. package/lib/editor/plugins/edit-bar/edit-bar.d.ts +32 -0
  369. package/lib/editor/plugins/edit-bar/edit-bar.js +215 -0
  370. package/lib/editor/plugins/edit-bar/edit-items/align-elements.d.ts +2 -0
  371. package/lib/editor/plugins/edit-bar/edit-items/align-elements.js +316 -0
  372. package/lib/editor/plugins/edit-bar/edit-items/font-align.d.ts +3 -0
  373. package/lib/editor/plugins/edit-bar/edit-items/font-align.js +85 -0
  374. package/lib/editor/plugins/edit-bar/edit-items/font-color.d.ts +3 -0
  375. package/lib/editor/plugins/edit-bar/edit-items/font-color.js +81 -0
  376. package/lib/editor/plugins/edit-bar/edit-items/font-family.d.ts +3 -0
  377. package/lib/editor/plugins/edit-bar/edit-items/font-family.js +119 -0
  378. package/lib/editor/plugins/edit-bar/edit-items/font-size.d.ts +3 -0
  379. package/lib/editor/plugins/edit-bar/edit-items/font-size.js +92 -0
  380. package/lib/editor/plugins/edit-bar/edit-items/icon-color.d.ts +3 -0
  381. package/lib/editor/plugins/edit-bar/edit-items/icon-color.js +81 -0
  382. package/lib/editor/plugins/edit-bar/edit-items/index.d.ts +7 -0
  383. package/lib/editor/plugins/edit-bar/edit-items/index.js +22 -0
  384. package/lib/editor/plugins/edit-bar/edit-items/types.d.ts +3 -0
  385. package/lib/editor/plugins/edit-bar/index.d.ts +4 -0
  386. package/lib/editor/plugins/edit-bar/index.js +9 -0
  387. package/lib/editor/plugins/edit-bar/utils.d.ts +4 -0
  388. package/lib/editor/plugins/edit-bar/utils.js +17 -0
  389. package/lib/editor/plugins/index.d.ts +3 -0
  390. package/lib/editor/plugins/index.js +22 -0
  391. package/lib/editor/plugins/resize-element.d.ts +45 -0
  392. package/lib/editor/plugins/resize-element.js +397 -0
  393. package/lib/editor/types/command.d.ts +28 -0
  394. package/lib/editor/types/command.js +2 -0
  395. package/lib/editor/types/editor.d.ts +4 -0
  396. package/lib/editor/types/editor.js +2 -0
  397. package/lib/editor/types/index.d.ts +7 -0
  398. package/lib/editor/types/index.js +2 -0
  399. package/lib/editor/types/interaction.d.ts +44 -0
  400. package/lib/editor/types/interaction.js +2 -0
  401. package/lib/editor/types/plugin.d.ts +30 -0
  402. package/lib/editor/types/plugin.js +2 -0
  403. package/lib/editor/types/selection.d.ts +2 -0
  404. package/lib/editor/types/selection.js +2 -0
  405. package/lib/editor/types/shape.d.ts +16 -0
  406. package/lib/editor/types/shape.js +2 -0
  407. package/lib/editor/types/state.d.ts +57 -0
  408. package/lib/editor/types/state.js +2 -0
  409. package/lib/editor/utils/click-handler.d.ts +28 -0
  410. package/lib/editor/utils/click-handler.js +101 -0
  411. package/lib/editor/utils/coordinate.d.ts +6 -0
  412. package/lib/editor/utils/coordinate.js +38 -0
  413. package/lib/editor/utils/data.d.ts +10 -0
  414. package/lib/editor/utils/data.js +22 -0
  415. package/lib/editor/utils/element.d.ts +2 -0
  416. package/lib/editor/utils/element.js +12 -0
  417. package/lib/editor/utils/event.d.ts +3 -0
  418. package/lib/editor/utils/event.js +67 -0
  419. package/lib/editor/utils/extension.d.ts +13 -0
  420. package/lib/editor/utils/extension.js +43 -0
  421. package/lib/editor/utils/hotkey.d.ts +20 -0
  422. package/lib/editor/utils/hotkey.js +113 -0
  423. package/lib/editor/utils/index.d.ts +7 -0
  424. package/lib/editor/utils/index.js +23 -0
  425. package/lib/exporter/svg.js +6 -4
  426. package/lib/index.d.ts +7 -2
  427. package/lib/index.js +17 -1
  428. package/lib/jsx/components/Polygon.js +2 -1
  429. package/lib/jsx/components/Text.js +66 -68
  430. package/lib/options/parser.d.ts +1 -1
  431. package/lib/options/parser.js +32 -14
  432. package/lib/options/types.d.ts +15 -2
  433. package/lib/renderer/composites/background.js +1 -1
  434. package/lib/renderer/composites/button.js +3 -2
  435. package/lib/renderer/composites/icon.d.ts +1 -1
  436. package/lib/renderer/composites/icon.js +3 -1
  437. package/lib/renderer/composites/illus.js +1 -1
  438. package/lib/renderer/composites/text.js +2 -1
  439. package/lib/renderer/renderer.js +2 -1
  440. package/lib/renderer/stylize/rough.js +3 -7
  441. package/lib/renderer/types/index.d.ts +0 -1
  442. package/lib/resource/loader.d.ts +2 -2
  443. package/lib/resource/loader.js +21 -10
  444. package/lib/resource/loaders/index.d.ts +1 -0
  445. package/lib/resource/loaders/index.js +1 -0
  446. package/lib/resource/loaders/remote.d.ts +1 -1
  447. package/lib/resource/loaders/remote.js +10 -2
  448. package/lib/resource/loaders/search.d.ts +1 -0
  449. package/lib/resource/loaders/search.js +54 -0
  450. package/lib/resource/types/index.d.ts +1 -0
  451. package/lib/resource/types/resource.d.ts +8 -1
  452. package/lib/resource/types/scene.d.ts +1 -0
  453. package/lib/resource/types/scene.js +2 -0
  454. package/lib/resource/utils/data-uri.js +20 -11
  455. package/lib/resource/utils/index.d.ts +0 -1
  456. package/lib/resource/utils/index.js +0 -1
  457. package/lib/resource/utils/parser.js +92 -1
  458. package/lib/resource/utils/ref.js +4 -4
  459. package/lib/runtime/Infographic.d.ts +14 -7
  460. package/lib/runtime/Infographic.js +73 -10
  461. package/lib/runtime/options.d.ts +2 -0
  462. package/lib/runtime/options.js +27 -0
  463. package/lib/runtime/utils.d.ts +4 -0
  464. package/lib/runtime/utils.js +43 -0
  465. package/lib/syntax/index.d.ts +3 -0
  466. package/lib/syntax/index.js +104 -0
  467. package/lib/syntax/mapper.d.ts +3 -0
  468. package/lib/syntax/mapper.js +242 -0
  469. package/lib/syntax/parser.d.ts +14 -0
  470. package/lib/syntax/parser.js +146 -0
  471. package/lib/syntax/schema.d.ts +6 -0
  472. package/lib/syntax/schema.js +77 -0
  473. package/lib/syntax/types.d.ts +61 -0
  474. package/lib/syntax/types.js +2 -0
  475. package/lib/templates/built-in.js +116 -1
  476. package/lib/templates/hierarchy-mindmap.d.ts +2 -0
  477. package/lib/templates/hierarchy-mindmap.js +64 -0
  478. package/lib/templates/hierarchy-tree.js +25 -11
  479. package/lib/templates/sequence-stairs.d.ts +2 -0
  480. package/lib/templates/sequence-stairs.js +45 -0
  481. package/lib/templates/word-cloud.d.ts +2 -0
  482. package/lib/templates/word-cloud.js +22 -0
  483. package/lib/themes/types.d.ts +1 -1
  484. package/lib/types/attrs.d.ts +15 -13
  485. package/lib/types/data.d.ts +2 -0
  486. package/lib/types/element.d.ts +1 -1
  487. package/lib/types/event.d.ts +6 -0
  488. package/lib/types/event.js +2 -0
  489. package/lib/types/index.d.ts +2 -0
  490. package/lib/{renderer/types → types}/text.d.ts +0 -1
  491. package/lib/types/text.js +2 -0
  492. package/lib/utils/attrs.d.ts +1 -0
  493. package/lib/utils/attrs.js +12 -0
  494. package/lib/utils/design.d.ts +2 -0
  495. package/lib/utils/design.js +13 -0
  496. package/lib/utils/element.d.ts +4 -0
  497. package/lib/utils/element.js +18 -0
  498. package/lib/utils/font.js +11 -1
  499. package/lib/utils/icon.d.ts +5 -3
  500. package/lib/utils/icon.js +42 -21
  501. package/lib/utils/index.d.ts +6 -0
  502. package/lib/utils/index.js +6 -0
  503. package/lib/utils/measure-text.d.ts +5 -0
  504. package/lib/utils/measure-text.js +28 -0
  505. package/lib/utils/recognizer.d.ts +15 -0
  506. package/lib/utils/recognizer.js +72 -2
  507. package/lib/utils/style.d.ts +1 -0
  508. package/lib/utils/style.js +11 -0
  509. package/lib/utils/text.d.ts +7 -0
  510. package/lib/utils/text.js +113 -32
  511. package/package.json +7 -3
  512. package/src/constants/components.ts +1 -0
  513. package/src/constants/element.ts +17 -5
  514. package/src/constants/index.ts +3 -0
  515. package/src/constants/service.ts +1 -0
  516. package/src/constants/shape.ts +16 -0
  517. package/src/designs/components/Btn.tsx +3 -2
  518. package/src/designs/components/BtnsGroup.tsx +2 -1
  519. package/src/designs/components/Illus.tsx +3 -2
  520. package/src/designs/components/ItemDesc.tsx +2 -2
  521. package/src/designs/components/ItemIcon.tsx +3 -2
  522. package/src/designs/components/ItemLabel.tsx +2 -2
  523. package/src/designs/components/ItemValue.tsx +2 -2
  524. package/src/designs/components/ItemsGroup.tsx +2 -1
  525. package/src/designs/components/Title.tsx +8 -5
  526. package/src/designs/items/CandyCardLite.tsx +3 -3
  527. package/src/designs/items/CircularProgress.tsx +19 -8
  528. package/src/designs/items/HorizontalIconArrow.tsx +4 -5
  529. package/src/designs/items/HorizontalIconLine.tsx +7 -10
  530. package/src/designs/items/IconBadge.tsx +3 -3
  531. package/src/designs/items/LinedText.tsx +131 -0
  532. package/src/designs/items/PlainText.tsx +25 -3
  533. package/src/designs/items/QuarterCircular.tsx +2 -31
  534. package/src/designs/items/index.ts +1 -0
  535. package/src/designs/layouts/Align.tsx +31 -48
  536. package/src/designs/layouts/Flex.tsx +33 -31
  537. package/src/designs/structures/chart-bar.tsx +289 -0
  538. package/src/designs/structures/chart-line.tsx +415 -0
  539. package/src/designs/structures/chart-pie.tsx +298 -0
  540. package/src/designs/structures/chart-wordcloud.tsx +278 -0
  541. package/src/designs/structures/compare-binary-horizontal/dividers/pros-cons-arrow.tsx +2 -2
  542. package/src/designs/structures/hierarchy-mindmap.tsx +394 -0
  543. package/src/designs/structures/hierarchy-tree.tsx +212 -59
  544. package/src/designs/structures/index.ts +6 -0
  545. package/src/designs/structures/list-sector.tsx +2 -1
  546. package/src/designs/structures/sequence-ascending-steps.tsx +0 -1
  547. package/src/designs/structures/sequence-circular.tsx +1 -1
  548. package/src/designs/structures/sequence-cylinders-3d.tsx +5 -5
  549. package/src/designs/structures/sequence-roadmap-vertical.tsx +2 -1
  550. package/src/designs/structures/sequence-stairs-front.tsx +291 -0
  551. package/src/designs/structures/sequence-zigzag-pucks-3d.tsx +18 -25
  552. package/src/designs/types.ts +9 -0
  553. package/src/editor/commands/Batch.ts +24 -0
  554. package/src/editor/commands/UpdateElement.ts +115 -0
  555. package/src/editor/commands/UpdateOptions.ts +31 -0
  556. package/src/editor/commands/UpdateText.ts +54 -0
  557. package/src/editor/commands/index.ts +4 -0
  558. package/src/editor/editor.ts +78 -0
  559. package/src/editor/index.ts +4 -0
  560. package/src/editor/interactions/base.ts +25 -0
  561. package/src/editor/interactions/brush-select.ts +204 -0
  562. package/src/editor/interactions/click-select.ts +72 -0
  563. package/src/editor/interactions/dblclick-edit-text.ts +260 -0
  564. package/src/editor/interactions/drag-element.ts +516 -0
  565. package/src/editor/interactions/hotkey-history.ts +34 -0
  566. package/src/editor/interactions/index.ts +8 -0
  567. package/src/editor/interactions/select-highlight.ts +140 -0
  568. package/src/editor/interactions/zoom-wheel.ts +52 -0
  569. package/src/editor/managers/command.ts +83 -0
  570. package/src/editor/managers/index.ts +4 -0
  571. package/src/editor/managers/interaction.ts +244 -0
  572. package/src/editor/managers/plugin.ts +66 -0
  573. package/src/editor/managers/state.ts +186 -0
  574. package/src/editor/plugins/base.ts +25 -0
  575. package/src/editor/plugins/edit-bar/components/button.ts +77 -0
  576. package/src/editor/plugins/edit-bar/components/color-picker.ts +397 -0
  577. package/src/editor/plugins/edit-bar/components/icons.ts +86 -0
  578. package/src/editor/plugins/edit-bar/components/index.ts +5 -0
  579. package/src/editor/plugins/edit-bar/components/popover.ts +446 -0
  580. package/src/editor/plugins/edit-bar/components/select.ts +247 -0
  581. package/src/editor/plugins/edit-bar/edit-bar.ts +292 -0
  582. package/src/editor/plugins/edit-bar/edit-items/align-elements.ts +447 -0
  583. package/src/editor/plugins/edit-bar/edit-items/font-align.ts +129 -0
  584. package/src/editor/plugins/edit-bar/edit-items/font-color.ts +101 -0
  585. package/src/editor/plugins/edit-bar/edit-items/font-family.ts +147 -0
  586. package/src/editor/plugins/edit-bar/edit-items/font-size.ts +116 -0
  587. package/src/editor/plugins/edit-bar/edit-items/icon-color.ts +101 -0
  588. package/src/editor/plugins/edit-bar/edit-items/index.ts +7 -0
  589. package/src/editor/plugins/edit-bar/edit-items/types.ts +9 -0
  590. package/src/editor/plugins/edit-bar/index.ts +18 -0
  591. package/src/editor/plugins/edit-bar/utils.ts +16 -0
  592. package/src/editor/plugins/index.ts +3 -0
  593. package/src/editor/plugins/resize-element.ts +518 -0
  594. package/src/editor/types/command.ts +32 -0
  595. package/src/editor/types/editor.ts +4 -0
  596. package/src/editor/types/index.ts +7 -0
  597. package/src/editor/types/interaction.ts +56 -0
  598. package/src/editor/types/plugin.ts +34 -0
  599. package/src/editor/types/selection.ts +3 -0
  600. package/src/editor/types/shape.ts +28 -0
  601. package/src/editor/types/state.ts +51 -0
  602. package/src/editor/utils/click-handler.ts +114 -0
  603. package/src/editor/utils/coordinate.ts +54 -0
  604. package/src/editor/utils/data.ts +30 -0
  605. package/src/editor/utils/element.ts +13 -0
  606. package/src/editor/utils/event.ts +92 -0
  607. package/src/editor/utils/extension.ts +45 -0
  608. package/src/editor/utils/hotkey.ts +139 -0
  609. package/src/editor/utils/index.ts +7 -0
  610. package/src/exporter/svg.ts +15 -5
  611. package/src/index.ts +16 -3
  612. package/src/jsx/components/Polygon.ts +2 -1
  613. package/src/jsx/components/Text.ts +70 -71
  614. package/src/options/parser.ts +57 -28
  615. package/src/options/types.ts +17 -2
  616. package/src/renderer/composites/background.ts +2 -2
  617. package/src/renderer/composites/button.ts +4 -3
  618. package/src/renderer/composites/icon.ts +3 -1
  619. package/src/renderer/composites/illus.ts +1 -1
  620. package/src/renderer/composites/text.ts +2 -1
  621. package/src/renderer/renderer.ts +4 -2
  622. package/src/renderer/stylize/rough.ts +3 -7
  623. package/src/renderer/types/index.ts +0 -1
  624. package/src/resource/loader.ts +22 -8
  625. package/src/resource/loaders/index.ts +1 -0
  626. package/src/resource/loaders/remote.ts +9 -2
  627. package/src/resource/loaders/search.ts +52 -0
  628. package/src/resource/types/index.ts +2 -1
  629. package/src/resource/types/resource.ts +12 -1
  630. package/src/resource/types/scene.ts +1 -0
  631. package/src/resource/utils/data-uri.ts +20 -11
  632. package/src/resource/utils/index.ts +0 -1
  633. package/src/resource/utils/parser.ts +103 -2
  634. package/src/resource/utils/ref.ts +3 -3
  635. package/src/runtime/Infographic.tsx +106 -13
  636. package/src/runtime/options.ts +37 -0
  637. package/src/runtime/utils.ts +45 -0
  638. package/src/syntax/index.ts +124 -0
  639. package/src/syntax/mapper.ts +362 -0
  640. package/src/syntax/parser.ts +171 -0
  641. package/src/syntax/schema.ts +98 -0
  642. package/src/syntax/types.ts +89 -0
  643. package/src/templates/built-in.ts +116 -1
  644. package/src/templates/hierarchy-mindmap.ts +129 -0
  645. package/src/templates/hierarchy-tree.ts +34 -11
  646. package/src/templates/sequence-stairs.ts +44 -0
  647. package/src/templates/word-cloud.ts +21 -0
  648. package/src/themes/types.ts +1 -1
  649. package/src/types/attrs.ts +17 -13
  650. package/src/types/data.ts +2 -0
  651. package/src/types/element.ts +1 -1
  652. package/src/types/event.ts +6 -0
  653. package/src/types/index.ts +2 -0
  654. package/src/{renderer/types → types}/text.ts +0 -1
  655. package/src/utils/attrs.ts +9 -0
  656. package/src/utils/design.ts +14 -0
  657. package/src/utils/element.ts +26 -0
  658. package/src/utils/font.ts +11 -1
  659. package/src/utils/icon.ts +45 -25
  660. package/src/utils/index.ts +6 -0
  661. package/src/utils/measure-text.ts +38 -0
  662. package/src/utils/recognizer.ts +75 -1
  663. package/src/utils/style.ts +8 -0
  664. package/src/utils/text.ts +135 -40
  665. package/esm/resource/types/font.d.ts +0 -12
  666. package/lib/resource/types/font.d.ts +0 -12
  667. package/src/resource/types/font.ts +0 -23
  668. /package/esm/{renderer/types/text.js → constants/shape.js} +0 -0
  669. /package/esm/{resource/types/font.js → editor/plugins/edit-bar/edit-items/types.js} +0 -0
  670. /package/esm/{resource/utils → utils}/hash.d.ts +0 -0
  671. /package/esm/{resource/utils → utils}/hash.js +0 -0
  672. /package/lib/{renderer/types/text.js → constants/shape.js} +0 -0
  673. /package/lib/{resource/types/font.js → editor/plugins/edit-bar/edit-items/types.js} +0 -0
  674. /package/lib/{resource/utils → utils}/hash.d.ts +0 -0
  675. /package/lib/{resource/utils → utils}/hash.js +0 -0
  676. /package/src/{resource/utils → utils}/hash.ts +0 -0
@@ -0,0 +1,298 @@
1
+ import { arc, pie, type PieArcDatum } from 'd3';
2
+ import { ElementTypeEnum } from '../../constants';
3
+ import type { ComponentType, JSXElement } from '../../jsx';
4
+ import { getElementBounds, Group, Path, Text } from '../../jsx';
5
+ import { ItemDatum } from '../../types';
6
+ import { BtnAdd, BtnRemove, BtnsGroup, ItemsGroup } from '../components';
7
+ import { FlexLayout } from '../layouts';
8
+ import { getColorPrimary, getPaletteColor, getThemeColors } from '../utils';
9
+ import { registerStructure } from './registry';
10
+ import type { BaseStructureProps } from './types';
11
+
12
+ export interface ChartPieProps extends BaseStructureProps {
13
+ radius?: number;
14
+ innerRadius?: number;
15
+ padding?: number;
16
+ showPercentage?: boolean;
17
+ }
18
+
19
+ export const ChartPie: ComponentType<ChartPieProps> = (props) => {
20
+ const {
21
+ Title,
22
+ Item,
23
+ data,
24
+ radius = 140,
25
+ innerRadius = 0,
26
+ padding = 30,
27
+ showPercentage = true,
28
+ options,
29
+ } = props;
30
+
31
+ const { title, desc, items = [] } = data;
32
+ const titleContent = Title ? <Title title={title} desc={desc} /> : null;
33
+
34
+ const btnBounds = getElementBounds(<BtnAdd indexes={[0]} />);
35
+
36
+ // 获取 Item 的预估尺寸
37
+ const sampleDatum: ItemDatum = items[0] ?? { label: '', value: 0 };
38
+ const itemBounds = getElementBounds(
39
+ <Item
40
+ indexes={[0]}
41
+ datum={sampleDatum}
42
+ data={data}
43
+ positionH="center"
44
+ positionV="middle"
45
+ />,
46
+ );
47
+
48
+ const labelWidth = itemBounds.width || 140;
49
+ const labelHeight = itemBounds.height || 32;
50
+
51
+ // 基础半径设置
52
+ const outerRadius = Math.max(radius, 60);
53
+
54
+ // 连线水平拉伸的系数
55
+ const extensionFactor = 1.35;
56
+ const textGap = 8;
57
+
58
+ // 计算画布中心和总尺寸
59
+ // 水平方向:半径 * 系数 + 间距 + 标签宽度 + 边缘padding
60
+ const maxHorizontalDistance =
61
+ outerRadius * extensionFactor + textGap + labelWidth;
62
+ const maxVerticalDistance = outerRadius;
63
+
64
+ const centerX = padding + maxHorizontalDistance;
65
+ const centerY = padding + maxVerticalDistance;
66
+
67
+ const totalWidth = centerX * 2;
68
+ const totalHeight = centerY * 2;
69
+
70
+ // 空数据处理
71
+ if (items.length === 0) {
72
+ return (
73
+ <FlexLayout
74
+ id="infographic-container"
75
+ flexDirection="column"
76
+ justifyContent="center"
77
+ alignItems="center"
78
+ >
79
+ {titleContent}
80
+ <Group width={totalWidth} height={totalHeight}>
81
+ <BtnsGroup>
82
+ <BtnAdd
83
+ indexes={[0]}
84
+ x={centerX - btnBounds.width / 2}
85
+ y={centerY - btnBounds.height / 2}
86
+ />
87
+ </BtnsGroup>
88
+ </Group>
89
+ </FlexLayout>
90
+ );
91
+ }
92
+
93
+ const totalValue = items.reduce(
94
+ (sum, item) => sum + Math.max(item.value ?? 0, 0),
95
+ 0,
96
+ );
97
+ const colorPrimary = getColorPrimary(options);
98
+ const themeColors = getThemeColors(options.themeConfig);
99
+
100
+ // 1. 饼图生成器
101
+ const pieGenerator = pie<ItemDatum>()
102
+ .value((item) => Math.max(item.value ?? 0, 0))
103
+ .sort(null)
104
+ .startAngle(0)
105
+ .endAngle(Math.PI * 2);
106
+
107
+ const arcData = pieGenerator(items);
108
+
109
+ // 2. 弧形生成器
110
+ const arcGenerator = arc<PieArcDatum<ItemDatum>>()
111
+ .innerRadius(innerRadius)
112
+ .outerRadius(outerRadius)
113
+ .cornerRadius(2);
114
+
115
+ // 连线起点
116
+ const innerArc = arc<PieArcDatum<ItemDatum>>()
117
+ .innerRadius(outerRadius)
118
+ .outerRadius(outerRadius);
119
+
120
+ // 连线拐点
121
+ const outerArc = arc<PieArcDatum<ItemDatum>>()
122
+ .innerRadius(outerRadius * 1.15)
123
+ .outerRadius(outerRadius * 1.15);
124
+
125
+ const percentTextRadius = innerRadius + (outerRadius - innerRadius) * 0.5;
126
+ const percentageArc = arc<PieArcDatum<ItemDatum>>()
127
+ .innerRadius(percentTextRadius)
128
+ .outerRadius(percentTextRadius);
129
+
130
+ // 删除按钮位置
131
+ const deleteButtonArc = arc<PieArcDatum<ItemDatum>>()
132
+ .innerRadius(outerRadius * 0.85)
133
+ .outerRadius(outerRadius * 0.85);
134
+
135
+ const sliceElements: JSXElement[] = [];
136
+ const percentElements: JSXElement[] = [];
137
+ const connectorElements: JSXElement[] = [];
138
+ const itemElements: JSXElement[] = [];
139
+ const btnElements: JSXElement[] = [];
140
+
141
+ // 3. 遍历生成图形
142
+ arcData.forEach((arcDatum) => {
143
+ const currentItem = arcDatum.data;
144
+ const originalIndex = arcDatum.index;
145
+
146
+ const color =
147
+ getPaletteColor(options, [originalIndex]) ||
148
+ themeColors.colorPrimary ||
149
+ colorPrimary;
150
+
151
+ // --- 绘制扇形 ---
152
+ const pathD = arcGenerator(arcDatum) || '';
153
+ sliceElements.push(
154
+ <Path
155
+ d={pathD}
156
+ fill={color}
157
+ stroke={themeColors.colorBg}
158
+ strokeWidth={1}
159
+ data-element-type="shape"
160
+ width={outerRadius * 2}
161
+ height={outerRadius * 2}
162
+ />,
163
+ );
164
+
165
+ // --- 计算关键点 ---
166
+ const midAngle =
167
+ arcDatum.startAngle + (arcDatum.endAngle - arcDatum.startAngle) / 2;
168
+ const isRight = midAngle < Math.PI;
169
+
170
+ // 1. 起点
171
+ const p0 = innerArc.centroid(arcDatum);
172
+
173
+ // 2. 拐点
174
+ const p1 = outerArc.centroid(arcDatum);
175
+
176
+ // 3. 终点 (水平拉伸)
177
+ const labelXOffset = outerRadius * extensionFactor * (isRight ? 1 : -1);
178
+ const p2 = [labelXOffset, p1[1]];
179
+
180
+ // --- 绘制连线 ---
181
+ connectorElements.push(
182
+ <Path
183
+ d={`M${centerX + p0[0]} ${centerY + p0[1]} L${centerX + p1[0]} ${centerY + p1[1]} L${centerX + p2[0]} ${centerY + p2[1]}`}
184
+ stroke={colorPrimary}
185
+ strokeOpacity={0.45}
186
+ strokeWidth={2}
187
+ fill="none"
188
+ data-element-type="shape"
189
+ />,
190
+ );
191
+
192
+ // --- 绘制 Item ---
193
+ const itemX = centerX + p2[0] + (isRight ? textGap : -textGap - labelWidth);
194
+ const itemY = centerY + p2[1] - labelHeight / 2;
195
+
196
+ itemElements.push(
197
+ <Item
198
+ indexes={[originalIndex]}
199
+ datum={currentItem}
200
+ data={data}
201
+ x={itemX}
202
+ y={itemY}
203
+ width={labelWidth}
204
+ height={labelHeight}
205
+ positionH={isRight ? 'normal' : 'flipped'}
206
+ positionV="middle"
207
+ themeColors={getThemeColors({ colorPrimary: color }, options)}
208
+ />,
209
+ );
210
+
211
+ // --- 绘制百分比 ---
212
+ if (showPercentage && totalValue > 0) {
213
+ const percentPos = percentageArc.centroid(arcDatum);
214
+ const value = Math.max(arcDatum.value, 0);
215
+ const percentText = ((value * 100) / totalValue).toFixed(1);
216
+
217
+ // 定义文本框尺寸
218
+ const textWidth = 50;
219
+ const textHeight = 20;
220
+
221
+ percentElements.push(
222
+ <Text
223
+ x={centerX + percentPos[0] - textWidth / 2}
224
+ y={centerY + percentPos[1] - textHeight / 2}
225
+ width={textWidth}
226
+ height={textHeight}
227
+ alignHorizontal="center"
228
+ alignVertical="middle"
229
+ fontSize={12}
230
+ fontWeight="bold"
231
+ fill="#ffffff"
232
+ data-value={value}
233
+ data-indexes={[originalIndex]}
234
+ data-element-type={ElementTypeEnum.ItemValue}
235
+ >
236
+ {`${percentText}%`}
237
+ </Text>,
238
+ );
239
+ }
240
+
241
+ // --- 绘制删除按钮 ---
242
+ const deletePos = deleteButtonArc.centroid(arcDatum);
243
+ btnElements.push(
244
+ <BtnRemove
245
+ indexes={[originalIndex]}
246
+ x={centerX + deletePos[0] - btnBounds.width / 2}
247
+ y={centerY + deletePos[1] - btnBounds.height / 2}
248
+ />,
249
+ );
250
+ });
251
+
252
+ // --- 绘制添加按钮 ---
253
+ arcData.forEach((arcDatum, index) => {
254
+ const nextIndex = (index + 1) % arcData.length;
255
+ const currentEnd = arcDatum.endAngle;
256
+ const nextStart =
257
+ arcData[nextIndex].startAngle + (nextIndex === 0 ? Math.PI * 2 : 0);
258
+ const midAngle = (currentEnd + nextStart) / 2;
259
+
260
+ const btnR = outerRadius * 1.0;
261
+ const btnX = Math.sin(midAngle) * btnR;
262
+ const btnY = -Math.cos(midAngle) * btnR;
263
+
264
+ btnElements.push(
265
+ <BtnAdd
266
+ indexes={[index + 1]}
267
+ x={centerX + btnX - btnBounds.width / 2}
268
+ y={centerY + btnY - btnBounds.height / 2}
269
+ />,
270
+ );
271
+ });
272
+
273
+ return (
274
+ <FlexLayout
275
+ id="infographic-container"
276
+ flexDirection="column"
277
+ justifyContent="center"
278
+ alignItems="center"
279
+ gap={30}
280
+ >
281
+ {titleContent}
282
+ <Group width={totalWidth} height={totalHeight}>
283
+ <Group x={centerX} y={centerY}>
284
+ {sliceElements}
285
+ </Group>
286
+ <Group>{connectorElements}</Group>
287
+ <Group>{percentElements}</Group>
288
+ <ItemsGroup>{itemElements}</ItemsGroup>
289
+ <BtnsGroup>{btnElements}</BtnsGroup>
290
+ </Group>
291
+ </FlexLayout>
292
+ );
293
+ };
294
+
295
+ registerStructure('chart-pie', {
296
+ component: ChartPie,
297
+ composites: ['title', 'item'],
298
+ });
@@ -0,0 +1,278 @@
1
+ import { ElementTypeEnum } from '../../constants';
2
+ import type { ComponentType, JSXElement } from '../../jsx';
3
+ import { getElementBounds, Group, Text } from '../../jsx';
4
+ import { ItemsGroup } from '../components';
5
+ import { FlexLayout } from '../layouts';
6
+ import { getColorPrimary, getPaletteColor } from '../utils';
7
+ import { registerStructure } from './registry';
8
+ import type { BaseStructureProps } from './types';
9
+
10
+ interface WordCandidate {
11
+ label: string;
12
+ value?: number;
13
+ color: string;
14
+ fontSize: number;
15
+ width: number;
16
+ height: number;
17
+ }
18
+
19
+ interface PlacedWord extends WordCandidate {
20
+ angle: number;
21
+ centerX: number;
22
+ centerY: number;
23
+ box: { x: number; y: number; width: number; height: number };
24
+ }
25
+
26
+ const DEFAULT_ROTATE_ANGLES = [0, 30, -30, 60, -60];
27
+ const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5));
28
+
29
+ function getRotatedSize(width: number, height: number, angle: number) {
30
+ const rad = (Math.PI / 180) * angle;
31
+ const cos = Math.cos(rad);
32
+ const sin = Math.sin(rad);
33
+ return {
34
+ width: Math.abs(width * cos) + Math.abs(height * sin),
35
+ height: Math.abs(width * sin) + Math.abs(height * cos),
36
+ };
37
+ }
38
+
39
+ function hasCollision(
40
+ x: number,
41
+ y: number,
42
+ width: number,
43
+ height: number,
44
+ placed: PlacedWord[],
45
+ padding: number,
46
+ ) {
47
+ const left = x - padding;
48
+ const right = x + width + padding;
49
+ const top = y - padding;
50
+ const bottom = y + height + padding;
51
+
52
+ return placed.some((word) => {
53
+ const wLeft = word.box.x - padding;
54
+ const wRight = word.box.x + word.box.width + padding;
55
+ const wTop = word.box.y - padding;
56
+ const wBottom = word.box.y + word.box.height + padding;
57
+ return !(
58
+ right <= wLeft ||
59
+ left >= wRight ||
60
+ bottom <= wTop ||
61
+ top >= wBottom
62
+ );
63
+ });
64
+ }
65
+
66
+ function placeWords(
67
+ words: WordCandidate[],
68
+ enableRotate: boolean,
69
+ padding: number,
70
+ spiralStep: number,
71
+ radiusStep: number,
72
+ ): PlacedWord[] {
73
+ const placed: PlacedWord[] = [];
74
+ const rotationAngles = enableRotate ? DEFAULT_ROTATE_ANGLES : [0];
75
+ const maxAttempts = Math.max(1600, words.length * 28);
76
+
77
+ words.forEach((word, wordIndex) => {
78
+ const sizeBias = Math.max(word.width, word.height);
79
+ const angleOffset = wordIndex * GOLDEN_ANGLE;
80
+ let extraRadius = 0;
81
+ let placedWord: PlacedWord | null = null;
82
+
83
+ for (let attempt = 0; attempt < maxAttempts && !placedWord; attempt++) {
84
+ if (attempt === Math.floor(maxAttempts * 0.6)) {
85
+ // Gradually expand the search radius for dense layouts
86
+ extraRadius = sizeBias;
87
+ }
88
+
89
+ const theta = angleOffset + attempt * spiralStep;
90
+ const radius =
91
+ radiusStep * Math.sqrt(attempt + 1) + extraRadius + sizeBias * 0.25;
92
+ const centerX = radius * Math.cos(theta);
93
+ const centerY = radius * Math.sin(theta);
94
+
95
+ for (const angle of rotationAngles) {
96
+ const rotated = getRotatedSize(word.width, word.height, angle);
97
+ const x = centerX - rotated.width / 2;
98
+ const y = centerY - rotated.height / 2;
99
+ if (
100
+ !hasCollision(x, y, rotated.width, rotated.height, placed, padding)
101
+ ) {
102
+ placedWord = {
103
+ ...word,
104
+ angle,
105
+ centerX,
106
+ centerY,
107
+ box: { x, y, width: rotated.width, height: rotated.height },
108
+ };
109
+ break;
110
+ }
111
+ }
112
+ }
113
+
114
+ if (!placedWord) {
115
+ const fallbackAngle = rotationAngles[wordIndex % rotationAngles.length];
116
+ const farRadius = radiusStep * Math.sqrt(maxAttempts + 1) + sizeBias;
117
+ const theta = angleOffset;
118
+ const centerX = farRadius * Math.cos(theta);
119
+ const centerY = farRadius * Math.sin(theta);
120
+ const rotated = getRotatedSize(word.width, word.height, fallbackAngle);
121
+ placedWord = {
122
+ ...word,
123
+ angle: fallbackAngle,
124
+ centerX,
125
+ centerY,
126
+ box: {
127
+ x: centerX - rotated.width / 2,
128
+ y: centerY - rotated.height / 2,
129
+ width: rotated.width,
130
+ height: rotated.height,
131
+ },
132
+ };
133
+ }
134
+
135
+ placed.push(placedWord);
136
+ });
137
+
138
+ return placed;
139
+ }
140
+
141
+ export interface ChartWordCloudProps extends BaseStructureProps {
142
+ minFontSize?: number;
143
+ maxFontSize?: number;
144
+ enableRotate?: boolean;
145
+ padding?: number;
146
+ spiralStep?: number;
147
+ radiusStep?: number;
148
+ }
149
+
150
+ export const ChartWordCloud: ComponentType<ChartWordCloudProps> = (props) => {
151
+ const {
152
+ data,
153
+ options,
154
+ minFontSize = 16,
155
+ maxFontSize = 48,
156
+ enableRotate = true,
157
+ padding = 6,
158
+ spiralStep = 0.45,
159
+ radiusStep = 10,
160
+ } = props;
161
+ const { items = [] } = data;
162
+
163
+ const validItems = items
164
+ .map((datum, index) => ({ datum, index }))
165
+ .filter(({ datum }) => datum.label);
166
+
167
+ if (validItems.length === 0) {
168
+ return (
169
+ <FlexLayout
170
+ id="infographic-container"
171
+ flexDirection="column"
172
+ justifyContent="center"
173
+ alignItems="center"
174
+ >
175
+ <Group>
176
+ <ItemsGroup />
177
+ </Group>
178
+ </FlexLayout>
179
+ );
180
+ }
181
+
182
+ const values = validItems
183
+ .map(({ datum }) => datum.value)
184
+ .filter((v): v is number => typeof v === 'number');
185
+ const hasValues = values.length > 0;
186
+ const minValue = hasValues ? Math.min(...values) : 0;
187
+ const maxValue = hasValues ? Math.max(...values) : 0;
188
+ const sameValue = hasValues && minValue === maxValue;
189
+ const uniformSize = (minFontSize + maxFontSize) / 2;
190
+
191
+ const mapFontSize = (value?: number) => {
192
+ if (!hasValues || sameValue) return uniformSize;
193
+ if (value == null) return minFontSize;
194
+ const ratio = (value - minValue) / (maxValue - minValue || 1);
195
+ return minFontSize + ratio * (maxFontSize - minFontSize);
196
+ };
197
+
198
+ const words: WordCandidate[] = validItems
199
+ .map(({ datum, index }) => {
200
+ const fontSize = mapFontSize(datum.value);
201
+ const measured = getElementBounds(
202
+ <Text fontSize={fontSize} fontWeight="bold">
203
+ {datum.label}
204
+ </Text>,
205
+ );
206
+ const color =
207
+ getPaletteColor(options, [index]) ||
208
+ getColorPrimary(options) ||
209
+ '#333333';
210
+ return {
211
+ label: datum.label as string,
212
+ value: datum.value,
213
+ color,
214
+ fontSize,
215
+ width: measured.width * 1.05,
216
+ height: measured.height,
217
+ };
218
+ })
219
+ .sort((a, b) => b.fontSize - a.fontSize);
220
+
221
+ const placedWords = placeWords(
222
+ words,
223
+ enableRotate,
224
+ padding,
225
+ spiralStep,
226
+ radiusStep,
227
+ );
228
+
229
+ const minX = Math.min(...placedWords.map((w) => w.box.x));
230
+ const minY = Math.min(...placedWords.map((w) => w.box.y));
231
+ const maxX = Math.max(...placedWords.map((w) => w.box.x + w.box.width));
232
+ const maxY = Math.max(...placedWords.map((w) => w.box.y + w.box.height));
233
+ const offsetX = -minX + padding;
234
+ const offsetY = -minY + padding;
235
+ const containerWidth = maxX - minX + padding * 2;
236
+ const containerHeight = maxY - minY + padding * 2;
237
+
238
+ const wordElements: JSXElement[] = placedWords.map((word, index) => {
239
+ const translateX = word.centerX - word.width / 2 + offsetX;
240
+ const translateY = word.centerY - word.height / 2 + offsetY;
241
+ const rotationOriginX = word.width / 2;
242
+ const rotationOriginY = word.height / 2;
243
+ const transform = `translate(${translateX}, ${translateY}) rotate(${word.angle}, ${rotationOriginX}, ${rotationOriginY})`;
244
+
245
+ return (
246
+ <Group transform={transform}>
247
+ <Text
248
+ width={word.width}
249
+ height={word.height}
250
+ fontSize={word.fontSize}
251
+ fontWeight="bold"
252
+ alignHorizontal="center"
253
+ alignVertical="middle"
254
+ fill={word.color}
255
+ data-indexes={index}
256
+ data-element-type={ElementTypeEnum.ItemLabel}
257
+ >
258
+ {word.label}
259
+ </Text>
260
+ </Group>
261
+ );
262
+ });
263
+
264
+ return (
265
+ <ItemsGroup
266
+ id="infographic-container"
267
+ width={containerWidth}
268
+ height={containerHeight}
269
+ >
270
+ {wordElements}
271
+ </ItemsGroup>
272
+ );
273
+ };
274
+
275
+ registerStructure('chart-wordcloud', {
276
+ component: ChartWordCloud,
277
+ composites: ['item'],
278
+ });
@@ -35,10 +35,10 @@ export const ProsConsArrow: ComponentType<DividerProps> = (props) => {
35
35
  fill={colorNegative}
36
36
  />
37
37
  </ShapesGroup>
38
- <Text x={45} y={15} {...textAttrs}>
38
+ <Text x={40} y={15} {...textAttrs}>
39
39
  Pros
40
40
  </Text>
41
- <Text x={65} y={86} {...textAttrs}>
41
+ <Text x={70} y={85} {...textAttrs}>
42
42
  Cons
43
43
  </Text>
44
44
  </Group>