diff --git a/app/favicon.ico b/app/favicon.ico
index 718d6fe..8311faf 100644
Binary files a/app/favicon.ico and b/app/favicon.ico differ
diff --git a/app/globals.css b/app/globals.css
index 01df336..f990fa9 100644
--- a/app/globals.css
+++ b/app/globals.css
@@ -20,6 +20,7 @@
--color-sand: var(--color-sand);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
+ --font-display: var(--font-space-grotesk);
}
body {
@@ -27,3 +28,87 @@ body {
color: var(--color-fg);
font-family: var(--font-sans), Arial, Helvetica, sans-serif;
}
+
+/* Ambient accent glow behind everything — modern dark-UI depth. */
+body::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ z-index: -1;
+ pointer-events: none;
+ background:
+ radial-gradient(60rem 40rem at 15% -10%, color-mix(in oklab, var(--color-accent) 14%, transparent), transparent 70%),
+ radial-gradient(50rem 40rem at 100% 0%, color-mix(in oklab, var(--color-secondary) 45%, transparent), transparent 65%);
+}
+
+/* Display font for all headings. */
+h1,
+h2,
+h3 {
+ font-family: var(--font-display), var(--font-sans), sans-serif;
+ letter-spacing: -0.015em;
+}
+
+/* Tabular figures for stats so numbers line up. */
+.tabular-nums {
+ font-variant-numeric: tabular-nums;
+}
+
+/* Confine Leaflet's internal panes (z-index 400–1000) to their own stacking
+ context so the map never overlaps the sticky navbar. */
+.leaflet-container {
+ z-index: 0;
+}
+
+/* Unified button system. In @layer components so Tailwind utility overrides
+ (e.g. px-8, text-xs, w-full) still win over these base styles. */
+@layer components {
+ .btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 0.375rem;
+ border-radius: 0.75rem;
+ padding: 0.5rem 1rem;
+ font-size: 0.875rem;
+ font-weight: 600;
+ line-height: 1.25rem;
+ white-space: nowrap;
+ cursor: pointer;
+ transition: transform 0.12s ease, background-color 0.15s ease,
+ border-color 0.15s ease, color 0.15s ease, box-shadow 0.15s ease,
+ filter 0.15s ease;
+ }
+ .btn:disabled {
+ opacity: 0.5;
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ .btn-primary {
+ background: var(--color-accent);
+ color: #fff;
+ box-shadow: 0 6px 18px -6px color-mix(in oklab, var(--color-accent) 70%, transparent);
+ }
+ .btn-primary:hover:not(:disabled) {
+ filter: brightness(1.08);
+ transform: translateY(-1px);
+ }
+ .btn-primary:active:not(:disabled) {
+ filter: brightness(0.96);
+ transform: translateY(0);
+ }
+
+ .btn-secondary {
+ background: color-mix(in oklab, var(--color-surface) 55%, transparent);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ color: color-mix(in oklab, var(--color-fg) 88%, transparent);
+ -webkit-backdrop-filter: blur(8px);
+ backdrop-filter: blur(8px);
+ }
+ .btn-secondary:hover:not(:disabled) {
+ border-color: color-mix(in oklab, var(--color-accent) 55%, transparent);
+ color: var(--color-accent);
+ transform: translateY(-1px);
+ }
+}
diff --git a/app/icon.svg b/app/icon.svg
index f013553..96e4f2e 100644
--- a/app/icon.svg
+++ b/app/icon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/app/login/page.tsx b/app/login/page.tsx
index 0567980..8ae2e48 100644
--- a/app/login/page.tsx
+++ b/app/login/page.tsx
@@ -1,36 +1,31 @@
import { signIn } from "@/auth";
+import { Wordmark } from "@/components/wordmark";
export default function LoginPage() {
return (
-
-
- {/* eslint-disable-next-line @next/next/no-img-element */}
-

-
KNUR
-
- Książka Notowań Udźwigów i Rezultatów
-
-
+
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+

+
+
+ Książka Notowań Udźwigów i Rezultatów
+
+
-
+
+
+
);
}
diff --git a/app/running/[id]/page.tsx b/app/running/[id]/page.tsx
index e73192d..bf37d86 100644
--- a/app/running/[id]/page.tsx
+++ b/app/running/[id]/page.tsx
@@ -42,7 +42,7 @@ function buildGrid(maxDistKm: number): number[] {
function RouteMap({ activity }: { activity: RunningActivity }) {
const routePoints = activity.routePoints;
return (
-
+
{routePoints && routePoints.length > 0 ? (
) : (
diff --git a/app/running/page.tsx b/app/running/page.tsx
index 28a5ba3..60bd722 100644
--- a/app/running/page.tsx
+++ b/app/running/page.tsx
@@ -34,7 +34,7 @@ export default async function RunningPage() {
{activity.name}
diff --git a/app/settings/garmin-credentials-form.tsx b/app/settings/garmin-credentials-form.tsx
index ef6e8b6..f069db7 100644
--- a/app/settings/garmin-credentials-form.tsx
+++ b/app/settings/garmin-credentials-form.tsx
@@ -22,7 +22,7 @@ export function GarminCredentialsForm({ savedEmail }: { savedEmail: string | nul
defaultValue={savedEmail ?? ""}
placeholder="twoj@email.com"
required
- className="rounded-md border border-muted/40 bg-bg px-3 py-2 text-sm text-fg placeholder:text-fg/30 focus:border-accent/60 focus:outline-none"
+ className="rounded-md border border-white/10 bg-bg px-3 py-2 text-sm text-fg placeholder:text-fg/30 focus:border-accent/60 focus:outline-none"
/>
@@ -35,7 +35,7 @@ export function GarminCredentialsForm({ savedEmail }: { savedEmail: string | nul
type="password"
placeholder="••••••••"
required
- className="rounded-md border border-muted/40 bg-bg px-3 py-2 text-sm text-fg placeholder:text-fg/30 focus:border-accent/60 focus:outline-none"
+ className="rounded-md border border-white/10 bg-bg px-3 py-2 text-sm text-fg placeholder:text-fg/30 focus:border-accent/60 focus:outline-none"
/>
@@ -49,7 +49,7 @@ export function GarminCredentialsForm({ savedEmail }: { savedEmail: string | nul
diff --git a/app/settings/page.tsx b/app/settings/page.tsx
index f81794d..6db28ce 100644
--- a/app/settings/page.tsx
+++ b/app/settings/page.tsx
@@ -15,7 +15,7 @@ function StatusRow({ label, ok, okLabel = "Skonfigurowano", failLabel = "Brak ko
failLabel?: string;
}) {
return (
-
+
{label}
{ok ? (
@@ -67,14 +67,14 @@ export default async function SettingsPage() {
Konto Garmin Connect
-
+
Synchronizacja z Garmin
-
+
{lastSyncAt
? `Ostatnia synchronizacja: ${formatDate(lastSyncAt)}`
diff --git a/app/strength/[id]/page.tsx b/app/strength/[id]/page.tsx
index a3d0ee6..ce59f8b 100644
--- a/app/strength/[id]/page.tsx
+++ b/app/strength/[id]/page.tsx
@@ -55,7 +55,7 @@ export default async function StrengthWorkoutPage({
{exercisesWithHistory.map(({ exercise }, index) => {
const e1rm = exerciseE1rm(exercise);
return (
-
+
{exercise.name}
{exercise.notes ?
{exercise.notes}
: null}
diff --git a/app/strength/import/import-form.tsx b/app/strength/import/import-form.tsx
index c0867f8..a7cd1b4 100644
--- a/app/strength/import/import-form.tsx
+++ b/app/strength/import/import-form.tsx
@@ -18,12 +18,12 @@ export function ImportForm() {
rows={16}
required
placeholder={"Trening A\nWednesday, 10 June 2026 at 06:40\n\nDeadlift (Barbell)\nSet 1: 80 kg × 8\n..."}
- className="w-full rounded-md border border-muted/40 bg-surface p-3 font-mono text-sm text-fg placeholder:text-fg/30 focus:border-accent focus:outline-none"
+ className="w-full rounded-md border border-white/10 bg-surface/55 shadow-lg shadow-black/10 backdrop-blur-md p-3 font-mono text-sm text-fg placeholder:text-fg/30 focus:border-accent focus:outline-none"
/>
diff --git a/app/strength/page.tsx b/app/strength/page.tsx
index 036a3f4..0581804 100644
--- a/app/strength/page.tsx
+++ b/app/strength/page.tsx
@@ -31,7 +31,7 @@ export default async function StrengthPage() {
Importuj
@@ -52,7 +52,7 @@ export default async function StrengthPage() {
{workout.name}
diff --git a/components/ai-analysis-card.tsx b/components/ai-analysis-card.tsx
index 123c085..2e2b5cc 100644
--- a/components/ai-analysis-card.tsx
+++ b/components/ai-analysis-card.tsx
@@ -19,7 +19,7 @@ export function AiAnalysisCard({ targetType, targetId, analysis }: AiAnalysisCar
);
return (
-
+
@@ -29,7 +29,7 @@ export function AiAnalysisCard({ targetType, targetId, analysis }: AiAnalysisCar
diff --git a/components/dashboard-analysis-card.tsx b/components/dashboard-analysis-card.tsx
index 9bd5d86..4d71f99 100644
--- a/components/dashboard-analysis-card.tsx
+++ b/components/dashboard-analysis-card.tsx
@@ -98,7 +98,7 @@ export function DashboardAnalysisCard({ analyses, runs, workouts }: Props) {
const dayWorkouts = workouts.filter((w) => isSameDay(new Date(w.date), selectedDate));
return (
-
+
@@ -109,7 +109,7 @@ export function DashboardAnalysisCard({ analyses, runs, workouts }: Props) {
@@ -216,7 +216,7 @@ export function DashboardAnalysisCard({ analyses, runs, workouts }: Props) {
@@ -235,7 +235,7 @@ export function DashboardAnalysisCard({ analyses, runs, workouts }: Props) {
diff --git a/components/elevation-chart.tsx b/components/elevation-chart.tsx
index ca62b8b..7616d3d 100644
--- a/components/elevation-chart.tsx
+++ b/components/elevation-chart.tsx
@@ -31,7 +31,7 @@ export function ElevationChart({ data, syncId }: Props) {
useEffect(() => setMounted(true), []);
if (!mounted) {
- return ;
+ return ;
}
const altitudes = data.map((p) => p.altM);
@@ -46,15 +46,15 @@ export function ElevationChart({ data, syncId }: Props) {
const pacePad = Math.max(5, Math.round((maxPace - minPace) * 0.15));
const tooltipStyle = {
- background: "var(--color-bg)",
- border: "1px solid var(--color-muted)",
- borderRadius: 8,
+ background: "color-mix(in oklab, var(--color-surface) 92%, transparent)",
+ border: "1px solid rgba(255,255,255,0.12)",
+ borderRadius: 12,
fontSize: 12,
color: "var(--color-fg)",
};
return (
-
+
Profil wysokości
{hasPace && (
@@ -73,7 +73,7 @@ export function ElevationChart({ data, syncId }: Props) {
-
+
+
{icon ?
{icon}
: null}
{title}
{description ?
{description}
: null}
{action ? (
{action.label}
diff --git a/components/exercise-progress-chart.tsx b/components/exercise-progress-chart.tsx
index 890b365..86634ca 100644
--- a/components/exercise-progress-chart.tsx
+++ b/components/exercise-progress-chart.tsx
@@ -34,22 +34,22 @@ export function ExerciseProgressChart({ name, data }: ExerciseProgressChartProps
if (!mounted) {
return (
-
-
-
+
);
}
return (
-
+
{name}
-
+
setMounted(true), []);
if (!mounted) {
- return ;
+ return ;
}
return (
-
+
Balans kontaktu
@@ -53,7 +53,7 @@ export function GcbChart({ data, syncId }: Props) {
-
+
-
+
{text}
diff --git a/components/load-route-button.tsx b/components/load-route-button.tsx
index f1a4630..ab2a71f 100644
--- a/components/load-route-button.tsx
+++ b/components/load-route-button.tsx
@@ -16,7 +16,7 @@ export function LoadRouteButton({ activityId }: { activityId: string }) {