narty-2027/pages/wyjazd.html
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

160 lines
18 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="pl">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Ski 2027 — Skicircus Saalbach — Ski 2027 — Skicircus Saalbach</title>
<style>
:root { color-scheme: light dark; --fg:#0f172a; --muted:#64748b; --bg:#ffffff;
--line:#e2e8f0; --accent:#0d9488; --chip:#f1f5f9; --quote:#f8fafc; }
@media (prefers-color-scheme: dark) {
:root { --fg:#e2e8f0; --muted:#94a3b8; --bg:#0f172a; --line:#334155;
--accent:#2dd4bf; --chip:#1e293b; --quote:#1e293b; }
}
* { box-sizing: border-box; }
body { margin: 0 auto; padding: 1.25rem 1rem 4rem; max-width: 46rem;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
font-size: 17px; line-height: 1.55; color: var(--fg); background: var(--bg);
-webkit-text-size-adjust: 100%; }
nav { font-size: .85rem; margin-bottom: 1.25rem; }
nav a { color: var(--muted); }
h1 { font-size: 1.55rem; line-height: 1.25; margin: 0 0 .35rem; }
h2 { font-size: 1.2rem; margin: 2rem 0 .5rem; padding-top: .5rem;
border-top: 1px solid var(--line); }
h3 { font-size: 1.02rem; margin: 1.4rem 0 .4rem; }
p, ul, ol { margin: .6rem 0; }
ul, ol { padding-left: 1.3rem; }
li { margin: .25rem 0; }
li.task { list-style: none; margin-left: -1.3rem; }
li.task input { margin-right: .45rem; }
a { color: var(--accent); }
a.ext::after { content: " ↗"; font-size: .8em; color: var(--muted); }
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .88em;
background: var(--chip); padding: .1em .35em; border-radius: 4px; }
pre { background: var(--chip); padding: .75rem; border-radius: 6px; overflow-x: auto; }
pre code { background: none; padding: 0; }
blockquote { margin: .9rem 0; padding: .6rem .9rem; background: var(--quote);
border-left: 3px solid var(--accent); border-radius: 0 6px 6px 0; }
blockquote p { margin: .2rem 0; }
hr { border: 0; border-top: 1px solid var(--line); margin: 1.5rem 0; }
.table-wrap { overflow-x: auto; margin: .8rem 0; -webkit-overflow-scrolling: touch; }
table { border-collapse: collapse; width: 100%; font-size: .92rem; }
th, td { border: 1px solid var(--line); padding: .4rem .55rem; vertical-align: top; }
th { background: var(--chip); font-weight: 600; }
.chip { display: inline-block; background: var(--chip); color: var(--muted);
font-size: .72rem; text-transform: uppercase; letter-spacing: .04em;
padding: .15rem .5rem; border-radius: 999px; }
.lead { color: var(--muted); margin: .35rem 0 1.25rem; }
.meta { margin: 0 0 1.5rem; }
.meta summary { cursor: pointer; font-size: .85rem; color: var(--muted);
padding: .3rem 0; }
.meta table { font-size: .85rem; }
.meta th { width: 38%; text-align: left; font-weight: 500; word-break: break-word; }
.cards { list-style: none; padding: 0; margin: 0; }
.cards li { border: 1px solid var(--line); border-radius: 8px; padding: .8rem .9rem;
margin: .6rem 0; }
.cards a { font-weight: 600; text-decoration: none; }
.cards p { margin: .3rem 0 0; font-size: .9rem; color: var(--muted); }
footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid var(--line);
font-size: .78rem; color: var(--muted); }
/* landing: kafle i lista regionów */
body.wide { max-width: 72rem; }
.tiles, .regions { list-style: none; padding: 0; }
.tiles { margin: 1.25rem 0 2rem; display: grid; gap: .75rem; }
.regions { margin: .6rem 0 0; display: grid; gap: .5rem; }
@media (min-width: 34rem) {
.tiles { grid-template-columns: repeat(3, 1fr); }
.regions { grid-template-columns: repeat(2, 1fr); }
}
.tiles a, .regions a { display: block; border: 1px solid var(--line); border-radius: 10px;
padding: .9rem 1rem; text-decoration: none; color: var(--fg); }
.tiles a { font-size: 1.05rem; font-weight: 600; }
.tiles a:hover, .tiles a:focus, .regions a:hover, .regions a:focus {
border-color: var(--accent); }
.tiles small, .regions small { display: block; margin-top: .3rem; font-weight: 400;
font-size: .85rem; color: var(--muted); }
.regions a { font-weight: 600; }
/* podsumowanie per region na karcie porównania */
.summary { list-style: none; padding: 0; margin: .8rem 0 2rem; display: grid; gap: .6rem; }
@media (min-width: 48rem) { .summary { grid-template-columns: repeat(2, 1fr); } }
.summary li { border: 1px solid var(--line); border-left: 3px solid var(--accent);
border-radius: 8px; padding: .65rem .85rem; }
.summary .budget { font-size: .95rem; }
.summary p { margin: .35rem 0 0; font-size: .88rem; color: var(--muted); }
/* tabela porównawcza: sortowanie klikiem + kolor statusu ceny */
table.sortable th { cursor: pointer; user-select: none; white-space: nowrap; }
table.sortable th::after { content: " ↕"; font-size: .8em; opacity: .35; }
table.sortable th[data-dir="asc"]::after { content: " ↑"; opacity: 1; }
table.sortable th[data-dir="desc"]::after { content: " ↓"; opacity: 1; }
table.sortable td { font-size: .88rem; padding: .35rem .5rem; }
table.sortable td[data-num] { white-space: nowrap; }
table.sortable .name { font-weight: 600; }
tr.verified td { background: rgba(13, 148, 136, .14); }
tr.estimate td { background: rgba(100, 116, 139, .10); color: var(--muted); }
tr.estimate td.name a, tr.verified td.name a { color: var(--accent); }
.legend { font-size: .82rem; color: var(--muted); margin: .5rem 0 0; }
.legend .box { display: inline-block; width: .8em; height: .8em; border-radius: 3px;
border: 1px solid var(--line); vertical-align: -.05em; margin-right: .25em; }
.legend .box.v { background: rgba(13, 148, 136, .35); }
.legend .box.e { background: rgba(100, 116, 139, .25); }
/* miniatury w tabeli */
td.thumb { padding: .25rem; width: 128px; }
td.thumb img { width: 120px; height: 80px; object-fit: cover; border-radius: 6px;
display: block; }
td.thumb .placeholder { display: flex; width: 120px; height: 80px; border-radius: 6px;
align-items: center; justify-content: center; background: var(--chip);
color: var(--muted); font-weight: 700; letter-spacing: .05em;
text-decoration: none; }
/* galeria na karcie oferty */
.gallery { margin: 0 0 1.25rem; }
.gallery-main img { width: 100%; max-height: 24rem; object-fit: cover;
border-radius: 10px; display: block; background: var(--chip); }
.gallery-thumbs { display: flex; gap: .4rem; margin-top: .4rem; overflow-x: auto;
-webkit-overflow-scrolling: touch; padding-bottom: .2rem; }
.gallery-thumbs button { flex: 0 0 auto; padding: 0; border: 2px solid transparent;
border-radius: 6px; background: none; cursor: pointer; }
.gallery-thumbs button[aria-current] { border-color: var(--accent); }
.gallery-thumbs img { width: 5.5rem; height: 3.6rem; object-fit: cover;
border-radius: 4px; display: block; }
/* kafel regionu ze zdjęciem w tle */
.regions a.hero { background-size: cover; background-position: center;
border-color: transparent; color: #f8fafc; min-height: 6.5rem;
display: flex; flex-direction: column; justify-content: flex-end; }
.regions a.hero small { color: #e2e8f0; }
</style>
</head>
<body>
<nav><a href="start.html">← Start</a> · <a href="index.html">Wszystkie karty</a> · <a href="porownanie.html">Porównanie ofert</a> · <a href="../viz.html">Graf</a></nav>
<span class="chip">Trip</span>
<h1>Ski 2027 — Skicircus Saalbach</h1>
<p class="lead">Wyjazd narciarski 4 rodzin (14 osób) z Warszawy do Skicircus Saalbach w styczniu 2027, z celem budżetowym ~2 000 € za nocleg na rodzinę.</p>
<details class="meta" open><summary>Metadane (frontmatter)</summary><div class="table-wrap"><table><tbody><tr><th>type</th><td>Trip</td></tr><tr><th>title</th><td>Ski 2027 — Skicircus Saalbach</td></tr><tr><th>description</th><td>Wyjazd narciarski 4 rodzin (14 osób) z Warszawy do Skicircus Saalbach w styczniu 2027, z celem budżetowym ~2 000 € za nocleg na rodzinę.</td></tr><tr><th>timestamp</th><td>2026-07-31T00:00:00Z</td></tr><tr><th>tags</th><td>wyjazd, saalbach, 2027, planowanie</td></tr><tr><th>nazwa</th><td>Ski 2027 — Skicircus Saalbach: baza wiedzy wyjazdu</td></tr><tr><th>grupa</th><td>4 rodziny (2×2+2, 2×2+1) = 14 osób, wyjazd z Warszawy</td></tr><tr><th>termin</th><td>1623.01.2027 (alt. 916.01)</td></tr><tr><th>ostatnia_aktualizacja</th><td>2026-07-31</td></tr></tbody></table></div></details>
<p>Wyjazd narciarski 4 rodzin: 2×(2+2 nastolatki) + 2×(2+1 dziecko) = <strong>14 osób</strong>, wyjazd samochodami z Warszawy.</p>
<ul><li><strong>Termin:</strong> 1623.01.2027 (alternatywa: 916.01.2027).</li><li><strong>Cel budżetowy noclegu:</strong> <strong>~2 000 €/rodzinę za tydzień</strong> (nie 34 tys.).</li></ul>
<p>Kontekst regionu, skipassów, dojazdu i budżetu całkowitego → <a href="region.html">region</a>. Karty noclegów → <a href="index.html">oferty</a>.</p>
<h2>Oferty — ranking</h2>
<div class="table-wrap"><table><thead><tr><th style="text-align:left">#</th><th style="text-align:left">Oferta</th><th style="text-align:left">Miejscowość</th><th style="text-align:left">€/rodzinę 2+2</th><th style="text-align:left">Status</th><th style="text-align:left">Priorytet</th></tr></thead><tbody><tr><td style="text-align:left">1</td><td style="text-align:left"><a href="oferty/kristall-schattbergxpress.html">Kristall @ SchattbergXpress</a></td><td style="text-align:left">Saalbach centrum, 50 m od gondoli</td><td style="text-align:left">~1 5002 000</td><td style="text-align:left">szacunek</td><td style="text-align:left"><strong>PLAN A</strong></td></tr><tr><td style="text-align:left">2</td><td style="text-align:left"><a href="oferty/alpenparks-sonnleiten.html">AlpenParks Sonnleiten</a></td><td style="text-align:left">Saalbach, 2 min od stoku</td><td style="text-align:left">~1 4001 900</td><td style="text-align:left">szacunek</td><td style="text-align:left">PLAN A-bis</td></tr><tr><td style="text-align:left">3</td><td style="text-align:left"><a href="oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a></td><td style="text-align:left">Viehhofen, skibus</td><td style="text-align:left">~1 2001 600</td><td style="text-align:left">szacunek</td><td style="text-align:left"><strong>PLAN B</strong></td></tr><tr><td style="text-align:left">4</td><td style="text-align:left"><a href="oferty/dom-dla-grupy.html">Dom 1214 os.</a></td><td style="text-align:left">Viehhofen/Maishofen/Fieberbrunn</td><td style="text-align:left">~1 4001 900</td><td style="text-align:left">koncept</td><td style="text-align:left">równoległy</td></tr><tr><td style="text-align:left">5</td><td style="text-align:left"><a href="oferty/alpenparks-rehrenberg.html">AlpenParks Rehrenberg</a></td><td style="text-align:left">Viehhofen</td><td style="text-align:left">~1 1001 500</td><td style="text-align:left">szacunek</td><td style="text-align:left">PLAN C</td></tr><tr><td style="text-align:left">6</td><td style="text-align:left"><a href="oferty/glemm-lodge.html">Glemm Lodge</a></td><td style="text-align:left">Saalbach/Hinterglemm</td><td style="text-align:left">~4 370</td><td style="text-align:left"><strong>zweryfikowane</strong></td><td style="text-align:left">odrzucona (referencja)</td></tr></tbody></table></div>
<h2>Porównanie wariantów regionu</h2>
<p>Saalbach jest wariantem bazowym; obok niego badane są trzy alternatywy. Wszystkie budżety liczone tą samą metodologią (14 os., tydzień, 6 dni jazdy), więc tabele są porównywalne 1:1.</p>
<div class="table-wrap"><table><thead><tr><th style="text-align:left"></th><th style="text-align:left"><a href="region.html">Saalbach (baza)</a></th><th style="text-align:left"><a href="ischgl/region.html">Ischgl/Paznaun</a></th><th style="text-align:left"><a href="kronplatz/region.html">Kronplatz</a></th><th style="text-align:left"><a href="sfl/region.html">SFL</a></th></tr></thead><tbody><tr><td style="text-align:left">Trasy</td><td style="text-align:left">270 km</td><td style="text-align:left">239 km (+40 km Kappl)</td><td style="text-align:left">121 km + Superski 1200 km</td><td style="text-align:left">214 km</td></tr><tr><td style="text-align:left">Dojazd z W-wy</td><td style="text-align:left"><strong>~950 km</strong></td><td style="text-align:left">~1 150 km</td><td style="text-align:left">~1 050 km</td><td style="text-align:left">~1 120 km</td></tr><tr><td style="text-align:left">Skipassy grupy</td><td style="text-align:left">~4 9005 400 €</td><td style="text-align:left">~5 150 € (Silvretta, zweryf. 26/27)</td><td style="text-align:left">~4 9005 300 €</td><td style="text-align:left"><strong>~4 4004 800 €</strong></td></tr><tr><td style="text-align:left">Zniżka 17-latka</td><td style="text-align:left">✅ (do 18)</td><td style="text-align:left">❌ brak (Silvretta: 8 &lt;17 lat)</td><td style="text-align:left">✅ junior do 18</td><td style="text-align:left">✅ (rocznikowo)</td></tr><tr><td style="text-align:left">Dzieci gratis</td><td style="text-align:left">b.d.</td><td style="text-align:left"><strong>&lt;8 lat</strong></td><td style="text-align:left">b.d.</td><td style="text-align:left">ur. 2020+</td></tr><tr><td style="text-align:left">Nocleg / 4 apartamenty</td><td style="text-align:left">5 5007 500 €</td><td style="text-align:left">4 0005 600 € (Kappl)</td><td style="text-align:left">4 0006 000 € (Olang)</td><td style="text-align:left">4 2006 000 € (Ladis/Fiss)</td></tr><tr><td style="text-align:left">Sezon w terminie 1623.01</td><td style="text-align:left">niski</td><td style="text-align:left">niski</td><td style="text-align:left">regular</td><td style="text-align:left"><strong>NISKI (oficjalnie!)</strong></td></tr><tr><td style="text-align:left"><strong>Budżet grupy razem</strong></td><td style="text-align:left">~14 00018 000 €</td><td style="text-align:left">~13 50016 000 €</td><td style="text-align:left">~13 20016 300 €</td><td style="text-align:left"><strong>~12 80015 700 €</strong></td></tr><tr><td style="text-align:left">Charakter</td><td style="text-align:left">wielka karuzela</td><td style="text-align:left">wysokogórski + Samnaun</td><td style="text-align:left">Dolomity bez powtórki</td><td style="text-align:left">rodzinny kombajn</td></tr><tr><td style="text-align:left">Główne ryzyko</td><td style="text-align:left">najdroższy nocleg</td><td style="text-align:left">wiek nastolatków (17!)</td><td style="text-align:left">objazdowość = auto/kolejka</td><td style="text-align:left">za spokojnie dla nastolatków?</td></tr></tbody></table></div>
<h3>Noclegi w wariantach</h3>
<div class="table-wrap"><table><thead><tr><th style="text-align:left">Wariant</th><th style="text-align:left">PLAN A</th><th style="text-align:left">PLAN B</th><th style="text-align:left">€/rodzinę 2+2</th><th style="text-align:left">Status</th></tr></thead><tbody><tr><td style="text-align:left"><a href="index.html">Ischgl</a></td><td style="text-align:left"><a href="ischgl/oferty/apartment-brandau-kappl.html">Apartment Brandau</a>, Kappl</td><td style="text-align:left"><a href="ischgl/oferty/apartments-kappl.html">Apartments Kappl</a></td><td style="text-align:left">~9001 400</td><td style="text-align:left">szacunek</td></tr><tr><td style="text-align:left"><a href="index.html">Kronplatz</a></td><td style="text-align:left"><a href="kronplatz/oferty/haeuslerhof-valdaora.html">Häuslerhof</a>, Valdaora</td><td style="text-align:left"><a href="kronplatz/oferty/residence-corones-valdaora.html">Residence Corones</a></td><td style="text-align:left">~8001 400</td><td style="text-align:left">szacunek</td></tr><tr><td style="text-align:left"><a href="index.html">SFL</a></td><td style="text-align:left"><a href="sfl/oferty/haus-central-ladis.html">Haus Central</a>, Ladis</td><td style="text-align:left"><a href="sfl/oferty/apart-ideal-serfaus.html">Apart Ideal</a>, Serfaus</td><td style="text-align:left">~1 0001 800</td><td style="text-align:left">szacunek</td></tr></tbody></table></div>
<h3>Wnioski przekrojowe</h3>
<ol><li><strong>SFL wygrywa cenowo</strong> wśród alternatyw — jedyny region, gdzie 1623.01 to oficjalnie niski sezon (skipassy i noclegi w dołku).</li><li><strong>Ischgl ma pułapkę wiekową</strong>: zniżka tylko do &lt;17 lat — policzyć roczniki nastolatków PRZED decyzją; brak zniżki = +388 € na grupę. Krążące po grupie tańsze stawki (385/231 €) to <strong>VIP Skipass</strong>, dostępny wyłącznie dla nocujących w Ischgl/Mathon i nieważny na wyciągach Kappl — przy naszym PLANIE A (nocleg w Kappl) obowiązuje <a href="ischgl/region.html">Silvretta Skipass</a> i to jego ceny są w tabeli. Plus po tej stronie: w Silvretcie <strong>dzieci &lt;8 lat jeżdżą gratis</strong> (ischgl.com, cennik 26/27, sprawdzone 03.08.2026).</li><li>Dwa obiekty mają konfigurację <strong>dokładnie 4 apartamentów</strong> (<a href="kronplatz/oferty/haeuslerhof-valdaora.html">Häuslerhof</a>, <a href="sfl/oferty/haus-central-ladis.html">Haus Central</a>) — grupa zajmuje cały dom, co daje klimat wspólnego chaletu bez chaletowej ceny.</li><li>Saalbach zostaje wariantem bazowym ze względu na najkrótszy dojazd i największy połączony teren; alternatywy biją go budżetem noclegowym.</li></ol>
<h2>Najbliższe kroki</h2>
<ol><li>Mail grupowy (<a href="szablon-maila.html">szablon</a>) → Kristall/All in One + Sportchalet Viehhofen.</li><li>Ceny online datami 1623.01.2027 → AlpenParks (oba obiekty).</li><li>Zebranie ofert → decyzja grupy → zaliczki (wrzesień 2026).</li></ol>
<h2>Konwencja danych</h2>
<p>Każda karta oferty ma frontmatter YAML z polami OKF (<code>type</code>, <code>title</code>, <code>description</code>, <code>timestamp</code>, <code>tags</code>) oraz z polami rozszerzeń: <code>id</code>, <code>nazwa</code>, <code>miejscowosc</code>, <code>gps</code>, <code>odleglosc_od_wyciagu</code>, <code>ocena</code>, <code>cena_za_apartament_tydzien</code>, <code>koszt_rodzina_2p2</code>, <code>koszt_rodzina_2p1</code>, <code>status_ceny</code> (SZACUNEK / ZWERYFIKOWANE), <code>priorytet</code>, <code>www</code>, <code>ostatnia_aktualizacja</code> — stronę można generować statycznie prosto z tych pól (Astro/Hugo/Eleventy czytają frontmatter natywnie).</p>
<footer>Wygenerowane z bundle'a OKF przez <code>gen_pages.py</code> — nie edytuj
tych plików, edytuj <code>.md</code> i przegeneruj.</footer>
</body>
</html>