visualifyjs 2.5.3-2.dev → 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 -241
  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 -298
  63. package/docs/docs/_404.md +51 -51
  64. package/docs/docs/_coverpage.md +11 -11
  65. package/docs/docs/_sidebar.md +54 -44
  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 -121
  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 -9
  81. package/docs/docs/more-pages.md +23 -23
  82. package/docs/docs/quickstart.md +148 -124
  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 -587
  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 -147
  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
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Accessibility Styles for Visualify.js
3
+ * Screen reader support, focus indicators, and motion preferences
4
+ */
5
+
6
+ /* Screen reader only content */
7
+ .sr-only {
8
+ position: absolute;
9
+ width: 1px;
10
+ height: 1px;
11
+ padding: 0;
12
+ margin: -1px;
13
+ overflow: hidden;
14
+ clip: rect(0, 0, 0, 0);
15
+ white-space: nowrap;
16
+ border: 0;
17
+ }
18
+
19
+ /* Screen reader only but focusable (for skip links) */
20
+ .sr-only-focusable:active,
21
+ .sr-only-focusable:focus {
22
+ position: static;
23
+ width: auto;
24
+ height: auto;
25
+ padding: inherit;
26
+ margin: inherit;
27
+ overflow: visible;
28
+ clip: auto;
29
+ white-space: normal;
30
+ }
31
+
32
+ /* Focus indicators for keyboard navigation */
33
+ .visualify-chart:focus,
34
+ .visualify-chart:focus-visible {
35
+ outline: 3px solid #4A90E2;
36
+ outline-offset: 2px;
37
+ }
38
+
39
+ /* Remove focus outline for mouse users */
40
+ .visualify-chart:focus:not(:focus-visible) {
41
+ outline: none;
42
+ }
43
+
44
+ /* High contrast mode support */
45
+ @media (prefers-contrast: high) {
46
+ .visualify-chart {
47
+ border: 2px solid currentColor;
48
+ }
49
+
50
+ .visualify-chart:focus,
51
+ .visualify-chart:focus-visible {
52
+ outline: 4px solid currentColor;
53
+ outline-offset: 2px;
54
+ }
55
+ }
56
+
57
+ /* Reduced motion support */
58
+ @media (prefers-reduced-motion: reduce) {
59
+ .visualify-chart,
60
+ .visualify-chart * {
61
+ animation-duration: 0.01ms !important;
62
+ animation-iteration-count: 1 !important;
63
+ transition-duration: 0.01ms !important;
64
+ }
65
+ }
66
+
67
+ /* Skip link styles */
68
+ .visualify-skip-link {
69
+ position: absolute;
70
+ top: -40px;
71
+ left: 0;
72
+ background: #000;
73
+ color: #fff;
74
+ padding: 8px 16px;
75
+ z-index: 9999;
76
+ text-decoration: none;
77
+ transition: top 0.2s;
78
+ }
79
+
80
+ .visualify-skip-link:focus {
81
+ top: 0;
82
+ }
83
+
84
+ /* Controller container */
85
+ .visualify-controller {
86
+ position: relative;
87
+ }
88
+
89
+ .visualify-components-container {
90
+ position: relative;
91
+ }
92
+
93
+ /* Widget region styles */
94
+ .visualify-controller [role="region"] {
95
+ position: relative;
96
+ }
97
+
98
+ /* Error alert styles */
99
+ .visualify-controller [role="alert"] {
100
+ padding: 1rem;
101
+ border: 2px solid #dc3545;
102
+ border-radius: 4px;
103
+ background-color: #f8d7da;
104
+ color: #721c24;
105
+ }
106
+
107
+ /* Data table styles for screen readers */
108
+ .visualify-chart table.sr-only {
109
+ /* Already covered by .sr-only, but ensuring tables are properly hidden */
110
+ display: block;
111
+ }
112
+
113
+ /* Live region for announcements */
114
+ .visualify-live-region {
115
+ position: absolute;
116
+ left: -10000px;
117
+ width: 1px;
118
+ height: 1px;
119
+ overflow: hidden;
120
+ }
121
+
122
+ /* Focus visible polyfill support */
123
+ .js-focus-visible :focus:not(.focus-visible) {
124
+ outline: none;
125
+ }
126
+
127
+ .js-focus-visible .focus-visible {
128
+ outline: 3px solid #4A90E2;
129
+ outline-offset: 2px;
130
+ }
131
+
132
+ /* Print styles - ensure charts are accessible when printed */
133
+ @media print {
134
+ .visualify-chart {
135
+ break-inside: avoid;
136
+ }
137
+
138
+ /* Show screen reader content when printing */
139
+ .visualify-chart .sr-only {
140
+ position: static;
141
+ width: auto;
142
+ height: auto;
143
+ padding: inherit;
144
+ margin: inherit;
145
+ overflow: visible;
146
+ clip: auto;
147
+ white-space: normal;
148
+ }
149
+ }
150
+
151
+ /* Touch device optimizations */
152
+ @media (hover: none) and (pointer: coarse) {
153
+ .visualify-chart {
154
+ /* Larger touch targets on mobile */
155
+ min-height: 44px;
156
+ }
157
+ }
158
+
159
+ /* Dark mode support */
160
+ @media (prefers-color-scheme: dark) {
161
+ .visualify-chart:focus,
162
+ .visualify-chart:focus-visible {
163
+ outline-color: #6BB5FF;
164
+ }
165
+ }
@@ -0,0 +1,214 @@
1
+ /**
2
+ * @fileoverview Development server command for Visualify CLI
3
+ * @module cli/commands/dev
4
+ */
5
+
6
+ const { Command } = require('commander');
7
+ const logger = require('../utils/logger');
8
+ const { detectMode, loadConfig } = require('../utils/config');
9
+ const { createDevServer } = require('../dev-server');
10
+
11
+ /**
12
+ * Valid development modes
13
+ * @readonly
14
+ * @type {string[]}
15
+ */
16
+ const VALID_MODES = ['auto', 'docs', 'portal'];
17
+
18
+ /**
19
+ * Default mode when not specified
20
+ * @readonly
21
+ * @type {string}
22
+ */
23
+ const DEFAULT_MODE = 'auto';
24
+
25
+ /**
26
+ * Active dev server instance for cleanup
27
+ * @type {DevServer|null}
28
+ */
29
+ let activeServer = null;
30
+
31
+ /**
32
+ * Setup cleanup handlers for graceful shutdown
33
+ * @param {DevServer} server - The dev server instance
34
+ */
35
+ function setupCleanupHandlers(server) {
36
+ const cleanup = async (signal) => {
37
+ logger.newline();
38
+ logger.info(`Received ${signal}, shutting down...`);
39
+
40
+ if (server) {
41
+ await server.stop();
42
+ }
43
+
44
+ process.exit(0);
45
+ };
46
+
47
+ // Handle various termination signals
48
+ process.on('SIGINT', () => cleanup('SIGINT'));
49
+ process.on('SIGTERM', () => cleanup('SIGTERM'));
50
+
51
+ // Handle uncaught errors
52
+ process.on('uncaughtException', async (err) => {
53
+ logger.error('Uncaught exception:', err.message);
54
+ if (server) {
55
+ await server.stop();
56
+ }
57
+ process.exit(1);
58
+ });
59
+
60
+ process.on('unhandledRejection', async (reason) => {
61
+ logger.error('Unhandled rejection:', reason);
62
+ if (server) {
63
+ await server.stop();
64
+ }
65
+ process.exit(1);
66
+ });
67
+ }
68
+
69
+ /**
70
+ * Execute the dev command
71
+ * @param {string} mode - The development mode
72
+ * @param {Object} options - Command options
73
+ * @param {boolean} options.verbose - Enable verbose logging
74
+ * @param {boolean} options.hmr - Enable HMR (default: true)
75
+ * @param {number} options.port - Port to run the server on
76
+ * @param {string} options.host - Host to bind the server to
77
+ * @returns {Promise<void>}
78
+ */
79
+ async function executeDev(mode, options) {
80
+ try {
81
+ if (options.verbose) {
82
+ logger.enableVerbose();
83
+ }
84
+
85
+ logger.debug('Starting dev command with mode:', mode);
86
+ logger.debug('Options:', options);
87
+
88
+ // Validate mode
89
+ if (!VALID_MODES.includes(mode)) {
90
+ logger.error(`Invalid mode: "${mode}"`);
91
+ logger.tip(`Valid modes are: ${VALID_MODES.join(', ')}`);
92
+ process.exit(1);
93
+ }
94
+
95
+ // Determine actual mode to use
96
+ let actualMode = mode;
97
+ if (mode === 'auto') {
98
+ logger.info('Auto-detecting mode...');
99
+ actualMode = await detectMode();
100
+ logger.info(`Detected mode: ${actualMode}`);
101
+ }
102
+
103
+ // Load configuration
104
+ const config = await loadConfig();
105
+ logger.debug('Loaded config:', config);
106
+
107
+ // Execute the appropriate mode
108
+ switch (actualMode) {
109
+ case 'docs':
110
+ activeServer = await startDocsMode(config, options);
111
+ break;
112
+ case 'portal':
113
+ activeServer = await startPortalMode(config, options);
114
+ break;
115
+ default:
116
+ logger.error(`Unknown mode: "${actualMode}"`);
117
+ process.exit(1);
118
+ }
119
+
120
+ // Setup cleanup handlers
121
+ if (activeServer) {
122
+ setupCleanupHandlers(activeServer);
123
+ }
124
+ } catch (err) {
125
+ logger.error('Failed to start development server:', err.message);
126
+ logger.debug('Stack trace:', err.stack);
127
+
128
+ // Cleanup on error
129
+ if (activeServer) {
130
+ await activeServer.stop();
131
+ }
132
+
133
+ process.exit(1);
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Start documentation development mode
139
+ * @param {Object} config - Visualify configuration
140
+ * @param {Object} options - Command options
141
+ * @returns {Promise<DevServer>} The dev server instance
142
+ */
143
+ async function startDocsMode(config, options) {
144
+ logger.header('Documentation Mode');
145
+ logger.info('Starting documentation development server with HMR...');
146
+
147
+ const server = await createDevServer({
148
+ port: options.port || config.port || 3000,
149
+ host: options.host || config.host || 'localhost',
150
+ hmr: options.hmr !== false,
151
+ mode: 'docs',
152
+ rootDir: process.cwd(),
153
+ staticDirs: ['docs', 'public', 'dist'],
154
+ });
155
+
156
+ logger.success('Documentation dev server started');
157
+ logger.tip('Edit your markdown files to see changes instantly');
158
+
159
+ return server;
160
+ }
161
+
162
+ /**
163
+ * Start portal development mode
164
+ * @param {Object} config - Visualify configuration
165
+ * @param {Object} options - Command options
166
+ * @returns {Promise<DevServer>} The dev server instance
167
+ */
168
+ async function startPortalMode(config, options) {
169
+ logger.header('Portal Mode');
170
+ logger.info('Starting portal development server with HMR...');
171
+
172
+ const server = await createDevServer({
173
+ port: options.port || config.port || 3000,
174
+ host: options.host || config.host || 'localhost',
175
+ hmr: options.hmr !== false,
176
+ mode: 'portal',
177
+ rootDir: process.cwd(),
178
+ staticDirs: ['public', 'dist', 'build'],
179
+ });
180
+
181
+ logger.success('Portal dev server started');
182
+ logger.tip('Edit visualify.json or component files to see changes instantly');
183
+
184
+ return server;
185
+ }
186
+
187
+ /**
188
+ * Create and configure the dev command
189
+ * @returns {Command} The configured command
190
+ */
191
+ function createDevCommand() {
192
+ const command = new Command('dev')
193
+ .description('Start the development server')
194
+ .argument(
195
+ '[mode]',
196
+ `Development mode: ${VALID_MODES.join(', ')}`,
197
+ DEFAULT_MODE
198
+ )
199
+ .option('-v, --verbose', 'Enable verbose logging')
200
+ .option('-p, --port <number>', 'Port to run the server on')
201
+ .option('-h, --host <host>', 'Host to bind the server to')
202
+ .option('--hmr', 'Enable Hot Module Replacement (default: true)', true)
203
+ .option('--no-hmr', 'Disable Hot Module Replacement')
204
+ .action(executeDev);
205
+
206
+ return command;
207
+ }
208
+
209
+ module.exports = {
210
+ createDevCommand,
211
+ executeDev,
212
+ VALID_MODES,
213
+ DEFAULT_MODE,
214
+ };