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>
179 lines
19 KiB
HTML
179 lines
19 KiB
HTML
<!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(auto-fit, minmax(16rem, 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; }
|
||
|
||
/* spis linków do kopiowania */
|
||
.copybar { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
|
||
margin: 1rem 0 1.5rem; }
|
||
.copybar button { font: inherit; font-size: .9rem; padding: .45rem .9rem;
|
||
border: 1px solid var(--accent); border-radius: 8px;
|
||
background: var(--accent); color: #f8fafc; cursor: pointer; }
|
||
.copybar button + button { background: none; color: var(--accent); }
|
||
.copybar button:hover { filter: brightness(1.08); }
|
||
.copy-status { font-size: .85rem; color: var(--muted); }
|
||
.links { list-style: none; padding: 0; margin: .5rem 0 0; }
|
||
.links li { padding: .55rem 0; border-bottom: 1px solid var(--line); }
|
||
.links li:last-child { border-bottom: 0; }
|
||
.links a { font-weight: 600; text-decoration: none; }
|
||
.links code.url { display: block; margin: .2rem 0; font-size: .82rem;
|
||
background: none; padding: 0; color: var(--muted);
|
||
word-break: break-all; user-select: all; }
|
||
.links p { margin: 0; font-size: .85rem; color: var(--muted); }
|
||
|
||
/* 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="linki.html">Linki</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>16–23.01.2027 (alt. 9–16.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> 16–23.01.2027 (alternatywa: 9–16.01.2027).</li><li><strong>Cel budżetowy noclegu:</strong> <strong>~2 000 €/rodzinę za tydzień</strong> (nie 3–4 tys.).</li></ul>
|
||
<p>Kontekst regionu, skipassów, dojazdu i budżetu całkowitego → <a href="saalbach/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="saalbach/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 500–2 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="saalbach/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 400–1 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="saalbach/oferty/sportchalet-viehhofen.html">Sportchalet Viehhofen</a></td><td style="text-align:left">Viehhofen, skibus</td><td style="text-align:left">~1 200–1 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="saalbach/oferty/dom-dla-grupy.html">Dom 12–14 os.</a></td><td style="text-align:left">Viehhofen/Maishofen/Fieberbrunn</td><td style="text-align:left">~1 400–1 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="saalbach/oferty/alpenparks-rehrenberg.html">AlpenParks Rehrenberg</a></td><td style="text-align:left">Viehhofen</td><td style="text-align:left">~1 100–1 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="saalbach/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="saalbach/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 900–5 400 €</td><td style="text-align:left">~5 150 € (Silvretta, zweryf. 26/27)</td><td style="text-align:left">~4 900–5 300 €</td><td style="text-align:left"><strong>~4 400–4 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 – <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><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 500–7 500 €</td><td style="text-align:left">4 000–5 600 € (Kappl)</td><td style="text-align:left">4 000–6 000 € (Olang)</td><td style="text-align:left">4 200–6 000 € (Ladis/Fiss)</td></tr><tr><td style="text-align:left">Sezon w terminie 16–23.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 000–18 000 €</td><td style="text-align:left">~13 500–16 000 €</td><td style="text-align:left">~13 200–16 300 €</td><td style="text-align:left"><strong>~12 800–15 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">~900–1 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">~800–1 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 000–1 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 16–23.01 to oficjalnie niski sezon (skipassy i noclegi w dołku).</li><li><strong>Ischgl ma pułapkę wiekową</strong>: zniżka tylko do <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 <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 16–23.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.<br>
|
||
powered by <a href="https://gethumanai.pl" target="_blank" rel="noopener">gethumanai.pl</a></footer>
|
||
</body>
|
||
</html>
|