fiberpath 0.6.1__tar.gz → 0.6.2__tar.gz

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 (321) hide show
  1. {fiberpath-0.6.1 → fiberpath-0.6.2}/CHANGELOG.md +19 -0
  2. {fiberpath-0.6.1 → fiberpath-0.6.2}/PKG-INFO +2 -2
  3. {fiberpath-0.6.1 → fiberpath-0.6.2}/README.md +1 -1
  4. {fiberpath-0.6.1 → fiberpath-0.6.2}/TODO.md +1 -1
  5. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/dependency-policy.md +1 -1
  6. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/packaging.md +1 -1
  7. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/index.md +8 -8
  8. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/troubleshooting.md +3 -3
  9. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/state-management.md +1 -1
  10. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/testing.md +2 -2
  11. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/package-lock.json +2 -2
  12. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/package.json +1 -1
  13. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/App.tsx +5 -52
  14. fiberpath-0.6.2/fiberpath_gui/src/components/MenuBar.tsx +230 -0
  15. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StatusBar.tsx +1 -1
  16. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ConnectionSection.tsx +5 -128
  17. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/FileStreamingSection.css +13 -4
  18. fiberpath-0.6.2/fiberpath_gui/src/components/StreamTab/FileStreamingSection.tsx +165 -0
  19. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ManualControlSection.tsx +10 -74
  20. fiberpath-0.6.2/fiberpath_gui/src/components/canvas/VisualizationCanvas.tsx +211 -0
  21. fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/AboutDialog.tsx +81 -0
  22. fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/BaseDialog.tsx +52 -0
  23. fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/CliUnavailableDialog.tsx +227 -0
  24. fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/DiagnosticsDialog.tsx +162 -0
  25. fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/ExportConfirmationDialog.tsx +154 -0
  26. fiberpath-0.6.2/fiberpath_gui/src/components/editors/HelicalLayerEditor.tsx +164 -0
  27. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/editors/HoopLayerEditor.tsx +1 -1
  28. fiberpath-0.6.2/fiberpath_gui/src/components/editors/LayerNumericField.tsx +61 -0
  29. fiberpath-0.6.2/fiberpath_gui/src/components/editors/SkipLayerEditor.tsx +66 -0
  30. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/forms/MachineSettingsForm.tsx +25 -22
  31. fiberpath-0.6.2/fiberpath_gui/src/components/forms/MandrelForm.tsx +79 -0
  32. fiberpath-0.6.2/fiberpath_gui/src/components/forms/TowForm.tsx +77 -0
  33. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/layers/LayerRow.tsx +1 -1
  34. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/layers/LayerStack.tsx +1 -1
  35. fiberpath-0.6.2/fiberpath_gui/src/hooks/canvas/usePreviewGeneration.ts +111 -0
  36. fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useConnectionActions.ts +87 -0
  37. fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useManualCommandActions.ts +68 -0
  38. fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useStreamingActions.ts +170 -0
  39. fiberpath-0.6.2/fiberpath_gui/src/hooks/useFileOperations.ts +65 -0
  40. fiberpath-0.6.2/fiberpath_gui/src/hooks/useMenubarInteractions.ts +64 -0
  41. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useStreamEvents.ts +23 -41
  42. fiberpath-0.6.2/fiberpath_gui/src/lib/helicalValidation.ts +61 -0
  43. fiberpath-0.6.2/fiberpath_gui/src/lib/menuConfig.ts +187 -0
  44. fiberpath-0.6.2/fiberpath_gui/src/lib/numericFields.ts +18 -0
  45. fiberpath-0.6.2/fiberpath_gui/src/lib/streamFeedback.ts +285 -0
  46. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/stores/streamStore.ts +26 -0
  47. fiberpath-0.6.2/fiberpath_gui/src/tests/integration/streamLifecycle.test.ts +248 -0
  48. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/tests/integration/workflows.test.ts +1 -1
  49. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/Cargo.lock +1 -1
  50. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/Cargo.toml +1 -1
  51. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/tauri.conf.json +1 -1
  52. fiberpath-0.6.2/planning/gui-framework-migration-evaluation-plan.md +247 -0
  53. fiberpath-0.6.2/planning/roadmap-v0.6.2-react-hotspot-cleanup.md +253 -0
  54. {fiberpath-0.6.1 → fiberpath-0.6.2}/pyproject.toml +1 -1
  55. {fiberpath-0.6.1 → fiberpath-0.6.2}/uv.lock +1 -1
  56. fiberpath-0.6.1/fiberpath_gui/src/components/MenuBar.tsx +0 -362
  57. fiberpath-0.6.1/fiberpath_gui/src/components/StreamTab/FileStreamingSection.tsx +0 -395
  58. fiberpath-0.6.1/fiberpath_gui/src/components/canvas/VisualizationCanvas.tsx +0 -234
  59. fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/AboutDialog.tsx +0 -129
  60. fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/CliUnavailableDialog.tsx +0 -233
  61. fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/DiagnosticsDialog.tsx +0 -230
  62. fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/ExportConfirmationDialog.tsx +0 -215
  63. fiberpath-0.6.1/fiberpath_gui/src/components/editors/HelicalLayerEditor.tsx +0 -342
  64. fiberpath-0.6.1/fiberpath_gui/src/components/editors/SkipLayerEditor.tsx +0 -97
  65. fiberpath-0.6.1/fiberpath_gui/src/components/forms/MandrelForm.tsx +0 -111
  66. fiberpath-0.6.1/fiberpath_gui/src/components/forms/TowForm.tsx +0 -110
  67. fiberpath-0.6.1/fiberpath_gui/src/components/tabs/StreamTab.tsx +0 -6
  68. fiberpath-0.6.1/planning/gui-framework-migration-evaluation-plan.md +0 -159
  69. {fiberpath-0.6.1 → fiberpath-0.6.2}/.gitattributes +0 -0
  70. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-node/action.yml +0 -0
  71. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-python/action.yml +0 -0
  72. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-rust/action.yml +0 -0
  73. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/dependabot.yml +0 -0
  74. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/backend-ci.yml +0 -0
  75. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/ci-check.yml +0 -0
  76. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/dependency-audit.yml +0 -0
  77. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/docs-ci.yml +0 -0
  78. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/docs-deploy.yml +0 -0
  79. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-ci.yml +0 -0
  80. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-e2e-smoke.yml +0 -0
  81. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-packaging.yml +0 -0
  82. {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/release.yml +0 -0
  83. {fiberpath-0.6.1 → fiberpath-0.6.2}/.gitignore +0 -0
  84. {fiberpath-0.6.1 → fiberpath-0.6.2}/.vscode/extensions.json +0 -0
  85. {fiberpath-0.6.1 → fiberpath-0.6.2}/.vscode/settings.json +0 -0
  86. {fiberpath-0.6.1 → fiberpath-0.6.2}/LICENSE +0 -0
  87. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/architecture/axis-system.md +0 -0
  88. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/architecture/overview.md +0 -0
  89. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/ci-cd.md +0 -0
  90. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/contributing.md +0 -0
  91. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/release-process.md +0 -0
  92. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/tooling.md +0 -0
  93. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/getting-started.md +0 -0
  94. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/axis-mapping.md +0 -0
  95. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/marlin-streaming.md +0 -0
  96. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/visualization.md +0 -0
  97. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/wind-format.md +0 -0
  98. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/api.md +0 -0
  99. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/concepts.md +0 -0
  100. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/planner-math.md +0 -0
  101. {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/vm-testing.md +0 -0
  102. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/README.md +0 -0
  103. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/complex_surface/README.md +0 -0
  104. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/multi_layer/README.md +0 -0
  105. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/multi_layer/input.wind +0 -0
  106. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)single.wind +0 -0
  107. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)triple.gcode +0 -0
  108. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)triple.wind +0 -0
  109. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/CarbonMotorTube(1295mm).gcode +0 -0
  110. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/CarbonMotorTube(1295mm).wind +0 -0
  111. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/MainChute(585mm).gcode +0 -0
  112. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/MainChute(585mm).wind +0 -0
  113. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/simple_cylinder/README.md +0 -0
  114. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/simple_cylinder/input.wind +0 -0
  115. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/sized_simple_cylinder/README.md +0 -0
  116. {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/sized_simple_cylinder/input.wind +0 -0
  117. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/__init__.py +0 -0
  118. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/__init__.py +0 -0
  119. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/schemas.py +0 -0
  120. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/validator.py +0 -0
  121. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/execution/__init__.py +0 -0
  122. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/execution/marlin.py +0 -0
  123. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/__init__.py +0 -0
  124. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/dialects.py +0 -0
  125. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/generator.py +0 -0
  126. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/__init__.py +0 -0
  127. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/curves.py +0 -0
  128. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/intersections.py +0 -0
  129. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/surfaces.py +0 -0
  130. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/math_utils.py +0 -0
  131. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/__init__.py +0 -0
  132. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/calculations.py +0 -0
  133. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/exceptions.py +0 -0
  134. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/helpers.py +0 -0
  135. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/layer_strategies.py +0 -0
  136. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/machine.py +0 -0
  137. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/planner.py +0 -0
  138. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/validators.py +0 -0
  139. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/simulation/__init__.py +0 -0
  140. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/simulation/simulator.py +0 -0
  141. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/__init__.py +0 -0
  142. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/export_json.py +0 -0
  143. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/plotter.py +0 -0
  144. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/__init__.py +0 -0
  145. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/main.py +0 -0
  146. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/package-lock.json +0 -0
  147. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/path_policy.py +0 -0
  148. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/__init__.py +0 -0
  149. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/plan.py +0 -0
  150. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/simulate.py +0 -0
  151. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/stream.py +0 -0
  152. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/validate.py +0 -0
  153. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/schemas.py +0 -0
  154. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/__init__.py +0 -0
  155. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/__main__.py +0 -0
  156. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/interactive.py +0 -0
  157. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/main.py +0 -0
  158. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/output.py +0 -0
  159. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/plan.py +0 -0
  160. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/plot.py +0 -0
  161. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/simulate.py +0 -0
  162. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/stream.py +0 -0
  163. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/validate.py +0 -0
  164. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.gitignore +0 -0
  165. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.nvmrc +0 -0
  166. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.stylelintrc.json +0 -0
  167. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/README.md +0 -0
  168. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/bundled-cli/.gitkeep +0 -0
  169. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/cli-integration.md +0 -0
  170. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/streaming-state.md +0 -0
  171. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/tech-stack.md +0 -0
  172. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/development.md +0 -0
  173. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/performance.md +0 -0
  174. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/schemas.md +0 -0
  175. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/styling.md +0 -0
  176. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/overview.md +0 -0
  177. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/reference/type-safety.md +0 -0
  178. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/generate-types.json +0 -0
  179. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/index.html +0 -0
  180. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/schemas/wind-schema.json +0 -0
  181. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/scripts/check-css-vars.mjs +0 -0
  182. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/CliHealthWarning.tsx +0 -0
  183. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ErrorBoundary.tsx +0 -0
  184. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ErrorNotificationToast.tsx +0 -0
  185. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/FileField.tsx +0 -0
  186. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ResultCard.tsx +0 -0
  187. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StatusText.tsx +0 -0
  188. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ConnectionSection.css +0 -0
  189. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/KeyboardShortcuts.css +0 -0
  190. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/KeyboardShortcuts.tsx +0 -0
  191. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ManualControlSection.css +0 -0
  192. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamControls.css +0 -0
  193. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamControls.tsx +0 -0
  194. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamLog.css +0 -0
  195. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamLog.tsx +0 -0
  196. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamTab.css +0 -0
  197. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamTab.tsx +0 -0
  198. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/index.ts +0 -0
  199. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/TabBar.tsx +0 -0
  200. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/Toast/ToastContainer.css +0 -0
  201. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/Toast/ToastContainer.tsx +0 -0
  202. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/CanvasControls.tsx +0 -0
  203. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/CenterCanvas.tsx +0 -0
  204. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/LayerScrubber.tsx +0 -0
  205. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/BottomPanel.tsx +0 -0
  206. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/LeftPanel.tsx +0 -0
  207. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/RightPanel.tsx +0 -0
  208. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/tabs/MainTab.tsx +0 -0
  209. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/contexts/CliHealthContext.tsx +0 -0
  210. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/contexts/ErrorNotificationContext.tsx +0 -0
  211. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useCliHealth.ts +0 -0
  212. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useKeyboardShortcuts.ts +0 -0
  213. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useTheme.test.ts +0 -0
  214. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useTheme.ts +0 -0
  215. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/layouts/MainLayout.tsx +0 -0
  216. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/commands.ts +0 -0
  217. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/constants.ts +0 -0
  218. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/fileOperations.ts +0 -0
  219. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/marlin-api.ts +0 -0
  220. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/recentFiles.ts +0 -0
  221. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/retry.ts +0 -0
  222. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/schemas.test.ts +0 -0
  223. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/schemas.ts +0 -0
  224. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/tauri-types.ts +0 -0
  225. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/toastMessages.ts +0 -0
  226. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/validation.test.ts +0 -0
  227. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/validation.ts +0 -0
  228. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/main.tsx +0 -0
  229. {fiberpath-0.6.1/fiberpath_gui/src/state → fiberpath-0.6.2/fiberpath_gui/src/stores}/projectStore.test.ts +0 -0
  230. {fiberpath-0.6.1/fiberpath_gui/src/state → fiberpath-0.6.2/fiberpath_gui/src/stores}/projectStore.ts +0 -0
  231. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/stores/toastStore.ts +0 -0
  232. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/buttons.css +0 -0
  233. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/canvas.css +0 -0
  234. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/dialogs.css +0 -0
  235. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/forms.css +0 -0
  236. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/index.css +0 -0
  237. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/layout.css +0 -0
  238. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/notifications.css +0 -0
  239. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/panels.css +0 -0
  240. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/reset.css +0 -0
  241. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/tabs.css +0 -0
  242. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/tokens.css +0 -0
  243. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/typography.css +0 -0
  244. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/tests/setup.ts +0 -0
  245. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/components.ts +0 -0
  246. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/converters.test.ts +0 -0
  247. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/converters.ts +0 -0
  248. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/project.ts +0 -0
  249. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/wind-schema.ts +0 -0
  250. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/build.rs +0 -0
  251. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/capabilities/default.json +0 -0
  252. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/128x128.png +0 -0
  253. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/256x256.png +0 -0
  254. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/32x32.png +0 -0
  255. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/512x512.png +0 -0
  256. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/icon.ico +0 -0
  257. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/cli_path.rs +0 -0
  258. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/cli_process.rs +0 -0
  259. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/main.rs +0 -0
  260. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/marlin.rs +0 -0
  261. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/tsconfig.json +0 -0
  262. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/tsconfig.node.json +0 -0
  263. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/vite.config.ts +0 -0
  264. {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/vitest.config.ts +0 -0
  265. {fiberpath-0.6.1 → fiberpath-0.6.2}/mkdocs.yml +0 -0
  266. {fiberpath-0.6.1 → fiberpath-0.6.2}/package-lock.json +0 -0
  267. {fiberpath-0.6.1 → fiberpath-0.6.2}/planning/roadmap-backlog.md +0 -0
  268. {fiberpath-0.6.1 → fiberpath-0.6.2}/planning/roadmap-v7.md +0 -0
  269. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-check-artifacts.ps1 +0 -0
  270. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-check-artifacts.sh +0 -0
  271. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-cli-smoke.ps1 +0 -0
  272. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-cli-smoke.sh +0 -0
  273. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/extract-package-runtime.ps1 +0 -0
  274. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/extract-package-runtime.sh +0 -0
  275. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/find-bundled-cli.ps1 +0 -0
  276. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/find-bundled-cli.sh +0 -0
  277. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/export_schema.py +0 -0
  278. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/freeze_cli.py +0 -0
  279. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/generate_schema.py +0 -0
  280. {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/sync_gui_docs.py +0 -0
  281. {fiberpath-0.6.1 → fiberpath-0.6.2}/setup.cfg +0 -0
  282. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_plan_route.py +0 -0
  283. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_simulate_route.py +0 -0
  284. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_stream_route.py +0 -0
  285. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_stream_route_errors.py +0 -0
  286. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_axis_format.py +0 -0
  287. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_cli_json.py +0 -0
  288. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_cli_smoke.py +0 -0
  289. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_stream_command.py +0 -0
  290. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/config/__init__.py +0 -0
  291. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/config/test_validator.py +0 -0
  292. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/helical-balanced.wind +0 -0
  293. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/simple-hoop.wind +0 -0
  294. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/skip-bias.wind +0 -0
  295. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/helical-balanced/output.gcode +0 -0
  296. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/helical-balanced/preview.png +0 -0
  297. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/simple-hoop/output.gcode +0 -0
  298. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/simple-hoop/preview.png +0 -0
  299. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/skip-bias/output.gcode +0 -0
  300. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/skip-bias/preview.png +0 -0
  301. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/execution/test_marlin_streamer.py +0 -0
  302. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/gcode/test_dialects.py +0 -0
  303. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/gcode/test_generator.py +0 -0
  304. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/geometry/test_surfaces.py +0 -0
  305. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/_generate_fixtures.py +0 -0
  306. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/helical_layer.gcode +0 -0
  307. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/hoop_layer.gcode +0 -0
  308. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/hoop_only_program.gcode +0 -0
  309. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/skip_layer.gcode +0 -0
  310. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_axis_mapping.py +0 -0
  311. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_helpers_machine.py +0 -0
  312. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_layer_strategies.py +0 -0
  313. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_planner_smoke.py +0 -0
  314. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_validators.py +0 -0
  315. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/simulation/test_simulator.py +0 -0
  316. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/simulation/test_simulator_axis_detection.py +0 -0
  317. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/tauri/test_marlin_integration.py +0 -0
  318. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/tauri/test_port_discovery.py +0 -0
  319. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/visualization/test_export_json.py +0 -0
  320. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/visualization/test_plotter.py +0 -0
  321. {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/visualization/test_plotter_axis_detection.py +0 -0
@@ -18,6 +18,25 @@ The format is based on Keep a Changelog, and this project follows semantic versi
18
18
  - Documented required docs correction scope for `lockDegrees`, `patternNumber`, and coverage-vs-ply-count semantics, including clarification that feed-rate clamping in planner math is planned, not currently implemented.
19
19
  - Documented required example updates for compatibility: `examples/rocketry/AvBay(470mm).wind` layer 1 and `examples/rocketry/MainChute(585mm).wind` layer 1 should use `lockDegrees=540` instead of `270`.
20
20
 
21
+ ## [0.6.2] - 2026-04-07
22
+
23
+ ### Added
24
+
25
+ - Added stream-domain action hooks (`useConnectionActions`, `useStreamingActions`, `useManualCommandActions`) and consolidated stream feedback helpers for consistent toast/log behavior.
26
+ - Added focused integration coverage for stream lifecycle transitions in `streamLifecycle.test.ts`.
27
+ - Added shared React UI primitives/utilities including `LayerNumericField`, `numericFields`, `helicalValidation`, `usePreviewGeneration`, and `BaseDialog`.
28
+
29
+ ### Changed
30
+
31
+ - Completed the v0.6.2 React hotspot cleanup roadmap (Waves A-D), including StreamTab domain decomposition, menu/file orchestration cleanup, and canvas/editor component simplification.
32
+ - Standardized store boundaries by moving `projectStore` into `src/stores` and removing StreamTab wrapper path indirection.
33
+ - Updated release-facing docs to reflect v0.6.2 as the current release.
34
+
35
+ ### Fixed
36
+
37
+ - Removed remaining imperative `alert(...)` UI fallback paths in favor of app-level notifications.
38
+ - Eliminated final inline-style residue in streaming UI components to keep styling maintainable and class-driven.
39
+
21
40
  ## [0.6.1] - 2026-04-07
22
41
 
23
42
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fiberpath
3
- Version: 0.6.1
3
+ Version: 0.6.2
4
4
  Summary: Modern filament winding planner, simulator, and G-code toolkit.
5
5
  Author: Cameron K. Brooks
6
6
  License: GNU AFFERO GENERAL PUBLIC LICENSE
@@ -708,7 +708,7 @@ Description-Content-Type: text/markdown
708
708
 
709
709
  **Plan, simulate, and manufacture composite parts with precision fiber winding.**
710
710
 
711
- [![Version](https://img.shields.io/badge/version-0.6.1-4c7284)](https://github.com/CameronBrooks11/fiberpath/releases)
711
+ [![Version](https://img.shields.io/badge/version-0.6.2-4c7284)](https://github.com/CameronBrooks11/fiberpath/releases)
712
712
  [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-00695C.svg)](LICENSE)
713
713
  [![Backend CI](https://img.shields.io/github/actions/workflow/status/CameronBrooks11/fiberpath/backend-ci.yml?branch=main&label=Backend%20CI&logo=python&logoColor=white)](https://github.com/CameronBrooks11/fiberpath/actions/workflows/backend-ci.yml)
714
714
  [![GUI CI](https://img.shields.io/github/actions/workflow/status/CameronBrooks11/fiberpath/gui-ci.yml?branch=main&label=GUI%20CI&logo=react&logoColor=white)](https://github.com/CameronBrooks11/fiberpath/actions/workflows/gui-ci.yml)
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Plan, simulate, and manufacture composite parts with precision fiber winding.**
6
6
 
7
- [![Version](https://img.shields.io/badge/version-0.6.1-4c7284)](https://github.com/CameronBrooks11/fiberpath/releases)
7
+ [![Version](https://img.shields.io/badge/version-0.6.2-4c7284)](https://github.com/CameronBrooks11/fiberpath/releases)
8
8
  [![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-00695C.svg)](LICENSE)
9
9
  [![Backend CI](https://img.shields.io/github/actions/workflow/status/CameronBrooks11/fiberpath/backend-ci.yml?branch=main&label=Backend%20CI&logo=python&logoColor=white)](https://github.com/CameronBrooks11/fiberpath/actions/workflows/backend-ci.yml)
10
10
  [![GUI CI](https://img.shields.io/github/actions/workflow/status/CameronBrooks11/fiberpath/gui-ci.yml?branch=main&label=GUI%20CI&logo=react&logoColor=white)](https://github.com/CameronBrooks11/fiberpath/actions/workflows/gui-ci.yml)
@@ -20,6 +20,6 @@ Tasks for Cam todo:
20
20
 
21
21
  - [ ] Fix zooming behavior in the plot viewer so it expands the entire image not within the image bounds since this becomes an issue for larger (exceeds bounds) or smaller (impossible to look at properly) images
22
22
 
23
- - [ ] Track Dependabot moderate alert #3 (GHSA-wrw7-89jp-8q8g / glib). Current Tauri GTK stack pins `glib` 0.18.x (`^0.18` via `gtk`), so patched `glib` 0.20.0 cannot be adopted yet. Do not cut v0.6.1 solely for this; re-check after upstream Tauri/GTK dependency line moves to non-vulnerable glib.
23
+ - [ ] Track Dependabot moderate alert #3 (GHSA-wrw7-89jp-8q8g / glib). Current Tauri GTK stack pins `glib` 0.18.x (`^0.18` via `gtk`), so patched `glib` 0.20.0 cannot be adopted yet. Do not cut v0.6.2 solely for this; re-check after upstream Tauri/GTK dependency line moves to non-vulnerable glib.
24
24
 
25
25
  - [ ] Manual cross-platform validation (waived for v0.6.0, required before v1.0 or first public release): Linux `.deb`/`.AppImage` (Ubuntu 22.04, Debian 12, Fedora 39) and macOS `.dmg` (Intel + Apple Silicon) install, bundled CLI discovery, full workflow (validate → plan → simulate → visualize), serial port, file ops, upgrade, and uninstall. See `planning/roadmap-v6.md` Phases 1 & 2 for the full checklist.
@@ -17,7 +17,7 @@ Applies to:
17
17
 
18
18
  - Patch updates: monthly
19
19
  - Minor updates: quarterly review window
20
- - Major updates: dedicated release slot (for example, a migration-focused release like v0.6.1 or similar)
20
+ - Major updates: dedicated release slot (for example, a migration-focused release like v0.6.2 or similar)
21
21
 
22
22
  ## Ownership
23
23
 
@@ -154,7 +154,7 @@ GitHub Actions workflow (`.github/workflows/gui-packaging.yml`) handles full pro
154
154
  ## Future Enhancements
155
155
 
156
156
  - **Code signing:** macOS (`developer-id`) and Windows (`signtool` + certificate) when credentials available
157
- - **Auto-updates:** Tauri updater for in-app version checks and downloads (planned post-v0.6.1)
157
+ - **Auto-updates:** Tauri updater for in-app version checks and downloads (planned post-v0.6.2)
158
158
  - **Bundle optimization:** Reduce frozen CLI size through dependency analysis
159
159
  - **Universal macOS binaries:** Single `.dmg` supporting both Intel and Apple Silicon (currently separate builds)
160
160
 
@@ -36,7 +36,7 @@ hide:
36
36
 
37
37
  ---
38
38
 
39
- **Latest Release:** [v0.6.1](https://github.com/CameronBrooks11/fiberpath/releases/latest){ target=_blank }
39
+ **Latest Release:** [v0.6.2](https://github.com/CameronBrooks11/fiberpath/releases/latest){ target=_blank }
40
40
 
41
41
  - **Desktop GUI** – Windows, macOS, Linux installers (no Python required)
42
42
  - **Python Package** – `pip install fiberpath`
@@ -44,18 +44,18 @@ hide:
44
44
 
45
45
  [:octicons-arrow-right-24: Installation Guide](getting-started.md)
46
46
 
47
- - :material-new-box:{ .lg .middle } **What's New in v0.6.1**
47
+ - :material-new-box:{ .lg .middle } **What's New in v0.6.2**
48
48
 
49
49
  ---
50
50
 
51
- GUI styling simplification and release lock-in:
51
+ React hotspot cleanup and architectural hardening:
52
52
 
53
- - Consolidated styling around token-first primitives for cleaner, more maintainable UI CSS
54
- - Added stable light/dark theme architecture with system preference fallback and persisted user override
55
- - Removed dead GUI dependencies and aligned styling documentation to actual implementation
56
- - Added automated `useTheme` behavior tests and completed final GUI quality gates (`check:all` + `test`)
53
+ - Decomposed stream controls into dedicated action hooks with centralized toast/log policy
54
+ - Unified file/menu orchestration through `useFileOperations` and typed menu configuration
55
+ - Extracted shared editor/canvas/dialog primitives to reduce component responsibility density
56
+ - Removed remaining store/import drift and imperative UI fallback paths
57
57
 
58
- Builds on the v0.6.0 packaging and validation hardening baseline.
58
+ Builds on the v0.6.1 styling simplification baseline.
59
59
 
60
60
  [:octicons-arrow-right-24: Marlin Streaming Guide](guides/marlin-streaming.md)
61
61
 
@@ -51,7 +51,7 @@ sudo apt update
51
51
  sudo apt install -f # Fix broken dependencies
52
52
  sudo apt install libwebkit2gtk-4.1-0 libappindicator3-1
53
53
  # Then retry
54
- sudo dpkg -i fiberpath_0.6.1_amd64.deb
54
+ sudo dpkg -i fiberpath_0.6.2_amd64.deb
55
55
  ```
56
56
 
57
57
  ### AppImage Won't Run (Linux)
@@ -63,8 +63,8 @@ sudo dpkg -i fiberpath_0.6.1_amd64.deb
63
63
  **Solution:**
64
64
 
65
65
  ```sh
66
- chmod +x fiberpath_0.6.1_amd64.AppImage
67
- ./fiberpath_0.6.1_amd64.AppImage
66
+ chmod +x fiberpath_0.6.2_amd64.AppImage
67
+ ./fiberpath_0.6.2_amd64.AppImage
68
68
  ```
69
69
 
70
70
  **FUSE Requirement:** Some older Linux systems require FUSE for AppImage:
@@ -75,7 +75,7 @@ interface FiberPathProject {
75
75
 
76
76
  ## Store Creation
77
77
 
78
- ### Definition (`src/state/projectStore.ts`)
78
+ ### Definition (`src/stores/projectStore.ts`)
79
79
 
80
80
  ```typescript
81
81
  import { create } from "zustand";
@@ -61,7 +61,7 @@ src/
61
61
  ├── lib/
62
62
  │ ├── schemas.test.ts # 43 tests - Zod schema validation
63
63
  │ └── validation.test.ts # JSON schema validation (AJV)
64
- ├── state/
64
+ ├── stores/
65
65
  │ └── projectStore.test.ts # Zustand store actions
66
66
  ├── types/
67
67
  │ └── converters.test.ts # Type conversion utilities
@@ -272,7 +272,7 @@ it('should display error message on validation failure', () => {
272
272
 
273
273
  - Schema validation (`src/lib/schemas.ts`)
274
274
  - Error handling (`src/lib/validation.ts`)
275
- - State management (`src/state/projectStore.ts`)
275
+ - State management (`src/stores/projectStore.ts`)
276
276
 
277
277
  ### Lower Priority (50%+ acceptable)
278
278
 
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "fiberpath-gui",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "fiberpath-gui",
9
- "version": "0.6.1",
9
+ "version": "0.6.2",
10
10
  "dependencies": {
11
11
  "@hello-pangea/dnd": "^18.0.1",
12
12
  "@tauri-apps/api": "^2.10.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fiberpath-gui",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "engines": {
@@ -1,10 +1,10 @@
1
- import { FormEvent, useState, useEffect, useMemo } from "react";
1
+ import { useState, useEffect } from "react";
2
2
  import { useShallow } from "zustand/react/shallow";
3
3
 
4
4
  import { MainLayout } from "./layouts/MainLayout";
5
5
  import { TabBar, TabId } from "./components/TabBar";
6
6
  import { MainTab } from "./components/tabs/MainTab";
7
- import { StreamTab } from "./components/tabs/StreamTab";
7
+ import { StreamTab } from "./components/StreamTab/StreamTab";
8
8
  import { MenuBar } from "./components/MenuBar";
9
9
  import { StatusBar } from "./components/StatusBar";
10
10
  import { CliHealthWarning } from "./components/CliHealthWarning";
@@ -22,12 +22,9 @@ import { HoopLayerEditor } from "./components/editors/HoopLayerEditor";
22
22
  import { HelicalLayerEditor } from "./components/editors/HelicalLayerEditor";
23
23
  import { SkipLayerEditor } from "./components/editors/SkipLayerEditor";
24
24
  import { ExportConfirmationDialog } from "./components/dialogs/ExportConfirmationDialog";
25
- import { useProjectStore } from "./state/projectStore";
26
- import { useErrorNotification } from "./contexts/ErrorNotificationContext";
27
- import { useCliHealthContext } from "./contexts/CliHealthContext";
28
- import { createFileOperations } from "./lib/fileOperations";
25
+ import { useProjectStore } from "./stores/projectStore";
26
+ import { useFileOperations } from "./hooks/useFileOperations";
29
27
  import { useKeyboardShortcuts } from "./hooks/useKeyboardShortcuts";
30
- import { getRecentFiles } from "./lib/recentFiles";
31
28
 
32
29
  export default function App() {
33
30
  // Tab state
@@ -38,29 +35,14 @@ export default function App() {
38
35
  project,
39
36
  activeLayerId,
40
37
  layers,
41
- newProject,
42
- loadProject,
43
- setFilePath,
44
- clearDirty,
45
- duplicateLayer,
46
- removeLayer,
47
38
  } = useProjectStore(
48
39
  useShallow((state) => ({
49
40
  project: state.project,
50
41
  activeLayerId: state.project.activeLayerId,
51
42
  layers: state.project.layers,
52
- newProject: state.newProject,
53
- loadProject: state.loadProject,
54
- setFilePath: state.setFilePath,
55
- clearDirty: state.clearDirty,
56
- duplicateLayer: state.duplicateLayer,
57
- removeLayer: state.removeLayer,
58
43
  })),
59
44
  );
60
45
 
61
- // Error notifications
62
- const { showError, showInfo } = useErrorNotification();
63
-
64
46
  // Find active layer
65
47
  const activeLayer = activeLayerId
66
48
  ? layers.find((l) => l.id === activeLayerId)
@@ -71,36 +53,7 @@ export default function App() {
71
53
  const [rightPanelCollapsed, setRightPanelCollapsed] = useState(false);
72
54
  const [showExportDialog, setShowExportDialog] = useState(false);
73
55
 
74
- // Create file operations handlers (memoized to prevent recreation on every render)
75
- const fileOps = useMemo(
76
- () =>
77
- createFileOperations({
78
- getProject: () => useProjectStore.getState().project,
79
- newProject,
80
- loadProject,
81
- setFilePath,
82
- clearDirty,
83
- getActiveLayerId: () =>
84
- useProjectStore.getState().project.activeLayerId,
85
- duplicateLayer,
86
- removeLayer,
87
- showError,
88
- showInfo,
89
- updateRecentFiles: () => {
90
- getRecentFiles();
91
- },
92
- }),
93
- [
94
- newProject,
95
- loadProject,
96
- setFilePath,
97
- clearDirty,
98
- duplicateLayer,
99
- removeLayer,
100
- showError,
101
- showInfo,
102
- ],
103
- );
56
+ const fileOps = useFileOperations();
104
57
 
105
58
  // Wire up keyboard shortcuts
106
59
  useKeyboardShortcuts({
@@ -0,0 +1,230 @@
1
+ import { open as openExternal } from "@tauri-apps/plugin-shell";
2
+ import { Monitor, Moon, Sun } from "lucide-react";
3
+ import { useCallback, useState } from "react";
4
+ import { useShallow } from "zustand/react/shallow";
5
+ import { useProjectStore } from "../stores/projectStore";
6
+ import { useTheme } from "../hooks/useTheme";
7
+ import { useFileOperations } from "../hooks/useFileOperations";
8
+ import { useMenubarInteractions } from "../hooks/useMenubarInteractions";
9
+ import { MENU_DEFINITIONS, type MenuActionId } from "../lib/menuConfig";
10
+ import {
11
+ getRecentFiles,
12
+ formatRecentFileName,
13
+ formatRecentFilePath,
14
+ } from "../lib/recentFiles";
15
+ import { AboutDialog } from "./dialogs/AboutDialog";
16
+ import { DiagnosticsDialog } from "./dialogs/DiagnosticsDialog";
17
+ import { ExportConfirmationDialog } from "./dialogs/ExportConfirmationDialog";
18
+
19
+ interface MenuBarProps {
20
+ onToggleLeftPanel?: () => void;
21
+ onToggleRightPanel?: () => void;
22
+ }
23
+
24
+ type MenuActionHandler = () => unknown;
25
+
26
+ export function MenuBar({
27
+ onToggleLeftPanel,
28
+ onToggleRightPanel,
29
+ }: MenuBarProps) {
30
+ const { project, activeLayerId } = useProjectStore(
31
+ useShallow((state) => ({
32
+ project: state.project,
33
+ activeLayerId: state.project.activeLayerId,
34
+ })),
35
+ );
36
+
37
+ const [recentFiles, setRecentFiles] = useState(getRecentFiles());
38
+ const [showAboutDialog, setShowAboutDialog] = useState(false);
39
+ const [showDiagnosticsDialog, setShowDiagnosticsDialog] = useState(false);
40
+ const [showExportDialog, setShowExportDialog] = useState(false);
41
+
42
+ const refreshRecentFiles = useCallback(() => {
43
+ setRecentFiles(getRecentFiles());
44
+ }, []);
45
+
46
+ const fileOps = useFileOperations({
47
+ onRecentFilesChanged: refreshRecentFiles,
48
+ });
49
+
50
+ const { setMenuRef } = useMenubarInteractions();
51
+ const { theme, setTheme, isSystemTheme } = useTheme();
52
+
53
+ const cycleTheme = () => {
54
+ if (isSystemTheme) {
55
+ setTheme("dark");
56
+ return;
57
+ }
58
+
59
+ if (theme === "dark") {
60
+ setTheme("light");
61
+ return;
62
+ }
63
+
64
+ setTheme(null);
65
+ };
66
+
67
+ const themeState = isSystemTheme ? "system" : theme;
68
+ const themeLabel = isSystemTheme
69
+ ? "System"
70
+ : theme === "dark"
71
+ ? "Dark"
72
+ : "Light";
73
+
74
+ const actionHandlers: Partial<Record<MenuActionId, MenuActionHandler>> = {
75
+ "file.new": fileOps.handleNewProject,
76
+ "file.open": fileOps.handleOpen,
77
+ "file.save": fileOps.handleSave,
78
+ "file.saveAs": fileOps.handleSaveAs,
79
+ "file.export": () => setShowExportDialog(true),
80
+ "edit.duplicateLayer": fileOps.handleDuplicateLayer,
81
+ "edit.deleteLayer": fileOps.handleDeleteLayer,
82
+ "view.toggleLeftPanel": onToggleLeftPanel,
83
+ "view.toggleRightPanel": onToggleRightPanel,
84
+ "tools.validateDefinition": fileOps.handleValidate,
85
+ "help.documentation": () =>
86
+ openExternal("https://cameronbrooks11.github.io/fiberpath"),
87
+ "help.about": () => setShowAboutDialog(true),
88
+ "help.diagnostics": () => setShowDiagnosticsDialog(true),
89
+ };
90
+
91
+ const isActionDisabled = (
92
+ actionId: MenuActionId,
93
+ configDisabled: boolean | undefined,
94
+ ) => {
95
+ if (configDisabled) {
96
+ return true;
97
+ }
98
+
99
+ if (
100
+ (actionId === "edit.duplicateLayer" || actionId === "edit.deleteLayer") &&
101
+ !activeLayerId
102
+ ) {
103
+ return true;
104
+ }
105
+
106
+ if (actionId === "view.toggleLeftPanel" && !onToggleLeftPanel) {
107
+ return true;
108
+ }
109
+
110
+ if (actionId === "view.toggleRightPanel" && !onToggleRightPanel) {
111
+ return true;
112
+ }
113
+
114
+ return !actionHandlers[actionId];
115
+ };
116
+
117
+ const handleMenuAction = (actionId: MenuActionId) => {
118
+ const handler = actionHandlers[actionId];
119
+ if (handler) {
120
+ void handler();
121
+ }
122
+ };
123
+
124
+ return (
125
+ <nav className="menubar">
126
+ <div className="menubar__brand">
127
+ <span className="menubar__brand-icon">⬢</span>
128
+ <span className="menubar__brand-name">FiberPath</span>
129
+ </div>
130
+
131
+ <div className="menubar__menus">
132
+ {MENU_DEFINITIONS.map((menu, menuIndex) => (
133
+ <details
134
+ key={menu.id}
135
+ className="menubar__menu"
136
+ ref={setMenuRef(menuIndex)}
137
+ >
138
+ <summary>{menu.label}</summary>
139
+ <div className="menubar__dropdown">
140
+ {menu.entries.map((entry, entryIndex) => {
141
+ if (entry.type === "separator") {
142
+ return <hr key={`${menu.id}-separator-${entryIndex}`} />;
143
+ }
144
+
145
+ return (
146
+ <button
147
+ key={entry.actionId}
148
+ onClick={() => handleMenuAction(entry.actionId)}
149
+ disabled={isActionDisabled(entry.actionId, entry.disabled)}
150
+ >
151
+ {entry.label}
152
+ {entry.shortcut && (
153
+ <span className="menubar__shortcut">{entry.shortcut}</span>
154
+ )}
155
+ {entry.external && (
156
+ <span className="menubar__external">↗</span>
157
+ )}
158
+ </button>
159
+ );
160
+ })}
161
+
162
+ {menu.id === "file" && recentFiles.length > 0 && (
163
+ <>
164
+ <hr />
165
+ <div className="menubar__submenu-label">Recent Files</div>
166
+ {recentFiles.map((file) => (
167
+ <button
168
+ key={file.path}
169
+ onClick={() => fileOps.handleOpenRecent(file.path)}
170
+ className="menubar__recent-file"
171
+ title={file.path}
172
+ >
173
+ <span className="menubar__recent-name">
174
+ {formatRecentFileName(file.path)}
175
+ </span>
176
+ <span className="menubar__recent-path">
177
+ {formatRecentFilePath(file.path)}
178
+ </span>
179
+ </button>
180
+ ))}
181
+ </>
182
+ )}
183
+ </div>
184
+ </details>
185
+ ))}
186
+ </div>
187
+
188
+ <div className="menubar__spacer" />
189
+
190
+ <button
191
+ type="button"
192
+ className="menubar__theme-toggle"
193
+ data-theme-state={themeState}
194
+ onClick={cycleTheme}
195
+ title={`Theme: ${themeLabel} (click to cycle)`}
196
+ aria-label={`Theme: ${themeLabel}. Click to cycle dark, light, and system.`}
197
+ >
198
+ {isSystemTheme ? (
199
+ <Monitor size={16} aria-hidden="true" />
200
+ ) : theme === "dark" ? (
201
+ <Moon size={16} aria-hidden="true" />
202
+ ) : (
203
+ <Sun size={16} aria-hidden="true" />
204
+ )}
205
+ </button>
206
+
207
+ <AboutDialog
208
+ isOpen={showAboutDialog}
209
+ onClose={() => setShowAboutDialog(false)}
210
+ />
211
+
212
+ <DiagnosticsDialog
213
+ isOpen={showDiagnosticsDialog}
214
+ onClose={() => setShowDiagnosticsDialog(false)}
215
+ />
216
+
217
+ {showExportDialog && (
218
+ <ExportConfirmationDialog
219
+ project={project}
220
+ onConfirm={async () => {
221
+ setShowExportDialog(false);
222
+ await fileOps.handleExportGcode();
223
+ refreshRecentFiles();
224
+ }}
225
+ onCancel={() => setShowExportDialog(false)}
226
+ />
227
+ )}
228
+ </nav>
229
+ );
230
+ }
@@ -1,5 +1,5 @@
1
1
  import { useShallow } from "zustand/react/shallow";
2
- import { useProjectStore } from "../state/projectStore";
2
+ import { useProjectStore } from "../stores/projectStore";
3
3
  import { useCliHealthContext } from "../contexts/CliHealthContext";
4
4
 
5
5
  export function StatusBar() {