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 -

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 +

+
-
{ - "use server"; - await signIn("keycloak", { redirectTo: "/" }); - }} - > - -
+ + +
); } 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 }) {