sirena 0.1.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 (382) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/build_deploy.yml +59 -0
  3. data/.github/workflows/links.yml +85 -0
  4. data/.github/workflows/rake.yml +15 -0
  5. data/.github/workflows/release.yml +27 -0
  6. data/.gitignore +68 -0
  7. data/.rspec +3 -0
  8. data/.rubocop.yml +14 -0
  9. data/.rubocop_todo.yml +70 -0
  10. data/ARCHITECTURE.md +744 -0
  11. data/Gemfile +12 -0
  12. data/LICENSE +25 -0
  13. data/README.adoc +357 -0
  14. data/Rakefile +11 -0
  15. data/docs/.gitignore +1 -0
  16. data/docs/Gemfile +13 -0
  17. data/docs/_config.yml +182 -0
  18. data/docs/_diagram_types/architecture-diagram.adoc +314 -0
  19. data/docs/_diagram_types/block-diagram.adoc +345 -0
  20. data/docs/_diagram_types/c4-diagram.adoc +559 -0
  21. data/docs/_diagram_types/class-diagram.adoc +816 -0
  22. data/docs/_diagram_types/er-diagram.adoc +719 -0
  23. data/docs/_diagram_types/error-diagram.adoc +114 -0
  24. data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
  25. data/docs/_diagram_types/flowchart.adoc +488 -0
  26. data/docs/_diagram_types/gantt-chart.adoc +502 -0
  27. data/docs/_diagram_types/git-graph.adoc +600 -0
  28. data/docs/_diagram_types/index.adoc +192 -0
  29. data/docs/_diagram_types/info-diagram.adoc +103 -0
  30. data/docs/_diagram_types/kanban-diagram.adoc +262 -0
  31. data/docs/_diagram_types/mindmap.adoc +603 -0
  32. data/docs/_diagram_types/packet-diagram.adoc +378 -0
  33. data/docs/_diagram_types/pie-chart.adoc +335 -0
  34. data/docs/_diagram_types/quadrant-chart.adoc +406 -0
  35. data/docs/_diagram_types/radar-chart.adoc +528 -0
  36. data/docs/_diagram_types/requirement-diagram.adoc +416 -0
  37. data/docs/_diagram_types/sankey-diagram.adoc +357 -0
  38. data/docs/_diagram_types/sequence-diagram.adoc +664 -0
  39. data/docs/_diagram_types/state-diagram.adoc +658 -0
  40. data/docs/_diagram_types/timeline.adoc +352 -0
  41. data/docs/_diagram_types/treemap-diagram.adoc +462 -0
  42. data/docs/_diagram_types/user-journey.adoc +602 -0
  43. data/docs/_features/index.adoc +129 -0
  44. data/docs/_guides/cli-reference.adoc +203 -0
  45. data/docs/_guides/index.adoc +56 -0
  46. data/docs/_guides/installation.adoc +100 -0
  47. data/docs/_guides/quick-start.adoc +132 -0
  48. data/docs/_pages/comparison.adoc +441 -0
  49. data/docs/_pages/compatibility.adoc +300 -0
  50. data/docs/_pages/index.adoc +39 -0
  51. data/docs/_references/index.adoc +103 -0
  52. data/docs/_tutorials/index.adoc +57 -0
  53. data/docs/index.adoc +166 -0
  54. data/docs/lychee.toml +54 -0
  55. data/examples/.gitignore +10 -0
  56. data/examples/README.adoc +196 -0
  57. data/examples/README.md +64 -0
  58. data/examples/architecture/01-basic-services.mmd +9 -0
  59. data/examples/architecture/01-basic-services.svg +37 -0
  60. data/examples/architecture/02-service-groups.mmd +16 -0
  61. data/examples/architecture/02-service-groups.svg +55 -0
  62. data/examples/architecture/README.adoc +79 -0
  63. data/examples/block/01-basic-blocks.mmd +13 -0
  64. data/examples/block/01-basic-blocks.svg +44 -0
  65. data/examples/block/02-block-shapes.mmd +13 -0
  66. data/examples/block/02-block-shapes.svg +47 -0
  67. data/examples/block/README.adoc +85 -0
  68. data/examples/c4/01-context-diagram.mmd +10 -0
  69. data/examples/c4/01-context-diagram.svg +45 -0
  70. data/examples/c4/02-container-diagram.mmd +24 -0
  71. data/examples/c4/02-container-diagram.svg +105 -0
  72. data/examples/c4/README.adoc +92 -0
  73. data/examples/class_diagram/01-basic-classes.mmd +61 -0
  74. data/examples/class_diagram/01-basic-classes.svg +117 -0
  75. data/examples/class_diagram/02-relationships.mmd +61 -0
  76. data/examples/class_diagram/02-relationships.svg +129 -0
  77. data/examples/class_diagram/README.adoc +93 -0
  78. data/examples/er_diagram/01-basic-entities.mmd +64 -0
  79. data/examples/er_diagram/01-basic-entities.svg +5 -0
  80. data/examples/er_diagram/02-cardinality.mmd +57 -0
  81. data/examples/er_diagram/02-cardinality.svg +125 -0
  82. data/examples/er_diagram/README.adoc +88 -0
  83. data/examples/error/01-basic-error.mmd +1 -0
  84. data/examples/error/01-basic-error.svg +13 -0
  85. data/examples/error/02-error-display.mmd +1 -0
  86. data/examples/error/02-error-display.svg +13 -0
  87. data/examples/error/README.adoc +71 -0
  88. data/examples/error_message_example.svg +13 -0
  89. data/examples/flowchart/00-original.mmd +13 -0
  90. data/examples/flowchart/00-original.svg +5 -0
  91. data/examples/flowchart/01-basic-flow.mmd +7 -0
  92. data/examples/flowchart/01-basic-flow.svg +52 -0
  93. data/examples/flowchart/01-basic-flow.yml +13 -0
  94. data/examples/flowchart/02*.svg +87 -0
  95. data/examples/flowchart/02-node-shapes.mmd +9 -0
  96. data/examples/flowchart/02-node-shapes.svg +33 -0
  97. data/examples/flowchart/03-edge-types.mmd +7 -0
  98. data/examples/flowchart/03-edge-types.svg +53 -0
  99. data/examples/flowchart/04-subgraphs.mmd +9 -0
  100. data/examples/flowchart/04-subgraphs.svg +33 -0
  101. data/examples/flowchart/05-styling.mmd +9 -0
  102. data/examples/flowchart/05-styling.svg +33 -0
  103. data/examples/flowchart/06-complex-flow.mmd +8 -0
  104. data/examples/flowchart/06-complex-flow.svg +59 -0
  105. data/examples/flowchart/README.adoc +167 -0
  106. data/examples/gantt/01-simple-timeline.* +14 -0
  107. data/examples/gantt/01-simple-timeline.mmd +6 -0
  108. data/examples/gantt/01-simple-timeline.svg +26 -0
  109. data/examples/gantt/02-task-dependencies.mmd +6 -0
  110. data/examples/gantt/02-task-dependencies.svg +26 -0
  111. data/examples/gantt/README.adoc +86 -0
  112. data/examples/git_graph/01-linear-history.mmd +12 -0
  113. data/examples/git_graph/01-linear-history.svg +26 -0
  114. data/examples/git_graph/02-branching.mmd +12 -0
  115. data/examples/git_graph/02-branching.svg +26 -0
  116. data/examples/git_graph/README.adoc +73 -0
  117. data/examples/info/02-showinfo.mmd +1 -0
  118. data/examples/info/02-showinfo.svg +10 -0
  119. data/examples/info/README.adoc +58 -0
  120. data/examples/info_showinfo_example.svg +10 -0
  121. data/examples/kanban/01-simple-board.mmd +8 -0
  122. data/examples/kanban/01-simple-board.svg +43 -0
  123. data/examples/kanban/02-workflow.mmd +8 -0
  124. data/examples/kanban/02-workflow.svg +43 -0
  125. data/examples/kanban/README.adoc +79 -0
  126. data/examples/mindmap/01-simple-tree.mmd +19 -0
  127. data/examples/mindmap/01-simple-tree.svg +61 -0
  128. data/examples/mindmap/02-knowledge-map.mmd +19 -0
  129. data/examples/mindmap/02-knowledge-map.svg +61 -0
  130. data/examples/mindmap/README.adoc +77 -0
  131. data/examples/packet/01-basic-packet.* +17 -0
  132. data/examples/packet/01-basic-packet.mmd +4 -0
  133. data/examples/packet/01-basic-packet.svg +82 -0
  134. data/examples/packet/README.adoc +58 -0
  135. data/examples/pie/01-simple-chart.mmd +5 -0
  136. data/examples/pie/01-simple-chart.svg +17 -0
  137. data/examples/pie/02-labeled-slices.mmd +6 -0
  138. data/examples/pie/02-labeled-slices.svg +19 -0
  139. data/examples/pie/README.adoc +75 -0
  140. data/examples/quadrant/01-basic-quadrant.mmd +13 -0
  141. data/examples/quadrant/01-basic-quadrant.svg +33 -0
  142. data/examples/quadrant/02-positioned-items.mmd +14 -0
  143. data/examples/quadrant/02-positioned-items.svg +35 -0
  144. data/examples/quadrant/README.adoc +84 -0
  145. data/examples/radar/01-simple-radar.* +5 -0
  146. data/examples/radar/01-simple-radar.mmd +3 -0
  147. data/examples/radar/01-simple-radar.svg +25 -0
  148. data/examples/radar/02-multiple-curves.mmd +4 -0
  149. data/examples/radar/02-multiple-curves.svg +43 -0
  150. data/examples/radar/README.adoc +75 -0
  151. data/examples/requirement/01-basic-requirements.mmd +23 -0
  152. data/examples/requirement/01-basic-requirements.svg +49 -0
  153. data/examples/requirement/02-risk-levels.mmd +23 -0
  154. data/examples/requirement/02-risk-levels.svg +49 -0
  155. data/examples/requirement/README.adoc +85 -0
  156. data/examples/sankey/01-simple-flow.mmd +7 -0
  157. data/examples/sankey/01-simple-flow.svg +34 -0
  158. data/examples/sankey/02-multi-stage.mmd +11 -0
  159. data/examples/sankey/02-multi-stage.svg +44 -0
  160. data/examples/sankey/README.adoc +74 -0
  161. data/examples/sequence/01-basic-sequence.mmd +27 -0
  162. data/examples/sequence/01-basic-sequence.svg +5 -0
  163. data/examples/sequence/02-activations.mmd +17 -0
  164. data/examples/sequence/02-activations.svg +78 -0
  165. data/examples/sequence/README.adoc +86 -0
  166. data/examples/state_diagram/01-simple-states.mmd +29 -0
  167. data/examples/state_diagram/01-simple-states.svg +5 -0
  168. data/examples/state_diagram/02-composite.mmd +19 -0
  169. data/examples/state_diagram/02-composite.svg +81 -0
  170. data/examples/state_diagram/README.adoc +90 -0
  171. data/examples/timeline/01-simple-timeline.mmd +11 -0
  172. data/examples/timeline/01-simple-timeline.svg +36 -0
  173. data/examples/timeline/02-periods.mmd +15 -0
  174. data/examples/timeline/02-periods.svg +47 -0
  175. data/examples/timeline/README.adoc +78 -0
  176. data/examples/treemap/01-basic-treemap.mmd +12 -0
  177. data/examples/treemap/01-basic-treemap.svg +59 -0
  178. data/examples/treemap/README.adoc +59 -0
  179. data/examples/user_journey/01-simple-journey.mmd +23 -0
  180. data/examples/user_journey/01-simple-journey.svg +5 -0
  181. data/examples/user_journey/02-multi-actor.mmd +18 -0
  182. data/examples/user_journey/02-multi-actor.svg +129 -0
  183. data/examples/user_journey/README.adoc +81 -0
  184. data/examples/xychart/01-line-chart.mmd +5 -0
  185. data/examples/xychart/01-line-chart.svg +43 -0
  186. data/examples/xychart/02-bar-chart.mmd +7 -0
  187. data/examples/xychart/02-bar-chart.svg +48 -0
  188. data/examples/xychart/README.adoc +80 -0
  189. data/exe/sirena +7 -0
  190. data/lib/sirena/cli.rb +138 -0
  191. data/lib/sirena/commands/batch.rb +117 -0
  192. data/lib/sirena/commands/render.rb +80 -0
  193. data/lib/sirena/commands/types.rb +29 -0
  194. data/lib/sirena/commands/version.rb +24 -0
  195. data/lib/sirena/diagram/architecture.rb +46 -0
  196. data/lib/sirena/diagram/base.rb +61 -0
  197. data/lib/sirena/diagram/block.rb +81 -0
  198. data/lib/sirena/diagram/c4.rb +328 -0
  199. data/lib/sirena/diagram/class_diagram.rb +385 -0
  200. data/lib/sirena/diagram/er_diagram.rb +238 -0
  201. data/lib/sirena/diagram/error.rb +38 -0
  202. data/lib/sirena/diagram/flowchart.rb +160 -0
  203. data/lib/sirena/diagram/gantt.rb +71 -0
  204. data/lib/sirena/diagram/git_graph.rb +36 -0
  205. data/lib/sirena/diagram/info.rb +38 -0
  206. data/lib/sirena/diagram/kanban.rb +178 -0
  207. data/lib/sirena/diagram/mindmap.rb +54 -0
  208. data/lib/sirena/diagram/packet.rb +79 -0
  209. data/lib/sirena/diagram/pie.rb +115 -0
  210. data/lib/sirena/diagram/quadrant.rb +138 -0
  211. data/lib/sirena/diagram/radar.rb +52 -0
  212. data/lib/sirena/diagram/requirement.rb +133 -0
  213. data/lib/sirena/diagram/sankey.rb +217 -0
  214. data/lib/sirena/diagram/sequence.rb +242 -0
  215. data/lib/sirena/diagram/state_diagram.rb +237 -0
  216. data/lib/sirena/diagram/timeline.rb +171 -0
  217. data/lib/sirena/diagram/treemap.rb +84 -0
  218. data/lib/sirena/diagram/user_journey.rb +149 -0
  219. data/lib/sirena/diagram/xy_chart.rb +76 -0
  220. data/lib/sirena/diagram.rb +8 -0
  221. data/lib/sirena/diagram_registry.rb +101 -0
  222. data/lib/sirena/engine.rb +292 -0
  223. data/lib/sirena/parser/architecture.rb +41 -0
  224. data/lib/sirena/parser/base.rb +41 -0
  225. data/lib/sirena/parser/block.rb +72 -0
  226. data/lib/sirena/parser/c4.rb +53 -0
  227. data/lib/sirena/parser/class_diagram.rb +63 -0
  228. data/lib/sirena/parser/er_diagram.rb +40 -0
  229. data/lib/sirena/parser/error.rb +49 -0
  230. data/lib/sirena/parser/flowchart.rb +71 -0
  231. data/lib/sirena/parser/gantt.rb +60 -0
  232. data/lib/sirena/parser/git_graph.rb +95 -0
  233. data/lib/sirena/parser/grammars/architecture.rb +145 -0
  234. data/lib/sirena/parser/grammars/block.rb +190 -0
  235. data/lib/sirena/parser/grammars/c4.rb +226 -0
  236. data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
  237. data/lib/sirena/parser/grammars/common.rb +84 -0
  238. data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
  239. data/lib/sirena/parser/grammars/error.rb +40 -0
  240. data/lib/sirena/parser/grammars/flowchart.rb +298 -0
  241. data/lib/sirena/parser/grammars/gantt.rb +252 -0
  242. data/lib/sirena/parser/grammars/git_graph.rb +167 -0
  243. data/lib/sirena/parser/grammars/info.rb +58 -0
  244. data/lib/sirena/parser/grammars/kanban.rb +83 -0
  245. data/lib/sirena/parser/grammars/mindmap.rb +115 -0
  246. data/lib/sirena/parser/grammars/packet.rb +73 -0
  247. data/lib/sirena/parser/grammars/pie.rb +128 -0
  248. data/lib/sirena/parser/grammars/quadrant.rb +199 -0
  249. data/lib/sirena/parser/grammars/radar.rb +150 -0
  250. data/lib/sirena/parser/grammars/requirement.rb +188 -0
  251. data/lib/sirena/parser/grammars/sankey.rb +104 -0
  252. data/lib/sirena/parser/grammars/sequence.rb +247 -0
  253. data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
  254. data/lib/sirena/parser/grammars/timeline.rb +142 -0
  255. data/lib/sirena/parser/grammars/treemap.rb +120 -0
  256. data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
  257. data/lib/sirena/parser/info.rb +49 -0
  258. data/lib/sirena/parser/kanban.rb +97 -0
  259. data/lib/sirena/parser/mindmap.rb +106 -0
  260. data/lib/sirena/parser/packet.rb +76 -0
  261. data/lib/sirena/parser/pie.rb +49 -0
  262. data/lib/sirena/parser/quadrant.rb +57 -0
  263. data/lib/sirena/parser/radar.rb +104 -0
  264. data/lib/sirena/parser/requirement.rb +70 -0
  265. data/lib/sirena/parser/sankey.rb +64 -0
  266. data/lib/sirena/parser/sequence.rb +51 -0
  267. data/lib/sirena/parser/state_diagram.rb +69 -0
  268. data/lib/sirena/parser/timeline.rb +57 -0
  269. data/lib/sirena/parser/transforms/architecture.rb +97 -0
  270. data/lib/sirena/parser/transforms/block.rb +254 -0
  271. data/lib/sirena/parser/transforms/c4.rb +347 -0
  272. data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
  273. data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
  274. data/lib/sirena/parser/transforms/error.rb +58 -0
  275. data/lib/sirena/parser/transforms/flowchart.rb +293 -0
  276. data/lib/sirena/parser/transforms/gantt.rb +215 -0
  277. data/lib/sirena/parser/transforms/git_graph.rb +160 -0
  278. data/lib/sirena/parser/transforms/info.rb +58 -0
  279. data/lib/sirena/parser/transforms/kanban.rb +176 -0
  280. data/lib/sirena/parser/transforms/mindmap.rb +227 -0
  281. data/lib/sirena/parser/transforms/packet.rb +63 -0
  282. data/lib/sirena/parser/transforms/pie.rb +143 -0
  283. data/lib/sirena/parser/transforms/quadrant.rb +177 -0
  284. data/lib/sirena/parser/transforms/radar.rb +126 -0
  285. data/lib/sirena/parser/transforms/requirement.rb +272 -0
  286. data/lib/sirena/parser/transforms/sankey.rb +122 -0
  287. data/lib/sirena/parser/transforms/sequence.rb +342 -0
  288. data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
  289. data/lib/sirena/parser/transforms/timeline.rb +177 -0
  290. data/lib/sirena/parser/transforms/treemap.rb +81 -0
  291. data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
  292. data/lib/sirena/parser/treemap.rb +98 -0
  293. data/lib/sirena/parser/user_journey.rb +120 -0
  294. data/lib/sirena/parser/xy_chart.rb +114 -0
  295. data/lib/sirena/parser.rb +8 -0
  296. data/lib/sirena/renderer/architecture.rb +251 -0
  297. data/lib/sirena/renderer/base.rb +251 -0
  298. data/lib/sirena/renderer/block.rb +286 -0
  299. data/lib/sirena/renderer/c4.rb +490 -0
  300. data/lib/sirena/renderer/class_diagram.rb +499 -0
  301. data/lib/sirena/renderer/er_diagram.rb +417 -0
  302. data/lib/sirena/renderer/error.rb +131 -0
  303. data/lib/sirena/renderer/flowchart.rb +301 -0
  304. data/lib/sirena/renderer/gantt.rb +331 -0
  305. data/lib/sirena/renderer/git_graph.rb +368 -0
  306. data/lib/sirena/renderer/info.rb +93 -0
  307. data/lib/sirena/renderer/kanban.rb +295 -0
  308. data/lib/sirena/renderer/mindmap.rb +396 -0
  309. data/lib/sirena/renderer/packet.rb +239 -0
  310. data/lib/sirena/renderer/pie.rb +235 -0
  311. data/lib/sirena/renderer/quadrant.rb +292 -0
  312. data/lib/sirena/renderer/radar.rb +323 -0
  313. data/lib/sirena/renderer/requirement.rb +371 -0
  314. data/lib/sirena/renderer/sankey.rb +255 -0
  315. data/lib/sirena/renderer/sequence.rb +424 -0
  316. data/lib/sirena/renderer/state_diagram.rb +328 -0
  317. data/lib/sirena/renderer/timeline.rb +304 -0
  318. data/lib/sirena/renderer/treemap.rb +152 -0
  319. data/lib/sirena/renderer/user_journey.rb +331 -0
  320. data/lib/sirena/renderer/xy_chart.rb +452 -0
  321. data/lib/sirena/renderer.rb +8 -0
  322. data/lib/sirena/svg/circle.rb +41 -0
  323. data/lib/sirena/svg/document.rb +103 -0
  324. data/lib/sirena/svg/element.rb +65 -0
  325. data/lib/sirena/svg/ellipse.rb +33 -0
  326. data/lib/sirena/svg/group.rb +71 -0
  327. data/lib/sirena/svg/line.rb +49 -0
  328. data/lib/sirena/svg/path.rb +76 -0
  329. data/lib/sirena/svg/polygon.rb +43 -0
  330. data/lib/sirena/svg/polyline.rb +35 -0
  331. data/lib/sirena/svg/rect.rb +57 -0
  332. data/lib/sirena/svg/style.rb +44 -0
  333. data/lib/sirena/svg/text.rb +72 -0
  334. data/lib/sirena/svg.rb +19 -0
  335. data/lib/sirena/text_measurement.rb +71 -0
  336. data/lib/sirena/theme/builtin/dark.yml +70 -0
  337. data/lib/sirena/theme/builtin/default.yml +80 -0
  338. data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
  339. data/lib/sirena/theme/builtin/light.yml +70 -0
  340. data/lib/sirena/theme/color_palette.rb +48 -0
  341. data/lib/sirena/theme/effect_styles.rb +28 -0
  342. data/lib/sirena/theme/registry.rb +41 -0
  343. data/lib/sirena/theme/shape_styles.rb +28 -0
  344. data/lib/sirena/theme/spacing_config.rb +24 -0
  345. data/lib/sirena/theme/typography.rb +30 -0
  346. data/lib/sirena/theme.rb +69 -0
  347. data/lib/sirena/transform/architecture.rb +273 -0
  348. data/lib/sirena/transform/base.rb +199 -0
  349. data/lib/sirena/transform/block.rb +215 -0
  350. data/lib/sirena/transform/c4.rb +288 -0
  351. data/lib/sirena/transform/class_diagram.rb +296 -0
  352. data/lib/sirena/transform/er_diagram.rb +204 -0
  353. data/lib/sirena/transform/error.rb +39 -0
  354. data/lib/sirena/transform/flowchart.rb +161 -0
  355. data/lib/sirena/transform/gantt.rb +253 -0
  356. data/lib/sirena/transform/git_graph.rb +283 -0
  357. data/lib/sirena/transform/info.rb +39 -0
  358. data/lib/sirena/transform/kanban.rb +180 -0
  359. data/lib/sirena/transform/mindmap.rb +251 -0
  360. data/lib/sirena/transform/packet.rb +185 -0
  361. data/lib/sirena/transform/pie.rb +62 -0
  362. data/lib/sirena/transform/quadrant.rb +167 -0
  363. data/lib/sirena/transform/radar.rb +227 -0
  364. data/lib/sirena/transform/requirement.rb +233 -0
  365. data/lib/sirena/transform/sankey.rb +212 -0
  366. data/lib/sirena/transform/sequence.rb +143 -0
  367. data/lib/sirena/transform/state_diagram.rb +228 -0
  368. data/lib/sirena/transform/timeline.rb +139 -0
  369. data/lib/sirena/transform/treemap.rb +120 -0
  370. data/lib/sirena/transform/user_journey.rb +207 -0
  371. data/lib/sirena/transform/xy_chart.rb +273 -0
  372. data/lib/sirena/transform.rb +8 -0
  373. data/lib/sirena/version.rb +5 -0
  374. data/lib/sirena.rb +328 -0
  375. data/lib/tasks/benchmark.rake +532 -0
  376. data/lib/tasks/examples.rake +468 -0
  377. data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
  378. data/lib/tasks/mermaid_fixtures.rake +46 -0
  379. data/scripts/extract_mermaid_tests.rb +493 -0
  380. data/scripts/rename_to_sirena.rb +73 -0
  381. data/sirena.gemspec +47 -0
  382. metadata +529 -0
@@ -0,0 +1,528 @@
1
+ = Radar chart diagrams
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Overview
6
+
7
+ Radar charts (also known as spider charts or web charts) in Sirena visualize
8
+ multivariate data on axes that radiate from a central point. They are ideal for
9
+ comparing multiple variables across different items or showing the relative
10
+ performance of different attributes.
11
+
12
+ Radar charts are useful for:
13
+
14
+ * Comparing skill sets or competencies
15
+ * Displaying performance metrics across categories
16
+ * Visualizing product features or specifications
17
+ * Showing survey results with multiple dimensions
18
+ * Comparing team or individual assessments
19
+ * Analyzing competitive positioning
20
+
21
+ == Syntax specification
22
+
23
+ === Diagram declaration
24
+
25
+ Radar charts are declared using the `radar-beta` keyword:
26
+
27
+ [source,mermaid]
28
+ ----
29
+ radar-beta
30
+ axis <axis-definitions>
31
+ curve <dataset-definitions>
32
+ ----
33
+
34
+ === Axes
35
+
36
+ ==== Simple axes
37
+
38
+ Axes are defined with comma-separated identifiers:
39
+
40
+ [source,mermaid]
41
+ ----
42
+ radar-beta
43
+ axis A, B, C
44
+ ----
45
+
46
+ ==== Labeled axes
47
+
48
+ Axes can have custom labels using square brackets and quotes:
49
+
50
+ [source,mermaid]
51
+ ----
52
+ radar-beta
53
+ axis A["Skill A"], B["Skill B"], C["Skill C"]
54
+ ----
55
+
56
+ Where:
57
+
58
+ `axis`:: Keyword to declare axes
59
+ `A, B, C`:: Axis identifiers (used for data mapping)
60
+ `["Label"]`:: Optional human-readable label for the axis
61
+
62
+ === Datasets (curves)
63
+
64
+ ==== Positional values
65
+
66
+ Data can be provided as a comma-separated list matching axis order:
67
+
68
+ [source,mermaid]
69
+ ----
70
+ radar-beta
71
+ axis A, B, C
72
+ curve dataset1{1, 2, 3}
73
+ ----
74
+
75
+ ==== Named values
76
+
77
+ Data can be mapped explicitly to axes (order-independent):
78
+
79
+ [source,mermaid]
80
+ ----
81
+ radar-beta
82
+ axis A, B, C
83
+ curve dataset1{C: 3, A: 1, B: 2}
84
+ ----
85
+
86
+ ==== Labeled datasets
87
+
88
+ Datasets can have custom labels:
89
+
90
+ [source,mermaid]
91
+ ----
92
+ radar-beta
93
+ axis A, B, C
94
+ curve dataset1["My Dataset"]{1, 2, 3}
95
+ ----
96
+
97
+ Where:
98
+
99
+ `curve`:: Keyword to declare a dataset
100
+ `dataset1`:: Dataset identifier
101
+ `["Label"]`:: Optional human-readable label
102
+ `{values}`:: Data values (positional or named)
103
+
104
+ === Title and metadata
105
+
106
+ ==== Title
107
+
108
+ Add a title to the chart:
109
+
110
+ [source,mermaid]
111
+ ----
112
+ radar-beta
113
+ title Skills Assessment
114
+ axis A, B, C
115
+ curve c1{1, 2, 3}
116
+ ----
117
+
118
+ ==== Accessibility metadata
119
+
120
+ Add accessibility information:
121
+
122
+ [source,mermaid]
123
+ ----
124
+ radar-beta
125
+ title Radar diagram
126
+ accTitle: Radar accessible title
127
+ accDescr: Radar accessible description
128
+ axis A, B, C
129
+ curve c1{1, 2, 3}
130
+ ----
131
+
132
+ Where:
133
+
134
+ `title`:: Chart title
135
+ `accTitle:`:: Accessible title for screen readers
136
+ `accDescr:`:: Accessible description for screen readers
137
+
138
+ === Configuration options
139
+
140
+ ==== Graticule
141
+
142
+ Set the grid style (polygon or circular):
143
+
144
+ [source,mermaid]
145
+ ----
146
+ radar-beta
147
+ graticule polygon
148
+ ----
149
+
150
+ ==== Value range
151
+
152
+ Define minimum and maximum values:
153
+
154
+ [source,mermaid]
155
+ ----
156
+ radar-beta
157
+ min 0
158
+ max 100
159
+ ----
160
+
161
+ ==== Ticks
162
+
163
+ Set the number of grid lines:
164
+
165
+ [source,mermaid]
166
+ ----
167
+ radar-beta
168
+ ticks 10
169
+ ----
170
+
171
+ ==== Legend
172
+
173
+ Control legend visibility:
174
+
175
+ [source,mermaid]
176
+ ----
177
+ radar-beta
178
+ showLegend false
179
+ ----
180
+
181
+ Where:
182
+
183
+ `graticule`:: Grid style (`polygon` or `circular`)
184
+ `min`:: Minimum value for scaling
185
+ `max`:: Maximum value for scaling
186
+ `ticks`:: Number of grid circles to display
187
+ `showLegend`:: Whether to show the legend (`true` or `false`)
188
+
189
+ == Examples
190
+
191
+ === Simple radar chart
192
+
193
+ .Basic three-axis radar
194
+ [example]
195
+ ====
196
+ [source,mermaid]
197
+ ----
198
+ radar-beta
199
+ axis A, B, C
200
+ curve mycurve{1, 2, 3}
201
+ ----
202
+
203
+ This creates a simple radar with:
204
+
205
+ * Three axes (A, B, C)
206
+ * One dataset with values [1, 2, 3]
207
+ * Default styling and grid
208
+ ====
209
+
210
+ === Skills assessment
211
+
212
+ .Comparing team skills
213
+ [example]
214
+ ====
215
+ [source,mermaid]
216
+ ----
217
+ radar-beta
218
+ title Team Skills Assessment
219
+ axis JavaScript["JavaScript"], Python["Python"], SQL["SQL"], DevOps["DevOps"], Design["Design"]
220
+ curve TeamA["Team A"]{85, 70, 60, 75, 55}
221
+ curve TeamB["Team B"]{70, 90, 80, 65, 70}
222
+ ----
223
+
224
+ This demonstrates:
225
+
226
+ * Labeled axes for clarity
227
+ * Multiple datasets for comparison
228
+ * Meaningful labels for both axes and datasets
229
+ * Real-world skill measurement scenario
230
+ ====
231
+
232
+ === Product comparison
233
+
234
+ .Comparing product features
235
+ [example]
236
+ ====
237
+ [source,mermaid]
238
+ ----
239
+ radar-beta
240
+ title Product Feature Comparison
241
+ axis Performance["Performance"], Usability["Usability"], Features["Features"], Price["Price"], Support["Support"]
242
+ curve ProductA["Product A"]{90, 85, 70, 60, 80}
243
+ curve ProductB["Product B"]{75, 90, 85, 85, 70}
244
+ curve ProductC["Product C"]{80, 75, 90, 70, 75}
245
+ min 0
246
+ max 100
247
+ ----
248
+
249
+ This shows:
250
+
251
+ * Three products being compared
252
+ * Five evaluation criteria
253
+ * Explicit value range (0-100)
254
+ * Clear labeling for decision-making
255
+ ====
256
+
257
+ === Survey results
258
+
259
+ .Analyzing survey data
260
+ [example]
261
+ ====
262
+ [source,mermaid]
263
+ ----
264
+ radar-beta
265
+ title Customer Satisfaction Survey
266
+ accTitle: Customer satisfaction survey results
267
+ accDescr: Radar chart showing satisfaction scores across different aspects
268
+ axis Quality["Product Quality"], Service["Customer Service"], Value["Value for Money"], Delivery["Delivery Speed"], Packaging["Packaging"]
269
+ curve Q1Results["Q1 2024"]{85, 78, 82, 90, 88}
270
+ curve Q2Results["Q2 2024"]{88, 82, 85, 92, 90}
271
+ graticule polygon
272
+ min 0
273
+ max 100
274
+ ----
275
+
276
+ This illustrates:
277
+
278
+ * Accessibility metadata
279
+ * Quarterly comparison
280
+ * Polygon grid style
281
+ * Clear value range
282
+ * Professional presentation
283
+ ====
284
+
285
+ === Named value format
286
+
287
+ .Using named values for clarity
288
+ [example]
289
+ ====
290
+ [source,mermaid]
291
+ ----
292
+ radar-beta
293
+ title Performance Metrics
294
+ axis Speed["Speed"], Memory["Memory Usage"], CPU["CPU Usage"], Reliability["Reliability"]
295
+ curve System1["System 1"]{Speed: 90, Memory: 70, CPU: 75, Reliability: 95}
296
+ curve System2["System 2"]{Reliability: 85, Speed: 80, CPU: 90, Memory: 85}
297
+ ----
298
+
299
+ This demonstrates:
300
+
301
+ * Named value format (order-independent)
302
+ * Clear axis-to-value mapping
303
+ * Flexibility in data specification
304
+ ====
305
+
306
+ === Minimal configuration
307
+
308
+ .Minimal radar with options
309
+ [example]
310
+ ====
311
+ [source,mermaid]
312
+ ----
313
+ radar-beta
314
+ axis Mon, Tue, Wed, Thu, Fri
315
+ curve Activity{65, 78, 82, 88, 72}
316
+ ticks 5
317
+ showLegend false
318
+ min 0
319
+ max 100
320
+ ----
321
+
322
+ This shows:
323
+
324
+ * Simple axis identifiers
325
+ * Single dataset
326
+ * Custom tick count
327
+ * Legend disabled
328
+ * Explicit value range
329
+ ====
330
+
331
+ == Features
332
+
333
+ === Multiple datasets
334
+
335
+ Compare up to multiple datasets on the same chart:
336
+
337
+ [source,mermaid]
338
+ ----
339
+ radar-beta
340
+ axis A, B, C, D
341
+ curve data1{1, 2, 3, 4}
342
+ curve data2{2, 3, 1, 4}
343
+ curve data3{3, 1, 4, 2}
344
+ ----
345
+
346
+ Each dataset is rendered with a different color from the theme palette.
347
+
348
+ === Flexible axis count
349
+
350
+ Support for any number of axes (typically 3-12):
351
+
352
+ [source,mermaid]
353
+ ----
354
+ radar-beta
355
+ axis A, B, C, D, E, F, G, H
356
+ curve data{10, 20, 30, 40, 50, 60, 70, 80}
357
+ ----
358
+
359
+ === Value normalization
360
+
361
+ Values are automatically normalized to fit the chart:
362
+
363
+ [source,mermaid]
364
+ ----
365
+ radar-beta
366
+ axis A, B, C
367
+ curve data{100, 200, 300} # Automatically scaled
368
+ ----
369
+
370
+ === Custom labels
371
+
372
+ All elements support custom labels:
373
+
374
+ [source,mermaid]
375
+ ----
376
+ radar-beta
377
+ axis A["First Metric"], B["Second Metric"], C["Third Metric"]
378
+ curve dataset["My Custom Name"]{1, 2, 3}
379
+ ----
380
+
381
+ == Limitations
382
+
383
+ === Currently not supported
384
+
385
+ The following Mermaid radar features are not yet supported in Sirena:
386
+
387
+ * Custom colors per dataset
388
+ * Curve-specific styling options
389
+ * Area opacity controls
390
+ * Data point markers beyond default circles
391
+ * Interactive tooltips
392
+
393
+ === Known issues
394
+
395
+ * Very large numbers of axes (>12) may cause label overlap
396
+ * Long axis labels may require manual positioning
397
+ * Theme colors cycle after 10 datasets
398
+
399
+ == Best practices
400
+
401
+ === Use appropriate axis count
402
+
403
+ Keep the number of axes manageable:
404
+
405
+ [source,mermaid]
406
+ ----
407
+ %% Good - Clear and readable
408
+ radar-beta
409
+ axis A, B, C, D, E
410
+ curve data{1, 2, 3, 4, 5}
411
+
412
+ %% Too many - Hard to distinguish
413
+ radar-beta
414
+ axis A, B, C, D, E, F, G, H, I, J, K, L, M, N, O
415
+ curve data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}
416
+ ----
417
+
418
+ === Provide meaningful labels
419
+
420
+ Use descriptive axis and dataset labels:
421
+
422
+ [source,mermaid]
423
+ ----
424
+ %% Good
425
+ radar-beta
426
+ title Employee Performance Review
427
+ axis Communication["Communication Skills"], Technical["Technical Skills"], Leadership["Leadership"], Teamwork["Teamwork"]
428
+ curve Employee1["John Doe"]{85, 90, 75, 88}
429
+
430
+ %% Less clear
431
+ radar-beta
432
+ axis A, B, C, D
433
+ curve c1{85, 90, 75, 88}
434
+ ----
435
+
436
+ === Set explicit ranges
437
+
438
+ Define min/max for consistent comparisons:
439
+
440
+ [source,mermaid]
441
+ ----
442
+ radar-beta
443
+ axis A, B, C
444
+ curve data{45, 67, 89}
445
+ min 0
446
+ max 100 # Explicit range for clarity
447
+ ----
448
+
449
+ === Limit dataset count
450
+
451
+ Keep comparisons manageable (typically 2-5 datasets):
452
+
453
+ [source,mermaid]
454
+ ----
455
+ %% Good - Clear comparison
456
+ radar-beta
457
+ axis A, B, C, D
458
+ curve Team1{1, 2, 3, 4}
459
+ curve Team2{2, 3, 1, 4}
460
+ curve Team3{3, 1, 4, 2}
461
+
462
+ %% Too many - Cluttered
463
+ radar-beta
464
+ axis A, B, C
465
+ curve d1{1, 2, 3}
466
+ curve d2{2, 3, 1}
467
+ curve d3{3, 1, 2}
468
+ curve d4{1, 3, 2}
469
+ curve d5{2, 1, 3}
470
+ curve d6{3, 2, 1}
471
+ ----
472
+
473
+ === Use consistent scales
474
+
475
+ Ensure all values are on comparable scales:
476
+
477
+ [source,mermaid]
478
+ ----
479
+ %% Good - All percentages
480
+ radar-beta
481
+ axis Quality, Speed, Cost
482
+ curve Product{85, 90, 75}
483
+ min 0
484
+ max 100
485
+
486
+ %% Inconsistent - Mixed scales
487
+ radar-beta
488
+ axis Score, Count, Percentage
489
+ curve data{85, 1000, 75} # Different magnitudes
490
+ ----
491
+
492
+ === Choose appropriate grid
493
+
494
+ Select grid style based on your needs:
495
+
496
+ [source,mermaid]
497
+ ----
498
+ %% Polygon grid - More geometric
499
+ radar-beta
500
+ graticule polygon
501
+ axis A, B, C
502
+ curve data{1, 2, 3}
503
+
504
+ %% Circular grid - More organic
505
+ radar-beta
506
+ graticule circular
507
+ axis A, B, C
508
+ curve data{1, 2, 3}
509
+ ----
510
+
511
+ === Include context
512
+
513
+ Add titles and descriptions:
514
+
515
+ [source,mermaid]
516
+ ----
517
+ radar-beta
518
+ title Q3 2024 Performance Metrics
519
+ accTitle: Third quarter performance metrics
520
+ accDescr: Radar chart showing performance across five key metrics for Q3 2024
521
+ axis A, B, C, D, E
522
+ curve data{85, 90, 78, 92, 88}
523
+ ----
524
+
525
+ == Related documentation
526
+
527
+ * link:https://mermaid.js.org/syntax/radar.html[Official Mermaid radar documentation]
528
+ * <<index.adoc#,Diagram types overview>>