@zerodep-dev/vue-tsx-pro-ui 0.3.0 → 0.3.2

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 (616) hide show
  1. package/dist/base/Blockquote.d.ts +1 -1
  2. package/dist/base/Blockquote.js +1 -1
  3. package/dist/base/Blockquote.js.map +1 -1
  4. package/dist/base/ButtonGroup.d.ts +1 -1
  5. package/dist/base/ButtonGroup.js +1 -1
  6. package/dist/base/ButtonGroup.js.map +1 -1
  7. package/dist/base/Code.d.ts +1 -1
  8. package/dist/base/Code.js +1 -1
  9. package/dist/base/Code.js.map +1 -1
  10. package/dist/base/CodeBlock.d.ts +1 -1
  11. package/dist/base/CodeBlock.js +1 -1
  12. package/dist/base/CodeBlock.js.map +1 -1
  13. package/dist/base/CopyButton.d.ts +1 -1
  14. package/dist/base/CopyButton.js +1 -1
  15. package/dist/base/CopyButton.js.map +1 -1
  16. package/dist/base/Heading.d.ts +1 -1
  17. package/dist/base/Heading.js +1 -1
  18. package/dist/base/Heading.js.map +1 -1
  19. package/dist/base/Icon.d.ts +1 -1
  20. package/dist/base/Icon.js +1 -1
  21. package/dist/base/Icon.js.map +1 -1
  22. package/dist/base/Indicator.d.ts +1 -1
  23. package/dist/base/Indicator.js +1 -1
  24. package/dist/base/Indicator.js.map +1 -1
  25. package/dist/base/Kbd.d.ts +1 -1
  26. package/dist/base/Kbd.js +1 -1
  27. package/dist/base/Kbd.js.map +1 -1
  28. package/dist/base/Link.d.ts +1 -1
  29. package/dist/base/Link.js +1 -1
  30. package/dist/base/Link.js.map +1 -1
  31. package/dist/base/List.d.ts +1 -1
  32. package/dist/base/List.js +1 -1
  33. package/dist/base/List.js.map +1 -1
  34. package/dist/base/Mark.d.ts +1 -1
  35. package/dist/base/Mark.js +1 -1
  36. package/dist/base/Mark.js.map +1 -1
  37. package/dist/base/Spinner.d.ts +1 -1
  38. package/dist/base/Spinner.js +1 -1
  39. package/dist/base/Spinner.js.map +1 -1
  40. package/dist/base/StatusDot.d.ts +1 -1
  41. package/dist/base/StatusDot.js +1 -1
  42. package/dist/base/StatusDot.js.map +1 -1
  43. package/dist/base/Tag.d.ts +1 -1
  44. package/dist/base/Tag.js +1 -1
  45. package/dist/base/Tag.js.map +1 -1
  46. package/dist/base/Text.d.ts +1 -1
  47. package/dist/base/Text.js +1 -1
  48. package/dist/base/Text.js.map +1 -1
  49. package/dist/base/VisuallyHidden.d.ts +1 -1
  50. package/dist/base/VisuallyHidden.js +1 -1
  51. package/dist/base/VisuallyHidden.js.map +1 -1
  52. package/dist/base/badge-styles.d.ts +1 -1
  53. package/dist/base/badge-styles.js +1 -1
  54. package/dist/base/badge-styles.js.map +1 -1
  55. package/dist/base/button-core.d.ts +1 -1
  56. package/dist/base/button-core.js +1 -1
  57. package/dist/base/button-core.js.map +1 -1
  58. package/dist/charts/ChordChart.d.ts +1 -1
  59. package/dist/charts/ChordChart.js +1 -1
  60. package/dist/charts/ChordChart.js.map +1 -1
  61. package/dist/charts/DonutChart.d.ts +1 -1
  62. package/dist/charts/DonutChart.js +1 -1
  63. package/dist/charts/DonutChart.js.map +1 -1
  64. package/dist/charts/FunnelChart.d.ts +1 -1
  65. package/dist/charts/FunnelChart.js +1 -1
  66. package/dist/charts/FunnelChart.js.map +1 -1
  67. package/dist/charts/GraphChart.d.ts +1 -1
  68. package/dist/charts/GraphChart.js +1 -1
  69. package/dist/charts/GraphChart.js.map +1 -1
  70. package/dist/charts/MapChart.d.ts +1 -1
  71. package/dist/charts/MapChart.js +1 -1
  72. package/dist/charts/MapChart.js.map +1 -1
  73. package/dist/charts/RadarChart.d.ts +1 -1
  74. package/dist/charts/RadarChart.js +1 -1
  75. package/dist/charts/RadarChart.js.map +1 -1
  76. package/dist/charts/SankeyChart.d.ts +1 -1
  77. package/dist/charts/SankeyChart.js +1 -1
  78. package/dist/charts/SankeyChart.js.map +1 -1
  79. package/dist/charts/TreemapChart.d.ts +1 -1
  80. package/dist/charts/TreemapChart.js +1 -1
  81. package/dist/charts/TreemapChart.js.map +1 -1
  82. package/dist/charts/XYChart.d.ts +1 -1
  83. package/dist/charts/XYChart.js +1 -1
  84. package/dist/charts/XYChart.js.map +1 -1
  85. package/dist/charts/frame.d.ts +1 -1
  86. package/dist/charts/frame.js +1 -1
  87. package/dist/charts/frame.js.map +1 -1
  88. package/dist/code-editor/CodeEditor.js +1 -1
  89. package/dist/code-editor/CodeEditor.js.map +1 -1
  90. package/dist/config/Provider.d.ts +1 -1
  91. package/dist/config/Provider.js +1 -1
  92. package/dist/config/Provider.js.map +1 -1
  93. package/dist/config/createUi.d.ts +1 -1
  94. package/dist/config/createUi.js +1 -1
  95. package/dist/config/createUi.js.map +1 -1
  96. package/dist/config/theme/coffee.d.ts +1 -1
  97. package/dist/config/theme/coffee.js +1 -1
  98. package/dist/config/theme/coffee.js.map +1 -1
  99. package/dist/config/theme/cyberpunk.d.ts +1 -1
  100. package/dist/config/theme/cyberpunk.js +1 -1
  101. package/dist/config/theme/cyberpunk.js.map +1 -1
  102. package/dist/config/theme/dark.d.ts +1 -1
  103. package/dist/config/theme/dark.js +1 -1
  104. package/dist/config/theme/dark.js.map +1 -1
  105. package/dist/config/theme/festive.d.ts +1 -1
  106. package/dist/config/theme/festive.js +1 -1
  107. package/dist/config/theme/festive.js.map +1 -1
  108. package/dist/config/theme/forest.d.ts +1 -1
  109. package/dist/config/theme/forest.js +1 -1
  110. package/dist/config/theme/forest.js.map +1 -1
  111. package/dist/config/theme/high-contrast.d.ts +1 -1
  112. package/dist/config/theme/high-contrast.js +1 -1
  113. package/dist/config/theme/high-contrast.js.map +1 -1
  114. package/dist/config/theme/lemon.d.ts +1 -1
  115. package/dist/config/theme/lemon.js +1 -1
  116. package/dist/config/theme/lemon.js.map +1 -1
  117. package/dist/config/theme/light.d.ts +1 -1
  118. package/dist/config/theme/light.js +1 -1
  119. package/dist/config/theme/light.js.map +1 -1
  120. package/dist/config/theme/midnight.d.ts +1 -1
  121. package/dist/config/theme/midnight.js +1 -1
  122. package/dist/config/theme/midnight.js.map +1 -1
  123. package/dist/config/theme/ocean.d.ts +1 -1
  124. package/dist/config/theme/ocean.js +1 -1
  125. package/dist/config/theme/ocean.js.map +1 -1
  126. package/dist/config/theme/paper.d.ts +1 -1
  127. package/dist/config/theme/paper.js +1 -1
  128. package/dist/config/theme/paper.js.map +1 -1
  129. package/dist/config/theme/sakura.d.ts +1 -1
  130. package/dist/config/theme/sakura.js +1 -1
  131. package/dist/config/theme/sakura.js.map +1 -1
  132. package/dist/config/theme/theme.js +1 -1
  133. package/dist/config/theme/theme.js.map +1 -1
  134. package/dist/config/theme/tokens.d.ts +1 -1
  135. package/dist/config/theme/tokens.js +1 -1
  136. package/dist/config/theme/tokens.js.map +1 -1
  137. package/dist/date/CalendarBoard.d.ts +1 -1
  138. package/dist/date/CalendarBoard.js +1 -1
  139. package/dist/date/CalendarBoard.js.map +1 -1
  140. package/dist/date/CalendarView.d.ts +1 -1
  141. package/dist/date/CalendarView.js +1 -1
  142. package/dist/date/CalendarView.js.map +1 -1
  143. package/dist/date/Countdown.d.ts +1 -1
  144. package/dist/date/Countdown.js +1 -1
  145. package/dist/date/Countdown.js.map +1 -1
  146. package/dist/date/DatePicker.d.ts +1 -1
  147. package/dist/date/DatePicker.js +1 -1
  148. package/dist/date/DatePicker.js.map +1 -1
  149. package/dist/date/DateRangePicker.d.ts +1 -1
  150. package/dist/date/DateRangePicker.js +1 -1
  151. package/dist/date/DateRangePicker.js.map +1 -1
  152. package/dist/date/DateSegmentGroup.d.ts +1 -1
  153. package/dist/date/DateSegmentGroup.js +1 -1
  154. package/dist/date/DateSegmentGroup.js.map +1 -1
  155. package/dist/date/QuarterCalendar.js +1 -1
  156. package/dist/date/QuarterCalendar.js.map +1 -1
  157. package/dist/date/SegmentedField.d.ts +1 -1
  158. package/dist/date/SegmentedField.js +1 -1
  159. package/dist/date/SegmentedField.js.map +1 -1
  160. package/dist/date/TimePicker.d.ts +1 -1
  161. package/dist/date/TimePicker.js +1 -1
  162. package/dist/date/TimePicker.js.map +1 -1
  163. package/dist/date/picker-popover.d.ts +1 -1
  164. package/dist/date/picker-popover.js +1 -1
  165. package/dist/date/picker-popover.js.map +1 -1
  166. package/dist/diagram/Diagram.d.ts +1 -1
  167. package/dist/diagram/Diagram.js +1 -1
  168. package/dist/diagram/Diagram.js.map +1 -1
  169. package/dist/diagram/DiagramControls.d.ts +1 -1
  170. package/dist/diagram/DiagramControls.js +1 -1
  171. package/dist/diagram/DiagramControls.js.map +1 -1
  172. package/dist/diagram/DiagramLanes.d.ts +1 -1
  173. package/dist/diagram/DiagramLanes.js +1 -1
  174. package/dist/diagram/DiagramLanes.js.map +1 -1
  175. package/dist/diagram/DiagramMinimap.d.ts +1 -1
  176. package/dist/diagram/DiagramMinimap.js +1 -1
  177. package/dist/diagram/DiagramMinimap.js.map +1 -1
  178. package/dist/diagram/DiagramNode.d.ts +1 -1
  179. package/dist/diagram/DiagramNode.js +1 -1
  180. package/dist/diagram/DiagramNode.js.map +1 -1
  181. package/dist/display/Accordion.d.ts +1 -1
  182. package/dist/display/Accordion.js +1 -1
  183. package/dist/display/Accordion.js.map +1 -1
  184. package/dist/display/AnimatedNumber.d.ts +1 -1
  185. package/dist/display/AnimatedNumber.js +1 -1
  186. package/dist/display/AnimatedNumber.js.map +1 -1
  187. package/dist/display/Avatar.d.ts +1 -1
  188. package/dist/display/Avatar.js +1 -1
  189. package/dist/display/Avatar.js.map +1 -1
  190. package/dist/display/AvatarGroup.d.ts +1 -1
  191. package/dist/display/AvatarGroup.js +1 -1
  192. package/dist/display/AvatarGroup.js.map +1 -1
  193. package/dist/display/Card.d.ts +1 -1
  194. package/dist/display/Card.js +1 -1
  195. package/dist/display/Card.js.map +1 -1
  196. package/dist/display/Checklist.d.ts +1 -1
  197. package/dist/display/Checklist.js +1 -1
  198. package/dist/display/Checklist.js.map +1 -1
  199. package/dist/display/Collapse.d.ts +1 -1
  200. package/dist/display/Collapse.js +1 -1
  201. package/dist/display/Collapse.js.map +1 -1
  202. package/dist/display/Descriptions.d.ts +1 -1
  203. package/dist/display/Descriptions.js +1 -1
  204. package/dist/display/Descriptions.js.map +1 -1
  205. package/dist/display/Ellipsis.d.ts +1 -1
  206. package/dist/display/Ellipsis.js +1 -1
  207. package/dist/display/Ellipsis.js.map +1 -1
  208. package/dist/display/FieldCompare.d.ts +1 -1
  209. package/dist/display/FieldCompare.js +1 -1
  210. package/dist/display/FieldCompare.js.map +1 -1
  211. package/dist/display/Gauge.d.ts +1 -1
  212. package/dist/display/Gauge.js +1 -1
  213. package/dist/display/Gauge.js.map +1 -1
  214. package/dist/display/Image.d.ts +1 -1
  215. package/dist/display/Image.js +1 -1
  216. package/dist/display/Image.js.map +1 -1
  217. package/dist/display/ItemList.d.ts +1 -1
  218. package/dist/display/ItemList.js +1 -1
  219. package/dist/display/ItemList.js.map +1 -1
  220. package/dist/display/Marquee.d.ts +1 -1
  221. package/dist/display/Marquee.js +1 -1
  222. package/dist/display/Marquee.js.map +1 -1
  223. package/dist/display/ProportionBar.d.ts +1 -1
  224. package/dist/display/ProportionBar.js +1 -1
  225. package/dist/display/ProportionBar.js.map +1 -1
  226. package/dist/display/Sortable.d.ts +1 -1
  227. package/dist/display/Sortable.js +1 -1
  228. package/dist/display/Sortable.js.map +1 -1
  229. package/dist/display/Sparkline.d.ts +1 -1
  230. package/dist/display/Sparkline.js +1 -1
  231. package/dist/display/Sparkline.js.map +1 -1
  232. package/dist/display/Stat.d.ts +1 -1
  233. package/dist/display/Stat.js +1 -1
  234. package/dist/display/Stat.js.map +1 -1
  235. package/dist/display/Timeline.d.ts +1 -1
  236. package/dist/display/Timeline.js +1 -1
  237. package/dist/display/Timeline.js.map +1 -1
  238. package/dist/display/Tree.d.ts +1 -1
  239. package/dist/display/Tree.js +1 -1
  240. package/dist/display/Tree.js.map +1 -1
  241. package/dist/display/VirtualList.d.ts +1 -1
  242. package/dist/display/VirtualList.js +1 -1
  243. package/dist/display/VirtualList.js.map +1 -1
  244. package/dist/display/Watermark.d.ts +1 -1
  245. package/dist/display/Watermark.js +1 -1
  246. package/dist/display/Watermark.js.map +1 -1
  247. package/dist/docs-kit/CodeGroup.d.ts +1 -1
  248. package/dist/docs-kit/CodeGroup.js +1 -1
  249. package/dist/docs-kit/CodeGroup.js.map +1 -1
  250. package/dist/docs-kit/CodePreview.d.ts +1 -1
  251. package/dist/docs-kit/CodePreview.js +1 -1
  252. package/dist/docs-kit/CodePreview.js.map +1 -1
  253. package/dist/docs-kit/ColorSwatch.d.ts +1 -1
  254. package/dist/docs-kit/ColorSwatch.js +1 -1
  255. package/dist/docs-kit/ColorSwatch.js.map +1 -1
  256. package/dist/docs-kit/PropsTable.d.ts +1 -1
  257. package/dist/docs-kit/PropsTable.js +1 -1
  258. package/dist/docs-kit/PropsTable.js.map +1 -1
  259. package/dist/feedback/Alert.d.ts +1 -1
  260. package/dist/feedback/Alert.js +1 -1
  261. package/dist/feedback/Alert.js.map +1 -1
  262. package/dist/feedback/Banner.d.ts +1 -1
  263. package/dist/feedback/Banner.js +1 -1
  264. package/dist/feedback/Banner.js.map +1 -1
  265. package/dist/feedback/Empty.d.ts +1 -1
  266. package/dist/feedback/Empty.js +1 -1
  267. package/dist/feedback/Empty.js.map +1 -1
  268. package/dist/feedback/LoadingBar.d.ts +1 -1
  269. package/dist/feedback/LoadingBar.js +1 -1
  270. package/dist/feedback/LoadingBar.js.map +1 -1
  271. package/dist/feedback/LoadingOverlay.d.ts +1 -1
  272. package/dist/feedback/LoadingOverlay.js +1 -1
  273. package/dist/feedback/LoadingOverlay.js.map +1 -1
  274. package/dist/feedback/Progress.d.ts +1 -1
  275. package/dist/feedback/Progress.js +1 -1
  276. package/dist/feedback/Progress.js.map +1 -1
  277. package/dist/feedback/Result.d.ts +1 -1
  278. package/dist/feedback/Result.js +1 -1
  279. package/dist/feedback/Result.js.map +1 -1
  280. package/dist/feedback/Skeleton.d.ts +1 -1
  281. package/dist/feedback/Skeleton.js +1 -1
  282. package/dist/feedback/Skeleton.js.map +1 -1
  283. package/dist/feedback/SkeletonText.d.ts +1 -1
  284. package/dist/feedback/SkeletonText.js +1 -1
  285. package/dist/feedback/SkeletonText.js.map +1 -1
  286. package/dist/feedback/Toast.d.ts +1 -1
  287. package/dist/feedback/Toast.js +1 -1
  288. package/dist/feedback/Toast.js.map +1 -1
  289. package/dist/form/Field.d.ts +1 -1
  290. package/dist/form/Field.js +1 -1
  291. package/dist/form/Field.js.map +1 -1
  292. package/dist/form/FormErrorSummary.d.ts +1 -1
  293. package/dist/form/FormErrorSummary.js +1 -1
  294. package/dist/form/FormErrorSummary.js.map +1 -1
  295. package/dist/form/FormSection.d.ts +1 -1
  296. package/dist/form/FormSection.js +1 -1
  297. package/dist/form/FormSection.js.map +1 -1
  298. package/dist/form/schemas.d.ts +1 -1
  299. package/dist/form/schemas.js +1 -1
  300. package/dist/form/schemas.js.map +1 -1
  301. package/dist/input/Cascader.d.ts +1 -1
  302. package/dist/input/Cascader.js +1 -1
  303. package/dist/input/Cascader.js.map +1 -1
  304. package/dist/input/CharacterCount.d.ts +1 -1
  305. package/dist/input/CharacterCount.js +1 -1
  306. package/dist/input/CharacterCount.js.map +1 -1
  307. package/dist/input/Checkbox.d.ts +1 -1
  308. package/dist/input/Checkbox.js +1 -1
  309. package/dist/input/Checkbox.js.map +1 -1
  310. package/dist/input/ColorField.d.ts +1 -1
  311. package/dist/input/ColorField.js +1 -1
  312. package/dist/input/ColorField.js.map +1 -1
  313. package/dist/input/Combobox.d.ts +1 -1
  314. package/dist/input/Combobox.js +1 -1
  315. package/dist/input/Combobox.js.map +1 -1
  316. package/dist/input/ConditionBuilder.d.ts +1 -1
  317. package/dist/input/ConditionBuilder.js +1 -1
  318. package/dist/input/ConditionBuilder.js.map +1 -1
  319. package/dist/input/ControlGroup.d.ts +1 -1
  320. package/dist/input/ControlGroup.js +1 -1
  321. package/dist/input/ControlGroup.js.map +1 -1
  322. package/dist/input/FileDrop.d.ts +1 -1
  323. package/dist/input/FileDrop.js +1 -1
  324. package/dist/input/FileDrop.js.map +1 -1
  325. package/dist/input/ListPopover.d.ts +1 -1
  326. package/dist/input/ListPopover.js +1 -1
  327. package/dist/input/ListPopover.js.map +1 -1
  328. package/dist/input/Listbox.d.ts +1 -1
  329. package/dist/input/Listbox.js +1 -1
  330. package/dist/input/Listbox.js.map +1 -1
  331. package/dist/input/Mentions.d.ts +1 -1
  332. package/dist/input/Mentions.js +1 -1
  333. package/dist/input/Mentions.js.map +1 -1
  334. package/dist/input/NumberRangeField.d.ts +1 -1
  335. package/dist/input/NumberRangeField.js +1 -1
  336. package/dist/input/NumberRangeField.js.map +1 -1
  337. package/dist/input/OtpField.d.ts +1 -1
  338. package/dist/input/OtpField.js +1 -1
  339. package/dist/input/OtpField.js.map +1 -1
  340. package/dist/input/PeoplePicker.js +1 -1
  341. package/dist/input/PeoplePicker.js.map +1 -1
  342. package/dist/input/PeoplePickerPanel.d.ts +1 -1
  343. package/dist/input/PeoplePickerPanel.js +1 -1
  344. package/dist/input/PeoplePickerPanel.js.map +1 -1
  345. package/dist/input/Radio.d.ts +1 -1
  346. package/dist/input/Radio.js +1 -1
  347. package/dist/input/Radio.js.map +1 -1
  348. package/dist/input/Rating.d.ts +1 -1
  349. package/dist/input/Rating.js +1 -1
  350. package/dist/input/Rating.js.map +1 -1
  351. package/dist/input/Select.d.ts +1 -1
  352. package/dist/input/Select.js +1 -1
  353. package/dist/input/Select.js.map +1 -1
  354. package/dist/input/SelectedTags.d.ts +1 -1
  355. package/dist/input/SelectedTags.js +1 -1
  356. package/dist/input/SelectedTags.js.map +1 -1
  357. package/dist/input/Slider.d.ts +1 -1
  358. package/dist/input/Slider.js +1 -1
  359. package/dist/input/Slider.js.map +1 -1
  360. package/dist/input/Switch.d.ts +1 -1
  361. package/dist/input/Switch.js +1 -1
  362. package/dist/input/Switch.js.map +1 -1
  363. package/dist/input/TagsInput.d.ts +1 -1
  364. package/dist/input/TagsInput.js +1 -1
  365. package/dist/input/TagsInput.js.map +1 -1
  366. package/dist/input/Textarea.d.ts +1 -1
  367. package/dist/input/Textarea.js +1 -1
  368. package/dist/input/Textarea.js.map +1 -1
  369. package/dist/input/ToggleGroup.d.ts +1 -1
  370. package/dist/input/ToggleGroup.js +1 -1
  371. package/dist/input/ToggleGroup.js.map +1 -1
  372. package/dist/input/Transfer.d.ts +1 -1
  373. package/dist/input/Transfer.js +1 -1
  374. package/dist/input/Transfer.js.map +1 -1
  375. package/dist/input/TreeSelect.d.ts +1 -1
  376. package/dist/input/TreeSelect.js +1 -1
  377. package/dist/input/TreeSelect.js.map +1 -1
  378. package/dist/input/Upload.d.ts +1 -1
  379. package/dist/input/Upload.js +1 -1
  380. package/dist/input/Upload.js.map +1 -1
  381. package/dist/input/choice-styles.d.ts +1 -1
  382. package/dist/input/choice-styles.js +1 -1
  383. package/dist/input/choice-styles.js.map +1 -1
  384. package/dist/input/control.d.ts +1 -1
  385. package/dist/input/control.js +1 -1
  386. package/dist/input/control.js.map +1 -1
  387. package/dist/layout/Affix.d.ts +1 -1
  388. package/dist/layout/Affix.js +1 -1
  389. package/dist/layout/Affix.js.map +1 -1
  390. package/dist/layout/AsideLayout.d.ts +1 -1
  391. package/dist/layout/AsideLayout.js +1 -1
  392. package/dist/layout/AsideLayout.js.map +1 -1
  393. package/dist/layout/BackTop.d.ts +1 -1
  394. package/dist/layout/BackTop.js +1 -1
  395. package/dist/layout/BackTop.js.map +1 -1
  396. package/dist/layout/Container.d.ts +1 -1
  397. package/dist/layout/Container.js +1 -1
  398. package/dist/layout/Container.js.map +1 -1
  399. package/dist/layout/Flex.d.ts +1 -1
  400. package/dist/layout/Flex.js +1 -1
  401. package/dist/layout/Flex.js.map +1 -1
  402. package/dist/layout/Grid.d.ts +1 -1
  403. package/dist/layout/Grid.js +1 -1
  404. package/dist/layout/Grid.js.map +1 -1
  405. package/dist/layout/PageScrollbar.d.ts +1 -1
  406. package/dist/layout/PageScrollbar.js +1 -1
  407. package/dist/layout/PageScrollbar.js.map +1 -1
  408. package/dist/layout/Prose.d.ts +1 -1
  409. package/dist/layout/Prose.js +1 -1
  410. package/dist/layout/Prose.js.map +1 -1
  411. package/dist/layout/ResizeHandle.d.ts +1 -1
  412. package/dist/layout/ResizeHandle.js +1 -1
  413. package/dist/layout/ResizeHandle.js.map +1 -1
  414. package/dist/layout/ScrollArea.d.ts +1 -1
  415. package/dist/layout/ScrollArea.js +1 -1
  416. package/dist/layout/ScrollArea.js.map +1 -1
  417. package/dist/layout/Separator.d.ts +1 -1
  418. package/dist/layout/Separator.js +1 -1
  419. package/dist/layout/Separator.js.map +1 -1
  420. package/dist/layout/Splitter.d.ts +1 -1
  421. package/dist/layout/Splitter.js +1 -1
  422. package/dist/layout/Splitter.js.map +1 -1
  423. package/dist/layout/ViewportFill.d.ts +1 -1
  424. package/dist/layout/ViewportFill.js +1 -1
  425. package/dist/layout/ViewportFill.js.map +1 -1
  426. package/dist/navigation/Breadcrumbs.d.ts +1 -1
  427. package/dist/navigation/Breadcrumbs.js +1 -1
  428. package/dist/navigation/Breadcrumbs.js.map +1 -1
  429. package/dist/navigation/NavBar.d.ts +1 -1
  430. package/dist/navigation/NavBar.js +1 -1
  431. package/dist/navigation/NavBar.js.map +1 -1
  432. package/dist/navigation/NavList.d.ts +1 -1
  433. package/dist/navigation/NavList.js +1 -1
  434. package/dist/navigation/NavList.js.map +1 -1
  435. package/dist/navigation/PageJump.d.ts +1 -1
  436. package/dist/navigation/PageJump.js +1 -1
  437. package/dist/navigation/PageJump.js.map +1 -1
  438. package/dist/navigation/PageSizeSelect.d.ts +1 -1
  439. package/dist/navigation/PageSizeSelect.js +1 -1
  440. package/dist/navigation/PageSizeSelect.js.map +1 -1
  441. package/dist/navigation/Pager.d.ts +1 -1
  442. package/dist/navigation/Pager.js +1 -1
  443. package/dist/navigation/Pager.js.map +1 -1
  444. package/dist/navigation/Pagination.d.ts +1 -1
  445. package/dist/navigation/Pagination.js +1 -1
  446. package/dist/navigation/Pagination.js.map +1 -1
  447. package/dist/navigation/PaginationBar.d.ts +1 -1
  448. package/dist/navigation/PaginationBar.js +1 -1
  449. package/dist/navigation/PaginationBar.js.map +1 -1
  450. package/dist/navigation/SkipLink.d.ts +1 -1
  451. package/dist/navigation/SkipLink.js +1 -1
  452. package/dist/navigation/SkipLink.js.map +1 -1
  453. package/dist/navigation/Steps.d.ts +1 -1
  454. package/dist/navigation/Steps.js +1 -1
  455. package/dist/navigation/Steps.js.map +1 -1
  456. package/dist/navigation/TableOfContents.d.ts +1 -1
  457. package/dist/navigation/TableOfContents.js +1 -1
  458. package/dist/navigation/TableOfContents.js.map +1 -1
  459. package/dist/navigation/Tabs.d.ts +1 -1
  460. package/dist/navigation/Tabs.js +1 -1
  461. package/dist/navigation/Tabs.js.map +1 -1
  462. package/dist/navigation/Toolbar.d.ts +1 -1
  463. package/dist/navigation/Toolbar.js +1 -1
  464. package/dist/navigation/Toolbar.js.map +1 -1
  465. package/dist/overlay/CommandPalette.d.ts +1 -1
  466. package/dist/overlay/CommandPalette.js +1 -1
  467. package/dist/overlay/CommandPalette.js.map +1 -1
  468. package/dist/overlay/Dialog.d.ts +1 -1
  469. package/dist/overlay/Dialog.js +1 -1
  470. package/dist/overlay/Dialog.js.map +1 -1
  471. package/dist/overlay/Drawer.d.ts +1 -1
  472. package/dist/overlay/Drawer.js +1 -1
  473. package/dist/overlay/Drawer.js.map +1 -1
  474. package/dist/overlay/HoverCard.d.ts +1 -1
  475. package/dist/overlay/HoverCard.js +1 -1
  476. package/dist/overlay/HoverCard.js.map +1 -1
  477. package/dist/overlay/Lightbox.d.ts +1 -1
  478. package/dist/overlay/Lightbox.js +1 -1
  479. package/dist/overlay/Lightbox.js.map +1 -1
  480. package/dist/overlay/Menu.d.ts +1 -1
  481. package/dist/overlay/Menu.js +1 -1
  482. package/dist/overlay/Menu.js.map +1 -1
  483. package/dist/overlay/Popconfirm.d.ts +1 -1
  484. package/dist/overlay/Popconfirm.js +1 -1
  485. package/dist/overlay/Popconfirm.js.map +1 -1
  486. package/dist/overlay/Popover.d.ts +1 -1
  487. package/dist/overlay/Popover.js +1 -1
  488. package/dist/overlay/Popover.js.map +1 -1
  489. package/dist/overlay/Tooltip.d.ts +1 -1
  490. package/dist/overlay/Tooltip.js +1 -1
  491. package/dist/overlay/Tooltip.js.map +1 -1
  492. package/dist/overlay/Tour.d.ts +1 -1
  493. package/dist/overlay/Tour.js +1 -1
  494. package/dist/overlay/Tour.js.map +1 -1
  495. package/dist/patterns/ActionBar.d.ts +1 -1
  496. package/dist/patterns/ActionBar.js +1 -1
  497. package/dist/patterns/ActionBar.js.map +1 -1
  498. package/dist/patterns/AppShell.d.ts +1 -1
  499. package/dist/patterns/AppShell.js +1 -1
  500. package/dist/patterns/AppShell.js.map +1 -1
  501. package/dist/patterns/AuthLayout.d.ts +2 -2
  502. package/dist/patterns/AuthLayout.js +2 -2
  503. package/dist/patterns/AuthLayout.js.map +1 -1
  504. package/dist/patterns/CommentThread.d.ts +1 -1
  505. package/dist/patterns/CommentThread.js +1 -1
  506. package/dist/patterns/CommentThread.js.map +1 -1
  507. package/dist/patterns/DataImport.d.ts +1 -1
  508. package/dist/patterns/DataImport.js +1 -1
  509. package/dist/patterns/DataImport.js.map +1 -1
  510. package/dist/patterns/FilterBar.d.ts +1 -1
  511. package/dist/patterns/FilterBar.js +1 -1
  512. package/dist/patterns/FilterBar.js.map +1 -1
  513. package/dist/patterns/KanbanBoard.d.ts +1 -1
  514. package/dist/patterns/KanbanBoard.js +1 -1
  515. package/dist/patterns/KanbanBoard.js.map +1 -1
  516. package/dist/patterns/NotificationCenter.d.ts +1 -1
  517. package/dist/patterns/NotificationCenter.js +1 -1
  518. package/dist/patterns/NotificationCenter.js.map +1 -1
  519. package/dist/patterns/QueryTable.d.ts +1 -1
  520. package/dist/patterns/QueryTable.js +1 -1
  521. package/dist/patterns/QueryTable.js.map +1 -1
  522. package/dist/patterns/SlideCaptcha.d.ts +1 -1
  523. package/dist/patterns/SlideCaptcha.js +1 -1
  524. package/dist/patterns/SlideCaptcha.js.map +1 -1
  525. package/dist/patterns/StepsForm.d.ts +1 -1
  526. package/dist/patterns/StepsForm.js +1 -1
  527. package/dist/patterns/StepsForm.js.map +1 -1
  528. package/dist/table/ColumnHeaderActions.d.ts +1 -1
  529. package/dist/table/ColumnHeaderActions.js +1 -1
  530. package/dist/table/ColumnHeaderActions.js.map +1 -1
  531. package/dist/table/ColumnSettings.d.ts +1 -1
  532. package/dist/table/ColumnSettings.js +1 -1
  533. package/dist/table/ColumnSettings.js.map +1 -1
  534. package/dist/table/ColumnTable.d.ts +1 -1
  535. package/dist/table/ColumnTable.js +1 -1
  536. package/dist/table/ColumnTable.js.map +1 -1
  537. package/dist/table/DataTableView.d.ts +1 -1
  538. package/dist/table/DataTableView.js +1 -1
  539. package/dist/table/DataTableView.js.map +1 -1
  540. package/dist/table/PivotTable.d.ts +1 -1
  541. package/dist/table/PivotTable.js +1 -1
  542. package/dist/table/PivotTable.js.map +1 -1
  543. package/dist/table/SelectionBar.d.ts +1 -1
  544. package/dist/table/SelectionBar.js +1 -1
  545. package/dist/table/SelectionBar.js.map +1 -1
  546. package/dist/table/Table.d.ts +1 -1
  547. package/dist/table/Table.js +1 -1
  548. package/dist/table/Table.js.map +1 -1
  549. package/dist/table/TreeDataTable.d.ts +1 -1
  550. package/dist/table/TreeDataTable.js +1 -1
  551. package/dist/table/TreeDataTable.js.map +1 -1
  552. package/dist/table/table-styles.d.ts +1 -1
  553. package/dist/table/table-styles.js +1 -1
  554. package/dist/table/table-styles.js.map +1 -1
  555. package/dist/theme-customize/ThemeCustomizer.d.ts +1 -1
  556. package/dist/theme-customize/ThemeCustomizer.js +1 -1
  557. package/dist/theme-customize/ThemeCustomizer.js.map +1 -1
  558. package/dist/theme-customize/ThemeThumbnail.d.ts +1 -1
  559. package/dist/theme-customize/ThemeThumbnail.js +1 -1
  560. package/dist/theme-customize/ThemeThumbnail.js.map +1 -1
  561. package/dist/theme-customize/design-tokens.js +1 -1
  562. package/dist/theme-customize/design-tokens.js.map +1 -1
  563. package/dist/three/core/EffectSurface.d.ts +1 -1
  564. package/dist/three/core/EffectSurface.js +1 -1
  565. package/dist/three/core/EffectSurface.js.map +1 -1
  566. package/dist/three/core/ThreeCanvas.d.ts +1 -1
  567. package/dist/three/core/ThreeCanvas.js +1 -1
  568. package/dist/three/core/ThreeCanvas.js.map +1 -1
  569. package/dist/three/effects/Confetti.d.ts +1 -1
  570. package/dist/three/effects/Confetti.js +1 -1
  571. package/dist/three/effects/Confetti.js.map +1 -1
  572. package/dist/three/globe/Globe.d.ts +1 -1
  573. package/dist/three/globe/Globe.js +1 -1
  574. package/dist/three/globe/Globe.js.map +1 -1
  575. package/dist/three/model/ModelViewer.d.ts +1 -1
  576. package/dist/three/model/ModelViewer.js +1 -1
  577. package/dist/three/model/ModelViewer.js.map +1 -1
  578. package/dist/utils/dom/floating.d.ts +1 -1
  579. package/dist/utils/dom/floating.js +1 -1
  580. package/dist/utils/dom/floating.js.map +1 -1
  581. package/dist/utils/dom/ripple.d.ts +1 -1
  582. package/dist/utils/dom/ripple.js +1 -1
  583. package/dist/utils/dom/ripple.js.map +1 -1
  584. package/dist/utils/props.js +1 -1
  585. package/dist/utils/props.js.map +1 -1
  586. package/dist/utils/style/attached.d.ts +1 -1
  587. package/dist/utils/style/attached.js +1 -1
  588. package/dist/utils/style/attached.js.map +1 -1
  589. package/dist/utils/style/item-styles.d.ts +1 -1
  590. package/dist/utils/style/item-styles.js +1 -1
  591. package/dist/utils/style/item-styles.js.map +1 -1
  592. package/dist/utils/style/markers.d.ts +1 -1
  593. package/dist/utils/style/markers.js +1 -1
  594. package/dist/utils/style/markers.js.map +1 -1
  595. package/dist/utils/style/shimmer.d.ts +1 -1
  596. package/dist/utils/style/shimmer.js +1 -1
  597. package/dist/utils/style/shimmer.js.map +1 -1
  598. package/dist/utils/style/styles.d.ts +1 -1
  599. package/dist/utils/style/styles.js +1 -1
  600. package/dist/utils/style/styles.js.map +1 -1
  601. package/dist/utils/style/swatch-styles.d.ts +1 -1
  602. package/dist/utils/style/swatch-styles.js +1 -1
  603. package/dist/utils/style/swatch-styles.js.map +1 -1
  604. package/dist/utils/style/tone-styles.d.ts +1 -1
  605. package/dist/utils/style/tone-styles.js +1 -1
  606. package/dist/utils/style/tone-styles.js.map +1 -1
  607. package/dist/utils/style/transitions.d.ts +1 -1
  608. package/dist/utils/style/transitions.js +1 -1
  609. package/dist/utils/style/transitions.js.map +1 -1
  610. package/dist/utils/style/typography.d.ts +1 -1
  611. package/dist/utils/style/typography.js +1 -1
  612. package/dist/utils/style/typography.js.map +1 -1
  613. package/dist/utils/style/vars.d.ts +1 -1
  614. package/dist/utils/style/vars.js +1 -1
  615. package/dist/utils/style/vars.js.map +1 -1
  616. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"ChordChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/ChordChart.tsx"],"sourcesContent":["/**\n * 弦图:节点排成一圈,两两之间的流量画成弦,看几方之间相互往来的多少(部门协作、地区间人口流动、贸易往来)。\n *\n * <ChordChart aria-label=\"部门协作\" nodes={departments} links={collaborations} />\n *\n * 数据同 SankeyChart(节点 { id, label?, color? },流向 { source, target, value });弦取起点节点的颜色。\n * 悬停一段弧出这个节点的总量,悬停一根弦出“起点 → 终点”的流量;点图例隐藏一个节点,连同它的弦。\n * 单位、加载与空状态、给读屏的数据表(每条流向一行)同其他图表(见 ChartFrame)。\n */\nimport { ChordDiagram, ChordLabelAlignment } from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { colors, fontSizes } from '../config/theme/tokens';\nimport { Skeleton } from '../feedback/Skeleton';\nimport type { NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { flowData, resolveFlowNodes, type FlowLink, type FlowNode } from './flow';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { useSingleChart, type SingleChart } from './single';\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface ChordChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 节点 */\n nodes: readonly FlowNode[];\n /** 流向 */\n links: readonly FlowLink[];\n /** 数值的格式(可缩放,如以万元为单位):提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 320\n */\n height?: number | string;\n /**\n * 图例:点一下隐藏节点;关掉时节点名写在弧的外侧\n * @default true\n */\n legend?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /**\n * 加载中:绘图区显示一个圆形的骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 隐藏的节点(存 id):点图例时写回,父级可以写 _hiddenNodes={ids} */\n _hiddenNodes?: string[];\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n}\n\n/** ChordChart 的样式:root(--vis-chord-diagram-* 主题变量)、skeleton */\nexport const chordChartStyles = css.create({\n root: {\n '--vis-chord-diagram-link-opacity': '0.45',\n '--vis-chord-diagram-link-stroke-color': colors.surface,\n '--vis-chord-diagram-link-stroke-opacity': '0.6',\n '--vis-chord-diagram-link-highlighted-opacity': '0.85',\n '--vis-chord-diagram-link-dimmed-opacity': '0.12',\n '--vis-chord-diagram-node-dimmed-opacity': '0.3',\n '--vis-chord-diagram-label-text-font-size': fontSizes.xs,\n },\n skeleton: {\n display: 'block',\n height: '100%',\n aspectRatio: '1',\n marginInline: 'auto',\n borderRadius: '50%',\n },\n});\n\n/** 交给 Unovis 的节点、流向 */\ntype Data = ReturnType<typeof flowData>;\ntype Node = Data['nodes'][number];\ntype Link = Data['links'][number];\n\n/** 弦图 */\nexport const ChordChart = _component(\n ({\n nodes,\n links,\n valueFormat,\n unit,\n height = 320,\n legend = true,\n tooltip = true,\n loading = false,\n _hiddenNodes: hiddenNodes = _bindable<string[]>([]),\n empty,\n sx,\n ...rest\n }: ChordChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const resolved = _derived(resolveFlowNodes(nodes));\n const visible = _derived(new Map([...resolved].filter(([id]) => !hiddenNodes.includes(id))));\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n const labelOf = (id: string) => resolved.get(id)?.label ?? id;\n\n function toggle(id: string) {\n hiddenNodes = hiddenNodes.includes(id)\n ? hiddenNodes.filter((item) => item !== id)\n : [...hiddenNodes, id];\n }\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<{ nodes: Node[]; links?: Link[] }>(() => ({\n element: plot,\n ready: !loading && nodes.length > 0,\n tooltip,\n build: (instance) => {\n const chord = instance(\n 'chord',\n () => new ChordDiagram<Node, Link>({ linkValue: (link) => link.amount }),\n );\n chord.setConfig({\n linkValue: (link) => link.amount,\n nodeColor: (node) => (node as Node).color,\n linkColor: (link) => (link.source as Node).color,\n // 有图例时不在弧旁写名字:径向排的中文在上下两侧是竖着的,不好读\n nodeLabel: (node) => (legend ? '' : (node as Node).label),\n padAngle: 0.04,\n nodeWidth: 14,\n nodeLabelAlignment: ChordLabelAlignment.Perpendicular,\n nodeLabelColor: () => colors.textMuted,\n });\n return {\n component: chord,\n data: flowData(visible, links),\n triggers: {\n [ChordDiagram.selectors.node]: (node: { data: Node; _state: { value?: number } }) =>\n chart.tooltip(\n chartTooltip(node.data.label, [\n {\n label: lang.chartTotal,\n color: node.data.color,\n value: valueText(node._state.value),\n },\n ]),\n ),\n [ChordDiagram.selectors.link]: (ribbon: {\n data: { source: Node; target: Node; value: NumericValue };\n }) =>\n chart.tooltip(\n chartTooltip(\n lang.chartFlowLabel(ribbon.data.source.label, ribbon.data.target.label),\n [\n {\n label: lang.chartValue,\n color: ribbon.data.source.color,\n value: valueText(ribbon.data.value),\n },\n ],\n ),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n sx={[chordChartStyles.root, sx]}\n unit={unit}\n height={height}\n legend={\n legend\n ? [...resolved.values()].map((node) => ({\n key: node.id,\n label: node.label,\n color: node.color,\n }))\n : []\n }\n hiddenKeys={hiddenNodes}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={chordChartStyles.skeleton} />}\n isEmpty={nodes.length === 0}\n empty={empty}\n table={{\n columns: [lang.chartFlow, unit ? `${lang.chartValue}(${unit})` : lang.chartValue],\n rows: links\n .filter((link) => visible.has(link.source) && visible.has(link.target))\n .map((link) => ({\n header: lang.chartFlowLabel(labelOf(link.source), labelOf(link.target)),\n cells: [format.number(link.value, valueFormat)],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA4DA,IAAa,mBAAmB,IAAI,OAAO;CACzC,MAAM;EACJ,oCAAoC;EACpC,yCAAyC,OAAO;EAChD,2CAA2C;EAC3C,gDAAgD;EAChD,2CAA2C;EAC3C,2CAA2C;EAC3C,4CAA4C,UAAU;CACxD;CACA,UAAU;EACR,SAAS;EACT,QAAQ;EACR,aAAa;EACb,cAAc;EACd,cAAc;CAChB;AACF,CAAC;;;AAQD,IAAa,aAAa,0BACxB,QAAA,SAauB;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UARZ,GAAG;CAAA,MAAA,SAAAA,aAAA,QAAA,UACH,IAAI;CAAA,MAAA,UAAAA,aAAA,QAAA,WACH,IAAI;CAAA,MAAA,UAAAA,aAAA,QAAA,WACJ,KAAK;CAAA,MAAA,cAAAC,SAAA,QAAA,sBACiC,CAAA,GAAE,KAAA,IAAA;CAAA,MAAA,QAAAD,aAAA,QAAA,OAAA;CAAA,MAAA,KAAAA,aAAA,QAAA,IAAA;CAAA,MAG/C,OAAIE,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CACrB,MAAM,SAAS,UAAU;CACzB,MAAM,WAAQC,eAAY,iBAAgB,MAAA,KAAM,CAAC;CACjD,MAAM,UAAOA,eAAY,IAAI,IAAI,CAAC,GAAA,SAAA,KAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAA,MAAY,SAAS,EAAE,CAAC,CAAC,CAAC;CAC3F,MAAM,YAAY,yBAAyB;EAAE,aAAW,YAAA;EAAE,MAAI,KAAA;CAAC,EAAE;CACjE,MAAM,WAAW,OAAe,SAAA,MAAS,IAAI,EAAE,CAAC,EAAE,SAAS;CAE3D,SAAS,OAAO,IAAY;EAC1B,YAAA,QAAc,YAAA,MAAY,SAAS,EAAE,IACjC,YAAA,MAAY,QAAQ,SAAS,SAAS,EAAE,IACxC,CAAC,GAAA,YAAA,OAAgB,EAAE;CACzB;CAEA,IAAI,OAAIC,WAAkC,IAAI;CAC9C,MAAM,QAAqB,sBAAyD;EAClF,SAAO,KAAA;EACP,OAAO,CAAA,QAAA,SAAY,MAAA,MAAM,SAAS;EAClC,SAAO,QAAA;EACP,QAAQ,aAAa;GACnB,MAAM,QAAQ,SACZ,eACM,IAAI,aAAyB,EAAE,YAAY,SAAS,KAAK,OAAO,CAAC,CACzE;GACA,MAAM,UAAU;IACd,YAAY,SAAS,KAAK;IAC1B,YAAY,SAAU,KAAc;IACpC,YAAY,SAAU,KAAK,OAAgB;IAE3C,YAAY,SAAU,OAAA,QAAS,KAAM,KAAc;IACnD,UAAU;IACV,WAAW;IACX,oBAAoB,oBAAoB;IACxC,sBAAsB,OAAO;GAC/B,CAAC;GACD,OAAO;IACL,WAAW;IACX,MAAM,SAAQ,QAAA,OAAA,MAAA,KAAe;IAC7B,UAAU;MACP,aAAa,UAAU,QAAQ,SAC9B,MAAM,QACJ,aAAa,KAAK,KAAK,OAAO,CAC5B;MACE,OAAO,KAAK;MACZ,OAAO,KAAK,KAAK;MACjB,OAAO,UAAU,KAAK,OAAO,KAAK;KACpC,CAAC,CACF,CACH;MACD,aAAa,UAAU,QAAQ,WAG9B,MAAM,QACJ,aACE,KAAK,eAAe,OAAO,KAAK,OAAO,OAAO,OAAO,KAAK,OAAO,KAAK,GACtE,CACE;MACE,OAAO,KAAK;MACZ,OAAO,OAAO,KAAK,OAAO;MAC1B,OAAO,UAAU,OAAO,KAAK,KAAK;KACpC,CAAC,CAEL,CACF;IACJ;GACF;EACF;CACF,EAAE;CAEF,aAAOC,YAAA,YAAAC,cAEC,MAAI;EAAA,MACJ,CAAC,iBAAiB,MAAI,GAAA,KAAA;EAAK,QAAA,KAAA;EAAA,UAAA,OAAA;EAAA,UAI7B,OAAA,QACI,CAAC,GAAG,SAAA,MAAS,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU;GACpC,KAAK,KAAK;GACV,OAAO,KAAK;GACZ,OAAO,KAAK;EACd,EAAE,IACF,CAAA;EAAE,cAAA,YAAA;EAAA,kBAGQ;EAAM,WAAA,QAAA;EAAA,YAAAD,YAAA,UAAA,EAAA,MAEE,iBAAiB,SAAQ,GAAA,IAAA;EAAA,WACxC,MAAA,MAAM,WAAW;EAAC,SAAA,MAAA;EAAA,SAEpB;GACL,SAAS,CAAC,KAAK,WAAW,KAAA,QAAO,GAAG,KAAK,WAAU,GAAA,KAAA,MAAA,KAAc,KAAK,UAAU;GAChF,MAAM,MAAA,MACH,QAAQ,SAAS,QAAA,MAAQ,IAAI,KAAK,MAAM,KAAK,QAAA,MAAQ,IAAI,KAAK,MAAM,CAAC,CAAC,CACtE,KAAK,UAAU;IACd,QAAQ,KAAK,eAAe,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;IACtE,OAAO,CAAC,OAAO,OAAO,KAAK,OAAK,YAAA,KAAa,CAAC;GAChD,EAAE;EACN;EAAC,WAAA,OAAA,OAAA,OAAA,MACS,YAAa,KAAA,QAAO;CAAQ,CAAA,GAAA,IAAA;AAG5C,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"ChordChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/ChordChart.tsx"],"sourcesContent":["/**\n * 弦图:节点排成一圈,两两之间的流量画成弦,看几方之间相互往来的多少(部门协作、地区间人口流动、贸易往来)。\n *\n * <ChordChart aria-label=\"部门协作\" nodes={departments} links={collaborations} />\n *\n * 数据同 SankeyChart(节点 { id, label?, color? },流向 { source, target, value });弦取起点节点的颜色。\n * 悬停一段弧出这个节点的总量,悬停一根弦出“起点 → 终点”的流量;点图例隐藏一个节点,连同它的弦。\n * 单位、加载与空状态、给读屏的数据表(每条流向一行)同其他图表(见 ChartFrame)。\n */\nimport { ChordDiagram, ChordLabelAlignment } from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { colors, fontSizes } from '../config/theme/tokens';\nimport { Skeleton } from '../feedback/Skeleton';\nimport type { NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { flowData, resolveFlowNodes, type FlowLink, type FlowNode } from './flow';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { useSingleChart, type SingleChart } from './single';\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface ChordChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 节点 */\n nodes: readonly FlowNode[];\n /** 流向 */\n links: readonly FlowLink[];\n /** 数值的格式(可缩放,如以万元为单位):提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 320\n */\n height?: number | string;\n /**\n * 图例:点一下隐藏节点;关掉时节点名写在弧的外侧\n * @default true\n */\n legend?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /**\n * 加载中:绘图区显示一个圆形的骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 隐藏的节点(存 id):点图例时写回,父级可以写 _hiddenNodes={ids} */\n _hiddenNodes?: string[];\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n}\n\n/** ChordChart 的样式:root(--vis-chord-diagram-* 主题变量)、skeleton */\nexport const chordChartStyles = css.create({\n root: {\n '--vis-chord-diagram-link-opacity': '0.45',\n '--vis-chord-diagram-link-stroke-color': colors.surface,\n '--vis-chord-diagram-link-stroke-opacity': '0.6',\n '--vis-chord-diagram-link-highlighted-opacity': '0.85',\n '--vis-chord-diagram-link-dimmed-opacity': '0.12',\n '--vis-chord-diagram-node-dimmed-opacity': '0.3',\n '--vis-chord-diagram-label-text-font-size': fontSizes.xs,\n },\n skeleton: {\n display: 'block',\n height: '100%',\n aspectRatio: '1',\n marginInline: 'auto',\n borderRadius: '50%',\n },\n});\n\n/** 交给 Unovis 的节点、流向 */\ntype Data = ReturnType<typeof flowData>;\ntype Node = Data['nodes'][number];\ntype Link = Data['links'][number];\n\n/** 弦图 */\nexport const ChordChart = _component(\n ({\n nodes,\n links,\n valueFormat,\n unit,\n height = 320,\n legend = true,\n tooltip = true,\n loading = false,\n _hiddenNodes: hiddenNodes = _bindable<string[]>([]),\n empty,\n sx,\n ...rest\n }: ChordChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const resolved = _derived(resolveFlowNodes(nodes));\n const visible = _derived(new Map([...resolved].filter(([id]) => !hiddenNodes.includes(id))));\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n const labelOf = (id: string) => resolved.get(id)?.label ?? id;\n\n function toggle(id: string) {\n hiddenNodes = hiddenNodes.includes(id)\n ? hiddenNodes.filter((item) => item !== id)\n : [...hiddenNodes, id];\n }\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<{ nodes: Node[]; links?: Link[] }>(() => ({\n element: plot,\n ready: !loading && nodes.length > 0,\n tooltip,\n build: (instance) => {\n const chord = instance(\n 'chord',\n () => new ChordDiagram<Node, Link>({ linkValue: (link) => link.amount }),\n );\n chord.setConfig({\n linkValue: (link) => link.amount,\n nodeColor: (node) => (node as Node).color,\n linkColor: (link) => (link.source as Node).color,\n // 有图例时不在弧旁写名字:径向排的中文在上下两侧是竖着的,不好读\n nodeLabel: (node) => (legend ? '' : (node as Node).label),\n padAngle: 0.04,\n nodeWidth: 14,\n nodeLabelAlignment: ChordLabelAlignment.Perpendicular,\n nodeLabelColor: () => colors.textMuted,\n });\n return {\n component: chord,\n data: flowData(visible, links),\n triggers: {\n [ChordDiagram.selectors.node]: (node: { data: Node; _state: { value?: number } }) =>\n chart.tooltip(\n chartTooltip(node.data.label, [\n {\n label: lang.chartTotal,\n color: node.data.color,\n value: valueText(node._state.value),\n },\n ]),\n ),\n [ChordDiagram.selectors.link]: (ribbon: {\n data: { source: Node; target: Node; value: NumericValue };\n }) =>\n chart.tooltip(\n chartTooltip(\n lang.chartFlowLabel(ribbon.data.source.label, ribbon.data.target.label),\n [\n {\n label: lang.chartValue,\n color: ribbon.data.source.color,\n value: valueText(ribbon.data.value),\n },\n ],\n ),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n sx={[chordChartStyles.root, sx]}\n unit={unit}\n height={height}\n legend={\n legend\n ? [...resolved.values()].map((node) => ({\n key: node.id,\n label: node.label,\n color: node.color,\n }))\n : []\n }\n hiddenKeys={hiddenNodes}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={chordChartStyles.skeleton} />}\n isEmpty={nodes.length === 0}\n empty={empty}\n table={{\n columns: [lang.chartFlow, unit ? `${lang.chartValue}(${unit})` : lang.chartValue],\n rows: links\n .filter((link) => visible.has(link.source) && visible.has(link.target))\n .map((link) => ({\n header: lang.chartFlowLabel(labelOf(link.source), labelOf(link.target)),\n cells: [format.number(link.value, valueFormat)],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import type { VNodeChild } from 'vue';
3
3
  import { type NumericFormat } from '../config/lang/format';
4
4
  import type { PartProps } from '../utils/props';
@@ -7,7 +7,7 @@ import { resolveColor, seriesValue } from "./series.js";
7
7
  import { useSingleChart } from "./single.js";
8
8
  import { computed, createVNode, shallowRef } from "vue";
9
9
  import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
10
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
10
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  import { Donut } from "@unovis/ts";
12
12
  //#region src/charts/DonutChart.tsx
13
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"DonutChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/DonutChart.tsx"],"sourcesContent":["/**\n * 环形图(arcWidth 为 0 时是饼图):每一行一个扇区,中间写合计;悬停扇区出提示框(数值与占比),点图例隐藏一项。\n *\n * <DonutChart aria-label=\"访问来源\" data={channels} index=\"name\" value=\"visits\" />\n * <DonutChart data={budget} index=\"dept\" value=\"amount\" unit=\"万元\" valueFormat={{ maximumFractionDigits: 0 }} />\n *\n * 颜色默认按顺序取图表色板(itemColor 可以按行给);值可以是 number、bigint、Decimal,提示框与数据表按原值显示。\n * 图例、单位、加载与空状态、给读屏的数据表(类目、数值、占比)同其他图表(见 ChartFrame)。\n */\nimport { Donut } from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { useSingleChart, type SingleChart } from './single';\nimport { resolveColor, seriesValue, type ChartColor, type NumericKey } from './series';\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface DonutChartProps<T extends object>\n extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 数据:每一行一个扇区 */\n data: readonly T[];\n /** 名称字段:图例、提示框、数据表里显示,也是隐藏一项时记的 key */\n index: keyof T & string;\n /** 数值字段 */\n value: NumericKey<T>;\n /** 每一项的颜色;不写时按顺序取图表色板 */\n itemColor?: (row: T, index: number) => ChartColor | undefined;\n /** 数值的格式(可缩放,如以万元为单位):中间的合计、提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 240\n */\n height?: number | string;\n /**\n * 环的粗细(px);0 是饼图\n * @default 28\n */\n arcWidth?: number;\n /** 中间的大字;默认是显示中各项的合计,false 时不写 */\n centerLabel?: string | false;\n /** 中间大字下面的小字;默认是“合计” */\n centerSubLabel?: string;\n /**\n * 图例\n * @default true\n */\n legend?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /**\n * 加载中:绘图区显示一个圆形的骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 隐藏的项(存名称):点图例时写回,父级可以写 _hiddenItems={names} */\n _hiddenItems?: string[];\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个扇区(下钻):参数是这一行与它在 data 里的位置;写了它时指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (row: T, index: number) => void;\n}\n\n/** DonutChart 的样式:skeleton */\nexport const donutChartStyles = css.create({\n skeleton: {\n display: 'block',\n height: '100%',\n aspectRatio: '1',\n marginInline: 'auto',\n borderRadius: '50%',\n },\n});\n\n/** 扇区的数据:一行加上它的名字与颜色 */\ninterface Slice<T> {\n row: T;\n name: string;\n color: string;\n value: NumericValue | undefined;\n}\n\n/** 环形图 */\nexport const DonutChart = _component(\n <T extends object>({\n data,\n index,\n value,\n itemColor,\n valueFormat,\n unit,\n height = 240,\n arcWidth = 28,\n centerLabel,\n centerSubLabel,\n legend = true,\n tooltip = true,\n loading = false,\n onItemClick,\n _hiddenItems: hiddenItems = _bindable<string[]>([]),\n empty,\n ...rest\n }: DonutChartProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n\n // 颜色按原来的顺序定:隐藏一项时其余扇区不换色\n const slices = _derived.by((): Slice<T>[] => {\n return data.map((row, position) => ({\n row,\n name: String(row[index] ?? ''),\n color: resolveColor(itemColor?.(row, position), position),\n value: seriesValue(row, value),\n }));\n });\n const visible = _derived(slices.filter((slice) => !hiddenItems.includes(slice.name)));\n const total = _derived(\n visible.reduce(\n (sum, slice) => sum + (slice.value === undefined ? 0 : toNumber(slice.value)),\n 0,\n ),\n );\n\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n const shareText = (amount: NumericValue | undefined) =>\n amount === undefined || total === 0\n ? lang.emptyValue\n : format.number(toNumber(amount) / total, { style: 'percent', maximumFractionDigits: 1 });\n\n function toggle(name: string) {\n hiddenItems = hiddenItems.includes(name)\n ? hiddenItems.filter((item) => item !== name)\n : [...hiddenItems, name];\n }\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<Slice<T>[]>(() => ({\n element: plot,\n ready: !loading && data.length > 0,\n tooltip,\n build: (instance) => {\n const donut = instance('donut', () => new Donut<Slice<T>>({ value: () => 0 }));\n donut.setConfig({\n value: (slice) => (slice.value === undefined ? 0 : toNumber(slice.value)),\n id: (slice) => slice.name,\n color: (slice) => slice.color,\n arcWidth,\n padAngle: arcWidth > 0 ? 0.01 : 0,\n cornerRadius: arcWidth > 0 ? 3 : 0,\n centralLabel:\n centerLabel === false ? undefined : (centerLabel ?? format.number(total, valueFormat)),\n centralSubLabel: centerLabel === false ? undefined : (centerSubLabel ?? lang.chartTotal),\n showBackground: true,\n events: {\n [Donut.selectors.segment]: {\n click: (arc: { data: Slice<T> }) =>\n onItemClick?.(arc.data.row, data.indexOf(arc.data.row)),\n },\n },\n });\n return {\n component: donut,\n data: [...visible],\n triggers: {\n [Donut.selectors.segment]: (arc: { data: Slice<T> }) =>\n chart.tooltip(\n chartTooltip(arc.data.name, [\n {\n label: lang.chartValue,\n color: arc.data.color,\n value: valueText(arc.data.value),\n },\n {\n label: lang.chartShare,\n color: 'transparent',\n value: shareText(arc.data.value),\n },\n ]),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n unit={unit}\n height={height}\n legend={\n legend\n ? slices.map((slice) => ({ key: slice.name, label: slice.name, color: slice.color }))\n : []\n }\n hiddenKeys={hiddenItems}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={donutChartStyles.skeleton} />}\n clickable={onItemClick != null}\n isEmpty={data.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartCategory,\n unit ? `${lang.chartValue}(${unit})` : lang.chartValue,\n lang.chartShare,\n ],\n rows: visible.map((slice) => ({\n header: slice.name,\n cells: [\n slice.value === undefined ? lang.emptyValue : format.number(slice.value, valueFormat),\n shareText(slice.value),\n ],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"DonutChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/DonutChart.tsx"],"sourcesContent":["/**\n * 环形图(arcWidth 为 0 时是饼图):每一行一个扇区,中间写合计;悬停扇区出提示框(数值与占比),点图例隐藏一项。\n *\n * <DonutChart aria-label=\"访问来源\" data={channels} index=\"name\" value=\"visits\" />\n * <DonutChart data={budget} index=\"dept\" value=\"amount\" unit=\"万元\" valueFormat={{ maximumFractionDigits: 0 }} />\n *\n * 颜色默认按顺序取图表色板(itemColor 可以按行给);值可以是 number、bigint、Decimal,提示框与数据表按原值显示。\n * 图例、单位、加载与空状态、给读屏的数据表(类目、数值、占比)同其他图表(见 ChartFrame)。\n */\nimport { Donut } from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { useSingleChart, type SingleChart } from './single';\nimport { resolveColor, seriesValue, type ChartColor, type NumericKey } from './series';\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface DonutChartProps<T extends object>\n extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 数据:每一行一个扇区 */\n data: readonly T[];\n /** 名称字段:图例、提示框、数据表里显示,也是隐藏一项时记的 key */\n index: keyof T & string;\n /** 数值字段 */\n value: NumericKey<T>;\n /** 每一项的颜色;不写时按顺序取图表色板 */\n itemColor?: (row: T, index: number) => ChartColor | undefined;\n /** 数值的格式(可缩放,如以万元为单位):中间的合计、提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 240\n */\n height?: number | string;\n /**\n * 环的粗细(px);0 是饼图\n * @default 28\n */\n arcWidth?: number;\n /** 中间的大字;默认是显示中各项的合计,false 时不写 */\n centerLabel?: string | false;\n /** 中间大字下面的小字;默认是“合计” */\n centerSubLabel?: string;\n /**\n * 图例\n * @default true\n */\n legend?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /**\n * 加载中:绘图区显示一个圆形的骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 隐藏的项(存名称):点图例时写回,父级可以写 _hiddenItems={names} */\n _hiddenItems?: string[];\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个扇区(下钻):参数是这一行与它在 data 里的位置;写了它时指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (row: T, index: number) => void;\n}\n\n/** DonutChart 的样式:skeleton */\nexport const donutChartStyles = css.create({\n skeleton: {\n display: 'block',\n height: '100%',\n aspectRatio: '1',\n marginInline: 'auto',\n borderRadius: '50%',\n },\n});\n\n/** 扇区的数据:一行加上它的名字与颜色 */\ninterface Slice<T> {\n row: T;\n name: string;\n color: string;\n value: NumericValue | undefined;\n}\n\n/** 环形图 */\nexport const DonutChart = _component(\n <T extends object>({\n data,\n index,\n value,\n itemColor,\n valueFormat,\n unit,\n height = 240,\n arcWidth = 28,\n centerLabel,\n centerSubLabel,\n legend = true,\n tooltip = true,\n loading = false,\n onItemClick,\n _hiddenItems: hiddenItems = _bindable<string[]>([]),\n empty,\n ...rest\n }: DonutChartProps<T>) => {\n const lang = useLang();\n const format = useFormat();\n\n // 颜色按原来的顺序定:隐藏一项时其余扇区不换色\n const slices = _derived.by((): Slice<T>[] => {\n return data.map((row, position) => ({\n row,\n name: String(row[index] ?? ''),\n color: resolveColor(itemColor?.(row, position), position),\n value: seriesValue(row, value),\n }));\n });\n const visible = _derived(slices.filter((slice) => !hiddenItems.includes(slice.name)));\n const total = _derived(\n visible.reduce(\n (sum, slice) => sum + (slice.value === undefined ? 0 : toNumber(slice.value)),\n 0,\n ),\n );\n\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n const shareText = (amount: NumericValue | undefined) =>\n amount === undefined || total === 0\n ? lang.emptyValue\n : format.number(toNumber(amount) / total, { style: 'percent', maximumFractionDigits: 1 });\n\n function toggle(name: string) {\n hiddenItems = hiddenItems.includes(name)\n ? hiddenItems.filter((item) => item !== name)\n : [...hiddenItems, name];\n }\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<Slice<T>[]>(() => ({\n element: plot,\n ready: !loading && data.length > 0,\n tooltip,\n build: (instance) => {\n const donut = instance('donut', () => new Donut<Slice<T>>({ value: () => 0 }));\n donut.setConfig({\n value: (slice) => (slice.value === undefined ? 0 : toNumber(slice.value)),\n id: (slice) => slice.name,\n color: (slice) => slice.color,\n arcWidth,\n padAngle: arcWidth > 0 ? 0.01 : 0,\n cornerRadius: arcWidth > 0 ? 3 : 0,\n centralLabel:\n centerLabel === false ? undefined : (centerLabel ?? format.number(total, valueFormat)),\n centralSubLabel: centerLabel === false ? undefined : (centerSubLabel ?? lang.chartTotal),\n showBackground: true,\n events: {\n [Donut.selectors.segment]: {\n click: (arc: { data: Slice<T> }) =>\n onItemClick?.(arc.data.row, data.indexOf(arc.data.row)),\n },\n },\n });\n return {\n component: donut,\n data: [...visible],\n triggers: {\n [Donut.selectors.segment]: (arc: { data: Slice<T> }) =>\n chart.tooltip(\n chartTooltip(arc.data.name, [\n {\n label: lang.chartValue,\n color: arc.data.color,\n value: valueText(arc.data.value),\n },\n {\n label: lang.chartShare,\n color: 'transparent',\n value: shareText(arc.data.value),\n },\n ]),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n unit={unit}\n height={height}\n legend={\n legend\n ? slices.map((slice) => ({ key: slice.name, label: slice.name, color: slice.color }))\n : []\n }\n hiddenKeys={hiddenItems}\n onLegendToggle={toggle}\n loading={loading}\n skeleton={<Skeleton sx={donutChartStyles.skeleton} />}\n clickable={onItemClick != null}\n isEmpty={data.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartCategory,\n unit ? `${lang.chartValue}(${unit})` : lang.chartValue,\n lang.chartShare,\n ],\n rows: visible.map((slice) => ({\n header: slice.name,\n cells: [\n slice.value === undefined ? lang.emptyValue : format.number(slice.value, valueFormat),\n shareText(slice.value),\n ],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import type { VNodeChild } from 'vue';
3
3
  import { type NumericFormat } from '../config/lang/format';
4
4
  import { type NumericValue } from '../utils/data/numeric';
@@ -7,7 +7,7 @@ import { ChartFrame } from "./frame.js";
7
7
  import { resolveColor } from "./series.js";
8
8
  import { computed, createTextVNode, createVNode } from "vue";
9
9
  import { _component, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
10
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
10
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
11
  //#region src/charts/FunnelChart.tsx
12
12
  /** 漏斗的一个环节 */
13
13
  /** 未声明的属性落到外层 div(role="figure")上,aria-label 是图表的名称 */
@@ -1 +1 @@
1
- {"version":3,"file":"FunnelChart.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps","_createTextVNode"],"sources":["../../src/charts/FunnelChart.tsx"],"sourcesContent":["/**\n * 漏斗图:一串前后相接的环节,看每一步留下多少、在哪一步流失最多(访问 → 注册 → 下单、线索转化)。\n *\n * <FunnelChart aria-label=\"渠道转化\" stages={[{ label: '提交建议', value: 120 }, { label: '立项', value: 46 }]} unit=\"项\" />\n *\n * 每个环节一条居中的横条,长短按数值(最大的环节占满);环节之间写比上一环节的转化率,末尾写总转化。\n * 横条默认同一个颜色(chart1),环节可以单独给 color。Unovis 没有漏斗图:这里用主题 tokens 直接画,\n * 外层结构(单位、加载与空状态、给读屏的数据表)同其他图表(见 ChartFrame)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, type ChartFrameParts } from './frame';\nimport { resolveColor, type ChartColor } from './series';\nimport { t } from '../config/theme/tokens';\n\n/** 漏斗的一个环节 */\nexport interface FunnelStage {\n /** 名称 */\n label: string;\n /** 数值:number、bigint 或 Decimal */\n value: NumericValue;\n /** 颜色;不写时用图表的 color */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface FunnelChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 各环节:从上到下 */\n stages: readonly FunnelStage[];\n /** 数值的格式(可缩放):横条旁的数值与数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 横条的颜色\n * @default 'chart1'\n */\n color?: ChartColor;\n /**\n * 环节之间写转化率,末尾写总转化\n * @default true\n */\n rates?: boolean;\n /**\n * 加载中:显示几条骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个环节(下钻):参数是这个环节与它的位置;写了它时指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (stage: FunnelStage, index: number) => void;\n}\n\n/** FunnelChart 的样式:list、row、label、track、bar、value、rate… */\nexport const funnelChartStyles = css.create({\n // 名称 | 居中的横条 | 数值:三列由整个列表定宽,各行用 subgrid 对齐\n list: {\n display: 'grid',\n gridTemplateColumns: 'max-content minmax(0, 1fr) max-content',\n columnGap: '_md',\n },\n row: {\n display: 'grid',\n gridColumn: '1 / -1',\n gridTemplateColumns: 'subgrid',\n alignItems: 'center',\n paddingBlock: '2px',\n paddingInline: '_xs',\n borderRadius: '_sm',\n },\n rowClickable: { backgroundColor: { default: 'transparent', ':hover': '_fill' } },\n label: { color: '_text', textAlign: 'end', whiteSpace: 'nowrap' },\n track: { display: 'flex', justifyContent: 'center' },\n bar: {\n height: '1.75rem',\n minWidth: '2px',\n borderRadius: '_sm',\n transition: `width ${t.durations.md} ${t.easings.standard}`,\n },\n value: { fontVariantNumeric: 'tabular-nums', fontWeight: '_medium', whiteSpace: 'nowrap' },\n // 环节之间:转化率写在中间那一列,小号的次要文字\n rate: {\n display: 'grid',\n gridColumn: '1 / -1',\n gridTemplateColumns: 'subgrid',\n paddingInline: '_xs',\n color: '_textMuted',\n fontSize: '_xs',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: '_tight',\n },\n rateText: { gridColumn: '2', textAlign: 'center' },\n overall: { gridColumn: '2 / 4', textAlign: 'center', paddingBlockStart: '_xs' },\n skeleton: { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '_sm' },\n skeletonBar: { height: '1.75rem', borderRadius: '_sm' },\n});\n\n// 横条的宽度与颜色随数据变:单独一个 create(见 COMPONENTS.md §4)\n/** FunnelChart 的样式:barSize、skeletonWidth */\nexport const funnelChartDynamicStyles = css.create({\n barSize: (width: string, color: string) => ({ width, backgroundColor: color }),\n skeletonWidth: (width: string) => ({ width }),\n});\n\n/** 骨架横条的宽度:从宽到窄 */\nconst SKELETON_WIDTHS = ['90%', '68%', '46%', '28%'];\n\n/** 漏斗图 */\nexport const FunnelChart = _component(\n ({\n stages,\n valueFormat,\n unit,\n color = 'chart1',\n rates = true,\n loading = false,\n empty,\n onItemClick,\n ...rest\n }: FunnelChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const numbers = _derived(stages.map((stage) => Math.max(toNumber(stage.value), 0)));\n const max = _derived(Math.max(0, ...numbers));\n const percent = (value: number) =>\n format.number(value, { style: 'percent', maximumFractionDigits: 1 });\n /** 第 index 个环节比 base 个环节的转化率;base 为 0 时没有 */\n const rate = (index: number, base: number) =>\n numbers[base] ? percent(numbers[index]! / numbers[base]!) : lang.emptyValue;\n const valueText = (stage: FunnelStage) =>\n format.number(stage.value, unit ? { ...valueFormat, suffix: unit } : valueFormat);\n\n return () => (\n <ChartFrame\n {...rest}\n unit={unit}\n height=\"auto\"\n legend={[]}\n hiddenKeys={[]}\n onLegendToggle={() => {}}\n loading={loading}\n skeleton={\n <div aria-hidden=\"true\" {...css.attrs(funnelChartStyles.skeleton)}>\n {SKELETON_WIDTHS.map((width) => (\n <Skeleton\n key={width}\n sx={[funnelChartStyles.skeletonBar, funnelChartDynamicStyles.skeletonWidth(width)]}\n />\n ))}\n </div>\n }\n isEmpty={stages.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartStage,\n unit ? `${lang.chartValue}(${unit})` : lang.chartValue,\n lang.chartStepRate,\n lang.chartOverallRate,\n ],\n rows: stages.map((stage, index) => ({\n header: stage.label,\n cells: [\n format.number(stage.value, valueFormat),\n index === 0 ? lang.emptyValue : rate(index, index - 1),\n index === 0 ? lang.emptyValue : rate(index, 0),\n ],\n })),\n }}\n plot={\n <div {...css.attrs(funnelChartStyles.list)}>\n {stages.map((stage, index) => [\n index > 0 && rates && (\n <div key={`rate-${index}`} {...css.attrs(funnelChartStyles.rate)}>\n <span {...css.attrs(funnelChartStyles.rateText)}>↓ {rate(index, index - 1)}</span>\n </div>\n ),\n <div\n key={`stage-${index}`}\n {...css.attrs(funnelChartStyles.row, onItemClick && funnelChartStyles.rowClickable)}\n onClick={onItemClick && (() => onItemClick(stage, index))}\n >\n <span {...css.attrs(funnelChartStyles.label)}>{stage.label}</span>\n <span {...css.attrs(funnelChartStyles.track)}>\n <span\n {...css.attrs(\n funnelChartStyles.bar,\n funnelChartDynamicStyles.barSize(\n max ? `${(numbers[index]! / max) * 100}%` : '0%',\n resolveColor(stage.color ?? color, index),\n ),\n )}\n />\n </span>\n <span {...css.attrs(funnelChartStyles.value)}>{valueText(stage)}</span>\n </div>,\n ])}\n {rates && stages.length > 1 && (\n <div {...css.attrs(funnelChartStyles.rate)}>\n <span {...css.attrs(funnelChartStyles.overall)}>\n {lang.chartOverallRate} {rate(stages.length - 1, 0)}\n </span>\n </div>\n )}\n </div>\n }\n clickable={onItemClick != null}\n />\n );\n },\n);\n"],"mappings":"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"}
1
+ {"version":3,"file":"FunnelChart.js","names":["_vtp_readonlyProp","_vtp_restProps","_vue_computed","_createVNode","_mergeProps","_createTextVNode"],"sources":["../../src/charts/FunnelChart.tsx"],"sourcesContent":["/**\n * 漏斗图:一串前后相接的环节,看每一步留下多少、在哪一步流失最多(访问 → 注册 → 下单、线索转化)。\n *\n * <FunnelChart aria-label=\"渠道转化\" stages={[{ label: '提交建议', value: 120 }, { label: '立项', value: 46 }]} unit=\"项\" />\n *\n * 每个环节一条居中的横条,长短按数值(最大的环节占满);环节之间写比上一环节的转化率,末尾写总转化。\n * 横条默认同一个颜色(chart1),环节可以单独给 color。Unovis 没有漏斗图:这里用主题 tokens 直接画,\n * 外层结构(单位、加载与空状态、给读屏的数据表)同其他图表(见 ChartFrame)。\n */\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, type ChartFrameParts } from './frame';\nimport { resolveColor, type ChartColor } from './series';\nimport { t } from '../config/theme/tokens';\n\n/** 漏斗的一个环节 */\nexport interface FunnelStage {\n /** 名称 */\n label: string;\n /** 数值:number、bigint 或 Decimal */\n value: NumericValue;\n /** 颜色;不写时用图表的 color */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface FunnelChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 各环节:从上到下 */\n stages: readonly FunnelStage[];\n /** 数值的格式(可缩放):横条旁的数值与数据表共用 */\n valueFormat?: NumericFormat;\n /** 单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 横条的颜色\n * @default 'chart1'\n */\n color?: ChartColor;\n /**\n * 环节之间写转化率,末尾写总转化\n * @default true\n */\n rates?: boolean;\n /**\n * 加载中:显示几条骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个环节(下钻):参数是这个环节与它的位置;写了它时指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (stage: FunnelStage, index: number) => void;\n}\n\n/** FunnelChart 的样式:list、row、label、track、bar、value、rate… */\nexport const funnelChartStyles = css.create({\n // 名称 | 居中的横条 | 数值:三列由整个列表定宽,各行用 subgrid 对齐\n list: {\n display: 'grid',\n gridTemplateColumns: 'max-content minmax(0, 1fr) max-content',\n columnGap: '_md',\n },\n row: {\n display: 'grid',\n gridColumn: '1 / -1',\n gridTemplateColumns: 'subgrid',\n alignItems: 'center',\n paddingBlock: '2px',\n paddingInline: '_xs',\n borderRadius: '_sm',\n },\n rowClickable: { backgroundColor: { default: 'transparent', ':hover': '_fill' } },\n label: { color: '_text', textAlign: 'end', whiteSpace: 'nowrap' },\n track: { display: 'flex', justifyContent: 'center' },\n bar: {\n height: '1.75rem',\n minWidth: '2px',\n borderRadius: '_sm',\n transition: `width ${t.durations.md} ${t.easings.standard}`,\n },\n value: { fontVariantNumeric: 'tabular-nums', fontWeight: '_medium', whiteSpace: 'nowrap' },\n // 环节之间:转化率写在中间那一列,小号的次要文字\n rate: {\n display: 'grid',\n gridColumn: '1 / -1',\n gridTemplateColumns: 'subgrid',\n paddingInline: '_xs',\n color: '_textMuted',\n fontSize: '_xs',\n fontVariantNumeric: 'tabular-nums',\n lineHeight: '_tight',\n },\n rateText: { gridColumn: '2', textAlign: 'center' },\n overall: { gridColumn: '2 / 4', textAlign: 'center', paddingBlockStart: '_xs' },\n skeleton: { display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '_sm' },\n skeletonBar: { height: '1.75rem', borderRadius: '_sm' },\n});\n\n// 横条的宽度与颜色随数据变:单独一个 create(见 COMPONENTS.md §4)\n/** FunnelChart 的样式:barSize、skeletonWidth */\nexport const funnelChartDynamicStyles = css.create({\n barSize: (width: string, color: string) => ({ width, backgroundColor: color }),\n skeletonWidth: (width: string) => ({ width }),\n});\n\n/** 骨架横条的宽度:从宽到窄 */\nconst SKELETON_WIDTHS = ['90%', '68%', '46%', '28%'];\n\n/** 漏斗图 */\nexport const FunnelChart = _component(\n ({\n stages,\n valueFormat,\n unit,\n color = 'chart1',\n rates = true,\n loading = false,\n empty,\n onItemClick,\n ...rest\n }: FunnelChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const numbers = _derived(stages.map((stage) => Math.max(toNumber(stage.value), 0)));\n const max = _derived(Math.max(0, ...numbers));\n const percent = (value: number) =>\n format.number(value, { style: 'percent', maximumFractionDigits: 1 });\n /** 第 index 个环节比 base 个环节的转化率;base 为 0 时没有 */\n const rate = (index: number, base: number) =>\n numbers[base] ? percent(numbers[index]! / numbers[base]!) : lang.emptyValue;\n const valueText = (stage: FunnelStage) =>\n format.number(stage.value, unit ? { ...valueFormat, suffix: unit } : valueFormat);\n\n return () => (\n <ChartFrame\n {...rest}\n unit={unit}\n height=\"auto\"\n legend={[]}\n hiddenKeys={[]}\n onLegendToggle={() => {}}\n loading={loading}\n skeleton={\n <div aria-hidden=\"true\" {...css.attrs(funnelChartStyles.skeleton)}>\n {SKELETON_WIDTHS.map((width) => (\n <Skeleton\n key={width}\n sx={[funnelChartStyles.skeletonBar, funnelChartDynamicStyles.skeletonWidth(width)]}\n />\n ))}\n </div>\n }\n isEmpty={stages.length === 0}\n empty={empty}\n table={{\n columns: [\n lang.chartStage,\n unit ? `${lang.chartValue}(${unit})` : lang.chartValue,\n lang.chartStepRate,\n lang.chartOverallRate,\n ],\n rows: stages.map((stage, index) => ({\n header: stage.label,\n cells: [\n format.number(stage.value, valueFormat),\n index === 0 ? lang.emptyValue : rate(index, index - 1),\n index === 0 ? lang.emptyValue : rate(index, 0),\n ],\n })),\n }}\n plot={\n <div {...css.attrs(funnelChartStyles.list)}>\n {stages.map((stage, index) => [\n index > 0 && rates && (\n <div key={`rate-${index}`} {...css.attrs(funnelChartStyles.rate)}>\n <span {...css.attrs(funnelChartStyles.rateText)}>↓ {rate(index, index - 1)}</span>\n </div>\n ),\n <div\n key={`stage-${index}`}\n {...css.attrs(funnelChartStyles.row, onItemClick && funnelChartStyles.rowClickable)}\n onClick={onItemClick && (() => onItemClick(stage, index))}\n >\n <span {...css.attrs(funnelChartStyles.label)}>{stage.label}</span>\n <span {...css.attrs(funnelChartStyles.track)}>\n <span\n {...css.attrs(\n funnelChartStyles.bar,\n funnelChartDynamicStyles.barSize(\n max ? `${(numbers[index]! / max) * 100}%` : '0%',\n resolveColor(stage.color ?? color, index),\n ),\n )}\n />\n </span>\n <span {...css.attrs(funnelChartStyles.value)}>{valueText(stage)}</span>\n </div>,\n ])}\n {rates && stages.length > 1 && (\n <div {...css.attrs(funnelChartStyles.rate)}>\n <span {...css.attrs(funnelChartStyles.overall)}>\n {lang.chartOverallRate} {rate(stages.length - 1, 0)}\n </span>\n </div>\n )}\n </div>\n }\n clickable={onItemClick != null}\n />\n );\n },\n);\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
1
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
2
2
  import type { VNodeChild } from 'vue';
3
3
  import { type NumericFormat } from '../config/lang/format';
4
4
  import { type NumericValue } from '../utils/data/numeric';
@@ -8,7 +8,7 @@ import { resolveColor } from "./series.js";
8
8
  import { useSingleChart } from "./single.js";
9
9
  import { computed, createVNode, shallowRef } from "vue";
10
10
  import { _component, bindable, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
11
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
11
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
12
12
  import { Graph, GraphLayoutType, GraphLinkArrowStyle, GraphLinkStyle, GraphNodeSelectionHighlightMode, GraphNodeShape } from "@unovis/ts";
13
13
  //#region src/charts/GraphChart.tsx
14
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"GraphChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/GraphChart.tsx"],"sourcesContent":["/**\n * 网络图:节点与连线,看谁和谁有关系、关系有多强(案例与触发事件的匹配、团队与供应商的协作、依赖关系)。\n *\n * <GraphChart aria-label=\"协作关系\" nodes={nodes} links={links} layout=\"dagre\" groups={teams} />\n *\n * 节点是 { id, label?, sublabel?, group?, color?, shape?, size? },连线是 { source, target, value?, label?, dashed? }。\n * 布局交给 Unovis 的 Graph:force(默认,力导向)、dagre(分层,direction 定方向)、circular、concentric、parallel\n * (按 group 分列)、elk(分层且支持分组框,较大,用到时才加载)。布局异步算好再画,第一帧是空的。\n * 写了 groups 时同组的节点框在一起(dagre、elk、parallel 布局;力导向、环形布局里组只决定颜色,框会互相盖住);\n * 节点的颜色默认按组取色板,没有组时都是 chart1。\n * 连线写了 value 时按大小加粗(1–6px),悬停看“起点 → 终点”与数值。点节点选中它(selected 双向绑定),\n * 与它不相连的节点、连线变淡;点空白处取消。能缩放、拖动画布(zoom={false} 关掉),双击回到全图。\n * 给读屏的数据表每条连线一行;单位、加载与空状态同其他图表(见 ChartFrame)。\n */\nimport {\n Graph,\n GraphLayoutType,\n GraphLinkArrowStyle,\n GraphLinkStyle,\n GraphNodeSelectionHighlightMode,\n GraphNodeShape,\n} from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { colors, fontSizes, opacities } from '../config/theme/tokens';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { resolveColor, type ChartColor } from './series';\nimport { useSingleChart, type SingleChart } from './single';\n\n/** 节点的形状 */\nexport interface GraphChartShapes {\n /** 圆(默认) */\n circle: unknown;\n /** 方块 */\n square: unknown;\n /** 六边形 */\n hexagon: unknown;\n /** 三角 */\n triangle: unknown;\n}\n\n/** 布局 */\nexport interface GraphChartLayouts {\n /** 力导向(默认):相连的靠近、不相连的推开,适合看关系疏密 */\n force: unknown;\n /** 分层:沿 direction 一层层排开,适合有先后、上下游的关系 */\n dagre: unknown;\n /** 排成一圈 */\n circular: unknown;\n /** 同心圆:连得多的在中间 */\n concentric: unknown;\n /** 按 group 分列,组内按连接排 */\n parallel: unknown;\n /** 分层,分组框更规整(elkjs,约 1.6 MB,用到时才加载) */\n elk: unknown;\n}\n\n/** 一个节点 */\nexport interface GraphChartNode {\n /** id:连线里用它指节点 */\n id: string;\n /** 名称,写在节点下面;不写时用 id */\n label?: string;\n /** 名称下面的小字 */\n sublabel?: string;\n /** 所在的组(groups 里的 id):同组的框在一起、颜色相同 */\n group?: string;\n /** 颜色;不写时按组取色板,没有组时是 chart1 */\n color?: ChartColor;\n /** 形状,默认 circle */\n shape?: keyof GraphChartShapes;\n /** 大小(px),默认 28 */\n size?: number;\n}\n\n/** 一条连线 */\nexport interface GraphChartLink {\n /** 起点节点的 id */\n source: string;\n /** 终点节点的 id */\n target: string;\n /** 强度:写了时按大小加粗;提示框、数据表里显示 */\n value?: NumericValue;\n /** 线上的短标签(几个字以内) */\n label?: string;\n /** 虚线:弱关系、待定的关系 */\n dashed?: boolean;\n /** 颜色;默认是边框色 */\n color?: ChartColor;\n}\n\n/** 一组节点 */\nexport interface GraphChartGroup {\n /** 组的 id:节点的 group 指它 */\n id: string;\n /** 组名:写在框上 */\n label: string;\n /** 颜色;不写时按组的顺序取色板 */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface GraphChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 节点 */\n nodes: readonly GraphChartNode[];\n /** 连线 */\n links: readonly GraphChartLink[];\n /** 分组:同组的节点框在一起(dagre、elk、parallel 布局),颜色相同 */\n groups?: readonly GraphChartGroup[];\n /**\n * 布局\n * @default 'force'\n */\n layout?: keyof GraphChartLayouts;\n /**\n * 分层布局(dagre、elk)的方向:LR 从左到右,TB 从上到下\n * @default 'LR'\n */\n direction?: 'LR' | 'TB';\n /** 连线带箭头;默认分层布局(dagre、elk)带,其余不带 */\n arrows?: boolean;\n /** 连线数值的格式:提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 连线数值的单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 360\n */\n height?: number | string;\n /**\n * 能缩放、拖动画布\n * @default true\n */\n zoom?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /** 选中的节点 id:点节点时写回,父级写 _selected={x};点空白处变回 null */\n _selected?: string | null;\n /**\n * 加载中:绘图区显示骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个节点(下钻):参数是这个节点与它的位置;写了它时节点的指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (node: GraphChartNode, index: number) => void;\n}\n\n/** GraphChart 的样式:root(--vis-graph-* 主题变量)、skeleton */\nexport const graphChartStyles = css.create({\n root: {\n '--vis-graph-node-stroke-color': colors.surface,\n '--vis-graph-node-label-text-color': colors.text,\n '--vis-graph-node-label-font-size': fontSizes.xs,\n '--vis-graph-node-label-background': colors.surface,\n '--vis-graph-node-sublabel-text-color': colors.textMuted,\n '--vis-graph-node-sublabel-font-size': fontSizes.xs,\n '--vis-graph-node-selection-color': colors.accent,\n '--vis-graph-node-greyout-color': colors.surfaceMuted,\n '--vis-graph-node-greyout-opacity': opacities.disabled,\n '--vis-graph-link-stroke-color': colors.borderStrong,\n '--vis-graph-link-greyout-opacity': '0.25',\n '--vis-graph-link-label-background': colors.fill,\n '--vis-graph-link-label-text-color-dark': colors.text,\n '--vis-graph-link-label-font-size': fontSizes.xs,\n '--vis-graph-panel-fill-color': colors.surfaceMuted,\n '--vis-graph-panel-border-color': colors.borderMuted,\n '--vis-graph-panel-label-color': colors.textMuted,\n '--vis-graph-panel-label-background': colors.surface,\n '--vis-graph-panel-label-font-size': fontSizes.xs,\n '--vis-graph-panel-label-font-weight': '500',\n },\n skeleton: { display: 'block', width: '100%', height: '100%' },\n});\n\nconst LAYOUTS: Record<keyof GraphChartLayouts, GraphLayoutType> = {\n force: GraphLayoutType.Force,\n dagre: GraphLayoutType.Dagre,\n circular: GraphLayoutType.Circular,\n concentric: GraphLayoutType.Concentric,\n parallel: GraphLayoutType.Parallel,\n elk: GraphLayoutType.Elk,\n};\n\nconst SHAPES: Record<keyof GraphChartShapes, GraphNodeShape> = {\n circle: GraphNodeShape.Circle,\n square: GraphNodeShape.Square,\n hexagon: GraphNodeShape.Hexagon,\n triangle: GraphNodeShape.Triangle,\n};\n\n/** 交给 Unovis 的节点:带上名称与颜色;Unovis 会往上写布局用的字段,每次都复制一份 */\ninterface Node extends GraphChartNode {\n label: string;\n fill: string;\n index: number;\n}\n/** 交给 Unovis 的连线:数值转成 number 算粗细 */\ninterface Link extends GraphChartLink {\n amount: number | undefined;\n}\n/** Unovis 布局后:连线的起点、终点换成了节点对象 */\ntype LaidOutLink = Omit<Link, 'source' | 'target'> & { source: Node; target: Node };\n\n/** 网络图 */\nexport const GraphChart = _component(\n ({\n nodes,\n links,\n groups,\n layout = 'force',\n direction = 'LR',\n arrows,\n valueFormat,\n unit,\n height = 360,\n zoom = true,\n tooltip = true,\n _selected: selected = _bindable<string | null>(null),\n loading = false,\n empty,\n onItemClick,\n sx,\n ...rest\n }: GraphChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n\n const groupColors = _derived(\n new Map(\n (groups ?? []).map((group, position) => [group.id, resolveColor(group.color, position)]),\n ),\n );\n const resolved = _derived(\n nodes.map((node, index): Node => ({\n ...node,\n label: node.label ?? node.id,\n fill: node.color\n ? resolveColor(node.color, 0)\n : ((node.group && groupColors.get(node.group)) ?? resolveColor('chart1', 0)),\n index,\n })),\n );\n const byId = _derived(new Map(resolved.map((node) => [node.id, node])));\n const labelOf = (id: string) => byId.get(id)?.label ?? id;\n // 只留两端都在的连线;最大值用来把粗细缩放到 1–6px\n const shownLinks = _derived(\n links\n .filter((link) => byId.has(link.source) && byId.has(link.target))\n .map((link): Link => ({\n ...link,\n amount: link.value === undefined ? undefined : toNumber(link.value),\n })),\n );\n const maxAmount = _derived(Math.max(0, ...shownLinks.map((link) => link.amount ?? 0)));\n const degree = _derived.by(() => {\n const counts = new Map<string, number>();\n for (const link of shownLinks) {\n counts.set(link.source, (counts.get(link.source) ?? 0) + 1);\n counts.set(link.target, (counts.get(link.target) ?? 0) + 1);\n }\n return counts;\n });\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<{ nodes: Node[]; links?: Link[] }>(() => ({\n element: plot,\n ready: !loading && nodes.length > 0,\n tooltip,\n build: (instance) => {\n const graph = instance('graph', () => new Graph<Node, Link>({}));\n const layered = layout === 'dagre' || layout === 'elk';\n // 分组框只在按层、按列排的布局里画:其余布局不按组排,框会互相盖住\n const framed = layered || layout === 'parallel';\n graph.setConfig({\n layoutType: LAYOUTS[layout],\n layoutNodeGroup: (node) => node.group ?? '',\n layoutGroupOrder: groups?.map((group) => group.id),\n // 分组框比节点宽出一圈:层与层之间留够,框不相互压住\n dagreLayoutSettings: {\n rankdir: direction,\n nodesep: groups?.length ? 48 : 36,\n ranksep: groups?.length ? 150 : 96,\n },\n layoutElkSettings: {\n 'elk.direction': direction === 'LR' ? 'RIGHT' : 'DOWN',\n 'elk.spacing.nodeNode': '36',\n 'elk.layered.spacing.nodeNodeBetweenLayers': '96',\n },\n layoutElkNodeGroups: groups?.length ? [(node) => node.group ?? ''] : undefined,\n forceLayoutSettings: { linkDistance: 90, charge: -600 },\n nodeSize: (node) => node.size ?? 28,\n nodeShape: (node) => SHAPES[node.shape ?? 'circle'],\n nodeFill: (node) => node.fill,\n nodeStrokeWidth: 2,\n nodeLabel: (node) => node.label,\n nodeSubLabel: (node) => node.sublabel ?? '',\n nodeLabelTrimLength: 16,\n // 不用图标字体:节点只是色块\n nodeIcon: () => '',\n linkWidth: (link) =>\n link.amount === undefined || maxAmount === 0 ? 1.5 : 1 + (5 * link.amount) / maxAmount,\n linkStroke: (link) => (link.color ? resolveColor(link.color, 0) : undefined),\n linkStyle: (link) => (link.dashed ? GraphLinkStyle.Dashed : GraphLinkStyle.Solid),\n linkArrow: (arrows ?? layered) ? GraphLinkArrowStyle.Single : undefined,\n linkLabel: (link) => (link.label ? { text: link.label } : undefined),\n linkCurvature: layered ? 0 : 0.2,\n panels: (framed ? (groups ?? []) : [])\n .filter((group) => resolved.some((node) => node.group === group.id))\n .map((group) => ({\n nodes: resolved.filter((node) => node.group === group.id).map((node) => node.id),\n label: group.label,\n padding: 16,\n borderColor: groupColors.get(group.id),\n })),\n selectedNodeId: selected ?? undefined,\n nodeSelectionHighlightMode: GraphNodeSelectionHighlightMode.GreyoutNonConnected,\n disableZoom: !zoom,\n disableDrag: !zoom,\n disableBrush: true,\n // 上方多留一些:分组框的组名写在框顶外面\n fitViewPadding: { top: 48, right: 32, bottom: 32, left: 32 },\n events: {\n [Graph.selectors.node]: {\n click: (node: Node) => {\n selected = node.id;\n onItemClick?.(nodes[node.index]!, node.index);\n },\n },\n [Graph.selectors.background]: {\n click: () => (selected = null),\n // 双击空白回到全图\n dblclick: () => graph.fitView(),\n },\n },\n });\n return {\n component: graph,\n data: {\n nodes: resolved.map((node) => ({ ...node })),\n links: shownLinks.map((link) => ({ ...link })),\n },\n triggers: {\n [Graph.selectors.node]: (node: Node) =>\n chart.tooltip(\n chartTooltip(node.label, [\n ...(node.sublabel\n ? [{ label: node.sublabel, color: 'transparent', value: '' }]\n : []),\n {\n label: lang.chartDegree(degree.get(node.id) ?? 0),\n color: node.fill,\n value: '',\n },\n ]),\n ),\n [Graph.selectors.link]: (link: LaidOutLink) =>\n chart.tooltip(\n chartTooltip(lang.chartFlowLabel(link.source.label, link.target.label), [\n ...(link.value === undefined\n ? []\n : [\n {\n label: lang.chartValue,\n color: link.source.fill,\n value: valueText(link.value),\n },\n ]),\n ...(link.label ? [{ label: link.label, color: 'transparent', value: '' }] : []),\n ]),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n sx={[graphChartStyles.root, sx]}\n unit={unit}\n height={height}\n legend={[]}\n hiddenKeys={[]}\n onLegendToggle={() => {}}\n loading={loading}\n skeleton={<Skeleton sx={graphChartStyles.skeleton} />}\n isEmpty={nodes.length === 0}\n empty={empty}\n clickable={onItemClick != null}\n table={{\n columns: [lang.chartLink, unit ? `${lang.chartValue}(${unit})` : lang.chartValue],\n rows: shownLinks.map((link) => ({\n header: lang.chartFlowLabel(labelOf(link.source), labelOf(link.target)),\n cells: [\n [\n link.value === undefined ? '' : format.number(link.value, valueFormat),\n link.label ?? '',\n ]\n .filter(Boolean)\n .join(' · ') || lang.emptyValue,\n ],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmKA,IAAa,mBAAmB,IAAI,OAAO;CACzC,MAAM;EACJ,iCAAiC,OAAO;EACxC,qCAAqC,OAAO;EAC5C,oCAAoC,UAAU;EAC9C,qCAAqC,OAAO;EAC5C,wCAAwC,OAAO;EAC/C,uCAAuC,UAAU;EACjD,oCAAoC,OAAO;EAC3C,kCAAkC,OAAO;EACzC,oCAAoC,UAAU;EAC9C,iCAAiC,OAAO;EACxC,oCAAoC;EACpC,qCAAqC,OAAO;EAC5C,0CAA0C,OAAO;EACjD,oCAAoC,UAAU;EAC9C,gCAAgC,OAAO;EACvC,kCAAkC,OAAO;EACzC,iCAAiC,OAAO;EACxC,sCAAsC,OAAO;EAC7C,qCAAqC,UAAU;EAC/C,uCAAuC;CACzC;CACA,UAAU;EAAE,SAAS;EAAS,OAAO;EAAQ,QAAQ;CAAO;AAC9D,CAAC;AAED,IAAM,UAA4D;CAChE,OAAO,gBAAgB;CACvB,OAAO,gBAAgB;CACvB,UAAU,gBAAgB;CAC1B,YAAY,gBAAgB;CAC5B,UAAU,gBAAgB;CAC1B,KAAK,gBAAgB;AACvB;AAEA,IAAM,SAAyD;CAC7D,QAAQ,eAAe;CACvB,QAAQ,eAAe;CACvB,SAAS,eAAe;CACxB,UAAU,eAAe;AAC3B;;;;;AAgBA,IAAa,aAAa,0BACxB,QAAA,SAkBuB;CAAA,MAAA,SAAA,CAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAdZ,OAAO;CAAA,MAAA,YAAAA,aAAA,QAAA,aACJ,IAAI;CAAA,MAAA,SAAAA,aAAA,QAAA,QAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,OAAAA,aAAA,QAAA,MAAA;CAAA,MAAA,SAAAA,aAAA,QAAA,UAIP,GAAG;CAAA,MAAA,OAAAA,aAAA,QAAA,QACL,IAAI;CAAA,MAAA,UAAAA,aAAA,QAAA,WACD,IAAI;CAAA,MAAA,WAAAC,SAAA,QAAA,mBACiC,MAAI,KAAA,IAAA;CAAA,MAAA,UAAAD,aAAA,QAAA,WACzC,KAAK;CAAA,MAAA,QAAAA,aAAA,QAAA,OAAA;CAAA,MAAA,cAAAA,aAAA,QAAA,aAAA;CAAA,MAAA,KAAAA,aAAA,QAAA,IAAA;CAAA,MAIZ,OAAIE,UAAA,QAAA,MAAA,IAAA;CAEP,MAAM,OAAO,QAAQ;CACrB,MAAM,SAAS,UAAU;CACzB,MAAM,YAAY,yBAAyB;EAAE,aAAW,YAAA;EAAE,MAAI,KAAA;CAAC,EAAE;CAEjE,MAAM,cAAWC,eACf,IAAI,KACD,OAAA,SAAU,CAAA,EAAA,CAAI,KAAK,OAAO,aAAa,CAAC,MAAM,IAAI,aAAa,MAAM,OAAO,QAAQ,CAAC,CAAC,CACzF,CAAC;CAEH,MAAM,WAAQA,eACZ,MAAA,MAAM,KAAK,MAAM,WAAiB;EAChC,GAAG;EACH,OAAO,KAAK,SAAS,KAAK;EAC1B,MAAM,KAAK,QACP,aAAa,KAAK,OAAO,CAAC,KACxB,KAAK,SAAS,YAAA,MAAY,IAAI,KAAK,KAAK,MAAM,aAAa,UAAU,CAAC;EAC5E;CACF,EAAE,CAAC;CAEL,MAAM,OAAIA,eAAY,IAAI,IAAI,SAAA,MAAS,KAAK,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC;CACtE,MAAM,WAAW,OAAe,KAAA,MAAK,IAAI,EAAE,CAAC,EAAE,SAAS;CAEvD,MAAM,aAAUA,eACd,MAAA,MACG,QAAQ,SAAS,KAAA,MAAK,IAAI,KAAK,MAAM,KAAK,KAAA,MAAK,IAAI,KAAK,MAAM,CAAC,CAAC,CAChE,KAAK,UAAgB;EACpB,GAAG;EACH,QAAQ,KAAK,UAAU,KAAA,IAAY,KAAA,IAAY,SAAS,KAAK,KAAK;CACpE,EAAE,CAAC;CAEP,MAAM,YAASA,eAAY,KAAK,IAAI,GAAG,GAAG,WAAA,MAAW,KAAK,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC;CACrF,MAAM,SAAMA,eAAqB;EAC/B,MAAM,yBAAS,IAAI,IAAoB;EACvC,KAAK,MAAM,QAAI,WAAA,OAAgB;GAC7B,OAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;GAC1D,OAAO,IAAI,KAAK,SAAS,OAAO,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;EAC5D;EACA,OAAO;CACT,CAAC;CAED,IAAI,OAAIC,WAAkC,IAAI;CAC9C,MAAM,QAAqB,sBAAyD;EAClF,SAAO,KAAA;EACP,OAAO,CAAA,QAAA,SAAY,MAAA,MAAM,SAAS;EAClC,SAAO,QAAA;EACP,QAAQ,aAAa;GACnB,MAAM,QAAQ,SAAS,eAAe,IAAI,MAAkB,CAAC,CAAC,CAAC;GAC/D,MAAM,UAAU,OAAA,UAAW,WAAW,OAAA,UAAW;GAEjD,MAAM,SAAS,WAAW,OAAA,UAAW;GACrC,MAAM,UAAU;IACd,YAAY,QAAO,OAAA;IACnB,kBAAkB,SAAS,KAAK,SAAS;IACzC,kBAAkB,OAAA,OAAQ,KAAK,UAAU,MAAM,EAAE;IAEjD,qBAAqB;KACnB,SAAO,UAAA;KACP,SAAS,OAAA,OAAQ,SAAS,KAAK;KAC/B,SAAS,OAAA,OAAQ,SAAS,MAAM;IAClC;IACA,mBAAmB;KACjB,iBAAiB,UAAA,UAAc,OAAO,UAAU;KAChD,wBAAwB;KACxB,6CAA6C;IAC/C;IACA,qBAAqB,OAAA,OAAQ,SAAS,EAAE,SAAS,KAAK,SAAS,EAAE,IAAI,KAAA;IACrE,qBAAqB;KAAE,cAAc;KAAI,QAAQ;IAAK;IACtD,WAAW,SAAS,KAAK,QAAQ;IACjC,YAAY,SAAS,OAAO,KAAK,SAAS;IAC1C,WAAW,SAAS,KAAK;IACzB,iBAAiB;IACjB,YAAY,SAAS,KAAK;IAC1B,eAAe,SAAS,KAAK,YAAY;IACzC,qBAAqB;IAErB,gBAAgB;IAChB,YAAY,SACV,KAAK,WAAW,KAAA,KAAa,UAAA,UAAc,IAAI,MAAM,IAAK,IAAI,KAAK,SAAM,UAAA;IAC3E,aAAa,SAAU,KAAK,QAAQ,aAAa,KAAK,OAAO,CAAC,IAAI,KAAA;IAClE,YAAY,SAAU,KAAK,SAAS,eAAe,SAAS,eAAe;IAC3E,WAAY,OAAA,SAAU,UAAW,oBAAoB,SAAS,KAAA;IAC9D,YAAY,SAAU,KAAK,QAAQ,EAAE,MAAM,KAAK,MAAM,IAAI,KAAA;IAC1D,eAAe,UAAU,IAAI;IAC7B,SAAS,SAAU,OAAA,SAAU,CAAA,IAAM,CAAA,EAAA,CAChC,QAAQ,UAAU,SAAA,MAAS,MAAM,SAAS,KAAK,UAAU,MAAM,EAAE,CAAC,CAAC,CACnE,KAAK,WAAW;KACf,OAAO,SAAA,MAAS,QAAQ,SAAS,KAAK,UAAU,MAAM,EAAE,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE;KAC/E,OAAO,MAAM;KACb,SAAS;KACT,aAAa,YAAA,MAAY,IAAI,MAAM,EAAE;IACvC,EAAE;IACJ,gBAAgB,SAAA,SAAY,KAAA;IAC5B,4BAA4B,gCAAgC;IAC5D,aAAa,CAAA,KAAA;IACb,aAAa,CAAA,KAAA;IACb,cAAc;IAEd,gBAAgB;KAAE,KAAK;KAAI,OAAO;KAAI,QAAQ;KAAI,MAAM;IAAG;IAC3D,QAAQ;MACL,MAAM,UAAU,OAAO,EACtB,QAAQ,SAAe;MACrB,SAAA,QAAW,KAAK;MAChB,YAAA,QAAc,MAAA,MAAM,KAAK,QAAS,KAAK,KAAK;KAC9C,EACF;MACC,MAAM,UAAU,aAAa;MAC5B,aAAc,SAAA,QAAW;MAEzB,gBAAgB,MAAM,QAAQ;KAChC;IACF;GACF,CAAC;GACD,OAAO;IACL,WAAW;IACX,MAAM;KACJ,OAAO,SAAA,MAAS,KAAK,UAAU,EAAE,GAAG,KAAK,EAAE;KAC3C,OAAO,WAAA,MAAW,KAAK,UAAU,EAAE,GAAG,KAAK,EAAE;IAC/C;IACA,UAAU;MACP,MAAM,UAAU,QAAQ,SACvB,MAAM,QACJ,aAAa,KAAK,OAAO,CACvB,GAAI,KAAK,WACL,CAAC;MAAE,OAAO,KAAK;MAAU,OAAO;MAAe,OAAO;KAAG,CAAC,IAC1D,CAAA,GACJ;MACE,OAAO,KAAK,YAAY,OAAA,MAAO,IAAI,KAAK,EAAE,KAAK,CAAC;MAChD,OAAO,KAAK;MACZ,OAAO;KACT,CAAC,CACF,CACH;MACD,MAAM,UAAU,QAAQ,SACvB,MAAM,QACJ,aAAa,KAAK,eAAe,KAAK,OAAO,OAAO,KAAK,OAAO,KAAK,GAAG,CACtE,GAAI,KAAK,UAAU,KAAA,IACf,CAAA,IACA,CACE;MACE,OAAO,KAAK;MACZ,OAAO,KAAK,OAAO;MACnB,OAAO,UAAU,KAAK,KAAK;KAC7B,CAAC,GAEP,GAAI,KAAK,QAAQ,CAAC;MAAE,OAAO,KAAK;MAAO,OAAO;MAAe,OAAO;KAAG,CAAC,IAAI,CAAA,CAAG,CAChF,CACH;IACJ;GACF;EACF;CACF,EAAE;CAEF,aAAOC,YAAA,YAAAC,cAEC,MAAI;EAAA,MACJ,CAAC,iBAAiB,MAAI,GAAA,KAAA;EAAK,QAAA,KAAA;EAAA,UAAA,OAAA;EAAA,UAAA,OAAA,OAAA,OAAA,KAGvB,CAAA;EAAE,cAAA,OAAA,OAAA,OAAA,KACE,CAAA;EAAE,kBAAA,OAAA,OAAA,OAAA,WACQ,CAAC;EAAC,WAAA,QAAA;EAAA,YAAAD,YAAA,UAAA,EAAA,MAEA,iBAAiB,SAAQ,GAAA,IAAA;EAAA,WACxC,MAAA,MAAM,WAAW;EAAC,SAAA,MAAA;EAAA,aAEhB,YAAA,SAAe;EAAI,SACvB;GACL,SAAS,CAAC,KAAK,WAAW,KAAA,QAAO,GAAG,KAAK,WAAU,GAAA,KAAA,MAAA,KAAc,KAAK,UAAU;GAChF,MAAM,WAAA,MAAW,KAAK,UAAU;IAC9B,QAAQ,KAAK,eAAe,QAAQ,KAAK,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAC;IACtE,OAAO,CACL,CACE,KAAK,UAAU,KAAA,IAAY,KAAK,OAAO,OAAO,KAAK,OAAK,YAAA,KAAa,GACrE,KAAK,SAAS,EAAE,CACjB,CACE,OAAO,OAAO,CAAC,CACf,KAAK,KAAK,KAAK,KAAK,UAAU;GAErC,EAAE;EACJ;EAAC,WAAA,OAAA,OAAA,OAAA,MACS,YAAa,KAAA,QAAO;CAAQ,CAAA,GAAA,IAAA;AAG5C,GAAC;CAAA,MAAA;CAAA,OAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;CAAA;AAAA,CACH"}
1
+ {"version":3,"file":"GraphChart.js","names":["_vtp_readonlyProp","_vtp_bindable","_vtp_restProps","_vue_computed","_vue_shallowRef","_createVNode","_mergeProps"],"sources":["../../src/charts/GraphChart.tsx"],"sourcesContent":["/**\n * 网络图:节点与连线,看谁和谁有关系、关系有多强(案例与触发事件的匹配、团队与供应商的协作、依赖关系)。\n *\n * <GraphChart aria-label=\"协作关系\" nodes={nodes} links={links} layout=\"dagre\" groups={teams} />\n *\n * 节点是 { id, label?, sublabel?, group?, color?, shape?, size? },连线是 { source, target, value?, label?, dashed? }。\n * 布局交给 Unovis 的 Graph:force(默认,力导向)、dagre(分层,direction 定方向)、circular、concentric、parallel\n * (按 group 分列)、elk(分层且支持分组框,较大,用到时才加载)。布局异步算好再画,第一帧是空的。\n * 写了 groups 时同组的节点框在一起(dagre、elk、parallel 布局;力导向、环形布局里组只决定颜色,框会互相盖住);\n * 节点的颜色默认按组取色板,没有组时都是 chart1。\n * 连线写了 value 时按大小加粗(1–6px),悬停看“起点 → 终点”与数值。点节点选中它(selected 双向绑定),\n * 与它不相连的节点、连线变淡;点空白处取消。能缩放、拖动画布(zoom={false} 关掉),双击回到全图。\n * 给读屏的数据表每条连线一行;单位、加载与空状态同其他图表(见 ChartFrame)。\n */\nimport {\n Graph,\n GraphLayoutType,\n GraphLinkArrowStyle,\n GraphLinkStyle,\n GraphNodeSelectionHighlightMode,\n GraphNodeShape,\n} from '@unovis/ts';\nimport { _component } from '@zerodep-dev/vue-tsx-pro-tsx';\nimport { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';\nimport type { VNodeChild } from 'vue';\nimport { useLang } from '../config/context';\nimport { useFormat, type NumericFormat } from '../config/lang/format';\nimport { colors, fontSizes, opacities } from '../config/theme/tokens';\nimport { Skeleton } from '../feedback/Skeleton';\nimport { toNumber, type NumericValue } from '../utils/data/numeric';\nimport type { PartProps } from '../utils/props';\nimport { ChartFrame, chartTooltip, useChartValueText, type ChartFrameParts } from './frame';\nimport { resolveColor, type ChartColor } from './series';\nimport { useSingleChart, type SingleChart } from './single';\n\n/** 节点的形状 */\nexport interface GraphChartShapes {\n /** 圆(默认) */\n circle: unknown;\n /** 方块 */\n square: unknown;\n /** 六边形 */\n hexagon: unknown;\n /** 三角 */\n triangle: unknown;\n}\n\n/** 布局 */\nexport interface GraphChartLayouts {\n /** 力导向(默认):相连的靠近、不相连的推开,适合看关系疏密 */\n force: unknown;\n /** 分层:沿 direction 一层层排开,适合有先后、上下游的关系 */\n dagre: unknown;\n /** 排成一圈 */\n circular: unknown;\n /** 同心圆:连得多的在中间 */\n concentric: unknown;\n /** 按 group 分列,组内按连接排 */\n parallel: unknown;\n /** 分层,分组框更规整(elkjs,约 1.6 MB,用到时才加载) */\n elk: unknown;\n}\n\n/** 一个节点 */\nexport interface GraphChartNode {\n /** id:连线里用它指节点 */\n id: string;\n /** 名称,写在节点下面;不写时用 id */\n label?: string;\n /** 名称下面的小字 */\n sublabel?: string;\n /** 所在的组(groups 里的 id):同组的框在一起、颜色相同 */\n group?: string;\n /** 颜色;不写时按组取色板,没有组时是 chart1 */\n color?: ChartColor;\n /** 形状,默认 circle */\n shape?: keyof GraphChartShapes;\n /** 大小(px),默认 28 */\n size?: number;\n}\n\n/** 一条连线 */\nexport interface GraphChartLink {\n /** 起点节点的 id */\n source: string;\n /** 终点节点的 id */\n target: string;\n /** 强度:写了时按大小加粗;提示框、数据表里显示 */\n value?: NumericValue;\n /** 线上的短标签(几个字以内) */\n label?: string;\n /** 虚线:弱关系、待定的关系 */\n dashed?: boolean;\n /** 颜色;默认是边框色 */\n color?: ChartColor;\n}\n\n/** 一组节点 */\nexport interface GraphChartGroup {\n /** 组的 id:节点的 group 指它 */\n id: string;\n /** 组名:写在框上 */\n label: string;\n /** 颜色;不写时按组的顺序取色板 */\n color?: ChartColor;\n}\n\n/** 未声明的属性落到外层 div(role=\"figure\")上,aria-label 是图表的名称 */\nexport interface GraphChartProps extends PartProps<'div', 'role' | 'aria-busy'>, ChartFrameParts {\n /** 节点 */\n nodes: readonly GraphChartNode[];\n /** 连线 */\n links: readonly GraphChartLink[];\n /** 分组:同组的节点框在一起(dagre、elk、parallel 布局),颜色相同 */\n groups?: readonly GraphChartGroup[];\n /**\n * 布局\n * @default 'force'\n */\n layout?: keyof GraphChartLayouts;\n /**\n * 分层布局(dagre、elk)的方向:LR 从左到右,TB 从上到下\n * @default 'LR'\n */\n direction?: 'LR' | 'TB';\n /** 连线带箭头;默认分层布局(dagre、elk)带,其余不带 */\n arrows?: boolean;\n /** 连线数值的格式:提示框、数据表共用 */\n valueFormat?: NumericFormat;\n /** 连线数值的单位:显示在左上方,数值后面带上 */\n unit?: string;\n /**\n * 绘图区的高度;数字按 px\n * @default 360\n */\n height?: number | string;\n /**\n * 能缩放、拖动画布\n * @default true\n */\n zoom?: boolean;\n /**\n * 悬停时的提示框\n * @default true\n */\n tooltip?: boolean;\n /** 选中的节点 id:点节点时写回,父级写 _selected={x};点空白处变回 null */\n _selected?: string | null;\n /**\n * 加载中:绘图区显示骨架,带 aria-busy\n * @default false\n */\n loading?: boolean;\n /** 没有数据时显示的内容,默认是“暂无数据” */\n empty?: VNodeChild;\n /**\n * 点了一个节点(下钻):参数是这个节点与它的位置;写了它时节点的指针是手形。\n * 点图是鼠标的捷径:同样的去处在页面上还要有链接或按钮\n */\n onItemClick?: (node: GraphChartNode, index: number) => void;\n}\n\n/** GraphChart 的样式:root(--vis-graph-* 主题变量)、skeleton */\nexport const graphChartStyles = css.create({\n root: {\n '--vis-graph-node-stroke-color': colors.surface,\n '--vis-graph-node-label-text-color': colors.text,\n '--vis-graph-node-label-font-size': fontSizes.xs,\n '--vis-graph-node-label-background': colors.surface,\n '--vis-graph-node-sublabel-text-color': colors.textMuted,\n '--vis-graph-node-sublabel-font-size': fontSizes.xs,\n '--vis-graph-node-selection-color': colors.accent,\n '--vis-graph-node-greyout-color': colors.surfaceMuted,\n '--vis-graph-node-greyout-opacity': opacities.disabled,\n '--vis-graph-link-stroke-color': colors.borderStrong,\n '--vis-graph-link-greyout-opacity': '0.25',\n '--vis-graph-link-label-background': colors.fill,\n '--vis-graph-link-label-text-color-dark': colors.text,\n '--vis-graph-link-label-font-size': fontSizes.xs,\n '--vis-graph-panel-fill-color': colors.surfaceMuted,\n '--vis-graph-panel-border-color': colors.borderMuted,\n '--vis-graph-panel-label-color': colors.textMuted,\n '--vis-graph-panel-label-background': colors.surface,\n '--vis-graph-panel-label-font-size': fontSizes.xs,\n '--vis-graph-panel-label-font-weight': '500',\n },\n skeleton: { display: 'block', width: '100%', height: '100%' },\n});\n\nconst LAYOUTS: Record<keyof GraphChartLayouts, GraphLayoutType> = {\n force: GraphLayoutType.Force,\n dagre: GraphLayoutType.Dagre,\n circular: GraphLayoutType.Circular,\n concentric: GraphLayoutType.Concentric,\n parallel: GraphLayoutType.Parallel,\n elk: GraphLayoutType.Elk,\n};\n\nconst SHAPES: Record<keyof GraphChartShapes, GraphNodeShape> = {\n circle: GraphNodeShape.Circle,\n square: GraphNodeShape.Square,\n hexagon: GraphNodeShape.Hexagon,\n triangle: GraphNodeShape.Triangle,\n};\n\n/** 交给 Unovis 的节点:带上名称与颜色;Unovis 会往上写布局用的字段,每次都复制一份 */\ninterface Node extends GraphChartNode {\n label: string;\n fill: string;\n index: number;\n}\n/** 交给 Unovis 的连线:数值转成 number 算粗细 */\ninterface Link extends GraphChartLink {\n amount: number | undefined;\n}\n/** Unovis 布局后:连线的起点、终点换成了节点对象 */\ntype LaidOutLink = Omit<Link, 'source' | 'target'> & { source: Node; target: Node };\n\n/** 网络图 */\nexport const GraphChart = _component(\n ({\n nodes,\n links,\n groups,\n layout = 'force',\n direction = 'LR',\n arrows,\n valueFormat,\n unit,\n height = 360,\n zoom = true,\n tooltip = true,\n _selected: selected = _bindable<string | null>(null),\n loading = false,\n empty,\n onItemClick,\n sx,\n ...rest\n }: GraphChartProps) => {\n const lang = useLang();\n const format = useFormat();\n const valueText = useChartValueText(() => ({ valueFormat, unit }));\n\n const groupColors = _derived(\n new Map(\n (groups ?? []).map((group, position) => [group.id, resolveColor(group.color, position)]),\n ),\n );\n const resolved = _derived(\n nodes.map((node, index): Node => ({\n ...node,\n label: node.label ?? node.id,\n fill: node.color\n ? resolveColor(node.color, 0)\n : ((node.group && groupColors.get(node.group)) ?? resolveColor('chart1', 0)),\n index,\n })),\n );\n const byId = _derived(new Map(resolved.map((node) => [node.id, node])));\n const labelOf = (id: string) => byId.get(id)?.label ?? id;\n // 只留两端都在的连线;最大值用来把粗细缩放到 1–6px\n const shownLinks = _derived(\n links\n .filter((link) => byId.has(link.source) && byId.has(link.target))\n .map((link): Link => ({\n ...link,\n amount: link.value === undefined ? undefined : toNumber(link.value),\n })),\n );\n const maxAmount = _derived(Math.max(0, ...shownLinks.map((link) => link.amount ?? 0)));\n const degree = _derived.by(() => {\n const counts = new Map<string, number>();\n for (const link of shownLinks) {\n counts.set(link.source, (counts.get(link.source) ?? 0) + 1);\n counts.set(link.target, (counts.get(link.target) ?? 0) + 1);\n }\n return counts;\n });\n\n let plot = _state.raw<HTMLElement | null>(null);\n const chart: SingleChart = useSingleChart<{ nodes: Node[]; links?: Link[] }>(() => ({\n element: plot,\n ready: !loading && nodes.length > 0,\n tooltip,\n build: (instance) => {\n const graph = instance('graph', () => new Graph<Node, Link>({}));\n const layered = layout === 'dagre' || layout === 'elk';\n // 分组框只在按层、按列排的布局里画:其余布局不按组排,框会互相盖住\n const framed = layered || layout === 'parallel';\n graph.setConfig({\n layoutType: LAYOUTS[layout],\n layoutNodeGroup: (node) => node.group ?? '',\n layoutGroupOrder: groups?.map((group) => group.id),\n // 分组框比节点宽出一圈:层与层之间留够,框不相互压住\n dagreLayoutSettings: {\n rankdir: direction,\n nodesep: groups?.length ? 48 : 36,\n ranksep: groups?.length ? 150 : 96,\n },\n layoutElkSettings: {\n 'elk.direction': direction === 'LR' ? 'RIGHT' : 'DOWN',\n 'elk.spacing.nodeNode': '36',\n 'elk.layered.spacing.nodeNodeBetweenLayers': '96',\n },\n layoutElkNodeGroups: groups?.length ? [(node) => node.group ?? ''] : undefined,\n forceLayoutSettings: { linkDistance: 90, charge: -600 },\n nodeSize: (node) => node.size ?? 28,\n nodeShape: (node) => SHAPES[node.shape ?? 'circle'],\n nodeFill: (node) => node.fill,\n nodeStrokeWidth: 2,\n nodeLabel: (node) => node.label,\n nodeSubLabel: (node) => node.sublabel ?? '',\n nodeLabelTrimLength: 16,\n // 不用图标字体:节点只是色块\n nodeIcon: () => '',\n linkWidth: (link) =>\n link.amount === undefined || maxAmount === 0 ? 1.5 : 1 + (5 * link.amount) / maxAmount,\n linkStroke: (link) => (link.color ? resolveColor(link.color, 0) : undefined),\n linkStyle: (link) => (link.dashed ? GraphLinkStyle.Dashed : GraphLinkStyle.Solid),\n linkArrow: (arrows ?? layered) ? GraphLinkArrowStyle.Single : undefined,\n linkLabel: (link) => (link.label ? { text: link.label } : undefined),\n linkCurvature: layered ? 0 : 0.2,\n panels: (framed ? (groups ?? []) : [])\n .filter((group) => resolved.some((node) => node.group === group.id))\n .map((group) => ({\n nodes: resolved.filter((node) => node.group === group.id).map((node) => node.id),\n label: group.label,\n padding: 16,\n borderColor: groupColors.get(group.id),\n })),\n selectedNodeId: selected ?? undefined,\n nodeSelectionHighlightMode: GraphNodeSelectionHighlightMode.GreyoutNonConnected,\n disableZoom: !zoom,\n disableDrag: !zoom,\n disableBrush: true,\n // 上方多留一些:分组框的组名写在框顶外面\n fitViewPadding: { top: 48, right: 32, bottom: 32, left: 32 },\n events: {\n [Graph.selectors.node]: {\n click: (node: Node) => {\n selected = node.id;\n onItemClick?.(nodes[node.index]!, node.index);\n },\n },\n [Graph.selectors.background]: {\n click: () => (selected = null),\n // 双击空白回到全图\n dblclick: () => graph.fitView(),\n },\n },\n });\n return {\n component: graph,\n data: {\n nodes: resolved.map((node) => ({ ...node })),\n links: shownLinks.map((link) => ({ ...link })),\n },\n triggers: {\n [Graph.selectors.node]: (node: Node) =>\n chart.tooltip(\n chartTooltip(node.label, [\n ...(node.sublabel\n ? [{ label: node.sublabel, color: 'transparent', value: '' }]\n : []),\n {\n label: lang.chartDegree(degree.get(node.id) ?? 0),\n color: node.fill,\n value: '',\n },\n ]),\n ),\n [Graph.selectors.link]: (link: LaidOutLink) =>\n chart.tooltip(\n chartTooltip(lang.chartFlowLabel(link.source.label, link.target.label), [\n ...(link.value === undefined\n ? []\n : [\n {\n label: lang.chartValue,\n color: link.source.fill,\n value: valueText(link.value),\n },\n ]),\n ...(link.label ? [{ label: link.label, color: 'transparent', value: '' }] : []),\n ]),\n ),\n },\n };\n },\n }));\n\n return () => (\n <ChartFrame\n {...rest}\n sx={[graphChartStyles.root, sx]}\n unit={unit}\n height={height}\n legend={[]}\n hiddenKeys={[]}\n onLegendToggle={() => {}}\n loading={loading}\n skeleton={<Skeleton sx={graphChartStyles.skeleton} />}\n isEmpty={nodes.length === 0}\n empty={empty}\n clickable={onItemClick != null}\n table={{\n columns: [lang.chartLink, unit ? `${lang.chartValue}(${unit})` : lang.chartValue],\n rows: shownLinks.map((link) => ({\n header: lang.chartFlowLabel(labelOf(link.source), labelOf(link.target)),\n cells: [\n [\n link.value === undefined ? '' : format.number(link.value, valueFormat),\n link.label ?? '',\n ]\n .filter(Boolean)\n .join(' · ') || lang.emptyValue,\n ],\n })),\n }}\n plotRef={(element) => (plot = element)}\n />\n );\n },\n);\n"],"mappings":"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"}
@@ -25,7 +25,7 @@
25
25
  * zoomable 时可以拖动、按住 Ctrl 滚轮缩放,右上角有放大、缩小、复位的按钮。悬停看名称与数值;读屏的数据表列出各区域、地点与流向。
26
26
  */
27
27
  import { type TopoJSONMapConfigInterface } from '@unovis/ts';
28
- import * as css from '@zerodep-dev/vue-tsx-pro-tsx/styles';
28
+ import { css } from '@zerodep-dev/vue-tsx-pro-tsx/styles';
29
29
  import type { VNodeChild } from 'vue';
30
30
  import { type NumericFormat } from '../config/lang/format';
31
31
  import { type NumericValue } from '../utils/data/numeric';
@@ -11,7 +11,7 @@ import { useSingleChart } from "./single.js";
11
11
  import { placeLabels, rectsOverlap } from "./label-layout.js";
12
12
  import { computed, createTextVNode, createVNode, ref, shallowRef } from "vue";
13
13
  import { _component, effect, mergeJsxProps, readonlyProp, restProps } from "@zerodep-dev/vue-tsx-pro-tsx";
14
- import * as css from "@zerodep-dev/vue-tsx-pro-tsx/styles";
14
+ import { css } from "@zerodep-dev/vue-tsx-pro-tsx/styles";
15
15
  import { Maximize, Minus, Plus } from "@lucide/icons";
16
16
  import { MapProjection, TopoJSONMap } from "@unovis/ts";
17
17
  import { presimplify, simplify } from "topojson-simplify";