Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ 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.

## [2.8.1] - unreleased
## [2.9.0] - 2026-06-22

### Added
- **Password strength rules + a realtime checker on sign-up.** The registration
Expand Down Expand Up @@ -67,6 +67,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
screen) instead of always jumping to the home screen.

### Changed
- **Open-source links moved into About.** The GitHub repository links left the
landing page and now live in the About dialog under "Free & Open Source", above
the feature list. The About feature list was also refreshed with the headline
additions from the last month (7 languages, native Android app + MyChron Wi-Fi
download, phone-as-logger GPS timing, optional cloud sync, AI driving coach).
- **Logger picker polish.** Real product photos replace the placeholder art, and
the picker is now mobile-friendly: compact horizontal cards on phones (instead of
full-height ones that filled the screen), a height cap so it scrolls within the
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "doves-dataviewer",
"private": true,
"version": "2.8.1",
"version": "2.9.0",
"description": "Open-source, offline-first motorsport telemetry viewer (Dove's DataViewer / LapWing).",
"license": "GPL-3.0-or-later",
"author": "TheAngryRaven",
Expand Down
29 changes: 28 additions & 1 deletion src/components/AboutDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
import { Info } from "lucide-react";
import { Info, Github } from "lucide-react";
import { useTranslation, Trans } from "react-i18next";
import { Button } from "@/components/ui/button";
import {
Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger,
} from "@/components/ui/dialog";
import { interceptExternal } from "@/lib/platform";

// Section ids — order is the display order; the heading/body text lives in the
// `landing` locale (about.sections.<id>).
const SECTION_IDS = ["offline", "data", "community", "oss"] as const;

// Open-source repositories — shown under the "Free & Open Source" section. Repo
// names are proper nouns, intentionally not translated.
const GITHUB_LINKS: Array<{ href: string; label: string }> = [
{ href: "https://github.com/TheAngryRaven/DovesDataViewer", label: "DataViewer" },
{ href: "https://github.com/TheAngryRaven/DovesDataLogger", label: "Datalogger" },
{ href: "https://github.com/TheAngryRaven/DovesLapTimer", label: "Timer Library" },
{ href: "https://github.com/TheAngryRaven/DataViewer_coach", label: "Coach Plugin" },
];

export function AboutDialog() {
const { t } = useTranslation("landing");
const features = t("about.features", { returnObjects: true }) as string[];
Expand Down Expand Up @@ -39,6 +49,23 @@ export function AboutDialog() {
</div>
))}

{/* Source repos — sits with the open-source section, above the feature list. */}
<div className="flex flex-wrap items-center gap-x-4 gap-y-2">
{GITHUB_LINKS.map((link) => (
<a
key={link.href}
href={link.href}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => interceptExternal(e, link.href)}
className="inline-flex items-center gap-1.5 text-muted-foreground hover:text-foreground transition-colors"
>
<Github className="w-4 h-4" />
<span className="text-xs">{link.label}</span>
</a>
))}
</div>

<div className="border-t border-border pt-4 mt-4">
<h3 className="font-semibold text-foreground mb-2">{t("about.featuresHeading")}</h3>
<div className="grid grid-cols-1 sm:grid-cols-2 gap-x-4 gap-y-1.5 text-xs">
Expand Down
27 changes: 0 additions & 27 deletions src/components/LandingPage.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { Fragment } from "react";
import {
Github,
Heart,
Shield,
Play,
Expand Down Expand Up @@ -52,13 +51,6 @@ interface LandingPageProps {
enableCloud: boolean;
}

const GITHUB_LINKS: Array<{ href: string; label: string }> = [
{ href: "https://github.com/TheAngryRaven/DovesDataViewer", label: "DataViewer" },
{ href: "https://github.com/TheAngryRaven/DovesDataLogger", label: "Datalogger" },
{ href: "https://github.com/TheAngryRaven/DovesLapTimer", label: "Timer Library" },
{ href: "https://github.com/TheAngryRaven/DataViewer_coach", label: "Coach Plugin" },
];

/**
* The pre-data-load home screen shown by Index.tsx when no telemetry file is
* loaded. The layout is deliberately simple: a large drag-and-drop dropzone
Expand Down Expand Up @@ -283,25 +275,6 @@ export function LandingPage({
<ContactDialog variant="header" />
</div>

{/* Open-source repos — web only; the native shell drops outbound GitHub links. */}
{!native && (
<div className="flex flex-wrap items-center justify-center gap-x-8 gap-y-3">
{GITHUB_LINKS.map((link) => (
<a
key={link.href}
href={link.href}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => interceptExternal(e, link.href)}
className="inline-flex items-center gap-2 text-muted-foreground hover:text-foreground transition-colors"
>
<Github className="w-4 h-4" />
<span className="text-sm">{link.label}</span>
</a>
))}
</div>
)}

{enableAdmin && isAdmin && (
<div className="flex items-center justify-center gap-6 flex-wrap">
<button
Expand Down
7 changes: 6 additions & 1 deletion src/locales/de/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"Editor für eigene Strecken & Kurse mit Community-Einsendungen",
"Lokale Wetterabfrage",
"Dunkel- & Hell-Modus",
"PWA — installierbar & vollständig offline"
"PWA — installierbar & vollständig offline",
"In 7 Sprachen verfügbar",
"Native Android-App – WLAN-Download vom AiM MyChron",
"Smartphone als Logger – GPS-Rundenzeiten ohne Zusatzhardware",
"Optionale Cloud-Synchronisierung über deine Geräte (kostenlose Stufe)",
"KI-Fahrcoach (optionales Add-on)"
]
},
"supportedFiles": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/en/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,12 @@
"Custom track & course editor with community submissions",
"Local weather lookup",
"Dark & light mode",
"PWA — installable & fully offline"
"PWA — installable & fully offline",
"Available in 7 languages",
"Native Android app — Wi-Fi download from AiM MyChron",
"Phone-as-logger — GPS lap timing with no extra hardware",
"Optional cloud sync across your devices (free tier)",
"AI driving coach (optional add-on)"
]
},
"fileImport": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/es/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"Editor de pistas y circuitos personalizados con envíos comunitarios",
"Consulta meteorológica local",
"Modo oscuro y claro",
"PWA: instalable y totalmente sin conexión"
"PWA: instalable y totalmente sin conexión",
"Disponible en 7 idiomas",
"App nativa de Android: descarga por Wi-Fi desde AiM MyChron",
"El teléfono como registrador: cronometraje por GPS sin hardware extra",
"Sincronización en la nube opcional entre tus dispositivos (nivel gratuito)",
"Entrenador de pilotaje con IA (complemento opcional)"
]
},
"supportedFiles": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/fr/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"Éditeur de circuits et de parcours personnalisés avec soumissions communautaires",
"Consultation de la météo locale",
"Mode sombre et clair",
"PWA — installable et entièrement hors ligne"
"PWA — installable et entièrement hors ligne",
"Disponible en 7 langues",
"App Android native — téléchargement Wi-Fi depuis AiM MyChron",
"Téléphone comme enregistreur — chronométrage GPS sans matériel supplémentaire",
"Synchronisation cloud optionnelle entre vos appareils (offre gratuite)",
"Coach de pilotage IA (option payante)"
]
},
"supportedFiles": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/it/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"Editor di piste e circuiti personalizzati con invii della community",
"Consultazione meteo locale",
"Modalità scura e chiara",
"PWA — installabile e completamente offline"
"PWA — installabile e completamente offline",
"Disponibile in 7 lingue",
"App Android nativa — download Wi-Fi da AiM MyChron",
"Telefono come logger — cronometraggio GPS senza hardware aggiuntivo",
"Sincronizzazione cloud opzionale tra i tuoi dispositivi (piano gratuito)",
"Coach di guida con IA (componente aggiuntivo opzionale)"
]
},
"supportedFiles": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/ja/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"コミュニティ送信付きのカスタムトラック・コースエディター",
"ローカル天気の取得",
"ダーク&ライトモード",
"PWA — インストール可能で完全オフライン"
"PWA — インストール可能で完全オフライン",
"7 言語に対応",
"ネイティブ Android アプリ — AiM MyChron から Wi-Fi でダウンロード",
"スマホをロガーに — 追加ハードウェア不要の GPS ラップタイム計測",
"デバイス間の任意のクラウド同期(無料プラン)",
"AI ドライビングコーチ(オプションのアドオン)"
]
},
"supportedFiles": {
Expand Down
7 changes: 6 additions & 1 deletion src/locales/pt-BR/landing.json
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,12 @@
"Editor de pistas e circuitos personalizados com envios da comunidade",
"Consulta de clima local",
"Modo escuro e claro",
"PWA — instalável e totalmente offline"
"PWA — instalável e totalmente offline",
"Disponível em 7 idiomas",
"App nativo de Android — download por Wi-Fi do AiM MyChron",
"Celular como logger — cronometragem por GPS sem hardware extra",
"Sincronização na nuvem opcional entre seus dispositivos (plano gratuito)",
"Treinador de pilotagem com IA (complemento opcional)"
]
},
"supportedFiles": {
Expand Down
Loading