visualifyjs 2.5.3 → 3.0.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 (252) hide show
  1. package/.claude/mem/TIMELINE.md +36 -0
  2. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-external-script-solution.md +24 -0
  3. package/.claude/mem/notes/2026-02-11-3d-visualization-docs-fix-session-summary.md +43 -0
  4. package/.claude/mem/notes/2026-02-11-cli-fix-editor-command-alias.md +26 -0
  5. package/.claude/mem/notes/2026-02-11-phase-3-developer-experience-completed.md +51 -0
  6. package/.claude/mem/notes/2026-02-11-phase-4-web-workers-implementation-complete.md +59 -0
  7. package/.claude/mem/notes/2026-02-11-visualify-phase-2-3d-visualization-complete.md +50 -0
  8. package/.claude/mem/notes/2026-02-11-visualify-phase-2-committed-ready-for-phase-3.md +33 -0
  9. package/.claude/mem/notes/2026-02-11-visualify-phase-3-complete-developer-experience.md +52 -0
  10. package/.claude/mem/notes/2026-02-11-visualify-repository-cleanup-complete.md +28 -0
  11. package/.claude/mem/notes/2026-02-18-codebase-cleanup-docsify-plugin-documentation.md +37 -0
  12. package/.claude/mem/notes/2026-02-19-css-grid-layout-fix-displaycontents-on-vcontroller.md +18 -0
  13. package/.claude/mem/notes/2026-02-19-docsify-plugin-fixes-latex-and-visualify-code-bloc.md +26 -0
  14. package/.claude/mem/notes/2026-02-19-page-mode-docs-update-decisions.md +23 -0
  15. package/.claude/mem/notes/2026-02-19-react-context-infinite-re-render-loop-fix-pattern.md +31 -0
  16. package/.claude/mem/notes/2026-02-19-version-300-bump-and-build-fixes.md +32 -0
  17. package/.claude/mem/notes/2026-02-19-visualify-build-deployment-architecture-bug-fixes.md +25 -0
  18. package/.claude/mem/notes/2026-02-19-visualify-dist-iife-self-contained-build-config.md +30 -0
  19. package/.claude/mem/notes/2026-02-19-visualify-infinite-loop-i18n-fixes.md +31 -0
  20. package/.claude/mem/notes/2026-02-19-visualify-v3-bundle-splitting-docs-restructuring.md +32 -0
  21. package/.claude/mem/notes/2026-02-20-bundle-externalization-final-architecture.md +29 -0
  22. package/.claude/mem/notes/2026-02-20-chromium-page-fix-unstable-keys-and-double-event-b.md +27 -0
  23. package/.claude/mem/notes/2026-02-20-console-cleanup-bundle-optimization-commit.md +20 -0
  24. package/.claude/mem/notes/2026-02-20-dotbio-dot-plot-fix-useeffect-dependency.md +21 -0
  25. package/.claude/mem/notes/2026-02-20-public-folder-cleanup-and-readme-rewrite.md +25 -0
  26. package/.claude/mem/notes/2026-02-20-v300-release-and-beta-channel-strategy.md +29 -0
  27. package/.claude/mem/notes/2026-02-20-visium-background-image-unknown-legend-fix.md +19 -0
  28. package/.claude/mem/notes/2026-02-20-visualify-cdn-loader-bundle-externalization.md +34 -0
  29. package/.claude/mem/sessions/session-2026-02-20-031524.md +54 -0
  30. package/.claude/settings.local.json +21 -0
  31. package/.github/workflows/static.yml.bak +51 -51
  32. package/.sisyphus/boulder.json +65 -0
  33. package/.sisyphus/plans/phase-4-advanced-optimizations.md +217 -0
  34. package/LICENSE +674 -674
  35. package/README.md +94 -59
  36. package/config-overrides.js +31 -31
  37. package/dist/stats.html +4949 -0
  38. package/dist/visualify-3d.esm.js +1 -0
  39. package/dist/visualify-3d.js +1 -0
  40. package/dist/visualify-core.esm.js +1 -0
  41. package/dist/visualify-core.js +1 -0
  42. package/dist/visualify-docs.esm.js +1 -0
  43. package/dist/visualify-docs.js +1 -0
  44. package/dist/visualify-loader.js +1 -0
  45. package/dist/visualify-pages.esm.js +1 -0
  46. package/dist/visualify-pages.js +1 -0
  47. package/dist/visualify-portal.esm.js +1 -0
  48. package/dist/visualify-portal.js +1 -0
  49. package/dist/visualify-shared.js +26571 -0
  50. package/dist/visualify.js +1 -188
  51. package/docs/CHANGELOG.md +148 -0
  52. package/docs/cli/commands.md +513 -0
  53. package/docs/configuration/visualify-json.md +474 -0
  54. package/docs/docs/3d-visualization.md +374 -0
  55. package/docs/docs/CLI.md +303 -34
  56. package/docs/docs/README.md +65 -65
  57. package/docs/docs/Rechart/bar.md +190 -190
  58. package/docs/docs/Rechart/funnel.md +241 -193
  59. package/docs/docs/Rechart/line.md +355 -355
  60. package/docs/docs/Rechart/pie.md +225 -225
  61. package/docs/docs/Rechart/radar.md +253 -253
  62. package/docs/docs/Rechart/scatter.md +298 -0
  63. package/docs/docs/_404.md +51 -51
  64. package/docs/docs/_coverpage.md +11 -11
  65. package/docs/docs/_sidebar.md +54 -43
  66. package/docs/docs/components/dotBio.md +87 -34
  67. package/docs/docs/components/echart.md +171 -82
  68. package/docs/docs/components/html.md +61 -34
  69. package/docs/docs/components/macaron.md +156 -145
  70. package/docs/docs/components/markdown.md +42 -0
  71. package/docs/docs/components/more.md +183 -142
  72. package/docs/docs/components/plotly.md +132 -62
  73. package/docs/docs/components/scatterL.md +171 -70
  74. package/docs/docs/components/visium.md +112 -57
  75. package/docs/docs/configuration.md +121 -123
  76. package/docs/docs/deploy.md +31 -31
  77. package/docs/docs/docsify-plugin.md +655 -0
  78. package/docs/docs/hmr.md +165 -0
  79. package/docs/docs/i18n.md +332 -0
  80. package/docs/docs/log.md +30 -1
  81. package/docs/docs/more-pages.md +23 -23
  82. package/docs/docs/quickstart.md +148 -119
  83. package/docs/docs/rechart-attributes.md +74 -74
  84. package/docs/docs/rechart-basic-usage.md +160 -162
  85. package/docs/docs/theme.md +5 -5
  86. package/docs/docs/typescript.md +306 -0
  87. package/docs/docs/visual-editor.md +359 -0
  88. package/docs/index.html +85 -71
  89. package/docs/manifest.json +23 -23
  90. package/docs/migration/v3-migration.md +392 -0
  91. package/docs/static/css/fluff-stuff.css +169 -169
  92. package/docs/static/css/font-awesome.min.css +4 -4
  93. package/docs/static/css/visualify.css +6 -25
  94. package/docs/static/js/3d-viz-examples.js +181 -0
  95. package/docs/static/js/configuration.js +630 -448
  96. package/docs/static/js/visualify.js +1 -188
  97. package/package.json +106 -84
  98. package/rollup.config.mjs +766 -76
  99. package/src/_css/404.css +115 -115
  100. package/src/_css/App.css +37 -37
  101. package/src/_css/autoSuggestion.css +26 -26
  102. package/src/_css/circular-progress.css +32 -32
  103. package/src/_css/index.css +36 -36
  104. package/src/_css/modern.css +350 -25
  105. package/src/_media/corner.svg +8 -8
  106. package/src/_media/download.svg +3 -3
  107. package/src/_media/logo.svg +14 -14
  108. package/src/_test/App.test.js +15 -15
  109. package/src/_utils/reportWebVitals.js +13 -13
  110. package/src/a11y/README.md +177 -0
  111. package/src/a11y/aria-labels.js +339 -0
  112. package/src/a11y/color-contrast.js +535 -0
  113. package/src/a11y/index.js +197 -0
  114. package/src/a11y/keyboard-nav.js +523 -0
  115. package/src/a11y/styles.css +165 -0
  116. package/src/cli/commands/dev.js +214 -0
  117. package/src/cli/commands/docs.js +521 -0
  118. package/src/cli/commands/edit.js +379 -0
  119. package/src/cli/commands/init.js +213 -0
  120. package/src/cli/commands/portal.js +236 -0
  121. package/src/cli/dev-server.js +530 -0
  122. package/src/cli/hmr.js +456 -0
  123. package/src/cli/index.js +180 -0
  124. package/src/cli/utils/config.js +207 -0
  125. package/src/cli/utils/logger.js +241 -0
  126. package/src/config/defaults.ts +122 -0
  127. package/src/config/index.ts +72 -0
  128. package/src/config/loader.ts +478 -0
  129. package/src/config/schema.ts +227 -0
  130. package/src/config/validator.ts +337 -0
  131. package/src/core/appContext.js +34 -27
  132. package/src/core/components/Bar.js +383 -0
  133. package/src/core/components/Bar3D.js +473 -0
  134. package/src/core/components/LargeDatasetChart.js +296 -0
  135. package/src/core/components/Line3D.js +310 -0
  136. package/src/core/components/Scatter.js +392 -188
  137. package/src/core/components/Scatter3D.js +455 -0
  138. package/src/core/components/ScatterBio.js +601 -572
  139. package/src/core/components/Surface3D.js +326 -0
  140. package/src/core/components/ThreeCustom.js +648 -0
  141. package/src/core/components/ThreeScene.js +459 -0
  142. package/src/core/components/VisiumPlot.js +191 -165
  143. package/src/core/components/browser.js +42 -42
  144. package/src/core/components/dotplot.js +413 -413
  145. package/src/core/components/html.js +29 -29
  146. package/src/core/components/list.js +178 -178
  147. package/src/core/components/macaron.js +206 -201
  148. package/src/core/components/markdown.js +56 -56
  149. package/src/core/components/parser.scatterBio.js +582 -579
  150. package/src/core/components/ratio.js +82 -80
  151. package/src/core/components/scatterL.js +206 -173
  152. package/src/core/components/searchbar.js +156 -131
  153. package/src/core/components/selection.js +310 -193
  154. package/src/core/components/timeline.js +236 -281
  155. package/src/core/components/visium.js +114 -97
  156. package/src/core/data-processor.js +413 -0
  157. package/src/core/fetch/condfetch.js +82 -82
  158. package/src/core/fetch/fetch.js +92 -92
  159. package/src/core/fetch/json.js +29 -29
  160. package/src/core/fetch/vfetch.js +42 -42
  161. package/src/core/hmr-client.js +724 -0
  162. package/src/core/liveEditor.js +44 -44
  163. package/src/core/modules/codeEditorWithPreview.js +104 -104
  164. package/src/core/modules/echarts/common.js +20 -20
  165. package/src/core/modules/echarts/gl.js +228 -0
  166. package/src/core/modules/echarts/presetHandler.js +41 -41
  167. package/src/core/modules/echarts/presets/esodev.chromium.js +172 -172
  168. package/src/core/modules/echarts/presets/esodev.codex.js +130 -130
  169. package/src/core/modules/echarts/presets/esodev.visium.js +123 -123
  170. package/src/core/modules/echarts/presets/mmtrbc.js +186 -186
  171. package/src/core/modules/echarts.js +70 -71
  172. package/src/core/modules/echartsUtils.js +43 -43
  173. package/src/core/modules/echartswitcher.js +227 -152
  174. package/src/core/modules/replotly/presetHandler.js +24 -24
  175. package/src/core/modules/replotly/presets/minimum.js +18 -18
  176. package/src/core/modules/replotly/presets/mmtrbc.dot.js +114 -114
  177. package/src/core/modules/replotly/presets/mmtrbc.violin.js +100 -100
  178. package/src/core/modules/replotly.js +74 -71
  179. package/src/core/modules/threejs/Camera.js +373 -0
  180. package/src/core/modules/threejs/Lighting.js +459 -0
  181. package/src/core/modules/threejs/Renderer.js +364 -0
  182. package/src/core/modules/threejs/Scene.js +266 -0
  183. package/src/core/modules/threejs/index.js +155 -0
  184. package/src/core/pages/404.js +50 -50
  185. package/src/core/pages/error.js +27 -27
  186. package/src/core/pages/jsonPage.js +62 -62
  187. package/src/core/pages/loading.js +44 -44
  188. package/src/core/parser/echart.data.js +204 -183
  189. package/src/core/parser/echart.features.js +125 -125
  190. package/src/core/parser/echart.general.js +147 -143
  191. package/src/core/parser/echart.hilbert.js +57 -57
  192. package/src/core/parser/echart.parser.js +210 -210
  193. package/src/core/parser/echart.series.js +67 -67
  194. package/src/core/parser/echart.types.js +76 -76
  195. package/src/core/parser/plotly.config.js +10 -10
  196. package/src/core/parser/plotly.data.js +132 -132
  197. package/src/core/parser/plotly.layout.js +9 -9
  198. package/src/core/parser/plotly.violin.js +18 -18
  199. package/src/core/recharts.js +361 -62
  200. package/src/core/router/alias.js +49 -49
  201. package/src/core/router/jsonRouter.js +31 -31
  202. package/src/core/themes/modern.js +32 -32
  203. package/src/core/themes/themeSelector.js +33 -33
  204. package/src/core/visualify.js +213 -47
  205. package/src/core/widgets/circularProgress.js +23 -23
  206. package/src/core/widgets/controller.js +116 -83
  207. package/src/core/widgets/errorBoundary.js +36 -36
  208. package/src/core/widgets/footer.js +185 -177
  209. package/src/core/widgets/header.js +238 -234
  210. package/src/core/widgets/layout/Grid.js +31 -31
  211. package/src/core/widgets/layout.js +36 -36
  212. package/src/core/widgets/mapping.js +56 -42
  213. package/src/core/workers/data-worker.js +349 -0
  214. package/src/core/workers/worker-pool.js +396 -0
  215. package/src/docsify/bundle.js +215 -0
  216. package/src/docsify/markdown.js +271 -0
  217. package/src/docsify/plugin.js +268 -0
  218. package/src/editor/README.md +172 -0
  219. package/src/editor/components/ChartBuilder.jsx +341 -0
  220. package/src/editor/components/ChartTypeSidebar.jsx +91 -0
  221. package/src/editor/components/Editor.jsx +367 -0
  222. package/src/editor/components/Preview.jsx +446 -0
  223. package/src/editor/components/PropertyPanel.jsx +468 -0
  224. package/src/editor/components/StatusBar.jsx +85 -0
  225. package/src/editor/context/EditorContext.js +248 -0
  226. package/src/editor/hooks/useDebounce.js +32 -0
  227. package/src/editor/index.js +315 -0
  228. package/src/editor/styles/editor.css +637 -0
  229. package/src/editor/utils/chartValidator.js +263 -0
  230. package/src/entries/charts3d.js +70 -0
  231. package/src/entries/core.js +78 -0
  232. package/src/entries/docs.js +154 -0
  233. package/src/entries/pages.js +93 -0
  234. package/src/entries/portal.js +204 -0
  235. package/src/entries/shared.js +50 -0
  236. package/src/i18n/formatters.js +455 -0
  237. package/src/i18n/index.js +169 -0
  238. package/src/i18n/locales/ar.json +137 -0
  239. package/src/i18n/locales/de.json +137 -0
  240. package/src/i18n/locales/en.json +137 -0
  241. package/src/i18n/locales/es.json +137 -0
  242. package/src/i18n/locales/he.json +137 -0
  243. package/src/i18n/locales/zh.json +137 -0
  244. package/src/i18n/rtl.css +183 -0
  245. package/src/index.js +82 -62
  246. package/src/loader.js +103 -0
  247. package/src/setupTests.js +5 -5
  248. package/tsconfig.json +51 -0
  249. package/types/charts.d.ts +569 -0
  250. package/types/components.d.ts +441 -0
  251. package/types/config.d.ts +199 -0
  252. package/types/index.d.ts +353 -0
@@ -1,145 +1,156 @@
1
- # Macaron Component
2
-
3
- The Macaron component is used to display a macaron plot for relation of nodes on
4
- the page.
5
-
6
- The Macaron component also has interactive features, such as the ability to drag
7
- and drop nodes, and the ability to select nodes.
8
-
9
- ## Properties
10
-
11
- The Macaron component has the following properties:
12
-
13
- - `type` (string): The type of the component, in this case `Macaron`.
14
- - `id` (string): The unique identifier of the component.
15
- - `row` (int): The row in which the component is to be displayed.
16
- - `col` (int): The column in which the component is to be displayed.
17
- - `config` (object): The configuration of the component.
18
- - `data` (object): The data of the component.
19
-
20
- ### config Properties
21
-
22
- The `config` object has the following properties:
23
-
24
- - `animation` (boolean): Whether to animate the component or not.
25
- - `draggable` (boolean): Whether to make the component draggable or not.
26
- - `height` (int): The height of the component.
27
- - `unclickable` (array): The nodes that are unclickable.
28
- - `symbolSize` (string): The size of the symbols in the component.
29
- - `color` (object): The color of the component.
30
- - `selected` (string): The color of the selected nodes.
31
- - `unselectable` (string): The color of the unselectable nodes.
32
-
33
- ### data Properties
34
-
35
- The `data` object has the following properties:
36
-
37
- - `nodes` (array): The nodes of the component.
38
- - `name` (string): The name of the node.
39
- - `category` (int): The category of the node.
40
- - `value` (int): The value of the node.
41
- - `edges` (array): The edges of the component.
42
- - `categories` (array): The categories of the component.
43
-
44
- ### Example
45
-
46
- ```json
47
- {
48
- "id": "celltype",
49
- "type": "Macaron",
50
- "title": "Select Cell Type",
51
- "style": {
52
- "height": "350px",
53
- "width": "350px",
54
- "font": "Arial, sans-serif",
55
- "border": ""
56
- },
57
- "data": {
58
- "nodes": [{
59
- "name": "Esophagus",
60
- "category": 1,
61
- "value": 216229
62
- },
63
- {
64
- "name": "Epithelium",
65
- "category": 2,
66
- "value": 108800
67
- },
68
- {
69
- "name": "Stroma",
70
- "category": 2,
71
- "value": 107429
72
- },
73
- {
74
- "name": "EPI (E)",
75
- "category": 3,
76
- "value": 97799
77
- },
78
- {
79
- "name": "ST (E)",
80
- "category": 3,
81
- "value": 1760
82
- }
83
- ],
84
- "edges": [{
85
- "source": "Esophagus",
86
- "target": "Epithelium",
87
- "level": 1
88
- },
89
- {
90
- "source": "Esophagus",
91
- "target": "Stroma",
92
- "level": 1
93
- },
94
- {
95
- "source": "Epithelium",
96
- "target": "IM (E)",
97
- "level": 2
98
- },
99
- {
100
- "source": "Epithelium",
101
- "target": "ERY (E)",
102
- "level": 2
103
- },
104
- {
105
- "source": "Stroma",
106
- "target": "MES (S)",
107
- "level": 2
108
- },
109
- {
110
- "source": "Stroma",
111
- "target": "ENS (S)",
112
- "level": 2
113
- },
114
- {
115
- "source": "Stroma",
116
- "target": "ENDO (S)",
117
- "level": 2
118
- }
119
- ],
120
- "categories": [{
121
- "name": "Category 1"
122
- },
123
- {
124
- "name": "Category 2"
125
- },
126
- {
127
- "name": "Category 3"
128
- }
129
- ]
130
- },
131
- "config": {
132
- "animation": false,
133
- "draggable": true,
134
- "height": "88%",
135
- "unclickable": ["EPI (S)", "Esophagus"],
136
- "symbolSize": "value",
137
- "color": {
138
- "selected": "skyblue",
139
- "unselectable": "black"
140
- }
141
- },
142
- "row": 1,
143
- "col": 1
144
- }
145
- ```
1
+ # Macaron Component
2
+
3
+ The Macaron component renders an interactive **graph visualization** showing relationships between nodes. It's ideal for displaying hierarchical data, network graphs, and taxonomy trees with drag-and-drop interactivity.
4
+
5
+ ## Features
6
+
7
+ - Interactive node selection with click events
8
+ - Drag-and-drop repositioning of nodes
9
+ - Configurable node sizes based on data values
10
+ - Category-based coloring
11
+ - Hierarchical edge relationships
12
+
13
+ ## Architecture
14
+
15
+ ```
16
+ ┌─────────────────────────────────────────┐
17
+ │ Macaron Graph │
18
+ │ │
19
+ │ ┌───────┐ │
20
+ │ │ Root │──────────┐ │
21
+ │ │ Node │ │ │
22
+ │ └───┬───┘ ┌────┴────┐ │
23
+ │ │ │ Child B │ │
24
+ ┌────┴────┐ └────┬────┘ │
25
+ Child A │ │ │
26
+ └────┬────┘ ┌────┴────┐ │
27
+ │ │ │ Leaf D │ │
28
+ ┌────┴────┐ └─────────┘ │
29
+ Leaf C │ │
30
+ └─────────┘ │
31
+ │ │
32
+ │ Nodes: sized by value, colored by │
33
+ │ category, draggable, selectable │
34
+ └─────────────────────────────────────────┘
35
+ ```
36
+
37
+ ## Properties
38
+
39
+ | Property | Type | Required | Description |
40
+ |----------|------|----------|-------------|
41
+ | `type` | string | Yes | Must be `"Macaron"` |
42
+ | `id` | string | Yes | Unique identifier for the component |
43
+ | `title` | string | No | Title displayed above the graph |
44
+ | `row` | int | No | Grid row position |
45
+ | `col` | int | No | Grid column position |
46
+ | `style` | object | No | CSS styles (height, width, font, border) |
47
+ | `config` | object | Yes | Graph configuration (see below) |
48
+ | `data` | object | Yes | Graph data: nodes, edges, categories |
49
+
50
+ ### config Properties
51
+
52
+ | Property | Type | Default | Description |
53
+ |----------|------|---------|-------------|
54
+ | `animation` | boolean | `true` | Enable/disable animation |
55
+ | `draggable` | boolean | `false` | Allow drag-and-drop of nodes |
56
+ | `height` | string | `"100%"` | Graph height |
57
+ | `unclickable` | array | `[]` | Node names that cannot be clicked |
58
+ | `symbolSize` | string | `"value"` | Size basis: `"value"` for data-driven |
59
+ | `color.selected` | string | - | Color for selected nodes |
60
+ | `color.unselectable` | string | - | Color for unclickable nodes |
61
+
62
+ ### data Properties
63
+
64
+ | Property | Type | Description |
65
+ |----------|------|-------------|
66
+ | `nodes` | array | Array of `{ name, category, value }` objects |
67
+ | `edges` | array | Array of `{ source, target, level }` objects |
68
+ | `categories` | array | Array of `{ name }` objects for node coloring |
69
+
70
+ ## Example
71
+
72
+ ### Cell Type Hierarchy
73
+
74
+ This example shows a biological cell type taxonomy tree:
75
+
76
+ ```json
77
+ {
78
+ "id": "celltype",
79
+ "type": "Macaron",
80
+ "title": "Select Cell Type",
81
+ "row": 1,
82
+ "col": 1,
83
+ "style": {
84
+ "height": "350px",
85
+ "width": "350px"
86
+ },
87
+ "data": {
88
+ "nodes": [
89
+ { "name": "Esophagus", "category": 1, "value": 216229 },
90
+ { "name": "Epithelium", "category": 2, "value": 108800 },
91
+ { "name": "Stroma", "category": 2, "value": 107429 },
92
+ { "name": "EPI (E)", "category": 3, "value": 97799 },
93
+ { "name": "ST (E)", "category": 3, "value": 1760 },
94
+ { "name": "IM (E)", "category": 3, "value": 5200 },
95
+ { "name": "MES (S)", "category": 3, "value": 45000 },
96
+ { "name": "ENS (S)", "category": 3, "value": 32000 },
97
+ { "name": "ENDO (S)", "category": 3, "value": 30429 }
98
+ ],
99
+ "edges": [
100
+ { "source": "Esophagus", "target": "Epithelium", "level": 1 },
101
+ { "source": "Esophagus", "target": "Stroma", "level": 1 },
102
+ { "source": "Epithelium", "target": "EPI (E)", "level": 2 },
103
+ { "source": "Epithelium", "target": "ST (E)", "level": 2 },
104
+ { "source": "Epithelium", "target": "IM (E)", "level": 2 },
105
+ { "source": "Stroma", "target": "MES (S)", "level": 2 },
106
+ { "source": "Stroma", "target": "ENS (S)", "level": 2 },
107
+ { "source": "Stroma", "target": "ENDO (S)", "level": 2 }
108
+ ],
109
+ "categories": [
110
+ { "name": "Root" },
111
+ { "name": "Tissue" },
112
+ { "name": "Cell Type" }
113
+ ]
114
+ },
115
+ "config": {
116
+ "animation": false,
117
+ "draggable": true,
118
+ "height": "88%",
119
+ "unclickable": ["Esophagus"],
120
+ "symbolSize": "value",
121
+ "color": {
122
+ "selected": "skyblue",
123
+ "unselectable": "black"
124
+ }
125
+ }
126
+ }
127
+ ```
128
+
129
+ ### How Selection Works
130
+
131
+ When a user clicks a node in the Macaron graph:
132
+
133
+ 1. The node becomes **highlighted** with the `selected` color
134
+ 2. The selection is stored in the global state under the component's `id`
135
+ 3. Other components (e.g., Echart, ScatterL) can **trigger** on this selection to update their data
136
+ 4. `unclickable` nodes are displayed with the `unselectable` color and do not respond to clicks
137
+
138
+ This creates an interactive filtering workflow:
139
+
140
+ ```
141
+ User clicks "EPI (E)" in Macaron
142
+
143
+ v
144
+ Global state: celltype = "EPI (E)"
145
+
146
+ v
147
+ Echart component triggers API call with "EPI (E)"
148
+
149
+ v
150
+ Scatter plot updates to show only EPI cells
151
+ ```
152
+
153
+ ## See Also
154
+
155
+ - [EsoDev Showcase](https://visualify.pharmacy.arizona.edu/EsoDev/) - Live example with Macaron cell type selector
156
+ - [Configuration](/configuration.md) - Page mode setup
@@ -0,0 +1,42 @@
1
+ # Markdown Component
2
+
3
+ The Markdown component renders Markdown content within a page mode layout. Use it for text-heavy content like descriptions, documentation, or README-style content alongside visualizations.
4
+
5
+ ## Properties
6
+
7
+ | Property | Type | Required | Description |
8
+ |----------|------|----------|-------------|
9
+ | `type` | string | Yes | Must be `"Markdown"`. |
10
+ | `id` | string | No | Unique identifier for the component. |
11
+ | `row` | int | Yes | The row in which the component is displayed. |
12
+ | `col` | int | Yes | The column in which the component is displayed. |
13
+ | `content` | string | No | Inline Markdown string to render. Use this for short content. |
14
+ | `src` | string | No | Path or URL to a Markdown file to load and render. Use this for longer content. |
15
+
16
+ > **Note:** Provide either `content` or `src`, not both. If both are specified, `content` takes precedence.
17
+
18
+ ## Example
19
+
20
+ ### Inline Content
21
+
22
+ ```json
23
+ {
24
+ "type": "Markdown",
25
+ "id": "description",
26
+ "row": 1,
27
+ "col": 1,
28
+ "content": "## About This Dataset\n\nThis dataset contains gene expression profiles across **12 tissue types**.\n\n- Source: GEO Database\n- Samples: 240\n- Platform: RNA-seq"
29
+ }
30
+ ```
31
+
32
+ ### Loading from a File
33
+
34
+ ```json
35
+ {
36
+ "type": "Markdown",
37
+ "id": "readme",
38
+ "row": 1,
39
+ "col": 1,
40
+ "src": "./data/description.md"
41
+ }
42
+ ```