Commit graph

11 commits

Author SHA1 Message Date
oskar de10b94bd9 Archiwum ofert spoza paczki + wyjazd.md na termin 6–13.02.2027
dom-dla-grupy i alpenparks-rehrenberg zostają w bazie jako karty
ARCHIWALNE: riscercz 08.2026 objął tylko obiekty z paczki, więc ich ceny
i dostępność opisują poprzedni termin (16–23.01) i dziś wprowadzałyby
w błąd. Oznaczone `priorytet: ARCHIWALNA (poza paczką 08.2026)` +
`archiwalna_od`, z ostrzeżeniem na górze body. Wypadają z tabeli
porównawczej i ze statusów dostępności (osobna sekcja Archiwum).

wyjazd.md przepisany od zera na nowy termin:
- tabela porównawcza czterech regionów z nowymi budżetami
- tabela dostępności 10 ofert z legendą //🔍 i bilansem
  (1 zweryfikowany status, i to negatywny — 9 do weryfikacji)
- nowe wnioski przekrojowe (Kronplatz najlepiej znosi termin,
  Saalbach traci przewagę cenową, Ischgl konkurencyjny z Kappl,
  SFL bez styczniowej przewagi)
- nowa sekcja "Plan B na wypadek pełnego tygodnia" (13–20.02
  i 27.02–06.03 na podstawie zweryfikowanego kalendarza Glemm Lodge)

Usunięte jako nieaktualne: wniosek o przewadze cenowej SFL (styczeń
= ich niski sezon), ranking ofert wyceniony po stawkach styczniowych,
rekomendacja terminu 16–23.01 i alternatywy 9–16.01.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:57:09 +02:00
oskar d9aa985250 Restrukturyzacja do symetrii: region.md i oferty/ → saalbach/
Cztery regiony w jednym schemacie <region>/region.md + <region>/oferty/*.md.
Saalbach przestaje być wyjątkiem w korzeniu bundle'a.

- git mv region.md → saalbach/region.md, oferty/ → saalbach/oferty/
- linki bundle-relative przepisane: /region.md → /saalbach/region.md,
  /oferty/* → /saalbach/oferty/*
- nowy saalbach/index.md wg §6, symetryczny do ischgl/kronplatz/sfl

Zdjęcia obiektów przetrwały bez zmian: mapowanie oferta→zdjęcia jest
kluczowane po polu `id` we frontmatterze (pages/img/<id>/), nie po
ścieżce pliku — gen_images.py:121,390 i gen_pages.py:695-709.
Region "Saalbach" w gen_pages.py bierze się z dirname konceptu, więc
przejście "" → "saalbach" obsługuje się samo.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 09:47:58 +02:00
oskar f913a8af53 Stopka: dyskretne "powered by gethumanai.pl" na każdej stronie i w grafie
W _page_shell dopisek idzie do istniejącej stopki, tym samym małym
wyciszonym fontem co nota o generatorze. Viewer grafu stopki nie ma (main
wypełnia okno), więc w gen_viz.py dopisek ląduje w nagłówku obok "OKF
bundle", w tej samej klasie .muted — przez łatkę na _load_template, tak
samo jak dotychczasowa łatka na viz.js: repo upstream zostaje nietknięte,
a brak kotwicy przerywa regenerację zamiast po cichu gubić dopisek.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:52:23 +02:00
oskar 10384662b4 start.html: kafel "Wszystkie linki" pod własną nazwą, kafle 2×2
Kafel do /pages/linki.html był już czwarty w rzędzie, ale pod etykietą
"Linki do wysłania" — nazwa z ustaleń to "Wszystkie linki". Przy czterech
kaflach siatka auto-fit łamała się 3+1 i czwarty zostawał sam w wierszu;
minimum kolumny podniesione z 13rem do 16rem układa je 2×2, a na telefonie
i tak jest jedna kolumna.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:41:16 +02:00
oskar 0d0acdb3a4 pages/linki.html: spis wszystkich adresów wystawki do wysłania
Nowa strona z pełnymi URL-ami wszystkich 24 stron na https://narty27.kapala.org
(BASE_URL — jedyne miejsce z domeną w kodzie), w sekcjach: Wejście, Regiony,
Oferty per region z priorytetem PLAN A/B z frontmattera, Pozostałe. Każda
pozycja to klikalny link, widoczny adres tekstem do skopiowania i krótki opis.

Lista powstaje z tych samych danych co porownanie.html i start.html —
regiony z wyjazd.md, oferty z katalogów i frontmatterów, "Pozostałe" to
koncepty, których nie złapała żadna wcześniejsza sekcja. Nowa oferta wpada
na listę sama przy regeneracji.

Przyciski "Kopiuj wszystkie" (plain text: nazwa sekcji + adresy) i "Kopiuj
link startowy"; navigator.clipboard z odwrotem na zaznaczenie, bo po http
z adresu IP nie ma bezpiecznego kontekstu. Do nawigacji każdej strony
i na start.html doszła pozycja "Linki".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:37:14 +02:00
oskar 8f1557e736 Przeprojektowanie pod decyzję: start.html, porownanie.html, galerie
Wejściem jest teraz landing pages/start.html (trzy kafle: porównanie ofert,
analiza wariantów, graf + kafle czterech regionów ze zdjęciem najlepszej
oferty w tle), a graf schodzi do roli załącznika. start.html linkuje
root-absolutnie, bo ten sam plik jest serwowany jako /index.html i jako
/pages/start.html.

pages/porownanie.html: jedna tabela wszystkich 12 ofert prosto z
frontmatterów (miniatura, priorytet, region, ceny, status, odległość, www),
sortowanie klikiem w nagłówek (czysty JS, bez zależności), wiersze barwione
statusem ceny. Nad tabelą podsumowanie per region — budżet całkowity i jeden
wniosek parsowane z tabeli i „Wniosków przekrojowych” w wyjazd.md, bez
zaszywania nazw regionów w kodzie.

Karty ofert dostały galerię (duże zdjęcie + miniatury, lazy loading),
a nawigacja na każdej stronie prowadzi do startu i porównania.
Komenda deployu (kopiuje start.html jako /content/index.html) jest
wypisywana przez gen_pages.py. Pliki .md bez zmian, check_okf zielony.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:24:25 +02:00
oskar ddc2ed0c54 Zdjęcia obiektów: gen_images.py + 40 zdjęć dla 8 z 12 ofert
Skrypt pobiera 3–5 zdjęć ze strony z pola `www` frontmattera: og:image,
potem galeria z HTML-a. Odsiew: nazwa pliku (logo/ikona/mapa), waga >30 KB,
proporcje, przezroczystość i płaskie tło (plakietki), odcisk percepcyjny
(duplikaty z srcset). Na stronie marki z wieloma obiektami skrypt schodzi
do podstrony obiektu i filtruje adresy po jego nazwie własnej — inaczej
oba AlpenParksy dostałyby zdjęcia cudzych resortów.

Mapowanie oferta→zdjęcia to konwencja katalogowa (pages/img/<id>/NN.jpg),
pliki .md nietknięte. Bez zdjęć: booking.com i corones.it (blokada bota),
apart-ideal-serfaus (404 pod adresem z frontmattera), dom-dla-grupy
(koncept bez `www`).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 17:24:12 +02:00
oskar f276e99c0f Ischgl: rozstrzygnięcie VIP vs Silvretta — obowiązuje Silvretta
Tańsze stawki 385/231 € to VIP Skipass: tylko dla nocujących
w Ischgl/Mathon, 46 urządzeń, NIE działa na wyciągach Kappl. Nasz
PLAN A to nocleg w Kappl, więc obowiązuje Silvretta Skipass
(451/257 €, 75 urządzeń z Kappl i See) — ceny w tabelach zostają bez
zmian, zmienia się ich uzasadnienie.

Przy okazji dwa błędy w karcie, które rozstrzygnięcie odsłoniło:
tabela 451/257 € była podpisana "VIP Skipass" (to Silvretta), a sekcja
"Teren" przypisywała VIP-owi zasięg całego Paznaun łącznie z Kappl —
czyli dokładnie to, czego VIP nie obejmuje.

Pułapka wiekowa 8–<17 potwierdzona i zostaje w wyjazd.md; dopisany
plus po stronie Silvretty: dzieci <8 lat gratis (przy dwójce takich
dzieci grupa schodzi z ~5 150 € do ~4 640 €). Nowy wiersz "Dzieci
gratis" w tabeli porównawczej — b.d. tam, gdzie bundle nie ma danych,
zamiast domyślnego "brak".

Źródło: ischgl.com, cennik 26/27 (26.11.2026–02.05.2027), sprawdzone
03.08.2026.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:53:53 +02:00
oskar cfcfbdf6bf dane skipassowe od grupy 08.2026
Cztery sekcje skipassowe uzupełnione o stawki przysłane przez grupę,
każda z adnotacją źródła i datą. Istniejące tabele nietknięte —
w każdym regionie nowe liczby stoją obok starych, z datami obu.

Saalbach: peak season 440/330/220 € potwierdza dotychczasową prognozę
(i jest górną granicą, bo nasz termin jest poza szczytem).
Kronplatz: twardy cennik, ale sezonu 2025/26 — nie tego, na który
jedziemy; szacunki 26/27 zostają.
Ischgl: dane od grupy SPRZECZNE z cennikiem w karcie — 385/231 € wobec
451/257 € i próg młodzieży 10–17 wobec 8–<17. Obie wersje zestawione,
rozstrzygnięcie zostawione grupie; do budżetowania nadal wariant
droższy. Jeśli obowiązuje próg 10–17, znika "pułapka wiekowa", która
jest dziś głównym argumentem przeciw Ischgl w tabeli w wyjazd.md.
SFL: link informacyjny (portal agregujący, nie cennik oficjalny).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:48:58 +02:00
oskar ae9d170ba3 Regeneracja: 19 kart w pages/, graf 18 konceptów + 20 external
Karta zbiorcza pages/index.html grupowała tylko korzeń i oferty/ —
dziewięć konceptów wariantów dostawało własne karty, ale nie było ich
na liście. Grupowanie idzie teraz po katalogach najwyższego poziomu,
a nazwa grupy to pierwszy nagłówek index.md tego katalogu, więc kolejny
region wystarczy dodać do bundle'a, żeby pojawił się tu sam.

Linki wariantów w root index.md prowadzą do region.md, nie do index.md
podkatalogów: pliki zarezerwowane nie mają kart, więc w pages/ taki
odnośnik degenerował się do linku na samego siebie.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 16:23:25 +02:00
oskar c4f6cf3f1d Karty HTML konceptów: gen_pages.py + katalog pages/
Graf pokazywał strukturę, ale treść (ceny, dostępność, plusy/minusy)
siedziała tylko w panelu szczegółów viewera. gen_pages.py renderuje każdy
koncept do pages/<id>.html: metadane frontmattera jako tabelka (wszystkie
pola, też polskie rozszerzenia), body poniżej, plus pages/index.html
z listą kart.

Renderer: python-markdown, jeśli jest w systemie; tutaj go nie ma, więc
działa fallback na samej bibliotece standardowej (nagłówki, akapity,
tabele GFM, listy z - [ ], cytaty, kod, hr, inline bold/kursywa/kod/linki).

Linki miedzy konceptami przepisane na względne <id>.html, linki
zewnętrzne bez zmian. Pliki zarezerwowane (index.md, log.md) nie są
konceptami (§3.1) i nie mają kart — linki do nich prowadzą do listy kart.

Pliki .md nietknięte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 18:46:08 +02:00