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.
- {fiberpath-0.6.1 → fiberpath-0.6.2}/CHANGELOG.md +19 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/PKG-INFO +2 -2
- {fiberpath-0.6.1 → fiberpath-0.6.2}/README.md +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/TODO.md +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/dependency-policy.md +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/packaging.md +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/index.md +8 -8
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/troubleshooting.md +3 -3
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/state-management.md +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/testing.md +2 -2
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/package-lock.json +2 -2
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/package.json +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/App.tsx +5 -52
- fiberpath-0.6.2/fiberpath_gui/src/components/MenuBar.tsx +230 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StatusBar.tsx +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ConnectionSection.tsx +5 -128
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/FileStreamingSection.css +13 -4
- fiberpath-0.6.2/fiberpath_gui/src/components/StreamTab/FileStreamingSection.tsx +165 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ManualControlSection.tsx +10 -74
- fiberpath-0.6.2/fiberpath_gui/src/components/canvas/VisualizationCanvas.tsx +211 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/AboutDialog.tsx +81 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/BaseDialog.tsx +52 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/CliUnavailableDialog.tsx +227 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/DiagnosticsDialog.tsx +162 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/dialogs/ExportConfirmationDialog.tsx +154 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/editors/HelicalLayerEditor.tsx +164 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/editors/HoopLayerEditor.tsx +1 -1
- fiberpath-0.6.2/fiberpath_gui/src/components/editors/LayerNumericField.tsx +61 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/editors/SkipLayerEditor.tsx +66 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/forms/MachineSettingsForm.tsx +25 -22
- fiberpath-0.6.2/fiberpath_gui/src/components/forms/MandrelForm.tsx +79 -0
- fiberpath-0.6.2/fiberpath_gui/src/components/forms/TowForm.tsx +77 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/layers/LayerRow.tsx +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/layers/LayerStack.tsx +1 -1
- fiberpath-0.6.2/fiberpath_gui/src/hooks/canvas/usePreviewGeneration.ts +111 -0
- fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useConnectionActions.ts +87 -0
- fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useManualCommandActions.ts +68 -0
- fiberpath-0.6.2/fiberpath_gui/src/hooks/stream/useStreamingActions.ts +170 -0
- fiberpath-0.6.2/fiberpath_gui/src/hooks/useFileOperations.ts +65 -0
- fiberpath-0.6.2/fiberpath_gui/src/hooks/useMenubarInteractions.ts +64 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useStreamEvents.ts +23 -41
- fiberpath-0.6.2/fiberpath_gui/src/lib/helicalValidation.ts +61 -0
- fiberpath-0.6.2/fiberpath_gui/src/lib/menuConfig.ts +187 -0
- fiberpath-0.6.2/fiberpath_gui/src/lib/numericFields.ts +18 -0
- fiberpath-0.6.2/fiberpath_gui/src/lib/streamFeedback.ts +285 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/stores/streamStore.ts +26 -0
- fiberpath-0.6.2/fiberpath_gui/src/tests/integration/streamLifecycle.test.ts +248 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/tests/integration/workflows.test.ts +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/Cargo.lock +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/Cargo.toml +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/tauri.conf.json +1 -1
- fiberpath-0.6.2/planning/gui-framework-migration-evaluation-plan.md +247 -0
- fiberpath-0.6.2/planning/roadmap-v0.6.2-react-hotspot-cleanup.md +253 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/pyproject.toml +1 -1
- {fiberpath-0.6.1 → fiberpath-0.6.2}/uv.lock +1 -1
- fiberpath-0.6.1/fiberpath_gui/src/components/MenuBar.tsx +0 -362
- fiberpath-0.6.1/fiberpath_gui/src/components/StreamTab/FileStreamingSection.tsx +0 -395
- fiberpath-0.6.1/fiberpath_gui/src/components/canvas/VisualizationCanvas.tsx +0 -234
- fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/AboutDialog.tsx +0 -129
- fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/CliUnavailableDialog.tsx +0 -233
- fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/DiagnosticsDialog.tsx +0 -230
- fiberpath-0.6.1/fiberpath_gui/src/components/dialogs/ExportConfirmationDialog.tsx +0 -215
- fiberpath-0.6.1/fiberpath_gui/src/components/editors/HelicalLayerEditor.tsx +0 -342
- fiberpath-0.6.1/fiberpath_gui/src/components/editors/SkipLayerEditor.tsx +0 -97
- fiberpath-0.6.1/fiberpath_gui/src/components/forms/MandrelForm.tsx +0 -111
- fiberpath-0.6.1/fiberpath_gui/src/components/forms/TowForm.tsx +0 -110
- fiberpath-0.6.1/fiberpath_gui/src/components/tabs/StreamTab.tsx +0 -6
- fiberpath-0.6.1/planning/gui-framework-migration-evaluation-plan.md +0 -159
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.gitattributes +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-node/action.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-python/action.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/actions/setup-rust/action.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/dependabot.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/backend-ci.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/ci-check.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/dependency-audit.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/docs-ci.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/docs-deploy.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-ci.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-e2e-smoke.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/gui-packaging.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.github/workflows/release.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.gitignore +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.vscode/extensions.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/.vscode/settings.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/LICENSE +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/architecture/axis-system.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/architecture/overview.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/ci-cd.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/contributing.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/release-process.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/development/tooling.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/getting-started.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/axis-mapping.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/marlin-streaming.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/visualization.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/guides/wind-format.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/api.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/concepts.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/reference/planner-math.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/docs/vm-testing.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/complex_surface/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/multi_layer/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/multi_layer/input.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)single.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)triple.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/AvBay(470mm)triple.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/CarbonMotorTube(1295mm).gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/CarbonMotorTube(1295mm).wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/MainChute(585mm).gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/rocketry/MainChute(585mm).wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/simple_cylinder/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/simple_cylinder/input.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/sized_simple_cylinder/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/examples/sized_simple_cylinder/input.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/schemas.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/config/validator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/execution/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/execution/marlin.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/dialects.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/gcode/generator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/curves.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/intersections.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/geometry/surfaces.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/math_utils.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/calculations.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/exceptions.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/helpers.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/layer_strategies.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/machine.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/planner.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/planning/validators.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/simulation/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/simulation/simulator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/export_json.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath/visualization/plotter.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/main.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/package-lock.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/path_policy.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/plan.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/simulate.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/stream.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/routes/validate.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_api/schemas.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/__main__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/interactive.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/main.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/output.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/plan.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/plot.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/simulate.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/stream.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_cli/validate.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.gitignore +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.nvmrc +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/.stylelintrc.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/README.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/bundled-cli/.gitkeep +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/cli-integration.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/streaming-state.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/architecture/tech-stack.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/development.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/performance.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/schemas.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/guides/styling.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/overview.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/docs/reference/type-safety.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/generate-types.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/index.html +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/schemas/wind-schema.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/scripts/check-css-vars.mjs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/CliHealthWarning.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ErrorBoundary.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ErrorNotificationToast.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/FileField.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/ResultCard.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StatusText.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ConnectionSection.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/KeyboardShortcuts.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/KeyboardShortcuts.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/ManualControlSection.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamControls.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamControls.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamLog.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamLog.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamTab.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/StreamTab.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/StreamTab/index.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/TabBar.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/Toast/ToastContainer.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/Toast/ToastContainer.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/CanvasControls.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/CenterCanvas.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/canvas/LayerScrubber.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/BottomPanel.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/LeftPanel.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/panels/RightPanel.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/components/tabs/MainTab.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/contexts/CliHealthContext.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/contexts/ErrorNotificationContext.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useCliHealth.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useKeyboardShortcuts.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useTheme.test.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/hooks/useTheme.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/layouts/MainLayout.tsx +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/commands.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/constants.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/fileOperations.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/marlin-api.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/recentFiles.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/retry.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/schemas.test.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/schemas.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/tauri-types.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/toastMessages.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/validation.test.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/lib/validation.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/main.tsx +0 -0
- {fiberpath-0.6.1/fiberpath_gui/src/state → fiberpath-0.6.2/fiberpath_gui/src/stores}/projectStore.test.ts +0 -0
- {fiberpath-0.6.1/fiberpath_gui/src/state → fiberpath-0.6.2/fiberpath_gui/src/stores}/projectStore.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/stores/toastStore.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/buttons.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/canvas.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/dialogs.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/forms.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/index.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/layout.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/notifications.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/panels.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/reset.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/tabs.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/tokens.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/styles/typography.css +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/tests/setup.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/components.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/converters.test.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/converters.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/project.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src/types/wind-schema.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/build.rs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/capabilities/default.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/128x128.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/256x256.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/32x32.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/512x512.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/icons/icon.ico +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/cli_path.rs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/cli_process.rs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/main.rs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/src-tauri/src/marlin.rs +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/tsconfig.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/tsconfig.node.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/vite.config.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/fiberpath_gui/vitest.config.ts +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/mkdocs.yml +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/package-lock.json +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/planning/roadmap-backlog.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/planning/roadmap-v7.md +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-check-artifacts.ps1 +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-check-artifacts.sh +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-cli-smoke.ps1 +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/e2e-cli-smoke.sh +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/extract-package-runtime.ps1 +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/extract-package-runtime.sh +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/find-bundled-cli.ps1 +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/ci/find-bundled-cli.sh +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/export_schema.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/freeze_cli.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/generate_schema.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/scripts/sync_gui_docs.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/setup.cfg +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_plan_route.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_simulate_route.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_stream_route.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/api/test_stream_route_errors.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_axis_format.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_cli_json.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_cli_smoke.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cli/test_stream_command.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/config/__init__.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/config/test_validator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/helical-balanced.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/simple-hoop.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/inputs/skip-bias.wind +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/helical-balanced/output.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/helical-balanced/preview.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/simple-hoop/output.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/simple-hoop/preview.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/skip-bias/output.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/cyclone_reference_runs/outputs/skip-bias/preview.png +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/execution/test_marlin_streamer.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/gcode/test_dialects.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/gcode/test_generator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/geometry/test_surfaces.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/_generate_fixtures.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/helical_layer.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/hoop_layer.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/hoop_only_program.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/fixtures/skip_layer.gcode +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_axis_mapping.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_helpers_machine.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_layer_strategies.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_planner_smoke.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/planning/test_validators.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/simulation/test_simulator.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/simulation/test_simulator_axis_detection.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/tauri/test_marlin_integration.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/tauri/test_port_discovery.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/visualization/test_export_json.py +0 -0
- {fiberpath-0.6.1 → fiberpath-0.6.2}/tests/visualization/test_plotter.py +0 -0
- {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.
|
|
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
|
-
[](https://github.com/CameronBrooks11/fiberpath/releases)
|
|
712
712
|
[](LICENSE)
|
|
713
713
|
[](https://github.com/CameronBrooks11/fiberpath/actions/workflows/backend-ci.yml)
|
|
714
714
|
[](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
|
-
[](https://github.com/CameronBrooks11/fiberpath/releases)
|
|
8
8
|
[](LICENSE)
|
|
9
9
|
[](https://github.com/CameronBrooks11/fiberpath/actions/workflows/backend-ci.yml)
|
|
10
10
|
[](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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
47
|
+
- :material-new-box:{ .lg .middle } **What's New in v0.6.2**
|
|
48
48
|
|
|
49
49
|
---
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
React hotspot cleanup and architectural hardening:
|
|
52
52
|
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
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.
|
|
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.
|
|
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.
|
|
67
|
-
./fiberpath_0.6.
|
|
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:
|
|
@@ -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
|
-
├──
|
|
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/
|
|
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.
|
|
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.
|
|
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,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
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/
|
|
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 "./
|
|
26
|
-
import {
|
|
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
|
-
|
|
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 "../
|
|
2
|
+
import { useProjectStore } from "../stores/projectStore";
|
|
3
3
|
import { useCliHealthContext } from "../contexts/CliHealthContext";
|
|
4
4
|
|
|
5
5
|
export function StatusBar() {
|