v1.1.2: Tutorial UX fixes + Selig database + Smart Group + Show Me tours#9
Merged
aeronauty-flexcompute merged 18 commits intomainfrom Mar 20, 2026
Merged
v1.1.2: Tutorial UX fixes + Selig database + Smart Group + Show Me tours#9aeronauty-flexcompute merged 18 commits intomainfrom
aeronauty-flexcompute merged 18 commits intomainfrom
Conversation
- Add searchable Selig database panel with ~1,600 airfoils from UIUC - Random Foil button picks and loads a random airfoil from the catalog - Parse Lednicer-format .dat files (two-section upper/lower layout) - Proxy endpoints for CORS-free .dat fetching (Vite dev + Python server) - Attribution link to UIUC Airfoil Coordinates Database - Bundled catalog JSON generated from UIUC database HTML - Data Explorer enhancements, outlier flagging, Plot Builder improvements - Python API polar result aggregation methods Made-with: Cursor
Fetch from same-origin static path instead of proxy — fixes 403 on the deployed beta (S3/CloudFront has no server to proxy through). All 1,665 Selig-format .dat files from the UIUC archive are served from public/airfoils/ alongside the app. Made-with: Cursor
- Add Smart Group button in Data Explorer that groups by polar configuration (airfoil + Re + Mach + Ncrit + flap config) and auto-shows alpha_stall and alpha @ L/D_max summary columns - Fix toFixed crash when grouping by non-numeric columns (all 11 valueFormatters now guard with typeof check) - Add flap_deflection and flap_hinge_x columns to Data Explorer - Add Aggregated data source to Data Explorer correlogram - Add aggregated scatter overlay (diamond markers) to Polar Plot - Auto-switch correlogram to Aggregated when Smart Group activates - Persist Smart Group state and data source in routeUiStore so they survive view switches and page reloads (ephemeral + URL) - Update changelog with all new features Made-with: Cursor
The const was declared 70 lines after the useCallback that referenced it, causing a TDZ ReferenceError on component mount. Made-with: Cursor
- Add .github/workflows/ci.yml (cargo test --workspace + flexfoil-python pytest) - rustfoil-testkit: warn-only xfoil src check; paths helpers for instrumented bin/exe - Skip instrumented-binary and Fortran object parity tests without Xfoil-instrumented - Sync shifted_stmove_state fixture with qvfue/gamqv after gam override - Workflow reference coords: fall back to testdata naca0012_xfoil_paneled.dat - Committed spline testdata + gen_spline_fixtures example; assorted test robustness fixes Made-with: Cursor
Replace the Start/End/Step sweep fields with a single text input accepting start:step:end, [v1,v2,v3], bare CSV, and mixed notation for non-uniform parameter sweeps (e.g. 5e5, 1e6, 3e6). Add a Distributions panel that plots Cp, Cf, δ*, θ, H, and ue against x/c, y, or arc-length s, with multi-run overlay support driven by checkbox selection in the Data Explorer table. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Made-with: Cursor
…ions - polar() now accepts alpha as a list (e.g. [5e5, 1e6, 3e6]) alongside the existing (start, end, step) tuple notation - polar() Re, mach, ncrit accept lists for automatic outer-product matrix sweeps, returning list[PolarResult] - SolveResult exposes cp and cp_x arrays (from inviscid panel solve) - New Airfoil.bl_distribution() method returns BLResult with per-surface Cf, delta_star, theta, H, and ue arrays (viscous only) - New get_bl_distribution Rust binding in rustfoil-python crate - 10 new tests covering all new functionality (44 total, all pass) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Made-with: Cursor
Group runs by "everything the same except the X-axis parameter" instead of a hardcoded invariant-field list. This correctly handles: - Non-uniform alpha sweeps (e.g. 5:1:11, 11.11, 15:1:28) - Re/Mach/Ncrit sweeps on the X-axis - Matrix sweeps (alpha x Re) Also raises the gap-split multiplier from 3 to 5 and skips gap splitting for groups smaller than 6 points, preventing spurious fragmentation of intentional non-uniform sweeps. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Made-with: Cursor
Add text/* MIME types to the file input accept attribute so Samsung Internet uses the document picker instead of the media-only browser. No effect on Chrome/Firefox/Safari. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Made-with: Cursor
- Add tourSlides to 1.1.1 changelog (Selig Database, Smart Group, Outlier Flagging, File Menu & Export) - Add inline "Show Me" buttons to the flat changelog list view via optional showMeTourId on ChangelogItem - Create showMe tours for seligDatabase and smartGroup with data-tour attributes on Library and Data Explorer panels - Bump flexfoil-ui to 1.1.1 to match changelog - Trigger pypi-publish workflow on push to main (auto-publish on merge) - Add version-bumping gate to pr-to-main rule Made-with: Cursor
…ing replaced with Show Panel button
- Set overlayClickBehavior to no-op so clicking the overlay doesn't
destroy the tour (users can still close via the X button)
- Replace "Element not visible" warning with "Panel hidden" label,
an animated SVG cursor, and a "Show {Panel}" button that
programmatically opens the required panel
- Add delegated click handler for [data-open-panel] buttons
- Bump to 1.1.2
Made-with: Cursor
Made-with: Cursor
driver.js registers a capture-phase click handler on document that calls stopImmediatePropagation() for all clicks inside the popover. Our handler was being re-registered (losing priority) every time openPanel changed identity. Use a ref so the listener stays first in the chain, and call stopImmediatePropagation ourselves to block driver.js from swallowing it. Made-with: Cursor
driver.js registers capture-phase click handlers on document that call stopImmediatePropagation() for all clicks inside the popover wrapper. By registering our handler on window instead of document, it fires before any document-level handlers in the capture phase (window → document → ... → target), guaranteeing we intercept the click first. Made-with: Cursor
driver.js registers capture-phase handlers on document for pointerdown, mousedown, pointerup, mouseup AND click. All call stopImmediatePropagation. We now intercept all five event types on window capture phase to fully own the event chain for [data-open-panel] button interactions. Made-with: Cursor
LayoutContext's openPanel can hold a stale model reference when the layout is restored from localStorage. Use applyRouteActivePanel from the route store instead — this bumps a revision counter that triggers DockingLayout's own useEffect, which has direct access to the current model state and calls handleOpenPanel/handleRestorePanel reliably. Made-with: Cursor
Made-with: Cursor # Conflicts: # flexfoil-ui/src/App.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changelog, Versions & Docs
flexfoil-ui/src/lib/version.tsCHANGELOG updatedflexfoil-ui/package.jsonversion matches top CHANGELOG entry (1.1.2)packages/flexfoil-python/pyproject.tomlversion bumped (1.1.4)docs-site/docs/Test plan
Made with Cursor