@misoto22/design 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (402) hide show
  1. package/AGENTS.md +87 -0
  2. package/CLAUDE.md +1 -0
  3. package/README.md +62 -5
  4. package/bin/misoto22-design.mjs +59 -13
  5. package/dist/agent/Accordion.md +24 -1
  6. package/dist/agent/Alert.md +23 -1
  7. package/dist/agent/AppShell.md +30 -2
  8. package/dist/agent/ArchitectureFigure.md +71 -0
  9. package/dist/agent/AreaChart.md +27 -2
  10. package/dist/agent/Article.md +26 -3
  11. package/dist/agent/AspectRatio.md +57 -0
  12. package/dist/agent/Avatar.md +25 -5
  13. package/dist/agent/Badge.md +22 -1
  14. package/dist/agent/BarChart.md +29 -2
  15. package/dist/agent/BarList.md +27 -1
  16. package/dist/agent/BigNumber.md +26 -2
  17. package/dist/agent/BoxPlot.md +24 -1
  18. package/dist/agent/Breadcrumb.md +24 -2
  19. package/dist/agent/BulletChart.md +23 -1
  20. package/dist/agent/Button.md +25 -1
  21. package/dist/agent/Calendar.md +37 -3
  22. package/dist/agent/Card.md +24 -2
  23. package/dist/agent/Checkbox.md +23 -2
  24. package/dist/agent/Code.md +50 -0
  25. package/dist/agent/CodeBlock.md +74 -0
  26. package/dist/agent/Collapsible.md +22 -1
  27. package/dist/agent/Combobox.md +29 -3
  28. package/dist/agent/Command.md +25 -2
  29. package/dist/agent/ComposedChart.md +26 -2
  30. package/dist/agent/ContextMenu.md +37 -4
  31. package/dist/agent/DataflowFigure.md +48 -0
  32. package/dist/agent/DatePicker.md +34 -6
  33. package/dist/agent/DescriptionList.md +68 -0
  34. package/dist/agent/Diagram.md +27 -3
  35. package/dist/agent/DiagramCanvas.md +70 -0
  36. package/dist/agent/DiagramExportMenu.md +64 -0
  37. package/dist/agent/DiagramInspector.md +72 -0
  38. package/dist/agent/DiagramLegend.md +55 -0
  39. package/dist/agent/DiagramMinimap.md +68 -0
  40. package/dist/agent/DiagramToolbar.md +69 -0
  41. package/dist/agent/Dialog.md +26 -3
  42. package/dist/agent/DropdownMenu.md +45 -6
  43. package/dist/agent/EmptyState.md +26 -1
  44. package/dist/agent/ErrorState.md +27 -2
  45. package/dist/agent/Facet.md +25 -1
  46. package/dist/agent/Field.md +45 -4
  47. package/dist/agent/FigureBand.md +24 -1
  48. package/dist/agent/FloatingIconButton.md +23 -1
  49. package/dist/agent/FunnelChart.md +23 -1
  50. package/dist/agent/Heading.md +64 -0
  51. package/dist/agent/Heatmap.md +25 -1
  52. package/dist/agent/Histogram.md +26 -2
  53. package/dist/agent/Input.md +22 -1
  54. package/dist/agent/Kbd.md +19 -1
  55. package/dist/agent/LifecycleFigure.md +49 -0
  56. package/dist/agent/LineChart.md +26 -2
  57. package/dist/agent/LinkArrow.md +20 -1
  58. package/dist/agent/Markdown.md +68 -0
  59. package/dist/agent/NativeSelect.md +23 -2
  60. package/dist/agent/NavItem.md +21 -1
  61. package/dist/agent/Pagination.md +28 -2
  62. package/dist/agent/PieChart.md +26 -2
  63. package/dist/agent/Popover.md +23 -1
  64. package/dist/agent/Progress.md +27 -3
  65. package/dist/agent/RadarChart.md +26 -2
  66. package/dist/agent/RadialChart.md +26 -3
  67. package/dist/agent/RadioGroup.md +23 -2
  68. package/dist/agent/SankeyChart.md +25 -2
  69. package/dist/agent/ScatterChart.md +27 -2
  70. package/dist/agent/ScrollArea.md +24 -3
  71. package/dist/agent/SearchableMenu.md +23 -1
  72. package/dist/agent/Select.md +29 -3
  73. package/dist/agent/Separator.md +28 -4
  74. package/dist/agent/SequenceFigure.md +50 -0
  75. package/dist/agent/Sheet.md +25 -2
  76. package/dist/agent/Skeleton.md +24 -2
  77. package/dist/agent/Slider.md +27 -4
  78. package/dist/agent/Sparkline.md +23 -1
  79. package/dist/agent/Spinner.md +24 -2
  80. package/dist/agent/StatusDot.md +20 -1
  81. package/dist/agent/StatusPill.md +28 -2
  82. package/dist/agent/Steps.md +24 -1
  83. package/dist/agent/Switch.md +21 -1
  84. package/dist/agent/Table.md +26 -3
  85. package/dist/agent/Tabs.md +24 -2
  86. package/dist/agent/Tag.md +40 -9
  87. package/dist/agent/Text.md +65 -0
  88. package/dist/agent/Textarea.md +20 -1
  89. package/dist/agent/Timestamp.md +64 -0
  90. package/dist/agent/Toast.md +26 -2
  91. package/dist/agent/ToggleGroup.md +24 -2
  92. package/dist/agent/Toolbar.md +71 -0
  93. package/dist/agent/Tooltip.md +23 -1
  94. package/dist/agent/TreemapChart.md +24 -1
  95. package/dist/agent/WaterfallChart.md +24 -1
  96. package/dist/agent/WorkflowFigure.md +50 -0
  97. package/dist/agent/catalog.json +6086 -1009
  98. package/dist/agent/index.md +27 -4
  99. package/dist/article.css +16 -4
  100. package/dist/charts/AreaChart/AreaChart.d.ts +9 -2
  101. package/dist/charts/AreaChart/AreaChart.js +12 -13
  102. package/dist/charts/AreaChart/AreaChart.js.map +1 -1
  103. package/dist/charts/BarChart/BarChart.d.ts +14 -3
  104. package/dist/charts/BarChart/BarChart.js +20 -12
  105. package/dist/charts/BarChart/BarChart.js.map +1 -1
  106. package/dist/charts/BarList/BarList.d.ts +9 -1
  107. package/dist/charts/BarList/BarList.js +9 -1
  108. package/dist/charts/BarList/BarList.js.map +1 -1
  109. package/dist/charts/BigNumber/BigNumber.d.ts +19 -3
  110. package/dist/charts/BigNumber/BigNumber.js +25 -5
  111. package/dist/charts/BigNumber/BigNumber.js.map +1 -1
  112. package/dist/charts/BoxPlot/BoxPlot.js +4 -2
  113. package/dist/charts/BoxPlot/BoxPlot.js.map +1 -1
  114. package/dist/charts/BulletChart/BulletChart.js +28 -7
  115. package/dist/charts/BulletChart/BulletChart.js.map +1 -1
  116. package/dist/charts/ComposedChart/ComposedChart.d.ts +9 -2
  117. package/dist/charts/ComposedChart/ComposedChart.js +10 -10
  118. package/dist/charts/ComposedChart/ComposedChart.js.map +1 -1
  119. package/dist/charts/FunnelChart/FunnelChart.d.ts +7 -2
  120. package/dist/charts/FunnelChart/FunnelChart.js +6 -16
  121. package/dist/charts/FunnelChart/FunnelChart.js.map +1 -1
  122. package/dist/charts/Heatmap/Heatmap.d.ts +17 -3
  123. package/dist/charts/Heatmap/Heatmap.js +20 -11
  124. package/dist/charts/Heatmap/Heatmap.js.map +1 -1
  125. package/dist/charts/Histogram/Histogram.d.ts +24 -1
  126. package/dist/charts/Histogram/Histogram.js +43 -11
  127. package/dist/charts/Histogram/Histogram.js.map +1 -1
  128. package/dist/charts/LineChart/LineChart.d.ts +9 -2
  129. package/dist/charts/LineChart/LineChart.js +11 -12
  130. package/dist/charts/LineChart/LineChart.js.map +1 -1
  131. package/dist/charts/PieChart/PieChart.d.ts +15 -3
  132. package/dist/charts/PieChart/PieChart.js +14 -6
  133. package/dist/charts/PieChart/PieChart.js.map +1 -1
  134. package/dist/charts/RadarChart/RadarChart.d.ts +15 -3
  135. package/dist/charts/RadarChart/RadarChart.js +11 -9
  136. package/dist/charts/RadarChart/RadarChart.js.map +1 -1
  137. package/dist/charts/RadialChart/RadialChart.d.ts +22 -4
  138. package/dist/charts/RadialChart/RadialChart.js +28 -6
  139. package/dist/charts/RadialChart/RadialChart.js.map +1 -1
  140. package/dist/charts/SankeyChart/SankeyChart.d.ts +16 -4
  141. package/dist/charts/SankeyChart/SankeyChart.js +14 -6
  142. package/dist/charts/SankeyChart/SankeyChart.js.map +1 -1
  143. package/dist/charts/ScatterChart/ScatterChart.d.ts +24 -3
  144. package/dist/charts/ScatterChart/ScatterChart.js +21 -15
  145. package/dist/charts/ScatterChart/ScatterChart.js.map +1 -1
  146. package/dist/charts/Sparkline/Sparkline.js +5 -3
  147. package/dist/charts/Sparkline/Sparkline.js.map +1 -1
  148. package/dist/charts/TreemapChart/TreemapChart.d.ts +7 -2
  149. package/dist/charts/TreemapChart/TreemapChart.js +20 -11
  150. package/dist/charts/TreemapChart/TreemapChart.js.map +1 -1
  151. package/dist/charts/WaterfallChart/WaterfallChart.js +4 -2
  152. package/dist/charts/WaterfallChart/WaterfallChart.js.map +1 -1
  153. package/dist/charts/index.d.ts +2 -1
  154. package/dist/charts/lib/export.d.ts +34 -43
  155. package/dist/charts/lib/export.js +16 -158
  156. package/dist/charts/lib/export.js.map +1 -1
  157. package/dist/charts/lib/figure.d.ts +21 -1
  158. package/dist/charts/lib/figure.js +5 -2
  159. package/dist/charts/lib/figure.js.map +1 -1
  160. package/dist/charts/lib/scale.d.ts +23 -0
  161. package/dist/charts/lib/scale.js +13 -0
  162. package/dist/charts/lib/scale.js.map +1 -0
  163. package/dist/charts/lib/selection.d.ts +20 -0
  164. package/dist/charts/lib/selection.js +18 -0
  165. package/dist/charts/lib/selection.js.map +1 -0
  166. package/dist/charts/lib/toolbar.d.ts +1 -0
  167. package/dist/components/Accordion/Accordion.js +8 -1
  168. package/dist/components/Accordion/Accordion.js.map +1 -1
  169. package/dist/components/AppShell/AppShell.d.ts +6 -0
  170. package/dist/components/AppShell/AppShell.js +34 -4
  171. package/dist/components/AppShell/AppShell.js.map +1 -1
  172. package/dist/components/Article/Article.d.ts +11 -4
  173. package/dist/components/Article/Article.js +13 -0
  174. package/dist/components/Article/Article.js.map +1 -1
  175. package/dist/components/AspectRatio/AspectRatio.d.ts +46 -0
  176. package/dist/components/AspectRatio/AspectRatio.js +33 -0
  177. package/dist/components/AspectRatio/AspectRatio.js.map +1 -0
  178. package/dist/components/Avatar/Avatar.d.ts +12 -3
  179. package/dist/components/Avatar/Avatar.js +6 -1
  180. package/dist/components/Avatar/Avatar.js.map +1 -1
  181. package/dist/components/Breadcrumb/Breadcrumb.d.ts +6 -0
  182. package/dist/components/Breadcrumb/Breadcrumb.js +15 -0
  183. package/dist/components/Breadcrumb/Breadcrumb.js.map +1 -1
  184. package/dist/components/Button/Button.js +14 -0
  185. package/dist/components/Button/Button.js.map +1 -1
  186. package/dist/components/Calendar/Calendar.d.ts +29 -3
  187. package/dist/components/Calendar/Calendar.js +60 -12
  188. package/dist/components/Calendar/Calendar.js.map +1 -1
  189. package/dist/components/Card/Card.d.ts +6 -0
  190. package/dist/components/Card/Card.js +1 -1
  191. package/dist/components/Card/Card.js.map +1 -1
  192. package/dist/components/Checkbox/Checkbox.d.ts +5 -2
  193. package/dist/components/Checkbox/Checkbox.js +12 -2
  194. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  195. package/dist/components/Code/Code.d.ts +30 -0
  196. package/dist/components/Code/Code.js +21 -0
  197. package/dist/components/Code/Code.js.map +1 -0
  198. package/dist/components/CodeBlock/CodeBlock.d.ts +141 -0
  199. package/dist/components/CodeBlock/CodeBlock.js +123 -0
  200. package/dist/components/CodeBlock/CodeBlock.js.map +1 -0
  201. package/dist/components/Collapsible/Collapsible.js +10 -2
  202. package/dist/components/Collapsible/Collapsible.js.map +1 -1
  203. package/dist/components/Combobox/Combobox.d.ts +15 -1
  204. package/dist/components/Combobox/Combobox.js +25 -5
  205. package/dist/components/Combobox/Combobox.js.map +1 -1
  206. package/dist/components/Command/Command.d.ts +4 -2
  207. package/dist/components/Command/Command.js +13 -1
  208. package/dist/components/Command/Command.js.map +1 -1
  209. package/dist/components/ContextMenu/ContextMenu.d.ts +30 -5
  210. package/dist/components/ContextMenu/ContextMenu.js +32 -2
  211. package/dist/components/ContextMenu/ContextMenu.js.map +1 -1
  212. package/dist/components/DatePicker/DatePicker.d.ts +36 -4
  213. package/dist/components/DatePicker/DatePicker.js +55 -12
  214. package/dist/components/DatePicker/DatePicker.js.map +1 -1
  215. package/dist/components/DescriptionList/DescriptionList.d.ts +73 -0
  216. package/dist/components/DescriptionList/DescriptionList.js +35 -0
  217. package/dist/components/DescriptionList/DescriptionList.js.map +1 -0
  218. package/dist/components/Diagram/Diagram.d.ts +8 -3
  219. package/dist/components/Diagram/Diagram.js +82 -10
  220. package/dist/components/Diagram/Diagram.js.map +1 -1
  221. package/dist/components/Dialog/Dialog.d.ts +18 -3
  222. package/dist/components/Dialog/Dialog.js +20 -2
  223. package/dist/components/Dialog/Dialog.js.map +1 -1
  224. package/dist/components/DropdownMenu/DropdownMenu.d.ts +49 -11
  225. package/dist/components/DropdownMenu/DropdownMenu.js +32 -2
  226. package/dist/components/DropdownMenu/DropdownMenu.js.map +1 -1
  227. package/dist/components/EmptyState/EmptyState.d.ts +25 -1
  228. package/dist/components/EmptyState/EmptyState.js +3 -1
  229. package/dist/components/EmptyState/EmptyState.js.map +1 -1
  230. package/dist/components/ErrorState/ErrorState.d.ts +22 -1
  231. package/dist/components/ErrorState/ErrorState.js +11 -2
  232. package/dist/components/ErrorState/ErrorState.js.map +1 -1
  233. package/dist/components/Field/Field.d.ts +70 -3
  234. package/dist/components/Field/Field.js +53 -12
  235. package/dist/components/Field/Field.js.map +1 -1
  236. package/dist/components/Field/field-control.d.ts +31 -0
  237. package/dist/components/Field/field-control.js +12 -0
  238. package/dist/components/Field/field-control.js.map +1 -0
  239. package/dist/components/FloatingIconButton/FloatingIconButton.js +2 -0
  240. package/dist/components/FloatingIconButton/FloatingIconButton.js.map +1 -1
  241. package/dist/components/Heading/Heading.d.ts +62 -0
  242. package/dist/components/Heading/Heading.js +44 -0
  243. package/dist/components/Heading/Heading.js.map +1 -0
  244. package/dist/components/Markdown/Markdown.d.ts +139 -0
  245. package/dist/components/Markdown/Markdown.js +135 -0
  246. package/dist/components/Markdown/Markdown.js.map +1 -0
  247. package/dist/components/Markdown/inline.d.ts +29 -0
  248. package/dist/components/Markdown/inline.js +74 -0
  249. package/dist/components/Markdown/inline.js.map +1 -0
  250. package/dist/components/Markdown/nodes.d.ts +65 -0
  251. package/dist/components/Markdown/nodes.js +1 -0
  252. package/dist/components/Markdown/nodes.js.map +1 -0
  253. package/dist/components/Markdown/parse.d.ts +24 -0
  254. package/dist/components/Markdown/parse.js +110 -0
  255. package/dist/components/Markdown/parse.js.map +1 -0
  256. package/dist/components/Markdown/slug.d.ts +15 -0
  257. package/dist/components/Markdown/slug.js +7 -0
  258. package/dist/components/Markdown/slug.js.map +1 -0
  259. package/dist/components/NativeSelect/NativeSelect.d.ts +6 -0
  260. package/dist/components/NativeSelect/NativeSelect.js +2 -3
  261. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  262. package/dist/components/Pagination/Pagination.d.ts +24 -1
  263. package/dist/components/Pagination/Pagination.js +6 -3
  264. package/dist/components/Pagination/Pagination.js.map +1 -1
  265. package/dist/components/Progress/Progress.d.ts +17 -5
  266. package/dist/components/Progress/Progress.js +18 -6
  267. package/dist/components/Progress/Progress.js.map +1 -1
  268. package/dist/components/RadioGroup/RadioGroup.d.ts +6 -0
  269. package/dist/components/RadioGroup/RadioGroup.js +11 -1
  270. package/dist/components/RadioGroup/RadioGroup.js.map +1 -1
  271. package/dist/components/ScrollArea/ScrollArea.d.ts +15 -0
  272. package/dist/components/ScrollArea/ScrollArea.js +2 -2
  273. package/dist/components/ScrollArea/ScrollArea.js.map +1 -1
  274. package/dist/components/SearchableMenu/SearchableMenu.d.ts +11 -2
  275. package/dist/components/SearchableMenu/SearchableMenu.js +24 -2
  276. package/dist/components/SearchableMenu/SearchableMenu.js.map +1 -1
  277. package/dist/components/Select/Select.d.ts +18 -2
  278. package/dist/components/Select/Select.js +20 -3
  279. package/dist/components/Select/Select.js.map +1 -1
  280. package/dist/components/Separator/Separator.d.ts +21 -3
  281. package/dist/components/Separator/Separator.js +9 -1
  282. package/dist/components/Separator/Separator.js.map +1 -1
  283. package/dist/components/Sheet/Sheet.d.ts +3 -0
  284. package/dist/components/Sheet/Sheet.js +11 -2
  285. package/dist/components/Sheet/Sheet.js.map +1 -1
  286. package/dist/components/Skeleton/Skeleton.d.ts +8 -1
  287. package/dist/components/Skeleton/Skeleton.js +1 -1
  288. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  289. package/dist/components/Slider/Slider.d.ts +21 -3
  290. package/dist/components/Slider/Slider.js +54 -27
  291. package/dist/components/Slider/Slider.js.map +1 -1
  292. package/dist/components/Spinner/Spinner.d.ts +8 -0
  293. package/dist/components/Spinner/Spinner.js +3 -2
  294. package/dist/components/Spinner/Spinner.js.map +1 -1
  295. package/dist/components/StatusPill/StatusPill.d.ts +5 -0
  296. package/dist/components/StatusPill/StatusPill.js +6 -0
  297. package/dist/components/StatusPill/StatusPill.js.map +1 -1
  298. package/dist/components/Table/Table.d.ts +6 -0
  299. package/dist/components/Table/Table.js +3 -1
  300. package/dist/components/Table/Table.js.map +1 -1
  301. package/dist/components/Tag/Tag.d.ts +68 -9
  302. package/dist/components/Tag/Tag.js +50 -10
  303. package/dist/components/Tag/Tag.js.map +1 -1
  304. package/dist/components/Text/Text.d.ts +62 -0
  305. package/dist/components/Text/Text.js +30 -0
  306. package/dist/components/Text/Text.js.map +1 -0
  307. package/dist/components/Timestamp/Timestamp.d.ts +59 -0
  308. package/dist/components/Timestamp/Timestamp.js +56 -0
  309. package/dist/components/Timestamp/Timestamp.js.map +1 -0
  310. package/dist/components/Toast/Toast.d.ts +9 -1
  311. package/dist/components/Toast/Toast.js +27 -4
  312. package/dist/components/Toast/Toast.js.map +1 -1
  313. package/dist/components/ToggleGroup/ToggleGroup.d.ts +6 -1
  314. package/dist/components/ToggleGroup/ToggleGroup.js +11 -1
  315. package/dist/components/ToggleGroup/ToggleGroup.js.map +1 -1
  316. package/dist/components/Toolbar/Toolbar.d.ts +55 -0
  317. package/dist/components/Toolbar/Toolbar.js +43 -0
  318. package/dist/components/Toolbar/Toolbar.js.map +1 -0
  319. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.d.ts +55 -0
  320. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.js +175 -0
  321. package/dist/diagrams/ArchitectureFigure/ArchitectureFigure.js.map +1 -0
  322. package/dist/diagrams/DataflowFigure/DataflowFigure.d.ts +28 -0
  323. package/dist/diagrams/DataflowFigure/DataflowFigure.js +148 -0
  324. package/dist/diagrams/DataflowFigure/DataflowFigure.js.map +1 -0
  325. package/dist/diagrams/DiagramCanvas/DiagramCanvas.d.ts +78 -0
  326. package/dist/diagrams/DiagramCanvas/DiagramCanvas.js +229 -0
  327. package/dist/diagrams/DiagramCanvas/DiagramCanvas.js.map +1 -0
  328. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.d.ts +106 -0
  329. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.js +123 -0
  330. package/dist/diagrams/DiagramExportMenu/DiagramExportMenu.js.map +1 -0
  331. package/dist/diagrams/DiagramInspector/DiagramInspector.d.ts +70 -0
  332. package/dist/diagrams/DiagramInspector/DiagramInspector.js +94 -0
  333. package/dist/diagrams/DiagramInspector/DiagramInspector.js.map +1 -0
  334. package/dist/diagrams/DiagramLegend/DiagramLegend.d.ts +42 -0
  335. package/dist/diagrams/DiagramLegend/DiagramLegend.js +35 -0
  336. package/dist/diagrams/DiagramLegend/DiagramLegend.js.map +1 -0
  337. package/dist/diagrams/DiagramMinimap/DiagramMinimap.d.ts +77 -0
  338. package/dist/diagrams/DiagramMinimap/DiagramMinimap.js +106 -0
  339. package/dist/diagrams/DiagramMinimap/DiagramMinimap.js.map +1 -0
  340. package/dist/diagrams/DiagramToolbar/DiagramToolbar.d.ts +48 -0
  341. package/dist/diagrams/DiagramToolbar/DiagramToolbar.js +53 -0
  342. package/dist/diagrams/DiagramToolbar/DiagramToolbar.js.map +1 -0
  343. package/dist/diagrams/LifecycleFigure/LifecycleFigure.d.ts +31 -0
  344. package/dist/diagrams/LifecycleFigure/LifecycleFigure.js +234 -0
  345. package/dist/diagrams/LifecycleFigure/LifecycleFigure.js.map +1 -0
  346. package/dist/diagrams/SequenceFigure/SequenceFigure.d.ts +38 -0
  347. package/dist/diagrams/SequenceFigure/SequenceFigure.js +261 -0
  348. package/dist/diagrams/SequenceFigure/SequenceFigure.js.map +1 -0
  349. package/dist/diagrams/WorkflowFigure/WorkflowFigure.d.ts +36 -0
  350. package/dist/diagrams/WorkflowFigure/WorkflowFigure.js +259 -0
  351. package/dist/diagrams/WorkflowFigure/WorkflowFigure.js.map +1 -0
  352. package/dist/diagrams/index.d.ts +17 -0
  353. package/dist/diagrams/index.js +29 -0
  354. package/dist/diagrams/index.js.map +1 -0
  355. package/dist/diagrams/lib/dev.d.ts +61 -0
  356. package/dist/diagrams/lib/dev.js +96 -0
  357. package/dist/diagrams/lib/dev.js.map +1 -0
  358. package/dist/diagrams/lib/frame.d.ts +138 -0
  359. package/dist/diagrams/lib/frame.js +131 -0
  360. package/dist/diagrams/lib/frame.js.map +1 -0
  361. package/dist/diagrams/lib/geometry.d.ts +114 -0
  362. package/dist/diagrams/lib/geometry.js +113 -0
  363. package/dist/diagrams/lib/geometry.js.map +1 -0
  364. package/dist/diagrams/lib/legend.d.ts +32 -0
  365. package/dist/diagrams/lib/legend.js +84 -0
  366. package/dist/diagrams/lib/legend.js.map +1 -0
  367. package/dist/diagrams/lib/marks.d.ts +207 -0
  368. package/dist/diagrams/lib/marks.js +480 -0
  369. package/dist/diagrams/lib/marks.js.map +1 -0
  370. package/dist/diagrams/lib/route.d.ts +85 -0
  371. package/dist/diagrams/lib/route.js +178 -0
  372. package/dist/diagrams/lib/route.js.map +1 -0
  373. package/dist/diagrams/lib/wires.d.ts +59 -0
  374. package/dist/diagrams/lib/wires.js +90 -0
  375. package/dist/diagrams/lib/wires.js.map +1 -0
  376. package/dist/diagrams/spec.d.ts +405 -0
  377. package/dist/diagrams/spec.js +1 -0
  378. package/dist/diagrams/spec.js.map +1 -0
  379. package/dist/index.d.ts +16 -4
  380. package/dist/index.js +9 -0
  381. package/dist/index.js.map +1 -1
  382. package/dist/keyframes.css +57 -3
  383. package/dist/lib/overlay-container.d.ts +14 -4
  384. package/dist/lib/overlay-container.js.map +1 -1
  385. package/dist/lib/svg-export.d.ts +138 -0
  386. package/dist/lib/svg-export.js +198 -0
  387. package/dist/lib/svg-export.js.map +1 -0
  388. package/dist/lib/warn.d.ts +73 -0
  389. package/dist/lib/warn.js +38 -0
  390. package/dist/lib/warn.js.map +1 -0
  391. package/dist/semantic.css +51 -6
  392. package/dist/styles.css +1 -1
  393. package/dist/tokens.css +20 -2
  394. package/dist/tokens.d.ts +17 -1
  395. package/dist/tokens.js +121 -36
  396. package/dist/tokens.json +121 -36
  397. package/llms.txt +35 -0
  398. package/package.json +9 -2
  399. package/skills/misoto22-design/SKILL.md +21 -7
  400. package/skills/misoto22-design/evals/evals.json +84 -0
  401. package/skills/misoto22-design/rules/a11y.md +55 -3
  402. package/skills/misoto22-design/rules/forms.md +5 -0
@@ -0,0 +1,178 @@
1
+ import { round } from "./geometry.js";
2
+ const STUB = 18;
3
+ const CORNER = 8;
4
+ function autoSides(from, to) {
5
+ const gapX = Math.max(to.x - (from.x + from.w), from.x - (to.x + to.w));
6
+ const gapY = Math.max(to.y - (from.y + from.h), from.y - (to.y + to.h));
7
+ if (gapX >= gapY) {
8
+ return to.x >= from.x ? ["right", "left"] : ["left", "right"];
9
+ }
10
+ return to.y >= from.y ? ["bottom", "top"] : ["top", "bottom"];
11
+ }
12
+ function port(box, side, offset = 0.5) {
13
+ const t = Math.min(0.88, Math.max(0.12, offset));
14
+ switch (side) {
15
+ case "left":
16
+ return [box.x, box.y + box.h * t];
17
+ case "right":
18
+ return [box.x + box.w, box.y + box.h * t];
19
+ case "top":
20
+ return [box.x + box.w * t, box.y];
21
+ case "bottom":
22
+ default:
23
+ return [box.x + box.w * t, box.y + box.h];
24
+ }
25
+ }
26
+ function stubFrom(anchor, side, length = STUB) {
27
+ switch (side) {
28
+ case "left":
29
+ return [anchor[0] - length, anchor[1]];
30
+ case "right":
31
+ return [anchor[0] + length, anchor[1]];
32
+ case "top":
33
+ return [anchor[0], anchor[1] - length];
34
+ case "bottom":
35
+ default:
36
+ return [anchor[0], anchor[1] + length];
37
+ }
38
+ }
39
+ const isHorizontal = (side) => side === "left" || side === "right";
40
+ function connect(a, b, fromSide, toSide, from, to, channelX, channelY) {
41
+ const fromH = isHorizontal(fromSide);
42
+ const toH = isHorizontal(toSide);
43
+ if (fromH && toH) {
44
+ const forward = fromSide === "right" && b[0] >= a[0] || fromSide === "left" && b[0] <= a[0];
45
+ const x = channelX ?? (forward ? (a[0] + b[0]) / 2 : (
46
+ // Behind: run out past the far edge of both boxes and come back.
47
+ fromSide === "right" ? Math.max(a[0], to.x + to.w + STUB, from.x + from.w + STUB) : Math.min(a[0], to.x - STUB, from.x - STUB)
48
+ ));
49
+ if (Math.abs(a[1] - b[1]) < 0.5) return [a, b];
50
+ return [a, [x, a[1]], [x, b[1]], b];
51
+ }
52
+ if (!fromH && !toH) {
53
+ const forward = fromSide === "bottom" && b[1] >= a[1] || fromSide === "top" && b[1] <= a[1];
54
+ const y = channelY ?? (forward ? (a[1] + b[1]) / 2 : fromSide === "bottom" ? Math.max(a[1], to.y + to.h + STUB, from.y + from.h + STUB) : Math.min(a[1], to.y - STUB, from.y - STUB));
55
+ if (Math.abs(a[0] - b[0]) < 0.5) return [a, b];
56
+ return [a, [a[0], y], [b[0], y], b];
57
+ }
58
+ return fromH ? [a, [b[0], a[1]], b] : [a, [a[0], b[1]], b];
59
+ }
60
+ function simplify(points) {
61
+ const out = [];
62
+ for (const point of points) {
63
+ const last = out[out.length - 1];
64
+ if (last && Math.abs(last[0] - point[0]) < 0.5 && Math.abs(last[1] - point[1]) < 0.5) continue;
65
+ out.push(point);
66
+ }
67
+ for (let index = 1; index < out.length - 1; ) {
68
+ const [ax, ay] = out[index - 1];
69
+ const [bx, by] = out[index];
70
+ const [cx, cy] = out[index + 1];
71
+ const collinear = Math.abs(ax - bx) < 0.5 && Math.abs(bx - cx) < 0.5 || Math.abs(ay - by) < 0.5 && Math.abs(by - cy) < 0.5;
72
+ if (collinear) out.splice(index, 1);
73
+ else index += 1;
74
+ }
75
+ return out;
76
+ }
77
+ function roundedPath(points, radius = CORNER) {
78
+ if (points.length === 0) return "";
79
+ if (points.length === 1) return `M ${round(points[0][0])} ${round(points[0][1])}`;
80
+ let d = `M ${round(points[0][0])} ${round(points[0][1])}`;
81
+ for (let index = 1; index < points.length - 1; index += 1) {
82
+ const previous = points[index - 1];
83
+ const corner = points[index];
84
+ const next = points[index + 1];
85
+ const inLength = Math.hypot(corner[0] - previous[0], corner[1] - previous[1]);
86
+ const outLength = Math.hypot(next[0] - corner[0], next[1] - corner[1]);
87
+ const r = Math.min(radius, inLength / 3, outLength / 3);
88
+ if (r < 1) {
89
+ d += ` L ${round(corner[0])} ${round(corner[1])}`;
90
+ continue;
91
+ }
92
+ const enter = [
93
+ corner[0] + (previous[0] - corner[0]) / inLength * r,
94
+ corner[1] + (previous[1] - corner[1]) / inLength * r
95
+ ];
96
+ const leave = [
97
+ corner[0] + (next[0] - corner[0]) / outLength * r,
98
+ corner[1] + (next[1] - corner[1]) / outLength * r
99
+ ];
100
+ d += ` L ${round(enter[0])} ${round(enter[1])}`;
101
+ d += ` Q ${round(corner[0])} ${round(corner[1])} ${round(leave[0])} ${round(leave[1])}`;
102
+ }
103
+ const end = points[points.length - 1];
104
+ return `${d} L ${round(end[0])} ${round(end[1])}`;
105
+ }
106
+ function labelSpot(points) {
107
+ let best = { x: points[0][0], y: points[0][1], axis: "x", length: -1 };
108
+ for (let index = 0; index < points.length - 1; index += 1) {
109
+ const a = points[index];
110
+ const b = points[index + 1];
111
+ const length = Math.hypot(b[0] - a[0], b[1] - a[1]);
112
+ if (length > best.length) {
113
+ best = {
114
+ x: (a[0] + b[0]) / 2,
115
+ y: (a[1] + b[1]) / 2,
116
+ axis: Math.abs(b[0] - a[0]) >= Math.abs(b[1] - a[1]) ? "x" : "y",
117
+ length
118
+ };
119
+ }
120
+ }
121
+ return { x: best.x, y: best.y, axis: best.axis };
122
+ }
123
+ function routeEdge(request) {
124
+ const { from, to, via, channelX, channelY, mode = "auto" } = request;
125
+ const [autoFrom, autoTo] = autoSides(from, to);
126
+ const fromSide = request.fromSide ?? autoFrom;
127
+ const toSide = request.toSide ?? autoTo;
128
+ const start = port(from, fromSide, request.fromOffset);
129
+ const end = port(to, toSide, request.toOffset);
130
+ let points;
131
+ if (mode === "straight") {
132
+ points = [start, end];
133
+ } else {
134
+ const outward = stubFrom(start, fromSide);
135
+ const inward = stubFrom(end, toSide);
136
+ if (via && via.length > 0) {
137
+ points = [start, outward];
138
+ let cursor = outward;
139
+ for (const waypoint of via) {
140
+ const next = [waypoint[0], waypoint[1]];
141
+ points.push([next[0], cursor[1]], next);
142
+ cursor = next;
143
+ }
144
+ points.push([inward[0], cursor[1]], inward, end);
145
+ } else {
146
+ const forced = mode === "orthogonal-h" ? "h" : mode === "orthogonal-v" ? "v" : null;
147
+ const middle = forced === "h" ? [outward, [inward[0], outward[1]], inward] : forced === "v" ? [outward, [outward[0], inward[1]], inward] : connect(outward, inward, fromSide, toSide, from, to, channelX, channelY);
148
+ points = [start, ...middle, end];
149
+ }
150
+ }
151
+ points = simplify(points);
152
+ const last = points[points.length - 1];
153
+ const previous = points[points.length - 2] ?? last;
154
+ const angle = Math.atan2(last[1] - previous[1], last[0] - previous[0]) * 180 / Math.PI;
155
+ return { d: roundedPath(points), points, label: labelSpot(points), angle };
156
+ }
157
+ function spreadPorts(uses) {
158
+ const byFace = /* @__PURE__ */ new Map();
159
+ for (const use of uses) {
160
+ const list = byFace.get(use.face);
161
+ if (list) list.push(use.ref);
162
+ else byFace.set(use.face, [use.ref]);
163
+ }
164
+ const offsets = /* @__PURE__ */ new Map();
165
+ for (const list of byFace.values()) {
166
+ if (list.length < 2) continue;
167
+ list.forEach((ref, position) => {
168
+ offsets.set(ref, (position + 1) / (list.length + 1));
169
+ });
170
+ }
171
+ return offsets;
172
+ }
173
+ export {
174
+ roundedPath,
175
+ routeEdge,
176
+ spreadPorts
177
+ };
178
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/diagrams/lib/route.ts"],"sourcesContent":["/**\n * Getting a line from one box to another.\n *\n * The routing rule this module keeps, and the reason it is worth having at all:\n * A SIDE IS A DIRECTION CONTRACT. A line that says it leaves a box's right face\n * must leave it going right, and a line that says it arrives at a top face must\n * arrive going down. A router that takes the shortest path between two anchor\n * points breaks that contract constantly — it produces a segment that grazes\n * the box it just left, and a reader cannot tell which of two adjacent boxes an\n * arrow belongs to. Every path below therefore begins and ends with a stub\n * perpendicular to its face, and the interesting geometry happens between the\n * two stubs.\n *\n * The second rule is about crowding. When several lines share one face they are\n * spread across it rather than stacked on its midpoint, because two arrowheads\n * landing on the same coordinate is one arrowhead as far as a reader is\n * concerned. Explicit routing controls opt out of the spread: an author who\n * pinned a channel has already decided where the line goes.\n */\n\nimport type { Point, RouteMode, Side } from '../spec'\nimport { round, type Box } from './geometry'\n\n/** How far a line runs straight out of a face before it is allowed to turn. */\nconst STUB = 18\n\n/** The turn radius on an orthogonal corner. */\nconst CORNER = 8\n\nexport interface RouteRequest {\n from: Box\n to: Box\n fromSide?: Side\n toSide?: Side\n mode?: RouteMode | string\n via?: Point[]\n channelX?: number\n channelY?: number\n /** 0–1 along the face, where this line's port sits. 0.5 is the midpoint. */\n fromOffset?: number\n toOffset?: number\n}\n\nexport interface RoutedEdge {\n /** The `d` attribute, corners already rounded. */\n d: string\n /** The polyline before rounding — what the label placer reads. */\n points: [number, number][]\n /** Where a label wants to sit, and how the segment under it runs. */\n label: { x: number; y: number; axis: 'x' | 'y' }\n /** The last segment's direction, for the arrowhead. */\n angle: number\n}\n\n/**\n * The face a line should use when the author did not say.\n *\n * Whichever axis separates the two boxes by more wins, and the choice is made\n * on the GAP rather than on centre distance. Two boxes side by side with a\n * small vertical offset separate horizontally, which is what a reader expects;\n * comparing centres would flip that pair to top/bottom as soon as the offset\n * exceeded half a box.\n */\nfunction autoSides(from: Box, to: Box): [Side, Side] {\n const gapX = Math.max(to.x - (from.x + from.w), from.x - (to.x + to.w))\n const gapY = Math.max(to.y - (from.y + from.h), from.y - (to.y + to.h))\n\n if (gapX >= gapY) {\n return to.x >= from.x ? ['right', 'left'] : ['left', 'right']\n }\n return to.y >= from.y ? ['bottom', 'top'] : ['top', 'bottom']\n}\n\n/** The point on a face where a line attaches, given its share of that face. */\nfunction port(box: Box, side: Side, offset = 0.5): [number, number] {\n const t = Math.min(0.88, Math.max(0.12, offset))\n switch (side) {\n case 'left':\n return [box.x, box.y + box.h * t]\n case 'right':\n return [box.x + box.w, box.y + box.h * t]\n case 'top':\n return [box.x + box.w * t, box.y]\n case 'bottom':\n default:\n return [box.x + box.w * t, box.y + box.h]\n }\n}\n\n/** One step out of a face, perpendicular to it. */\nfunction stubFrom(anchor: [number, number], side: Side, length = STUB): [number, number] {\n switch (side) {\n case 'left':\n return [anchor[0] - length, anchor[1]]\n case 'right':\n return [anchor[0] + length, anchor[1]]\n case 'top':\n return [anchor[0], anchor[1] - length]\n case 'bottom':\n default:\n return [anchor[0], anchor[1] + length]\n }\n}\n\nconst isHorizontal = (side: Side) => side === 'left' || side === 'right'\n\n/**\n * The polyline between two stub ends, kept orthogonal.\n *\n * Three cases, and they are the only three an axis-aligned router has:\n *\n * - **Facing across the same axis** (right→left, bottom→top). One dogleg\n * through a channel halfway between them, which is the shape everybody draws\n * by hand.\n * - **Turning a corner** (right→top). A single elbow, and WHICH elbow is\n * decided by the outgoing axis: leaving a vertical face means running\n * vertically first, or the line re-enters the box it just left.\n * - **Same-side or back-tracking** (right→right, or right→left with the target\n * behind). The channel goes OUTSIDE both boxes rather than between them,\n * because there is no room between them to go through.\n */\nfunction connect(\n a: [number, number],\n b: [number, number],\n fromSide: Side,\n toSide: Side,\n from: Box,\n to: Box,\n channelX?: number,\n channelY?: number,\n): [number, number][] {\n const fromH = isHorizontal(fromSide)\n const toH = isHorizontal(toSide)\n\n if (fromH && toH) {\n const forward =\n (fromSide === 'right' && b[0] >= a[0]) || (fromSide === 'left' && b[0] <= a[0])\n const x =\n channelX ??\n (forward\n ? (a[0] + b[0]) / 2\n : // Behind: run out past the far edge of both boxes and come back.\n fromSide === 'right'\n ? Math.max(a[0], to.x + to.w + STUB, from.x + from.w + STUB)\n : Math.min(a[0], to.x - STUB, from.x - STUB))\n if (Math.abs(a[1] - b[1]) < 0.5) return [a, b]\n return [a, [x, a[1]], [x, b[1]], b]\n }\n\n if (!fromH && !toH) {\n const forward =\n (fromSide === 'bottom' && b[1] >= a[1]) || (fromSide === 'top' && b[1] <= a[1])\n const y =\n channelY ??\n (forward\n ? (a[1] + b[1]) / 2\n : fromSide === 'bottom'\n ? Math.max(a[1], to.y + to.h + STUB, from.y + from.h + STUB)\n : Math.min(a[1], to.y - STUB, from.y - STUB))\n if (Math.abs(a[0] - b[0]) < 0.5) return [a, b]\n return [a, [a[0], y], [b[0], y], b]\n }\n\n // One elbow. The axis of the OUTGOING face decides which corner it is.\n return fromH ? [a, [b[0], a[1]], b] : [a, [a[0], b[1]], b]\n}\n\n/** Drops points that repeat, and collapses three points on one straight run into two. */\nfunction simplify(points: [number, number][]): [number, number][] {\n const out: [number, number][] = []\n for (const point of points) {\n const last = out[out.length - 1]\n if (last && Math.abs(last[0] - point[0]) < 0.5 && Math.abs(last[1] - point[1]) < 0.5) continue\n out.push(point)\n }\n for (let index = 1; index < out.length - 1; ) {\n const [ax, ay] = out[index - 1]!\n const [bx, by] = out[index]!\n const [cx, cy] = out[index + 1]!\n const collinear =\n (Math.abs(ax - bx) < 0.5 && Math.abs(bx - cx) < 0.5) ||\n (Math.abs(ay - by) < 0.5 && Math.abs(by - cy) < 0.5)\n if (collinear) out.splice(index, 1)\n else index += 1\n }\n return out\n}\n\n/**\n * The polyline as a path, with the corners turned rather than mitred.\n *\n * A quadratic through the corner point, pulled back along both legs by the\n * radius. The pull-back is clamped to a third of each leg so a short segment\n * between two turns cannot produce a curve that overshoots its own endpoint —\n * which renders as a hook and is the classic artefact of rounding a polyline\n * without checking the leg lengths.\n */\nexport function roundedPath(points: [number, number][], radius = CORNER): string {\n if (points.length === 0) return ''\n if (points.length === 1) return `M ${round(points[0]![0])} ${round(points[0]![1])}`\n\n let d = `M ${round(points[0]![0])} ${round(points[0]![1])}`\n\n for (let index = 1; index < points.length - 1; index += 1) {\n const previous = points[index - 1]!\n const corner = points[index]!\n const next = points[index + 1]!\n\n const inLength = Math.hypot(corner[0] - previous[0], corner[1] - previous[1])\n const outLength = Math.hypot(next[0] - corner[0], next[1] - corner[1])\n const r = Math.min(radius, inLength / 3, outLength / 3)\n\n if (r < 1) {\n d += ` L ${round(corner[0])} ${round(corner[1])}`\n continue\n }\n\n const enter: [number, number] = [\n corner[0] + ((previous[0] - corner[0]) / inLength) * r,\n corner[1] + ((previous[1] - corner[1]) / inLength) * r,\n ]\n const leave: [number, number] = [\n corner[0] + ((next[0] - corner[0]) / outLength) * r,\n corner[1] + ((next[1] - corner[1]) / outLength) * r,\n ]\n\n d += ` L ${round(enter[0])} ${round(enter[1])}`\n d += ` Q ${round(corner[0])} ${round(corner[1])} ${round(leave[0])} ${round(leave[1])}`\n }\n\n const end = points[points.length - 1]!\n return `${d} L ${round(end[0])} ${round(end[1])}`\n}\n\n/**\n * Where the line's wording goes: the middle of its longest segment.\n *\n * The longest segment is chosen rather than the path's own midpoint because the\n * midpoint of a dogleg often lands on a corner, and a label on a corner sits\n * across both legs and masks the turn — which is the one part of the line that\n * carries information about where it went.\n */\nfunction labelSpot(points: [number, number][]): { x: number; y: number; axis: 'x' | 'y' } {\n let best = { x: points[0]![0], y: points[0]![1], axis: 'x' as 'x' | 'y', length: -1 }\n\n for (let index = 0; index < points.length - 1; index += 1) {\n const a = points[index]!\n const b = points[index + 1]!\n const length = Math.hypot(b[0] - a[0], b[1] - a[1])\n if (length > best.length) {\n best = {\n x: (a[0] + b[0]) / 2,\n y: (a[1] + b[1]) / 2,\n axis: Math.abs(b[0] - a[0]) >= Math.abs(b[1] - a[1]) ? 'x' : 'y',\n length,\n }\n }\n }\n\n return { x: best.x, y: best.y, axis: best.axis }\n}\n\n/** Routes one relationship. */\nexport function routeEdge(request: RouteRequest): RoutedEdge {\n const { from, to, via, channelX, channelY, mode = 'auto' } = request\n\n const [autoFrom, autoTo] = autoSides(from, to)\n const fromSide = request.fromSide ?? autoFrom\n const toSide = request.toSide ?? autoTo\n\n const start = port(from, fromSide, request.fromOffset)\n const end = port(to, toSide, request.toOffset)\n\n let points: [number, number][]\n\n if (mode === 'straight') {\n // Straight means straight: centre to centre, clipped to both faces. No\n // stubs, because a stub would bend the one route whose whole promise is\n // that it does not bend.\n points = [start, end]\n } else {\n const outward = stubFrom(start, fromSide)\n const inward = stubFrom(end, toSide)\n\n if (via && via.length > 0) {\n // Waypoints are honoured literally and joined orthogonally. An author who\n // reached for `via` is overruling the router, and a router that then\n // \"improved\" the result would make the control useless.\n points = [start, outward]\n let cursor: [number, number] = outward\n for (const waypoint of via) {\n const next: [number, number] = [waypoint[0], waypoint[1]]\n points.push([next[0], cursor[1]], next)\n cursor = next\n }\n points.push([inward[0], cursor[1]], inward, end)\n } else {\n const forced =\n mode === 'orthogonal-h' ? ('h' as const) : mode === 'orthogonal-v' ? ('v' as const) : null\n\n const middle =\n forced === 'h'\n ? ([outward, [inward[0], outward[1]], inward] as [number, number][])\n : forced === 'v'\n ? ([outward, [outward[0], inward[1]], inward] as [number, number][])\n : connect(outward, inward, fromSide, toSide, from, to, channelX, channelY)\n\n points = [start, ...middle, end]\n }\n }\n\n points = simplify(points)\n\n const last = points[points.length - 1]!\n const previous = points[points.length - 2] ?? last\n const angle = (Math.atan2(last[1] - previous[1], last[0] - previous[0]) * 180) / Math.PI\n\n return { d: roundedPath(points), points, label: labelSpot(points), angle }\n}\n\n/** One line's use of one face: which face, and which end of which line it is. */\nexport interface PortUse {\n /** The face, as `nodeId:side`. Two lines sharing this string share a face. */\n face: string\n /** This endpoint, as `edgeIndex:from` or `edgeIndex:to`. */\n ref: string\n}\n\n/**\n * Which share of its face each line gets, when several use the same one.\n *\n * A single line keeps the midpoint — spreading one line only moves it off\n * centre for no reason. Lines that carry an explicit routing control are\n * excluded by the caller before they get here, so a pinned channel is never\n * nudged out from under its pin.\n *\n * Endpoints are keyed separately rather than by line, because a line's two ends\n * land on two different faces with two different amounts of company. Keying by\n * line gave both ends the same offset, which on a figure with one crowded face\n * and one empty one visibly skewed every arrow that touched the empty side.\n */\nexport function spreadPorts(uses: PortUse[]): Map<string, number> {\n const byFace = new Map<string, string[]>()\n for (const use of uses) {\n const list = byFace.get(use.face)\n if (list) list.push(use.ref)\n else byFace.set(use.face, [use.ref])\n }\n\n const offsets = new Map<string, number>()\n for (const list of byFace.values()) {\n if (list.length < 2) continue\n list.forEach((ref, position) => {\n offsets.set(ref, (position + 1) / (list.length + 1))\n })\n }\n return offsets\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,59 @@
1
+ import { ReactNode } from 'react';
2
+ import { EdgeBase, Variant } from '../spec.js';
3
+ import { Box } from './geometry.js';
4
+
5
+ /** One line to draw, once its two boxes are known. */
6
+ interface Wire {
7
+ edge: EdgeBase & {
8
+ variant?: Variant | 'return';
9
+ classification?: string;
10
+ note?: string;
11
+ };
12
+ from: Box;
13
+ to: Box;
14
+ /** Overrides the variant's own stroke weight — a main path drawn heavier. */
15
+ weight?: number;
16
+ /** An open arrowhead rather than a filled one. */
17
+ open?: boolean;
18
+ /**
19
+ * Whether this line's `via` / `channelX` / `channelY` mean anything here.
20
+ *
21
+ * A waypoint is an ABSOLUTE coordinate in whatever space the author's nodes
22
+ * were placed in. When a specification pins its nodes with `pos`, that space
23
+ * is this renderer's space too and the waypoints land exactly where they were
24
+ * meant to. When the nodes are placed from a lane and a column, this renderer
25
+ * chose the coordinates — so the author's waypoints refer to a grid that does
26
+ * not exist here, and following them drags lines across unrelated nodes.
27
+ *
28
+ * So the rule is per line and not per figure: honour the waypoints when both
29
+ * of a line's endpoints were placed absolutely, and route automatically
30
+ * otherwise. Defaults to false, which is the safe half.
31
+ */
32
+ keepWaypoints?: boolean;
33
+ }
34
+ /**
35
+ * Every line in a figure, routed together.
36
+ *
37
+ * Together rather than one at a time, because port spreading is a property of a
38
+ * FACE and not of a line: how far off centre a given arrow sits depends on how
39
+ * many others land on the same face, which no single line can know. Routing
40
+ * them independently is what produces three arrowheads stacked on one point.
41
+ *
42
+ * Lines that pin their own geometry — `via`, a channel, an explicit side — opt
43
+ * out of the spread. An author who placed a line has already answered the
44
+ * question the spread exists to answer, and moving it afterwards makes the
45
+ * control useless.
46
+ *
47
+ * Returns the paths and the labels separately because ORDER IS THE MASK: a
48
+ * label's plate has to be painted over every line in the figure, not merely
49
+ * over its own. Interleaving them puts the third line on top of the first
50
+ * line's label.
51
+ */
52
+ declare function renderWires(wires: Wire[], uid: string): {
53
+ paths: ReactNode;
54
+ labels: ReactNode;
55
+ };
56
+ /** Resolves an edge's endpoints against a box index, dropping any that dangle. */
57
+ declare function wiresFor<E extends EdgeBase>(edges: E[] | undefined, boxes: Map<string, Box>, decorate?: (edge: E) => Partial<Wire>): Wire[];
58
+
59
+ export { type Wire, renderWires, wiresFor };
@@ -0,0 +1,90 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { edgeClasses, EdgeLabel, edgeMarker, edgeStroke } from "./marks.js";
3
+ import { routeEdge, spreadPorts } from "./route.js";
4
+ function renderWires(wires, uid) {
5
+ const uses = [];
6
+ wires.forEach((wire, index) => {
7
+ const { edge } = wire;
8
+ const pinned = wire.keepWaypoints === true && Boolean(edge.via?.length || edge.channelX !== void 0 || edge.channelY !== void 0);
9
+ if (pinned) return;
10
+ if (edge.fromSide) uses.push({ face: `${edge.from}:${edge.fromSide}`, ref: `${index}:from` });
11
+ if (edge.toSide) uses.push({ face: `${edge.to}:${edge.toSide}`, ref: `${index}:to` });
12
+ if (!edge.fromSide) uses.push({ face: `${edge.from}:auto`, ref: `${index}:from` });
13
+ if (!edge.toSide) uses.push({ face: `${edge.to}:auto`, ref: `${index}:to` });
14
+ });
15
+ const offsets = spreadPorts(uses);
16
+ const routed = wires.map((wire, index) => {
17
+ const { edge } = wire;
18
+ const keep = wire.keepWaypoints === true;
19
+ return {
20
+ wire,
21
+ index,
22
+ route: routeEdge({
23
+ from: wire.from,
24
+ to: wire.to,
25
+ fromSide: edge.fromSide,
26
+ toSide: edge.toSide,
27
+ mode: edge.route,
28
+ via: keep ? edge.via : void 0,
29
+ channelX: keep ? edge.channelX : void 0,
30
+ channelY: keep ? edge.channelY : void 0,
31
+ fromOffset: offsets.get(`${index}:from`),
32
+ toOffset: offsets.get(`${index}:to`)
33
+ })
34
+ };
35
+ });
36
+ return {
37
+ paths: /* @__PURE__ */ jsx("g", { "data-diagram-wires": "", children: routed.map(({ wire, index, route }) => /* @__PURE__ */ jsx(
38
+ "path",
39
+ {
40
+ d: route.d,
41
+ fill: "none",
42
+ "data-edge": wire.edge.id,
43
+ markerEnd: `url(#${uid}-${wire.open ? "arrow-open" : edgeMarker(wire.edge.variant)})`,
44
+ className: edgeClasses(wire.edge.variant),
45
+ ...edgeStroke(wire.edge.variant, wire.weight)
46
+ },
47
+ wire.edge.id ?? index
48
+ )) }),
49
+ labels: /* @__PURE__ */ jsx("g", { "data-diagram-wire-labels": "", children: routed.map(
50
+ ({ wire, index, route }) => wire.edge.label ? (
51
+ /* `labelDx` / `labelDy` / `labelAt` are deliberately NOT applied.
52
+ They are collision repairs authored against archify's router,
53
+ measured in the positions THAT router produced — and this one
54
+ does not produce the same collisions, so honouring them moves
55
+ labels off clear ground and onto the nodes they were nudged away
56
+ from. Dropping the nudge and keeping the wording is the reading
57
+ that preserves the meaning; the field stays in the type so a
58
+ specification carrying it still typechecks. */
59
+ /* @__PURE__ */ jsx(
60
+ EdgeLabel,
61
+ {
62
+ x: route.label.x,
63
+ y: route.label.y,
64
+ axis: route.label.axis,
65
+ text: wire.edge.label,
66
+ chip: wire.edge.classification,
67
+ note: wire.edge.note
68
+ },
69
+ wire.edge.id ?? index
70
+ )
71
+ ) : null
72
+ ) })
73
+ };
74
+ }
75
+ function wiresFor(edges, boxes, decorate) {
76
+ if (!edges) return [];
77
+ const out = [];
78
+ for (const edge of edges) {
79
+ const from = boxes.get(edge.from);
80
+ const to = boxes.get(edge.to);
81
+ if (!from || !to) continue;
82
+ out.push({ edge, from, to, ...decorate?.(edge) });
83
+ }
84
+ return out;
85
+ }
86
+ export {
87
+ renderWires,
88
+ wiresFor
89
+ };
90
+ //# sourceMappingURL=wires.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/diagrams/lib/wires.tsx"],"sourcesContent":["import type { ReactNode } from 'react'\nimport type { EdgeBase, Side, Variant } from '../spec'\nimport type { Box } from './geometry'\nimport { edgeClasses, EdgeLabel, edgeMarker, edgeStroke } from './marks'\nimport { routeEdge, spreadPorts, type PortUse } from './route'\n\n/** One line to draw, once its two boxes are known. */\nexport interface Wire {\n edge: EdgeBase & { variant?: Variant | 'return'; classification?: string; note?: string }\n from: Box\n to: Box\n /** Overrides the variant's own stroke weight — a main path drawn heavier. */\n weight?: number\n /** An open arrowhead rather than a filled one. */\n open?: boolean\n /**\n * Whether this line's `via` / `channelX` / `channelY` mean anything here.\n *\n * A waypoint is an ABSOLUTE coordinate in whatever space the author's nodes\n * were placed in. When a specification pins its nodes with `pos`, that space\n * is this renderer's space too and the waypoints land exactly where they were\n * meant to. When the nodes are placed from a lane and a column, this renderer\n * chose the coordinates — so the author's waypoints refer to a grid that does\n * not exist here, and following them drags lines across unrelated nodes.\n *\n * So the rule is per line and not per figure: honour the waypoints when both\n * of a line's endpoints were placed absolutely, and route automatically\n * otherwise. Defaults to false, which is the safe half.\n */\n keepWaypoints?: boolean\n}\n\n/**\n * Every line in a figure, routed together.\n *\n * Together rather than one at a time, because port spreading is a property of a\n * FACE and not of a line: how far off centre a given arrow sits depends on how\n * many others land on the same face, which no single line can know. Routing\n * them independently is what produces three arrowheads stacked on one point.\n *\n * Lines that pin their own geometry — `via`, a channel, an explicit side — opt\n * out of the spread. An author who placed a line has already answered the\n * question the spread exists to answer, and moving it afterwards makes the\n * control useless.\n *\n * Returns the paths and the labels separately because ORDER IS THE MASK: a\n * label's plate has to be painted over every line in the figure, not merely\n * over its own. Interleaving them puts the third line on top of the first\n * line's label.\n */\nexport function renderWires(\n wires: Wire[],\n uid: string,\n): { paths: ReactNode; labels: ReactNode } {\n const uses: PortUse[] = []\n\n wires.forEach((wire, index) => {\n const { edge } = wire\n const pinned =\n wire.keepWaypoints === true &&\n Boolean(edge.via?.length || edge.channelX !== undefined || edge.channelY !== undefined)\n if (pinned) return\n if (edge.fromSide) uses.push({ face: `${edge.from}:${edge.fromSide}`, ref: `${index}:from` })\n if (edge.toSide) uses.push({ face: `${edge.to}:${edge.toSide}`, ref: `${index}:to` })\n if (!edge.fromSide) uses.push({ face: `${edge.from}:auto`, ref: `${index}:from` })\n if (!edge.toSide) uses.push({ face: `${edge.to}:auto`, ref: `${index}:to` })\n })\n\n const offsets = spreadPorts(uses)\n\n const routed = wires.map((wire, index) => {\n const { edge } = wire\n const keep = wire.keepWaypoints === true\n return {\n wire,\n index,\n route: routeEdge({\n from: wire.from,\n to: wire.to,\n fromSide: edge.fromSide as Side | undefined,\n toSide: edge.toSide as Side | undefined,\n mode: edge.route,\n via: keep ? edge.via : undefined,\n channelX: keep ? edge.channelX : undefined,\n channelY: keep ? edge.channelY : undefined,\n fromOffset: offsets.get(`${index}:from`),\n toOffset: offsets.get(`${index}:to`),\n }),\n }\n })\n\n return {\n paths: (\n <g data-diagram-wires=\"\">\n {routed.map(({ wire, index, route }) => (\n <path\n key={wire.edge.id ?? index}\n d={route.d}\n fill=\"none\"\n data-edge={wire.edge.id}\n markerEnd={`url(#${uid}-${wire.open ? 'arrow-open' : edgeMarker(wire.edge.variant)})`}\n className={edgeClasses(wire.edge.variant)}\n {...edgeStroke(wire.edge.variant, wire.weight)}\n />\n ))}\n </g>\n ),\n labels: (\n <g data-diagram-wire-labels=\"\">\n {routed.map(({ wire, index, route }) =>\n wire.edge.label ? (\n /* `labelDx` / `labelDy` / `labelAt` are deliberately NOT applied.\n They are collision repairs authored against archify's router,\n measured in the positions THAT router produced — and this one\n does not produce the same collisions, so honouring them moves\n labels off clear ground and onto the nodes they were nudged away\n from. Dropping the nudge and keeping the wording is the reading\n that preserves the meaning; the field stays in the type so a\n specification carrying it still typechecks. */\n <EdgeLabel\n key={wire.edge.id ?? index}\n x={route.label.x}\n y={route.label.y}\n axis={route.label.axis}\n text={wire.edge.label}\n chip={wire.edge.classification}\n note={wire.edge.note}\n />\n ) : null,\n )}\n </g>\n ),\n }\n}\n\n/** Resolves an edge's endpoints against a box index, dropping any that dangle. */\nexport function wiresFor<E extends EdgeBase>(\n edges: E[] | undefined,\n boxes: Map<string, Box>,\n decorate?: (edge: E) => Partial<Wire>,\n): Wire[] {\n if (!edges) return []\n const out: Wire[] = []\n for (const edge of edges) {\n const from = boxes.get(edge.from)\n const to = boxes.get(edge.to)\n // A relationship naming a node that is not in the figure is a specification\n // error, and drawing it from nowhere to nowhere would hide that. The\n // figures filter the same edges through `liveEdges` before they get here,\n // so the drop is announced once in development and the summary list agrees\n // with the picture; this guard is what makes that agreement structural\n // rather than a convention every renderer has to remember.\n if (!from || !to) continue\n out.push({ edge, from, to, ...decorate?.(edge) })\n }\n return out\n}\n"],"mappings":"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","names":[]}