diff --git a/CHANGELOG.md b/CHANGELOG.md index dc3d4f80..a5eb2ab8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,27 +11,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 > from git history and grouped by theme rather than exhaustive per-commit > detail. -## [Unreleased] +## [2.5.1] - unreleased -### Fixed -- **Pro-mode panel resizing on touch.** Dragging a resizable divider (the - left/right split and the InfoBox/MiniMap split in pro mode, plus the video - panel) would stop after only a few pixels on touchscreens. The handle's - invisible grab strip was only a few pixels wide while the drag-start margin - extended over the neighbouring chart/map — so a finger landing just off the - divider started the resize on an element without `touch-action: none`, and the - browser reclaimed the gesture as a scroll. The grab strip is now wider and the - start margin is aligned to it, so touch drags track all the way. - -### Changed -- **Mobile garage & header polish.** The Garage/Device drawer now covers the - full screen on mobile (it stays at half width on larger screens) so it's - easier to use on a phone. In the loaded-session header, the track/course label - and edit button are consolidated into a single course control — now using a - route icon (at every screen size) with the current track : course as its label - from tablet up. - -## [2.5.1] - 2026-06-13 +### Added +- **Log type bubble in the file browser.** Each session row (shown by date/time) + now carries a small pill with the log's format — Dove, Dovex, XRK, XRZ, + iRacing, VBO, MoTeC, UBX, NMEA, CSV, … — derived from the file's extension, so + you can tell at a glance what kind of log each one is. Appears on local and + cloud rows and in the Profile → Cloud logs list. ### Changed - **Landing page UX overhaul** — the home screen is simpler and friendlier. The @@ -42,6 +29,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 clearly-labelled tile. Pricing is no longer shown on the landing page — it lives on the registration page where you pick a plan. Colors and design tokens are unchanged; this is a layout/usability pass only. +- **Mobile garage & header polish.** The Garage/Device drawer now covers the + full screen on mobile (it stays at half width on larger screens) so it's + easier to use on a phone. In the loaded-session header, the track/course label + and edit button are consolidated into a single course control — now using a + route icon (at every screen size) with the current track : course as its label + from tablet up. + +### Fixed +- **Pro-mode panel resizing on touch.** Dragging a resizable divider (the + left/right split and the InfoBox/MiniMap split in pro mode, plus the video + panel) would stop after only a few pixels on touchscreens. The handle's + invisible grab strip was only a few pixels wide while the drag-start margin + extended over the neighbouring chart/map — so a finger landing just off the + divider started the resize on an element without `touch-action: none`, and the + browser reclaimed the gesture as a scroll. The grab strip is now wider and the + start margin is aligned to it, so touch drags track all the way. ## [2.5.0] - 2026-06-13 diff --git a/CLAUDE.md b/CLAUDE.md index af6f41cb..1c08ec5a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,7 +17,7 @@ 4. **Update credits** (in README) when adding new FOSS dependencies. 5. **Never do on the server what you can do on the client.** 6. **Add tests when possible**: New parsers, pure utilities, and protocol/format logic should ship with Vitest coverage. Bug fixes should add a regression test that fails before the fix. Don't leave testable logic untested. -7. **Keep `CHANGELOG.md` updated**: Add user-facing changes under the `[Unreleased]` heading (Keep a Changelog format) as you make them — don't wait for release time. Cut a new version section + tag when releasing. +7. **Keep `CHANGELOG.md` updated**: Add user-facing changes as you make them — don't wait for release time. **Once a beta version number has been picked (e.g. `2.5.1`), keep that version as the heading and mark it unreleased — `## [2.5.1] - unreleased` — and keep adding every change under that same section until it actually ships. Do NOT create a new `[Unreleased]` block or bump the patch number on every commit; we are not cutting a `.1` release per change.** Only on release do you set the date and tag, then start the next version. (A bare `[Unreleased]` is fine only before any beta version has been chosen.) 8. **Keep it professional**: This is a public, released OSS project (v1.5.0+). Hold the bar — see the standards below. --- @@ -775,6 +775,10 @@ Profile **Cloud logs** panel reuses `SessionBrowser` with its own rows. - **Display name = the session's date/time**, derived from `sessionStartTime` (the first valid sample), e.g. "2/12/2026 11:15 AM" — *not* the upload time or raw filename (filename is the row's `title`/tooltip + the stable IndexedDB key). +- **Log type bubble:** each row shows a `FileTypeBadge` (`components/FileTypeBadge.tsx`) + with the format derived from the file extension (`lib/logFileType.ts`, pure + + unit-tested) — the format isn't persisted, so the extension is the source of + truth. Used on FilesTab local + cloud rows and the Profile Cloud logs panel. - **Smart collapse:** a folder level is only rendered when there's more than one entry — a single track and/or single course auto-descends straight to the logs (the breadcrumb still records the collapsed segments so date names read in diff --git a/src/components/FileTypeBadge.tsx b/src/components/FileTypeBadge.tsx new file mode 100644 index 00000000..31e38232 --- /dev/null +++ b/src/components/FileTypeBadge.tsx @@ -0,0 +1,19 @@ +import { logFileTypeLabel } from "@/lib/logFileType"; + +/** + * A small pill showing a log file's format, derived from its extension. Renders + * nothing when the name has no extension. Used in the file browser rows so each + * session (shown by date/time) still says what kind of log it is. + */ +export function FileTypeBadge({ fileName, className }: { fileName: string; className?: string }) { + const label = logFileTypeLabel(fileName); + if (!label) return null; + return ( + + {label} + + ); +} diff --git a/src/components/drawer/FilesTab.tsx b/src/components/drawer/FilesTab.tsx index 3585195e..0a7c0187 100644 --- a/src/components/drawer/FilesTab.tsx +++ b/src/components/drawer/FilesTab.tsx @@ -11,6 +11,7 @@ import { type BrowserSession, type NavState, } from "@/lib/fileBrowserTree"; import { SessionBrowser } from "@/components/SessionBrowser"; +import { FileTypeBadge } from "@/components/FileTypeBadge"; import { useFileSources, type FileSource, type RemoteFile } from "@/plugins/fileSources"; // Lazy — keeps the BLE module in its own chunk, loaded only on device use. const DataloggerDownload = lazy(() => @@ -257,6 +258,7 @@ export function FilesTab({ >
{s.displayName}
+{s.displayName}
+{formatDate(cf?.uploadedAt)} {cf?.size != null && ` · ${formatBytes(cf.size)}`}