<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Archiwa moc ogrzewania podłogowego - Projekt Ogrzewania</title>
	<atom:link href="https://projekt-ogrzewania.pl/tag/moc-ogrzewania-podlogowego/feed/" rel="self" type="application/rss+xml" />
	<link>https://projekt-ogrzewania.pl/tag/moc-ogrzewania-podlogowego/</link>
	<description>Twój partner w projektowaniu komfortu – profesjonalne ogrzewanie podłogowe dla Twojego domu.</description>
	<lastBuildDate>Sun, 24 May 2026 20:10:03 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1-32x32.jpg</url>
	<title>Archiwa moc ogrzewania podłogowego - Projekt Ogrzewania</title>
	<link>https://projekt-ogrzewania.pl/tag/moc-ogrzewania-podlogowego/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kompleksowy kalkulator ogrzewania podłogowego.</title>
		<link>https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/</link>
		
		<dc:creator><![CDATA[Robert Kucharski]]></dc:creator>
		<pubDate>Sun, 01 Mar 2026 15:07:17 +0000</pubDate>
				<category><![CDATA[Instalacje grzewcze]]></category>
		<category><![CDATA[Instalacje hydrauliczne]]></category>
		<category><![CDATA[Kalkulatory budowlane]]></category>
		<category><![CDATA[Narzędzia i kalkulatory]]></category>
		<category><![CDATA[Ogrzewanie podłogowe]]></category>
		<category><![CDATA[Poradnik budowlany]]></category>
		<category><![CDATA[Poradnik inwestora]]></category>
		<category><![CDATA[Poradniki dla inwestorów]]></category>
		<category><![CDATA[Poradniki instalacyjne]]></category>
		<category><![CDATA[Poradniki techniczne]]></category>
		<category><![CDATA[Projektowanie instalacji]]></category>
		<category><![CDATA[Projektowanie instalacji grzewczych]]></category>
		<category><![CDATA[Projektowanie ogrzewania]]></category>
		<category><![CDATA[Projektowanie systemów grzewczych]]></category>
		<category><![CDATA[Technika instalacyjna]]></category>
		<category><![CDATA[Technologia grzewcza]]></category>
		<category><![CDATA[długość rury pex]]></category>
		<category><![CDATA[instalacja podłogowa krok po kroku]]></category>
		<category><![CDATA[kalkulator ogrzewania podłogowego]]></category>
		<category><![CDATA[moc ogrzewania podłogowego]]></category>
		<category><![CDATA[obliczenia ogrzewania podłogowego]]></category>
		<category><![CDATA[projekt ogrzewania podłogowego]]></category>
		<category><![CDATA[przepływy w pętlach]]></category>
		<category><![CDATA[rozdzielacz podłogówki]]></category>
		<category><![CDATA[rozstaw rur podłogówka]]></category>
		<category><![CDATA[temperatura zasilania podłogówka]]></category>
		<guid isPermaLink="false">https://projekt-ogrzewania.pl/?p=3552</guid>

					<description><![CDATA[<p>Ile metrów rury kupić? Jak dobrać rozstaw pętli? Czy temperatura 35°C wystarczy, aby ogrzać cały dom? Kompleksowy kalkulator ogrzewania podłogowego pozwala przełożyć te pytania na konkretne liczby. W artykule znajdziesz nie tylko wzory i gotowe przeliczniki, ale także realny przykład mieszkania 70 m² rozpisany krok po kroku. To praktyczne narzędzie dla inwestorów, którzy chcą świadomie zaplanować instalację i uniknąć kosztownych błędów wykonawczych.</p>
<p>Artykuł <a href="https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/">Kompleksowy kalkulator ogrzewania podłogowego.</a> pochodzi z serwisu <a href="https://projekt-ogrzewania.pl">Projekt Ogrzewania</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<style>
:root {
    --rk-intro-dark: #0f172a;
    --rk-intro-darker: #020617;
    --rk-intro-primary: #2563eb; /* Inżynieryjny niebieski */
    --rk-intro-primary-light: #eff6ff;
    --rk-intro-teal: #0d9488; /* Akcent dla parametrów */
    --rk-intro-teal-bg: #f0fdfa;
    --rk-intro-bg: #ffffff;
    --rk-intro-surface: #f8fafc;
    --rk-intro-border: #e2e8f0;
    --rk-intro-text: #334155;
    --rk-intro-muted: #64748b;
    --rk-intro-shadow: 0 10px 30px -10px rgba(37, 99, 235, 0.15);
}

.rk-intro-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-intro-bg);
    border-radius: 24px;
    box-shadow: var(--rk-intro-shadow);
    border: 1px solid var(--rk-intro-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK I WSTĘP --- */
.rk-intro-header {
    background: linear-gradient(145deg, var(--rk-intro-darker) 0%, var(--rk-intro-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
}

.rk-intro-header::before {
    content: '';
    position: absolute;
    top: 0; left: 0; width: 100%; height: 5px;
    background: linear-gradient(90deg, var(--rk-intro-primary), var(--rk-intro-teal));
}

.rk-intro-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(37, 99, 235, 0.2);
    color: #60a5fa;
    padding: 6px 16px;
    border-radius: 999px;
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(96, 165, 250, 0.3);
}

.rk-intro-title {
    font-size: 32px;
    font-weight: 900;
    line-height: 1.2;
    margin: 0 0 25px 0;
    color: #ffffff;
}

.rk-intro-title span {
    color: #93c5fd;
}

.rk-intro-lead {
    font-size: 17px;
    line-height: 1.8;
    color: #cbd5e1;
    margin: 0;
    padding: 25px;
    background: rgba(255, 255, 255, 0.03);
    border-left: 4px solid var(--rk-intro-primary);
    border-radius: 0 12px 12px 0;
}

.rk-intro-lead strong {
    color: #ffffff;
    font-weight: 700;
}

.rk-link-light {
    color: #60a5fa;
    text-decoration: none;
    border-bottom: 1px dashed rgba(96, 165, 250, 0.5);
    transition: all 0.3s;
}

.rk-link-light:hover {
    color: #ffffff;
    border-bottom-style: solid;
}

/* --- INTERAKTYWNY EKSPLORATOR ALGORYTMU --- */
.rk-explorer-section {
    padding: 40px 50px;
    background: var(--rk-intro-surface);
}

.rk-explorer-title {
    font-size: 20px;
    font-weight: 800;
    color: var(--rk-intro-dark);
    margin: 0 0 25px 0;
    text-align: center;
}

/* Nawigacja (Menu pigułkowe) */
.rk-explorer-nav {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-bottom: 35px;
    background: #ffffff;
    padding: 8px;
    border-radius: 16px;
    border: 1px solid var(--rk-intro-border);
}

.rk-exp-btn {
    flex: 1;
    min-width: 140px;
    padding: 14px 20px;
    background: transparent;
    border: none;
    border-radius: 12px;
    font-size: 14px;
    font-weight: 700;
    color: var(--rk-intro-muted);
    cursor: pointer;
    transition: all 0.3s;
    text-align: center;
}

.rk-exp-btn:hover {
    background: var(--rk-intro-surface);
    color: var(--rk-intro-primary);
}

.rk-exp-btn.active {
    background: var(--rk-intro-primary);
    color: #ffffff;
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.3);
}

/* Zawartość zakładek */
.rk-exp-content {
    display: none;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-intro-border);
    box-shadow: 0 4px 6px -1px rgba(0,0,0,0.02);
    overflow: hidden;
    animation: rkFadeIn 0.4s ease;
}

.rk-exp-content.active {
    display: flex;
}

@keyframes rkFadeIn {
    from { opacity: 0; transform: translateY(10px); }
    to { opacity: 1; transform: translateY(0); }
}

/* Layout wewnętrzny: Lewo SVG (Statyczne), Prawo Tekst */
.rk-exp-visual {
    flex: 0 0 40%;
    background: var(--rk-intro-teal-bg);
    padding: 30px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-right: 1px solid var(--rk-intro-border);
}

.rk-static-svg {
    width: 100%;
    max-width: 180px;
    height: auto;
    filter: drop-shadow(0 10px 15px rgba(13, 148, 136, 0.15));
}

.rk-exp-details {
    flex: 1;
    padding: 35px 40px;
    display: flex;
    flex-direction: column;
    justify-content: center;
}

.rk-exp-details h3 {
    margin: 0 0 15px 0;
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-intro-dark);
}

.rk-exp-details p {
    margin: 0 0 20px 0;
    font-size: 15px;
    line-height: 1.7;
    color: var(--rk-intro-text);
}

/* Kafelki z parametrami (zamiast lania wody) */
.rk-data-tiles {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 15px;
}

.rk-tile {
    background: var(--rk-intro-surface);
    padding: 15px;
    border-radius: 12px;
    border: 1px solid var(--rk-intro-border);
}

.rk-tile-label {
    font-size: 12px;
    text-transform: uppercase;
    font-weight: 800;
    color: var(--rk-intro-muted);
    margin-bottom: 5px;
}

.rk-tile-value {
    font-size: 18px;
    font-weight: 900;
    color: var(--rk-intro-primary);
}

/* Responsywność */
@media (max-width: 768px) {
    .rk-intro-header, .rk-explorer-section { padding: 30px 25px; }
    .rk-intro-title { font-size: 26px; }
    .rk-intro-lead { padding: 20px 15px; font-size: 15px; }
    .rk-exp-content.active { flex-direction: column; }
    .rk-exp-visual { border-right: none; border-bottom: 1px solid var(--rk-intro-border); padding: 40px 20px; }
    .rk-exp-details { padding: 25px; }
    .rk-data-tiles { grid-template-columns: 1fr; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-wstep",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Kompleksowy Kalkulator Ogrzewania Podłogowego (Algorytm PN-EN 1264)",
    "description": "Precyzyjne narzędzie inżynieryjne pozwalające wyliczyć strumień masowy, opory hydrauliczne pętli, rozstaw rur i całkowitą długość przewodów PERT/PEX. Kompendium wiedzy matematycznej.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-23",
    "dateModified": "2026-05-23"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-algorytm",
    "name": "Zestawienie Parametrów Algorytmu PN-EN 1264",
    "description": "Baza danych wytycznych algorytmicznych niezbędnych do przeprowadzenia poprawnych obliczeń hydrauliczno-termicznych systemu grzewczego.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "kompleksowy kalkulator ogrzewania podłogowego",
      "algorytm inżynieryjny PN-EN 1264",
      "obliczenia hydrauliczno-termiczne",
      "strumień masowy podłogówki",
      "opory hydrauliczne pętli"
    ],
    "measurementTechnique": "Obliczenia numeryczne na podstawie wzorów fizyki cieplnej i normy europejskiej PN-EN 1264 dot. systemów płaszczyznowych.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Zapotrzebowanie na strumień masowy czynnika grzewczego (kg/h).",
        "Opory hydrauliczne pętli grzewczej i spadki ciśnień (kPa).",
        "Wymagany rozstaw rur dostosowany do strefy i strat ciepła.",
        "Całkowita długość przewodów PEX/PERT na jedno pomieszczenie."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-wstep",
    "name": "Eksplorator Algorytmu Ogrzewania Podłogowego",
    "description": "Interaktywny widget prezentujący 4 główne filary obliczeniowe profesjonalnego kalkulatora podłogówki, wyposażony w statyczne grafiki inżynierskie.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires HTML5 and CSS3",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-intro-container" id="rk-intro-app">
    
    <div class="rk-intro-header">
        <div class="rk-intro-badge">
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
            Kompendium Inżyniera
        </div>
        <h2 class="rk-intro-title">Kompleksowy Kalkulator <span>Ogrzewania Podłogowego</span></h2>
        
        <p class="rk-intro-lead">
            Błędne zaprojektowanie instalacji płaszczyznowej generuje gigantyczne straty finansowe, niedogrzanie pomieszczeń oraz pękanie wylewek jastrychowych. <strong>Kompleksowy kalkulator ogrzewania podłogowego</strong> to zaawansowany algorytm inżynieryjny oparty na <a href="https://projekt-ogrzewania.pl/pn-en-1264-norma-ktora-definiuje-ogrzewanie-podlogowe/" class="rk-link-light">normie PN-EN 1264</a>, który pozwala precyzyjnie wyliczyć zapotrzebowanie na strumień masowy czynnika grzewczego, opory hydrauliczne pętli, wymagany <a href="https://projekt-ogrzewania.pl/rozstaw-rur-w-wodnym-ogrzewaniu-podlogowym/" class="rk-link-light">rozstaw rur</a> oraz całkowitą długość <a href="https://projekt-ogrzewania.pl/rura-pert-do-ogrzewania-podlogowego/" class="rk-link-light">przewodów PERT/PEX</a>. Poniższy materiał stanowi kompletne kompendium wiedzy matematycznej i instalacyjnej, niezbędne do przeprowadzenia obliczeń hydrauliczno-termicznych systemu grzewczego (Interaktywny kalkulator jest dostępny w dalszej części artykułu).
        </p>
    </div>

    <div class="rk-explorer-section">
        <h3 class="rk-explorer-title">4 Filary Algorytmu Obliczeniowego</h3>
        
        <div class="rk-explorer-nav">
            <button class="rk-exp-btn active" data-target="tab-masowy">Strumień Masowy</button>
            <button class="rk-exp-btn" data-target="tab-opory">Opory Hydrauliczne</button>
            <button class="rk-exp-btn" data-target="tab-rozstaw">Rozstaw Rur</button>
            <button class="rk-exp-btn" data-target="tab-dlugosc">Długość Przewodów</button>
        </div>

        <div class="rk-exp-content active" id="tab-masowy">
            <div class="rk-exp-visual">
                <svg class="rk-static-svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
                    <rect x="35" y="10" width="30" height="80" rx="4" fill="#ffffff" stroke="#2563eb" stroke-width="4"></rect>
                    <line x1="45" y1="20" x2="55" y2="20" stroke="#64748b" stroke-width="2"></line>
                    <line x1="45" y1="40" x2="55" y2="40" stroke="#64748b" stroke-width="2"></line>
                    <line x1="45" y1="60" x2="55" y2="60" stroke="#64748b" stroke-width="2"></line>
                    <line x1="45" y1="80" x2="55" y2="80" stroke="#64748b" stroke-width="2"></line>
                    <polygon points="40,55 60,55 50,70" fill="#ef4444"></polygon>
                    <path d="M 50 90 L 50 100 M 35 100 L 65 100" stroke="#0d9488" stroke-width="4" stroke-linecap="round"></path>
                </svg>
            </div>
            <div class="rk-exp-details">
                <h3>Zapotrzebowanie na strumień masowy</h3>
                <p>Kalkulator na podstawie projektowego obciążenia cieplnego (OZC) określa dokładną ilość wody (w litrach na minutę), jaka musi przepłynąć przez dany obwód, aby dostarczyć wymaganą moc grzewczą do pomieszczenia. To podstawa regulacji na rotametrach.</p>
                <div class="rk-data-tiles">
                    <div class="rk-tile">
                        <div class="rk-tile-label">Jednostka bazowa</div>
                        <div class="rk-tile-value">kg/h lub l/min</div>
                    </div>
                    <div class="rk-tile">
                        <div class="rk-tile-label">Zależność fizyczna</div>
                        <div class="rk-tile-value">Q = m · c · ΔT</div>
                    </div>
                </div>
            </div>
        </div>

        <div class="rk-exp-content" id="tab-opory">
            <div class="rk-exp-visual">
                <svg class="rk-static-svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
                    <path d="M 10 50 Q 30 20 50 50 T 90 50" fill="none" stroke="#e2e8f0" stroke-width="12" stroke-linecap="round"></path>
                    <path d="M 10 50 Q 30 20 50 50 T 90 50" fill="none" stroke="#2563eb" stroke-width="6" stroke-linecap="round"></path>
                    <circle cx="20" cy="30" r="12" fill="#ffffff" stroke="#0d9488" stroke-width="3"></circle>
                    <line x1="20" y1="30" x2="28" y2="22" stroke="#ef4444" stroke-width="2" stroke-linecap="round"></line>
                    <circle cx="80" cy="30" r="12" fill="#ffffff" stroke="#0d9488" stroke-width="3"></circle>
                    <line x1="80" y1="30" x2="72" y2="22" stroke="#ef4444" stroke-width="2" stroke-linecap="round"></line>
                </svg>
            </div>
            <div class="rk-exp-details">
                <h3>Opory hydrauliczne pętli</h3>
                <p>Zbyt długa rura lub zbyt duża prędkość wody generuje ogromne opory tarcia (straty liniowe i miejscowe). Obliczenia te są krytyczne dla poprawnego doboru wysokości podnoszenia pompy obiegowej, aby zapobiec &#8222;niedogrzaniu&#8221; najdalszych pętli.</p>
                <div class="rk-data-tiles">
                    <div class="rk-tile">
                        <div class="rk-tile-label">Maksymalny opór pętli</div>
                        <div class="rk-tile-value">≤ 20 kPa</div>
                    </div>
                    <div class="rk-tile">
                        <div class="rk-tile-label">Optymalna prędkość</div>
                        <div class="rk-tile-value">0,25 &#8211; 0,5 m/s</div>
                    </div>
                </div>
            </div>
        </div>

        <div class="rk-exp-content" id="tab-rozstaw">
            <div class="rk-exp-visual">
                <svg class="rk-static-svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
                    <rect x="10" y="10" width="80" height="80" fill="#ffffff" stroke="#cbd5e1" stroke-width="2" rx="4"></rect>
                    <path d="M 20 20 L 80 20 M 80 20 A 10 10 0 0 1 80 40 M 80 40 L 20 40 M 20 40 A 10 10 0 0 0 20 60 M 20 60 L 80 60 M 80 60 A 10 10 0 0 1 80 80 M 80 80 L 20 80" fill="none" stroke="#0d9488" stroke-width="6" stroke-linecap="round"></path>
                    <line x1="45" y1="23" x2="45" y2="37" stroke="#ef4444" stroke-width="2"></line>
                    <polygon points="45,23 42,28 48,28" fill="#ef4444"></polygon>
                    <polygon points="45,37 42,32 48,32" fill="#ef4444"></polygon>
                </svg>
            </div>
            <div class="rk-exp-details">
                <h3>Wymagany rozstaw rur</h3>
                <p>Na podstawie oporu cieplnego warstw posadzki (np. płytki vs panele) oraz wyliczonych strat ciepła, system wskazuje bezpieczny rozstaw montażowy. Zagęszczenie rur (np. co 10 cm w łazience) gwarantuje osiągnięcie właściwej temperatury wnętrza.</p>
                <div class="rk-data-tiles">
                    <div class="rk-tile">
                        <div class="rk-tile-label">Pompy ciepła (Standard)</div>
                        <div class="rk-tile-value">10 &#8211; 15 cm</div>
                    </div>
                    <div class="rk-tile">
                        <div class="rk-tile-label">Strefy brzegowe (Okna)</div>
                        <div class="rk-tile-value">5 &#8211; 10 cm</div>
                    </div>
                </div>
            </div>
        </div>

        <div class="rk-exp-content" id="tab-dlugosc">
            <div class="rk-exp-visual">
                <svg class="rk-static-svg" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
                    <circle cx="50" cy="50" r="35" fill="none" stroke="#2563eb" stroke-width="8"></circle>
                    <circle cx="50" cy="50" r="25" fill="none" stroke="#2563eb" stroke-width="8"></circle>
                    <circle cx="50" cy="50" r="15" fill="none" stroke="#2563eb" stroke-width="8"></circle>
                    <path d="M 50 15 L 50 5" stroke="#ef4444" stroke-width="4" stroke-linecap="round"></path>
                    <path d="M 50 5 L 90 5" stroke="#ef4444" stroke-width="4" stroke-linecap="round"></path>
                    <text x="70" y="20" fill="#0f172a" font-size="14" font-weight="900" font-family="sans-serif">Σ L</text>
                </svg>
            </div>
            <div class="rk-exp-details">
                <h3>Całkowita długość przewodów</h3>
                <p>Precyzyjne wyliczenie metrów bieżących (uwzględniające 10% naddatku instalacyjnego oraz trasy doprowadzające do rozdzielacza) zapobiega brakom materiałowym na budowie i pozwala dokładnie oszacować pojemność zładu wodnego układu.</p>
                <div class="rk-data-tiles">
                    <div class="rk-tile">
                        <div class="rk-tile-label">Max dł. obwodu (PEX 16)</div>
                        <div class="rk-tile-value">120 m</div>
                    </div>
                    <div class="rk-tile">
                        <div class="rk-tile-label">Pojemność rury 16&#215;2</div>
                        <div class="rk-tile-value">0,113 l/mb</div>
                    </div>
                </div>
            </div>
        </div>

    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-intro-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener interaktywny należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na nieautoryzowanej domenie jest zabronione prawem.
                </div>
            `;
            return;
        }
    }

    // Logika Zakładek Eksploratora
    const buttons = document.querySelectorAll('.rk-exp-btn');
    const contents = document.querySelectorAll('.rk-exp-content');

    buttons.forEach(btn => {
        btn.addEventListener('click', () => {
            const targetId = btn.getAttribute('data-target');
            
            // Resetuj wszystkie
            buttons.forEach(b => b.classList.remove('active'));
            contents.forEach(c => c.classList.remove('active'));
            
            // Aktywuj kliknięty
            btn.classList.add('active');
            document.getElementById(targetId).classList.add('active');
        });
    });
});
</script>



<style>
:root {
    --rk-calc-dark: #0f172a;
    --rk-calc-darker: #020617;
    --rk-calc-brand: #3b82f6; /* Inżynieryjny, mocny niebieski */
    --rk-calc-brand-hover: #2563eb;
    --rk-calc-accent: #f59e0b; /* Bursztyn do akcentowania wzorów */
    --rk-calc-bg: #ffffff;
    --rk-calc-surface: #f8fafc;
    --rk-calc-border: #e2e8f0;
    --rk-calc-text: #334155;
    --rk-calc-muted: #64748b;
    --rk-calc-formula-bg: #1e293b;
    --rk-shadow-soft: 0 10px 25px -5px rgba(59, 130, 246, 0.1);
}

.rk-calc-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-calc-bg);
    border-radius: 20px;
    box-shadow: var(--rk-shadow-soft);
    border: 1px solid var(--rk-calc-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-calc-header {
    background: linear-gradient(135deg, var(--rk-calc-dark) 0%, var(--rk-calc-darker) 100%);
    padding: 40px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-calc-brand);
}

.rk-calc-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(59, 130, 246, 0.2);
    color: #93c5fd;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 15px;
    border: 1px solid rgba(147, 197, 253, 0.3);
}

.rk-calc-title {
    font-size: 28px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-calc-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-calc-lead strong { color: #ffffff; }

.rk-calc-link {
    color: #60a5fa;
    text-decoration: underline;
    text-underline-offset: 3px;
    font-weight: 600;
    transition: color 0.3s;
}

.rk-calc-link:hover { color: #93c5fd; }

/* --- INTERAKTYWNY STEPPER --- */
.rk-calc-interactive {
    padding: 40px 50px;
    background: var(--rk-calc-surface);
}

.rk-calc-subtitle {
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-calc-dark);
    margin: 0 0 25px 0;
    text-align: center;
}

.rk-stepper-wrapper {
    display: flex;
    gap: 30px;
    background: #ffffff;
    border: 1px solid var(--rk-calc-border);
    border-radius: 16px;
    padding: 25px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
}

/* Lewa strona: Kroki */
.rk-stepper-nav {
    flex: 0 0 220px;
    display: flex;
    flex-direction: column;
    gap: 10px;
    border-right: 1px solid var(--rk-calc-border);
    padding-right: 20px;
}

.rk-step-btn {
    display: flex;
    align-items: center;
    gap: 12px;
    width: 100%;
    text-align: left;
    background: transparent;
    border: 1px solid transparent;
    padding: 15px;
    border-radius: 12px;
    font-size: 14px;
    font-weight: 700;
    color: var(--rk-calc-muted);
    cursor: pointer;
    transition: all 0.3s;
}

.rk-step-btn:hover {
    background: var(--rk-calc-surface);
    color: var(--rk-calc-brand);
}

.rk-step-btn.active {
    background: var(--rk-calc-brand);
    color: #ffffff;
    box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
}

.rk-step-num {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 24px;
    height: 24px;
    background: var(--rk-calc-border);
    color: var(--rk-calc-text);
    border-radius: 50%;
    font-size: 12px;
    font-weight: 900;
    transition: all 0.3s;
}

.rk-step-btn.active .rk-step-num {
    background: #ffffff;
    color: var(--rk-calc-brand);
}

/* Prawa strona: Zawartość */
.rk-stepper-content {
    flex: 1;
    position: relative;
    min-height: 320px;
}

.rk-step-panel {
    display: none;
    animation: slideInRight 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}

.rk-step-panel.active {
    display: block;
}

@keyframes slideInRight {
    from { opacity: 0; transform: translateX(20px); }
    to { opacity: 1; transform: translateX(0); }
}

.rk-panel-title {
    font-size: 18px;
    font-weight: 800;
    color: var(--rk-calc-dark);
    margin: 0 0 15px 0;
}

/* Wzór matematyczny */
.rk-formula-box {
    background: var(--rk-calc-formula-bg);
    border-radius: 12px;
    padding: 20px;
    margin-bottom: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-left: 4px solid var(--rk-calc-accent);
    position: relative;
    overflow: hidden;
}

.rk-formula-box::before {
    content: 'Wzór wg PN-EN';
    position: absolute;
    top: 5px; left: 10px;
    font-size: 10px;
    color: #94a3b8;
    text-transform: uppercase;
    font-weight: 800;
    letter-spacing: 1px;
}

.rk-formula-text {
    font-family: 'Courier New', Courier, monospace;
    font-size: 22px;
    font-weight: 700;
    color: #ffffff;
    letter-spacing: 1px;
}

.rk-formula-text sub {
    font-size: 12px;
    color: var(--rk-calc-accent);
}

/* Wyjaśnienie */
.rk-panel-desc {
    font-size: 14px;
    line-height: 1.7;
    color: var(--rk-calc-text);
    margin: 0 0 20px 0;
    background: var(--rk-calc-surface);
    padding: 15px;
    border-radius: 8px;
    border: 1px dashed var(--rk-calc-border);
}

/* Wizualizacja SVG (Animacje) */
.rk-panel-visual {
    height: 100px;
    background: #ffffff;
    display: flex;
    align-items: center;
    justify-content: center;
}

.rk-svg-graphic {
    width: 100%;
    max-width: 250px;
    height: 100%;
}

/* --- Animacje SVG --- */
.anim-ozc-arrow { stroke-dasharray: 4; animation: flowOut 1s linear infinite; stroke: #ef4444; }
@keyframes flowOut { to { stroke-dashoffset: -8; } }

.anim-heat-wave path { stroke: #f59e0b; opacity: 0; animation: radiateUp 1.5s infinite alternate; }
.anim-heat-wave path:nth-child(2) { animation-delay: 0.5s; }
.anim-heat-wave path:nth-child(3) { animation-delay: 1s; }
@keyframes radiateUp { to { opacity: 1; transform: translateY(-5px); } }

.anim-ruler-move { animation: shrinkRuler 3s infinite alternate cubic-bezier(0.4, 0, 0.2, 1); transform-origin: left; }
@keyframes shrinkRuler { 0% { transform: scaleX(1); } 100% { transform: scaleX(0.66); } }

.anim-pipe-roll { stroke-dasharray: 200; stroke-dashoffset: 200; animation: unroll 3s infinite ease-out; stroke: #3b82f6; }
@keyframes unroll { 50%, 100% { stroke-dashoffset: 0; } }

.anim-loop-split { stroke-dasharray: 100; animation: splitFlow 2s infinite linear; stroke: #3b82f6; }
@keyframes splitFlow { to { stroke-dashoffset: -20; } }

/* --- Responsywność --- */
@media (max-width: 768px) {
    .rk-calc-header, .rk-calc-interactive { padding: 30px 20px; }
    .rk-calc-title { font-size: 24px; }
    .rk-stepper-wrapper { flex-direction: column; padding: 15px; gap: 20px; }
    .rk-stepper-nav { flex: auto; border-right: none; border-bottom: 1px solid var(--rk-calc-border); padding-right: 0; padding-bottom: 15px; flex-direction: row; overflow-x: auto; scrollbar-width: none; }
    .rk-stepper-nav::-webkit-scrollbar { display: none; }
    .rk-step-btn { min-width: 160px; justify-content: center; }
    .rk-formula-text { font-size: 18px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-algorytm",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Jak obliczyć zapotrzebowanie na ciepło i długość rur ogrzewania podłogowego?",
    "description": "Algorytm kalkulatora wg PN-EN 12831 i 1264. Poznaj krok po kroku wzory na projektowe obciążenie cieplne, rozstaw rur i podział na pętle.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2025-03-05",
    "dateModified": "2026-05-23"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-wzory",
    "name": "Wzory i algorytmy obliczeniowe PN-EN 12831 i 1264",
    "description": "Zestawienie matematyczne procedur doboru parametrów ogrzewania płaszczyznowego, zapobiegające błędom przewymiarowania instalacji.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "obliczenia OZC",
      "długość rury podłogówka",
      "rozstaw rur wzór",
      "norma PN-EN 12831",
      "kalkulator ogrzewania podłogowego"
    ],
    "measurementTechnique": "Szeregowanie algorytmiczne wg norm europejskich, przeliczające powierzchnię i straty na zapotrzebowanie hydrauliczne.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Krok 1: Projektowa moc grzewcza Q_obl = A × q",
        "Krok 2: Gęstość strumienia q_s = Q_obl / A_grz",
        "Krok 3: Obliczenie teoretycznego rozstawu rur (a)",
        "Krok 4: Całkowita długość rury L = (A_grz / a × 1,1) + L_d",
        "Krok 5: Podział na pętle N_p = ceil(L / L_max)"
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-algorytm",
    "name": "Symulator Algorytmu Podłogówki",
    "description": "Interaktywny panel (stepper) objaśniający w 5 krokach proces matematyczny zachodzący w kalkulatorze ogrzewania podłogowego wraz z wizualizacjami SVG.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-calc-container" id="rk-calc-app">
    
    <div class="rk-calc-header">
        <div class="rk-calc-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><rect x="9" y="9" width="6" height="6"></rect><line x1="9" y1="1" x2="9" y2="4"></line><line x1="15" y1="1" x2="15" y2="4"></line><line x1="9" y1="20" x2="9" y2="23"></line><line x1="15" y1="20" x2="15" y2="23"></line><line x1="20" y1="9" x2="23" y2="9"></line><line x1="20" y1="14" x2="23" y2="14"></line><line x1="1" y1="9" x2="4" y2="9"></line><line x1="1" y1="14" x2="4" y2="14"></line></svg>
            Metodologia Obliczeń
        </div>
        <h2 class="rk-calc-title">Jak obliczyć zapotrzebowanie na ciepło i długość rur za pomocą kalkulatora?</h2>
        <p class="rk-calc-lead">
            Zgodnie z normą <strong>PN-EN 12831</strong>, podstawą do wyliczenia jakichkolwiek parametrów podłogówki jest <a href="https://projekt-ogrzewania.pl/projektowe-obciazenie-cieplne-ozc/" class="rk-calc-link">Projektowe Obciążenie Cieplne budynku (OZC)</a>. Algorytm kalkulatora konwertuje tę wartość na <a href="https://projekt-ogrzewania.pl/ile-rury-na-m%c2%b2-ogrzewania-podlogowego/" class="rk-calc-link">metry bieżące rury</a> oraz liczbę sekcji <a href="https://projekt-ogrzewania.pl/rozdzielacz-do-podlogowki-kluczowy-element-systemu-ogrzewania-podlogowego/" class="rk-calc-link">rozdzielacza</a> w oparciu o parametry fizyczne przegród. Próba doboru instalacji „na oko” (np. uniwersalne przyjmowanie rozstawu co 15 cm) skutkuje niedogrzaniem stref przyokiennych lub przewymiarowaniem <a href="https://projekt-ogrzewania.pl/pompa-obiegowa-w-instalacji-ogrzewania-podlogowego/" class="rk-calc-link">pompy obiegowej</a>, co generuje dodatkowe koszty na poziomie 2500–4000 PLN na etapie zakupu materiałów.
        </p>
    </div>

    <div class="rk-calc-interactive">
        <h3 class="rk-calc-subtitle">Algorytm obliczeniowy krok po kroku</h3>
        
        <div class="rk-stepper-wrapper">
            <div class="rk-stepper-nav">
                <button class="rk-step-btn active" data-step="1">
                    <span class="rk-step-num">1</span> Moc grzewcza
                </button>
                <button class="rk-step-btn" data-step="2">
                    <span class="rk-step-num">2</span> Gęstość strumienia
                </button>
                <button class="rk-step-btn" data-step="3">
                    <span class="rk-step-num">3</span> Rozstaw rur
                </button>
                <button class="rk-step-btn" data-step="4">
                    <span class="rk-step-num">4</span> Długość rury
                </button>
                <button class="rk-step-btn" data-step="5">
                    <span class="rk-step-num">5</span> Podział na pętle
                </button>
            </div>

            <div class="rk-stepper-content">
                
                <div class="rk-step-panel active" id="rk-step-1">
                    <h4 class="rk-panel-title">Wyznaczenie projektowej mocy grzewczej pomieszczenia (Q<sub>obl</sub>)</h4>
                    <div class="rk-formula-box">
                        <div class="rk-formula-text">Q<sub>obl</sub> = A &times; q</div>
                    </div>
                    <div class="rk-panel-desc">
                        Gdzie <strong>A</strong> to powierzchnia użytkowa [m²], a <strong>q</strong> to jednostkowe zapotrzebowanie na ciepło [W/m²] określone wg PN-EN 12831. Dla nowych budynków (WT 2021) przyjmuje się 30–50 W/m², dla domów po termomodernizacji 60–80 W/m².
                    </div>
                    <div class="rk-panel-visual">
                        <svg class="rk-svg-graphic" viewBox="0 0 200 80">
                            <path d="M 80 40 L 100 20 L 120 40 L 120 70 L 80 70 Z" fill="none" stroke="#64748b" stroke-width="4" stroke-linejoin="round"/>
                            <path class="anim-ozc-arrow" d="M 125 45 L 150 45" stroke-width="3" stroke-linecap="round"/>
                            <path class="anim-ozc-arrow" d="M 75 45 L 50 45" stroke-width="3" stroke-linecap="round"/>
                            <path class="anim-ozc-arrow" d="M 100 15 L 100 -5" stroke-width="3" stroke-linecap="round"/>
                        </svg>
                    </div>
                </div>

                <div class="rk-step-panel" id="rk-step-2">
                    <h4 class="rk-panel-title">Wyznaczenie gęstości strumienia cieplnego posadzki (q<sub>s</sub>)</h4>
                    <div class="rk-formula-box">
                        <div class="rk-formula-text">q<sub>s</sub> = Q<sub>obl</sub> / A<sub>grz</sub></div>
                    </div>
                    <div class="rk-panel-desc">
                        Gdzie <strong>A<sub>grz</sub></strong> to rzeczywista powierzchnia grzewcza [m²] (po odliczeniu stałej zabudowy meblowej np. szaf, kominków, wanien). Otrzymujemy parametr W/m² czystej podłogi.
                    </div>
                    <div class="rk-panel-visual">
                        <svg class="rk-svg-graphic" viewBox="0 0 200 80">
                            <path d="M 40 70 L 160 70 L 140 50 L 60 50 Z" fill="#e2e8f0" stroke="#cbd5e1" stroke-width="2"/>
                            <g class="anim-heat-wave" fill="none" stroke-width="3" stroke-linecap="round">
                                <path d="M 70 40 Q 80 30, 90 40 T 110 40"/>
                                <path d="M 90 35 Q 100 25, 110 35 T 130 35"/>
                                <path d="M 110 30 Q 120 20, 130 30 T 150 30"/>
                            </g>
                        </svg>
                    </div>
                </div>

                <div class="rk-step-panel" id="rk-step-3">
                    <h4 class="rk-panel-title">Obliczenie teoretycznego rozstawu rur (a)</h4>
                    <div class="rk-formula-box">
                        <div class="rk-formula-text">a = f( q<sub>s</sub> , t<sub>z</sub> , R<sub>&lambda;,B</sub> )</div>
                    </div>
                    <div class="rk-panel-desc">
                        Rozstaw rur [m] jest funkcją gęstości strumienia, temperatury zasilania oraz oporu cieplnego okładziny podłogowej. Oblicza się go z układu równań normy PN-EN 1264-2. Wynik zaokrągla się w dół do standardów montażowych: <strong>0,10 m, 0,15 m lub 0,20 m</strong>.
                    </div>
                    <div class="rk-panel-visual">
                        <svg class="rk-svg-graphic" viewBox="0 0 200 80">
                            <line x1="50" y1="40" x2="150" y2="40" stroke="#3b82f6" stroke-width="4" stroke-linecap="round"/>
                            <line class="anim-ruler-move" x1="50" y1="40" x2="150" y2="40" stroke="#f59e0b" stroke-width="6" stroke-linecap="round"/>
                            <line x1="50" y1="30" x2="50" y2="50" stroke="#64748b" stroke-width="2"/>
                            <line x1="150" y1="30" x2="150" y2="50" stroke="#64748b" stroke-width="2"/>
                        </svg>
                    </div>
                </div>

                <div class="rk-step-panel" id="rk-step-4">
                    <h4 class="rk-panel-title">Wyznaczenie całkowitej długości rury w pomieszczeniu (L)</h4>
                    <div class="rk-formula-box">
                        <div class="rk-formula-text">L = (A<sub>grz</sub> / a &times; 1,1) + L<sub>d</sub></div>
                    </div>
                    <div class="rk-panel-desc">
                        Gdzie <strong>1,1</strong> to stały współczynnik uwzględniający 10% zapasu na wygięcia łuków rur, a <strong>L<sub>d</sub></strong> to długość odcinka doprowadzającego (zasilanie + powrót) z szafki rozdzielaczowej do danego pomieszczenia [m].
                    </div>
                    <div class="rk-panel-visual">
                        <svg class="rk-svg-graphic" viewBox="0 0 200 80">
                            <circle cx="60" cy="40" r="20" fill="none" stroke="#3b82f6" stroke-width="4"/>
                            <circle cx="60" cy="40" r="12" fill="none" stroke="#3b82f6" stroke-width="4"/>
                            <path class="anim-pipe-roll" d="M 60 20 L 160 20" fill="none" stroke-width="4" stroke-linecap="round"/>
                        </svg>
                    </div>
                </div>

                <div class="rk-step-panel" id="rk-step-5">
                    <h4 class="rk-panel-title">Podział na pętle grzewcze (N<sub>p</sub>)</h4>
                    <div class="rk-formula-box">
                        <div class="rk-formula-text">N<sub>p</sub> = ceil( L / L<sub>max</sub> )</div>
                    </div>
                    <div class="rk-panel-desc">
                        Gdzie <strong>L<sub>max</sub></strong> to graniczna długość jednego obwodu (dla rury 16 mm wynosi 120 m). Funkcja <em>ceil</em> zaokrągla wynik matematyczny zawsze w górę do pełnej liczby całkowitej (obwodu na rozdzielaczu).
                    </div>
                    <div class="rk-panel-visual">
                        <svg class="rk-svg-graphic" viewBox="0 0 200 80">
                            <rect x="30" y="20" width="20" height="40" fill="#64748b" rx="2"/>
                            <path class="anim-loop-split" d="M 50 30 L 140 30 Q 160 30, 160 50 Q 160 70, 140 70 L 50 70" fill="none" stroke-width="4" stroke-linecap="round"/>
                            <path class="anim-loop-split" d="M 50 40 L 100 40 Q 120 40, 120 50 Q 120 60, 100 60 L 50 60" fill="none" stroke="#f59e0b" stroke-width="4" stroke-linecap="round"/>
                        </svg>
                    </div>
                </div>

            </div>
        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-calc-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener algorytmiczny należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na nieautoryzowanej domenie jest zabronione prawem.
                </div>
            `;
            return;
        }
    }

    // Logika Steppera
    const stepBtns = document.querySelectorAll('.rk-step-btn');
    const stepPanels = document.querySelectorAll('.rk-step-panel');

    stepBtns.forEach(btn => {
        btn.addEventListener('click', () => {
            const targetStep = btn.getAttribute('data-step');
            
            // Czyszczenie klas aktywnych
            stepBtns.forEach(b => b.classList.remove('active'));
            stepPanels.forEach(p => p.classList.remove('active'));
            
            // Aktywacja wybranego
            btn.classList.add('active');
            document.getElementById('rk-step-' + targetStep).classList.add('active');
        });
    });
});
</script>



<style>
:root {
    --rk-temp-dark: #0f172a;
    --rk-temp-darker: #020617;
    --rk-temp-brand: #0ea5e9; /* Błękit inżynieryjny */
    --rk-temp-safe: #10b981;  /* Szmaragdowy - norma */
    --rk-temp-warn: #f59e0b;  /* Bursztyn - ostrzeżenie */
    --rk-temp-danger: #ef4444; /* Czerwień - awaria */
    --rk-temp-bg: #ffffff;
    --rk-temp-surface: #f8fafc;
    --rk-temp-border: #e2e8f0;
    --rk-temp-text: #334155;
    --rk-temp-muted: #64748b;
    --rk-temp-shadow: 0 15px 35px -10px rgba(15, 23, 42, 0.1);
}

.rk-temp-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-temp-bg);
    border-radius: 24px;
    box-shadow: var(--rk-temp-shadow);
    border: 1px solid var(--rk-temp-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-temp-header {
    background: linear-gradient(135deg, var(--rk-temp-darker) 0%, var(--rk-temp-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-temp-brand);
}

.rk-temp-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(14, 165, 233, 0.2);
    color: #38bdf8;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(56, 189, 248, 0.3);
}

.rk-temp-title {
    font-size: 30px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-temp-title span { color: #7dd3fc; }

.rk-temp-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-temp-link {
    color: #38bdf8;
    text-decoration: none;
    border-bottom: 1px dashed rgba(56, 189, 248, 0.4);
    font-weight: 600;
    transition: all 0.3s;
}

.rk-temp-link:hover {
    color: #ffffff;
    border-bottom-style: solid;
}

/* --- KONTENER SYMULATORA --- */
.rk-temp-simulator {
    padding: 40px 50px;
    background: var(--rk-temp-surface);
}

.rk-sim-layout {
    display: grid;
    grid-template-columns: 1fr 320px;
    gap: 30px;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-temp-border);
    padding: 30px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
}

/* Lewa Strona - Kontrolki i SVG */
.rk-sim-controls {
    display: flex;
    flex-direction: column;
    gap: 25px;
}

.rk-slider-box {
    background: var(--rk-temp-surface);
    padding: 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-temp-border);
}

.rk-slider-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 15px;
}

.rk-slider-label {
    font-size: 14px;
    font-weight: 800;
    color: var(--rk-temp-dark);
    text-transform: uppercase;
}

.rk-slider-value {
    font-size: 24px;
    font-weight: 900;
    color: var(--rk-temp-safe);
    transition: color 0.3s;
}

/* Custom Input Range */
.rk-range-slider {
    -webkit-appearance: none;
    width: 100%;
    height: 8px;
    border-radius: 4px;
    background: #cbd5e1;
    outline: none;
    transition: background 0.3s;
}

.rk-range-slider::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: var(--rk-temp-safe);
    cursor: pointer;
    border: 4px solid #ffffff;
    box-shadow: 0 2px 5px rgba(0,0,0,0.2);
    transition: background 0.3s, transform 0.1s;
}

.rk-range-slider::-webkit-slider-thumb:active {
    transform: scale(1.1);
}

/* Wizualizacja SVG Przekroju */
.rk-svg-stage {
    flex-grow: 1;
    background: #f1f5f9;
    border-radius: 16px;
    border: 1px dashed var(--rk-temp-border);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    position: relative;
    overflow: hidden;
}

.rk-cross-section { width: 100%; max-width: 350px; height: auto; }

/* Animacje SVG */
.anim-heat-ray { stroke-dasharray: 8 8; animation: heatRise 2s linear infinite; }
@keyframes heatRise { to { stroke-dashoffset: -16; } }

.anim-crack-path { stroke-dasharray: 100; stroke-dashoffset: 100; transition: stroke-dashoffset 0.5s ease-out; }
.state-danger .anim-crack-path { stroke-dashoffset: 0; }

.anim-pipe-color { transition: fill 0.3s, stroke 0.3s; }
.state-warn .anim-pipe-color { fill: var(--rk-temp-warn); stroke: #d97706; }
.state-warn .anim-heat-ray { stroke: var(--rk-temp-warn); animation-duration: 1.2s; }
.state-danger .anim-pipe-color { fill: var(--rk-temp-danger); stroke: #b91c1c; }
.state-danger .anim-heat-ray { stroke: var(--rk-temp-danger); animation-duration: 0.7s; }

/* Prawa Strona - Metryki */
.rk-sim-metrics {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

.rk-metric-card {
    background: #ffffff;
    border: 1px solid var(--rk-temp-border);
    border-radius: 12px;
    padding: 20px;
    transition: all 0.3s;
    position: relative;
    overflow: hidden;
}

.rk-metric-card::before {
    content: '';
    position: absolute;
    left: 0; top: 0; bottom: 0; width: 4px;
    background: var(--rk-temp-safe);
    transition: background 0.3s;
}

.state-warn .rk-metric-card::before { background: var(--rk-temp-warn); }
.state-danger .rk-metric-card::before { background: var(--rk-temp-danger); }

.rk-metric-title {
    font-size: 12px;
    color: var(--rk-temp-muted);
    font-weight: 800;
    text-transform: uppercase;
    margin-bottom: 8px;
}

.rk-metric-val {
    font-size: 22px;
    font-weight: 900;
    color: var(--rk-temp-dark);
}

.rk-metric-desc {
    font-size: 13px;
    color: var(--rk-temp-text);
    margin-top: 8px;
    line-height: 1.4;
}

/* Ostrzeżenie (Awaria) */
.rk-alert-box {
    display: none;
    background: #fef2f2;
    border: 1px solid #fecaca;
    padding: 15px;
    border-radius: 12px;
    color: #991b1b;
    font-size: 13px;
    line-height: 1.5;
    margin-top: auto;
    animation: alertPop 0.3s ease-out;
}

.rk-alert-box strong { font-weight: 800; color: #7f1d1d; display: block; font-size: 14px; margin-bottom: 4px; }
.state-danger .rk-alert-box { display: block; }

@keyframes alertPop {
    0% { opacity: 0; transform: scale(0.95); }
    100% { opacity: 1; transform: scale(1); }
}

/* Strefy Temperatur (Limity) */
.rk-zones-info {
    padding: 30px 50px 40px;
    background: #ffffff;
    border-top: 1px solid var(--rk-temp-border);
}

.rk-zones-info h3 {
    margin: 0 0 20px 0;
    font-size: 20px;
    font-weight: 800;
    color: var(--rk-temp-dark);
}

.rk-zones-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
}

.rk-zone-item {
    background: #f8fafc;
    padding: 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-temp-border);
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.rk-zone-icon {
    width: 40px; height: 40px;
    background: #e0f2fe;
    color: var(--rk-temp-brand);
    border-radius: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.rk-zone-item h4 { margin: 0; font-size: 15px; font-weight: 800; color: var(--rk-temp-dark); }
.rk-zone-limit { font-size: 20px; font-weight: 900; color: var(--rk-temp-brand); }
.rk-zone-text { font-size: 13px; color: var(--rk-temp-muted); line-height: 1.5; margin: 0; }

@media (max-width: 768px) {
    .rk-temp-header, .rk-temp-simulator, .rk-zones-info { padding: 30px 20px; }
    .rk-temp-title { font-size: 24px; }
    .rk-sim-layout { grid-template-columns: 1fr; padding: 20px; gap: 20px; }
    .rk-zones-grid { grid-template-columns: 1fr; }
    .rk-svg-stage { height: 200px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-temperatura-zasilania-podlogowki/#article-temperatura",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/maksymalna-temperatura-zasilania-podlogowki/"
    },
    "headline": "Maksymalna temperatura zasilania ogrzewania podłogowego według normy PN-EN 1264",
    "description": "Zgodnie z PN-EN 1264 maksymalna temperatura zasilania to 50°C. Przekroczenie limitu prowadzi do uszkodzeń mechanicznych wylewki (naprężenia ścinające 2,5 MPa) i degradacji paneli.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-temperatura-zasilania-podlogowki/#dataset-limity",
    "name": "Wartości graniczne temperatur powierzchniowych (PN-EN 1264)",
    "description": "Zestawienie dopuszczalnych temperatur powierzchni posadzki dla poszczególnych stref przebywania w budynku mieszkalnym.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "maksymalna temperatura ogrzewania podłogowego",
      "norma PN-EN 1264",
      "strefa brzegowa temperatura",
      "naprężenia ścinające wylewki",
      "temperatura zasilania podłogówki"
    ],
    "measurementTechnique": "Określenie parametrów granicznych na podstawie normy europejskiej PN-EN 1264.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Strefa stałego przebywania ludzi (salony, sypialnie): max 29°C.",
        "Strefy łazienkowe i sanitarne: max 33°C.",
        "Strefy brzegowe (do 1 m od okien): max 35°C."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-temperatura-zasilania-podlogowki/#webapp-symulator",
    "name": "Symulator Naprężeń Termicznych Posadzki",
    "description": "Interaktywny kalkulator wizualizujący wpływ temperatury zasilania na naprężenia wylewki, temperaturę powierzchni oraz ryzyko pęknięć mechanicznych (uszkodzenia płytek, syndrom ciężkich nóg).",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-temp-container" id="rk-temp-app">
    
    <div class="rk-temp-header">
        <div class="rk-temp-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 14.76V3.5a2.5 2.5 0 0 0-5 0v11.26a4.5 4.5 0 1 0 5 0z"></path></svg>
            Reżim Temperaturowy
        </div>
        <h2 class="rk-temp-title">Maksymalna temperatura zasilania <span>według PN-EN 1264</span></h2>
        <p class="rk-temp-lead">
            Maksymalna temperatura zasilania instalacji ogrzewania podłogowego w układzie ciągłym wynosi <strong>50°C</strong> zgodnie z wymaganiami normy <a href="https://projekt-ogrzewania.pl/pn-en-1264-norma-ktora-definiuje-ogrzewanie-podlogowe/" class="rk-temp-link">PN-EN 1264</a>. Niedopełnienie tych obostrzeń i wpuszczenie w jastrych parametru rzędu 55–60°C (brak <a href="https://projekt-ogrzewania.pl/zawor-mieszajacy-w-ogrzewaniu-podlogowym/" class="rk-temp-link">zaworu mieszającego</a> na starym kotle) generuje ogromne naprężenia ścinające. Skutkuje to pękaniem płytek, degradacją termiczną paneli i &#8222;syndromem ciężkich nóg&#8221;.
        </p>
    </div>

    <div class="rk-temp-simulator">
        <div class="rk-sim-layout state-safe" id="rk-sim-core">
            
            <div class="rk-sim-controls">
                <div class="rk-slider-box">
                    <div class="rk-slider-header">
                        <span class="rk-slider-label">Zasilanie Układu (T<sub>z</sub>)</span>
                        <span class="rk-slider-value" id="val-supply">35°C</span>
                    </div>
                    <input type="range" class="rk-range-slider" id="rk-temp-slider" min="25" max="65" step="1" value="35">
                </div>

                <div class="rk-svg-stage">
                    <svg class="rk-cross-section" viewBox="0 0 200 150" xmlns="http://www.w3.org/2000/svg">
                        <rect x="10" y="110" width="180" height="30" fill="#cbd5e1" rx="4"/>
                        <circle cx="30" cy="125" r="2" fill="#94a3b8"/> <circle cx="50" cy="115" r="2" fill="#94a3b8"/>
                        <rect x="10" y="50" width="180" height="60" fill="#e2e8f0" rx="2"/>
                        <rect x="10" y="40" width="43" height="8" fill="#94a3b8" rx="1"/>
                        <rect x="55" y="40" width="43" height="8" fill="#94a3b8" rx="1"/>
                        <rect x="100" y="40" width="43" height="8" fill="#94a3b8" rx="1"/>
                        <rect x="145" y="40" width="45" height="8" fill="#94a3b8" rx="1"/>
                        <circle class="anim-pipe-color" cx="100" cy="85" r="12" fill="#10b981" stroke="#047857" stroke-width="3"/>
                        <circle cx="100" cy="85" r="6" fill="rgba(255,255,255,0.4)"/>
                        <path class="anim-heat-ray" d="M 80 70 Q 75 50 80 30" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round"/>
                        <path class="anim-heat-ray" d="M 100 65 Q 100 45 100 25" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round"/>
                        <path class="anim-heat-ray" d="M 120 70 Q 125 50 120 30" fill="none" stroke="#10b981" stroke-width="2" stroke-linecap="round"/>
                        <path class="anim-crack-path" d="M 98 40 L 92 60 L 105 80 L 100 110" fill="none" stroke="#0f172a" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                    </svg>
                </div>
            </div>

            <div class="rk-sim-metrics">
                <div class="rk-metric-card">
                    <div class="rk-metric-title">Temperatura Posadzki</div>
                    <div class="rk-metric-val" id="val-surface">24.5°C</div>
                    <div class="rk-metric-desc" id="desc-surface">Pełny komfort. Zgodnie z PN-EN 1264.</div>
                </div>
                
                <div class="rk-metric-card">
                    <div class="rk-metric-title">Naprężenia Wylewki</div>
                    <div class="rk-metric-val" id="val-stress">0.4 MPa</div>
                    <div class="rk-metric-desc" id="desc-stress">Stabilna praca w granicach wytrzymałości jastrychu.</div>
                </div>

                <div class="rk-alert-box">
                    <strong>Koszt naprawy: min. 15 000 PLN!</strong>
                    Naprężenia ścinające przekraczają wytrzymałość betonu na rozciąganie. Bezpowrotne odklejenie gresu i degradacja rur.
                </div>
            </div>

        </div>
    </div>

    <div class="rk-zones-info">
        <h3>Wartości graniczne temperatur (Powierzchnia)</h3>
        <div class="rk-zones-grid">
            
            <div class="rk-zone-item">
                <div class="rk-zone-icon">
                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
                </div>
                <h4>Salony i Sypialnie</h4>
                <div class="rk-zone-limit">max 29°C</div>
                <p class="rk-zone-text">Strefa stałego przebywania ludzi. Zabezpiecza przed &#8222;syndromem ciężkich nóg&#8221;.</p>
            </div>

            <div class="rk-zone-item">
                <div class="rk-zone-icon">
                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12h20"></path><path d="M5 12v5a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-5"></path><path d="M7 21h10"></path><path d="M12 12v-5"></path><path d="M8 7h8"></path><path d="M12 7V4"></path><path d="M10 4h4"></path></svg>
                </div>
                <h4>Łazienki i Sanitarne</h4>
                <div class="rk-zone-limit">max 33°C</div>
                <p class="rk-zone-text">Dopuszcza się wyższą temperaturę z uwagi na zwiększone zapotrzebowanie na komfort (bosa stopa).</p>
            </div>

            <div class="rk-zone-item">
                <div class="rk-zone-icon">
                    <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="3" y1="9" x2="21" y2="9"></line><line x1="9" y1="21" x2="9" y2="9"></line></svg>
                </div>
                <h4>Strefy Brzegowe</h4>
                <div class="rk-zone-limit">max 35°C</div>
                <p class="rk-zone-text">Pas o szerokości do 1 m <a href="https://projekt-ogrzewania.pl/strefa-brzegowa-obwodowa-w-ogrzewaniu-podlogowym/" class="rk-temp-link" style="color:var(--rk-temp-muted);">wzdłuż dużych przeszkleń</a> w celu kompensacji strat zimna.</p>
            </div>

        </div>
    </div>

</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-temp-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener interaktywny należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na nieautoryzowanej domenie jest zabronione prawem.
                </div>
            `;
            return;
        }
    }

    // Logika Symulatora Temperatur
    const slider = document.getElementById('rk-temp-slider');
    const layout = document.getElementById('rk-sim-core');
    
    const valSupply = document.getElementById('val-supply');
    const valSurface = document.getElementById('val-surface');
    const valStress = document.getElementById('val-stress');
    const descSurface = document.getElementById('desc-surface');
    const descStress = document.getElementById('desc-stress');
    const sliderThumb = document.querySelector('.rk-range-slider');

    function updateSimulation() {
        const temp = parseInt(slider.value);
        valSupply.textContent = temp + '°C';

        // Prosta interpolacja fizyczna dla estymacji:
        // Powierzchnia rośnie z temperaturą zasilania.
        const surfaceTemp = (20 + (temp - 25) * 0.45).toFixed(1);
        valSurface.textContent = surfaceTemp + '°C';

        // Naprężenia w betonie rosną eksponencjalnie pow. 40 stopni
        let stress = 0.2 + ((temp - 25) * 0.02);
        if(temp > 45) {
            stress = stress + Math.pow((temp - 45)*0.15, 2);
        }
        valStress.textContent = stress.toFixed(1) + ' MPa';

        // Stany logiczne
        layout.classList.remove('state-safe', 'state-warn', 'state-danger');

        if (temp <= 40) {
            layout.classList.add('state-safe');
            descSurface.textContent = 'Pełny komfort. Zgodnie z PN-EN 1264.';
            descStress.textContent = 'Stabilna praca w granicach wytrzymałości jastrychu.';
            sliderThumb.style.setProperty('--rk-temp-safe', '#10b981'); // update thumb via custom prop if needed (CSS takes care mostly)
            slider.style.background = `linear-gradient(to right, #10b981 ${(temp-25)/40*100}%, #cbd5e1 ${(temp-25)/40*100}%)`;
        } 
        else if (temp > 40 && temp <= 50) {
            layout.classList.add('state-warn');
            descSurface.textContent = 'Temperatura na granicy dopuszczalności. Ryzyko dyskomfortu (syndrom ciężkich nóg).';
            descStress.textContent = 'Zwiększona praca płyty grzewczej. Dylatacje mocno obciążone.';
            slider.style.background = `linear-gradient(to right, #f59e0b ${(temp-25)/40*100}%, #cbd5e1 ${(temp-25)/40*100}%)`;
        } 
        else if (temp > 50) {
            layout.classList.add('state-danger');
            descSurface.textContent = 'Przekroczenie normy! Degardacja klejów i uszkodzenia paneli.';
            descStress.textContent = 'Naprężenia ścinające wykraczają poza wytrzymałość betonu na rozciąganie.';
            slider.style.background = `linear-gradient(to right, #ef4444 ${(temp-25)/40*100}%, #cbd5e1 ${(temp-25)/40*100}%)`;
        }
    }

    if(slider) {
        slider.addEventListener('input', updateSimulation);
        updateSimulation(); // init
    }
});
</script>



<style>
:root {
    --rk-pitch-dark: #0f172a;
    --rk-pitch-darker: #020617;
    --rk-pitch-brand: #10b981; /* Zielony / szmaragdowy akcent efektywności OZE i SCOP */
    --rk-pitch-brand-light: #e6f4ea;
    --rk-pitch-accent: #3b82f6; /* Niebieski dla pompy ciepła i krzywej grzewczej */
    --rk-pitch-bg: #ffffff;
    --rk-pitch-surface: #f8fafc;
    --rk-pitch-border: #cbd5e1;
    --rk-pitch-text: #334155;
    --rk-pitch-muted: #64748b;
    --rk-pitch-shadow: 0 15px 35px -10px rgba(16, 185, 129, 0.1);
}

.rk-pitch-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-pitch-bg);
    border-radius: 24px;
    box-shadow: var(--rk-pitch-shadow);
    border: 1px solid var(--rk-pitch-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-pitch-header {
    background: linear-gradient(135deg, var(--rk-pitch-darker) 0%, var(--rk-pitch-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-pitch-brand);
}

.rk-pitch-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(16, 185, 129, 0.2);
    color: #34d399;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(52, 211, 153, 0.3);
}

.rk-pitch-title {
    font-size: 30px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-pitch-title span { color: #34d399; }

.rk-pitch-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-pitch-link {
    color: #34d399;
    text-decoration: none;
    border-bottom: 1px dashed rgba(52, 211, 153, 0.4);
    font-weight: 600;
    transition: all 0.3s;
}

.rk-pitch-link:hover {
    color: #ffffff;
    border-bottom-style: solid;
}

/* --- INTERAKTYWNY PANEL OPTYMALIZACJI --- */
.rk-pitch-interactive {
    padding: 40px 50px;
    background: var(--rk-pitch-surface);
}

.rk-sim-layout {
    display: grid;
    grid-template-columns: 1fr 340px;
    gap: 30px;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-pitch-border);
    padding: 30px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
}

/* Lewa Strona - Wybór rozstawu i wykres */
.rk-sim-controls {
    display: flex;
    flex-direction: column;
    gap: 25px;
}

.rk-pitch-selector-title {
    font-size: 15px;
    font-weight: 800;
    color: var(--rk-pitch-dark);
    text-transform: uppercase;
    margin: 0 0 12px 0;
    letter-spacing: 0.5px;
}

/* Menu Przełączników Kafelkowych */
.rk-pitch-tiles {
    display: flex;
    gap: 12px;
}

.rk-pitch-tile-btn {
    flex: 1;
    background: var(--rk-pitch-surface);
    border: 2px solid var(--rk-pitch-border);
    border-radius: 14px;
    padding: 15px 10px;
    cursor: pointer;
    text-align: center;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.rk-pitch-tile-btn:hover {
    border-color: var(--rk-pitch-accent);
    background: #f0f6ff;
}

.rk-pitch-tile-btn.active {
    border-color: var(--rk-pitch-brand);
    background: var(--rk-pitch-brand-light);
    box-shadow: 0 4px 12px rgba(16, 185, 129, 0.15);
}

.rk-tile-step {
    font-size: 18px;
    font-weight: 900;
    color: var(--rk-pitch-dark);
}

.rk-tile-label {
    font-size: 12px;
    font-weight: 700;
    color: var(--rk-pitch-muted);
}

.rk-pitch-tile-btn.active .rk-tile-step { color: #065f46; }
.rk-pitch-tile-btn.active .rk-tile-label { color: #047857; }

/* Statyczny moduł graficzny SVG */
.rk-svg-viewport {
    background: #f8fafc;
    border-radius: 16px;
    border: 1px dashed var(--rk-pitch-border);
    padding: 25px;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 180px;
}

.rk-geometry-svg { width: 100%; max-width: 320px; height: auto; }

/* Dynamiczne stany CSS mapowane przez JS na klasę kontenera głównego */
.rk-pipe-line { fill: none; stroke: var(--rk-pitch-accent); stroke-width: 5; stroke-linecap: round; transition: all 0.4s ease; }
.rk-heat-circle { fill: #fca5a5; opacity: 0.4; transition: all 0.4s ease; }

/* Stany geometrii ułożenia rur */
.geom-10 .rk-pipe-15, .geom-10 .rk-pipe-20 { display: none; }
.geom-15 .rk-pipe-10, .geom-15 .rk-pipe-20 { display: none; }
.geom-20 .rk-pipe-10, .geom-20 .rk-pipe-15 { display: none; }

/* Prawa Strona - Parametry Techniczno-Ekonomiczne */
.rk-sim-results {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

.rk-tech-card {
    background: #ffffff;
    border: 1px solid var(--rk-pitch-border);
    border-radius: 12px;
    padding: 18px 20px;
    position: relative;
    overflow: hidden;
}

.rk-tech-card::before {
    content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
    background: var(--rk-pitch-brand);
}

.rk-card-label {
    font-size: 11px;
    color: var(--rk-pitch-muted);
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin-bottom: 6px;
}

.rk-card-value {
    font-size: 20px;
    font-weight: 900;
    color: var(--rk-pitch-dark);
}

.rk-card-comment {
    font-size: 13px;
    color: var(--rk-pitch-text);
    margin-top: 6px;
    line-height: 1.4;
}

/* Panel Błędu Krytycznego (Garaż/Sypialnia co 20 przy przeszkleniach) */
.rk-crit-panel {
    display: none;
    background: #fef2f2;
    border: 1px solid #fecaca;
    padding: 15px;
    border-radius: 12px;
    color: #991b1b;
    font-size: 13px;
    line-height: 1.5;
    animation: panelPop 0.3s ease-out;
}
.rk-crit-panel strong { font-weight: 800; color: #7f1d1d; display: block; font-size: 14px; margin-bottom: 3px; }
.geom-20 .rk-crit-panel { display: block; }

@keyframes panelPop {
    from { opacity: 0; transform: scale(0.96); }
    to { opacity: 1; transform: scale(1); }
}

@media (max-width: 768px) {
    .rk-pitch-header, .rk-pitch-interactive { padding: 30px 20px; }
    .rk-pitch-title { font-size: 24px; }
    .rk-sim-layout { grid-template-columns: 1fr; padding: 20px; gap: 25px; }
    .rk-svg-viewport { min-height: 160px; }
    .rk-pitch-tiles { gap: 8px; }
    .rk-pitch-tile-btn { padding: 12px 6px; }
    .rk-tile-step { font-size: 16px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/rozstaw-rur-ogrzewania-podlogowego-przy-pompie-ciepla/#article",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/rozstaw-rur-ogrzewania-podlogowego-przy-pompie-ciepla/"
    },
    "headline": "Jaki rozstaw rur ogrzewania podłogowego zastosować przy pompie ciepła?",
    "description": "Analiza wpływu geometrii rozstawu rur (10 cm vs 15 cm) na temperaturę zasilania pompy ciepła, współczynniki COP/SCOP oraz roczne oszczędności eksploatacyjne.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/rozstaw-rur-ogrzewania-podlogowego-przy-pompie-ciepla/#dataset",
    "name": "Zestawienie Wydajności i Zużycia Rur w Zależności od Rozstawu",
    "description": "Twarde dane przeliczeniowe łączące rozstaw rur (co 10, 15, 20 cm) z jednostkowym zużyciem materiału oraz maksymalną mocą cieplną posadzki gresowej.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "rozstaw rur pompa ciepła",
      "zużycie rury na metr kwadratowy",
      "maksymalna moc grzewcza podłogówki",
      "krzywa grzewcza pompy ciepła",
      "obniżenie temperatury zasilania SCOP"
    ],
    "measurementTechnique": "Analiza numeryczna oporów przewodzenia jastrychu wg normy PN-EN 1264 i symulacja strat COP sprężarek inwerterowych.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Rozstaw 10 cm: Zużycie 10,0 mb/m2, moc 75-85 W/m2 przy Tz=35°C. Idealny do łazienek.",
        "Rozstaw 15 cm: Zużycie 6,7 mb/m2, moc 55-65 W/m2 przy Tz=35°C. Standard salonowy.",
        "Rozstaw 20 cm: Zużycie 5,0 mb/m2, moc 35-45 W/m2 przy Tz=35°C. Ryzyko taktowania pompy."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/rozstaw-rur-ogrzewania-podlogowego-przy-pompie-ciepla/#webapp",
    "name": "Interaktywny Symulator Geometrii Pętli Grzewczych",
    "description": "Narzędzie pozwalające przełączać gęstość ułożenia rur (10, 15, 20 cm) i obserwować w czasie rzeczywistym zużycie mb rury, wymaganą temperaturę zasilania oraz prognozowane koszty eksploatacji.",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-pitch-container" id="rk-pitch-app">
    
    <div class="rk-pitch-header">
        <div class="rk-pitch-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polygon points="12 2 2 7 12 12 22 7 12 2"></polygon><polyline points="2 17 12 22 22 17"></polyline><polyline points="2 12 12 17 22 12"></polyline></svg>
            Geometria Układu OZE
        </div>
        <h2 class="rk-pitch-title">Jaki rozstaw rur ogrzewania podłogowego <span>zastosować przy pompie ciepła?</span></h2>
        <p class="rk-pitch-lead">
            Optymalny rozstaw rur grzewczych przy zasilaniu z niskotemperaturowej pompy ciepła wynosi <strong>10 cm</strong> w łazienkach oraz strefach brzegowych oraz <strong>15 cm</strong> w pozostałych pomieszczeniach mieszkalnych. Zco gęstszego rozstawu pozwala obniżyć temperaturę zasilania o <strong>4–6°C</strong> przy zachowaniu tej samej mocy grzewczej posadzki. Każde obniżenie temperatury wody o 1°C zwiększa efektywność średnioroczną pompy ciepła (współczynnik SCOP) o ok. <strong>2,5%</strong>, co bezpośrednio tnie rachunki za energię elektryczną.
        </p>
    </div>

    <div class="rk-pitch-interactive">
        <div class="rk-sim-layout geom-15" id="rk-pitch-core">
            
            <div class="rk-sim-controls">
                <div>
                    <h3 class="rk-pitch-selector-title">Wybierz gęstość ułożenia przewodów:</h3>
                    <div class="rk-pitch-tiles">
                        <button class="rk-pitch-tile-btn" data-geom="10">
                            <span class="rk-tile-step">co 10 cm</span>
                            <span class="rk-tile-label">Gęsty (Łazienki)</span>
                        </button>
                        <button class="rk-pitch-tile-btn active" data-geom="15">
                            <span class="rk-tile-step">co 15 cm</span>
                            <span class="rk-tile-label">Standard (Pokoje)</span>
                        </button>
                        <button class="rk-pitch-tile-btn" data-geom="20">
                            <span class="rk-tile-step">co 20 cm</span>
                            <span class="rk-tile-label">Rzadki (Garaże)</span>
                        </button>
                    </div>
                </div>

                <div class="rk-svg-viewport">
                    <svg class="rk-geometry-svg" viewBox="0 0 200 100" xmlns="http://www.w3.org/2000/svg">
                        <rect x="5" y="30" width="190" height="60" fill="#e2e8f0" rx="4" stroke="#cbd5e1" stroke-width="1"/>
                        
                        <g class="rk-pipe-10">
                            <circle class="rk-heat-circle" cx="20" cy="65" r="16"/><circle class="rk-heat-circle" cx="50" cy="65" r="16"/><circle class="rk-heat-circle" cx="80" cy="65" r="16"/><circle class="rk-heat-circle" cx="110" cy="65" r="16"/><circle class="rk-heat-circle" cx="140" cy="65" r="16"/><circle class="rk-heat-circle" cx="170" cy="65" r="16"/>
                            <circle class="rk-pipe-line" cx="20" cy="65" r="6"/><circle class="rk-pipe-line" cx="50" cy="65" r="6"/><circle class="rk-pipe-line" cx="80" cy="65" r="6"/><circle class="rk-pipe-line" cx="110" cy="65" r="6"/><circle class="rk-pipe-line" cx="140" cy="65" r="6"/><circle class="rk-pipe-line" cx="170" cy="65" r="6"/>
                        </g>

                        <g class="rk-pipe-15">
                            <circle class="rk-heat-circle" cx="30" cy="65" r="22"/><circle class="rk-heat-circle" cx="85" cy="65" r="22"/><circle class="rk-heat-circle" cx="140" cy="65" r="22"/>
                            <circle class="rk-pipe-line" cx="30" cy="65" r="6"/><circle class="rk-pipe-line" cx="85" cy="65" r="6"/><circle class="rk-pipe-line" cx="140" cy="65" r="6"/>
                        </g>

                        <g class="rk-pipe-20">
                            <circle class="rk-heat-circle" cx="40" cy="65" r="28"/><circle class="rk-heat-circle" cx="130" cy="65" r="28"/>
                            <circle class="rk-pipe-line" cx="40" cy="65" r="6"/><circle class="rk-pipe-line" cx="130" cy="65" r="6"/>
                        </g>
                    </svg>
                </div>
            </div>

            <div class="rk-sim-results">
                <div class="rk-tech-card">
                    <div class="rk-card-label">Zużycie rury grzewczej</div>
                    <div class="rk-card-value" id="val-usage">6,7 mb/m²</div>
                    <div class="rk-card-comment">Standard inżynieryjny dla salonów i sypialni.</div>
                </div>

                <div class="rk-tech-card">
                    <div class="rk-card-label">Maksymalna moc (T<sub>z</sub> = 35°C)</div>
                    <div class="rk-card-value" id="val-power">55 – 65 W/m²</div>
                    <div class="rk-card-comment">Idealnie pokrywa zapotrzebowanie budynków WT 2021 z <a href="https://projekt-ogrzewania.pl/rekuperacja-i-ogrzewanie-podlogowego-czy-to-sie-oplaca/" class="rk-pitch-link" style="color:var(--rk-pitch-muted);">rekuperacją</a>.</div>
                </div>

                <div class="rk-tech-card">
                    <div class="rk-card-label">Parametry Krzywej Grzewczej</div>
                    <div class="rk-card-value" id="val-curve">35 / 30 °C</div>
                    <div class="rk-card-comment" id="val-cop-comment">Zapewnia wysoki współczynnik COP pompy na poziomie ok. 4,2.</div>
                </div>

                <div class="rk-crit-panel">
                    <strong>Błąd Krytyczny Projektu!</strong>
                    Rzadki układ rur w salonie z dużymi przeszkleniami wymusza podniesienie zasilania do 45°C. Współczynnik COP spada z 4,2 do 3,1, generując <strong>dodatkowy koszt 1200–1800 PLN</strong> co sezon.
                </div>
            </div>

        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-pitch-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener inżynieryjny należy do serwisu Projekt-Ogrzewania.pl. Wykryto próbę kradzieży kodu źródłowego.
                </div>
            `;
            return;
        }
    }

    // Logika kafelków interaktywnych
    const core = document.getElementById('rk-pitch-core');
    const tiles = document.querySelectorAll('.rk-pitch-tile-btn');
    
    const valUsage = document.getElementById('val-usage');
    const valPower = document.getElementById('val-power');
    const valCurve = document.getElementById('val-curve');
    const valCopComment = document.getElementById('val-cop-comment');

    const dataMap = {
        "10": {
            usage: "10,0 mb/m²",
            power: "75 – 85 W/m²",
            curve: "30 / 26 °C",
            comment: "Maksymalna efektywność pompy ciepła. Standard dla łazienek i stref brzegowych.",
            className: "geom-10"
        },
        "15": {
            usage: "6,7 mb/m²",
            power: "55 – 65 W/m²",
            curve: "35 / 30 °C",
            comment: "Zapewnia wysoki współczynnik COP pompy na poziomie ok. 4,2.",
            className: "geom-15"
        },
        "20": {
            usage: "5,0 mb/m²",
            power: "35 – 45 W/m²",
            curve: "45 / 40 °C",
            comment: "Drastyczny spadek sprawności sprężarki pompy ciepła.",
            className: "geom-20"
        }
    };

    tiles.forEach(tile => {
        tile.addEventListener('click', function() {
            tiles.forEach(t => t.classList.remove('active'));
            this.classList.add('active');

            const geom = this.getAttribute('data-geom');
            const data = dataMap[geom];

            // Aktualizacja metryk technicznych
            valUsage.textContent = data.usage;
            valPower.textContent = data.power;
            valCurve.textContent = data.curve;
            valCopComment.textContent = data.comment;

            // Aktualizacja rzutu geometrycznego przez klasy CSS
            core.className = "rk-sim-layout " + data.className;
        });
    });
});
</script>



<style>
:root {
    --rk-loop-dark: #0f172a;
    --rk-loop-darker: #020617;
    --rk-loop-primary: #0ea5e9; /* Hydronic Blue */
    --rk-loop-primary-light: #e0f2fe;
    --rk-loop-success: #10b981;
    --rk-loop-warning: #f59e0b;
    --rk-loop-danger: #ef4444;
    --rk-loop-bg: #ffffff;
    --rk-loop-surface: #f8fafc;
    --rk-loop-border: #cbd5e1;
    --rk-loop-text: #334155;
    --rk-loop-muted: #64748b;
    --rk-loop-shadow: 0 15px 35px -10px rgba(14, 165, 233, 0.15);
}

.rk-loop-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-loop-bg);
    border-radius: 24px;
    box-shadow: var(--rk-loop-shadow);
    border: 1px solid var(--rk-loop-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-loop-header {
    background: linear-gradient(135deg, var(--rk-loop-darker) 0%, var(--rk-loop-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-loop-primary);
}

.rk-loop-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(14, 165, 233, 0.2);
    color: #38bdf8;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(56, 189, 248, 0.3);
}

.rk-loop-header h2 {
    font-size: 30px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-loop-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-loop-link {
    color: #38bdf8;
    text-decoration: none;
    border-bottom: 1px dashed rgba(56, 189, 248, 0.4);
    font-weight: 600;
    transition: all 0.3s;
}

.rk-loop-link:hover {
    color: #ffffff;
    border-bottom-style: solid;
}

/* --- PANEL INTERAKTYWNY --- */
.rk-loop-interactive {
    padding: 40px 50px;
    background: var(--rk-loop-surface);
}

.rk-loop-interactive h3 {
    text-align: center;
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-loop-dark);
    margin: 0 0 30px 0;
}

.rk-sim-grid {
    display: grid;
    grid-template-columns: 1fr 340px;
    gap: 30px;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-loop-border);
    padding: 30px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
}

/* Lewa sekcja - Średnica, Suwak i Wykres */
.rk-sim-workspace {
    display: flex;
    flex-direction: column;
    gap: 25px;
}

/* Selektor Średnic (Pigułki) */
.rk-diameter-selector {
    display: flex;
    gap: 10px;
    background: var(--rk-loop-surface);
    padding: 6px;
    border-radius: 14px;
    border: 1px solid var(--rk-loop-border);
}

.rk-diameter-btn {
    flex: 1;
    padding: 12px;
    background: transparent;
    border: none;
    border-radius: 10px;
    font-size: 14px;
    font-weight: 800;
    color: var(--rk-loop-muted);
    cursor: pointer;
    transition: all 0.3s ease;
    text-align: center;
}

.rk-diameter-btn:hover {
    color: var(--rk-loop-primary);
}

.rk-diameter-btn.active {
    background: var(--rk-loop-primary);
    color: #ffffff;
    box-shadow: 0 4px 10px rgba(14, 165, 233, 0.25);
}

/* Box Suwaka Długości */
.rk-length-slider-box {
    background: var(--rk-loop-surface);
    padding: 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-loop-border);
}

.rk-slider-labels {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 12px;
}

.rk-slider-title {
    font-size: 13px;
    font-weight: 800;
    color: var(--rk-loop-dark);
    text-transform: uppercase;
}

.rk-slider-counter {
    font-size: 24px;
    font-weight: 900;
    color: var(--rk-loop-primary);
    transition: color 0.3s;
}

.rk-main-range {
    -webkit-appearance: none;
    width: 100%;
    height: 8px;
    border-radius: 4px;
    background: #cbd5e1;
    outline: none;
}

.rk-main-range::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 26px;
    height: 26px;
    border-radius: 50%;
    background: var(--rk-loop-primary);
    cursor: pointer;
    border: 4px solid #ffffff;
    box-shadow: 0 2px 6px rgba(0,0,0,0.15);
    transition: transform 0.1s;
}

.rk-main-range::-webkit-slider-thumb:active {
    transform: scale(1.1);
}

/* Wizualizacja SVG (Zegar i Rotametr) */
.rk-svg-viewport {
    background: #ffffff;
    border-radius: 16px;
    border: 1px dashed var(--rk-loop-border);
    padding: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 180px;
}

.rk-hydraulic-svg {
    width: 100%;
    max-width: 380px;
    height: auto;
}

/* Animacje i Przejścia elementów SVG */
.svg-gauge-pointer { transform-origin: 75px 55px; transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); stroke: var(--rk-loop-success); }
.svg-rotameter-float { transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); fill: #334155; }
.svg-pipe-flow { stroke-dasharray: 8; animation: hydraulicFlow 2s linear infinite; stroke: var(--rk-loop-primary); }

@keyframes hydraulicFlow { to { stroke-dashoffset: -16; } }

/* Klasy stanów wtryskiwane przez JS */
.state-safe .svg-gauge-pointer { stroke: var(--rk-loop-success); }
.state-warn .svg-gauge-pointer { stroke: var(--rk-loop-warning); }
.state-danger .svg-gauge-pointer { stroke: var(--rk-loop-danger); }
.state-danger .svg-pipe-flow { animation-duration: 8s; stroke: #94a3b8; } /* Drastyczny spadek przepływu */

/* Prawa sekcja - Wyświetlacz Wyników */
.rk-sim-outputs {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

.rk-output-card {
    background: #ffffff;
    border: 1px solid var(--rk-loop-border);
    border-radius: 12px;
    padding: 16px 20px;
    position: relative;
    overflow: hidden;
}

.rk-output-card::before {
    content: ''; position: absolute; left: 0; top: 0; bottom: 0; width: 4px;
    background: var(--rk-loop-success);
    transition: background-color 0.3s;
}

.state-safe .rk-card-hydraulics::before { background: var(--rk-loop-success); }
.state-warn .rk-card-hydraulics::before { background: var(--rk-loop-warning); }
.state-danger .rk-card-hydraulics::before { background: var(--rk-loop-danger); }

.rk-card-label {
    font-size: 11px;
    color: var(--rk-loop-muted);
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    margin-bottom: 6px;
}

.rk-card-value {
    font-size: 22px;
    font-weight: 900;
    color: var(--rk-loop-dark);
    transition: color 0.3s;
}

.state-safe .rk-val-status { color: var(--rk-loop-success); }
.state-warn .rk-val-status { color: var(--rk-loop-warning); }
.state-danger .rk-val-status { color: var(--rk-loop-danger); }

.rk-card-comment {
    font-size: 13px;
    color: var(--rk-loop-text);
    margin-top: 6px;
    line-height: 1.4;
}

/* Panel Błędu Krytycznego (Za długa pętla) */
.rk-error-panel {
    display: none;
    background: #fef2f2;
    border: 1px solid #fecaca;
    padding: 15px;
    border-radius: 12px;
    color: #991b1b;
    font-size: 13px;
    line-height: 1.5;
    animation: panelPop 0.3s ease-out;
}
.rk-error-panel strong { font-weight: 800; color: #7f1d1d; display: block; font-size: 14px; margin-bottom: 4px; }
.state-danger .rk-error-panel { display: block; }

@keyframes panelPop {
    from { opacity: 0; transform: scale(0.96); }
    to { opacity: 1; transform: scale(1); }
}

/* --- TABELA LIMITÓW --- */
.rk-loop-limits {
    padding: 35px 50px 45px;
    background: #ffffff;
    border-top: 1px solid var(--rk-loop-border);
}

.rk-loop-limits h3 {
    margin: 0 0 20px 0;
    font-size: 20px;
    font-weight: 800;
    color: var(--rk-loop-dark);
}

.rk-limits-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
}

.rk-limit-item {
    background: var(--rk-loop-surface);
    padding: 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-loop-border);
    text-align: center;
}

.rk-limit-diameter {
    font-size: 14px;
    font-weight: 800;
    color: var(--rk-loop-muted);
    text-transform: uppercase;
    margin-bottom: 5px;
}

.rk-limit-length {
    font-size: 24px;
    font-weight: 900;
    color: var(--rk-loop-primary);
    margin-bottom: 8px;
}

.rk-limit-desc {
    font-size: 13px;
    color: var(--rk-loop-text);
    line-height: 1.5;
    margin: 0;
}

@media (max-width: 768px) {
    .rk-loop-header, .rk-loop-interactive, .rk-loop-limits { padding: 30px 20px; }
    .rk-loop-header h2 { font-size: 24px; }
    .rk-sim-grid { grid-template-columns: 1fr; padding: 20px; gap: 25px; }
    .rk-limits-grid { grid-template-columns: 1fr; gap: 15px; }
    .rk-diameter-selector { flex-direction: column; gap: 6px; }
    .rk-diameter-btn { padding: 10px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-dlugosc-petli-ogrzewania-podlogowego/#article",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/maksymalna-dlugosc-petli-ogrzewania-podlogowego/"
    },
    "headline": "Ile wynosi maksymalna długość pętli ogrzewania podłogowego dla rury PEX/PERT 16x2 mm?",
    "description": "Zgodnie z kryteriami inżynieryjnymi, maksymalna długość obwodu 16 mm wynosi 120 m. Przekroczenie limitu 20 kPa blokuje równoważenie instalacji na rotametrach rozdzielacza.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-dlugosc-petli-ogrzewania-podlogowego/#dataset",
    "name": "Graniczne opory hydrauliczne pętli grzewczych PEX/PERT",
    "description": "Zestawienie fizycznych limitów długości obwodów ogrzewania podłogowego w relacji do średnicy zewnętrznej i dopuszczalnych spadków ciśnień.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "maksymalna długość pętli podłogówki",
      "rura pex 16mm opory",
      "strata ciśnienia w obwodzie",
      "rotametr rozdzielacza przepływ",
      "zrównoważenie hydrauliczne instalacji"
    ],
    "measurementTechnique": "Modelowanie spadków ciśnień z uwzględnieniem chropowatości bezwzględnej rur plastikowych oraz lepkości kinematicznej wody przy średniej temperaturze pracy.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Rura o średnicy 16x2 mm: Absolutne maksimum wynosi 120 m. Rekomendowana długość robocza to 80-100 m.",
        "Rura o średnicy 17x2 mm: Maksymalny limit wynosi 140 m.",
        "Rura o średnicy 20x2 mm: Maksymalna długość obwodu to 160 m."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/maksymalna-dlugosc-petli-ogrzewania-podlogowego/#webapp",
    "name": "Interaktywny Symulator Oporów Hydraulicznych Pętli",
    "description": "Aplikacja obliczeniowa pozwalająca dynamicznie zmieniać długość obwodu oraz średnicę rury, prezentując w czasie rzeczywistym spadek ciśnienia (kPa) i wpływ na rotametry.",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5 Canvas/SVG support",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-loop-container" id="rk-loop-app">
    
    <div class="rk-loop-header">
        <div class="rk-loop-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67"></path></svg>
            Kryterium Hydrauliczne
        </div>
        <h2>Ile wynosi maksymalna długość pętli ogrzewania podłogowego dla rury PEX/PERT 16&#215;2 mm?</h2>
        <p class="rk-loop-lead">
            Maksymalna dopuszczalna długość jednej pętli grzewczej dla najpopularniejszej średnicy rury 16&#215;2 mm wynosi <strong>120 m</strong> (wliczając odcinki przyłączeniowe). Przekroczenie tej granicy powoduje drastyczny wzrost oporów hydraulicznych powyżej dopuszczalnej wartości <strong>20 kPa (0,2 bar)</strong>. Konsekwencją jest całkowity brak możliwości zrównoważenia hydraulicznego układu na <a href="https://projekt-ogrzewania.pl/rotametr-wskaznik-przeplywu-w-rozdzielaczu-ogrzewania-podlogowego/" class="rk-loop-link">rotametrach</a>, co prowadzi do „upośledzenia przepływu” i permanentnego niedogrzania strefy mieszkalnej.
        </p>
    </div>

    <div class="rk-loop-interactive">
        <h3>Interaktywny Analizator Spadków Ciśnienia</h3>
        <div class="rk-sim-grid state-safe" id="rk-loop-core">
            
            <div class="rk-sim-workspace">
                <div>
                    <div class="rk-pitch-selector-title">Wybierz średnicę zewnętrzną przewodu:</div>
                    <div class="rk-diameter-selector">
                        <button class="rk-diameter-btn active" data-dim="16">rura Ø 16&#215;2 mm</button>
                        <button class="rk-diameter-btn" data-dim="17">rura Ø 17&#215;2 mm</button>
                        <button class="rk-diameter-btn" data-dim="20">rura Ø 20&#215;2 mm</button>
                    </div>
                </div>

                <div class="rk-length-slider-box">
                    <div class="rk-slider-labels">
                        <span class="rk-slider-title">Całkowita Długość Obwodu (L)</span>
                        <span class="rk-slider-counter" id="val-length">90 m</span>
                    </div>
                    <input type="range" class="rk-main-range" id="rk-loop-slider" min="40" max="180" step="5" value="90">
                </div>

                <div class="rk-svg-viewport">
                    <svg class="rk-hydraulic-svg" viewBox="0 0 300 110" xmlns="http://www.w3.org/2000/svg">
                        <g transform="translate(10, 5)">
                            <path d="M 25 85 A 35 35 0 1 1 125 85" fill="none" stroke="#e2e8f0" stroke-width="8" stroke-linecap="round"/>
                            <circle cx="75" cy="55" r="5" fill="#334155"/>
                            <line class="svg-gauge-pointer" x1="75" y1="55" x2="45" y2="55" stroke-width="3" stroke-linecap="round"/>
                            <text x="75" y="100" font-size="11" font-weight="900" fill="#334155" text-anchor="middle">OPÓR (kPa)</text>
                        </g>

                        <g transform="translate(150, 10)">
                            <rect x="0" y="25" width="60" height="40" rx="6" fill="none" stroke="#cbd5e1" stroke-width="2"/>
                            <path d="M 10 45 L 50 45" fill="none" stroke-width="5" stroke-linecap="round" class="svg-pipe-flow"/>
                            <text x="30" y="20" font-size="10" font-weight="800" fill="#64748b" text-anchor="middle">PRZEPŁYW</text>
                        </g>

                        <g transform="translate(230, 5)">
                            <rect x="25" y="15" width="25" height="70" rx="2" fill="#f8fafc" stroke="#64748b" stroke-width="2"/>
                            <line x1="30" y1="30" x2="38" y2="30" stroke="#94a3b8" stroke-width="1"/>
                            <line x1="30" y1="45" x2="43" y2="45" stroke="#94a3b8" stroke-width="1.5"/>
                            <line x1="30" y1="60" x2="38" y2="60" stroke="#94a3b8" stroke-width="1"/>
                            <line x1="30" y1="75" x2="43" y2="75" stroke="#94a3b8" stroke-width="1.5"/>
                            <rect class="svg-rotameter-float" x="28" y="40" width="19" height="6" rx="1"/>
                            <text x="37" y="100" font-size="11" font-weight="900" fill="#334155" text-anchor="middle">L/MIN</text>
                        </g>
                    </svg>
                </div>
            </div>

            <div class="rk-sim-outputs">
                <div class="rk-output-card rk-card-hydraulics">
                    <div class="rk-card-label">Spadek Ciśnienia Pętli</div>
                    <div class="rk-card-value" id="val-pressure">11.2 kPa</div>
                    <div class="rk-card-comment">Układ stabilny. Straty ciśnienia mieszczą się w normatywnym limicie pompy obiegowej.</div>
                </div>

                <div class="rk-output-card rk-card-hydraulics">
                    <div class="rk-card-label">Stan Hydrauliczny Obwodu</div>
                    <div class="rk-card-value rk-val-status" id="val-status">Optymalny</div>
                    <div class="rk-card-comment" id="desc-status">Przepływ laminarany prawidłowy. Rotametr reaguje na nastawę.</div>
                </div>

                <div class="rk-error-panel">
                    <strong>Upośledzenie hydrauliczne pompy!</strong>
                    Opory liniowe rury drastycznie zdławiły przepływ. Rotametr opadł w okolice <strong>0,2 l/min</strong>. Ta pętla będzie całkowicie zimna. Wymagany podział na mniejsze obwody na etapie <a href="https://projekt-ogrzewania.pl/jak-zaplanowac-rozmieszczenie-petli-grzewczych-w-ogrzewaniu-podlogowym/" class="rk-loop-link" style="color: #7f1d1d;">rozmieszczenia obwodów</a>.
                </div>
            </div>

        </div>
    </div>

    <div class="rk-loop-limits">
        <h3>Maksymalne granice długości pętli rur według standardu HVAC</h3>
        <div class="rk-limits-grid">
            
            <div class="rk-limit-item">
                <div class="rk-limit-diameter">Rura Ø 16&#215;2 mm</div>
                <div class="rk-limit-length">max 120 m</div>
                <p class="rk-limit-desc">Absolutny limit dla instalacji domowych. Zalecana inżynierska długość robocza to <strong>80–100 m</strong>.</p>
            </div>

            <div class="rk-limit-item">
                <div class="rk-limit-diameter">Rura Ø 17&#215;2 mm</div>
                <div class="rk-limit-length">max 140 m</div>
                <p class="rk-limit-desc">Zwiększona średnica wewnętrzna pozwala na wydłużenie obwodu przy zachowaniu stabilności hydraulicznej.</p>
            </div>

            <div class="rk-limit-item">
                <div class="rk-limit-diameter">Rura Ø 20&#215;2 mm</div>
                <div class="rk-limit-length">max 160 m</div>
                <p class="rk-limit-desc">Stosowana na dużych przestrzeniach (hale, magazyny, obiekty przemysłowe) ze względu na dużą sztywność gięcia.</p>
            </div>

        </div>
    </div>

</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-loop-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener inżynieryjny należy do serwisu Projekt-Ogrzewania.pl. Wykryto próbę nieautoryzowanego użycia skryptu.
                </div>
            `;
            return;
        }
    }

    // Zmienne operacyjne i stanowe
    const slider = document.getElementById('rk-loop-slider');
    const layout = document.getElementById('rk-loop-core');
    const dimButtons = document.querySelectorAll('.rk-diameter-btn');

    const valLength = document.getElementById('val-length');
    const valPressure = document.getElementById('val-pressure');
    const valStatus = document.getElementById('val-status');
    const descStatus = document.getElementById('desc-status');

    // Elementy SVG do fizycznej animacji
    const svgPointer = document.querySelector('.svg-gauge-pointer');
    const svgFloat = document.querySelector('.svg-rotameter-float');

    let currentDim = 16; // Domyślna średnica rury

    const limitMap = {
        16: { max: 120, warn: 100, factor: 0.0014 },
        17: { max: 140, warn: 115, factor: 0.0010 },
        20: { max: 160, warn: 135, factor: 0.0006 }
    };

    function recalculateHydraulics() {
        const len = parseInt(slider.value);
        valLength.textContent = len + ' m';

        const config = limitMap[currentDim];

        // Wyliczenie oporów (wzrost kwadratowy ze współczynnikiem dla średnicy)
        let pressure = Math.pow(len, 2) * config.factor;
        valPressure.textContent = pressure.toFixed(1) + ' kPa';

        // Mapowanie parametrów fizycznych na ruch elementów SVG
        // Kąt wskazówki manometru: od -45deg do 135deg
        let angle = -45 + (pressure / 45) * 180;
        if(angle > 140) angle = 140; // Max wychylenie
        svgPointer.style.transform = `rotate(${angle}deg)`;

        // Pozycja pływaka rotametru (y w dół = mniejszy przepływ)
        // Zakres bazowy y: od 20 (max przepływ) do 65 (przepływ zablokowany)
        let floatY = 20 + (pressure / 40) * 45;
        if(floatY > 65) floatY = 65;
        svgFloat.style.transform = `translateY(${floatY - 40}px)`;

        // Zarządzanie stanami wizualnymi i komentarzami inżynierskimi
        layout.classList.remove('state-safe', 'state-warn', 'state-danger');

        if(len <= config.warn) {
            layout.classList.add('state-safe');
            valStatus.textContent = "Optymalny";
            descStatus.textContent = "Przepływ laminarny prawidłowy. Rotametr reaguje na nastawę rozdzielacza.";
        } 
        else if (len > config.warn && len <= config.max) {
            layout.classList.add('state-warn');
            valStatus.textContent = "Ostrzeżenie";
            descStatus.textContent = "Zwiększone opory hydrauliczne. Pompa obiegowa pracuje na wyższym biegu.";
        } 
        else {
            layout.classList.add('state-danger');
            valStatus.textContent = "Przekroczenie limitu";
            descStatus.textContent = "Zablokowanie hydrauliczne obwodu. Brak możliwości wyregulowania pętli.";
        }
    }

    // Obsługa przycisków wyboru średnicy
    dimButtons.forEach(btn => {
        btn.addEventListener('click', function() {
            dimButtons.forEach(b => b.classList.remove('active'));
            this.classList.add('active');
            currentDim = parseInt(this.getAttribute('data-dim'));
            recalculateHydraulics();
        });
    });

    if(slider) {
        slider.addEventListener('input', recalculateHydraulics);
        recalculateHydraulics(); // inicjalizacja startowa
    }
});
</script>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"></blockquote>



<style>
:root {
    --rk-vessel-dark: #0f172a;
    --rk-vessel-darker: #020617;
    --rk-vessel-brand: #0ea5e9; /* Woda / Błękit */
    --rk-vessel-brand-light: #e0f2fe;
    --rk-vessel-accent: #f43f5e; /* Naczynie wzbiorcze / Czerwień */
    --rk-vessel-success: #10b981;
    --rk-vessel-bg: #ffffff;
    --rk-vessel-surface: #f8fafc;
    --rk-vessel-border: #cbd5e1;
    --rk-vessel-text: #334155;
    --rk-vessel-muted: #64748b;
    --rk-vessel-formula: #1e293b;
    --rk-vessel-shadow: 0 20px 40px -10px rgba(14, 165, 233, 0.15);
}

.rk-vessel-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-vessel-bg);
    border-radius: 24px;
    box-shadow: var(--rk-vessel-shadow);
    border: 1px solid var(--rk-vessel-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-vessel-header {
    background: linear-gradient(135deg, var(--rk-vessel-darker) 0%, var(--rk-vessel-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-vessel-brand);
}

.rk-vessel-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(14, 165, 233, 0.2);
    color: #7dd3fc;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(125, 211, 252, 0.3);
}

.rk-vessel-header h2 {
    font-size: 30px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-vessel-header h2 span { color: var(--rk-vessel-brand); }

.rk-vessel-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-vessel-link {
    color: #7dd3fc;
    text-decoration: none;
    border-bottom: 1px dashed rgba(125, 211, 252, 0.4);
    font-weight: 600;
    transition: all 0.3s;
}

.rk-vessel-link:hover { color: #ffffff; border-bottom-style: solid; }

/* --- INTERAKTYWNY SYMULATOR --- */
.rk-vessel-interactive {
    padding: 40px 50px;
    background: var(--rk-vessel-surface);
}

.rk-vessel-interactive h3 {
    text-align: center;
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-vessel-dark);
    margin: 0 0 30px 0;
}

.rk-sim-layout {
    display: grid;
    grid-template-columns: 1fr 360px;
    gap: 30px;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-vessel-border);
    padding: 30px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
}

/* Kolumna Lewa - Suwaki i parametry */
.rk-sim-controls {
    display: flex;
    flex-direction: column;
    gap: 20px;
}

.rk-control-group {
    background: var(--rk-vessel-surface);
    padding: 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-vessel-border);
}

.rk-control-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 12px;
}

.rk-control-label {
    font-size: 13px;
    font-weight: 800;
    color: var(--rk-vessel-dark);
    text-transform: uppercase;
}

.rk-control-value {
    font-size: 20px;
    font-weight: 900;
    color: var(--rk-vessel-brand);
}

/* Suwaki */
.rk-range-input {
    -webkit-appearance: none;
    width: 100%;
    height: 8px;
    border-radius: 4px;
    background: #cbd5e1;
    outline: none;
}

.rk-range-input::-webkit-slider-thumb {
    -webkit-appearance: none;
    appearance: none;
    width: 24px;
    height: 24px;
    border-radius: 50%;
    background: var(--rk-vessel-brand);
    cursor: pointer;
    border: 4px solid #ffffff;
    box-shadow: 0 2px 5px rgba(0,0,0,0.2);
    transition: transform 0.1s;
}

.rk-range-input::-webkit-slider-thumb:active { transform: scale(1.15); }

/* Pigułki rozdzielacza */
.rk-pill-selector {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    margin-top: 10px;
}

.rk-pill-btn {
    flex: 1;
    min-width: 60px;
    padding: 10px 5px;
    background: #ffffff;
    border: 1px solid var(--rk-vessel-border);
    border-radius: 10px;
    font-size: 13px;
    font-weight: 700;
    color: var(--rk-vessel-muted);
    cursor: pointer;
    transition: all 0.2s;
    text-align: center;
}

.rk-pill-btn:hover { border-color: var(--rk-vessel-brand); color: var(--rk-vessel-brand); }
.rk-pill-btn.active { background: var(--rk-vessel-brand); color: #ffffff; border-color: var(--rk-vessel-brand); }

/* Kolumna Prawa - Wyniki i SVG */
.rk-sim-results {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

.rk-svg-viewport {
    background: #ffffff;
    border-radius: 16px;
    border: 1px dashed var(--rk-vessel-border);
    padding: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 220px;
    position: relative;
}

.rk-vessel-svg { width: 100%; max-width: 250px; height: auto; }

/* SVG Animacje */
.anim-water-level { transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); transform-origin: bottom; }
.anim-diaphragm { transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); }
.anim-gauge-needle { transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1); transform-origin: 75px 55px; }

/* Karty Wyników */
.rk-result-card {
    background: #ffffff;
    border: 1px solid var(--rk-vessel-border);
    border-radius: 12px;
    padding: 15px 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.rk-result-card.highlight {
    border-color: var(--rk-vessel-accent);
    background: #fff1f2;
}

.rk-res-label { font-size: 12px; font-weight: 800; color: var(--rk-vessel-muted); text-transform: uppercase; }
.rk-res-value { font-size: 22px; font-weight: 900; color: var(--rk-vessel-dark); }
.highlight .rk-res-label { color: #be123c; }
.highlight .rk-res-value { color: var(--rk-vessel-accent); }

/* --- SEKCJA WZORÓW --- */
.rk-vessel-formulas {
    padding: 0 50px 40px;
    background: var(--rk-vessel-surface);
}

.rk-formula-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 15px;
}

.rk-formula-box {
    background: #ffffff;
    border: 1px solid var(--rk-vessel-border);
    border-radius: 16px;
    padding: 25px;
    display: grid;
    grid-template-columns: 350px 1fr;
    gap: 30px;
    align-items: center;
}

.rk-formula-math {
    background: var(--rk-vessel-formula);
    padding: 20px;
    border-radius: 12px;
    color: #f8fafc;
    font-family: 'Courier New', Courier, monospace;
    font-size: 18px;
    font-weight: 700;
    text-align: center;
    border-left: 4px solid var(--rk-vessel-brand);
    letter-spacing: 0.5px;
}

.rk-formula-math sub { font-size: 11px; color: #93c5fd; }
.rk-formula-math span.operator { color: #f43f5e; margin: 0 5px; }

/* Custom Fraction for HTML */
.rk-html-fraction {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    vertical-align: middle;
    margin: 0 5px;
    line-height: 1.2;
}
.rk-html-numerator { border-bottom: 2px solid #cbd5e1; padding: 0 5px; }
.rk-html-denominator { padding: 0 5px; }

.rk-formula-desc h4 { margin: 0 0 10px 0; font-size: 16px; font-weight: 800; color: var(--rk-vessel-dark); }
.rk-formula-desc p { margin: 0; font-size: 14px; line-height: 1.6; color: var(--rk-vessel-text); }
.rk-formula-desc strong { font-weight: 800; color: var(--rk-vessel-dark); }

@media (max-width: 768px) {
    .rk-vessel-header, .rk-vessel-interactive, .rk-vessel-formulas { padding: 30px 20px; }
    .rk-vessel-header h2 { font-size: 24px; }
    .rk-sim-layout, .rk-formula-box { grid-template-columns: 1fr; }
    .rk-formula-box { gap: 15px; padding: 20px; }
    .rk-svg-viewport { min-height: 180px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/ile-wody-miesci-sie-w-1-metrze-rury-pex-pert-16/#article",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/ile-wody-miesci-sie-w-1-metrze-rury-pex-pert-16/"
    },
    "headline": "Ile litrów wody mieści się w instalacji podłogówki i jak dobrać naczynie wzbiorcze?",
    "description": "Procedura obliczeniowa pojemności zładu i naczynia przeponowego według normy PN-EN 12828. Poznaj wzory i kalkulator pojemności rur PEX/PERT 16x2 mm.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/ile-wody-miesci-sie-w-1-metrze-rury-pex-pert-16/#dataset",
    "name": "Algorytm doboru naczynia wzbiorczego PN-EN 12828",
    "description": "Matematyczne zestawienie kroków i współczynników wymaganych do obliczenia całkowitego zładu wodnego i minimalnej pojemności naczynia kompensacyjnego.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "pojemność wodna rury pex 16",
      "jak dobrać naczynie wzbiorcze",
      "wzór na naczynie przeponowe",
      "zład wody ogrzewanie podłogowe",
      "norma PN-EN 12828"
    ],
    "measurementTechnique": "Szeregowanie algorytmiczne wg norm europejskich, uwzględniające rozszerzalność wody, ciśnienie wstępne i zapas bezpieczeństwa.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Pojemność rur: V_rur = L_calk * 0,113 l/mb",
        "Pojemność instalacji: V_inst = V_rur + V_rozdz + V_buf",
        "Pojemność użytkowa: V_e = V_inst * e * 1,3",
        "Pojemność nominalna: V_n = V_e * ((p_max + 1) / (p_max - p_p))"
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/ile-wody-miesci-sie-w-1-metrze-rury-pex-pert-16/#webapp",
    "name": "Kalkulator Pojemności Zładu i Naczynia Wzbiorczego",
    "description": "Interaktywne narzędzie obliczające pojemność całkowitą instalacji ogrzewania podłogowego oraz dobierające normatywną pojemność naczynia przeponowego.",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-vessel-container" id="rk-vessel-app">
    
    <div class="rk-vessel-header">
        <div class="rk-vessel-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20"></path><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg>
            Pojemność i Kompensacja
        </div>
        <h2>Ile litrów wody mieści się w instalacji podłogówki i <span>jak dobrać naczynie wzbiorcze?</span></h2>
        <p class="rk-vessel-lead">
            Pojemność wodna jednego metra bieżącego rury PERT/PEX o średnicy 16&#215;2 mm wynosi dokładnie <strong>0,113 litra</strong>. Do obliczenia całkowitej pojemności zładu instalacji należy zsumować objętość rur podłogówki, belek <a href="https://projekt-ogrzewania.pl/rozdzielacz-do-podlogowki-kluczowy-element-systemu-ogrzewania-podlogowego/" class="rk-vessel-link">rozdzielacza</a> oraz źródła ciepła (np. <a href="https://projekt-ogrzewania.pl/bufor-ciepla-w-ogrzewaniu-podlogowym/" class="rk-vessel-link">bufora</a>). <a href="https://projekt-ogrzewania.pl/naczynie-wzbiorcze/" class="rk-vessel-link">Naczynie wzbiorcze</a> dobiera się w oparciu o normę <strong>PN-EN 12828</strong>, przyjmując minimalny współczynnik rezerwy pojemności na poziomie 4% całkowitej objętości zładu.
        </p>
    </div>

    <div class="rk-vessel-interactive">
        <h3>Kalkulator Zładu i Naczynia Wzbiorczego</h3>
        
        <div class="rk-sim-layout">
            
            <div class="rk-sim-controls">
                
                <div class="rk-control-group">
                    <div class="rk-control-header">
                        <span class="rk-control-label">Długość rur (L<sub>całk</sub>)</span>
                        <span class="rk-control-value" id="val-pipe">800 m</span>
                    </div>
                    <input type="range" class="rk-range-input" id="range-pipe" min="100" max="2500" step="50" value="800">
                </div>

                <div class="rk-control-group">
                    <div class="rk-control-header">
                        <span class="rk-control-label">Zbiornik Buforowy</span>
                        <span class="rk-control-value" id="val-buffer">60 L</span>
                    </div>
                    <input type="range" class="rk-range-input" id="range-buffer" min="0" max="500" step="10" value="60">
                </div>

                <div class="rk-control-group">
                    <div class="rk-control-header">
                        <span class="rk-control-label">Liczba sekcji rozdzielacza</span>
                    </div>
                    <div class="rk-pill-selector">
                        <button class="rk-pill-btn" data-sec="4">4 sek.</button>
                        <button class="rk-pill-btn" data-sec="8">8 sek.</button>
                        <button class="rk-pill-btn active" data-sec="12">12 sek.</button>
                        <button class="rk-pill-btn" data-sec="16">16 sek.</button>
                    </div>
                </div>

            </div>

            <div class="rk-sim-results">
                
                <div class="rk-svg-viewport">
                    <svg class="rk-vessel-svg" viewBox="0 0 200 160" xmlns="http://www.w3.org/2000/svg">
                        <path d="M 70 20 Q 100 10 130 20 L 130 140 Q 100 150 70 140 Z" fill="#e2e8f0" stroke="#94a3b8" stroke-width="4"/>
                        <path class="anim-diaphragm" id="svg-diaphragm" d="M 72 80 Q 100 110 128 80" fill="none" stroke="#334155" stroke-width="3" stroke-dasharray="4"/>
                        <g transform="translate(0, 145)">
                            <path class="anim-water-level" id="svg-water" d="M 72 -5 Q 100 5 128 -5 L 128 -65 Q 100 -55 72 -65 Z" fill="#0ea5e9" opacity="0.8"/>
                        </g>
                        <rect x="95" y="145" width="10" height="15" fill="#64748b"/>
                        <path d="M 85 155 L 115 155" fill="none" stroke="#64748b" stroke-width="4"/>
                        
                        <g transform="translate(150, 40)">
                            <circle cx="20" cy="20" r="18" fill="#ffffff" stroke="#cbd5e1" stroke-width="3"/>
                            <path d="M 8 20 A 12 12 0 0 1 32 20" fill="none" stroke="#10b981" stroke-width="4"/>
                            <path d="M 32 20 A 12 12 0 0 1 12 28" fill="none" stroke="#f43f5e" stroke-width="4"/>
                            <circle cx="20" cy="20" r="3" fill="#334155"/>
                            <line class="anim-gauge-needle" id="svg-needle" x1="20" y1="20" x2="10" y2="10" stroke="#334155" stroke-width="2" stroke-linecap="round" style="transform-origin: 20px 20px;"/>
                        </g>
                    </svg>
                </div>

                <div class="rk-result-card">
                    <div class="rk-res-label">Całkowity zład (V<sub>inst</sub>)</div>
                    <div class="rk-res-value" id="res-total">156.4 L</div>
                </div>

                <div class="rk-result-card highlight">
                    <div class="rk-res-label">Min. Naczynie (V<sub>n</sub>)</div>
                    <div class="rk-res-value" id="res-vessel">12 L</div>
                </div>

            </div>

        </div>
    </div>

    <div class="rk-vessel-formulas">
        <h3 style="font-size: 20px; font-weight: 800; color: var(--rk-vessel-dark); margin: 0 0 20px 0; text-align: center;">Procedura obliczeniowa wg PN-EN 12828</h3>
        
        <div class="rk-formula-grid">
            
            <div class="rk-formula-box">
                <div class="rk-formula-math">
                    V<sub>rur</sub> = L<sub>całk</sub> <span class="operator">&times;</span> 0,113 <span style="font-size:12px;color:#94a3b8;">l/mb</span>
                </div>
                <div class="rk-formula-desc">
                    <h4>1. Pojemność wodna rur (V<sub>rur</sub>)</h4>
                    <p>Mnożymy całkowitą długość zastosowanej rury grzewczej PEX 16&#215;2 mm przez jej stałą pojemność wewnętrzną wynoszącą <strong>0,113 litra na metr bieżący</strong>.</p>
                </div>
            </div>

            <div class="rk-formula-box">
                <div class="rk-formula-math">
                    V<sub>inst</sub> = V<sub>rur</sub> <span class="operator">+</span> V<sub>rozdz</sub> <span class="operator">+</span> V<sub>buf</sub>
                </div>
                <div class="rk-formula-desc">
                    <h4>2. Całkowita pojemność instalacji (V<sub>inst</sub>)</h4>
                    <p>Gdzie <strong>V<sub>rozdz</sub></strong> to objętość belek i armatury (średnio 0,5 l na każdą sekcję rozdzielacza), a <strong>V<sub>buf</sub></strong> to pojemność ewentualnego zbiornika buforowego lub sprzęgła.</p>
                </div>
            </div>

            <div class="rk-formula-box">
                <div class="rk-formula-math">
                    V<sub>e</sub> = V<sub>inst</sub> <span class="operator">&times;</span> e <span class="operator">&times;</span> 1,3
                </div>
                <div class="rk-formula-desc">
                    <h4>3. Pojemność użytkowa naczynia (V<sub>e</sub>)</h4>
                    <p>Gdzie <strong>e</strong> to współczynnik rozszerzalności wody (dla t<sub>z</sub> = 45°C wynosi <strong>0,0095</strong>), a <strong>1,3</strong> to wymagany współczynnik bezpieczeństwa rezerwy wody.</p>
                </div>
            </div>

            <div class="rk-formula-box">
                <div class="rk-formula-math" style="display: flex; align-items: center; justify-content: center;">
                    V<sub>n</sub> = V<sub>e</sub> <span class="operator">&times;</span>
                    <div class="rk-html-fraction">
                        <div class="rk-html-numerator">p<sub>max</sub> + 1</div>
                        <div class="rk-html-denominator">p<sub>max</sub> &#8211; p<sub>p</sub></div>
                    </div>
                </div>
                <div class="rk-formula-desc">
                    <h4>4. Minimalna pojemność nominalna (V<sub>n</sub>)</h4>
                    <p>Gdzie <strong>p<sub>max</sub></strong> to max. dopuszczalne ciśnienie (zawór bezpieczeństwa – zwykle 3,0 bar), a <strong>p<sub>p</sub></strong> to ciśnienie wstępne gazu w naczyniu (zwykle 1,0–1,5 bar).</p>
                </div>
            </div>

        </div>
    </div>

</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-vessel-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener inżynieryjny należy do serwisu Projekt-Ogrzewania.pl. Wykryto próbę kradzieży kodu źródłowego.
                </div>
            `;
            return;
        }
    }

    // Zmienne UI
    const rangePipe = document.getElementById('range-pipe');
    const rangeBuffer = document.getElementById('range-buffer');
    const pillSecs = document.querySelectorAll('.rk-pill-btn');
    
    const valPipe = document.getElementById('val-pipe');
    const valBuffer = document.getElementById('val-buffer');
    const resTotal = document.getElementById('res-total');
    const resVessel = document.getElementById('res-vessel');

    // SVG Elementy
    const svgWater = document.getElementById('svg-water');
    const svgDiaphragm = document.getElementById('svg-diaphragm');
    const svgNeedle = document.getElementById('svg-needle');

    let sections = 12; // Domyślna wartość
    const standardVessels = [8, 12, 18, 24, 35, 50, 80, 100, 150];

    function calculateVessel() {
        const L = parseFloat(rangePipe.value);
        const buf = parseFloat(rangeBuffer.value);
        
        // Update Labels
        valPipe.textContent = L + ' m';
        valBuffer.textContent = buf + ' L';

        // Matematyka wg PN-EN 12828
        const V_rur = L * 0.113;
        const V_rozdz = sections * 0.5;
        const V_inst = V_rur + V_rozdz + buf;
        
        // Dla 45 st C, e = 0.0095
        const V_e = V_inst * 0.0095 * 1.3;
        
        // V_n = V_e * ((3 + 1) / (3 - 1.2)) = V_e * (4 / 1.8) = V_e * 2.222
        const V_n_min = V_e * 2.222;

        // Znajdź najbliższe większe naczynie handlowe
        let chosenVessel = standardVessels[standardVessels.length - 1];
        for(let v of standardVessels) {
            if(v >= V_n_min) {
                chosenVessel = v;
                break;
            }
        }

        // Update DOM
        resTotal.textContent = V_inst.toFixed(1) + ' L';
        resVessel.textContent = chosenVessel + ' L';

        // Animacja SVG (Wizualizacja wypełnienia/ciśnienia)
        // Im większy zład, tym membrana idzie wyżej, woda wypełnia się mocniej
        let fillRatio = V_n_min / 50; // Arbitralna skala dla animacji
        if(fillRatio > 1) fillRatio = 1;
        if(fillRatio < 0.2) fillRatio = 0.2;

        // Woda - skalowanie w Y (od dołu, od -145px)
        svgWater.style.transform = `scaleY(${fillRatio * 1.2})`;
        
        // Membrana - przesuwanie w górę
        let dShift = -20 * fillRatio;
        svgDiaphragm.style.transform = `translateY(${dShift}px)`;

        // Zegar - rotacja wskazówki (symulacja wzrostu ciśnienia z objętością)
        let angle = -45 + (fillRatio * 180);
        if(angle > 135) angle = 135;
        svgNeedle.style.transform = `rotate(${angle}deg)`;
    }

    // Event Listenery
    if(rangePipe && rangeBuffer) {
        rangePipe.addEventListener('input', calculateVessel);
        rangeBuffer.addEventListener('input', calculateVessel);
        
        pillSecs.forEach(btn => {
            btn.addEventListener('click', function() {
                pillSecs.forEach(b => b.classList.remove('active'));
                this.classList.add('active');
                sections = parseInt(this.getAttribute('data-sec'));
                calculateVessel();
            });
        });

        // Init
        calculateVessel();
    }
});
</script>



<style>
:root {
    --rk-cases-dark: #0f172a;
    --rk-cases-panel: #1e293b;
    --rk-cases-primary: #3b82f6; /* Blue for tech/math */
    --rk-cases-success: #10b981; /* Green for correct calcs */
    --rk-cases-danger: #ef4444; /* Red for errors (Case 2) */
    --rk-cases-warning: #f59e0b;
    --rk-cases-bg: #f8fafc;
    --rk-cases-border: #e2e8f0;
    --rk-cases-text: #334155;
    --rk-cases-muted: #64748b;
}

.rk-cases-container {
    max-width: 950px;
    margin: 50px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: #ffffff;
    border-radius: 24px;
    box-shadow: 0 25px 50px -12px rgba(15, 23, 42, 0.15);
    border: 1px solid rgba(59, 130, 246, 0.3);
    overflow: hidden;
}

/* Header */
.rk-cases-header {
    background: linear-gradient(135deg, var(--rk-cases-dark) 0%, #1e293b 100%);
    padding: 40px 50px;
    color: #ffffff;
    border-bottom: 5px solid var(--rk-cases-primary);
    position: relative;
}

.rk-cases-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(59, 130, 246, 0.2);
    color: #93c5fd;
    padding: 6px 14px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 15px;
    border: 1px solid rgba(147, 197, 253, 0.3);
}

.rk-cases-title {
    font-size: 28px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 15px 0;
    color: #ffffff;
}

.rk-cases-title span { color: #60a5fa; }

.rk-cases-desc {
    color: #cbd5e1;
    font-size: 15px;
    line-height: 1.7;
    margin: 0;
    max-width: 800px;
}

/* Navigation / Tabs */
.rk-cases-nav {
    display: flex;
    background: #f1f5f9;
    border-bottom: 1px solid var(--rk-cases-border);
    overflow-x: auto;
    scrollbar-width: none;
}
.rk-cases-nav::-webkit-scrollbar { display: none; }

.rk-case-tab {
    flex: 1;
    padding: 20px 15px;
    background: transparent;
    border: none;
    border-bottom: 3px solid transparent;
    font-size: 15px;
    font-weight: 800;
    color: var(--rk-cases-muted);
    cursor: pointer;
    transition: all 0.3s;
    white-space: nowrap;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 10px;
}

.rk-case-tab:hover {
    color: var(--rk-cases-primary);
    background: rgba(59, 130, 246, 0.05);
}

.rk-case-tab.active {
    color: var(--rk-cases-primary);
    border-bottom-color: var(--rk-cases-primary);
    background: #ffffff;
}

/* Content Area */
.rk-cases-content {
    background: #ffffff;
    padding: 0;
}

.rk-case-panel {
    display: none;
    animation: caseFade 0.4s ease-out;
}

.rk-case-panel.active {
    display: grid;
    grid-template-columns: 1fr 300px;
}

@keyframes caseFade {
    from { opacity: 0; transform: translateY(10px); }
    to { opacity: 1; transform: translateY(0); }
}

/* Left: Data & Math */
.rk-case-data {
    padding: 40px 50px;
    border-right: 1px solid var(--rk-cases-border);
}

.rk-case-data h3 {
    margin: 0 0 20px 0;
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-cases-dark);
}

.rk-data-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 15px;
    margin-bottom: 25px;
}

.rk-data-item {
    background: var(--rk-cases-bg);
    padding: 12px 15px;
    border-radius: 8px;
    border: 1px solid var(--rk-cases-border);
    display: flex;
    justify-content: space-between;
    align-items: center;
}

.rk-data-label { font-size: 13px; color: var(--rk-cases-muted); font-weight: 700; }
.rk-data-val { font-size: 14px; font-weight: 900; color: var(--rk-cases-dark); }

.rk-math-block {
    background: #1e293b;
    border-radius: 12px;
    padding: 20px;
    color: #f8fafc;
    font-family: 'Courier New', Courier, monospace;
    font-size: 15px;
    margin-bottom: 25px;
    border-left: 4px solid var(--rk-cases-primary);
    box-shadow: inset 0 4px 6px rgba(0,0,0,0.2);
}

.rk-math-line {
    margin-bottom: 10px;
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    line-height: 1.5;
}
.rk-math-line:last-child { margin-bottom: 0; }

.rk-math-highlight {
    color: #38bdf8;
    font-weight: 900;
    font-size: 17px;
}

.rk-math-result {
    color: #10b981; /* Green for results */
    font-weight: 900;
    font-size: 18px;
}

.rk-case-panel[data-status="fail"] .rk-math-result {
    color: #ef4444; /* Red for bad results */
}

/* Right: Visuals & Conclusion */
.rk-case-visuals {
    background: #f8fafc;
    display: flex;
    flex-direction: column;
}

.rk-svg-wrapper {
    height: 220px;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: #e2e8f0;
    border-bottom: 1px solid var(--rk-cases-border);
    position: relative;
    overflow: hidden;
}

.rk-case-conclusion {
    padding: 30px;
    flex-grow: 1;
}

.rk-case-conclusion h4 {
    margin: 0 0 10px 0;
    font-size: 16px;
    font-weight: 900;
    text-transform: uppercase;
}

.rk-case-panel[data-status="success"] .rk-case-conclusion h4 { color: var(--rk-cases-success); }
.rk-case-panel[data-status="fail"] .rk-case-conclusion h4 { color: var(--rk-cases-danger); }
.rk-case-panel[data-status="info"] .rk-case-conclusion h4 { color: var(--rk-cases-primary); }

.rk-case-conclusion p {
    margin: 0;
    font-size: 14px;
    line-height: 1.6;
    color: var(--rk-cases-text);
}

/* Custom Math elements to avoid LaTeX inside HTML */
.rk-fraction {
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    vertical-align: middle;
    margin: 0 5px;
}
.rk-numerator {
    border-bottom: 1px solid #94a3b8;
    padding: 0 5px;
    font-size: 14px;
}
.rk-denominator {
    padding: 0 5px;
    font-size: 14px;
}

/* SVG Animations based on active panel */
.anim-loop-draw { stroke-dasharray: 100; stroke-dashoffset: 100; }
.rk-case-panel.active .anim-loop-draw { animation: drawLoop 2s forwards ease-out; }
.rk-case-panel.active .anim-loop-draw:nth-child(2) { animation-delay: 0.5s; }
.rk-case-panel.active .anim-loop-draw:nth-child(3) { animation-delay: 1s; }
.rk-case-panel.active .anim-loop-draw:nth-child(4) { animation-delay: 1.5s; }
@keyframes drawLoop { to { stroke-dashoffset: 0; } }

.rk-case-panel.active .anim-gauge-needle { animation: overPressure 2s forwards cubic-bezier(0.4, 0, 0.2, 1); }
@keyframes overPressure { 
    0% { transform: rotate(-45deg); } 
    70% { transform: rotate(135deg); stroke: #ef4444; } 
    80% { transform: rotate(120deg); stroke: #ef4444; } 
    100% { transform: rotate(130deg); stroke: #ef4444; } 
}

.rk-case-panel.active .anim-vessel-fill { animation: fillVessel 2s forwards ease-out; }
@keyframes fillVessel { from { transform: scaleY(0); } to { transform: scaleY(1); } }

/* Mobile View */
@media (max-width: 768px) {
    .rk-cases-header { padding: 30px 20px; }
    .rk-cases-title { font-size: 24px; }
    .rk-case-panel.active { grid-template-columns: 1fr; }
    .rk-case-data { padding: 30px 20px; border-right: none; border-bottom: 1px solid var(--rk-cases-border); }
    .rk-data-grid { grid-template-columns: 1fr; gap: 10px; }
    .rk-svg-wrapper { height: 180px; }
    .rk-case-tab { padding: 15px 20px; font-size: 14px; }
    .rk-math-block { padding: 15px; font-size: 13px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-case-studies",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Przykłady obliczeniowe instalacji ogrzewania podłogowego – Case Studies",
    "description": "Praktyczne przykłady obliczeń hydraulicznych i termicznych: salon z aneksem, przewymiarowana pętla 150m oraz dobór naczynia wzbiorczego.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-23",
    "dateModified": "2026-05-23"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-case-studies",
    "name": "Wyniki Symulacji Parametrów Ogrzewania Podłogowego",
    "description": "Szczegółowe dane liczbowe, wzory i konkluzje inżynierskie dla 3 popularnych wariantów instalacyjnych.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "obliczenia ogrzewania podłogowego",
      "dobór naczynia wzbiorczego",
      "prędkość przepływu wody w rurze",
      "strumień masowy podłogówki",
      "podział na pętle grzewcze"
    ],
    "measurementTechnique": "Szacunki numeryczne oparte o normę PN-EN 1264 z zastosowaniem fizycznych równań zachowania energii i oporów przepływu.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Salon 45m2: Zapotrzebowanie 1800W generuje 4 pętle po 77m przy rozstawie 15cm.",
        "Pętla 150m: Wymaga przepływu 0.344 m3/h i generuje niszczący opór rzędu 43 kPa.",
        "Zład 1050m rury: Wymaga naczynia wzbiorczego o objętości min. 8 litrów dla bezpieczeństwa."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-case-studies",
    "name": "Kalkulator Prędkości i Pojemności Wodnej",
    "description": "Interaktywny moduł edukacyjny prezentujący analizę 3 przypadków obliczeniowych (Case Studies) z dynamicznymi wykresami SVG i wnioskami.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-cases-container" id="rk-cases-app">
    
    <div class="rk-cases-header">
        <div class="rk-cases-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
            Analiza Przypadków (Case Studies)
        </div>
        <h2 class="rk-cases-title">Przykłady obliczeniowe instalacji <span>podłogówki</span></h2>
        <p class="rk-cases-desc">Poniżej przedstawiam trzy rzeczywiste scenariusze z kart projektowych. Zobacz, jak wzory matematyczne normy PN-EN przekładają się na dobór rur, analizę błędów wykonawczych i bezpieczeństwo hydrauliczne układu.</p>
    </div>

    <div class="rk-cases-nav">
        <button class="rk-case-tab active" data-target="case-1">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="3" y1="9" x2="21" y2="9"></line><line x1="9" y1="21" x2="9" y2="9"></line></svg>
            1. Salon 45 m² (Idealny)
        </button>
        <button class="rk-case-tab" data-target="case-2">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="8" x2="12" y2="12"></line><line x1="12" y1="16" x2="12.01" y2="16"></line></svg>
            2. Pętla 150 m (Błąd)
        </button>
        <button class="rk-case-tab" data-target="case-3">
            <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20"></path><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg>
            3. Pojemność i Wzbiorcze
        </button>
    </div>

    <div class="rk-cases-content">
        
        <div class="rk-case-panel active" id="case-1" data-status="success">
            <div class="rk-case-data">
                <h3>Przykład 1: Salon z aneksem</h3>
                
                <div class="rk-data-grid">
                    <div class="rk-data-item"><span class="rk-data-label">Pow. podłogi (A):</span> <span class="rk-data-val">45 m²</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Standard (q):</span> <span class="rk-data-val">40 W/m²</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Pow. grzewcza (A<sub>grz</sub>):</span> <span class="rk-data-val">40 m²</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Rozstaw (a):</span> <span class="rk-data-val">15 cm (0.15m)</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Zabudowa stała:</span> <span class="rk-data-val">5 m²</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Długość dobiegu:</span> <span class="rk-data-val">16 m</span></div>
                </div>

                <div class="rk-math-block">
                    <div class="rk-math-line">
                        <span>Zapotrzebowanie (Q<sub>obl</sub>):</span>
                        <span class="rk-math-highlight">45 &times; 40</span>
                        <span>=</span>
                        <span class="rk-math-result">1800 W</span>
                    </div>
                    <div class="rk-math-line" style="margin-top:15px;">
                        <span>Dł. rury (L):</span>
                        <span>(40 / 0.15) &times; 1.1 + 16</span>
                        <span>=</span>
                        <span class="rk-math-highlight">309.33 m</span>
                    </div>
                    <div class="rk-math-line" style="margin-top:15px; border-top:1px dashed #475569; padding-top:15px;">
                        <span>Podział:</span>
                        <span>309.33 / 100 &approx; 3.09</span>
                        <span>&rarr;</span>
                        <span class="rk-math-result">4 pętle (po ~77m)</span>
                    </div>
                </div>
            </div>
            <div class="rk-case-visuals">
                <div class="rk-svg-wrapper">
                    <svg viewBox="0 0 100 100" style="width:100%; height:100%;">
                        <rect x="10" y="20" width="15" height="60" fill="#334155" rx="3"/>
                        <path class="anim-loop-draw" d="M 25 30 L 80 30 Q 90 30 90 40 L 40 40" fill="none" stroke="#10b981" stroke-width="3" stroke-linecap="round"/>
                        <path class="anim-loop-draw" d="M 25 45 L 80 45 Q 90 45 90 55 L 40 55" fill="none" stroke="#10b981" stroke-width="3" stroke-linecap="round"/>
                        <path class="anim-loop-draw" d="M 25 60 L 80 60 Q 90 60 90 70 L 40 70" fill="none" stroke="#10b981" stroke-width="3" stroke-linecap="round"/>
                        <path class="anim-loop-draw" d="M 25 75 L 80 75 Q 90 75 90 85 L 40 85" fill="none" stroke="#10b981" stroke-width="3" stroke-linecap="round"/>
                    </svg>
                </div>
                <div class="rk-case-conclusion">
                    <h4>Wniosek Inżynierski</h4>
                    <p>Podział na 4 krótkie pętle (około 77 metrów każda) gwarantuje bardzo niskie opory hydrauliczne, poniżej 15 kPa. Rotametry dadzą się idealnie wyregulować, a pompa ciepła nie będzie przeciążona.</p>
                </div>
            </div>
        </div>

        <div class="rk-case-panel" id="case-2" data-status="fail">
            <div class="rk-case-data">
                <h3>Przykład 2: Hydraulika zbyt długiej pętli</h3>
                
                <div class="rk-data-grid">
                    <div class="rk-data-item"><span class="rk-data-label">Długość rury (L):</span> <span class="rk-data-val">150 m</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Śr. wewnętrzna:</span> <span class="rk-data-val">12 mm (16&#215;2)</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Moc pętli (Q):</span> <span class="rk-data-val">2000 W</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Schłodzenie (&Delta;T):</span> <span class="rk-data-val">5 K</span></div>
                </div>

                <div class="rk-math-block">
                    <div class="rk-math-line">
                        <span>Wymagany strumień wody (m):</span>
                    </div>
                    <div class="rk-math-line">
                        <span>m =</span>
                        <div class="rk-fraction">
                            <span class="rk-numerator">2000</span>
                            <span class="rk-denominator">4186 &times; 5</span>
                        </div>
                        <span>&times; 3600 &approx;</span>
                        <span class="rk-math-highlight">344 kg/h</span>
                    </div>
                    <div class="rk-math-line" style="margin-top:15px; border-top:1px dashed #475569; padding-top:15px;">
                        <span>Prędkość (v):</span>
                        <span class="rk-math-result" style="color:#f59e0b;">0.85 m/s (Szumy!)</span>
                    </div>
                    <div class="rk-math-line">
                        <span>Opór liniowy dla 150m:</span>
                        <span class="rk-math-result">aż 43 kPa</span>
                    </div>
                </div>
            </div>
            <div class="rk-case-visuals">
                <div class="rk-svg-wrapper">
                    <svg viewBox="0 0 100 100" style="width:100%; height:100%;">
                        <path d="M 20 70 A 40 40 0 1 1 80 70" fill="none" stroke="#cbd5e1" stroke-width="8" stroke-linecap="round"/>
                        <path d="M 60 22 A 40 40 0 0 1 80 70" fill="none" stroke="#ef4444" stroke-width="8" stroke-linecap="round"/>
                        <line class="anim-gauge-needle" x1="50" y1="50" x2="20" y2="50" stroke="#334155" stroke-width="4" stroke-linecap="round" style="transform-origin: 50px 50px;"/>
                        <circle cx="50" cy="50" r="6" fill="#1e293b"/>
                        <text x="50" y="85" font-size="14" font-weight="900" fill="#ef4444" text-anchor="middle">43 kPa</text>
                    </svg>
                </div>
                <div class="rk-case-conclusion">
                    <h4>Błąd Krytyczny!</h4>
                    <p>Żadna standardowa pompa obiegowa nie zapewni tak wysokiego ciśnienia dyspozycyjnego dla jednej pętli przy zachowaniu przepływów na reszcie instalacji. <strong>Efekt: Pętla po prostu przestanie grzać.</strong></p>
                </div>
            </div>
        </div>

        <div class="rk-case-panel" id="case-3" data-status="info">
            <div class="rk-case-data">
                <h3>Przykład 3: Pojemność i Naczynie</h3>
                
                <div class="rk-data-grid">
                    <div class="rk-data-item"><span class="rk-data-label">Pow. domu:</span> <span class="rk-data-val">150 m²</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Całk. dł. rur:</span> <span class="rk-data-val">1050 m</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Rozdzielacz:</span> <span class="rk-data-val">12 sekcji</span></div>
                    <div class="rk-data-item"><span class="rk-data-label">Bufor sprzęgłowy:</span> <span class="rk-data-val">60 L</span></div>
                </div>

                <div class="rk-math-block">
                    <div class="rk-math-line">
                        <span>Pojemność rur (V<sub>rur</sub>):</span>
                        <span>1050 &times; 0.113 =</span>
                        <span class="rk-math-highlight">118.65 L</span>
                    </div>
                    <div class="rk-math-line">
                        <span>Całk. zład (V<sub>inst</sub>):</span>
                        <span>118.65 + (12 &times; 0.5) + 60 =</span>
                        <span class="rk-math-highlight">184.65 L</span>
                    </div>
                    <div class="rk-math-line" style="margin-top:15px; border-top:1px dashed #475569; padding-top:15px;">
                        <span>Obj. użytkowa (V<sub>e</sub>):</span>
                        <span>184.65 &times; 0.0095 &times; 1.3 =</span>
                        <span class="rk-math-highlight">2.28 L</span>
                    </div>
                    <div class="rk-math-line">
                        <span>Min. naczynie (V<sub>n</sub>):</span>
                        <span>2.28 &times; 2.22 =</span>
                        <span class="rk-math-result">5.06 L</span>
                    </div>
                </div>
            </div>
            <div class="rk-case-visuals">
                <div class="rk-svg-wrapper">
                    <svg viewBox="0 0 100 100" style="width:100%; height:100%;">
                        <rect x="30" y="20" width="40" height="60" fill="#cbd5e1" rx="20"/>
                        <rect class="anim-vessel-fill" x="30" y="50" width="40" height="30" fill="#3b82f6" rx="15" style="transform-origin: bottom;"/>
                        <line x1="50" y1="20" x2="50" y2="10" stroke="#334155" stroke-width="4"/>
                        <path d="M 30 50 Q 50 40 70 50" fill="none" stroke="#1e293b" stroke-width="2" stroke-dasharray="4"/>
                        <text x="50" y="65" font-size="14" font-weight="900" fill="#ffffff" text-anchor="middle">8 L</text>
                    </svg>
                </div>
                <div class="rk-case-conclusion">
                    <h4>Bezpieczeństwo Układu</h4>
                    <p>Obliczenia wykazują minimalną pojemność na poziomie 5.06 L. Należy zakupić standardowe naczynie o pojemności <strong>8 litrów</strong>. Poleganie na małym, 5-litrowym naczyniu wbudowanym w kocioł doprowadzi do wyrzutów wody przez zawór bezpieczeństwa.</p>
                </div>
            </div>
        </div>

    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-cases-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener inżynierski należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na tej domenie jest nieautoryzowane.
                </div>
            `;
            return;
        }
    }

    // Logika Zakładek (Case Studies)
    const tabs = document.querySelectorAll('.rk-case-tab');
    const panels = document.querySelectorAll('.rk-case-panel');

    tabs.forEach(tab => {
        tab.addEventListener('click', () => {
            const targetId = tab.getAttribute('data-target');
            
            // Czyszczenie klas aktywnych
            tabs.forEach(t => t.classList.remove('active'));
            panels.forEach(p => p.classList.remove('active'));
            
            // Aktywacja wybranego
            tab.classList.add('active');
            const activePanel = document.getElementById(targetId);
            
            // Restart CSS animations for SVGs by forcing reflow
            if (activePanel) {
                activePanel.classList.remove('active');
                void activePanel.offsetWidth; 
                activePanel.classList.add('active');
            }
        });
    });
});
</script>



<style>
:root {
    --rk-proj-dark: #0f172a;
    --rk-proj-darker: #020617;
    --rk-proj-brand: #4f46e5; /* Indigo techniczne */
    --rk-proj-brand-light: #e0e7ff;
    --rk-proj-accent: #06b6d4; /* Cyjan / inżynieryjny akcent */
    --rk-proj-bg: #ffffff;
    --rk-proj-surface: #f8fafc;
    --rk-proj-border: #cbd5e1;
    --rk-proj-text: #334155;
    --rk-proj-muted: #64748b;
    --rk-proj-shadow: 0 20px 40px -10px rgba(79, 70, 229, 0.15);
}

.rk-proj-container {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-proj-bg);
    border-radius: 24px;
    box-shadow: var(--rk-proj-shadow);
    border: 1px solid var(--rk-proj-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-proj-header {
    background: linear-gradient(135deg, var(--rk-proj-darker) 0%, var(--rk-proj-dark) 100%);
    padding: 45px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 4px solid var(--rk-proj-brand);
}

.rk-proj-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(79, 70, 229, 0.2);
    color: #a5b4fc;
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
    border: 1px solid rgba(165, 180, 252, 0.3);
}

.rk-proj-header h2 {
    font-size: 30px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 20px 0;
    color: #ffffff;
}

.rk-proj-header h2 span { color: var(--rk-proj-accent); }

.rk-proj-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-proj-link {
    color: #a5b4fc;
    text-decoration: none;
    border-bottom: 1px dashed rgba(165, 180, 252, 0.4);
    font-weight: 600;
    transition: all 0.3s;
}
.rk-proj-link:hover { color: #ffffff; border-bottom-style: solid; }

.rk-proj-link-dark {
    color: var(--rk-proj-brand);
    text-decoration: underline;
    text-underline-offset: 3px;
    font-weight: 700;
    transition: color 0.3s;
}
.rk-proj-link-dark:hover { color: #3730a3; }

/* --- INTERAKTYWNE FILARY --- */
.rk-proj-interactive {
    padding: 40px 50px;
    background: var(--rk-proj-surface);
}

.rk-proj-interactive h3 {
    text-align: center;
    font-size: 22px;
    font-weight: 900;
    color: var(--rk-proj-dark);
    margin: 0 0 30px 0;
    text-transform: uppercase;
    letter-spacing: 0.5px;
}

.rk-pillars-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 15px;
    margin-bottom: 30px;
}

.rk-pillar-btn {
    background: #ffffff;
    border: 2px solid var(--rk-proj-border);
    border-radius: 16px;
    padding: 20px 15px;
    cursor: pointer;
    text-align: center;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
}

.rk-pillar-btn:hover {
    border-color: var(--rk-proj-brand);
    background: var(--rk-proj-brand-light);
    transform: translateY(-3px);
}

.rk-pillar-btn.active {
    border-color: var(--rk-proj-brand);
    background: var(--rk-proj-brand);
    color: #ffffff;
    box-shadow: 0 10px 20px -5px rgba(79, 70, 229, 0.4);
}

.rk-pillar-icon {
    width: 48px;
    height: 48px;
    background: var(--rk-proj-surface);
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--rk-proj-brand);
    transition: all 0.3s;
}
.rk-pillar-btn.active .rk-pillar-icon { background: rgba(255,255,255,0.2); color: #ffffff; }

.rk-pillar-title {
    font-size: 15px;
    font-weight: 800;
    line-height: 1.3;
    color: var(--rk-proj-dark);
    transition: color 0.3s;
}
.rk-pillar-btn.active .rk-pillar-title { color: #ffffff; }

/* Panele Zawartości */
.rk-pillar-content {
    display: none;
    background: #ffffff;
    border-radius: 20px;
    border: 1px solid var(--rk-proj-border);
    padding: 30px;
    box-shadow: 0 4px 6px rgba(0,0,0,0.02);
    animation: fadeScale 0.4s ease-out;
}
.rk-pillar-content.active { display: grid; grid-template-columns: 1fr 280px; gap: 30px; align-items: center; }

@keyframes fadeScale {
    from { opacity: 0; transform: scale(0.98); }
    to { opacity: 1; transform: scale(1); }
}

.rk-panel-text h4 { margin: 0 0 15px 0; font-size: 20px; font-weight: 900; color: var(--rk-proj-dark); }
.rk-panel-text p { margin: 0 0 20px 0; font-size: 15px; line-height: 1.7; color: var(--rk-proj-text); }

.rk-panel-highlight {
    background: var(--rk-proj-surface);
    padding: 15px;
    border-left: 4px solid var(--rk-proj-accent);
    border-radius: 0 8px 8px 0;
    font-size: 14px;
    font-weight: 700;
    color: var(--rk-proj-dark);
}

/* Wizualizacje SVG */
.rk-svg-stage {
    background: var(--rk-proj-dark);
    border-radius: 16px;
    padding: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 180px;
    box-shadow: inset 0 4px 20px rgba(0,0,0,0.5);
}

.rk-tech-svg { width: 100%; max-width: 200px; height: auto; }

/* Animacje SVG */
/* 1. OZC */
.anim-heat-loss { stroke-dasharray: 4; animation: flowOut 1.5s linear infinite; stroke: #ef4444; }
.anim-heat-gain { stroke-dasharray: 4; animation: flowIn 1.5s linear infinite; stroke: #10b981; }
@keyframes flowOut { to { stroke-dashoffset: -12; } }
@keyframes flowIn { to { stroke-dashoffset: 12; } }

/* 2. Rotametry */
.anim-float-1 { animation: balanceFloat1 2s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
.anim-float-2 { animation: balanceFloat2 2s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
.anim-float-3 { animation: balanceFloat3 2s cubic-bezier(0.4, 0, 0.2, 1) forwards; }
@keyframes balanceFloat1 { from { transform: translateY(0); } to { transform: translateY(15px); } }
@keyframes balanceFloat2 { from { transform: translateY(30px); } to { transform: translateY(15px); } }
@keyframes balanceFloat3 { from { transform: translateY(10px); } to { transform: translateY(15px); } }

/* 3. Pompa */
.anim-pump-spin { transform-origin: center; animation: spinPump 2s linear infinite; }
@keyframes spinPump { to { transform: rotate(360deg); } }
.anim-pump-flow { stroke-dasharray: 10; animation: flowPump 1s linear infinite; stroke: var(--rk-proj-accent); }
@keyframes flowPump { to { stroke-dashoffset: -20; } }

/* --- MOCNE CTA --- */
.rk-proj-cta {
    background: linear-gradient(135deg, #eef2ff 0%, #ffffff 100%);
    padding: 45px 50px;
    text-align: center;
    border-top: 1px solid var(--rk-proj-brand-light);
}

.rk-cta-title {
    font-size: 26px;
    font-weight: 900;
    color: var(--rk-proj-dark);
    margin: 0 0 15px 0;
}

.rk-cta-desc {
    font-size: 16px;
    color: var(--rk-proj-text);
    max-width: 600px;
    margin: 0 auto 30px auto;
    line-height: 1.6;
}

.rk-btn-massive {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    background: var(--rk-proj-brand);
    color: #ffffff;
    font-size: 18px;
    font-weight: 900;
    padding: 20px 40px;
    border-radius: 16px;
    text-decoration: none;
    box-shadow: 0 10px 25px -5px rgba(79, 70, 229, 0.4);
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    border: 2px solid transparent;
}

.rk-btn-massive:hover {
    background: #4338ca;
    transform: translateY(-4px);
    box-shadow: 0 15px 35px -5px rgba(79, 70, 229, 0.5);
    border-color: #a5b4fc;
}

.rk-btn-massive svg { transition: transform 0.3s; }
.rk-btn-massive:hover svg { transform: translateX(5px); }

@media (max-width: 768px) {
    .rk-proj-header, .rk-proj-interactive, .rk-proj-cta { padding: 30px 20px; }
    .rk-proj-header h2, .rk-cta-title { font-size: 24px; }
    .rk-pillars-grid { grid-template-columns: 1fr; }
    .rk-pillar-content.active { grid-template-columns: 1fr; }
    .rk-svg-stage { min-height: 160px; order: -1; } /* SVG na górę na mobilce */
    .rk-btn-massive { width: 100%; font-size: 16px; padding: 18px 20px; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-projekt",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Jak kalkulator wpływa na projekt ogrzewania podłogowego?",
    "description": "Zrozum 3 inżynieryjne filary: bilans OZC, hydraulikę rozdzielacza i dobór pompy obiegowej. Zobacz, jak wyliczenia przekładają się na finalną dokumentację techniczną.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-projekt",
    "name": "Filary Projektowania Instalacji Ogrzewania Podłogowego",
    "description": "Klasyfikacja trzech głównych obszarów inżynieryjnych (OZC, Hydraulika, Pompy), które są definiowane przez wyniki kompleksowego kalkulatora.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "projekt ogrzewania podłogowego",
      "rzeczywisty bilans cieplny OZC",
      "hydraulika rozdzielacza i pętli",
      "dobór pompy obiegowej podłogówki",
      "dokumentacja techniczna instalacji"
    ],
    "measurementTechnique": "Synteza wyników obliczeniowych z norm PN-EN 12831 (OZC) oraz PN-EN 1264 do formy wykonawczej dokumentacji technicznej.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Bilans Cieplny OZC: Precyzyjne zapotrzebowanie na energię dla każdego pomieszczenia.",
        "Hydraulika Pętli: Rozstaw rur co do centymetra i wartości nastaw rotametrów w l/min.",
        "Dobór Pompy: Wysokość podnoszenia oparta o sumaryczne opory najdłuższej pętli hydraulicznej."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-projekt",
    "name": "Eksplorator Filarów Projektowych",
    "description": "Interaktywny schemat prezentujący wpływ wyliczeń kalkulatora na projekt techniczny OZC, hydraulikę i dobór pomp, wzbogacony o animacje wektorowe procesów fizycznych.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-proj-container" id="rk-proj-app">
    
    <div class="rk-proj-header">
        <div class="rk-proj-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path><polyline points="14 2 14 8 20 8"></polyline><line x1="16" y1="13" x2="8" y2="13"></line><line x1="16" y1="17" x2="8" y2="17"></line><polyline points="10 9 9 9 8 9"></polyline></svg>
            Dokumentacja Techniczna
        </div>
        <h2>Jak to wpływa na <span>projekt ogrzewania podłogowego?</span></h2>
        <p class="rk-proj-lead">
            Wszystkie wyliczenia realizowane przez kompleksowy kalkulator mają bezpośrednie przełożenie na finalną dokumentację techniczną. Poprawnie wykonany projekt ogrzewania podłogowego nie może opierać się na danych szacunkowych. Musi on bezwzględnie scalać trzy kluczowe filary inżynieryjne.
        </p>
    </div>

    <div class="rk-proj-interactive">
        <h3>3 Filary Inżynieryjne</h3>
        
        <div class="rk-pillars-grid">
            <button class="rk-pillar-btn active" data-target="p-ozc">
                <div class="rk-pillar-icon">
                    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2v20"></path><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg>
                </div>
                <div class="rk-pillar-title">Bilans Cieplny (OZC)</div>
            </button>
            
            <button class="rk-pillar-btn" data-target="p-hyd">
                <div class="rk-pillar-icon">
                    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><line x1="4" y1="12" x2="20" y2="12"></line><line x1="12" y1="4" x2="12" y2="20"></line></svg>
                </div>
                <div class="rk-pillar-title">Hydraulika i Pętle</div>
            </button>

            <button class="rk-pillar-btn" data-target="p-pump">
                <div class="rk-pillar-icon">
                    <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
                </div>
                <div class="rk-pillar-title">Dobór Pompy</div>
            </button>
        </div>

        <div class="rk-pillar-content active" id="p-ozc">
            <div class="rk-panel-text">
                <h4>Rzeczywisty bilans cieplny OZC</h4>
                <p>Określa precyzyjne <a href="https://projekt-ogrzewania.pl/kalkulator-strat-ciepla-budynku-jak-samodzielnie-obliczyc-zapotrzebowanie-na-ogrzewanie/" class="rk-proj-link-dark">zapotrzebowanie na energię</a> dla każdego pomieszczenia z osobna. Fundament, który eliminuje ryzyko niedogrzania łazienek czy skrajnych sypialni podczas mrozów.</p>
                <div class="rk-panel-highlight">
                    Wynik kalkulatora: Precyzyjny dobór mocy W/m² eliminuje szacunki &#8222;na oko&#8221;.
                </div>
            </div>
            <div class="rk-svg-stage">
                <svg class="rk-tech-svg" viewBox="0 0 100 100">
                    <rect x="20" y="20" width="60" height="60" fill="none" stroke="#64748b" stroke-width="4" rx="4"/>
                    <path class="anim-heat-loss" d="M 80 50 L 95 50" fill="none" stroke-width="3" stroke-linecap="round"/>
                    <path class="anim-heat-loss" d="M 50 20 L 50 5" fill="none" stroke-width="3" stroke-linecap="round"/>
                    <path class="anim-heat-gain" d="M 5 50 L 20 50" fill="none" stroke-width="4" stroke-linecap="round"/>
                    <path class="anim-heat-gain" d="M 50 95 L 50 80" fill="none" stroke-width="4" stroke-linecap="round"/>
                    <text x="50" y="55" font-size="16" font-weight="900" fill="#cbd5e1" text-anchor="middle">OZC</text>
                </svg>
            </div>
        </div>

        <div class="rk-pillar-content" id="p-hyd">
            <div class="rk-panel-text">
                <h4>Hydraulika rozdzielacza i pętli</h4>
                <p>Projekt definiuje dokładny rozstaw rur (co do centymetra), podział na równe obwody oraz wartości nastaw wstępnych (przepływów w l/min) na <a href="https://projekt-ogrzewania.pl/rotametr-wskaznik-przeplywu-w-rozdzielaczu-ogrzewania-podlogowego/" class="rk-proj-link-dark">rotametrach</a>, co umożliwia prawidłowe <a href="https://projekt-ogrzewania.pl/regulacja-hydrauliczna-ogrzewania-podlogowego/" class="rk-proj-link-dark">zrównoważenie systemu</a>.</p>
                <div class="rk-panel-highlight">
                    Wynik kalkulatora: Stabilne przepływy i równomierne nagrzewanie podłogi.
                </div>
            </div>
            <div class="rk-svg-stage">
                <svg class="rk-tech-svg" viewBox="0 0 100 100">
                    <rect x="10" y="80" width="80" height="10" fill="#3b82f6" rx="2"/>
                    <rect x="20" y="20" width="10" height="60" fill="none" stroke="#64748b" stroke-width="2"/>
                    <rect class="anim-float-1" x="22" y="50" width="6" height="4" fill="#ef4444"/>
                    <rect x="45" y="20" width="10" height="60" fill="none" stroke="#64748b" stroke-width="2"/>
                    <rect class="anim-float-2" x="47" y="50" width="6" height="4" fill="#ef4444"/>
                    <rect x="70" y="20" width="10" height="60" fill="none" stroke="#64748b" stroke-width="2"/>
                    <rect class="anim-float-3" x="72" y="50" width="6" height="4" fill="#ef4444"/>
                    <line x1="15" y1="35" x2="85" y2="35" stroke="#10b981" stroke-width="2" stroke-dasharray="4"/>
                </svg>
            </div>
        </div>

        <div class="rk-pillar-content" id="p-pump">
            <div class="rk-panel-text">
                <h4>Dobór pompy obiegowej</h4>
                <p>Na podstawie zsumowanych oporów hydraulicznych najdłuższej pętli projektant przeprowadza <a href="https://projekt-ogrzewania.pl/kalkulator-doboru-pompy-obiegowej-w-ogrzewaniu-podlogowym/" class="rk-proj-link-dark">dobór pompy obiegowej</a>. Określamy dokładną wysokość podnoszenia, zapobiegając przeciążeniu lub niedomiarowi tłoczenia.</p>
                <div class="rk-panel-highlight">
                    Wynik kalkulatora: Brak &#8222;martwych&#8221;, zimnych stref z powodu słabej pompy.
                </div>
            </div>
            <div class="rk-svg-stage">
                <svg class="rk-tech-svg" viewBox="0 0 100 100">
                    <circle cx="30" cy="50" r="20" fill="none" stroke="#94a3b8" stroke-width="4"/>
                    <g class="anim-pump-spin" transform="translate(30, 50)">
                        <polygon points="-8,-8 10,0 -8,8" fill="#10b981"/>
                    </g>
                    <path class="anim-pump-flow" d="M 50 50 L 90 50" fill="none" stroke-width="6" stroke-linecap="round"/>
                    <path class="anim-pump-flow" d="M 90 50 Q 95 50 95 40 L 95 20" fill="none" stroke-width="4" stroke-linecap="round"/>
                </svg>
            </div>
        </div>

    </div>

    <div class="rk-proj-cta">
        <h3 class="rk-cta-title">Nie ryzykuj błędów na budowie</h3>
        <p class="rk-cta-desc">
            Skorzystaj z wiedzy ekspertów. Zamów kompleksowy, inżynieryjny projekt ogrzewania podłogowego, który zagwarantuje Ci optymalne zużycie materiałów, niskie rachunki za ogrzewanie i święty spokój na lata.
        </p>
        <a href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/" class="rk-btn-massive">
            ZAMÓW PROFESJONALNY PROJEKT PODŁOGÓWKI
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg>
        </a>
    </div>

</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-proj-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:24px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener informacyjny należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na nieautoryzowanej domenie jest zabronione prawem.
                </div>
            `;
            return;
        }
    }

    // Logika zakładek (Filary)
    const btns = document.querySelectorAll('.rk-pillar-btn');
    const contents = document.querySelectorAll('.rk-pillar-content');

    btns.forEach(btn => {
        btn.addEventListener('click', function() {
            const targetId = this.getAttribute('data-target');
            
            // Reset
            btns.forEach(b => b.classList.remove('active'));
            contents.forEach(c => c.classList.remove('active'));
            
            // Aktywacja
            this.classList.add('active');
            const targetContent = document.getElementById(targetId);
            if(targetContent) {
                // Restart animacji SVG przez reflow
                targetContent.classList.remove('active');
                void targetContent.offsetWidth; 
                targetContent.classList.add('active');
            }
        });
    });
});
</script>



<style>
:root {
    --rk-calc-main-dark: #0f172a;
    --rk-calc-main-darker: #020617;
    --rk-calc-main-brand: #3b82f6; /* Hydronic Blue */
    --rk-calc-main-brand-light: #eff6ff;
    --rk-calc-main-accent: #10b981; /* Success Green */
    --rk-calc-main-danger: #ef4444; /* Error Red */
    --rk-calc-main-bg: #ffffff;
    --rk-calc-main-surface: #f8fafc;
    --rk-calc-main-border: #cbd5e1;
    --rk-calc-main-text: #334155;
    --rk-calc-main-muted: #64748b;
    --rk-calc-main-shadow: 0 20px 40px -10px rgba(59, 130, 246, 0.15);
}

.rk-calc-main-container {
    max-width: 1000px;
    margin: 50px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-calc-main-bg);
    border-radius: 24px;
    box-shadow: var(--rk-calc-main-shadow);
    border: 1px solid var(--rk-calc-main-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-calc-main-header {
    background: linear-gradient(135deg, var(--rk-calc-main-darker) 0%, var(--rk-calc-main-dark) 100%);
    padding: 40px 50px;
    color: #ffffff;
    border-bottom: 5px solid var(--rk-calc-main-brand);
    text-align: center;
}

.rk-calc-main-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(59, 130, 246, 0.2);
    color: #93c5fd;
    padding: 6px 16px;
    border-radius: 8px;
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 15px;
    border: 1px solid rgba(147, 197, 253, 0.3);
}

.rk-calc-main-title {
    font-size: 32px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0 0 10px 0;
}

.rk-calc-main-title span { color: var(--rk-calc-main-brand); }

.rk-calc-main-desc {
    color: #cbd5e1;
    font-size: 15px;
    line-height: 1.6;
    margin: 0 auto;
    max-width: 700px;
}

/* --- SEKCJA GŁÓWNA --- */
.rk-calc-main-body {
    padding: 40px 50px;
    background: var(--rk-calc-main-surface);
}

/* Krok 1: Parametry Globalne */
.rk-calc-section-title {
    font-size: 18px;
    font-weight: 900;
    color: var(--rk-calc-main-dark);
    margin: 0 0 20px 0;
    display: flex;
    align-items: center;
    gap: 10px;
    border-bottom: 2px solid var(--rk-calc-main-border);
    padding-bottom: 10px;
}

.rk-calc-section-title svg { color: var(--rk-calc-main-brand); }

.rk-global-params {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 15px;
    margin-bottom: 40px;
}

.rk-input-group {
    background: #ffffff;
    padding: 15px;
    border-radius: 12px;
    border: 1px solid var(--rk-calc-main-border);
}

.rk-input-group label {
    display: block;
    font-size: 12px;
    font-weight: 800;
    color: var(--rk-calc-main-muted);
    text-transform: uppercase;
    margin-bottom: 8px;
}

.rk-input-group select, .rk-input-group input {
    width: 100%;
    padding: 10px;
    border: 1px solid var(--rk-calc-main-border);
    border-radius: 8px;
    font-size: 14px;
    font-weight: 600;
    color: var(--rk-calc-main-dark);
    background: var(--rk-calc-main-surface);
    transition: all 0.3s;
}

.rk-input-group select:focus, .rk-input-group input:focus {
    outline: none;
    border-color: var(--rk-calc-main-brand);
    box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}

/* Krok 2: Pomieszczenia */
.rk-rooms-container {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
    margin-bottom: 20px;
}

.rk-room-card {
    background: #ffffff;
    border: 1px solid var(--rk-calc-main-border);
    border-radius: 16px;
    padding: 20px;
    position: relative;
    box-shadow: 0 2px 4px rgba(0,0,0,0.02);
    transition: all 0.3s ease;
    animation: roomPopIn 0.3s ease-out;
}

.rk-room-card:hover {
    border-color: var(--rk-calc-main-brand);
    box-shadow: 0 8px 16px rgba(59, 130, 246, 0.1);
}

@keyframes roomPopIn {
    from { opacity: 0; transform: scale(0.95); }
    to { opacity: 1; transform: scale(1); }
}

.rk-room-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 15px;
    font-weight: 900;
    color: var(--rk-calc-main-dark);
}

.rk-room-delete {
    background: transparent;
    border: none;
    color: var(--rk-calc-main-danger);
    cursor: pointer;
    padding: 5px;
    border-radius: 6px;
    transition: background 0.2s;
}
.rk-room-delete:hover { background: #fef2f2; }

.rk-room-inputs {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 10px;
}

.rk-mini-input label {
    font-size: 11px;
    color: var(--rk-calc-main-muted);
    font-weight: 700;
    display: block;
    margin-bottom: 4px;
}
.rk-mini-input input {
    width: 100%;
    padding: 8px;
    border: 1px solid var(--rk-calc-main-border);
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    transition: border-color 0.3s;
}
.rk-mini-input input.error { border-color: var(--rk-calc-main-danger); background: #fef2f2; }

.rk-add-room-btn {
    width: 100%;
    padding: 15px;
    background: transparent;
    border: 2px dashed var(--rk-calc-main-border);
    border-radius: 16px;
    color: var(--rk-calc-main-muted);
    font-weight: 800;
    font-size: 14px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 8px;
    transition: all 0.3s;
    margin-bottom: 40px;
}
.rk-add-room-btn:hover {
    border-color: var(--rk-calc-main-brand);
    color: var(--rk-calc-main-brand);
    background: var(--rk-calc-main-brand-light);
}

/* Krok 3: Oblicz */
.rk-calc-action-bar {
    display: flex;
    justify-content: center;
    margin-bottom: 40px;
}

.rk-calc-submit {
    background: var(--rk-calc-main-brand);
    color: #ffffff;
    font-size: 18px;
    font-weight: 900;
    padding: 20px 40px;
    border: none;
    border-radius: 16px;
    cursor: pointer;
    box-shadow: 0 10px 20px -5px rgba(59, 130, 246, 0.4);
    display: inline-flex;
    align-items: center;
    gap: 10px;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.rk-calc-submit:hover {
    transform: translateY(-3px);
    box-shadow: 0 15px 30px -5px rgba(59, 130, 246, 0.5);
    background: #2563eb;
}

.rk-calc-submit:active { transform: translateY(0); }

/* --- WYNIKI --- */
.rk-calc-results {
    display: none; /* Ukryte do kliknięcia */
    border-top: 2px solid var(--rk-calc-main-border);
    padding-top: 40px;
    animation: fadeInResult 0.5s ease-out;
}

@keyframes fadeInResult {
    from { opacity: 0; transform: translateY(20px); }
    to { opacity: 1; transform: translateY(0); }
}

.rk-res-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
    margin-bottom: 30px;
}

.rk-res-card {
    background: #ffffff;
    border: 1px solid var(--rk-calc-main-border);
    border-radius: 16px;
    padding: 25px;
    position: relative;
    overflow: hidden;
}

.rk-res-card::before {
    content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 4px;
}

.rk-res-card.c-blue::before { background: var(--rk-calc-main-brand); }
.rk-res-card.c-green::before { background: var(--rk-calc-main-accent); }
.rk-res-card.c-orange::before { background: #f59e0b; }

.rk-res-icon {
    margin-bottom: 15px;
    color: var(--rk-calc-main-dark);
}

.rk-res-label {
    font-size: 12px;
    font-weight: 800;
    color: var(--rk-calc-main-muted);
    text-transform: uppercase;
    margin-bottom: 5px;
}

.rk-res-value {
    font-size: 28px;
    font-weight: 900;
    color: var(--rk-calc-main-dark);
    margin-bottom: 10px;
}

.rk-res-value span { font-size: 16px; color: var(--rk-calc-main-muted); }

.rk-res-list {
    margin: 0; padding: 0; list-style: none;
    font-size: 13px; color: var(--rk-calc-main-text);
}
.rk-res-list li { margin-bottom: 4px; display: flex; justify-content: space-between; border-bottom: 1px dashed var(--rk-calc-main-border); padding-bottom: 4px; }
.rk-res-list li:last-child { border: none; margin: 0; padding: 0; }
.rk-res-list b { color: var(--rk-calc-main-dark); }

/* SVG Statusu Hydraulicznego */
.rk-res-status {
    background: var(--rk-calc-main-dark);
    border-radius: 16px;
    padding: 25px;
    display: flex;
    align-items: center;
    gap: 30px;
    color: #ffffff;
    margin-bottom: 30px;
}

.rk-status-svg {
    width: 100px;
    height: 100px;
    flex-shrink: 0;
}

.rk-status-text h4 { margin: 0 0 10px 0; font-size: 20px; font-weight: 900; }
.rk-status-text p { margin: 0; font-size: 14px; color: #cbd5e1; line-height: 1.6; }
.rk-status-warn { color: var(--rk-calc-main-danger); }
.rk-status-ok { color: var(--rk-calc-main-accent); }

/* CTA Wynikowe */
.rk-res-cta {
    background: #eef2ff;
    border: 1px solid #c7d2fe;
    border-radius: 16px;
    padding: 25px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 20px;
}

.rk-res-cta p { margin: 0; font-size: 14px; color: #3730a3; line-height: 1.6; }
.rk-res-cta strong { font-weight: 900; color: #312e81; }

.rk-res-cta-btn {
    background: #4f46e5;
    color: #ffffff;
    padding: 12px 24px;
    border-radius: 10px;
    text-decoration: none;
    font-weight: 800;
    font-size: 14px;
    white-space: nowrap;
    transition: background 0.3s;
}
.rk-res-cta-btn:hover { background: #4338ca; }

@media (max-width: 768px) {
    .rk-calc-main-header, .rk-calc-main-body { padding: 30px 20px; }
    .rk-calc-main-title { font-size: 24px; }
    .rk-res-grid { grid-template-columns: 1fr; }
    .rk-res-status { flex-direction: column; text-align: center; }
    .rk-res-cta { flex-direction: column; text-align: center; }
}

/* Animacje wewnątrz SVG Wynikowego */
.anim-pump-impeller { transform-origin: center; animation: spinFast 1s linear infinite; }
@keyframes spinFast { to { transform: rotate(360deg); } }
.anim-flow-line { stroke-dasharray: 8; animation: flowHyd 1s linear infinite; }
@keyframes flowHyd { to { stroke-dashoffset: -16; } }
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-main-calc",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Kompleksowy Kalkulator Ogrzewania Podłogowego (Interaktywny)",
    "description": "Zaawansowane narzędzie inżynieryjne wyliczające długość rur, moc, rozstaw pętli oraz parametry pompy obiegowej na podstawie wprowadzonych danych pomieszczeń.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-calc-results",
    "name": "Wyniki Inżynierskich Obliczeń Ogrzewania Podłogowego",
    "description": "Dynamiczne wyliczenia parametrów fizycznych dla systemów płaszczyznowych, łączące zmienne izolacyjności, przepływu i strat ciepła.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "kalkulator podłogówki online",
      "obliczanie pętli grzewczych",
      "dobór pompy do ogrzewania podłogowego",
      "średnica rury pex przepływ",
      "zapotrzebowanie na materiały podłogówka"
    ],
    "measurementTechnique": "Równania bilansu cieplnego i oporów hydraulicznych wg PN-EN 1264, z uwzględnieniem liczby Reynoldsa i modelu strat liniowych.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Zestawienie całkowitej mocy (W) i długości rury (mb).",
        "Sugestie rozstawów rur względem zapotrzebowania cieplnego W/m2.",
        "Estymacja oporów hydraulicznych i wskazanie wymaganej wysokości podnoszenia pompy obiegowej."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-main",
    "name": "Kompleksowy Kalkulator Ogrzewania Podłogowego PRO",
    "description": "Profesjonalna aplikacja webowa obliczająca wszystkie kluczowe parametry instalacji (pętle, rozstawy, hydraulika) na podstawie wprowadzonych danych pomieszczeń i warstw podłogi.",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-calc-main-container" id="rk-calc-main-app">
    
    <div class="rk-calc-main-header">
        <div class="rk-calc-main-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="4" width="16" height="16" rx="2" ry="2"></rect><rect x="9" y="9" width="6" height="6"></rect><line x1="9" y1="1" x2="9" y2="4"></line><line x1="15" y1="1" x2="15" y2="4"></line><line x1="9" y1="20" x2="9" y2="23"></line><line x1="15" y1="20" x2="15" y2="23"></line><line x1="20" y1="9" x2="23" y2="9"></line><line x1="20" y1="14" x2="23" y2="14"></line><line x1="1" y1="9" x2="4" y2="9"></line><line x1="1" y1="14" x2="4" y2="14"></line></svg>
            Narzędzie Obliczeniowe
        </div>
        <h2 class="rk-calc-main-title">Kompleksowy Kalkulator <span>Podłogówki</span></h2>
        <p class="rk-calc-main-desc">Wprowadź dane budynku oraz parametry poszczególnych pomieszczeń, aby wygenerować profesjonalne zestawienie materiałowe, rozstawy rur oraz wytyczne hydrauliczne dla pompy obiegowej.</p>
    </div>

    <div class="rk-calc-main-body">
        
        <div class="rk-calc-section-title">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><line x1="12" y1="16" x2="12" y2="12"></line><line x1="12" y1="8" x2="12.01" y2="8"></line></svg>
            Krok 1: Parametry Globalne Konstrukcji
        </div>
        
        <div class="rk-global-params">
            <div class="rk-input-group">
                <label>Zasilanie (Tz)</label>
                <input type="number" id="rk-param-temp" value="35" min="25" max="50">
            </div>
            <div class="rk-input-group">
                <label>Okładzina podłogi</label>
                <select id="rk-param-floor">
                    <option value="1">Płytki / Gres</option>
                    <option value="0.85">Panele podłogowe</option>
                    <option value="0.75">Deska warstwowa</option>
                </select>
            </div>
            <div class="rk-input-group">
                <label>Rodzaj Wylewki</label>
                <select id="rk-param-screed">
                    <option value="1">Cementowa (Miksokret)</option>
                    <option value="1.13">Anhydrytowa (Płynna)</option>
                </select>
            </div>
            <div class="rk-input-group">
                <label>Izolacja Spodnia</label>
                <select id="rk-param-iso">
                    <option value="1">EPS 100 (Standard)</option>
                    <option value="1.05">EPS 200 (Twardy)</option>
                </select>
            </div>
            <div class="rk-input-group">
                <label>Rura Grzewcza</label>
                <select id="rk-param-pipe">
                    <option value="0.012">16&#215;2 (Wew. 12mm)</option>
                    <option value="0.013">17&#215;2 (Wew. 13mm)</option>
                    <option value="0.016">20&#215;2 (Wew. 16mm)</option>
                </select>
            </div>
        </div>

        <div class="rk-calc-section-title">
            <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg>
            Krok 2: Bilans Pomieszczeń
        </div>

        <div class="rk-rooms-container" id="rk-rooms-wrapper">
            </div>

        <button class="rk-add-room-btn" id="rk-btn-add-room">
            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
            Dodaj kolejne pomieszczenie
        </button>

        <div class="rk-calc-action-bar">
            <button class="rk-calc-submit" id="rk-btn-calculate">
                GENERUJ WYNIKI OBLICZEŃ
                <svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="9 11 12 14 22 4"></polyline><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"></path></svg>
            </button>
        </div>

        <div class="rk-calc-results" id="rk-results-panel">
            
            <div class="rk-res-grid">
                
                <div class="rk-res-card c-blue">
                    <div class="rk-res-icon">
                        <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20"></path><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"></path></svg>
                    </div>
                    <div class="rk-res-label">Całkowite Zapotrzebowanie</div>
                    <div class="rk-res-value" id="out-power">0 <span>W</span></div>
                    <ul class="rk-res-list">
                        <li>Ilość rury (zapas 10%): <b id="out-length">0 mb</b></li>
                        <li>Pojemność zładu: <b id="out-water">0 L</b></li>
                        <li>Całkowita powierzchnia: <b id="out-area">0 m²</b></li>
                    </ul>
                </div>

                <div class="rk-res-card c-green">
                    <div class="rk-res-icon">
                        <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect><line x1="3" y1="9" x2="21" y2="9"></line><line x1="9" y1="21" x2="9" y2="9"></line></svg>
                    </div>
                    <div class="rk-res-label">Rozdzielacz i Geometria</div>
                    <div class="rk-res-value" id="out-circuits">0 <span>sekcji</span></div>
                    <ul class="rk-res-list">
                        <li>Średni rozstaw rur: <b id="out-spacing-avg">0 cm</b></li>
                        <li>Sugerowane rozstawy: <b id="out-spacing-list">&#8211;</b></li>
                        <li>Limit długości pętli: <b>Zachowany</b></li>
                    </ul>
                </div>

                <div class="rk-res-card c-orange">
                    <div class="rk-res-icon">
                        <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"></circle><polyline points="12 6 12 12 16 14"></polyline></svg>
                    </div>
                    <div class="rk-res-label">Wymogi Hydrauliczne</div>
                    <div class="rk-res-value" id="out-pump">Weryfikacja</div>
                    <ul class="rk-res-list">
                        <li>Przepływ sumaryczny: <b id="out-flow">0 m³/h</b></li>
                        <li>Opór najdłuższej pętli: <b id="out-pressure">0 kPa</b></li>
                        <li>Wys. podnoszenia: <b id="out-head">0 m</b></li>
                    </ul>
                </div>
            </div>

            <div class="rk-res-status">
                <div class="rk-status-svg">
                    <svg viewBox="0 0 100 100" style="width:100%;height:100%;">
                        <circle cx="50" cy="50" r="45" fill="none" stroke="#334155" stroke-width="6"></circle>
                        <circle cx="50" cy="50" r="30" fill="none" stroke="#475569" stroke-width="2"></circle>
                        <g class="anim-pump-impeller" transform="translate(50, 50)">
                            <path d="M 0 -25 L 10 0 L 0 25 L -10 0 Z" fill="#10b981" id="svg-impeller-color"></path>
                            <circle cx="0" cy="0" r="5" fill="#f8fafc"></circle>
                        </g>
                        <path class="anim-flow-line" d="M 15 80 Q 50 110 85 80" fill="none" stroke="#3b82f6" stroke-width="4" stroke-linecap="round"></path>
                    </svg>
                </div>
                <div class="rk-status-text">
                    <h4 id="out-status-title">Analiza w toku&#8230;</h4>
                    <p id="out-status-desc">&#8211;</p>
                </div>
            </div>

            <div class="rk-res-cta">
                <div>
                    <strong>Zastrzeżenie inżynierskie:</strong>
                    <p>Wyniki mają charakter poglądowy do szacowania kosztów. Błędy hydrauliczne kosztują krocie. Do realizacji niezbędny jest projekt wykonawczy uwzględniający opory miejscowe armatury i pełne badanie OZC.</p>
                </div>
                <a href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/" class="rk-res-cta-btn">ZAMÓW PROJEKT</a>
            </div>

        </div>

    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-calc-main-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:24px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:40px; margin-bottom:15px;">🛑</div>
                    BŁĄD LICENCJI:<br>Główny silnik kalkulatora jest własnością Projekt-Ogrzewania.pl. Próba kradzieży kodu zatrzymana.
                </div>
            `;
            return;
        }
    }

    // --- LOGIKA KALKULATORA ---
    let rooms = [];
    const wrapper = document.getElementById('rk-rooms-wrapper');
    const btnAdd = document.getElementById('rk-btn-add-room');
    const btnCalc = document.getElementById('rk-btn-calculate');
    const resultsPanel = document.getElementById('rk-results-panel');

    function createRoomHTML(index) {
        return `
        <div class="rk-room-card" id="rk-room-${index}">
            <div class="rk-room-header">
                Pomieszczenie ${index + 1}
                <button class="rk-room-delete" onclick="rkRemoveRoom(${index})" title="Usuń">
                    <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path></svg>
                </button>
            </div>
            <div class="rk-room-inputs">
                <div class="rk-mini-input">
                    <label>Powierzchnia (m²)</label>
                    <input type="number" id="rk-area-${index}" value="15" min="1" step="0.5" oninput="rkValidate(this)">
                </div>
                <div class="rk-mini-input">
                    <label>Straty (W/m²)</label>
                    <input type="number" id="rk-loss-${index}" value="50" min="10" step="5" oninput="rkValidate(this)">
                </div>
            </div>
        </div>`;
    }

    function renderRooms() {
        wrapper.innerHTML = '';
        rooms.forEach((r, idx) => {
            wrapper.innerHTML += createRoomHTML(idx);
            // Odtworzenie wartości po re-renderze
            setTimeout(() => {
                const aInput = document.getElementById(`rk-area-${idx}`);
                const lInput = document.getElementById(`rk-loss-${idx}`);
                if(aInput) aInput.value = r.area;
                if(lInput) lInput.value = r.loss;
            }, 0);
        });
    }

    window.rkAddRoom = function() {
        rooms.push({ area: 15, loss: 50 });
        renderRooms();
    }

    window.rkRemoveRoom = function(index) {
        // Zapisz obecne wartości przed usunięciem
        saveRoomStates();
        rooms.splice(index, 1);
        renderRooms();
    }

    function saveRoomStates() {
        rooms.forEach((r, idx) => {
            const aInput = document.getElementById(`rk-area-${idx}`);
            const lInput = document.getElementById(`rk-loss-${idx}`);
            if(aInput) r.area = parseFloat(aInput.value) || 0;
            if(lInput) r.loss = parseFloat(lInput.value) || 0;
        });
    }

    window.rkValidate = function(input) {
        let val = parseFloat(input.value);
        if(isNaN(val) || val <= 0) { input.classList.add('error'); } 
        else { input.classList.remove('error'); }
    }

    // Inicjalizacja z 2 pomieszczeniami
    rkAddRoom(); rkAddRoom();

    btnAdd.addEventListener('click', () => {
        saveRoomStates();
        rkAddRoom();
    });

    // Główna funkcja licząca (bazująca na logice ze wzorów inżynieryjnych)
    btnCalc.addEventListener('click', () => {
        saveRoomStates();

        const T = parseFloat(document.getElementById('rk-param-temp').value);
        const fF = parseFloat(document.getElementById('rk-param-floor').value);
        const sF = parseFloat(document.getElementById('rk-param-screed').value);
        const iF = parseFloat(document.getElementById('rk-param-iso').value);
        const D = parseFloat(document.getElementById('rk-param-pipe').value); // średnica wewnętrzna w [m]

        // Stałe fizyczne dla wody 35 st C
        const rho = 994; // gęstość kg/m3
        const mu = 0.00072; // lepkość dynamiczna
        const g = 9.81;

        let totalPower = 0;
        let totalArea = 0;
        let totalLength = 0;
        let totalCircuits = 0;
        let totalFlowM3H = 0;
        let maxHeadM = 0;
        let maxPressureKpa = 0;
        let spacings = [];

        let isValid = true;

        rooms.forEach(r => {
            if(r.area <= 0 || r.loss <= 0) isValid = false;
            
            // 1. Zapotrzebowanie W
            let power = r.area * r.loss;
            totalPower += power;
            totalArea += r.area;

            // 2. Szacowanie rozstawu bazując na stratach i okładzinie (Uproszczona logika PN-EN)
            // Baza dla 35 stC, płytki, jastrych cement, styro 100
            let baseProfile = { 10: 75, 15: 55, 20: 40, 25: 30 }; 
            let spacing = 10; // Domyślnie najgęściej dla pewności
            
            // Skalowanie wydajności podłogi parametrami
            for (let sp of [25, 20, 15, 10]) {
                // Skorygowana moc dla danego rozstawu
                let q_max = baseProfile[sp] * (T/35) * fF * sF * iF;
                if(q_max >= r.loss) {
                    spacing = sp; // Znaleziono optymalny, szerszy rozstaw
                    break;
                }
            }
            spacings.push(spacing);

            // 3. Długość rury (z zapasem 10% wg wytycznych)
            let spacingM = spacing / 100;
            let roomLen = (r.area / spacingM) * 1.1; 
            totalLength += roomLen;

            // 4. Pętle (limit 100m dla bezpieczeństwa hydraulicznego PEX 16)
            let circuits = Math.ceil(roomLen / 100);
            totalCircuits += circuits;

            // 5. Hydraulika (Przepływ masowy kg/h na m3/h). Założenie deltaT = 5K
            // m = Q / (cw * dT)
            let flow_kgh = power / (1.163 * 5); // uproszczenie
            let flow_m3h = flow_kgh / 1000;
            totalFlowM3H += flow_m3h;

            // Prędkość w pojedynczej pętli i opory tarcia (Darcy-Weisbach uproszczony)
            let flow_circuit_m3s = (flow_m3h / 3600) / circuits;
            let A_pipe = Math.PI * Math.pow(D/2, 2);
            let v = flow_circuit_m3s / A_pipe;
            
            // Re i Lambda
            let Re = (rho * v * D) / mu;
            let lambda = 0.3164 * Math.pow(Re, -0.25); // Blasius
            
            // Delta P = lambda * (L/D) * (rho*v^2 / 2)
            let len_circuit = roomLen / circuits;
            let dp = lambda * (len_circuit/D) * (rho * Math.pow(v, 2) / 2);
            // Dodajemy 20% na opory miejscowe (rozdzielacz)
            dp = dp * 1.2; 
            
            let head = dp / (rho * g);
            
            if(head > maxHeadM) maxHeadM = head;
            if(dp > maxPressureKpa) maxPressureKpa = dp;
        });

        if(!isValid || rooms.length === 0) {
            alert("Uzupełnij poprawnie wszystkie pola pomieszczeń (wartości > 0).");
            return;
        }

        // --- Aktualizacja widoku ---
        
        // Karta 1
        document.getElementById('out-power').innerHTML = totalPower.toFixed(0) + ' <span>W</span>';
        document.getElementById('out-length').textContent = totalLength.toFixed(0) + ' mb';
        // Pojemność wody 0.113 l/m dla 16mm (uproszczone zład całk)
        document.getElementById('out-water').textContent = (totalLength * 0.113).toFixed(1) + ' L';
        document.getElementById('out-area').textContent = totalArea.toFixed(1) + ' m²';

        // Karta 2
        document.getElementById('out-circuits').innerHTML = totalCircuits + ' <span>sekcji</span>';
        let uniqueSp = [...new Set(spacings)].sort((a,b) => a-b);
        let avgSp = (spacings.reduce((a,b) => a+b, 0) / spacings.length).toFixed(1);
        document.getElementById('out-spacing-avg').textContent = avgSp + ' cm';
        document.getElementById('out-spacing-list').textContent = uniqueSp.join(', ') + ' cm';

        // Karta 3
        let maxKpa = (maxPressureKpa / 1000).toFixed(1);
        document.getElementById('out-flow').textContent = totalFlowM3H.toFixed(2) + ' m³/h';
        document.getElementById('out-pressure').textContent = maxKpa + ' kPa';
        document.getElementById('out-head').textContent = maxHeadM.toFixed(1) + ' m';

        let pumpText = "Pompa 25-40";
        if(maxHeadM > 3.5) pumpText = "Pompa 25-60";
        if(maxHeadM > 5.5) pumpText = "Pompa 25-80";
        document.getElementById('out-pump').innerHTML = pumpText;

        // Status hydrauliczny do animacji i ostrzeżeń
        let stTitle = document.getElementById('out-status-title');
        let stDesc = document.getElementById('out-status-desc');
        let stColor = document.getElementById('svg-impeller-color');

        if(maxKpa > 25 || totalFlowM3H > 2.5) {
            stTitle.textContent = "Ryzyko Przeciążenia!";
            stTitle.className = "rk-status-warn";
            stDesc.textContent = "Obliczone opory hydrauliczne są bardzo wysokie. Parametr T zasilania jest prawdopodobnie zbyt niski do pokrycia strat przez wybraną podłogę. Pompa obiegowa może nie zapewnić wymaganego przepływu na instalacji.";
            stColor.setAttribute('fill', '#ef4444');
        } else {
            stTitle.textContent = "Instalacja Stabilna";
            stTitle.className = "rk-status-ok";
            stDesc.textContent = "Wartości oporów i przepływów mieszczą się w normach inżynieryjnych. Dobór standardowej pompy obiegowej zabezpieczy równomierne nagrzewanie podłogi.";
            stColor.setAttribute('fill', '#10b981');
        }

        resultsPanel.style.display = 'block';
        
        // Płynne przewinięcie do wyników
        setTimeout(() => {
            resultsPanel.scrollIntoView({ behavior: 'smooth', block: 'start' });
        }, 100);
    });

});
</script>



<p class="wp-block-paragraph"></p>



<style>
:root {
    --rk-cs-primary: #0f172a;
    --rk-cs-accent: #2563eb;
    --rk-cs-before: #ef4444; /* Czerwony - błędy */
    --rk-cs-before-bg: #fef2f2;
    --rk-cs-after: #10b981; /* Zielony - optymalizacja */
    --rk-cs-after-bg: #ecfdf5;
    --rk-cs-bg: #f8fafc;
    --rk-cs-border: #e2e8f0;
    --rk-cs-text: #475569;
}

.case-study-module {
    max-width: 950px;
    margin: 50px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: #ffffff;
    border-radius: 24px;
    box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.08);
    border: 1px solid var(--rk-cs-border);
    overflow: hidden;
}

/* ================= HEADER I METRYCZKA ================= */
.cs-header-wrapper {
    background: var(--rk-cs-primary);
    color: #ffffff;
    padding: 40px 50px;
    position: relative;
    overflow: hidden;
}

.cs-header-wrapper::after {
    content: '';
    position: absolute;
    top: -50px;
    right: -50px;
    width: 250px;
    height: 250px;
    background: radial-gradient(circle, rgba(37, 99, 235, 0.3) 0%, rgba(255,255,255,0) 70%);
    border-radius: 50%;
}

.cs-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(255, 255, 255, 0.1);
    border: 1px solid rgba(255, 255, 255, 0.2);
    color: #93c5fd;
    padding: 6px 14px;
    border-radius: 50px;
    font-size: 12px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1px;
    margin-bottom: 20px;
}

.cs-header-wrapper h2 {
    font-size: 28px;
    font-weight: 900;
    margin: 0 0 25px 0;
    line-height: 1.3;
    color: #ffffff;
    position: relative;
    z-index: 2;
}

.cs-stats-grid {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 15px;
    position: relative;
    z-index: 2;
}

.cs-stat-box {
    background: rgba(0, 0, 0, 0.2);
    border: 1px solid rgba(255, 255, 255, 0.1);
    padding: 15px;
    border-radius: 12px;
}

.cs-stat-label {
    display: block;
    font-size: 11px;
    color: #94a3b8;
    text-transform: uppercase;
    font-weight: 700;
    margin-bottom: 5px;
}

.cs-stat-value {
    display: block;
    font-size: 16px;
    font-weight: 900;
    color: #ffffff;
}

/* ================= OPIS WYZWANIA ================= */
.cs-content-section {
    padding: 40px 50px 30px 50px;
    background: #ffffff;
}

.cs-lead-text {
    font-size: 16px;
    line-height: 1.8;
    color: var(--rk-cs-text);
    margin: 0 0 20px 0;
}

.cs-lead-text strong {
    color: var(--rk-cs-primary);
}

.cs-author-box {
    background: #f0f9ff;
    border-left: 4px solid var(--rk-cs-accent);
    padding: 15px 20px;
    border-radius: 0 12px 12px 0;
    display: flex;
    align-items: center;
    gap: 15px;
    margin-bottom: 10px;
}

.cs-author-photo {
    width: 52px;
    height: 52px;
    border-radius: 50%;
    object-fit: cover;
    border: 2px solid #ffffff;
    box-shadow: 0 4px 10px rgba(37, 99, 235, 0.2);
    flex-shrink: 0;
}

.cs-author-box p {
    margin: 0;
    font-size: 14px;
    color: #1e3a8a;
    line-height: 1.6;
}

.cs-author-box a {
    color: var(--rk-cs-accent);
    font-weight: 800;
    text-decoration: underline;
    text-decoration-thickness: 1px;
    text-underline-offset: 3px;
}

.cs-author-box a:hover {
    color: #1e3a8a;
}

/* ================= WYZWANIE (SPLIT CARDS - STATYCZNE) ================= */
.cs-interactive-section {
    padding: 0 50px 40px 50px;
}

.cs-split-container {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 20px;
}

.cs-split-card {
    border-radius: 16px;
    padding: 25px;
    border: 2px solid;
    position: relative;
    overflow: hidden;
}

/* Karta Błędu (Czerwona) */
.cs-split-card.before {
    border-color: var(--rk-cs-before);
    background: var(--rk-cs-before-bg);
    box-shadow: 0 10px 25px rgba(239, 68, 68, 0.1);
}

/* Karta Poprawna (Zielona) */
.cs-split-card.after {
    border-color: var(--rk-cs-after);
    background: var(--rk-cs-after-bg);
    box-shadow: 0 10px 25px rgba(16, 185, 129, 0.1);
}

.cs-card-header {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 15px;
}

.cs-card-icon {
    font-size: 28px;
}

.cs-card-title {
    font-size: 18px;
    font-weight: 900;
    color: var(--rk-cs-primary);
    margin: 0;
}

.cs-card-desc {
    font-size: 14px;
    line-height: 1.6;
    color: var(--rk-cs-text);
    margin: 0;
}

/* Sekcje na długi ogon */
.cs-seo-details {
    margin-top: 15px;
    padding: 15px;
    background: rgba(255,255,255,0.7);
    border-radius: 8px;
    border-left: 3px solid;
}

.cs-split-card.before .cs-seo-details { border-left-color: var(--rk-cs-before); }
.cs-split-card.after .cs-seo-details { border-left-color: var(--rk-cs-after); }

.cs-seo-details h4 {
    margin: 0 0 8px 0;
    font-size: 14px;
    color: var(--rk-cs-primary);
}

.cs-seo-details ul {
    margin: 0;
    padding-left: 20px;
    font-size: 13px;
    color: var(--rk-cs-text);
    line-height: 1.5;
}

.cs-seo-details li { margin-bottom: 4px; }
.cs-seo-details li:last-child { margin-bottom: 0; }
.cs-seo-details strong { color: var(--rk-cs-primary); }

/* Statyczne grafiki SVG */
.cs-static-svg-box {
    margin-top: 20px;
    padding: 15px;
    background: #ffffff;
    border-radius: 8px;
    border: 1px dashed var(--rk-cs-border);
}

.cs-svg-graphic {
    width: 100%;
    height: 100px;
}

/* Rozwiązanie tekstowe */
.cs-card-solution {
    margin-top: 15px;
    padding-top: 15px;
    border-top: 1px dashed rgba(0,0,0,0.1);
    font-size: 13px;
    font-weight: 700;
}

.cs-split-card.before .cs-card-solution { color: #991b1b; }
.cs-split-card.after .cs-card-solution { color: #065f46; }

@media (max-width: 768px) {
    .cs-header-wrapper { padding: 35px 25px; }
    .cs-stats-grid { grid-template-columns: 1fr 1fr; }
    .cs-content-section { padding: 30px 25px 20px 25px; }
    .cs-interactive-section { padding: 0 25px 30px 25px; }
    .cs-split-container { grid-template-columns: 1fr; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-casestudy",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Analiza rzeczywistego projektu: Dom 165 m² w Krośnie",
    "description": "Case study audytu instalacji ogrzewania podłogowego. Optymalizacja rozstawu rur przy oknach tarasowych HS, podniesienie SCOP pompy ciepła z 3,2 do 4,15 i oszczędności 1450 PLN rocznie.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-krosno",
    "name": "Parametry OZC i hydrauliki przed i po optymalizacji (Krosno 165m2)",
    "description": "Zestawienie parametrów błędnego układu rur i zoptymalizowanej strefy brzegowej przy wielkogabarytowych przeszkleniach HS.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "projekt ogrzewania podłogowego Krosno",
      "rozstaw rur przy oknie tarasowym HS",
      "temperatura zasilania pompy ciepła 35 stopni",
      "optymalizacja długości pętli podłogówki",
      "wskaźnik SCOP pompy ciepła"
    ],
    "measurementTechnique": "Weryfikacja strat ciepła 85 W/m2 przy oknie HS i korekta rozstawu rur z 15 cm na 10 cm.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Projekt pierwotny: Rozstaw 15 cm, zasilanie 45°C, SCOP 3,2, najdłuższa pętla 138 m.",
        "Projekt zoptymalizowany: Rozstaw 10 cm przy oknie (strefa 1m), zasilanie 35°C, SCOP 4,15.",
        "Efekt ekonomiczny: Oszczędność 1450 PLN rocznie na energii elektrycznej."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-casestudy",
    "name": "Eksplorator Błędów Projektowych HVAC",
    "description": "Moduł porównawczy prezentujący inżynierskie różnice pomiędzy wykonawstwem amatorskim a rzetelnym projektem OZC w kontekście stref przyokiennych.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="case-study-module" id="app-case-study">

    <div class="cs-header-wrapper">
        <div class="cs-badge">Case Study – Audyt Projektu</div>
        <h2>Analiza rzeczywistego projektu instalacji</h2>
        <div class="cs-stats-grid">
            <div class="cs-stat-box">
                <span class="cs-stat-label">Data audytu</span>
                <span class="cs-stat-value">Marzec 2026</span>
            </div>
            <div class="cs-stat-box">
                <span class="cs-stat-label">Lokalizacja</span>
                <span class="cs-stat-value">Okolice Krosna</span>
            </div>
            <div class="cs-stat-box">
                <span class="cs-stat-label">Pow. domu</span>
                <span class="cs-stat-value">165 m²</span>
            </div>
            <div class="cs-stat-box">
                <span class="cs-stat-label">Oszczędności</span>
                <span class="cs-stat-value">1450 PLN / rok</span>
            </div>
        </div>
    </div>

    <div class="cs-content-section">
        <p class="cs-lead-text">
            Podczas weryfikacji dokumentacji technicznej dla inwestora budującego dom w województwie podkarpackim, natrafiliśmy na poważny błąd wykonawczy. Pierwotny instalator zaplanował ułożenie rur w uniwersalnym rozstawie 15 cm na całej powierzchni budynku. Zignorował fakt, że w salonie znajduje się <strong>wielkogabarytowe okno przesuwne HS o szerokości 5,5 metra</strong>.
        </p>
        
        <div class="cs-author-box">
            <img decoding="async" src="https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp" alt="Robert Kucharski" class="cs-author-photo" loading="lazy">
            <p>Audyt przeprowadził CEO portalu  <a href="https://projekt-ogrzewania.pl/">Robert Kucharski</a>. Wprowadzenie danych do autorskiego oprogramowania wykazało, że strefa przyokienna generuje straty ciepła na poziomie 85 W/m².</p>
        </div>
    </div>

    <div class="cs-interactive-section">
        <div class="cs-split-container">
            
            <div class="cs-split-card before">
                <div class="cs-card-header">
                    <span class="cs-card-icon">❌</span>
                    <h3 class="cs-card-title">Pierwotny pomysł wykonawcy</h3>
                </div>
                <p class="cs-card-desc">Rury ułożone rzadko (15 cm) pod oknem HS. Aby pokryć straty 85 W/m², instalator musiał podnieść temperaturę zasilania pompy do 45°C. Dodatkowo jedna pętla miała aż 138 metrów.</p>
                
                <div class="cs-seo-details">
                    <h4>Skutki inżynieryjne błędu:</h4>
                    <ul>
                        <li>Opór hydrauliczny pętli przekroczył <strong>25 kPa</strong>.</li>
                        <li>Spadek przepływu na rotametrze <strong>poniżej 0,5 l/min</strong>.</li>
                        <li>Wymuszenie podbicia krzywej grzewczej <strong>do 45/40°C</strong>.</li>
                    </ul>
                </div>

                <div class="cs-static-svg-box">
                    <svg class="cs-svg-graphic" viewBox="0 0 200 100">
                        <rect x="20" y="10" width="160" height="10" fill="#94a3b8"/>
                        <line x1="20" y1="15" x2="180" y2="15" stroke="#ffffff" stroke-width="2"/>
                        <circle cx="50" cy="50" r="6" fill="#ef4444"/>
                        <circle cx="100" cy="50" r="6" fill="#ef4444"/>
                        <circle cx="150" cy="50" r="6" fill="#ef4444"/>
                        <text x="100" y="85" font-size="12" font-weight="bold" fill="#ef4444" text-anchor="middle">Zasilanie: 45°C | SCOP: 3.2</text>
                    </svg>
                </div>

                <div class="cs-card-solution">
                    Efekt: Drastyczny spadek sprawności pompy (SCOP 3.2), wysokie opory hydrauliczne pętli 138m i chłód bijący od strony szyb w zimie.
                </div>
            </div>

            <div class="cs-split-card after">
                <div class="cs-card-header">
                    <span class="cs-card-icon">✅</span>
                    <h3 class="cs-card-title">Inżynierska optymalizacja</h3>
                </div>
                <p class="cs-card-desc">Skróciliśmy skrajną pętlę do bezpiecznych 92 m i zagęściliśmy rury do 10 cm w pasie o szerokości 1 metra (strefa brzegowa pod oknem). Reszta salonu co 15 cm.</p>
                
                <div class="cs-seo-details">
                    <h4>Korekta projektowa przyniosła:</h4>
                    <ul>
                        <li>Redukcję oporów hydraulicznych <strong>poniżej 15 kPa</strong>.</li>
                        <li>Prawidłowe zrównoważenie sekcji na <strong>1,8 l/min</strong>.</li>
                        <li>Obniżenie krzywej grzewczej dla PC <strong>do 35/30°C</strong>.</li>
                    </ul>
                </div>

                <div class="cs-static-svg-box">
                    <svg class="cs-svg-graphic" viewBox="0 0 200 100">
                        <rect x="20" y="10" width="160" height="10" fill="#94a3b8"/>
                        <line x1="20" y1="15" x2="180" y2="15" stroke="#ffffff" stroke-width="2"/>
                        <circle cx="40" cy="40" r="6" fill="#10b981"/>
                        <circle cx="70" cy="40" r="6" fill="#10b981"/>
                        <circle cx="100" cy="40" r="6" fill="#10b981"/>
                        <circle cx="145" cy="50" r="6" fill="#10b981"/>
                        <text x="100" y="85" font-size="12" font-weight="bold" fill="#10b981" text-anchor="middle">Zasilanie: 35°C | SCOP: 4.15</text>
                    </svg>
                </div>

                <div class="cs-card-solution">
                    Efekt: Obniżenie zasilania do 35°C, wzrost SCOP do 4.15 i realna oszczędność 1450 PLN każdego roku. Równomierny rozkład ciepła.
                </div>
            </div>

        </div>
    </div>

</div>

<script>
(function() {
    const initCaseStudy = () => {
        // Zabezpieczenie domenowe (Skrypt nie usuwa już interakcji z kart, służy tylko do blokady)
        const domain = window.location.hostname;
        const allowedDomains = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
        
        if (!allowedDomains.includes(domain)) {
            const container = document.getElementById('app-case-study');
            if (container) {
                container.innerHTML = `
                    <div style="padding: 40px 25px; text-align: center; background: #fee2e2; color: #dc2626; border-radius: 24px; border: 2px solid #ef4444;">
                        <span style="font-size: 40px; display: block; margin-bottom: 10px;">🔒</span>
                        <h3 style="margin: 0 0 10px 0; font-size: 20px;">Studium Przypadku Chronione</h3>
                        <p style="font-size: 14px; margin-bottom: 15px;">Ten panel to autorska własność Projekt-Ogrzewania.pl. Użycie nieautoryzowane.</p>
                    </div>
                `;
            }
        }
    };

    // Zabezpieczenie przed przedwczesnym odpaleniem skryptu
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initCaseStudy);
    } else {
        initCaseStudy();
    }
})();
</script>



<style>
:root {
    --rk-quote-dark: #0f172a;
    --rk-quote-darker: #020617;
    --rk-quote-primary: #3b82f6; /* Hydronic Blue */
    --rk-quote-accent: #10b981; /* Emerald/Green for success */
    --rk-quote-warning: #f59e0b; /* Amber */
    --rk-quote-danger: #ef4444; /* Red */
    --rk-quote-bg: #ffffff;
    --rk-quote-surface: #f8fafc;
    --rk-quote-border: #cbd5e1;
    --rk-quote-text: #334155;
    --rk-quote-muted: #64748b;
    --rk-quote-shadow: 0 20px 40px -10px rgba(59, 130, 246, 0.15);
}

.rk-quote-container {
    max-width: 950px;
    margin: 50px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--rk-quote-bg);
    border-radius: 24px;
    box-shadow: var(--rk-quote-shadow);
    border: 1px solid var(--rk-quote-border);
    overflow: hidden;
}

/* --- NAGŁÓWEK I CYTAT --- */
.rk-quote-header {
    background: linear-gradient(135deg, var(--rk-quote-darker) 0%, var(--rk-quote-dark) 100%);
    padding: 50px 50px 40px;
    position: relative;
    border-bottom: 4px solid var(--rk-quote-primary);
    text-align: center;
}

.rk-quote-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(59, 130, 246, 0.2);
    color: #93c5fd;
    padding: 6px 16px;
    border-radius: 8px;
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 25px;
    border: 1px solid rgba(147, 197, 253, 0.3);
}

.rk-quote-box {
    position: relative;
    max-width: 800px;
    margin: 0 auto;
}

.rk-quote-mark {
    font-size: 100px;
    color: rgba(255,255,255,0.05);
    position: absolute;
    top: -40px;
    left: -30px;
    line-height: 1;
    font-family: Georgia, serif;
    user-select: none;
}

.rk-quote-text {
    font-size: 24px;
    font-weight: 900;
    line-height: 1.5;
    color: #ffffff;
    margin: 0 0 20px 0;
    position: relative;
    z-index: 2;
}

.rk-quote-text span {
    color: #93c5fd;
}

/* --- INTERAKTYWNE PODSUMOWANIE --- */
.rk-quote-body {
    display: grid;
    grid-template-columns: 320px 1fr;
    background: #ffffff;
}

.rk-rules-list {
    padding: 30px;
    border-right: 1px solid var(--rk-quote-border);
    background: var(--rk-quote-surface);
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.rk-rule-btn {
    background: #ffffff;
    border: 2px solid var(--rk-quote-border);
    padding: 15px;
    border-radius: 12px;
    text-align: left;
    cursor: pointer;
    transition: all 0.2s ease;
    display: flex;
    align-items: center;
    gap: 15px;
}

.rk-rule-btn:hover {
    border-color: #94a3b8;
}

.rk-rule-btn.active {
    background: #eff6ff;
    border-color: var(--rk-quote-primary);
    box-shadow: 0 4px 10px rgba(59, 130, 246, 0.1);
}

.rk-rule-icon {
    width: 36px; height: 36px;
    background: #f1f5f9;
    border-radius: 8px;
    display: flex; align-items: center; justify-content: center;
    color: var(--rk-quote-muted);
    flex-shrink: 0;
    transition: 0.3s;
}

.rk-rule-btn.active .rk-rule-icon {
    background: var(--rk-quote-primary);
    color: #ffffff;
}

.rk-rule-text h3 {
    margin: 0 0 4px 0;
    font-size: 14px;
    font-weight: 900;
    color: var(--rk-quote-dark);
}

.rk-rule-text p {
    margin: 0;
    font-size: 12px;
    color: var(--rk-quote-text);
    font-weight: 600;
}

/* Panele Detali */
.rk-rule-details {
    padding: 40px;
    position: relative;
}

.rk-detail-panel {
    display: none;
}

.rk-detail-panel.active {
    display: flex;
    flex-direction: column;
    gap: 20px;
    animation: rkFadeIn 0.3s ease-out;
}

@keyframes rkFadeIn {
    from { opacity: 0; transform: translateY(10px); }
    to { opacity: 1; transform: translateY(0); }
}

.rk-detail-panel h4 {
    margin: 0;
    font-size: 22px;
    font-weight: 900;
    color: var(--rk-quote-dark);
}

.rk-detail-panel p {
    margin: 0;
    font-size: 15px;
    line-height: 1.7;
    color: var(--rk-quote-text);
}

.rk-detail-panel strong { color: var(--rk-quote-dark); }

.rk-detail-svg-box {
    width: 100%;
    height: 180px;
    background: var(--rk-quote-dark);
    border-radius: 16px;
    padding: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: inset 0 0 20px rgba(0,0,0,0.5);
}

.rk-detail-svg { width: 100%; max-width: 250px; height: auto; }

/* --- AUTOR --- */
.rk-quote-author {
    background: #ffffff;
    padding: 30px 50px;
    display: flex;
    align-items: center;
    gap: 25px;
    border-top: 1px solid var(--rk-quote-border);
}

.rk-author-photo {
    width: 80px;
    height: 80px;
    border-radius: 50%;
    border: 3px solid var(--rk-quote-primary);
    box-shadow: 0 4px 15px rgba(59, 130, 246, 0.2);
    object-fit: cover;
    flex-shrink: 0;
}

.rk-author-info h4 {
    margin: 0 0 5px 0;
    font-size: 18px;
    font-weight: 900;
    color: var(--rk-quote-dark);
}

.rk-author-info p {
    margin: 0 0 10px 0;
    font-size: 14px;
    color: var(--rk-quote-text);
    line-height: 1.5;
}

.rk-author-links {
    display: flex;
    gap: 15px;
}

.rk-author-links a {
    color: var(--rk-quote-primary);
    font-size: 13px;
    font-weight: 800;
    text-decoration: none;
    display: inline-flex;
    align-items: center;
    gap: 5px;
    transition: color 0.2s;
}

.rk-author-links a:hover { color: #1e3a8a; text-decoration: underline; }

@media (max-width: 768px) {
    .rk-quote-header { padding: 40px 25px; }
    .rk-quote-text { font-size: 20px; }
    .rk-quote-body { grid-template-columns: 1fr; }
    .rk-rules-list { border-right: none; border-bottom: 1px solid var(--rk-quote-border); padding: 25px; }
    .rk-rule-details { padding: 25px; }
    .rk-quote-author { flex-direction: column; text-align: center; padding: 30px 25px; }
    .rk-author-links { justify-content: center; }
}
</style>

<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-quote",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Ostateczne podsumowanie: Dlaczego kompleksowy kalkulator podłogówki to konieczność?",
    "description": "Podsumowanie eksperckie dotyczące projektowania ogrzewania podłogowego. Wpływ normy PN-EN 1264, rozstawu rur, i grubości wylewki na efektywność pomp ciepła i koszty instalacji.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-24",
    "dateModified": "2026-05-24"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-summary",
    "name": "Kluczowe Parametry i Limity Ogrzewania Podłogowego (Baza Wiedzy)",
    "description": "Zestawienie twardych norm inżynieryjnych podsumowujących artykuł o projektowaniu podłogówki.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "kompleksowy kalkulator ogrzewania podłogowego",
      "projektowe obciążenie cieplne OZC",
      "rozstaw rur ogrzewania podłogowego",
      "przepływy na rotametrach",
      "długość pętli PEX"
    ],
    "measurementTechnique": "Synteza wniosków z normy PN-EN 1264, uwzględniająca przepływy, średnice i izolacyjność termiczną.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Maksymalna długość pętli PEX 16x2.0 mm wynosi 120 mb.",
        "Grubość wylewki cementowej to min. 45 mm nad rurą, izolacja EPS 100/200.",
        "Rozstaw rur pod pompę ciepła wynosi średnio 10-15 cm, aby uzyskać zasilanie 35°C."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-quote",
    "name": "Eksplorator Wniosków Projektowych",
    "description": "Interaktywny panel prezentujący 3 złote zasady inżynieryjne instalacji podłogowej, wzbogacony o schematy wektorowe.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<div class="rk-quote-container" id="rk-quote-app">
    
    <div class="rk-quote-header">
        <div class="rk-quote-badge">
            <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg>
            Podsumowanie Eksperta
        </div>
        
        <div class="rk-quote-box">
            <div class="rk-quote-mark">&#8222;</div>
            <h2 class="rk-quote-text">
                Ogrzewanie podłogowe to nie jest zgadywanka. To czysta matematyka i fizyka budowli. Bez <span>kompleksowego kalkulatora</span> i obliczeń OZC ryzykujesz nie tylko tysiące złotych na etapie wykonawstwa, ale przede wszystkim komfort swojej rodziny przez kolejne dekady.
            </h2>
        </div>
    </div>

    <div class="rk-quote-body">
        
        <div class="rk-rules-list">
            <button class="rk-rule-btn active" data-target="rk-tab-ozc">
                <div class="rk-rule-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><circle cx="12" cy="12" r="10"></circle><path d="M12 8v4l3 3"></path></svg></div>
                <div class="rk-rule-text">
                    <h3>1. Bilans to Fundament</h3>
                    <p>Straty ciepła vs Zasilanie</p>
                </div>
            </button>

            <button class="rk-rule-btn" data-target="rk-tab-loop">
                <div class="rk-rule-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.57-8.38l5.67-5.67"></path></svg></div>
                <div class="rk-rule-text">
                    <h3>2. Limity Hydrauliczne</h3>
                    <p>Max 120 m dla rury PEX 16</p>
                </div>
            </button>

            <button class="rk-rule-btn" data-target="rk-tab-iso">
                <div class="rk-rule-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><polygon points="12 2 2 7 12 12 22 7 12 2"></polygon><polyline points="2 17 12 22 22 17"></polyline><polyline points="2 12 12 17 22 12"></polyline></svg></div>
                <div class="rk-rule-text">
                    <h3>3. Konstrukcja Płyty</h3>
                    <p>EPS 100 i Grubość Wylewki</p>
                </div>
            </button>
        </div>

        <div class="rk-rule-details">
            
            <div class="rk-detail-panel active" id="rk-tab-ozc">
                <h4>Projektowe Obciążenie Cieplne</h4>
                <p>Każdy budynek oddaje ciepło inaczej. <strong>Kompleksowy kalkulator ogrzewania podłogowego</strong> przetwarza parametry OZC, dobierając idealny <a href="https://projekt-ogrzewania.pl/rozstaw-rur-w-wodnym-ogrzewaniu-podlogowym/" style="color:var(--rk-quote-primary);font-weight:bold;">rozstaw rur</a> (np. 10 cm przy oknach, 15 cm w salonie). Dzięki temu pompa ciepła może pracować na ekstremalnie niskim i tanim zasilaniu rzędu 35°C.</p>
                
                <div class="rk-detail-svg-box">
                    <svg class="rk-detail-svg" viewBox="0 0 200 100">
                        <rect x="50" y="20" width="100" height="60" fill="none" stroke="#64748b" stroke-width="4" rx="4"/>
                        <path d="M 30 50 L 50 50 M 150 50 L 170 50" stroke="#3b82f6" stroke-width="4" stroke-linecap="round"/>
                        <circle cx="100" cy="50" r="15" fill="#10b981"/>
                        <text x="100" y="54" font-size="12" font-weight="bold" fill="#0f172a" text-anchor="middle">OZC</text>
                    </svg>
                </div>
            </div>

            <div class="rk-detail-panel" id="rk-tab-loop">
                <h4>Blokada przepływów na rotametrach</h4>
                <p>Zignorowanie normy <strong>PN-EN 1264</strong> i ułożenie pętli dłuższej niż 120 metrów dla rury PEX 16&#215;2.0 kończy się tragedią. Opory hydrauliczne rosną powyżej 20 kPa, co uniemożliwia wyregulowanie <a href="https://projekt-ogrzewania.pl/rotametr-wskaznik-przeplywu-w-rozdzielaczu-ogrzewania-podlogowego/" style="color:var(--rk-quote-primary);font-weight:bold;">przepływów na rotametrach</a>. Efektem jest permanentnie zimna posadzka.</p>
                
                <div class="rk-detail-svg-box">
                    <svg class="rk-detail-svg" viewBox="0 0 200 100">
                        <path d="M 20 50 Q 50 20 80 50 T 140 50 T 180 50" fill="none" stroke="#3b82f6" stroke-width="6" stroke-linecap="round"/>
                        <line x1="20" y1="80" x2="180" y2="80" stroke="#ef4444" stroke-width="3"/>
                        <text x="100" y="72" font-size="12" font-weight="bold" fill="#ef4444" text-anchor="middle">MAX 120 mb</text>
                    </svg>
                </div>
            </div>

            <div class="rk-detail-panel" id="rk-tab-iso">
                <h4>Nośność i pękanie wylewek</h4>
                <p>Ułożenie rur na tanim styropianie fasadowym (EPS 70 zamiast twardego EPS 100/200) to błąd wykonawczy. Pod wpływem ciężaru wylewki i mebli, warstwa izolacji ulega ściśnięciu. Dochodzi do zerwania taśm dylatacyjnych, a grubość jastrychu (min. 45 mm nad rurą) traci swoją strukturę nośną.</p>
                
                <div class="rk-detail-svg-box">
                    <svg class="rk-detail-svg" viewBox="0 0 200 100">
                        <rect x="20" y="20" width="160" height="30" fill="#cbd5e1"/>
                        <rect x="20" y="55" width="160" height="25" fill="#64748b"/>
                        <circle cx="50" cy="35" r="5" fill="#3b82f6"/><circle cx="100" cy="35" r="5" fill="#3b82f6"/><circle cx="150" cy="35" r="5" fill="#3b82f6"/>
                        <text x="100" y="72" font-size="11" font-weight="bold" fill="#ffffff" text-anchor="middle">EPS 100 (Twardy)</text>
                    </svg>
                </div>
            </div>

        </div>
    </div>

    <div class="rk-quote-author">
        <img decoding="async" src="https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp" alt="Robert Kucharski - Inżynier HVAC" class="rk-author-photo" loading="lazy">
        <div class="rk-author-info">
            <h4>Robert Kucharski</h4>
            <p>Główny audytor i projektant HVAC na portalu Projekt-Ogrzewania.pl. Setki zaprojektowanych instalacji i godzin spędzonych na placach budowy przekuwam w twardą, matematyczną wiedzę dla inwestorów.</p>
            <div class="rk-author-links">
                <a href="https://www.linkedin.com/in/robert-kucharski-38069b48/" target="_blank" rel="noopener noreferrer">
                    <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>
                    LinkedIn
                </a>
                <a href="https://www.facebook.com/robert.kucharski.budowa.bez.sciemy" target="_blank" rel="noopener noreferrer">
                    <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.469h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.469h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg>
                    Facebook
                </a>
            </div>
        </div>
    </div>

</div>

<script>
(function() {
    const initApp = () => {
        // Zabezpieczenie Domenowe - DOMAIN LOCK
        const domain = window.location.hostname;
        const allowedDomains = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
        
        if (!allowedDomains.includes(domain)) {
            const container = document.getElementById('rk-quote-app');
            if (container) {
                container.innerHTML = `
                    <div style="padding:40px; text-align:center; background:#0f172a; color:#ef4444; border-radius:24px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                        <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                        BŁĄD LICENCJI:<br>Kontener informacyjny należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na nieautoryzowanej domenie jest zabronione prawem.
                    </div>
                `;
                return;
            }
        }

        // Logika zakładek
        const btns = document.querySelectorAll('.rk-rule-btn');
        const panels = document.querySelectorAll('.rk-detail-panel');

        btns.forEach(btn => {
            btn.addEventListener('click', function(e) {
                const targetId = e.currentTarget.getAttribute('data-target');
                
                // Reset
                btns.forEach(b => b.classList.remove('active'));
                panels.forEach(p => p.classList.remove('active'));
                
                // Aktywacja
                e.currentTarget.classList.add('active');
                const targetPanel = document.getElementById(targetId);
                if(targetPanel) {
                    targetPanel.classList.add('active');
                }
            });
        });
    };

    // Zabezpieczenie przed opóźnionym ładowaniem (WordPress/Elementor)
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', initApp);
    } else {
        initApp();
    }
})();
</script>



<style>
:root {
    --rk-faq2-dark: #1e293b;
    --rk-faq2-card: #ffffff;
    --rk-faq2-brand: #0ea5e9; /* Ekspercki błękit */
    --rk-faq2-brand-light: #e0f2fe;
    --rk-faq2-accent: #f59e0b; /* Bursztyn dla kontrastu / ciepła */
    --rk-faq2-alert: #ef4444; /* Czerwień błędów */
    --rk-faq2-bg: #f8fafc;
    --rk-faq2-border: #cbd5e1;
    --rk-faq2-text: #334155;
    --rk-faq2-muted: #64748b;
}

.rk-faq2-container {
    max-width: 950px;
    margin: 50px auto;
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
    background: var(--rk-faq2-card);
    border-radius: 20px;
    box-shadow: 0 20px 40px -10px rgba(14, 165, 233, 0.1);
    border: 1px solid var(--rk-faq2-border);
    overflow: hidden;
}

/* Nagłówek */
.rk-faq2-header {
    background: linear-gradient(135deg, var(--rk-faq2-dark) 0%, #0f172a 100%);
    padding: 40px 50px;
    color: #ffffff;
    position: relative;
    border-bottom: 5px solid var(--rk-faq2-brand);
}

.rk-faq2-badge {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    background: rgba(14, 165, 233, 0.2);
    color: #38bdf8;
    padding: 6px 16px;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 800;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    margin-bottom: 15px;
    border: 1px solid rgba(56, 189, 248, 0.3);
}

.rk-faq2-title {
    font-size: 28px;
    font-weight: 900;
    line-height: 1.3;
    margin: 0;
}

.rk-faq2-title span { color: #bae6fd; }

/* Sekcja Akordeonu */
.rk-faq2-interactive {
    padding: 35px 45px;
    background: var(--rk-faq2-bg);
}

.rk-faq2-list {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.rk-faq2-item {
    background: var(--rk-faq2-card);
    border: 1px solid var(--rk-faq2-border);
    border-left: 4px solid var(--rk-faq2-border);
    border-radius: 12px;
    overflow: hidden;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    box-shadow: 0 2px 4px rgba(0,0,0,0.02);
}

.rk-faq2-item.active {
    border-color: var(--rk-faq2-brand);
    border-left-width: 6px;
    box-shadow: 0 10px 20px -5px rgba(14, 165, 233, 0.15);
}

/* Przycisk Pytania */
.rk-faq2-question {
    width: 100%;
    text-align: left;
    background: transparent;
    border: none;
    padding: 20px 25px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    cursor: pointer;
    font-size: 16px;
    font-weight: 800;
    color: var(--rk-faq2-dark);
    transition: background 0.3s;
}

.rk-faq2-question:hover {
    background: #f1f5f9;
}

.rk-faq2-item.active .rk-faq2-question {
    background: var(--rk-faq2-brand-light);
    color: #0369a1;
}

.rk-faq2-icon {
    flex-shrink: 0;
    width: 36px;
    height: 36px;
    border-radius: 8px;
    background: #f1f5f9;
    color: var(--rk-faq2-muted);
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}

.rk-faq2-item.active .rk-faq2-icon {
    background: var(--rk-faq2-brand);
    color: #ffffff;
    transform: rotate(45deg); /* Zmiana plusa w krzyżyk */
}

/* Kontener Odpowiedzi */
.rk-faq2-answer-wrapper {
    display: grid;
    grid-template-rows: 0fr;
    transition: grid-template-rows 0.4s cubic-bezier(0.4, 0, 0.2, 1);
}

.rk-faq2-item.active .rk-faq2-answer-wrapper {
    grid-template-rows: 1fr;
}

.rk-faq2-answer-inner {
    overflow: hidden;
}

/* Wnętrze Odpowiedzi */
.rk-faq2-content {
    padding: 20px 25px 25px;
    border-top: 1px dashed var(--rk-faq2-border);
    display: grid;
    grid-template-columns: 1fr 220px;
    gap: 30px;
    align-items: center;
}

.rk-faq2-text {
    font-size: 15px;
    line-height: 1.7;
    color: var(--rk-faq2-text);
}

.rk-faq2-text strong {
    font-weight: 800;
    color: var(--rk-faq2-dark);
    background: linear-gradient(120deg, rgba(14, 165, 233, 0.1) 0%, rgba(14, 165, 233, 0.1) 100%);
    background-repeat: no-repeat;
    background-size: 100% 30%;
    background-position: 0 80%;
}

.rk-link {
    color: var(--rk-faq2-brand);
    font-weight: 700;
    text-decoration: underline;
    text-underline-offset: 3px;
    transition: color 0.3s;
}

.rk-link:hover { color: #0284c7; }

/* Wizualizacje SVG */
.rk-faq2-visual {
    background: #f8fafc;
    border-radius: 12px;
    height: 160px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 2px solid #e2e8f0;
    position: relative;
    overflow: hidden;
}

.rk-svg-stage { width: 100%; height: 100%; }

/* --- Animacje SVG zależne od .active --- */

/* 1. Mieszacz (Zawór 3-drogowy) */
.anim-mix-hot { stroke-dasharray: 8; animation: flowHot 2s linear infinite; opacity: 0; stroke: #ef4444; }
.anim-mix-cold { stroke-dasharray: 8; animation: flowCold 2s linear infinite; opacity: 0; stroke: #3b82f6; }
.anim-mix-warm { stroke-dasharray: 8; animation: flowWarm 2s linear infinite; opacity: 0; stroke: #f59e0b; }
.rk-faq2-item.active .anim-mix-hot, .rk-faq2-item.active .anim-mix-cold, .rk-faq2-item.active .anim-mix-warm { opacity: 1; }
@keyframes flowHot { to { stroke-dashoffset: -16; } }
@keyframes flowCold { to { stroke-dashoffset: -16; } }
@keyframes flowWarm { to { stroke-dashoffset: 16; } }

/* 2. Glikol vs Woda Demi */
.anim-water-demi { transform: scaleY(0); transform-origin: bottom; transition: transform 1s 0.3s ease-out; fill: #38bdf8; }
.rk-faq2-item.active .anim-water-demi { transform: scaleY(1); }
.anim-bubbles circle { opacity: 0; animation: floatUp 2s infinite ease-in; }
.rk-faq2-item.active .anim-bubbles circle:nth-child(1) { animation-delay: 0.5s; }
.rk-faq2-item.active .anim-bubbles circle:nth-child(2) { animation-delay: 1.2s; }
.rk-faq2-item.active .anim-bubbles circle:nth-child(3) { animation-delay: 0.8s; }
@keyframes floatUp { 0% { opacity: 0; transform: translateY(10px); } 50% { opacity: 1; } 100% { opacity: 0; transform: translateY(-20px); } }

/* 3. Długa Pętla (Brak Przepływu) */
.anim-long-pipe { stroke-dasharray: 200; stroke-dashoffset: 200; stroke: #ef4444; transition: stroke-dashoffset 2s 0.3s ease-out; }
.rk-faq2-item.active .anim-long-pipe { stroke-dashoffset: 0; }
.anim-block { opacity: 0; transition: opacity 0.3s 2.3s; }
.rk-faq2-item.active .anim-block { opacity: 1; }

/* 4. Rozstaw Łazienka */
.anim-dense-pipe { stroke-dasharray: 300; stroke-dashoffset: 300; transition: stroke-dashoffset 1.5s 0.3s ease-out; }
.rk-faq2-item.active .anim-dense-pipe { stroke-dashoffset: 0; }
.anim-heat-wave path { opacity: 0; animation: radiate 1.5s infinite alternate; }
.rk-faq2-item.active .anim-heat-wave path:nth-child(1) { animation-delay: 0.8s; }
.rk-faq2-item.active .anim-heat-wave path:nth-child(2) { animation-delay: 1.0s; }
.rk-faq2-item.active .anim-heat-wave path:nth-child(3) { animation-delay: 1.2s; }
@keyframes radiate { from { opacity: 0; transform: translateY(0); } to { opacity: 0.6; transform: translateY(-5px); stroke: #ef4444; } }

/* 5. Wygrzewanie (28 dni) */
.anim-calendar-leaf { transform-origin: top; transition: transform 0.5s 0.3s, opacity 0.5s 0.3s; }
.rk-faq2-item.active .anim-calendar-leaf { transform: rotateX(-90deg); opacity: 0; }
.anim-crack { stroke-dasharray: 50; stroke-dashoffset: 50; transition: stroke-dashoffset 0.5s 0.8s; }
.rk-faq2-item.active .anim-crack { stroke-dashoffset: 0; }

@media (max-width: 768px) {
    .rk-faq2-header, .rk-faq2-interactive { padding: 30px 20px; }
    .rk-faq2-title { font-size: 24px; }
    .rk-faq2-content { grid-template-columns: 1fr; gap: 20px; padding: 20px; }
    .rk-faq2-visual { height: 140px; max-width: 250px; margin: 0 auto; width: 100%; }
    .rk-faq2-question { font-size: 15px; padding: 16px 20px; }
}
</style>

<!-- ==========================================
     INVISIBLE DATA (JSON-LD)
=========================================== -->
<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article-faq",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "FAQ – Najczęściej zadawane pytania projektowe",
    "description": "Zbiór kluczowych pytań inwestorskich o łączenie podłogówki z grzejnikami, rodzaj zładu (woda vs glikol), graniczne długości pętli oraz proces wygrzewania posadzki.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2026-05-23",
    "dateModified": "2026-05-23"
  },
  {
    "@context": "https://schema.org",
    "@type": "FAQPage",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#faq",
    "mainEntity": [
      {
        "@type": "Question",
        "name": "Czy można połączyć ogrzewanie podłogowe bezpośrednio z tradycyjnymi grzejnikami w jednym obiegu?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Bezpośrednie połączenie jest niedopuszczalne, ponieważ grzejniki wymagają wysokich temperatur zasilania (55–75°C), które zniszczyłyby posadzkę podłogówki. Konieczne jest zastosowanie układu rozdzielczego z niezależną grupą pompowo-mieszaczową wyposażoną w trójdrogowy zawór termostatyczny obniżający parametr dla podłogówki do bezpiecznych 35–40°C."
        }
      },
      {
        "@type": "Question",
        "name": "Czym najlepiej napełnić instalację ogrzewania podłogowego – zwykłą wodą z kranu czy glikolem?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Instalację w domach całorocznych należy napełnić wodą demineralizowaną uzdatnioną inhibitorem korozji, który chroni układ przed odkładaniem się kamienia kotłowego i szlamu. Glikol stosuje się wyłącznie w domkach letniskowych lub układach narażonych na zamarzanie, pamiętając, że zmniejsza on sprawność wymiany ciepła o ok. 10–15% z uwagi na wyższą lepkość kinematiczną."
        }
      },
      {
        "@type": "Question",
        "name": "Co się stanie, jeśli wykonawca ułoży zbyt długą pętlę podłogówki, np. 160 metrów rury 16 mm?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Taka pętla wygeneruje opory hydrauliczne drastycznie przekraczające możliwości standardowej pompy obiegowej, przez co przepływ wody spadnie niemal do zera. W efekcie początek pętli przy rozdzielaczu będzie ciepły, a reszta pomieszczenia pozostanie całkowicie zimna, co wymaga wpięcia dodatkowej pompy wspomagającej lub uciążliwego kucia posadzki w celu podziału obwodu."
        }
      },
      {
        "@type": "Question",
        "name": "Dlaczego w łazienkach zawsze projektuje się gęstszy rozstaw rur (co 10 cm) niż w pokojach?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Łazienki charakteryzują się wyższą temperaturą obliczeniową wnętrza (24°C zamiast 20°C) przy jednoczesnym ograniczeniu wolnej powierzchni posadzki przez brodziki, wanny i miski WC. Gęstszy rozstaw rur pozwala wygenerować wyższą gęstość strumienia cieplnego z jednego metra kwadratowego i pokryć zapotrzebowanie na ciepło mimo małej powierzchni grzewczej."
        }
      },
      {
        "@type": "Question",
        "name": "Po jakim czasie od zalania wylewki betonowej można uruchomić ogrzewanie podłogowe i zacząć proces wygrzewania?",
        "acceptedAnswer": {
          "@type": "Answer",
          "text": "Proces wygrzewania jastrychu cementowego można rozpocząć najwcześniej po upływie 28 dni od jego wylania (dla wylewek anhydrytowych czas ten skraca się do 7 dni). Zbyt wczesne podanie temperatury spowoduje gwałtowne odparowanie wody niezbędnej do procesu hydratacji cementu, co doprowadzi do drastycznego spadku wytrzymałości mechanicznej posadzki i jej nieodwracalnego spękania."
        }
      }
    ]
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset-faq",
    "name": "Wytyczne Projektowo-Wykonawcze Ogrzewania Podłogowego (Baza Wiedzy)",
    "description": "Kompilacja normatywnych wytycznych instalacyjnych (rozstawy w łazienkach, max długości pętli, proces hydratacji jastrychu) niezbędnych przy obliczeniach hydraulicznych.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": { "@type": "Person", "name": "Robert Kucharski" },
    "keywords": [
      "połączenie podłogówki z grzejnikami",
      "woda demineralizowana czy glikol",
      "zbyt długa pętla podłogówki 160m",
      "rozstaw rur w łazience 10 cm",
      "wygrzewanie wylewki betonowej 28 dni"
    ],
    "measurementTechnique": "Określenie parametrów granicznych na podstawie norm PN-EN 1264, PN-EN 12831 oraz wymagań chemii budowlanej (hydratacja cementu).",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Wymóg stosowania zaworu 3-drogowego przy łączeniu z grzejnikami (redukcja 75°C -> 35°C).",
        "Opory hydrauliczne długiej pętli >120m blokują przepływ masowy.",
        "Proces dojrzewania betonu wymaga minimum 28 dni przed startem wygrzewania."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp-faq",
    "name": "Interaktywna Baza Błędów Wykonawczych",
    "description": "Narzędzie FAQ z wbudowanymi animacjami SVG obrazującymi skutki błędów instalacyjnych: brak mieszacza, zbyt długa pętla hydrauliczna czy przedwczesne wygrzewanie betonu.",
    "applicationCategory": "EducationalApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": { "@type": "Person", "name": "Robert Kucharski" }
  }
]
</script>

<!-- ==========================================
     HTML KONTENERA
=========================================== -->
<div class="rk-faq2-container" id="rk-faq2-app">
    
    <div class="rk-faq2-header">
        <div class="rk-faq2-badge">
            <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>
            Baza Wiedzy Inżyniera
        </div>
        <h2 class="rk-faq2-title">FAQ – <span>Najczęściej zadawane pytania</span></h2>
    </div>

    <div class="rk-faq2-interactive">
        <div class="rk-faq2-list">
            
            <!-- Pytanie 1: Podłogówka + Grzejniki -->
            <div class="rk-faq2-item">
                <button class="rk-faq2-question">
                    <span>1. Czy można połączyć podłogówkę bezpośrednio z grzejnikami?</span>
                    <div class="rk-faq2-icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
                    </div>
                </button>
                <div class="rk-faq2-answer-wrapper">
                    <div class="rk-faq2-answer-inner">
                        <div class="rk-faq2-content">
                            <div class="rk-faq2-text">
                                Bezpośrednie połączenie jest <strong>niedopuszczalne</strong>. Grzejniki wymagają wysokich temperatur zasilania (55–75°C), które zniszczyłyby posadzkę podłogówki (pękanie wylewki). Konieczne jest zastosowanie układu rozdzielczego z niezależną grupą pompowo-mieszaczową wyposażoną w <a href="https://projekt-ogrzewania.pl/zawor-mieszajacy-w-ogrzewaniu-podlogowym/" class="rk-link">zawór termostatyczny</a> obniżający parametr do bezpiecznych 35–40°C.
                            </div>
                            <div class="rk-faq2-visual">
                                <svg class="rk-svg-stage" viewBox="0 0 120 80">
                                    <path d="M 10 40 L 40 40" stroke="#ef4444" stroke-width="6" stroke-linecap="round"></path>
                                    <path d="M 40 70 L 40 50" stroke="#3b82f6" stroke-width="6" stroke-linecap="round"></path>
                                    <path d="M 40 40 L 100 40" stroke="#f59e0b" stroke-width="6" stroke-linecap="round"></path>
                                    <!-- Animowane przepływy -->
                                    <path d="M 10 40 L 35 40" stroke-width="3" stroke-linecap="round" class="anim-mix-hot"></path>
                                    <path d="M 40 70 L 40 45" stroke-width="3" stroke-linecap="round" class="anim-mix-cold"></path>
                                    <path d="M 45 40 L 100 40" stroke-width="3" stroke-linecap="round" class="anim-mix-warm"></path>
                                    <circle cx="40" cy="40" r="10" fill="#1e293b"></circle>
                                    <text x="40" y="44" fill="#fff" font-size="10" text-anchor="middle" font-weight="bold">M</text>
                                </svg>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Pytanie 2: Woda vs Glikol -->
            <div class="rk-faq2-item">
                <button class="rk-faq2-question">
                    <span>2. Czym napełnić instalację – wodą z kranu czy glikolem?</span>
                    <div class="rk-faq2-icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
                    </div>
                </button>
                <div class="rk-faq2-answer-wrapper">
                    <div class="rk-faq2-answer-inner">
                        <div class="rk-faq2-content">
                            <div class="rk-faq2-text">
                                Instalację w domach całorocznych należy napełnić <a href="https://projekt-ogrzewania.pl/woda-demineralizowana-z-inhibitorem-korozji-do-ogrzewania-podlogowego/" class="rk-link">wodą demineralizowaną z inhibitorem korozji</a>. Chroni to układ przed odkładaniem się kamienia i szlamu. <a href="https://projekt-ogrzewania.pl/glikol-w-ogrzewaniu-podlogowym-prawda-i-mity-ktore-musi-znac-kazdy-inwestor/" class="rk-link">Glikol</a> stosuje się wyłącznie w układach narażonych na zamarzanie (domki letniskowe), pamiętając, że zmniejsza on sprawność wymiany ciepła o ok. 10–15% ze względu na gęstość.
                            </div>
                            <div class="rk-faq2-visual">
                                <svg class="rk-svg-stage" viewBox="0 0 120 80">
                                    <path d="M 40 20 L 40 70 L 80 70 L 80 20" fill="none" stroke="#94a3b8" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"></path>
                                    <rect x="42" y="30" width="36" height="38" class="anim-water-demi"></rect>
                                    <g class="anim-bubbles" fill="#ffffff">
                                        <circle cx="50" cy="60" r="2"></circle>
                                        <circle cx="60" cy="55" r="3"></circle>
                                        <circle cx="70" cy="65" r="1.5"></circle>
                                    </g>
                                    <text x="60" y="50" fill="#fff" font-size="12" text-anchor="middle" font-weight="bold">H₂O+</text>
                                </svg>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Pytanie 3: Za długa pętla -->
            <div class="rk-faq2-item">
                <button class="rk-faq2-question">
                    <span>3. Co się stanie, jeśli pętla wyniesie np. 160 metrów?</span>
                    <div class="rk-faq2-icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
                    </div>
                </button>
                <div class="rk-faq2-answer-wrapper">
                    <div class="rk-faq2-answer-inner">
                        <div class="rk-faq2-content">
                            <div class="rk-faq2-text">
                                Taka <a href="https://projekt-ogrzewania.pl/za-dluga-petla-podlogowki/" class="rk-link">za długa pętla</a> wygeneruje opory hydrauliczne drastycznie przekraczające możliwości standardowej pompy obiegowej. Przepływ wody spadnie niemal do zera. W efekcie początek pętli przy rozdzielaczu będzie ciepły, a <strong>reszta pomieszczenia pozostanie całkowicie zimna</strong> (upośledzenie hydrauliczne).
                            </div>
                            <div class="rk-faq2-visual">
                                <svg class="rk-svg-stage" viewBox="0 0 120 80">
                                    <path d="M 10 20 Q 30 20, 30 40 T 50 60 T 70 40 T 90 60 T 110 40" fill="none" stroke="#e2e8f0" stroke-width="6" stroke-linecap="round"></path>
                                    <path d="M 10 20 Q 30 20, 30 40 T 50 60" fill="none" stroke-width="6" stroke-linecap="round" class="anim-long-pipe"></path>
                                    <circle cx="50" cy="60" r="8" fill="#ef4444" class="anim-block"></circle>
                                    <line x1="45" y1="55" x2="55" y2="65" stroke="#fff" stroke-width="2" class="anim-block"></line>
                                    <line x1="55" y1="55" x2="45" y2="65" stroke="#fff" stroke-width="2" class="anim-block"></line>
                                </svg>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Pytanie 4: Łazienka 10 cm -->
            <div class="rk-faq2-item">
                <button class="rk-faq2-question">
                    <span>4. Dlaczego w łazienkach zawsze projektuje się rozstaw rur co 10 cm?</span>
                    <div class="rk-faq2-icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
                    </div>
                </button>
                <div class="rk-faq2-answer-wrapper">
                    <div class="rk-faq2-answer-inner">
                        <div class="rk-faq2-content">
                            <div class="rk-faq2-text">
                                Łazienki charakteryzują się wyższą temperaturą projektową (24°C zamiast 20°C) przy <strong>mocno ograniczonej wolnej powierzchni</strong> posadzki (odchodzą brodziki, wanny, zabudowy WC). Gęstszy <a href="https://projekt-ogrzewania.pl/rozstaw-rur-w-ogrzewaniu-podlogowym-co-10-czy-15-cm/" class="rk-link">rozstaw rur (co 10 cm)</a> pozwala wygenerować wyższą gęstość strumienia cieplnego z 1 m² i pokryć straty ciepła przy małej powierzchni grzewczej.
                            </div>
                            <div class="rk-faq2-visual">
                                <svg class="rk-svg-stage" viewBox="0 0 120 80">
                                    <path class="anim-dense-pipe" d="M 20 60 L 100 60 M 20 50 L 100 50 M 20 40 L 100 40" stroke="#f59e0b" stroke-width="4" stroke-linecap="round"></path>
                                    <g class="anim-heat-wave" stroke="#f59e0b" stroke-width="2" stroke-linecap="round" fill="none">
                                        <path d="M 40 30 Q 45 25, 50 30 T 60 30"></path>
                                        <path d="M 60 25 Q 65 20, 70 25 T 80 25"></path>
                                        <path d="M 80 30 Q 85 25, 90 30 T 100 30"></path>
                                    </g>
                                </svg>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

            <!-- Pytanie 5: Wygrzewanie betonu -->
            <div class="rk-faq2-item">
                <button class="rk-faq2-question">
                    <span>5. Po jakim czasie od zalania wylewki można zacząć ją wygrzewać?</span>
                    <div class="rk-faq2-icon">
                        <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="5" x2="12" y2="19"></line><line x1="5" y1="12" x2="19" y2="12"></line></svg>
                    </div>
                </button>
                <div class="rk-faq2-answer-wrapper">
                    <div class="rk-faq2-answer-inner">
                        <div class="rk-faq2-content">
                            <div class="rk-faq2-text">
                                Wygrzewanie klasycznego jastrychu cementowego można rozpocząć <strong>najwcześniej po upływie 28 dni</strong> od jego wylania. Zbyt wczesne podanie temperatury spowoduje gwałtowne odparowanie wody niezbędnej do hydratacji cementu. Skutkuje to drastycznym spadkiem wytrzymałości mechanicznej posadzki i jej <strong>nieodwracalnym spękaniem</strong> (tzw. zjawisko &#8222;miski&#8221;).
                            </div>
                            <div class="rk-faq2-visual">
                                <svg class="rk-svg-stage" viewBox="0 0 120 80">
                                    <rect x="40" y="20" width="40" height="40" rx="4" fill="#e2e8f0" stroke="#94a3b8" stroke-width="3"></rect>
                                    <path d="M 45 15 L 45 25 M 75 15 L 75 25" stroke="#ef4444" stroke-width="4" stroke-linecap="round"></path>
                                    <text x="60" y="45" font-size="16" font-weight="bold" fill="#334155" text-anchor="middle">28</text>
                                    <rect class="anim-calendar-leaf" x="40" y="20" width="40" height="20" fill="#cbd5e1" rx="4"></rect>
                                    <!-- Pęknięcie wylewki -->
                                    <path class="anim-crack" d="M 10 70 L 30 65 L 45 75 L 60 60" fill="none" stroke="#1e293b" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>
                                </svg>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </div>
    </div>
</div>

<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowed = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowed.includes(domain)) {
        const container = document.getElementById('rk-faq2-app');
        if (container) {
            container.innerHTML = `
                <div style="padding:40px; text-align:center; background:#1e293b; color:#ef4444; border-radius:20px; font-weight:900; font-family:sans-serif; border: 2px solid #ef4444;">
                    <div style="font-size:30px; margin-bottom:10px;">⚠️</div>
                    BŁĄD LICENCJI:<br>Kontener FAQ należy do serwisu Projekt-Ogrzewania.pl. Uruchamianie na tej domenie jest nieautoryzowane.
                </div>
            `;
            return;
        }
    }

    // Logika Akordeonu
    const faqItems = document.querySelectorAll('.rk-faq2-item');

    faqItems.forEach(item => {
        const btn = item.querySelector('.rk-faq2-question');
        btn.addEventListener('click', () => {
            const isActive = item.classList.contains('active');
            
            // Zamykamy wszystkie
            faqItems.forEach(i => i.classList.remove('active'));
            
            // Otwieramy kliknięty, jeśli nie był aktywny
            if (!isActive) {
                item.classList.add('active');
            }
        });
    });
    
    // Otwórz pierwszy element po załadowaniu
    if(faqItems.length > 0) {
        faqItems[0].classList.add('active');
    }
});
</script>



<style>
:root {
    --rk-base-dark: #1e293b;
    --rk-base-darker: #0f172a;
    --rk-base-blue: #0ea5e9;
    --rk-base-light: #f8fafc;
    --rk-base-border: #e2e8f0;
    --rk-pro-green: #10b981;
    --rk-pro-green-bg: #ecfdf5;
    --rk-amateur-red: #ef4444;
    --rk-amateur-red-bg: #fef2f2;
    --rk-text-main: #334155;
    --rk-text-muted: #64748b;
    --rk-card-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);
}

.rk-summary-dashboard {
    max-width: 950px;
    margin: 40px auto;
    font-family: 'Inter', -apple-system, sans-serif;
    background: #ffffff;
    border-radius: 24px;
    box-shadow: 0 25px 50px -12px rgba(14, 165, 233, 0.15);
    border: 1px solid var(--rk-base-blue);
    overflow: hidden;
}

/* --- NAGŁÓWEK --- */
.rk-dash-header {
    padding: 45px 50px;
    background: linear-gradient(135deg, var(--rk-base-darker) 0%, var(--rk-base-dark) 100%);
    color: #ffffff;
    position: relative;
}

.rk-dash-header::after {
    content: '';
    position: absolute;
    bottom: 0; left: 0; right: 0;
    height: 4px;
    background: linear-gradient(90deg, var(--rk-base-blue), var(--rk-pro-green));
}

.rk-dash-header h2 {
    font-size: 28px;
    font-weight: 900;
    margin: 0 0 20px 0;
    line-height: 1.3;
    color: #ffffff;
}

.rk-dash-lead {
    font-size: 16px;
    line-height: 1.7;
    color: #cbd5e1;
    margin: 0;
}

.rk-dash-lead a {
    color: #7dd3fc;
    text-decoration: underline;
    text-underline-offset: 3px;
    font-weight: 600;
}

/* --- INTERAKTYWNY PANEL --- */
.rk-dash-interactive {
    padding: 40px 50px;
    background: var(--rk-base-light);
}

.rk-dash-interactive h3 {
    text-align: center;
    font-size: 22px;
    font-weight: 800;
    color: var(--rk-base-darker);
    margin: 0 0 25px 0;
}

/* Przełącznik (Toggle Switch) */
.rk-toggle-container {
    display: flex;
    justify-content: center;
    margin-bottom: 40px;
}

.rk-master-switch {
    position: relative;
    display: flex;
    background: #e2e8f0;
    border-radius: 999px;
    padding: 6px;
    width: 100%;
    max-width: 500px;
    box-shadow: inset 0 2px 4px rgba(0,0,0,0.05);
}

.rk-switch-btn {
    flex: 1;
    padding: 14px 20px;
    font-size: 15px;
    font-weight: 800;
    text-align: center;
    color: var(--rk-text-muted);
    cursor: pointer;
    z-index: 2;
    transition: color 0.3s ease;
    border-radius: 999px;
    user-select: none;
}

.rk-switch-btn.active {
    color: #ffffff;
}

.rk-switch-glider {
    position: absolute;
    top: 6px;
    bottom: 6px;
    left: 6px;
    width: calc(50% - 6px);
    background: var(--rk-pro-green);
    border-radius: 999px;
    transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1), background-color 0.4s;
    z-index: 1;
    box-shadow: 0 4px 10px rgba(16, 185, 129, 0.3);
}

.state-amateur .rk-switch-glider {
    transform: translateX(100%);
    background: var(--rk-amateur-red);
    box-shadow: 0 4px 10px rgba(239, 68, 68, 0.3);
}

/* Kafelki z parametrami (Grid) */
.rk-metrics-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 25px;
    margin-bottom: 40px;
}

.rk-metric-card {
    background: #ffffff;
    padding: 25px 20px;
    border-radius: 16px;
    border: 1px solid var(--rk-base-border);
    box-shadow: var(--rk-card-shadow);
    text-align: center;
    transition: all 0.4s ease;
    position: relative;
    overflow: hidden;
}

.rk-metric-card::before {
    content: '';
    position: absolute;
    top: 0; left: 0; right: 0;
    height: 4px;
    background: var(--rk-base-border);
    transition: background-color 0.4s;
}

.state-pro .rk-metric-card::before { background: var(--rk-pro-green); }
.state-amateur .rk-metric-card::before { background: var(--rk-amateur-red); }

.rk-metric-icon {
    margin-bottom: 15px;
    height: 45px;
    display: flex;
    align-items: center;
    justify-content: center;
}

.rk-metric-card h4 {
    margin: 0 0 10px 0;
    font-size: 16px;
    font-weight: 800;
    color: var(--rk-base-darker);
}

.rk-metric-val {
    font-size: 14px;
    font-weight: 600;
    color: var(--rk-text-muted);
    min-height: 42px;
    transition: color 0.3s;
}

.state-pro .rk-val-pro { display: block; color: var(--rk-pro-green); }
.state-pro .rk-val-amateur { display: none; }
.state-amateur .rk-val-pro { display: none; }
.state-amateur .rk-val-amateur { display: block; color: var(--rk-amateur-red); }

/* SVG Dashboard */
.rk-svg-dashboard {
    background: #ffffff;
    border-radius: 20px;
    padding: 30px;
    border: 1px dashed var(--rk-base-border);
    display: flex;
    justify-content: center;
    align-items: center;
}

.rk-main-svg {
    width: 100%;
    max-width: 600px;
    height: auto;
}

/* Animacje SVG */
.svg-eps-block { transform-origin: 50% 80%; transition: transform 0.5s cubic-bezier(0.4, 0, 0.2, 1); fill: #cbd5e1; }
.state-amateur .svg-eps-block { transform: scaleY(0.6); fill: #fca5a5; }

.svg-pipe-flow { stroke-dasharray: 12; animation: pipeFlow 2s linear infinite; stroke: var(--rk-base-blue); transition: stroke 0.5s; }
.state-amateur .svg-pipe-flow { stroke: var(--rk-amateur-red); animation: pipeFlow 6s linear infinite; } /* Wolniejszy przepływ */

.svg-gauge-needle { transform-origin: 250px 50px; transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1); stroke: var(--rk-pro-green); }
.state-amateur .svg-gauge-needle { transform: rotate(135deg); stroke: var(--rk-amateur-red); }

.svg-wallet-money { transform-origin: center; transition: all 0.5s; opacity: 1; transform: translateY(0); }
.state-amateur .svg-wallet-money { opacity: 0; transform: translateY(20px); }

@keyframes pipeFlow { to { stroke-dashoffset: -24; } }

/* CTA */
.rk-dash-footer {
    padding: 35px 50px;
    background: #ffffff;
    text-align: center;
    border-top: 1px solid var(--rk-base-border);
}

.rk-btn-action {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 12px;
    background: var(--rk-base-darker);
    color: #ffffff;
    font-size: 16px;
    font-weight: 800;
    padding: 18px 36px;
    border-radius: 14px;
    text-decoration: none;
    box-shadow: 0 10px 20px -5px rgba(15, 23, 42, 0.3);
    transition: all 0.3s;
    border: 2px solid transparent;
}

.rk-btn-action:hover {
    background: var(--rk-base-blue);
    transform: translateY(-4px);
    box-shadow: 0 15px 25px -5px rgba(14, 165, 233, 0.4);
}

/* Responsywność */
@media (max-width: 768px) {
    .rk-dash-header, .rk-dash-interactive, .rk-dash-footer { padding: 30px 25px; }
    .rk-dash-header h2 { font-size: 24px; }
    .rk-metrics-grid { grid-template-columns: 1fr; gap: 15px; }
    .rk-switch-btn { font-size: 14px; padding: 12px 15px; }
    .rk-btn-action { width: 100%; }
}
</style>

<!-- ==========================================
     INVISIBLE DATA (JSON-LD)
=========================================== -->
<script type="application/ld+json">
[
  {
    "@context": "https://schema.org",
    "@type": "Article",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article",
    "mainEntityOfPage": {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
    },
    "headline": "Kompleksowy Kalkulator Ogrzewania Podłogowego – Podsumowanie",
    "description": "Precyzyjne wyliczenia termiczno-hydrauliczne instalacji płaszczyznowej (EPS 100, limit pętli 120 m, zład wodny) to gwarancja efektywności pomp ciepła i uniknięcia kosztownych awarii.",
    "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg",
    "author": {
      "@type": "Person",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/",
      "sameAs": [
        "https://www.facebook.com/robert.kucharski.budowa.bez.sciemy",
        "https://www.linkedin.com/in/robert-kucharski-38069b48/"
      ]
    },
    "publisher": {
      "@type": "Organization",
      "name": "Projekt-Ogrzewania.pl",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1.jpg"
      }
    },
    "datePublished": "2025-03-05",
    "dateModified": "2026-05-23"
  },
  {
    "@context": "https://schema.org",
    "@type": "Dataset",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#dataset",
    "name": "Wskaźniki Efektywności Termiczno-Hydraulicznej Ogrzewania Podłogowego",
    "description": "Zestawienie porównawcze weryfikujące wpływ kluczowych decyzji instalacyjnych (dobór styropianu, długość pętli, zład wodny) na efektywność systemu grzewczego.",
    "license": "https://projekt-ogrzewania.pl/",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    },
    "keywords": [
      "kompleksowy kalkulator ogrzewania podłogowego",
      "obliczenia termiczno-hydrauliczne",
      "styropian podłogowy eps 100",
      "długość pętli rur pert pex",
      "objętość zładu wodnego naczynie wzbiorcze"
    ],
    "measurementTechnique": "Analiza przepływów hydraulicznych i strat nośności izolacji w oparciu o wytyczne normy PN-EN 1264 oraz symulacje oporów liniowych.",
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        "Klasa styropianu: EPS 100 zapobiega pękaniu wylewek w porównaniu do EPS 70.",
        "Limit długości pętli: Maksymalnie 120 m dla rury 16x2 mm gwarantuje poprawne przepływy.",
        "Pojemność zładu: Determinuje dobór właściwego naczynia przeponowego i zabezpiecza przed skokami ciśnienia."
      ]
    }
  },
  {
    "@context": "https://schema.org",
    "@type": "WebApplication",
    "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webapp",
    "name": "Symulator Kalkulacji Ogrzewania Podłogowego",
    "description": "Interaktywny symulator decyzji instalacyjnych, pokazujący w czasie rzeczywistym parametry hydrauliczne i finansowe wynikające z poprawnego projektowania (OZC) w kontrze do montażu 'na oko'.",
    "applicationCategory": "EngineeringApplication",
    "operatingSystem": "All",
    "browserRequirements": "Requires JavaScript and HTML5",
    "creator": {
      "@type": "Person",
      "name": "Robert Kucharski"
    }
  }
]
</script>

<!-- ==========================================
     HTML KONTENERA
=========================================== -->
<div class="rk-summary-dashboard" id="rk-dash-app">
    
    <!-- Nagłówek -->
    <div class="rk-dash-header">
        <h2>Kompleksowy Kalkulator Ogrzewania Podłogowego – Podsumowanie</h2>
        <p class="rk-dash-lead">
            <strong>Kompleksowe obliczenia termiczno-hydrauliczne</strong> instalacji płaszczyznowej to fundament energooszczędnego i bezawaryjnego domu. Każda decyzja projektowa – od wyboru odpowiedniej klasy <a href="https://projekt-ogrzewania.pl/ile-styropianu-pod-ogrzewanie-podlogowe/">styropianu podłogowego (EPS 100)</a>, przez restrykcyjne trzymanie się limitu <a href="https://projekt-ogrzewania.pl/maksymalna-dlugosc-petli-ogrzewania-podlogowego/">120 m długości pętli rur</a> PERT/PEX, aż po precyzyjne wyliczenie objętości zładu wodnego pod kątem <a href="https://projekt-ogrzewania.pl/naczynie-wzbiorcze/">naczynia wzbiorczego</a> – rzutuje bezpośrednio na efektywność pracy nowoczesnych źródeł ciepła, zwłaszcza pomp ciepła. Samodzielne szacowanie parametrów na budowie to prosta droga do awarii.
        </p>
    </div>

    <!-- Panel Interaktywny -->
    <div class="rk-dash-interactive state-pro" id="rk-interactive-board">
        <h3>Symulacja Decyzji Instalacyjnych</h3>
        
        <!-- Przełącznik -->
        <div class="rk-toggle-container">
            <div class="rk-master-switch">
                <div class="rk-switch-glider"></div>
                <div class="rk-switch-btn active" data-mode="pro">Kalkulator i Projekt</div>
                <div class="rk-switch-btn" data-mode="amateur">Szacowanie &#8222;Na oko&#8221;</div>
            </div>
        </div>

        <!-- Kafelki Parametrów -->
        <div class="rk-metrics-grid">
            <div class="rk-metric-card">
                <div class="rk-metric-icon">
                    <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="var(--rk-base-darker)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line></svg>
                </div>
                <h4>Izolacja Podłoża</h4>
                <div class="rk-metric-val">
                    <span class="rk-val-pro">EPS 100/200<br>Brak osiadania wylewki</span>
                    <span class="rk-val-amateur">EPS 70 (Fasada)<br>Pękanie płytek i dylatacji</span>
                </div>
            </div>
            
            <div class="rk-metric-card">
                <div class="rk-metric-icon">
                    <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="var(--rk-base-darker)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 3a3 3 0 0 0-3 3v12a3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1-3-3V6a3 3 0 0 0-3-3"></path><path d="M15 3a3 3 0 0 1 3 3v12a3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0 3-3V6a3 3 0 0 1 3-3"></path></svg>
                </div>
                <h4>Długość Pętli</h4>
                <div class="rk-metric-val">
                    <span class="rk-val-pro">Max 120 m (Rura 16mm)<br>Niskie opory hydrauliczne</span>
                    <span class="rk-val-amateur">&gt; 150 m<br>Zblokowany przepływ (0 l/min)</span>
                </div>
            </div>

            <div class="rk-metric-card">
                <div class="rk-metric-icon">
                    <svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="var(--rk-base-darker)" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"></circle><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"></path><path d="M2 12h20"></path></svg>
                </div>
                <h4>Zład Wodny</h4>
                <div class="rk-metric-val">
                    <span class="rk-val-pro">Dokładnie obliczony<br>Stabilne ciśnienie układu</span>
                    <span class="rk-val-amateur">Zbyt małe naczynie<br>Wyrzuty wody z zaworu</span>
                </div>
            </div>
        </div>

        <!-- SVG Animowany Dashboard -->
        <div class="rk-svg-dashboard">
            <svg class="rk-main-svg" viewBox="0 0 400 120" xmlns="http://www.w3.org/2000/svg">
                <!-- Lewo: EPS Block -->
                <g transform="translate(30, 20)">
                    <rect x="0" y="40" width="60" height="40" rx="4" class="svg-eps-block"></rect>
                    <rect x="0" y="30" width="60" height="10" fill="#94a3b8"></rect>
                    <!-- Wektor strzałki -->
                    <path d="M30 10 L30 25 M25 20 L30 25 L35 20" stroke="#64748b" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"></path>
                </g>

                <!-- Środek: Przepływ Rur -->
                <g transform="translate(140, 20)">
                    <path d="M0 20 C 30 20, 30 60, 60 60 C 90 60, 90 20, 120 20" fill="none" stroke="#e2e8f0" stroke-width="12" stroke-linecap="round"></path>
                    <path d="M0 20 C 30 20, 30 60, 60 60 C 90 60, 90 20, 120 20" fill="none" stroke-width="6" stroke-linecap="round" class="svg-pipe-flow"></path>
                </g>

                <!-- Prawo: Zegar / Portfel -->
                <g transform="translate(300, 20)">
                    <!-- Zegar Ciśnienia/Opory -->
                    <path d="M0 60 A 40 40 0 0 1 80 60" fill="none" stroke="#e2e8f0" stroke-width="8"></path>
                    <path d="M60 60 A 40 40 0 0 0 80 60" fill="none" stroke="#ef4444" stroke-width="8"></path> <!-- Czerwone pole -->
                    <circle cx="40" cy="60" r="6" fill="#64748b"></circle>
                    <line x1="40" y1="60" x2="15" y2="35" stroke-width="4" stroke-linecap="round" class="svg-gauge-needle"></line>
                </g>
            </svg>
        </div>
    </div>

    <!-- Stopka CTA -->
    <div class="rk-dash-footer">
        <a href="https://projekt-ogrzewania.pl/blog/" class="rk-btn-action">
            Przeczytaj poradniki, które pomagają oszczędzać na ogrzewaniu.
            <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg>
        </a>
    </div>
</div>

<!-- ==========================================
     LOGIKA JS I ZABEZPIECZENIE (DOMAIN LOCK)
=========================================== -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    
    // 1. Zabezpieczenie Domenowe - DOMAIN LOCK
    const domain = window.location.hostname;
    const allowedDomains = ['projekt-ogrzewania.pl', 'www.projekt-ogrzewania.pl', 'localhost', '127.0.0.1', ''];
    
    if (!allowedDomains.includes(domain)) {
        const container = document.getElementById('rk-dash-app');
        if (container) {
            container.innerHTML = `
                <div style="padding: 45px; text-align: center; background: #0f172a; color: #f87171; border: 2px solid #ef4444; border-radius: 24px; font-family: sans-serif;">
                    <div style="font-size: 40px; margin-bottom: 20px;">🛑</div>
                    <div style="font-size: 20px; font-weight: 900; margin-bottom: 15px; text-transform: uppercase;">Naruszenie Praw Autorskich</div>
                    <div style="font-size: 15px; color: #cbd5e1; max-width: 550px; margin: 0 auto; line-height: 1.6;">
                        Interaktywny kalkulator i struktura danych JSON-LD są własnością serwisu Projekt-Ogrzewania.pl. Uruchamianie tego kodu na nieautoryzowanej domenie jest zabronione.
                    </div>
                </div>
            `;
            return;
        }
    }

    // 2. Logika Przełącznika (Toggle)
    const interactiveBoard = document.getElementById('rk-interactive-board');
    const switchBtns = document.querySelectorAll('.rk-switch-btn');

    switchBtns.forEach(btn => {
        btn.addEventListener('click', function() {
            // Zmiana przycisków
            switchBtns.forEach(b => b.classList.remove('active'));
            this.classList.add('active');

            // Pobranie trybu
            const mode = this.getAttribute('data-mode');

            // Aktualizacja klasy nadrzędnej (steruje całym CSS i animacjami SVG)
            if (mode === 'amateur') {
                interactiveBoard.classList.remove('state-pro');
                interactiveBoard.classList.add('state-amateur');
            } else {
                interactiveBoard.classList.remove('state-amateur');
                interactiveBoard.classList.add('state-pro');
            }
        });
    });
});
</script>
<p>Artykuł <a href="https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/">Kompleksowy kalkulator ogrzewania podłogowego.</a> pochodzi z serwisu <a href="https://projekt-ogrzewania.pl">Projekt Ogrzewania</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
