Skip to content

Beta to main#123

Merged
TheAngryRaven merged 54 commits into
mainfrom
BETA
Jun 4, 2026
Merged

Beta to main#123
TheAngryRaven merged 54 commits into
mainfrom
BETA

Conversation

@TheAngryRaven

@TheAngryRaven TheAngryRaven commented Jun 3, 2026

Copy link
Copy Markdown
Owner

Beta → main

This rolls the current BETA line up into main20 merged PRs since the
last promotion (#120#142). Highlights below, grouped by theme; this mirrors
the [Unreleased] section of CHANGELOG.md.


✨ New features

Analysis & charts

  • Multi-lap overlay across the maps and graphs (feat(map): multi-lap racing-line overlay on the pro-mode MiniMap (phase 1) #127). Select extra
    laps/snapshots and they draw everywhere at once — racing lines on both the
    simple Race Line map and the pro mini-map, and distance-aligned traces on
    every telemetry chart, with each lap's value in the cursor tooltip. Add a lap
    from the lap list's Map column or a snapshot from the snapshot list; each
    gets a distinct color + on-map legend. The current lap always renders on top.
  • Overlay laps from other sessions / loggers, with drift alignment (feat(overlay): external-file lap overlays + cross-session drift alignment #131).
    Pull laps from other saved logs via the Overlays menu and toggle them onto
    the maps + graphs. An Align lines toggle rigidly registers cross-session
    overlays (snapshots + external-file laps) onto your current lap so the lines
    actually sit on top of each other; same-session laps are left untouched.
    Closes the "align data from different loggers" gap.
  • G-G diagram (friction circle) (feat(graphview): add G-G diagram (friction circle) #125). A new pro-mode graph plotting lateral
    vs. longitudinal G as a scatter, with 0.5 g grip rings, your session's cloud,
    the reference cloud, and the live scrub point — the classic MoTeC / Race Studio
    "are you using the whole circle" view.
  • G-G diagram: comparison-cloud toggle + per-cloud value readout (Overlay braking on the brake-% chart + G-G diagram ref/overlays toggle #140). A
    bottom-right info box lists the live G value for every cloud at the scrub point,
    with Ref / Overlays (swap the comparison cloud) and Lat G / Lon G
    (switch the readout axis) toggles.
  • Brake % graph overlays your selected laps (Overlay braking on the brake-% chart + G-G diagram ref/overlays toggle #140). The computed Brake %
    chart draws a distance-aligned line per active overlay lap/snapshot, matching
    the reference brake line.
  • Distance vs. time chart scale (feat(charts): distance/time X-axis toggle, default to distance #121). Analysis charts can plot against
    track distance instead of elapsed time so laps line up corner-for-corner.
    New Chart Scale toggle in Settings; Distance is the default, anchored at
    the start-finish line with absolute-distance tick labels.
  • Resizable Pro-mode graphs (Add per-graph height resize handles in Pro mode #142). Each pro graph (and the G-G diagram) has a
    drag handle on its bottom edge to set its height individually; heights persist
    per session and ride cloud sync.

Overlays / reference management

  • Overlays menu — manage overlay lines and set references in one place (Overlays menu: set references + add laps from course logs; hide external-ref bar #133).
    The header Overlays button opens a three-section menu: current overlays
    (promote any to the comparison reference / remove), current-session laps
    (toggle on/off), and Add from other logs (other sessions on the current
    course, listed by date/time). Replaces the old "External Ref" bar.

Track management & community DB

  • Manage your tracks straight from the home screen (Home-screen track manager + user drawings in community submissions #126). A new Manage
    Tracks
    button opens the track manager with no datalog loaded — search a
    location, drop start/finish & sector lines, and draw the outline by clicking
    the map. The Draw tool is now available to everyone; Generate from lap still
    builds the outline from a GPS trace when a log is loaded. Drawings save with the
    course and travel via cloud sync + community submissions.
  • Track drawings are part of a community submission (Home-screen track manager + user drawings in community submissions #126). A drawn/generated
    outline rides along with a submitted course (flagged + drawing); the admin
    Submissions tab previews it with Apply to course layout.

Footer / build transparency


🔧 Improvements / changed


🐛 Bug fixes


🚀 Infra / deployment

  • Preview deployments can target a Supabase preview-branch database (Route non-main branch builds to Supabase preview-branch DB #128) —
    non-production branch builds prefer *_PREVIEW build variables so beta URLs
    point at a branch DB instead of production. main + local dev unaffected. See
    the README "Preview-branch backend" section.

Full merged-PR list (#120#142)

#120, #121 (distance/time axis), #124 (main conflict merge), #125 (G-G diagram),
#126 (track mgmt + drawing uploads), #127 (multi-lap overlay), #128 (Supabase
preview backend), #129 (footer version stamp), #130/#132 (track-selector
dropdown fix), #131 (external-lap overlays + alignment), #133 (Overlays menu UI),
#135 (footer branch/preview stamp), #136 (footer preview warning), #137 (UI
tweaks + helper messages), #138 (desktop text labels), #139 (setup-status
indicator), #140 (GPS braking + G-G overlays), #141 (map overlay crop fix),
#142 (resizable pro graphs).

Per-change detail and rationale live in CHANGELOG.md under [Unreleased]
cut a versioned section + tag when this promotion lands.

https://claude.ai/code/session_01HgXe3sxpDpQXrGpn981u8n

TheAngryRaven and others added 4 commits June 2, 2026 21:09
Add a Chart Scale setting that plots the analysis charts against track
distance instead of elapsed time, so laps line up corner-for-corner the
way pro tools (Race Studio, MoTeC) work. Distance is the new default.

- New pure helper lib/chartAxis.ts (buildChartAxis): maps each sample to
  an x-fraction (elapsed-time or cumulative-distance via
  calculateDistanceArray), supplies tick labels (distance unit follows
  the speed unit: MPH->ft/mi, KPH->m/km), and an indexAt inverse for
  scrubbing. Falls back to a linear index ramp when the quantity has no
  span. Unit-tested.
- chartXAxis setting wired through useSettings -> SettingsContext ->
  Index, with a Time|Distance toggle in SettingsModal.
- TelemetryChart and SingleSeriesChart plot at the axis fraction, relabel
  the X axis, and invert scrub clicks through the axis. Reference/pace
  overlays already align by distance, so they sit correctly on either
  axis.
- CHANGELOG + CLAUDE.md updated.
Per review feedback: the axis must not renormalize to the crop window.
Cropping still zooms the graph (window fills the canvas), but tick labels
now read in absolute distance/time measured from the lap start
(start-finish line) instead of resetting to 0 at the window start.

- buildChartAxis gains optional fullSamples + rangeStart: positions stay
  [0..1] over the visible window (zoom preserved) while labels add the
  window's absolute offset from the lap origin.
- TelemetryChart + SingleSeriesChart take allSamples + rangeStart, wired
  from RaceLineTab and GraphPanel (filteredSamples + visibleRange[0]).
- The range-slider crop handles now follow the chart scale too: absolute
  cumulative distance from the lap start in distance mode (formatRangeLabel
  rebuilt in Index), elapsed time otherwise.
- Tests for absolute distance/time labeling; CHANGELOG + CLAUDE.md updated.
…lignment-OB7LZ

feat(charts): distance/time X-axis toggle, default to distance
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jun 3, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
dovesdataviewer 1cf375d Commit Preview URL

Branch Preview URL
Jun 04 2026, 04:21 AM

@supabase

supabase Bot commented Jun 3, 2026

Copy link
Copy Markdown

This pull request has been ignored for the connected project tdxloldxzvnzdivdazzd because there are no changes detected in supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

@github-actions

github-actions Bot commented Jun 3, 2026

Copy link
Copy Markdown

Coverage Summary

Lines: 39.47% (2921/7399) · Statements: 38.68% · Functions: 33.41% · Branches: 40.27%

Per-file coverage
File Lines Functions Branches
src/components/video-overlays/dataSourceResolver.ts 84.12% 70% 79.41%
src/components/video-overlays/overlayUtils.ts 100% 100% 100%
src/components/video-overlays/registry.ts 100% 100% 100%
src/components/video-overlays/sectorUtils.ts 94.73% 100% 84.37%
src/components/video-overlays/themes.ts 100% 100% 100%
src/components/video-overlays/types.ts 0% 100% 100%
src/hooks/use-mobile.tsx 0% 0% 100%
src/hooks/use-toast.ts 0% 0% 0%
src/hooks/useAuth.ts 100% 100% 100%
src/hooks/useDataLoader.ts 15.66% 18.18% 16.32%
src/hooks/useDocumentHead.ts 0% 0% 0%
src/hooks/useEngineManager.ts 0% 0% 0%
src/hooks/useFileManager.ts 0% 0% 0%
src/hooks/useKartManager.ts 100% 100% 100%
src/hooks/useLapManagement.ts 0% 0% 0%
src/hooks/useLapOverlays.ts 0% 0% 0%
src/hooks/useLapSnapshots.ts 0% 0% 0%
src/hooks/useNoteManager.ts 0% 0% 0%
src/hooks/useOnlineStatus.ts 0% 0% 0%
src/hooks/usePlayback.ts 0% 0% 0%
src/hooks/useReferenceLap.ts 0% 0% 0%
src/hooks/useSessionData.ts 0% 0% 0%
src/hooks/useSessionMetadata.ts 0% 0% 0%
src/hooks/useSettings.ts 0% 0% 0%
src/hooks/useSetupManager.ts 0% 0% 100%
src/hooks/useStripePrices.ts 0% 0% 0%
src/hooks/useSubscription.ts 0% 0% 0%
src/hooks/useTemplateManager.ts 0% 0% 0%
src/hooks/useTrackEditorForm.ts 0% 0% 0%
src/hooks/useVehicleManager.ts 0% 0% 100%
src/hooks/useVideoSync.ts 0% 0% 0%
src/integrations/lovable/index.ts 0% 0% 0%
src/lib/aimParser.ts 87.96% 100% 69.13%
src/lib/alfanoParser.ts 80.46% 100% 57.48%
src/lib/billing.ts 96.55% 100% 97.36%
src/lib/billingClient.ts 0% 0% 0%
src/lib/ble/test/mockBle.ts 100% 100% 50%
src/lib/ble/battery.ts 93.33% 100% 87.5%
src/lib/ble/connection.ts 0% 0% 0%
src/lib/ble/fileTransfer.ts 90.69% 95% 72.91%
src/lib/ble/format.ts 50% 100% 66.66%
src/lib/ble/index.ts 100% 100% 100%
src/lib/ble/internal.ts 100% 100% 50%
src/lib/ble/settings.ts 93.6% 100% 85.29%
src/lib/ble/trackSync.ts 89.69% 90.9% 70.96%
src/lib/ble/types.ts 100% 100% 100%
src/lib/bleDatalogger.ts 100% 100% 100%
src/lib/brakingZones.ts 97.14% 100% 86.11%
src/lib/browserCompat.ts 0% 0% 0%
src/lib/buildInfo.ts 100% 100% 100%
src/lib/channels.ts 100% 100% 84.61%
src/lib/chartAxis.ts 98.18% 100% 85.1%
src/lib/chartColors.ts 100% 100% 100%
src/lib/chartUtils.ts 34.78% 25% 22.85%
src/lib/courseDetection.ts 99.01% 100% 84.14%
src/lib/datalogParser.ts 18.51% 50% 17.39%
src/lib/db/index.ts 0% 0% 0%
src/lib/db/supabaseAdapter.ts 0% 0% 0%
src/lib/db/types.ts 100% 100% 100%
src/lib/dbUtils.ts 3.03% 0% 0%
src/lib/deviceSettingsSchema.ts 93.33% 100% 96.42%
src/lib/deviceTrackSync.ts 100% 100% 90%
src/lib/doveParser.ts 89.6% 72.72% 73.63%
src/lib/dovexParser.ts 76.56% 76.92% 47.27%
src/lib/emailValidation.ts 100% 100% 100%
src/lib/engineStorage.ts 0% 0% 100%
src/lib/engineUtils.ts 100% 100% 91.66%
src/lib/fieldResolver.ts 100% 100% 83.33%
src/lib/fileBrowserTree.ts 98.87% 97.5% 88.23%
src/lib/fileStorage.ts 2.17% 0% 0%
src/lib/garageEvents.ts 100% 100% 100%
src/lib/gforceCalculation.ts 100% 100% 100%
src/lib/ggDiagram.ts 100% 100% 94.73%
src/lib/graphPrefsStorage.ts 53.33% 25% 88.88%
src/lib/kartStorage.ts 0% 0% 0%
src/lib/lapAlignment.ts 100% 80% 76.92%
src/lib/lapCalculation.ts 96.12% 100% 90.32%
src/lib/lapDelta.ts 99.2% 100% 82.08%
src/lib/lapOverlays.ts 100% 100% 86%
src/lib/lapSnapshot.ts 100% 100% 88.46%
src/lib/lapSnapshotStorage.ts 0% 0% 0%
src/lib/motecParser.ts 4.29% 3.44% 0.69%
src/lib/nmeaParser.ts 85.62% 92.85% 71.22%
src/lib/noteStorage.ts 12.5% 13.33% 0%
src/lib/overlayCanvasRenderer.ts 0% 0% 0%
src/lib/parserUtils.ts 100% 100% 98.52%
src/lib/pendingCheckout.ts 58.82% 25% 100%
src/lib/profanity.ts 100% 100% 75%
src/lib/referenceUtils.ts 100% 100% 91.11%
src/lib/setupRevision.ts 100% 100% 88.23%
src/lib/setupRevisionStorage.ts 0% 0% 0%
src/lib/setupStatus.ts 100% 100% 100%
src/lib/setupStorage.ts 0% 0% 0%
src/lib/speedBounds.ts 94.11% 66.66% 89.18%
src/lib/speedEvents.ts 86.56% 100% 76%
src/lib/submittedTracksStorage.ts 0% 0% 0%
src/lib/templateStorage.ts 0% 0% 0%
src/lib/trackStorage.ts 3.29% 0% 0%
src/lib/trackSubmission.ts 100% 100% 97.43%
src/lib/trackUtils.ts 100% 100% 100%
src/lib/ubxParser.ts 5% 0% 0%
src/lib/utils.ts 100% 100% 100%
src/lib/vboParser.ts 83.2% 100% 60.97%
src/lib/vehicleStorage.ts 0% 0% 0%
src/lib/videoExport.ts 0% 0% 0%
src/lib/videoFileStorage.ts 0% 0% 0%
src/lib/videoStorage.ts 0% 0% 0%
src/lib/weatherService.ts 0% 0% 0%
src/plugins/cloud-sync/accountDeletion.ts 0% 0% 0%
src/plugins/cloud-sync/accountExport.ts 0% 0% 0%
src/plugins/cloud-sync/activeUser.ts 25% 0% 0%
src/plugins/cloud-sync/autoSync.ts 0% 0% 0%
src/plugins/cloud-sync/cloudClient.ts 0% 0% 0%
src/plugins/cloud-sync/CloudLogsPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/DataPrivacyPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/exportManifest.ts 100% 100% 100%
src/plugins/cloud-sync/FileDeleteToggle.tsx 0% 0% 0%
src/plugins/cloud-sync/fileSync.ts 76.47% 45.45% 100%
src/plugins/cloud-sync/FileSyncToggle.tsx 0% 0% 0%
src/plugins/cloud-sync/index.ts 0% 0% 0%
src/plugins/cloud-sync/LapSnapshotsPanel.tsx 0% 0% 0%
src/plugins/cloud-sync/localUsage.ts 0% 0% 0%
src/plugins/cloud-sync/merge.ts 90.9% 66.66% 100%
src/plugins/cloud-sync/pendingSync.ts 0% 0% 0%
src/plugins/cloud-sync/profile.ts 0% 0% 0%
src/plugins/cloud-sync/setupRevisionTombstones.ts 0% 0% 0%
src/plugins/cloud-sync/snapshotSync.ts 0% 0% 0%
src/plugins/cloud-sync/snapshotTombstones.ts 0% 0% 0%
src/plugins/cloud-sync/StoragePanel.tsx 0% 0% 0%
src/plugins/cloud-sync/storageTypes.ts 100% 100% 100%
src/plugins/cloud-sync/storeAccessors.ts 0% 0% 0%
src/plugins/cloud-sync/syncEngine.ts 0% 0% 0%
src/plugins/cloud-sync/syncStores.ts 100% 100% 100%
src/plugins/fileSources.ts 0% 0% 100%
src/plugins/index.ts 0% 0% 0%
src/plugins/mounts.ts 71.42% 75% 100%
src/plugins/panels.ts 75% 83.33% 100%
src/plugins/PluginMount.tsx 0% 0% 0%
src/plugins/PluginPanelHost.tsx 0% 0% 0%
src/plugins/registry.ts 77.27% 50% 100%
src/plugins/storage.ts 32.25% 8.33% 33.33%
src/plugins/types.ts 100% 100% 100%
src/types/racing.ts 100% 100% 100%

claude and others added 3 commits June 3, 2026 02:23
A new pro-mode graph plotting lateral vs longitudinal G as a scatter,
so drivers can see how much of the tyre's grip envelope they're using
(the classic MoTeC / Race Studio friction-circle view).

- lib/ggDiagram.ts (pure, unit-tested): pickGForcePair honors the
  gForceSource setting (GPS lat_g/lon_g preferred, logger-native pair
  for HW); computeGGPoints pairs + per-axis smooths the values aligned
  to sample index; computeGGAxisMax gives a symmetric, 0.5 g-rounded,
  [1.5,3.0]-clamped axis. Raw IMU accel_* is excluded (not grip-aligned).
- GGDiagram.tsx: canvas view with concentric grip rings, the session
  cloud, the reference-lap cloud (when selected), the live scrub point,
  and ACCEL/BRAKE/LAT hints + a g readout.
- Wired into GraphPanel as the '__gg__' picker entry, shown only when a
  lateral/longitudinal g pair is present; persists in graph-prefs like
  other graphs.
- CHANGELOG + CLAUDE.md updated.

Note: visual verification could not run in this environment (headless
browser download blocked by network policy); logic is covered by unit
tests and the build/lint/typecheck gate is green.
…-circle

feat(graphview): add G-G diagram (friction circle)
Adds a "Manage Tracks" button to the landing page (below the datalogger
download) that opens the track manager without a datalog loaded, via new
TrackEditor `triggerButton` + `startInManage` props.

Opens up track drawing to all users:
- The manual "Draw" tool is no longer admin-only; it shows wherever
  `showDrawTool` is set (the `isAdminEditor` gate is removed).
- User-drawn / lap-generated outlines persist on `Course.layout` and ride
  the normal track-storage CRUD (cloud-sync + submissions later).
- Create-flow dialogs (AddTrack/AddCourse) now expose location search,
  Draw, and Generate-from-lap; the edit flow prefers the course's own
  saved layout over the built-in drawings.json outline.
@TheAngryRaven TheAngryRaven marked this pull request as ready for review June 3, 2026 02:36
claude and others added 17 commits June 3, 2026 02:39
Drawings now travel with a "Submit to DB" contribution:
- SubmissionCourse carries the course `layout`; SubmitTrackDialog sends it
  as `layout_data` (the edge fn already persisted it; now validates point
  shape and caps at 5000 points). A "+ drawing" badge marks such courses.
- `courseContentHash` folds in the drawing, so adding/editing an outline
  re-flags an otherwise-unchanged course for upload.
- Admin Submissions tab previews the outline (thumbnail) and adds an
  "Apply to course layout" action that matches the DB course and saves the
  layout, feeding the existing drawings.json export.
- DbSubmission now types `has_layout`/`layout_data` (drops the cast).

Also makes "Submit to DB" always visible, greyed out (with a pending
count) when the upload diff finds nothing new to send.
"Generate from lap" copied every raw GPS sample in the lap — the full
logger rate (hundreds–thousands of unevenly-spaced points), which bloats
Course.layout and the submission layout_data and over-weights slow corners.

Run the generated polyline through the existing tested resamplePolyline()
at a fixed ~5 m spacing, yielding a clean, compact, evenly-spaced outline.
Replace the fixed 5 m resample spacing with a length-aware curve: 5 m
under 2 miles (karting), ramping linearly to 10 m by 4 miles and capped
there, so long road courses don't produce an over-dense outline. Length
is taken from the selected lap's distance.

New pure helper generatedDrawingSpacing() in trackUtils (unit-tested).
…uploads-MtQVe

Home-screen track manager + user drawings in community submissions
Phase 1 of the map line-overlay feature: overlay multiple current-session
laps and saved snapshots on the GraphView MiniMap at once, each a distinct
color, to compare racing lines through a corner.

- lib/lapOverlays.ts (pure, unit-tested): stable overlay ids (lap:<n> /
  snap:<id>), a cool-hued palette distinct from the speed heatmap + grey
  reference, resolveOverlayLines(selections) -> OverlayLine[] (resolving
  laps to sample slices and snapshots to clean-lap samples, colored by
  visible index), and unionBounds() to fit overlays running outside the
  active lap.
- useLapOverlays hook: selection state (cleared on new file), toggle, and
  derived overlayLines.
- SessionContext carries overlayLines + onToggleOverlay; wired through
  Index.
- MiniMap: new overlay layer beneath the active heatmap (one polyline per
  line), union-bounds fit, and a remove-able on-map legend.
- Selection: a 'Map' toggle column in LapTable + a per-snapshot Spline
  toggle in LapSnapshotControls.

Phase 1 draws raw absolute GPS (same-session laps share a receiver and need
no correction). Cross-session drift-alignment and external/cross-logger
sources are deferred follow-ups (docs/plans/multi-lap-overlay.md).

CHANGELOG + CLAUDE.md updated; plan saved under docs/plans/.
Cloudflare preview deployments (non-main branches) should hit a Supabase
preview-branch database, not production. Since Supabase creds are baked in
at build time by Vite, the switch has to happen during the build.

vite.config.ts pick() now detects non-production builds via WORKERS_CI_BRANCH
(Workers Builds) / CF_PAGES_BRANCH (Pages) and prefers a parallel *_PREVIEW
value (VITE_<KEY>_PREVIEW or HTT_<KEY>_PREVIEW) for each key before the normal
value/fallback. main builds and local dev never read the _PREVIEW vars.

Docs: README "Preview-branch backend" deployment section, .env.example,
CLAUDE.md env notes, CHANGELOG.
…oudflare-t767g

Route non-main branch builds to Supabase preview-branch DB
Expands the multi-lap overlay from the pro MiniMap to every data view, per
maintainer feedback — selected laps/snapshots are now full comparison lines
everywhere, current lap always on top.

- RaceLineView (simple map): overlay layer beneath the current heatmap,
  union-bounds fit, on-map legend — mirrors the MiniMap.
- TelemetryChart (simple speed chart) + SingleSeriesChart (every pro graph):
  draw each overlay lap's series as a distance-aligned trace in its color,
  beneath the current line, with per-lap values added to the cursor tooltip
  (current lap listed first). Overlays apply to speed + measured channels;
  the synthetic pace / brake-% series don't overlay.
- referenceUtils.alignByDistance(): generic distance-alignment of any
  channel from one lap onto another's distance axis (generalizes
  calculateReferenceSpeed); unit-tested. Overlays align over the full lap
  then slice to the visible window, so they stay anchored at start-finish.
- Threaded overlayLines through RaceLineTab and GraphPanel/GraphViewPanel.

CHANGELOG + CLAUDE.md + plan doc updated for the expanded scope.
Bake the app version (package.json), short git commit hash, and build
date into the bundle at build time via vite `define`, and surface them
in the landing-page footer as a "v2.0.0 · <hash>" stamp so it's easy to
tell which revision is deployed and when something changed. The hash
links to the commit on GitHub; the build date shows on hover.

The git hash prefers CI-provided commit SHAs (Cloudflare Workers Builds
/ Pages, GitHub Actions) so it's correct even on shallow checkouts,
falling back to a local `git` call and then "unknown".

- vite.config.ts: inject VITE_APP_VERSION / VITE_GIT_HASH / VITE_BUILD_DATE
- src/lib/buildInfo.ts: pure helpers (label, hasCommit, commitUrl) + tests
- LandingPage footer renders the stamp
- Docs: README env table, CLAUDE.md, CHANGELOG

https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
…ommit-hash-1uLx0

Add build version + commit hash stamp to home-page footer
The track/course selector's dropdowns rendered behind the dialog they open
inside (Select content z-[10001] vs Dialog z-[10010]/[10011]), so after
loading a log you could never pick a different track. Bump the Select
content above the dialog layer.

Also simplify track creation everywhere: a track is now just a name + short
name, with no up-front course/start-finish step. Courses are added afterwards
from the track's course list. The post-load "unknown track" prompt walks
through it in two steps — create the bare track, then add its first course so
lap timing still works. Drops the now-dead course-creation props from
AddTrackDialog and the unused short-name field from CourseForm.
…inimap

feat(map): multi-lap racing-line overlay on the pro-mode MiniMap (phase 1)
…down-7Un02

Fix track dropdown behind dialog; make adding a track name-only
The home-screen track manager opens straight into manage mode with no session,
so "Back to Selection" only led to an empty track/course picker. Hide it unless
a selection context exists (onSelectionChange is provided).

The course-list preview thumbnail only consulted community-DB drawings, so a
course outline you drew/generated yourself never produced a thumbnail. Prefer
the course's own layout, falling back to the public drawing for built-ins.
…ment

Phase 2 of the multi-lap overlay — closes the 'align data from different
loggers' gap.

External sources:
- New overlay id kind file:<lap>\x1f<name>; useLapOverlays loads + parses
  other saved files on demand (cached), computes laps for the current course,
  and exposes loadOverlayFile/addExternalOverlay. resolveOverlayLines resolves
  file: ids from an external-samples cache.
- OverlayFilePicker: two-stage (file → laps) additive picker, mounted in the
  header beside Snapshots; shows which external laps are active + their colors.

Drift alignment:
- lib/lapAlignment.ts (pure, unit-tested): 2D closed-form Kabsch rigid
  registration (rotation+translation, with a rotation guard) over arc-length
  correspondences; resampleToCount + computeRigidTransform + alignLapToReference.
- An 'Align lines' toggle on both map legends (default on) registers
  cross-session overlays (snap:/file:) onto the current lap; same-session lap:
  overlays are never transformed (shared receiver, no drift). Map-only — the
  graphs compare by distance and are transform-invariant.

Threaded alignOverlays + external loader/adder through SessionContext to the
header picker and both map legends. CHANGELOG + CLAUDE.md + plan doc updated.
…sistent hint

Removes the Manual/Visual editor toggle (a dev fallback) across every track
manager — the visual map editor is now the only path. Deletes the now-unused
EditorModeToggle and CourseForm components and the editorMode form state.

The course-outline Draw/Generate tools now auto-save on every edit (click,
undo, clear, generate) via a points ref, matching the line tools that already
save on drag-release — so the editor's Done/Close footer button is removed.

Adds a persistent hint in the editor across all managers: "Drawing an outline
helps on-device course detection. Click to place points."
TheAngryRaven and others added 28 commits June 3, 2026 00:13
…down-7Un02

Track manager polish: gate "Back to Selection", fix thumbnail, visual-only auto-saving editor
…ps-alignment

feat(overlay): external-file lap overlays + cross-session drift alignment
Rename the header "Overlay file" button to "Overlays" and turn it into a
two-section menu:
- Current overlays: lists active overlay lines, each promotable to the
  comparison reference lap (same-session laps set the in-session reference;
  cross-session overlays feed the external-reference slot) or removable.
- Add from other logs: the other saved sessions tagged with the current
  course, shown by date/time (never raw file names) via a new pure
  filesTaggedWithCourse() helper in fileBrowserTree.ts.

External-file overlay labels now use the session date/time display name
instead of the raw file name. The old External Ref bar at the top of the
lap list is hidden behind SHOW_EXTERNAL_REF_BAR (kept, not removed);
references are still settable from the per-row Ref buttons. Snapshots menu
is unchanged.

Adds unit tests for filesTaggedWithCourse and updates CHANGELOG + CLAUDE.md.
- Fix the "lost reference" visual bug: the Current overlays list now
  highlights which overlay is the active reference (matching the in-session
  referenceLapNumber or the external reference label), so reopening the menu
  shows the selection persisted instead of looking cleared.
- Add a "Current session laps" collapsible section so laps from the current
  session can be toggled on/off as overlays straight from the menu, without
  going to the lap page (the per-row lap-list toggles still work too).
Mirror the _PREVIEW backend switch in the footer version stamp. A `main`
build keeps the "v<version> · <hash>" form; any other branch now shows
"<branch> · <hash> · <commit time>" so a beta/preview deployment makes
clear which branch it's running and when that commit landed.

- vite.config.ts: bake in VITE_GIT_BRANCH (CI branch vars → git → unknown)
  and VITE_GIT_COMMIT_DATE (git committer date)
- buildInfo.ts: isPreviewBuild() + formatCommitTime() drive the two-mode
  formatBuildLabel(); an unknown branch falls back to the prod stamp
- tests cover both modes + the UTC commit-time formatting
- docs: README env note, CLAUDE.md, CHANGELOG

https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
…ew-stamp

Footer stamp: branch + hash + commit time on non-main builds
…Wc1j

Overlays menu: set references + add laps from course logs; hide external-ref bar
Give preview builds visible flare so nobody mistakes a beta for prod. On
any non-main build the footer now turns amber (a new --warning semantic
token, tuned to stand out in both light and dark mode) and shows a notice
below the version stamp: the branch runs on a preview database, accounts
can be wiped at any time, don't rely on non-local data, and never enter
real payment information if payments are activated.

- index.css: add --warning / --warning-foreground (amber) for light + dark
- tailwind.config.ts: map the `warning` color
- LandingPage: gate footer color + warning note on isPreviewBuild()
- docs: CHANGELOG, CLAUDE.md

https://claude.ai/code/session_01L92jSQDgbWbFxCFNGctW2D
Footer: amber preview-database warning on non-main builds
- Overlays menu: note overlays are separate from the reference lap (where
  deltas are calculated from).
- Snapshots menu: note one snapshot per engine per course, capturing the full
  lap plus the session's setup info.
- Pro-view Vehicle tab: add an 'Open Garage' button below 'Save Selection'
  (shown when no vehicle is linked) that opens the drawer straight to the
  Vehicles tab when there are no vehicles, or Setups when one exists. Threads a
  new onOpenGarage handler through SessionContext and an optional initial
  garage sub-tab through useFileManager/FileManagerDrawer.
Add a subtle helper line to the VideoPlayer 'No video loaded' state stating
that segmented videos are not yet supported.
…ssages-vJyni

UI tweaks: helper messages + Open Garage shortcut
On large (desktop) screens, surface text labels next to the icons for
the header controls that previously showed an icon alone, using the
extra real estate:

- Settings button → "Settings"
- Garage (file manager) button → "Garage"
- Track selection (pencil) button → "Select track"
- Snapshots control → label now appears at lg+ only (was sm+), so
  tablet/mobile stay icon-only while keeping the count bubble

Tablet and mobile keep the icon-only treatment via a `hidden lg:inline`
label span, so the compact layouts are unchanged below the desktop
breakpoint.

https://claude.ai/code/session_011sirMKvEoqp9t5onArZVmt
When the loaded session has no setup assigned, glow an exclamation icon
just right of the Coach tab to nudge the driver toward recording setup
data for historical comparisons.

- Red (urgent) when no setup exists to assign yet: clicking opens the
  Garage to Vehicles (or Setups if a vehicle already exists). The empty
  states in those tabs now read in red.
- Orange (reminder) when setups exist but this session isn't linked:
  clicking opens the Garage Notes tab, which now shows an orange reminder
  below Save Selection.

The tone/target decision is a pure helper (getSetupIndicator) with unit
tests; the tab-bar button owns only the glow + click wiring.
The multi-lap overlay system already feeds selected laps/snapshots into the
Pro-view charts and G-force fields, but two computed surfaces ignored them:

1. The computed Brake % chart only drew the current lap + reference. Now each
   active overlay lap derives its own brake % (computeBrakingGSeriesSG +
   gToBrakePercent) and is distance-aligned onto the current lap, matching how
   the reference brake line is drawn. New pure helper alignValuesByDistance
   aligns a derived parallel series (not stored on the sample) by distance;
   alignByDistance now delegates to it.

2. The G-G diagram only ever showed the reference cloud. Added a header
   Ref / Overlays toggle (shown when both exist) that swaps the comparison
   cloud beneath the session — overlays render one cloud per lap in its line
   color, and the axis extent follows the active comparison set.

https://claude.ai/code/session_011faKrsV6CSepcnmVrvJqAC
Narrowing the range slider cropped the active lap's heatmap line (and the
charts, via alignByDistance) to the selected section, but the overlaid
laps/snapshots on the race-line map and Pro mini-map stayed drawn at full
lap length. Add a pure cropOverlayLinesToWindow helper that slices each
overlay to the same cumulative-distance window as the active lap, and apply
it (plus the bounds fit) in RaceLineView and MiniMap, threading rangeStart
from the callers.

https://claude.ai/code/session_0116WfgRYsHCZsJ3wjRFpiEE
Each Pro-view graph (and the G-G diagram) now has a drag handle along its
bottom edge for adjusting its height individually. Heights persist per
session via graph-prefs (and ride the existing cloud-sync of that store),
keyed by series so a tuned layout returns when the log is reopened.

- New reusable GraphResizeHandle component (pointer-drag, clamped 120-800px)
- SingleSeriesChart / GGDiagram take optional height + onHeightChange,
  restructured to a flex column so the handle never overlaps axis labels
- GraphPanel owns the height map, persists on drag release, prunes on remove
- graphPrefsStorage stores graphHeights; pure migrateGraphPrefs helper
  migrates legacy display-name keys in both the list and the height map
- Tests for the migration helper; CHANGELOG updated
Match the Snapshots control: the Overlays button label now appears at
the lg+ (desktop) breakpoint only instead of sm+, so tablet and mobile
stay icon-only while keeping the count bubble at every size.

https://claude.ai/code/session_011sirMKvEoqp9t5onArZVmt
…tor-87tfW

Glowing setup-status indicator in the tab bar
…els-UXVhO

Desktop-only text labels on header controls
…g-XD7kb

Crop map overlay racing lines to the playback window
Adds a bottom-right info box to the G-G diagram listing the live G value for
every cloud at the scrub point — the session plus the active comparison set
(reference or overlays), each row in its cloud color. Comparison values are
distance-aligned onto the current lap so one scrub index reads the same track
position across all clouds.

Two toggles sit above the box:
- Ref / Overlays — relocated here from the header; swaps the comparison cloud.
- Lat G / Lon G — switches the readout axis (lateral by default), since showing
  both axes for every cloud gets noisy fast.

The old canvas-drawn current-point Lat/Lon readout is replaced by this box; the
red current-point dot stays.

https://claude.ai/code/session_011faKrsV6CSepcnmVrvJqAC
On touch, the window-level pointermove/up listeners lost the gesture as soon
as the finger left the 8px handle — the browser reclaimed it as a scroll and
fired pointercancel, so the drag only nudged a few pixels at a time. Capture
the pointer on the handle element and handle move/up/cancel on the element
itself so the drag tracks the finger anywhere on screen.
…overlays-wvTSH

Overlay braking on the brake-% chart + G-G diagram ref/overlays toggle
…ht-resize-uIJTH

# Conflicts:
#	CHANGELOG.md
#	src/components/graphview/GGDiagram.tsx
…size-uIJTH

Add per-graph height resize handles in Pro mode
@TheAngryRaven TheAngryRaven merged commit bb689fe into main Jun 4, 2026
10 checks passed
@TheAngryRaven TheAngryRaven mentioned this pull request Jun 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants