Claude/kind ptolemy 9 mvh0 - #42
Open
fpudelko wants to merge 425 commits into
Open
Conversation
fpudelko
force-pushed
the
claude/kind-ptolemy-9Mvh0
branch
2 times, most recently
from
June 8, 2026 11:51
4da9553 to
8ddcd4f
Compare
- Header: turniej (Cup) ukryty za flagą SHOW_CUP=false
- VenueExplorer: na starcie zachowaj szeroki widok powiatu,
nie przybliżaj do pierwszego boiska
- wydarzenia: geokodowanie adresu biasowane do Poznania +
komunikat "nie znaleziono"
- wydarzenia/[id]: nagłówek graczy "Gracze · X z Y · Z wolnych",
gracze spoza apki opisani "dodanych przez {organizator}"
https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Nowy komponent EventListCard używany na /wydarzenia i na ekranie głównym (zalogowany) — spójny wygląd "jak w szukaj gry" - Karta: badge "za Xh" w rogu, chip formatu "⚽ Piłka 6v6", chip ceny, pasek zapełnienia + "X z Y graczy", przycisk Dołącz - Filtry sportów: pill "Wszystkie" + okrągłe chipy emoji (zamiast siatki kwadratów) — jak na mocku https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Migracja 034: kolumna is_goalkeeper w event_participants - joinEvent przyjmuje asGoalkeeper; typ EventParticipant + mapowanie - Ekran gry: przycisk "🧤 Dołącz jako bramkarz" (tylko piłka nożna), badge 🧤 BR w składzie, wskaźnik "Szukamy bramkarza / Bramkarz jest" https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Strona główna: niezalogowani widzą listę publicznych meczów (sekcja "Otwarte gry" pod hero); zalogowani mają "Twoje gry" nad listą otwartych - /wydarzenia: usunięty filtr dzielnic i chip "Wszystkie" (brak wyboru = wszystkie sporty); zostają okrągłe chipy emoji - Header: "Moje gry" i "Stałe gierki" jako wyraźne kafelki w menu mobilnym + link "Stałe gierki" w nawigacji desktop - Usunięty podpis "(Enter, aby wysłać)" w komentarzach https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- AnnouncementBar i TrustBar: SHOW_CUP=false ukrywa pasek i link turnieju - Migracja 035: kolumna allow_guest_adds w events + zaktualizowana polityka RLS na event_participants — zalogowany użytkownik może dodać gościa gdy flaga = true - EventItem.allowGuestAdds + setAllowGuestAdds() w lib/events - Ekran gry: organizator włącza/wyłącza "zapraszanie gości" jednym przyciskiem - Uczestnicy (nie-organizatorzy) widzą formularz "Dodaj znajomego" gdy flaga włączona - Atrybuacja "dodany przez" w liście składu organizatora działa bez zmian https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- moje-gry: odwołane mecze trafiają do zakładki Historia, nie Nadchodzące - Główna "Twoje gry": odwołane mecze nie pokazują się w nadchodzących - Nowy opis hero (zalogowany i niezalogowany): "Organizuj grę ze znajomymi, znajdź brakujących graczy i dołączaj do otwartych meczów" https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- externalUrl(): dodaje https:// do zeskrobanych adresów bez protokołu, dzięki czemu link otwiera się zewnętrznie zamiast nawigować w apce - Zastosowane w kartach mapy i szczegółach obiektu - MapAttribution: usuwa domyślny prefix "Leaflet 🇺🇦" (flaga Ukrainy), zachowując wymaganą atrybucję danych OSM/Mapbox; dodane do wszystkich map https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Usuń mockup z hero (zdjęcie telefonu); layout wycentrowany - isEventJoinable(): filtruj gry po dacie I godzinie — gry już rozpoczęte nie pokazują się w Otwartych grach ani na głównej - Migracja 036: kolumna invite_only w events + tabela event_invites (token, email, accepted_at, RLS) - lib/invites.ts: getEventInvites, createInvite, deleteInvite, validateInviteToken, acceptInvite, openInviteMailto (mailto: fallback) - Ekran gry (org): pełna sekcja Zaproszeń — dodaj email → otwiera klienta pocztowego z gotową wiadomością + lista zaproszeń ze statusem - Ekran gry: invite_only blokuje przycisk dołączenia bez ważnego tokenu; token w URL (?token=...) automatycznie walidowany przy wejściu - Kreator nowego meczu krok 3: toggle "Tylko dla zaproszonych" - Zarządzaj wydarzeniem: toggle invite_only + toggle allow_guest_adds - Usunięto RemindersSection (SMS gateway niedostępny) - seed-events.sql: skrypt do zasilenia bazy testowymi wydarzeniami https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Wszystkie modalne: max-h-[90vh] overflow-y-auto — nie wychodzą poza ekran - Roster: min-w-0/truncate/responsive max-width — nazwiska nie łamią layoutu - Hero: text-3xl mobile, stats xs/gap responsive, label 'sporty' zamiast 'dyscypliny' - gray→slate: spójny slate-* w sekcji zaproszeń i liście składu - Clipboard copy link: toast error gdy kopiowanie nie powiedzie się - Organizer avatar: bezpieczny dostęp [0]?. gdy organizerName pusty https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…irrelevant venues - VenueExplorer: sport/venueType state changed from string to string[], remove onlyBookable - Multi-select dropdowns don't close on click; "Wszystkie" clears selection - isRelevantVenue() applied on load — filters out gyms, tennis, karting - Sports emoji fallback changed from 🏅 to 🏟️ (sports.ts + mapIcons.ts) - Homepage: add Mapa boisk link below open games in logged-out view https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…aser - Standardize all gray-* Tailwind classes to slate-* across entire frontend - moje-gry: track load error state + show error UI with retry button - No more console.error swallowed silently https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…esses - EventListCard: show "Twój mecz"/"Zapisany"/"Rezerwa" instead of "Dołącz" when the user already organizes or joined — never invite re-joining - Wire relation through Twoje gry, Otwarte gry (home) and the events list - Organizer panel: move signup/privacy settings behind a collapsible "Ustawienia" section with clear on/off switches showing current state (was action-buttons whose label flipped on each click) - New eventLocation() helper: never show a bare street number as the place name — fall back to address, district, then a generic Poznań label https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…con 404s - Add "Mapa boisk" button to the hero CTA (logged-out) and dashboard header (logged-in) - Event detail: the whole "Zarządzaj wydarzeniem" panel (privacy/signup switches, cancel, delete) is now hidden until the organizer clicks "Edytuj", so it no longer clutters the page or invites accidental clicks - Remove metadata icon/OG references to files that don't exist in /public (favicon.svg, apple-touch-icon.png, opengraph-image) — they 404'd in the console on every page; the favicon stays inlined as a data-URI in <head> - Rewrite seed-events.sql: creates ~48 fake users + events across the next two weeks and enrolls the users (some games full, some with reserves); idempotent, cleanup via the @seed.bojo email domain https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- New lib/features.ts: single source of truth for hidden functionality (SHOW_CUP, SHOW_GAME_ALERTS, SHOW_SMS_FEATURES) - Hide "Ustaw alert" everywhere (home feed + empty state) — no delivery channel yet, so it would over-promise; empty state now nudges "Stwórz mecz" - Hide SMS confirmation toggle + reminders section in the event edit form - NotificationBell empty-state copy no longer points at the hidden alert feature - Centralize the duplicated SHOW_CUP consts into features.ts - BACKLOG.md: documents every hidden feature, dead code, pending task, the tournament TODO and unused ideas so nothing gets forgotten https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…ipants event_participants has a plain index on (event_id, user_id), not a UNIQUE constraint, so ON CONFLICT (event_id, user_id) raises 42P10. Use WHERE NOT EXISTS guards instead — same dedup semantics, no constraint required. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Dropped the boisk/gier dziś/sporty counter strip from the marketing hero — the numbers were low at launch and felt more distracting than reassuring. The venue count fetch is also removed. The "Mapa boisk" button is already present next to Znajdź grę / Stwórz mecz. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- Map: multi-select sport/type filters, remove Rezerwacja pill - Audit: slate-* colors, error state fixes, homepage map teaser - Event UX: relation-aware CTA (organizer/going/reserve/join), clearer settings - Landing: Mapa boisk CTA, organizer settings behind Edytuj, fix 404 icons - Feature flags: centralize in lib/features.ts (SHOW_CUP/GAME_ALERTS/SMS) - BACKLOG.md: document hidden features and future ideas - Hero: remove stats bar - Seed: fix ON CONFLICT → WHERE NOT EXISTS for event_participants https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Replaced side-by-side title+buttons layout in DashboardHeader with title on top and 3 full-width buttons below (Znajdź grę / Stwórz mecz / Mapa boisk). On sm+ they sit in a row. Fixes cramped look on iPhone. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Removed amber primary button - all CTAs now use the same outline/glass style for visual consistency. Buttons always display in a row (no more flex-col on mobile) on both marketing hero and dashboard header. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…cipatedEvents
Both queries used select('*') which omits the participants relation,
causing participantsCount to be undefined (shown as 0/N) in EventListCard.
Added event_participants(id, is_reserve) join to match getPublicEvents.
https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…n no custom title When no custom title: heading shows "⚽ Piłka nożna 6v6" and the sport badge is hidden (info already in the title). When a custom title exists: title stays as-is and the sport badge "⚽ Piłka 6v6" appears below it. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Replaces "Znajdź grę na dziś wieczór" on both marketing hero and dashboard header. Warmer, less time-of-day specific. https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- EventListCard: usunięte badge "Twój mecz"/"Zapisany"/"Rezerwa", zastąpione subtelnym lewym borderkiem; cena przeniesiona do pierwszego wiersza obok tytułu; układ 3-wierszowy (tytuł+cena / data+miejsce / pasek gracze) - HomeHero: QuickLinks (2 kafelki) zastąpione MapTeaser — wizualny podgląd mapy z gridowaniem i pinami - DashboardHeader: 3 przyciski → 2 (główny "Stwórz mecz" + poboczny "Znajdź grę") https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
- MarketingHero: usunięte nazwane chipsy sportów i przycisk "Mapa boisk"; CTA do 2 (Znajdź grę / Stwórz mecz); krótszy podtytuł bez powtórzeń "w okolicy" - DashboardHeader: usunięty zdublowany podtytuł - OpenGamesSection: usunięty filtr sportów (dublował chipsy); limit 8 → 5 gier - widok wylogowany: gadatliwy link mapy → wspólny MapTeaser - page.tsx: usunięta sekcja "Następna gierka jest blisko" (dublowała hero CTA i listę gier) https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…aściciela - inline "Edytuj" przy organizatorze pokazuje się wyłącznie twórcy meczu (isOwner), nie adminom - usunięty jednoklikowy przycisk "Dołącz jako bramkarz" - "Dołącz"/"Lista rezerwowa" otwierają dialog potwierdzenia: wybór roli (zawodnik/bramkarz dla piłki), koszt i przycisk "Zapisz mnie" — chroni przed przypadkowym zapisem https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Dashboard (zalogowani): - usunięte przyciski "Stwórz mecz"/"Znajdź grę" z nagłówka - tytuły sekcji: "Twoje najbliższe gry", "Najbliższe otwarte gry" (większa czcionka) Strona wydarzenia: - panele "Zarządzaj składem", "Zarządzaj wydarzeniem", rezerwy, zaproszenia, podział kosztów, przywracanie — gated przez isOwner (twórca), nie isOrganizer (admini nie widzą już zarządzania na cudzych meczach) - usunięte wysyłanie zaproszeń mailem (zostaje udostępnianie linku) - usunięte losowanie składów (wraz z helperami shuffle/splitTeams) https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
…a rotacja badge'a Peek telefonu w hero: 72px -> 40px. Rezerwa w .hero-first-screen (globals.css) z 10rem na 8rem — zależność zmierzona empirycznie (peek rośnie/maleje liniowo o 16px na każdy rem), nie wyliczona z głowy: teraz widać tylko zaokrąglony górny brzeg obudowy, nie cały wiersz nagłówka. Rząd zaufania w hero dostaje ten sam wygląd co w LandingFinalCta (dół strony) — ikony ✓ zamiast kropek, czytelniejszy. Oba miejsca korzystają teraz z jednego komponentu (TrustRow.tsx), żeby się nie rozjechały: gap-x-2 zamiast oryginalnego gap-x-4 z FinalCta, bo hero ma węższą kolumnę — sam gap-x-4 łamał się na 360px. Zmierzone: jedna linia od 360px w górę. Przy okazji: kontrast tekstu w FinalCta z white/55 na white/70 (ujednolicone z hero, zgodnie z wcześniejszą poprawką WCAG). RotatingBadge: rotacja co 3,5s -> 1,5s, na prośbę użytkownika. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSqk41f8uig8fQMSh88uub
…podem text-[2rem] -> text-[3.3rem] na mobile, leading 1.08 -> 1.05, twardy <br /> zamieniony na naturalne zawijanie (br staje się realnym łamaniem linii dopiero od sm: — desktop/tablet zachowuje oryginalny układ 2-liniowy). 3.3rem to największy rozmiar, który wciąż mieści się w 3 liniach na najwęższym telefonie z zakresu (360px) — dobrany pod najciaśniejszy przypadek, nie pod konkretne urządzenie zgłaszającego, więc na szerszych ekranach wygląda tylko swobodniej, nigdy nie łamie się na 4 linie. Kluczowe: .hero-first-screen wyrównuje CAŁĄ kolumnę (badge...trust) do dołu jako jedną grupę, więc powiększenie H1 zjada wyłącznie wolną przestrzeń NAD nim — wszystko od leada w dół zostaje w dokładnie tym samym miejscu. Zmierzone piksel-w-piksel: pozycje leada, przycisku CTA, rzędu zaufania i telefonu identyczne przed i po zmianie. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSqk41f8uig8fQMSh88uub
Landing i dashboard: zwrot na organizatora, zasięg ogólnopolski
text-[3.3rem] (3 linie) -> text-[2.5rem] (2 linie, twardy <br /> wraca). Zbyt duży H1 z poprzedniej poprawki zjadał za dużo miejsca na pierwszym ekranie. 2.5rem to eksperymentalnie znaleziony maksymalny rozmiar, przy którym tekst wciąż mieści się w 2 liniach na najwęższym telefonie z zakresu (360px) — próg łamania na 3 linie zaczyna się dokładnie od 2.52rem. Układ pod H1 znów bez zmian, zmierzone piksel w piksel względem stanu sprzed tej poprawki: lead, przycisk CTA, rząd zaufania i telefon zostają w dokładnie tych samych pozycjach — .hero-first-screen wyrównuje całą kolumnę do dołu jako jedną grupę, więc zmiana rozmiaru H1 zjada wyłącznie przestrzeń nad nim. Branch startuje od zmergowanego mastera (PR #72 już scalony) — nowy PR zamiast dopisywania do zmergowanej gałęzi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LSqk41f8uig8fQMSh88uub
fix: H1 w hero na mobile — 2 linie zamiast 3, mniejszy niż w PR #72
… claude/match-page-pr-review-udtrxx # Conflicts: # docs/llm-context.md # frontend/public/llm-context.md
Bloki z przyciskami "Zawodnik z pola" / "Bramkarz" przy dopisywaniu gościa miały wcięcie przesunięte o 2 spacje względem otaczającego JSX. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Gu3t6mXHrLq5jz7pJJfxs
Strona meczu: drobnica UI (11 poprawek)
- /prywatnosc i /regulamin: usuń banner "to tylko szablon prototypu", wypełnij placeholdery [nazwa podmiotu]/[adres], popraw sprzeczności (bojo.app -> bojo.pl, zasięg, limit odpowiedzialności vs bezpłatność), dopisz brakujące elementy RODO i regulaminu (ograniczenie przetwarzania, transfer poza EOG, cookies, reklamacje, odstąpienie). Dane usługodawcy w lib/legal.ts. - Kreator meczu (/wydarzenia/nowe): numerki kroków są klikalne i walidują jak "Dalej" (lib/eventWizard.ts, pod testy); jeden przyklejony pasek "Wróć"/"Dalej" w jednej linii zamiast dwóch osobnych przycisków na krok; dolny panel nawigacji chowa się w kreatorze. - Dolny panel chowa się też na stronie meczu, dopóki użytkownik nie dołączył (lib/bottomNavVisibility.tsx) - nie zasłania już przycisków "Dołącz"/"Obserwuj" ani modali. Usunięty zdublowany przycisk "+" na /wydarzenia, "Gry" -> "Znajdź grę". - Zaproszenia na mecz: nowa zakładka "Zaproszenia" na /moje-gry (?tab=zaproszenia) i plakietka z licznikiem na /wydarzenia, widoczna tylko gdy jest co najmniej jedno zaproszenie. Wspólny hook lib/useMyInvites.ts i komponent InviteList współdzielony z dashboardem. Co zostało celowo bez zmian: auto-awans z rezerwy, migracje SQL, lib/invites.ts (martwy kod, nie ruszany). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0116k4YFHqdjsCVYUtChQThB
…-flow-y282kw Event wizard UX: clickable steps, sticky nav, invites tab
Naprawa buildu produkcyjnego (master jest zepsuty)
… karty przy dlugim tytule
…overflow Dwie naprawy z testów: zaproszenia od uczestnika + rozjeżdżające się karty
Import boisk z OSM: lubelskie na próbę, nazwy z kontekstu, zero AI
Karuzela na mapie nad nawigacją + domyślny skład zależny od sportu
Import OSM: wybór bramki publikacji + odmiana w nazwach miejscowości
Agent sam merguje swój PR po zielonym CI
Mapa bez zaszytego Poznania + skrypt publikujący lubelskie
Zamiast przeklejac wyniki SQL z Supabase: read-only skrypt, ktory odtwarza zapytanie getExplorerFields() warunek po warunku i wypisuje lejek do logu GitHub Actions. Sekrety juz tam sa, agent nie potrzebuje wlasnego dostepu do bazy. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
chore: diagnostyka — czemu obiektów z lubelskiego nie widać na mapie
Diagnostyka (workflow 'Diagnoza mapy') potwierdzila, ze dane sa w porzadku: 1638 obiektow lubelskiego przechodzi filtr mapy. Nie bylo ich widac, bo MapContainer startowal na sztywno z center=POZNAN i zoom=11. - widok startowy: cala Polska (POLSKA / POLSKA_ZOOM w mapIcons.ts) - przycisk pinezki w rogu mapy pyta o geolokalizacje i skacze na okolice uzytkownika; zgoda pytana dopiero po kliknieciu - 'wielofunkcyjne' (OSM sport=multi) dopisane do EXPLORER_SPORTS i SPORT_CONFIG - 162 obiekty w samym lubelskiem odpadaly po cichu Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
Build produkcyjny na Vercelu ciagnal sie ponad 40 minut i nie konczyl,
wiec poprzednia zmiana mapy w ogole nie doszla na produkcje.
Przyczyna: generateStaticParams() zwracalo slug KAZDEGO boiska, a
resolveField() po slugu robilo select('*') na calej tabeli fields - raz
w generateMetadata i raz w komponencie. Koszt rosl kwadratowo: ~1500
obiektow (Poznan) jeszcze przechodzilo, ~4600 po imporcie z OSM juz nie.
- generateStaticParams() zwraca [], revalidate = 86400 -> strona boiska
powstaje przy pierwszym wejsciu i siedzi w cache przez dobe
- slug -> id przez wspolny indeks z TTL zamiast pelnego selecta na render
Czas builda przestaje zalezec od wielkosci katalogu - warunek dojscia do
dziesiatek tysiecy obiektow z calej Polski.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017dvpk3tbb8nsot5XNTaS8C
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.