<?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 przepływy w pętlach - Projekt Ogrzewania</title>
	<atom:link href="https://projekt-ogrzewania.pl/tag/przeplywy-w-petlach/feed/" rel="self" type="application/rss+xml" />
	<link>https://projekt-ogrzewania.pl/tag/przeplywy-w-petlach/</link>
	<description>Twój partner w projektowaniu komfortu – profesjonalne ogrzewanie podłogowe dla Twojego domu.</description>
	<lastBuildDate>Wed, 26 Aug 2026 12:02:50 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.1</generator>

<image>
	<url>https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1-32x32.jpg</url>
	<title>Archiwa przepływy w pętlach - Projekt Ogrzewania</title>
	<link>https://projekt-ogrzewania.pl/tag/przeplywy-w-petlach/</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>
  #rk-floor-calc-guide {
    --rk-dark: #102536;
    --rk-navy: #14384d;
    --rk-blue: #078fbe;
    --rk-cyan: #28c9da;
    --rk-cyan-soft: #e9fbff;
    --rk-orange: #ff7438;
    --rk-red: #e34837;
    --rk-yellow: #f3bd3f;
    --rk-yellow-soft: #fff8df;
    --rk-green: #16876d;
    --rk-green-soft: #eaf8f3;
    --rk-ink: #1f2937;
    --rk-text: #475968;
    --rk-muted: #6b7d89;
    --rk-line: #d9e7ed;
    --rk-soft: #f4f9fb;
    --rk-warm: #fff3eb;
    --rk-white: #ffffff;
    width: 100%;
    max-width: 1180px;
    margin: 34px auto 72px;
    color: var(--rk-ink);
    font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
    font-size: 18px;
    line-height: 1.76;
  }

  #rk-floor-calc-guide,
  #rk-floor-calc-guide * {
    box-sizing: border-box;
  }

  #rk-floor-calc-guide img,
  #rk-floor-calc-guide svg {
    max-width: 100%;
  }

  #rk-floor-calc-guide button,
  #rk-floor-calc-guide input,
  #rk-floor-calc-guide select,
  #rk-floor-calc-guide label,
  #rk-floor-calc-guide summary,
  #rk-floor-calc-guide a {
    font: inherit;
    -webkit-tap-highlight-color: transparent;
  }

  #rk-floor-calc-guide button,
  #rk-floor-calc-guide select,
  #rk-floor-calc-guide input {
    max-width: 100%;
  }

  #rk-floor-calc-guide a {
    color: var(--rk-blue);
    font-weight: 780;
    text-decoration-thickness: 1px;
    text-underline-offset: 3px;
  }

  #rk-floor-calc-guide a:hover,
  #rk-floor-calc-guide a:focus-visible {
    color: var(--rk-red);
  }

  #rk-floor-calc-guide h2,
  #rk-floor-calc-guide h3,
  #rk-floor-calc-guide h4 {
    margin-top: 0;
    color: var(--rk-dark);
    font-weight: 920;
    letter-spacing: -0.035em;
    line-height: 1.16;
  }

  #rk-floor-calc-guide h2 {
    margin-bottom: 18px;
    font-size: clamp(1.65rem, 3.7vw, 2.62rem);
  }

  #rk-floor-calc-guide h3 {
    margin-bottom: 12px;
    font-size: clamp(1.12rem, 2.4vw, 1.48rem);
  }

  #rk-floor-calc-guide h4 {
    margin-bottom: 8px;
    font-size: 1.03rem;
    letter-spacing: -0.018em;
  }

  #rk-floor-calc-guide h2::before,
  #rk-floor-calc-guide h2::after,
  #rk-floor-calc-guide h3::before,
  #rk-floor-calc-guide h3::after,
  #rk-floor-calc-guide h4::before,
  #rk-floor-calc-guide h4::after {
    content: none !important;
    display: none !important;
  }

  #rk-floor-calc-guide p {
    margin: 0 0 1.18em;
    color: var(--rk-text);
  }

  #rk-floor-calc-guide strong {
    color: var(--rk-dark);
  }

  #rk-floor-calc-guide section[id] {
    scroll-margin-top: 28px;
  }

  #rk-floor-calc-guide .rk-calc-shell {
    overflow: hidden;
    border: 1px solid var(--rk-line);
    border-radius: 30px;
    background: var(--rk-white);
    box-shadow: 0 25px 70px rgba(16, 37, 54, 0.12);
  }

  #rk-floor-calc-guide .rk-calc-progress-track {
    position: sticky;
    z-index: 30;
    top: 0;
    width: 100%;
    height: 5px;
    overflow: hidden;
    background: rgba(255, 255, 255, 0.92);
  }

  #rk-floor-calc-guide .rk-calc-progress {
    width: 0;
    height: 100%;
    background: linear-gradient(90deg, var(--rk-cyan), var(--rk-blue), var(--rk-yellow), var(--rk-orange));
  }

  #rk-floor-calc-guide .rk-calc-hero {
    position: relative;
    isolation: isolate;
    overflow: hidden;
    padding: clamp(38px, 6.5vw, 78px);
    color: var(--rk-white);
    background:
      radial-gradient(circle at 88% 16%, rgba(40, 201, 218, 0.3), transparent 26%),
      radial-gradient(circle at 81% 86%, rgba(255, 116, 56, 0.25), transparent 29%),
      linear-gradient(135deg, #0d2230 0%, #143b50 58%, #09627b 100%);
  }

  #rk-floor-calc-guide .rk-calc-hero::before {
    content: "";
    position: absolute;
    z-index: -1;
    right: -145px;
    bottom: -195px;
    width: 520px;
    height: 520px;
    border: 70px solid rgba(255, 255, 255, 0.045);
    border-radius: 50%;
    box-shadow: 0 0 0 54px rgba(255, 255, 255, 0.025);
    pointer-events: none;
  }

  #rk-floor-calc-guide .rk-calc-hero-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.14fr) minmax(285px, 0.86fr);
    gap: clamp(28px, 5vw, 62px);
    align-items: center;
  }

  #rk-floor-calc-guide .rk-calc-eyebrow {
    display: inline-flex;
    align-items: center;
    gap: 10px;
    margin-bottom: 23px;
    padding: 8px 15px;
    border: 1px solid rgba(255, 255, 255, 0.25);
    border-radius: 999px;
    color: #a3f4ff;
    background: rgba(255, 255, 255, 0.06);
    font-size: 0.75rem;
    font-weight: 900;
    letter-spacing: 0.1em;
    line-height: 1.3;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-eyebrow b {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: var(--rk-orange);
    box-shadow: 0 0 0 7px rgba(255, 116, 56, 0.17);
  }

  #rk-floor-calc-guide .rk-calc-hero-title {
    max-width: 820px;
    margin: 0 0 24px;
    color: var(--rk-white);
    font-size: clamp(2.03rem, 5vw, 4rem);
    font-weight: 950;
    letter-spacing: -0.055em;
    line-height: 1.02;
  }

  #rk-floor-calc-guide .rk-calc-hero-lead {
    max-width: 810px;
    margin-bottom: 26px;
    color: #dcecf4;
    font-size: clamp(1.02rem, 2.1vw, 1.24rem);
    line-height: 1.62;
  }

  #rk-floor-calc-guide .rk-calc-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 11px 22px;
    color: #c9dce5;
    font-size: 0.81rem;
    font-weight: 780;
  }

  #rk-floor-calc-guide .rk-calc-meta span {
    display: inline-flex;
    align-items: center;
    gap: 8px;
  }

  #rk-floor-calc-guide .rk-calc-meta i {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: var(--rk-orange);
  }

  #rk-floor-calc-guide .rk-calc-hero-panel {
    padding: 25px;
    border: 1px solid rgba(255, 255, 255, 0.18);
    border-radius: 24px;
    background: rgba(255, 255, 255, 0.08);
    box-shadow: 0 18px 45px rgba(0, 0, 0, 0.12);
    backdrop-filter: blur(7px);
  }

  #rk-floor-calc-guide .rk-calc-hero-panel small {
    display: block;
    margin-bottom: 14px;
    color: #8df1fc;
    font-size: 0.7rem;
    font-weight: 900;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-hero-flow {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 9px;
  }

  #rk-floor-calc-guide .rk-calc-hero-stat {
    min-width: 0;
    padding: 16px 9px;
    border-radius: 16px;
    background: rgba(255, 255, 255, 0.09);
    text-align: center;
  }

  #rk-floor-calc-guide .rk-calc-hero-stat span {
    display: block;
    color: #c7dae4;
    font-size: 0.59rem;
    font-weight: 850;
    line-height: 1.35;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-hero-stat strong {
    display: block;
    margin-top: 5px;
    color: var(--rk-white);
    font-size: 1.22rem;
    font-weight: 950;
  }

  #rk-floor-calc-guide .rk-calc-hero-result {
    margin-top: 14px;
    padding: 14px;
    border-radius: 15px;
    color: var(--rk-white);
    background: rgba(40, 201, 218, 0.16);
    font-size: 0.79rem;
    font-weight: 850;
    text-align: center;
  }

  #rk-floor-calc-guide .rk-calc-nav {
    display: flex;
    gap: 9px;
    overflow-x: auto;
    padding: 15px clamp(20px, 5vw, 56px);
    border-bottom: 1px solid var(--rk-line);
    background: var(--rk-white);
    scrollbar-width: thin;
  }

  #rk-floor-calc-guide .rk-calc-nav a {
    flex: 0 0 auto;
    padding: 8px 13px;
    border: 1px solid var(--rk-line);
    border-radius: 999px;
    color: var(--rk-dark);
    background: var(--rk-soft);
    font-size: 0.73rem;
    font-weight: 880;
    text-decoration: none;
    white-space: nowrap;
  }

  #rk-floor-calc-guide .rk-calc-nav a:hover,
  #rk-floor-calc-guide .rk-calc-nav a:focus-visible {
    color: var(--rk-white);
    border-color: var(--rk-blue);
    background: var(--rk-blue);
  }

  #rk-floor-calc-guide .rk-calc-body {
    padding: clamp(28px, 6vw, 70px);
  }

  #rk-floor-calc-guide .rk-calc-section {
    margin-bottom: clamp(56px, 8vw, 94px);
  }

  #rk-floor-calc-guide .rk-calc-section:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-kicker {
    display: block;
    margin-bottom: 10px;
    color: var(--rk-blue);
    font-size: 0.72rem;
    font-weight: 950;
    letter-spacing: 0.11em;
    line-height: 1.4;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-lead {
    max-width: 960px;
    color: #34495a;
    font-size: clamp(1.02rem, 2vw, 1.2rem);
    line-height: 1.75;
  }

  #rk-floor-calc-guide .rk-calc-dropcap::first-letter {
    float: left;
    margin: 0.1em 0.12em 0 0;
    color: var(--rk-orange);
    font-size: 4.1rem;
    font-weight: 950;
    line-height: 0.78;
  }

  #rk-floor-calc-guide .rk-calc-answer {
    display: grid;
    grid-template-columns: minmax(0, 1.18fr) minmax(260px, 0.82fr);
    gap: 20px;
    margin-top: 28px;
  }

  #rk-floor-calc-guide .rk-calc-answer-main,
  #rk-floor-calc-guide .rk-calc-answer-side {
    padding: clamp(24px, 4vw, 38px);
    border: 1px solid var(--rk-line);
    border-radius: 22px;
  }

  #rk-floor-calc-guide .rk-calc-answer-main {
    background: linear-gradient(145deg, var(--rk-white), var(--rk-cyan-soft));
  }

  #rk-floor-calc-guide .rk-calc-answer-side {
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-dark), var(--rk-navy));
  }

  #rk-floor-calc-guide .rk-calc-answer-side h3,
  #rk-floor-calc-guide .rk-calc-answer-side p,
  #rk-floor-calc-guide .rk-calc-answer-side strong {
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-answer-side p:last-child,
  #rk-floor-calc-guide .rk-calc-answer-main p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-grid-2,
  #rk-floor-calc-guide .rk-calc-grid-3,
  #rk-floor-calc-guide .rk-calc-grid-4 {
    display: grid;
    gap: 18px;
  }

  #rk-floor-calc-guide .rk-calc-grid-2 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  #rk-floor-calc-guide .rk-calc-grid-3 {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }

  #rk-floor-calc-guide .rk-calc-grid-4 {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }

  #rk-floor-calc-guide .rk-calc-card {
    min-width: 0;
    padding: 23px;
    border: 1px solid var(--rk-line);
    border-radius: 20px;
    background: var(--rk-white);
    box-shadow: 0 10px 26px rgba(16, 37, 54, 0.05);
  }

  #rk-floor-calc-guide .rk-calc-card-number {
    display: inline-flex;
    min-width: 50px;
    min-height: 50px;
    align-items: center;
    justify-content: center;
    margin-bottom: 18px;
    padding: 8px;
    border-radius: 15px;
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-blue), var(--rk-cyan));
    font-size: 0.82rem;
    font-weight: 950;
    line-height: 1;
  }

  #rk-floor-calc-guide .rk-calc-card p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-scope {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
    margin-top: 26px;
  }

  #rk-floor-calc-guide .rk-calc-scope-panel {
    padding: clamp(24px, 4vw, 34px);
    border: 1px solid var(--rk-line);
    border-radius: 23px;
  }

  #rk-floor-calc-guide .rk-calc-scope-panel.is-does {
    background: var(--rk-green-soft);
  }

  #rk-floor-calc-guide .rk-calc-scope-panel.is-does-not {
    background: var(--rk-yellow-soft);
  }

  #rk-floor-calc-guide .rk-calc-checks {
    display: grid;
    gap: 12px;
    margin: 0;
    padding: 0;
    list-style: none;
  }

  #rk-floor-calc-guide .rk-calc-checks li {
    position: relative;
    padding-left: 32px;
    color: var(--rk-text);
  }

  #rk-floor-calc-guide .rk-calc-checks li::before {
    content: "✓";
    position: absolute;
    top: 0.03em;
    left: 0;
    display: inline-flex;
    width: 22px;
    height: 22px;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    color: var(--rk-white);
    background: var(--rk-green);
    font-size: 0.7rem;
    font-weight: 950;
  }

  #rk-floor-calc-guide .rk-calc-scope-panel.is-does-not .rk-calc-checks li::before {
    content: "!";
    background: var(--rk-orange);
  }

  #rk-floor-calc-guide .rk-calc-tool {
    overflow: hidden;
    border: 1px solid #b9dce7;
    border-radius: 28px;
    background: var(--rk-white);
    box-shadow: 0 24px 64px rgba(8, 92, 119, 0.13);
  }

  #rk-floor-calc-guide .rk-calc-tool-head {
    padding: clamp(30px, 5vw, 52px);
    color: var(--rk-white);
    background:
      radial-gradient(circle at 90% 16%, rgba(40, 201, 218, 0.28), transparent 25%),
      linear-gradient(125deg, var(--rk-dark), #164b63);
  }

  #rk-floor-calc-guide .rk-calc-tool-head h2,
  #rk-floor-calc-guide .rk-calc-tool-head p {
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-tool-head p {
    max-width: 900px;
    margin-bottom: 0;
    color: #d8e9f1;
  }

  #rk-floor-calc-guide .rk-calc-global {
    padding: clamp(24px, 4vw, 38px);
    border-bottom: 1px solid var(--rk-line);
    background: var(--rk-soft);
  }

  #rk-floor-calc-guide .rk-calc-global h3 {
    margin-bottom: 20px;
  }

  #rk-floor-calc-guide .rk-calc-fields {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 14px;
  }

  #rk-floor-calc-guide .rk-calc-field {
    min-width: 0;
  }

  #rk-floor-calc-guide .rk-calc-field label {
    display: block;
    margin-bottom: 7px;
    color: var(--rk-dark);
    font-size: 0.72rem;
    font-weight: 900;
    line-height: 1.35;
  }

  #rk-floor-calc-guide .rk-calc-field input,
  #rk-floor-calc-guide .rk-calc-field select {
    width: 100%;
    min-height: 48px;
    padding: 10px 12px;
    border: 1px solid #bdd4de;
    border-radius: 12px;
    color: var(--rk-dark);
    background: var(--rk-white);
    font-size: 0.84rem;
    font-weight: 750;
    outline: none;
  }

  #rk-floor-calc-guide .rk-calc-field input:focus,
  #rk-floor-calc-guide .rk-calc-field select:focus {
    border-color: var(--rk-blue);
    box-shadow: 0 0 0 4px rgba(7, 143, 190, 0.12);
  }

  #rk-floor-calc-guide .rk-calc-field small {
    display: block;
    margin-top: 5px;
    color: var(--rk-muted);
    font-size: 0.63rem;
    line-height: 1.45;
  }

  #rk-floor-calc-guide .rk-calc-rooms-wrap {
    padding: clamp(24px, 4vw, 38px);
  }

  #rk-floor-calc-guide .rk-calc-rooms-head {
    display: flex;
    gap: 16px;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 20px;
  }

  #rk-floor-calc-guide .rk-calc-rooms-head h3 {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-room-list {
    display: grid;
    gap: 16px;
  }

  #rk-floor-calc-guide .rk-calc-room {
    position: relative;
    display: grid;
    grid-template-columns: 1.25fr repeat(7, minmax(108px, 1fr)) auto;
    gap: 12px;
    align-items: end;
    padding: 19px;
    border: 1px solid var(--rk-line);
    border-radius: 18px;
    background: var(--rk-white);
    box-shadow: 0 8px 24px rgba(16, 37, 54, 0.045);
  }

  #rk-floor-calc-guide .rk-calc-room-index {
    position: absolute;
    top: -10px;
    left: 18px;
    display: inline-flex;
    min-width: 32px;
    height: 24px;
    align-items: center;
    justify-content: center;
    padding: 0 8px;
    border-radius: 999px;
    color: var(--rk-white);
    background: var(--rk-blue);
    font-size: 0.64rem;
    font-weight: 950;
  }

  #rk-floor-calc-guide .rk-calc-room-remove,
  #rk-floor-calc-guide .rk-calc-add-room,
  #rk-floor-calc-guide .rk-calc-recalculate,
  #rk-floor-calc-guide .rk-calc-reset {
    min-height: 48px;
    border: 0;
    border-radius: 12px;
    cursor: pointer;
    font-weight: 900;
    line-height: 1.25;
  }

  #rk-floor-calc-guide .rk-calc-room-remove {
    width: 48px;
    padding: 0;
    color: var(--rk-red);
    border: 1px solid #f2c7c1;
    background: #fff7f6;
    font-size: 1.2rem;
  }

  #rk-floor-calc-guide .rk-calc-room-remove:hover,
  #rk-floor-calc-guide .rk-calc-room-remove:focus-visible {
    color: var(--rk-white);
    background: var(--rk-red);
  }

  #rk-floor-calc-guide .rk-calc-tool-actions {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
    margin-top: 20px;
  }

  #rk-floor-calc-guide .rk-calc-add-room,
  #rk-floor-calc-guide .rk-calc-reset {
    padding: 12px 18px;
    color: var(--rk-dark);
    border: 1px solid #bcd5df;
    background: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-recalculate {
    padding: 12px 22px;
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-orange), var(--rk-red));
    box-shadow: 0 10px 24px rgba(227, 72, 55, 0.2);
  }

  #rk-floor-calc-guide .rk-calc-add-room:hover,
  #rk-floor-calc-guide .rk-calc-add-room:focus-visible,
  #rk-floor-calc-guide .rk-calc-reset:hover,
  #rk-floor-calc-guide .rk-calc-reset:focus-visible {
    color: var(--rk-white);
    border-color: var(--rk-blue);
    background: var(--rk-blue);
  }

  #rk-floor-calc-guide .rk-calc-recalculate:hover,
  #rk-floor-calc-guide .rk-calc-recalculate:focus-visible {
    filter: brightness(1.06);
    transform: translateY(-1px);
  }

  #rk-floor-calc-guide .rk-calc-results {
    padding: clamp(24px, 4vw, 38px);
    border-top: 1px solid var(--rk-line);
    background: #fbfdfe;
  }

  #rk-floor-calc-guide .rk-calc-result-summary {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 14px;
    margin-bottom: 22px;
  }

  #rk-floor-calc-guide .rk-calc-result-card {
    min-width: 0;
    padding: 19px;
    border: 1px solid var(--rk-line);
    border-radius: 17px;
    background: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-result-card.is-main {
    color: var(--rk-white);
    border-color: var(--rk-blue);
    background: linear-gradient(135deg, var(--rk-blue), #0ca8c6);
  }

  #rk-floor-calc-guide .rk-calc-result-card small {
    display: block;
    margin-bottom: 8px;
    color: var(--rk-muted);
    font-size: 0.67rem;
    font-weight: 850;
    line-height: 1.4;
  }

  #rk-floor-calc-guide .rk-calc-result-card.is-main small {
    color: #d9f9ff;
  }

  #rk-floor-calc-guide .rk-calc-result-number {
    color: var(--rk-dark);
    font-size: clamp(1.22rem, 2.5vw, 1.76rem);
    font-weight: 950;
    letter-spacing: -0.04em;
    line-height: 1.05;
    overflow-wrap: anywhere;
  }

  #rk-floor-calc-guide .rk-calc-result-card.is-main .rk-calc-result-number {
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-status {
    display: grid;
    gap: 5px;
    margin-bottom: 22px;
    padding: 17px 19px;
    border: 1px solid #b8ddcf;
    border-radius: 16px;
    color: var(--rk-green);
    background: var(--rk-green-soft);
  }

  #rk-floor-calc-guide .rk-calc-status.is-warning {
    color: #8a5d00;
    border-color: #ead18b;
    background: var(--rk-yellow-soft);
  }

  #rk-floor-calc-guide .rk-calc-status.is-danger {
    color: #a43c30;
    border-color: #efc2bc;
    background: #fff2f0;
  }

  #rk-floor-calc-guide .rk-calc-status strong {
    color: currentColor;
    font-size: 0.9rem;
  }

  #rk-floor-calc-guide .rk-calc-status span {
    color: currentColor;
    font-size: 0.75rem;
    line-height: 1.55;
  }

  #rk-floor-calc-guide .rk-calc-tabs {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    overflow: hidden;
    margin-bottom: 0;
    border: 1px solid var(--rk-line);
    border-radius: 15px 15px 0 0;
  }

  #rk-floor-calc-guide .rk-calc-tab {
    min-height: 52px;
    padding: 12px 8px;
    border: 0;
    color: var(--rk-muted);
    background: var(--rk-soft);
    font-size: 0.7rem;
    font-weight: 900;
    text-align: center;
    text-transform: uppercase;
    cursor: pointer;
  }

  #rk-floor-calc-guide .rk-calc-tab + .rk-calc-tab {
    border-left: 1px solid var(--rk-line);
  }

  #rk-floor-calc-guide .rk-calc-tab.is-active {
    color: var(--rk-blue);
    background: var(--rk-white);
    box-shadow: inset 0 -5px 0 var(--rk-blue);
  }

  #rk-floor-calc-guide .rk-calc-tab-panel {
    display: none;
    padding: 22px;
    border: 1px solid var(--rk-line);
    border-top: 0;
    border-radius: 0 0 15px 15px;
    background: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-tab-panel.is-active {
    display: block;
  }

  #rk-floor-calc-guide .rk-calc-table-wrap {
    width: 100%;
  }

  #rk-floor-calc-guide table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
    overflow: hidden;
    border: 1px solid var(--rk-line);
    border-radius: 15px;
    font-size: 0.74rem;
  }

  #rk-floor-calc-guide th,
  #rk-floor-calc-guide td {
    padding: 12px 11px;
    border-bottom: 1px solid var(--rk-line);
    text-align: left;
    vertical-align: top;
  }

  #rk-floor-calc-guide th {
    color: var(--rk-white);
    background: var(--rk-navy);
    font-size: 0.67rem;
    font-weight: 900;
    line-height: 1.35;
  }

  #rk-floor-calc-guide td {
    color: var(--rk-text);
    background: var(--rk-white);
  }

  #rk-floor-calc-guide tbody tr:nth-child(even) td {
    background: var(--rk-soft);
  }

  #rk-floor-calc-guide tr:last-child td {
    border-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-result-note {
    margin: 0;
    padding: 15px 17px;
    border-left: 5px solid var(--rk-blue);
    border-radius: 0 12px 12px 0;
    color: var(--rk-text);
    background: var(--rk-cyan-soft);
    font-size: 0.76rem;
  }

  #rk-floor-calc-guide .rk-calc-bars {
    display: grid;
    gap: 14px;
  }

  #rk-floor-calc-guide .rk-calc-bar-row {
    display: grid;
    grid-template-columns: minmax(100px, 0.72fr) minmax(160px, 2fr) minmax(76px, auto);
    gap: 12px;
    align-items: center;
  }

  #rk-floor-calc-guide .rk-calc-bar-name {
    color: var(--rk-dark);
    font-size: 0.72rem;
    font-weight: 900;
    line-height: 1.35;
  }

  #rk-floor-calc-guide .rk-calc-bar-track {
    height: 14px;
    overflow: hidden;
    border-radius: 999px;
    background: #e5eef2;
  }

  #rk-floor-calc-guide .rk-calc-bar-fill {
    width: 0;
    height: 100%;
    border-radius: inherit;
    background: linear-gradient(90deg, var(--rk-blue), var(--rk-cyan));
    transition: width 0.25s ease;
  }

  #rk-floor-calc-guide .rk-calc-bar-value {
    color: var(--rk-dark);
    font-size: 0.7rem;
    font-weight: 900;
    text-align: right;
  }

  #rk-floor-calc-guide .rk-calc-inline-cta {
    margin: 24px;
    padding: clamp(25px, 4vw, 38px);
    border: 1px solid rgba(255, 116, 56, 0.35);
    border-radius: 22px;
    background:
      radial-gradient(circle at 90% 10%, rgba(255, 116, 56, 0.13), transparent 26%),
      linear-gradient(145deg, #fffaf6, var(--rk-white));
  }

  #rk-floor-calc-guide .rk-calc-inline-cta h3 {
    max-width: 860px;
  }

  #rk-floor-calc-guide .rk-calc-cta-button {
    display: inline-flex;
    min-height: 54px;
    align-items: center;
    justify-content: center;
    padding: 13px 24px;
    border-radius: 14px;
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-orange), var(--rk-red));
    box-shadow: 0 12px 28px rgba(227, 72, 55, 0.22);
    font-size: 0.83rem;
    font-weight: 950;
    line-height: 1.35;
    text-align: center;
    text-decoration: none;
  }

  #rk-floor-calc-guide .rk-calc-cta-button:hover,
  #rk-floor-calc-guide .rk-calc-cta-button:focus-visible {
    color: var(--rk-white);
    filter: brightness(1.06);
    transform: translateY(-1px);
  }

  #rk-floor-calc-guide .rk-calc-disclosure {
    display: block;
    margin-top: 11px;
    color: var(--rk-muted);
    font-size: 0.64rem;
    line-height: 1.5;
  }

  #rk-floor-calc-guide .rk-calc-formulas {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 17px;
    margin-top: 25px;
  }

  #rk-floor-calc-guide .rk-calc-formula {
    padding: 22px;
    border: 1px solid var(--rk-line);
    border-radius: 18px;
    background: var(--rk-soft);
  }

  #rk-floor-calc-guide .rk-calc-formula > span {
    display: block;
    margin-bottom: 8px;
    color: var(--rk-blue);
    font-size: 0.67rem;
    font-weight: 950;
    letter-spacing: 0.08em;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-equation {
    display: block;
    margin: 9px 0 12px;
    padding: 14px;
    overflow-wrap: anywhere;
    border-radius: 12px;
    color: var(--rk-dark);
    background: var(--rk-white);
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.88rem;
    font-weight: 850;
    line-height: 1.5;
  }

  #rk-floor-calc-guide .rk-calc-formula p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-diagram {
    margin-top: 26px;
    padding: clamp(20px, 4vw, 32px);
    border: 1px solid var(--rk-line);
    border-radius: 22px;
    background: linear-gradient(145deg, var(--rk-white), var(--rk-soft));
  }

  #rk-floor-calc-guide .rk-calc-diagram svg {
    display: block;
    width: 100%;
    height: auto;
  }

  #rk-floor-calc-guide .rk-calc-callout {
    margin-top: 24px;
    padding: 22px 24px;
    border-left: 6px solid var(--rk-orange);
    border-radius: 0 18px 18px 0;
    background: var(--rk-warm);
  }

  #rk-floor-calc-guide .rk-calc-callout p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-steps {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 17px;
    counter-reset: rk-calc-step;
    margin-top: 25px;
  }

  #rk-floor-calc-guide .rk-calc-step {
    position: relative;
    min-width: 0;
    padding: 25px;
    border: 1px solid var(--rk-line);
    border-radius: 20px;
    background: var(--rk-white);
    counter-increment: rk-calc-step;
  }

  #rk-floor-calc-guide .rk-calc-step::before {
    content: counter(rk-calc-step, decimal-leading-zero);
    display: inline-flex;
    width: 48px;
    height: 48px;
    align-items: center;
    justify-content: center;
    margin-bottom: 17px;
    border-radius: 14px;
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-blue), var(--rk-cyan));
    font-size: 0.75rem;
    font-weight: 950;
  }

  #rk-floor-calc-guide .rk-calc-step p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-warning-grid {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 17px;
    margin-top: 25px;
  }

  #rk-floor-calc-guide .rk-calc-warning {
    padding: 23px;
    border: 1px solid #f0c9c4;
    border-radius: 19px;
    background: #fff7f6;
  }

  #rk-floor-calc-guide .rk-calc-warning b {
    display: inline-flex;
    min-width: 46px;
    height: 32px;
    align-items: center;
    justify-content: center;
    margin-bottom: 14px;
    padding: 0 10px;
    border-radius: 999px;
    color: var(--rk-white);
    background: var(--rk-red);
    font-size: 0.65rem;
    font-weight: 950;
  }

  #rk-floor-calc-guide .rk-calc-warning p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-case {
    overflow: hidden;
    margin-top: 26px;
    border: 1px solid var(--rk-line);
    border-radius: 24px;
    background: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-case-head {
    padding: 26px;
    color: var(--rk-white);
    background: linear-gradient(125deg, var(--rk-dark), var(--rk-navy));
  }

  #rk-floor-calc-guide .rk-calc-case-head h3,
  #rk-floor-calc-guide .rk-calc-case-head p {
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-case-head p:last-child {
    margin-bottom: 0;
    color: #d6e7ef;
  }

  #rk-floor-calc-guide .rk-calc-case-body {
    padding: clamp(24px, 4vw, 38px);
  }

  #rk-floor-calc-guide .rk-calc-case-compare {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
  }

  #rk-floor-calc-guide .rk-calc-case-side {
    padding: 22px;
    border-radius: 18px;
  }

  #rk-floor-calc-guide .rk-calc-case-side.is-wrong {
    border: 1px solid #efc3bd;
    background: #fff3f1;
  }

  #rk-floor-calc-guide .rk-calc-case-side.is-right {
    border: 1px solid #b8ddcf;
    background: var(--rk-green-soft);
  }

  #rk-floor-calc-guide .rk-calc-case-side p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-faq {
    display: grid;
    gap: 12px;
    margin-top: 24px;
  }

  #rk-floor-calc-guide .rk-calc-faq details {
    overflow: hidden;
    border: 1px solid var(--rk-line);
    border-radius: 16px;
    background: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-faq summary {
    position: relative;
    padding: 18px 56px 18px 20px;
    color: var(--rk-dark);
    font-weight: 900;
    line-height: 1.45;
    cursor: pointer;
    list-style: none;
  }

  #rk-floor-calc-guide .rk-calc-faq summary::-webkit-details-marker {
    display: none;
  }

  #rk-floor-calc-guide .rk-calc-faq summary::after {
    content: "+";
    position: absolute;
    top: 50%;
    right: 18px;
    display: inline-flex;
    width: 28px;
    height: 28px;
    align-items: center;
    justify-content: center;
    border-radius: 50%;
    color: var(--rk-white);
    background: var(--rk-blue);
    font-size: 1rem;
    font-weight: 900;
    transform: translateY(-50%);
  }

  #rk-floor-calc-guide .rk-calc-faq details[open] summary::after {
    content: "−";
  }

  #rk-floor-calc-guide .rk-calc-faq-answer {
    padding: 0 20px 18px;
  }

  #rk-floor-calc-guide .rk-calc-faq-answer p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-sources {
    padding: 24px;
    border: 1px solid var(--rk-line);
    border-radius: 19px;
    background: var(--rk-soft);
    font-size: 0.72rem;
    line-height: 1.7;
  }

  #rk-floor-calc-guide .rk-calc-sources strong {
    display: block;
    margin-bottom: 8px;
    font-size: 0.78rem;
  }

  #rk-floor-calc-guide .rk-calc-sources p:last-child {
    margin-bottom: 0;
  }

  #rk-floor-calc-guide .rk-calc-author {
    position: relative;
    overflow: hidden;
    margin-bottom: clamp(56px, 8vw, 94px);
    border: 1px solid var(--rk-line);
    border-radius: 27px;
    background: var(--rk-white);
    box-shadow: 0 20px 50px rgba(16, 37, 54, 0.09);
  }

  #rk-floor-calc-guide .rk-calc-author > input {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
  }

  #rk-floor-calc-guide .rk-calc-author-head {
    display: flex;
    gap: 20px;
    align-items: center;
    justify-content: space-between;
    padding: clamp(27px, 5vw, 45px);
    border-bottom: 5px solid var(--rk-cyan);
    color: var(--rk-white);
    background: var(--rk-dark);
  }

  #rk-floor-calc-guide .rk-calc-author-head h2,
  #rk-floor-calc-guide .rk-calc-author-head p {
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-author-head h2 {
    margin-bottom: 8px;
  }

  #rk-floor-calc-guide .rk-calc-author-head p {
    margin-bottom: 0;
    color: #d7e8f0;
  }

  #rk-floor-calc-guide .rk-calc-author-mark {
    flex: 0 0 auto;
    padding: 11px 17px;
    border: 1px solid rgba(40, 201, 218, 0.42);
    border-radius: 14px;
    color: #75effc;
    font-size: 0.72rem;
    font-weight: 950;
    letter-spacing: 0.09em;
  }

  #rk-floor-calc-guide .rk-calc-author-layout {
    display: grid;
    grid-template-columns: minmax(270px, 0.64fr) minmax(0, 1.36fr);
  }

  #rk-floor-calc-guide .rk-calc-author-side {
    padding: clamp(30px, 5vw, 50px);
    border-right: 1px solid var(--rk-line);
    background: var(--rk-soft);
    text-align: center;
  }

  #rk-floor-calc-guide .rk-calc-author-photo {
    width: min(205px, 74%);
    margin: 0 auto 22px;
    overflow: hidden;
    border: 8px solid var(--rk-white);
    border-radius: 50%;
    box-shadow: 0 16px 36px rgba(16, 37, 54, 0.14);
    aspect-ratio: 1;
  }

  #rk-floor-calc-guide .rk-calc-author-photo img {
    display: block;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

  #rk-floor-calc-guide .rk-calc-author-name {
    margin-bottom: 7px;
    color: var(--rk-dark);
    font-size: 1.5rem;
    font-weight: 950;
    letter-spacing: -0.04em;
    line-height: 1.1;
  }

  #rk-floor-calc-guide .rk-calc-author-role {
    color: var(--rk-blue);
    font-size: 0.7rem;
    font-weight: 950;
    letter-spacing: 0.07em;
    line-height: 1.55;
    text-transform: uppercase;
  }

  #rk-floor-calc-guide .rk-calc-author-main {
    padding: clamp(30px, 5vw, 50px);
  }

  #rk-floor-calc-guide .rk-calc-author-quote {
    position: relative;
    margin: 0 0 24px;
    padding: 24px 24px 24px 68px;
    border: 0;
    border-radius: 18px;
    background: var(--rk-cyan-soft);
  }

  #rk-floor-calc-guide .rk-calc-author-quote::before {
    content: "“";
    position: absolute;
    top: 3px;
    left: 20px;
    color: var(--rk-cyan);
    font-size: 4rem;
    font-weight: 950;
    line-height: 1;
  }

  #rk-floor-calc-guide .rk-calc-author-quote p {
    margin-bottom: 0;
    color: var(--rk-dark);
    font-size: 1.02rem;
    font-style: italic;
    font-weight: 800;
    line-height: 1.75;
  }

  #rk-floor-calc-guide .rk-calc-author-tabs {
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    overflow: hidden;
    border: 1px solid var(--rk-line);
    border-radius: 15px 15px 0 0;
  }

  #rk-floor-calc-guide .rk-calc-author-tab {
    padding: 14px 10px;
    color: var(--rk-muted);
    background: var(--rk-soft);
    font-size: 0.72rem;
    font-weight: 900;
    line-height: 1.35;
    text-align: center;
    text-transform: uppercase;
    cursor: pointer;
  }

  #rk-floor-calc-guide .rk-calc-author-tab + .rk-calc-author-tab {
    border-left: 1px solid var(--rk-line);
  }

  #rk-floor-calc-guide .rk-calc-author-panel {
    display: none;
    min-height: 176px;
    padding: 25px;
    border: 1px solid var(--rk-line);
    border-top: 0;
    border-radius: 0 0 15px 15px;
  }

  #rk-floor-calc-guide .rk-calc-author-panel p:last-child {
    margin-bottom: 0;
  }

  #rk-calc-author-about:checked ~ .rk-calc-author-layout .rk-calc-author-panel-about,
  #rk-calc-author-exp:checked ~ .rk-calc-author-layout .rk-calc-author-panel-exp,
  #rk-calc-author-sites:checked ~ .rk-calc-author-layout .rk-calc-author-panel-sites {
    display: block;
  }

  #rk-calc-author-about:checked ~ .rk-calc-author-layout label[for="rk-calc-author-about"],
  #rk-calc-author-exp:checked ~ .rk-calc-author-layout label[for="rk-calc-author-exp"],
  #rk-calc-author-sites:checked ~ .rk-calc-author-layout label[for="rk-calc-author-sites"] {
    color: var(--rk-blue);
    background: var(--rk-white);
    box-shadow: inset 0 -5px 0 var(--rk-blue);
  }

  #rk-floor-calc-guide .rk-calc-site-links {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    margin-top: 14px;
  }

  #rk-floor-calc-guide .rk-calc-site-links a {
    padding: 8px 13px;
    border: 1px solid #c6dbe4;
    border-radius: 999px;
    color: var(--rk-dark);
    background: var(--rk-white);
    font-size: 0.74rem;
    font-weight: 900;
    text-decoration: none;
  }

  #rk-floor-calc-guide .rk-calc-site-links a:hover,
  #rk-floor-calc-guide .rk-calc-site-links a:focus-visible {
    color: var(--rk-white);
    border-color: var(--rk-blue);
    background: var(--rk-blue);
  }

  #rk-floor-calc-guide .rk-calc-final-cta {
    overflow: hidden;
    border-radius: 27px;
    color: var(--rk-white);
    background:
      radial-gradient(circle at 91% 16%, rgba(243, 189, 63, 0.38), transparent 27%),
      linear-gradient(125deg, var(--rk-dark), #15465e);
  }

  #rk-floor-calc-guide .rk-calc-final-cta-content {
    padding: clamp(30px, 5vw, 53px);
  }

  #rk-floor-calc-guide .rk-calc-final-cta h2 {
    max-width: 920px;
    margin-bottom: 13px;
    color: var(--rk-white);
  }

  #rk-floor-calc-guide .rk-calc-final-cta p {
    max-width: 940px;
    color: #d8e9f1;
  }

  @media (max-width: 1080px) {
    #rk-floor-calc-guide .rk-calc-fields {
      grid-template-columns: repeat(3, minmax(0, 1fr));
    }

    #rk-floor-calc-guide .rk-calc-room {
      grid-template-columns: repeat(4, minmax(0, 1fr));
      padding-top: 28px;
    }

    #rk-floor-calc-guide .rk-calc-room .rk-calc-field:first-of-type {
      grid-column: span 2;
    }
  }

  @media (min-width: 721px) {
    #rk-floor-calc-guide .rk-calc-room {
      grid-template-columns: repeat(4, minmax(0, 1fr));
      align-items: start;
      padding: 28px 86px 22px 22px;
    }

    #rk-floor-calc-guide .rk-calc-room .rk-calc-field:first-of-type {
      grid-column: auto;
    }

    #rk-floor-calc-guide .rk-calc-room .rk-calc-field label {
      display: flex;
      min-height: 2.7em;
      align-items: flex-end;
      overflow-wrap: normal;
      word-break: normal;
    }

    #rk-floor-calc-guide .rk-calc-room-remove {
      position: absolute;
      top: 28px;
      right: 20px;
    }
  }

  @media (max-width: 980px) {
    #rk-floor-calc-guide .rk-calc-hero-grid,
    #rk-floor-calc-guide .rk-calc-answer,
    #rk-floor-calc-guide .rk-calc-author-layout {
      grid-template-columns: 1fr;
    }

    #rk-floor-calc-guide .rk-calc-author-side {
      border-right: 0;
      border-bottom: 1px solid var(--rk-line);
    }

    #rk-floor-calc-guide .rk-calc-grid-4,
    #rk-floor-calc-guide .rk-calc-grid-3,
    #rk-floor-calc-guide .rk-calc-warning-grid,
    #rk-floor-calc-guide .rk-calc-steps {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    #rk-floor-calc-guide .rk-calc-result-summary {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }
  }

  @media (max-width: 720px) {
    #rk-floor-calc-guide {
      margin-top: 20px;
      font-size: 16px;
    }

    #rk-floor-calc-guide .rk-calc-shell {
      border-radius: 20px;
    }

    #rk-floor-calc-guide .rk-calc-hero,
    #rk-floor-calc-guide .rk-calc-body {
      padding-right: 21px;
      padding-left: 21px;
    }

    #rk-floor-calc-guide .rk-calc-nav {
      display: flex;
      width: auto;
      margin: 18px 20px 0;
      padding: 20px;
      flex-wrap: wrap;
      gap: 10px;
      overflow: visible;
      border: 1px solid var(--rk-line);
      border-radius: 20px;
      background: var(--rk-soft);
      scrollbar-width: auto;
    }

    #rk-floor-calc-guide .rk-calc-nav::before {
      content: "NA SKRÓTY";
      flex: 0 0 100%;
      margin-bottom: 4px;
      color: var(--rk-dark);
      font-size: 0.75rem;
      font-weight: 900;
      letter-spacing: 0.08em;
      line-height: 1.3;
    }

    #rk-floor-calc-guide .rk-calc-nav a {
      flex: 0 1 auto;
      white-space: normal;
    }

    #rk-floor-calc-guide .rk-calc-grid-2,
    #rk-floor-calc-guide .rk-calc-grid-3,
    #rk-floor-calc-guide .rk-calc-grid-4,
    #rk-floor-calc-guide .rk-calc-scope,
    #rk-floor-calc-guide .rk-calc-formulas,
    #rk-floor-calc-guide .rk-calc-warning-grid,
    #rk-floor-calc-guide .rk-calc-steps,
    #rk-floor-calc-guide .rk-calc-case-compare,
    #rk-floor-calc-guide .rk-calc-fields,
    #rk-floor-calc-guide .rk-calc-result-summary {
      grid-template-columns: 1fr;
    }

    #rk-floor-calc-guide .rk-calc-room {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    #rk-floor-calc-guide .rk-calc-room .rk-calc-field:first-of-type {
      grid-column: 1 / -1;
    }

    #rk-floor-calc-guide .rk-calc-room-remove {
      width: 100%;
    }

    #rk-floor-calc-guide .rk-calc-rooms-head {
      align-items: flex-start;
      flex-direction: column;
    }

    #rk-floor-calc-guide .rk-calc-tabs {
      grid-template-columns: repeat(2, minmax(0, 1fr));
    }

    #rk-floor-calc-guide .rk-calc-tab + .rk-calc-tab {
      border-left: 0;
    }

    #rk-floor-calc-guide .rk-calc-tab:nth-child(even) {
      border-left: 1px solid var(--rk-line);
    }

    #rk-floor-calc-guide .rk-calc-tab:nth-child(n+3) {
      border-top: 1px solid var(--rk-line);
    }

    #rk-floor-calc-guide .rk-calc-author-head {
      align-items: flex-start;
      flex-direction: column;
    }

    #rk-floor-calc-guide .rk-calc-author-main {
      padding: 25px 18px 28px;
    }

    #rk-floor-calc-guide .rk-calc-author-quote {
      padding: 22px 20px 22px 57px;
    }

    #rk-floor-calc-guide .rk-calc-author-tabs {
      grid-template-columns: 1fr;
    }

    #rk-floor-calc-guide .rk-calc-author-tab + .rk-calc-author-tab {
      border-top: 1px solid var(--rk-line);
      border-left: 0;
    }

    #rk-floor-calc-guide .rk-calc-cta-button {
      display: flex;
      width: 100%;
    }

    #rk-floor-calc-guide .rk-calc-inline-cta {
      margin: 18px;
    }

    #rk-floor-calc-guide .rk-calc-bar-row {
      grid-template-columns: 1fr;
      gap: 6px;
    }

    #rk-floor-calc-guide .rk-calc-bar-value {
      text-align: left;
    }

    #rk-floor-calc-guide table,
    #rk-floor-calc-guide tbody,
    #rk-floor-calc-guide tr,
    #rk-floor-calc-guide th,
    #rk-floor-calc-guide td {
      display: block;
      width: 100%;
    }

    #rk-floor-calc-guide thead {
      position: absolute;
      width: 1px;
      height: 1px;
      overflow: hidden;
      clip: rect(0 0 0 0);
      white-space: nowrap;
    }

    #rk-floor-calc-guide tbody tr {
      margin-bottom: 14px;
      overflow: hidden;
      border: 1px solid var(--rk-line);
      border-radius: 15px;
      background: var(--rk-white);
    }

    #rk-floor-calc-guide td,
    #rk-floor-calc-guide tbody tr:nth-child(even) td {
      display: grid;
      grid-template-columns: minmax(118px, 0.78fr) minmax(0, 1.22fr);
      gap: 12px;
      padding: 12px 14px;
      background: var(--rk-white);
    }

    #rk-floor-calc-guide td::before {
      content: attr(data-label);
      color: var(--rk-dark);
      font-size: 0.71rem;
      font-weight: 900;
      line-height: 1.45;
    }
  }

  @media (max-width: 470px) {
    #rk-floor-calc-guide .rk-calc-hero-flow,
    #rk-floor-calc-guide .rk-calc-room {
      grid-template-columns: 1fr;
    }

    #rk-floor-calc-guide .rk-calc-room .rk-calc-field:first-of-type {
      grid-column: auto;
    }

    #rk-floor-calc-guide td,
    #rk-floor-calc-guide tbody tr:nth-child(even) td {
      grid-template-columns: 1fr;
      gap: 4px;
    }
  }

  @media (prefers-reduced-motion: reduce) {
    #rk-floor-calc-guide *,
    #rk-floor-calc-guide *::before,
    #rk-floor-calc-guide *::after {
      scroll-behavior: auto !important;
      transition-duration: 0.01ms !important;
    }
  }
</style>

<article id="rk-floor-calc-guide" data-rk-calc-version="2026-08-26" aria-label="Kompleksowy kalkulator ogrzewania podłogowego">
  <div class="rk-calc-shell">
    <div class="rk-calc-progress-track" aria-hidden="true"><div class="rk-calc-progress"></div></div>

    <header class="rk-calc-hero">
      <div class="rk-calc-hero-grid">
        <div>
          <span class="rk-calc-eyebrow"><b aria-hidden="true"></b> Autorskie narzędzie • hydraulika i termika</span>
          <div class="rk-calc-hero-title" role="heading" aria-level="2">Kompleksowy kalkulator ogrzewania podłogowego</div>
          <p class="rk-calc-hero-lead">Wprowadź pomieszczenia, rzeczywistą powierzchnię grzewczą, obciążenie cieplne i parametry wody. Otrzymasz orientacyjną długość rur, liczbę pętli, przepływy, prędkości, straty ciśnienia oraz zład instalacji.</p>
          <div class="rk-calc-meta">
            <span><i aria-hidden="true"></i> Autor: Robert Kucharski</span>
            <span><i aria-hidden="true"></i> Aktualizacja: 26 sierpnia 2026 r.</span>
            <span><i aria-hidden="true"></i> Obliczenia dla wielu pomieszczeń</span>
          </div>
        </div>

        <aside class="rk-calc-hero-panel" aria-label="Przykładowe wyniki kalkulatora">
          <small>Jedno narzędzie — cztery grupy wyników</small>
          <div class="rk-calc-hero-flow">
            <div class="rk-calc-hero-stat"><span>Rury</span><strong>mb</strong></div>
            <div class="rk-calc-hero-stat"><span>Pętle</span><strong>szt.</strong></div>
            <div class="rk-calc-hero-stat"><span>Przepływ</span><strong>l/min</strong></div>
          </div>
          <div class="rk-calc-hero-result">Termika → geometria → hydraulika → kontrola ograniczeń</div>
        </aside>
      </div>
    </header>

    <nav class="rk-calc-nav" aria-label="Spis treści artykułu">
      <a href="#rk-calc-answer">Szybka odpowiedź</a>
      <a href="#rk-calc-scope">Zakres narzędzia</a>
      <a href="#rk-calc-tool">Kalkulator</a>
      <a href="#rk-calc-method">Wzory</a>
      <a href="#rk-calc-spacing">Rozstaw rur</a>
      <a href="#rk-calc-hydraulics">Hydraulika</a>
      <a href="#rk-calc-example">Przykład</a>
      <a href="#rk-calc-howto">Procedura</a>
      <a href="#rk-calc-faq">FAQ</a>
      <a href="#rk-calc-author">Autor</a>
    </nav>

    <div class="rk-calc-body">
      <section class="rk-calc-section" id="rk-calc-answer">
        <span class="rk-calc-kicker">Najkrótsza poprawna odpowiedź</span>
        <h2>Co rzeczywiście oblicza kompleksowy kalkulator ogrzewania podłogowego?</h2>
        <p class="rk-calc-lead rk-calc-dropcap"><strong>Kompleksowy kalkulator ogrzewania podłogowego</strong> zestawia obciążenie cieplne każdego pomieszczenia z dostępną powierzchnią grzewczą, parametrami wody, oporem okładziny oraz geometrią pętli. Dzięki temu nie ogranicza się do odpowiedzi „ile metrów rury kupić”, lecz pokazuje również liczbę obwodów, przepływ, prędkość w przewodzie, przybliżony opór hydrauliczny i pojemność wodną instalacji.</p>

        <div class="rk-calc-answer">
          <div class="rk-calc-answer-main">
            <h3>Najpierw pomieszczenie, później cały dom</h3>
            <p>Podłogówki nie projektuje się wyłącznie z powierzchni budynku. Salon, łazienka i sypialnia mają inne temperatury, okładziny, wolne pola posadzki oraz straty ciepła. Każde pomieszczenie wymaga osobnego sprawdzenia, a dopiero później sumuje się pętle, przepływy i sekcje rozdzielacza.</p>
            <p>W kalkulatorze możesz podać projektową stratę uzyskaną z obliczeń albo własne założenie W/m². Drugi wariant pozostaje szacunkiem i nie staje się przez samo wpisanie do formularza pełnym OZC.</p>
          </div>
          <div class="rk-calc-answer-side">
            <h3>Ważne rozróżnienie</h3>
            <p><strong>Wynik kalkulatora jest kontrolny i orientacyjny.</strong> Nie zawiera rzutu pętli, dokładnych oporów armatury, rzeczywistych tras, charakterystyki pompy ani danych wszystkich przegród.</p>
            <p>Do wykonania instalacji potrzebna jest dokumentacja dopasowana do konkretnego budynku.</p>
          </div>
        </div>

        <div class="rk-calc-grid-4" style="margin-top:22px">
          <article class="rk-calc-card"><span class="rk-calc-card-number">Φ</span><h3>Obciążenie cieplne</h3><p>Moc w watach potrzebna w projektowych warunkach dla konkretnego pomieszczenia, a nie zużycie energii w kWh.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">q</span><h3>Moc powierzchniowa</h3><p>Wymagane W/m² rzeczywiście czynnej posadzki po odjęciu stałej zabudowy i pól wyłączonych z grzania.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">V̇</span><h3>Przepływ</h3><p>Strumień wody wynikający z mocy pomieszczenia oraz różnicy temperatury między zasilaniem a powrotem.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">Δp</span><h3>Opór pętli</h3><p>Przybliżona strata ciśnienia zależna od średnicy wewnętrznej, długości, przepływu i właściwości wody.</p></article>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-scope">
        <span class="rk-calc-kicker">Granice odpowiedzialnego obliczenia</span>
        <h2>Kalkulator pomaga kontrolować założenia, ale nie rozrysowuje instalacji</h2>
        <p class="rk-calc-lead">Największą wartością narzędzia jest pokazanie zależności. Zmiana temperatury wody, powierzchni czynnej, rozstawu albo długości dobiegu natychmiast wpływa na liczbę obwodów i hydraulikę. Trzeba jednak wiedzieć, których danych formularz nie może samodzielnie odgadnąć.</p>

        <div class="rk-calc-scope">
          <div class="rk-calc-scope-panel is-does">
            <h3>Kalkulator oszacuje</h3>
            <ul class="rk-calc-checks">
              <li>wymaganą moc z 1 m² czynnej podłogi,</li>
              <li>orientacyjny rozstaw 5, 10, 15 albo 20 cm,</li>
              <li>łączną długość rury wraz z dobiegami,</li>
              <li>liczbę i średnią długość pętli,</li>
              <li>przepływ pomieszczenia i pojedynczego obwodu,</li>
              <li>prędkość wody oraz liniową stratę ciśnienia,</li>
              <li>liczbę sekcji rozdzielacza i zład rur.</li>
            </ul>
          </div>
          <div class="rk-calc-scope-panel is-does-not">
            <h3>Kalkulator nie wyznaczy sam</h3>
            <ul class="rk-calc-checks">
              <li>strat przez przegrody bez ich parametrów i geometrii,</li>
              <li>rzeczywistego przebiegu każdej pętli na rzucie,</li>
              <li>wszystkich oporów zaworów, belek i armatury,</li>
              <li>punktu pracy konkretnej pompy obiegowej,</li>
              <li>wpływu mostków cieplnych i stref brzegowych,</li>
              <li>bezpiecznej dylatacji oraz konstrukcji jastrychu,</li>
              <li>nastaw wykonawczych bez weryfikacji projektu.</li>
            </ul>
          </div>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-tool">
        <div class="rk-calc-tool">
          <div class="rk-calc-tool-head">
            <span class="rk-calc-kicker" style="color:#79f1ff">Interaktywny model wielopomieszczeniowy</span>
            <h2>Oblicz rury, pętle, przepływy i orientacyjną hydraulikę</h2>
            <p>Przykładowe pomieszczenia możesz edytować, usuwać i uzupełniać własnymi. Wyniki aktualizują się automatycznie. Wartości hydrauliczne obejmują rurę oraz umowny 20-procentowy dodatek na opory miejscowe — nie zastępują charakterystyki całej instalacji.</p>
          </div>

          <form id="rk-calc-form" aria-label="Kompleksowy kalkulator ogrzewania podłogowego">
            <div class="rk-calc-global">
              <h3>Krok 1. Wspólne parametry instalacji</h3>
              <div class="rk-calc-fields">
                <div class="rk-calc-field">
                  <label for="rk-calc-supply">Temperatura zasilania</label>
                  <input id="rk-calc-supply" type="number" min="25" max="50" step="0.5" value="35" inputmode="decimal">
                  <small>°C</small>
                </div>
                <div class="rk-calc-field">
                  <label for="rk-calc-return">Temperatura powrotu</label>
                  <input id="rk-calc-return" type="number" min="20" max="45" step="0.5" value="28" inputmode="decimal">
                  <small>°C</small>
                </div>
                <div class="rk-calc-field">
                  <label for="rk-calc-pipe">Rura grzewcza</label>
                  <select id="rk-calc-pipe">
                    <option value="0.012" data-outer="16">16×2 mm</option>
                    <option value="0.013" data-outer="17">17×2 mm</option>
                    <option value="0.016" data-outer="20">20×2 mm</option>
                  </select>
                  <small>Wartość obliczeniowa: średnica wewnętrzna</small>
                </div>
                <div class="rk-calc-field">
                  <label for="rk-calc-loop-target">Docelowa długość pętli</label>
                  <select id="rk-calc-loop-target">
                    <option value="80">80 m</option>
                    <option value="90" selected="">90 m</option>
                    <option value="100">100 m</option>
                  </select>
                  <small>Cel projektowy, nie uniwersalna granica normy</small>
                </div>
                <div class="rk-calc-field">
                  <label for="rk-calc-geometry-factor">Dodatek geometryczny</label>
                  <select id="rk-calc-geometry-factor">
                    <option value="1.03">3%</option>
                    <option value="1.05" selected="">5%</option>
                    <option value="1.08">8%</option>
                    <option value="1.10">10%</option>
                  </select>
                  <small>Łuki i niedoskonałość podziału pola</small>
                </div>
              </div>
            </div>

            <div class="rk-calc-rooms-wrap">
              <div class="rk-calc-rooms-head">
                <div>
                  <h3>Krok 2. Pomieszczenia</h3>
                  <p style="margin:6px 0 0">Powierzchnia grzewcza nie może być większa od powierzchni pomieszczenia.</p>
                </div>
                <button class="rk-calc-add-room" id="rk-calc-add-room" type="button">+ Dodaj pomieszczenie</button>
              </div>

              <div class="rk-calc-room-list" id="rk-calc-room-list">
                <div class="rk-calc-room" data-room-id="1">
                  <span class="rk-calc-room-index">01</span>
                  <div class="rk-calc-field"><label>Nazwa</label><input class="rk-room-name" type="text" value="Salon z aneksem" maxlength="50"></div>
                  <div class="rk-calc-field"><label>Typ strefy</label><select class="rk-room-type"><option value="standard" selected="">Pokój 20–21°C</option><option value="bathroom">Łazienka 24°C</option><option value="edge">Strefa brzegowa</option></select></div>
                  <div class="rk-calc-field"><label>Powierzchnia</label><input class="rk-room-area" type="number" min="1" max="200" step="0.1" value="35"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Pow. grzewcza</label><input class="rk-room-active" type="number" min="0.5" max="200" step="0.1" value="30"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Strata cieplna</label><input class="rk-room-load" type="number" min="50" max="15000" step="10" value="1400"><small>W</small></div>
                  <div class="rk-calc-field"><label>Okładzina</label><select class="rk-room-floor"><option value="0.01" selected="">Płytki R=0,01</option><option value="0.03">Winyl R=0,03</option><option value="0.07">Panel R=0,07</option><option value="0.10">Drewno R=0,10</option><option value="0.15">Dywan R=0,15</option></select></div>
                  <div class="rk-calc-field"><label>Odległość</label><input class="rk-room-distance" type="number" min="0" max="50" step="0.5" value="7"><small>m do rozdzielacza</small></div>
                  <div class="rk-calc-field"><label>Rozstaw</label><select class="rk-room-spacing"><option value="auto" selected="">Dobierz orientacyjnie</option><option value="5">5 cm</option><option value="10">10 cm</option><option value="15">15 cm</option><option value="20">20 cm</option></select></div>
                  <button class="rk-calc-room-remove" type="button" aria-label="Usuń pomieszczenie">×</button>
                </div>

                <div class="rk-calc-room" data-room-id="2">
                  <span class="rk-calc-room-index">02</span>
                  <div class="rk-calc-field"><label>Nazwa</label><input class="rk-room-name" type="text" value="Łazienka" maxlength="50"></div>
                  <div class="rk-calc-field"><label>Typ strefy</label><select class="rk-room-type"><option value="standard">Pokój 20–21°C</option><option value="bathroom" selected="">Łazienka 24°C</option><option value="edge">Strefa brzegowa</option></select></div>
                  <div class="rk-calc-field"><label>Powierzchnia</label><input class="rk-room-area" type="number" min="1" max="200" step="0.1" value="8"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Pow. grzewcza</label><input class="rk-room-active" type="number" min="0.5" max="200" step="0.1" value="6"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Strata cieplna</label><input class="rk-room-load" type="number" min="50" max="15000" step="10" value="560"><small>W</small></div>
                  <div class="rk-calc-field"><label>Okładzina</label><select class="rk-room-floor"><option value="0.01" selected="">Płytki R=0,01</option><option value="0.03">Winyl R=0,03</option><option value="0.07">Panel R=0,07</option><option value="0.10">Drewno R=0,10</option><option value="0.15">Dywan R=0,15</option></select></div>
                  <div class="rk-calc-field"><label>Odległość</label><input class="rk-room-distance" type="number" min="0" max="50" step="0.5" value="6"><small>m do rozdzielacza</small></div>
                  <div class="rk-calc-field"><label>Rozstaw</label><select class="rk-room-spacing"><option value="auto" selected="">Dobierz orientacyjnie</option><option value="5">5 cm</option><option value="10">10 cm</option><option value="15">15 cm</option><option value="20">20 cm</option></select></div>
                  <button class="rk-calc-room-remove" type="button" aria-label="Usuń pomieszczenie">×</button>
                </div>

                <div class="rk-calc-room" data-room-id="3">
                  <span class="rk-calc-room-index">03</span>
                  <div class="rk-calc-field"><label>Nazwa</label><input class="rk-room-name" type="text" value="Sypialnia" maxlength="50"></div>
                  <div class="rk-calc-field"><label>Typ strefy</label><select class="rk-room-type"><option value="standard" selected="">Pokój 20–21°C</option><option value="bathroom">Łazienka 24°C</option><option value="edge">Strefa brzegowa</option></select></div>
                  <div class="rk-calc-field"><label>Powierzchnia</label><input class="rk-room-area" type="number" min="1" max="200" step="0.1" value="15"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Pow. grzewcza</label><input class="rk-room-active" type="number" min="0.5" max="200" step="0.1" value="13"><small>m²</small></div>
                  <div class="rk-calc-field"><label>Strata cieplna</label><input class="rk-room-load" type="number" min="50" max="15000" step="10" value="600"><small>W</small></div>
                  <div class="rk-calc-field"><label>Okładzina</label><select class="rk-room-floor"><option value="0.01">Płytki R=0,01</option><option value="0.03">Winyl R=0,03</option><option value="0.07" selected="">Panel R=0,07</option><option value="0.10">Drewno R=0,10</option><option value="0.15">Dywan R=0,15</option></select></div>
                  <div class="rk-calc-field"><label>Odległość</label><input class="rk-room-distance" type="number" min="0" max="50" step="0.5" value="9"><small>m do rozdzielacza</small></div>
                  <div class="rk-calc-field"><label>Rozstaw</label><select class="rk-room-spacing"><option value="auto" selected="">Dobierz orientacyjnie</option><option value="5">5 cm</option><option value="10">10 cm</option><option value="15">15 cm</option><option value="20">20 cm</option></select></div>
                  <button class="rk-calc-room-remove" type="button" aria-label="Usuń pomieszczenie">×</button>
                </div>
              </div>

              <div class="rk-calc-tool-actions">
                <button class="rk-calc-recalculate" type="submit">Przelicz instalację</button>
                <button class="rk-calc-reset" id="rk-calc-reset" type="button">Przywróć przykład</button>
              </div>
            </div>
          </form>

          <div class="rk-calc-results" id="rk-calc-results" aria-live="polite">
            <h3>Wynik dla całej instalacji</h3>
            <div class="rk-calc-result-summary">
              <div class="rk-calc-result-card"><small>Projektowe obciążenie pomieszczeń</small><div class="rk-calc-result-number" id="rk-result-load">2560 W</div></div>
              <div class="rk-calc-result-card is-main"><small>Szacowana długość rur</small><div class="rk-calc-result-number" id="rk-result-pipe">— m</div></div>
              <div class="rk-calc-result-card"><small>Liczba pętli / sekcji</small><div class="rk-calc-result-number" id="rk-result-loops">—</div></div>
              <div class="rk-calc-result-card"><small>Przepływ całkowity</small><div class="rk-calc-result-number" id="rk-result-flow">— m³/h</div></div>
              <div class="rk-calc-result-card"><small>Powierzchnia całkowita</small><div class="rk-calc-result-number" id="rk-result-area">58 m²</div></div>
              <div class="rk-calc-result-card"><small>Powierzchnia grzewcza</small><div class="rk-calc-result-number" id="rk-result-active">49 m²</div></div>
              <div class="rk-calc-result-card"><small>Pojemność rur</small><div class="rk-calc-result-number" id="rk-result-volume">— l</div></div>
              <div class="rk-calc-result-card"><small>Największy opór pętli</small><div class="rk-calc-result-number" id="rk-result-pressure">— kPa</div></div>
            </div>

            <div class="rk-calc-status" id="rk-calc-status">
              <strong id="rk-calc-status-title">Analiza zostanie uzupełniona po uruchomieniu narzędzia</strong>
              <span id="rk-calc-status-copy">Sprawdzamy powierzchnie grzewcze, moc, długości, temperaturę powierzchni, prędkości i orientacyjne straty ciśnienia.</span>
            </div>

            <div class="rk-calc-tabs" role="tablist" aria-label="Grupy wyników kalkulatora">
              <button class="rk-calc-tab is-active" type="button" data-tab="summary" role="tab" aria-selected="true">Podsumowanie</button>
              <button class="rk-calc-tab" type="button" data-tab="thermal" role="tab" aria-selected="false">Termika</button>
              <button class="rk-calc-tab" type="button" data-tab="geometry" role="tab" aria-selected="false">Rury i pętle</button>
              <button class="rk-calc-tab" type="button" data-tab="hydraulic" role="tab" aria-selected="false">Hydraulika</button>
            </div>

            <div class="rk-calc-tab-panel is-active" id="rk-calc-panel-summary" data-panel="summary" role="tabpanel">
              <div class="rk-calc-bars" id="rk-calc-bars"></div>
              <p class="rk-calc-result-note" style="margin-top:20px"><strong>Jak czytać wykres?</strong> Długość paska pokazuje wymaganą moc z 1 m² czynnej podłogi względem najwyższej wartości w zestawieniu. Nie jest to roczne zużycie energii.</p>
            </div>

            <div class="rk-calc-tab-panel" id="rk-calc-panel-thermal" data-panel="thermal" role="tabpanel">
              <div class="rk-calc-table-wrap">
                <table>
                  <thead><tr><th>Pomieszczenie</th><th>Strata</th><th>Pow. czynna</th><th>Wymagane q</th><th>Rozstaw</th><th>Szac. możliwości</th><th>Temp. powierzchni</th><th>Ocena</th></tr></thead>
                  <tbody id="rk-calc-thermal-body"></tbody>
                </table>
              </div>
            </div>

            <div class="rk-calc-tab-panel" id="rk-calc-panel-geometry" data-panel="geometry" role="tabpanel">
              <div class="rk-calc-table-wrap">
                <table>
                  <thead><tr><th>Pomieszczenie</th><th>Rozstaw</th><th>Długość pola</th><th>Dobiegi</th><th>Rura łącznie</th><th>Pętle</th><th>Śr. pętla</th><th>Zład rur</th></tr></thead>
                  <tbody id="rk-calc-geometry-body"></tbody>
                </table>
              </div>
            </div>

            <div class="rk-calc-tab-panel" id="rk-calc-panel-hydraulic" data-panel="hydraulic" role="tabpanel">
              <div class="rk-calc-table-wrap">
                <table>
                  <thead><tr><th>Pomieszczenie</th><th>Przepływ pom.</th><th>Przepływ pętli</th><th>Prędkość</th><th>Re</th><th>Opór pętli</th><th>ΔT</th><th>Ocena</th></tr></thead>
                  <tbody id="rk-calc-hydraulic-body"></tbody>
                </table>
              </div>
              <p class="rk-calc-result-note" style="margin-top:18px">Opór obejmuje szacowaną stratę liniową najdłuższej średniej pętli oraz 20% dodatku na opory miejscowe. Do doboru pompy trzeba jeszcze uwzględnić rozdzielacz, zawory, filtr, źródło ciepła, przewody zasilające i rzeczywisty obieg krytyczny.</p>
            </div>
          </div>

          <div class="rk-calc-inline-cta">
            <span class="rk-calc-kicker">Wynik orientacyjny a dokumentacja wykonawcza</span>
            <h3>Kalkulator policzył zależności, ale nie zna rzutu Twojego domu</h3>
            <p>Narzędzie nie widzi okien, ścian zewnętrznych, mostków cieplnych, stałej zabudowy na rysunku ani rzeczywistych tras do rozdzielacza. Projekt określa przebieg każdej pętli, obciążenie poszczególnych pomieszczeń, rozstaw, przepływy, opory i nastawy potrzebne wykonawcy.</p>
            <a class="rk-calc-cta-button rk-calc-sales-cta" href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/">Zamów projekt z obliczeniami dla każdego pomieszczenia</a>
            <small class="rk-calc-disclosure">Odnośnik prowadzi do strony sprzedażowej Projekt-Ogrzewania.pl — serwisu należącego do autora artykułu.</small>
          </div>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-method">
        <span class="rk-calc-kicker">Metodologia zamiast pozornej dokładności</span>
        <h2>Jak kalkulator ogrzewania podłogowego przechodzi od watów do rur i przepływów?</h2>
        <p class="rk-calc-lead">Obliczenie jest łańcuchem zależności. Projektowe obciążenie pomieszczenia wyznacza wymaganą moc aktywnej posadzki. Temperatura wody, temperatura wnętrza, rozstaw i opór okładziny określają orientacyjne możliwości podłogi. Dopiero później można szacować długość rur, liczbę pętli i hydraulikę.</p>

        <div class="rk-calc-formulas">
          <article class="rk-calc-formula">
            <span>1. Obciążenie czynnej posadzki</span>
            <strong class="rk-calc-equation">q<sub>req</sub> = Φ<sub>HL</sub> / A<sub>F</sub></strong>
            <p><strong>Φ<sub>HL</sub></strong> to projektowa strata pomieszczenia [W], a <strong>A<sub>F</sub></strong> — rzeczywiście ogrzewana powierzchnia [m²]. Jeżeli salon traci 1400 W, ale grzeje tylko 30 m² podłogi, wymagane obciążenie wynosi około 46,7 W/m².</p>
          </article>
          <article class="rk-calc-formula">
            <span>2. Średnia temperatura czynnika</span>
            <strong class="rk-calc-equation">θ<sub>m</sub> = (θ<sub>V</sub> + θ<sub>R</sub>) / 2</strong>
            <p>Wstępny model używa średniej arytmetycznej zasilania i powrotu. W pełnych obliczeniach charakterystyk systemu stosuje się dokładniejsze zależności i dane konkretnej konstrukcji podłogi.</p>
          </article>
          <article class="rk-calc-formula">
            <span>3. Szacowana długość przewodów</span>
            <strong class="rk-calc-equation">L ≈ (A<sub>F</sub> / s) × k + 2 × L<sub>d</sub> × N</strong>
            <p><strong>s</strong> oznacza rozstaw [m], <strong>k</strong> dodatek geometryczny, <strong>L<sub>d</sub></strong> odległość od rozdzielacza, a <strong>N</strong> liczbę pętli. Każdy obwód potrzebuje własnego zasilania i powrotu.</p>
          </article>
          <article class="rk-calc-formula">
            <span>4. Przepływ wynikający z mocy</span>
            <strong class="rk-calc-equation">V̇ ≈ Φ / (4180 × ΔT) × 60</strong>
            <p>Wynik w l/min zakłada wodę i jej przybliżone ciepło właściwe. Dla 1000 W oraz ΔT = 5 K otrzymujemy około 2,87 l/min dla całego pomieszczenia, dzielone następnie między jego pętle.</p>
          </article>
          <article class="rk-calc-formula">
            <span>5. Prędkość w rurze</span>
            <strong class="rk-calc-equation">v = V̇ / A<sub>rury</sub></strong>
            <p>Pole przepływu wynika ze średnicy wewnętrznej, a nie z oznaczenia zewnętrznego rury. Przewód 16×2 mm ma około 12 mm średnicy wewnętrznej.</p>
          </article>
          <article class="rk-calc-formula">
            <span>6. Strata ciśnienia pętli</span>
            <strong class="rk-calc-equation">Δp = λ × (L / D) × (ρv² / 2) + ΣΔp<sub>m</sub></strong>
            <p>Kalkulator szacuje tarcie metodą Darcy’ego–Weisbacha i dodaje 20% na opory miejscowe. Projekt musi wykorzystać rzeczywiste opory rozdzielacza, zaworów i całej trasy krytycznej.</p>
          </article>
        </div>

        <div class="rk-calc-diagram" aria-label="Schemat zależności w obliczeniach ogrzewania podłogowego">
          <svg viewBox="0 0 1080 360" role="img" aria-labelledby="rk-calc-diagram-title rk-calc-diagram-desc">
            <title id="rk-calc-diagram-title">Od obciążenia cieplnego do nastaw rozdzielacza</title>
            <desc id="rk-calc-diagram-desc">Schemat pokazuje kolejność: obciążenie cieplne, aktywna powierzchnia, moc powierzchniowa, rozstaw, długość rur, pętle, przepływy i opory hydrauliczne.</desc>
            <defs>
              <linearGradient id="rkCalcBox" x1="0" x2="1">
                <stop offset="0%" stop-color="#078fbe"></stop>
                <stop offset="100%" stop-color="#28c9da"></stop>
              </linearGradient>
              <marker id="rkCalcArrow" markerWidth="10" markerHeight="10" refX="8" refY="5" orient="auto">
                <path d="M0,0 L10,5 L0,10 Z" fill="#ff7438"></path>
              </marker>
            </defs>
            <rect x="26" y="50" width="210" height="96" rx="20" fill="url(#rkCalcBox)"></rect>
            <text x="131" y="87" text-anchor="middle" fill="#ffffff" font-size="17" font-weight="900">STRATY CIEPŁA</text>
            <text x="131" y="116" text-anchor="middle" fill="#dcfaff" font-size="14">pomieszczenia [W]</text>
            <path d="M236 98 H292" fill="none" stroke="#ff7438" stroke-width="7" marker-end="url(#rkCalcArrow)"></path>
            <rect x="312" y="50" width="210" height="96" rx="20" fill="#e9fbff" stroke="#078fbe" stroke-width="3"></rect>
            <text x="417" y="87" text-anchor="middle" fill="#102536" font-size="17" font-weight="900">MOC PODŁOGI</text>
            <text x="417" y="116" text-anchor="middle" fill="#506674" font-size="14">W/m² i rozstaw</text>
            <path d="M522 98 H578" fill="none" stroke="#ff7438" stroke-width="7" marker-end="url(#rkCalcArrow)"></path>
            <rect x="598" y="50" width="210" height="96" rx="20" fill="#eaf8f3" stroke="#16876d" stroke-width="3"></rect>
            <text x="703" y="87" text-anchor="middle" fill="#102536" font-size="17" font-weight="900">RURY I PĘTLE</text>
            <text x="703" y="116" text-anchor="middle" fill="#506674" font-size="14">długość i sekcje</text>
            <path d="M808 98 H864" fill="none" stroke="#ff7438" stroke-width="7" marker-end="url(#rkCalcArrow)"></path>
            <rect x="884" y="50" width="170" height="96" rx="20" fill="#fff3eb" stroke="#ff7438" stroke-width="3"></rect>
            <text x="969" y="87" text-anchor="middle" fill="#102536" font-size="17" font-weight="900">HYDRAULIKA</text>
            <text x="969" y="116" text-anchor="middle" fill="#506674" font-size="14">V̇, v, Δp</text>
            <path d="M969 146 V218 H131 V166" fill="none" stroke="#14384d" stroke-width="4" stroke-dasharray="9 8" marker-end="url(#rkCalcArrow)"></path>
            <rect x="248" y="224" width="584" height="100" rx="23" fill="#102536"></rect>
            <text x="540" y="262" text-anchor="middle" fill="#79f1ff" font-size="16" font-weight="900">ITERACJA PROJEKTOWA</text>
            <text x="540" y="291" text-anchor="middle" fill="#ffffff" font-size="15">jeżeli moc lub hydraulika nie spełnia kryteriów, zmieniamy</text>
            <text x="540" y="313" text-anchor="middle" fill="#d5e7ef" font-size="14">temperaturę, rozstaw, liczbę pętli, średnicę albo układ stref</text>
          </svg>
        </div>

        <div class="rk-calc-callout">
          <p><strong>Dlaczego kalkulator nie „robi OZC” z samego metrażu?</strong> Projektowe obciążenie cieplne zależy od temperatur, wentylacji, geometrii i właściwości przegród. PN-EN 12831-1 opisuje obliczanie mocy potrzebnej do utrzymania wymaganej temperatury w projektowych warunkach zewnętrznych. Wskaźnik W/m² może służyć do szybkiego scenariusza, ale nie zastępuje danych budynku.</p>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-spacing">
        <span class="rk-calc-kicker">Geometria pętli</span>
        <h2>Ile rury potrzeba na 1 m² przy rozstawie 5, 10, 15 i 20 cm?</h2>
        <p class="rk-calc-lead">Najprostsze przybliżenie wynika z odwrotności rozstawu. Przy 10 cm otrzymujemy około 10 m przewodu na 1 m² pola, a przy 15 cm około 6,7 m/m². Do wyniku trzeba dodać łuki, podział pola oraz osobne dobiegi zasilania i powrotu każdej pętli.</p>

        <div class="rk-calc-table-wrap">
          <table>
            <thead><tr><th>Rozstaw</th><th>Teoretyczne zużycie</th><th>Z dodatkiem 5%</th><th>Typowe zastosowanie</th><th>Najważniejsze zastrzeżenie</th></tr></thead>
            <tbody>
              <tr><td data-label="Rozstaw"><strong>5 cm</strong></td><td data-label="Teoretyczne zużycie">20,0 m/m²</td><td data-label="Z dodatkiem 5%">21,0 m/m²</td><td data-label="Typowe zastosowanie">Lokalne strefy o bardzo dużej mocy lub systemy specjalne</td><td data-label="Zastrzeżenie">Duża długość rury i opory; wymaga krótkich pętli oraz weryfikacji konstrukcji</td></tr>
              <tr><td data-label="Rozstaw"><strong>10 cm</strong></td><td data-label="Teoretyczne zużycie">10,0 m/m²</td><td data-label="Z dodatkiem 5%">10,5 m/m²</td><td data-label="Typowe zastosowanie">Łazienki, strefy brzegowe, wyższe obciążenie, niska temperatura wody</td><td data-label="Zastrzeżenie">Nie każda łazienka automatycznie wymaga 10 cm — decydują obliczenia</td></tr>
              <tr><td data-label="Rozstaw"><strong>15 cm</strong></td><td data-label="Teoretyczne zużycie">6,67 m/m²</td><td data-label="Z dodatkiem 5%">7,0 m/m²</td><td data-label="Typowe zastosowanie">Dobrze izolowane pokoje i salony o umiarkowanych stratach</td><td data-label="Zastrzeżenie">Przy drewnie lub dużym obciążeniu może wymagać wyższej temperatury wody</td></tr>
              <tr><td data-label="Rozstaw"><strong>20 cm</strong></td><td data-label="Teoretyczne zużycie">5,0 m/m²</td><td data-label="Z dodatkiem 5%">5,25 m/m²</td><td data-label="Typowe zastosowanie">Niskie obciążenia, pomieszczenia pomocnicze, niektóre systemy suche</td><td data-label="Zastrzeżenie">Większa nierównomierność temperatury i mniejsza moc przy tym samym parametrze</td></tr>
            </tbody>
          </table>
        </div>

        <div class="rk-calc-grid-3" style="margin-top:22px">
          <article class="rk-calc-card"><span class="rk-calc-card-number">A</span><h3>Odejmij stałą zabudowę</h3><p>Rur nie planuje się pod kominkiem, zabudowaną wanną, częścią szaf bez prześwitu ani elementami wymagającymi wyłączenia powierzchni.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">2L</span><h3>Dodaj każdy dobieg</h3><p>Odległość do rozdzielacza występuje podwójnie: jako zasilanie i powrót. Przy kilku pętlach pomieszczenia mnoży się ją przez liczbę obwodów.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">N</span><h3>Podziel pole na obwody</h3><p>Nie dzielimy tylko łącznej długości przez „maksimum”. Pętle powinny mieć wykonalny przebieg, podobne obciążenie i możliwe do ustawienia przepływy.</p></article>
        </div>

        <p style="margin-top:22px">Jeżeli interesuje Cię wyłącznie ilość przewodu, zobacz również osobny <a href="https://projekt-ogrzewania.pl/kalkulator-do-obliczania-ilosci-metrow-rury-potrzebnych-do-ogrzewania-podlogowego/">kalkulator długości rury do ogrzewania podłogowego</a>. Szczegółowe porównanie gęstości ułożenia znajduje się w opracowaniu <a href="https://projekt-ogrzewania.pl/rozstaw-rur-ogrzewania-podlogowego-przy-pompie-ciepla/">rozstaw rur przy pompie ciepła</a>.</p>
      </section>

      <section class="rk-calc-section" id="rk-calc-hydraulics">
        <span class="rk-calc-kicker">Przepływy zamiast nastaw „na oko”</span>
        <h2>Dlaczego długość pętli nie może być oceniana bez przepływu i oporu?</h2>
        <p class="rk-calc-lead">Ta sama pętla może pracować poprawnie przy małym obciążeniu, a przy dużej mocy wymagać przepływu powodującego wysoką prędkość i stratę ciśnienia. Dlatego 80, 90 albo 100 m jest celem organizującym projekt, a nie samodzielnym dowodem poprawności hydraulicznej.</p>

        <div class="rk-calc-grid-3">
          <article class="rk-calc-card"><span class="rk-calc-card-number">ΔT</span><h3>Różnica zasilanie–powrót</h3><p>Mniejsza różnica temperatury wymaga większego przepływu dla tej samej mocy. Zależność dokładnie wyjaśnia artykuł o <a href="https://projekt-ogrzewania.pl/spadek-temperatury-%ce%b4t-roznica-miedzy-temperatura-zasilania-a-powrotu/">spadku temperatury ΔT</a>.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">d<sub>i</sub></span><h3>Średnica wewnętrzna</h3><p>Niewielka zmiana średnicy silnie wpływa na prędkość i opory. Oznaczenie 16×2 mm oznacza około 12 mm światła przewodu.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">H</span><h3>Obieg krytyczny</h3><p>Pompa musi pokonać opór najbardziej niekorzystnej drogi, a nie sumę oporów wszystkich równoległych pętli. Sprawdź zasady <a href="https://projekt-ogrzewania.pl/pompa-obiegowa-w-instalacji-ogrzewania-podlogowego/">doboru pompy obiegowej</a>.</p></article>
        </div>

        <div class="rk-calc-callout">
          <p><strong>Przepływ na rotametrze nie wynika z powierzchni pętli.</strong> Wynika przede wszystkim z mocy, którą obwód ma przenieść, oraz przyjętego ΔT. Dwie pętle po 80 m mogą potrzebować innych nastaw, jeżeli obsługują pomieszczenia o innym obciążeniu. Więcej znajdziesz w poradniku o <a href="https://projekt-ogrzewania.pl/rotametr-wskaznik-przeplywu-w-rozdzielaczu-ogrzewania-podlogowego/">rotametrach w rozdzielaczu</a>.</p>
        </div>

        <div class="rk-calc-warning-grid">
          <article class="rk-calc-warning"><b>BŁĄD 01</b><h3>Jedna długość graniczna dla każdej pętli</h3><p>Nie istnieje uniwersalny metraż gwarantujący poprawność. Znaczenie mają średnica, przepływ, temperatura, opory miejscowe i dostępne ciśnienie pompy.</p></article>
          <article class="rk-calc-warning"><b>BŁĄD 02</b><h3>Sumowanie oporów pętli równoległych</h3><p>Przepływy pętli sumują się na magistrali, ale wysokość podnoszenia wyznacza droga krytyczna wraz z armaturą i przewodami wspólnymi.</p></article>
          <article class="rk-calc-warning"><b>BŁĄD 03</b><h3>Dobór pompy tylko z m³/h</h3><p>Wymagany jest jednocześnie przepływ i ciśnienie dyspozycyjne. Sam symbol 25/40 albo 25/60 nie mówi, jaki punkt pracy uzyskamy w instalacji.</p></article>
        </div>

        <p style="margin-top:22px">Rozdział pomieszczeń pomiędzy sekcje opisuje artykuł <a href="https://projekt-ogrzewania.pl/rozdzielacz-do-podlogowki-kluczowy-element-systemu-ogrzewania-podlogowego/">rozdzielacz do podłogówki</a>. Jeżeli potrzebujesz szczegółowego sprawdzenia magistrali, skorzystaj również z <a href="https://projekt-ogrzewania.pl/kalkulator-doboru-pompy-obiegowej-w-ogrzewaniu-podlogowym/">kalkulatora doboru pompy obiegowej</a>.</p>
      </section>

      <section class="rk-calc-section" id="rk-calc-example">
        <span class="rk-calc-kicker">Przykład z ujawnionymi założeniami</span>
        <h2>Salon 35 m²: dlaczego ta sama powierzchnia może wymagać różnej liczby pętli?</h2>
        <p class="rk-calc-lead">Przyjmijmy salon o powierzchni 35 m², z czego 30 m² stanowi czynne pole grzewcze. Projektowa strata wynosi 1400 W, temperatura pomieszczenia 21°C, parametry wody 35/28°C, rura 16×2 mm, a rozdzielacz znajduje się 7 m od granicy pomieszczenia.</p>

        <div class="rk-calc-case">
          <div class="rk-calc-case-head">
            <h3>Porównanie rozstawu 15 i 10 cm</h3>
            <p>Nie jest to gotowy projekt salonu. Przykład pokazuje wyłącznie wpływ rozstawu na długość, podział i hydraulikę przy tych samych danych wejściowych.</p>
          </div>
          <div class="rk-calc-case-body">
            <div class="rk-calc-case-compare">
              <div class="rk-calc-case-side is-wrong">
                <h3>Rozstaw 15 cm</h3>
                <p><strong>Pole rury:</strong> około 210 m z dodatkiem 5%.</p>
                <p><strong>Z dobiegami:</strong> przy trzech obwodach około 252 m.</p>
                <p><strong>Średnia pętla:</strong> około 84 m.</p>
                <p><strong>Wymagana moc:</strong> 46,7 W/m² czynnej podłogi.</p>
                <p>Układ może być poprawny, jeżeli okładzina i temperatura wody zapewnią potrzebną moc oraz pozostanie akceptowalny zapas powierzchniowy.</p>
              </div>
              <div class="rk-calc-case-side is-right">
                <h3>Rozstaw 10 cm</h3>
                <p><strong>Pole rury:</strong> około 315 m z dodatkiem 5%.</p>
                <p><strong>Z dobiegami:</strong> przy pięciu obwodach około 385 m.</p>
                <p><strong>Średnia pętla:</strong> około 77 m.</p>
                <p><strong>Wymagana moc:</strong> nadal 46,7 W/m².</p>
                <p>Gęstszy rozstaw zwiększa potencjał oddawania ciepła i może pozwolić obniżyć temperaturę wody, ale wymaga większej ilości rury i większej liczby sekcji.</p>
              </div>
            </div>
          </div>
        </div>

        <div class="rk-calc-callout">
          <p><strong>Wniosek:</strong> więcej rury nie jest automatycznie lepszym projektem. Celem jest pokrycie projektowej straty możliwie niską temperaturą zasilania, przy wykonalnym rozstawie, rozsądnych długościach, możliwych przepływach oraz właściwej liczbie sekcji rozdzielacza.</p>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-howto">
        <span class="rk-calc-kicker">Procedura projektowa</span>
        <h2>Jak poprawnie korzystać z kalkulatora ogrzewania podłogowego?</h2>
        <div class="rk-calc-steps">
          <article class="rk-calc-step"><h3>Zdobądź obciążenie pomieszczeń</h3><p>Najlepiej użyj wyników obliczeń cieplnych. Jeżeli przyjmujesz W/m², potraktuj rezultat wyłącznie jako wariant orientacyjny.</p></article>
          <article class="rk-calc-step"><h3>Wyznacz czynne pola podłogi</h3><p>Odejmij stałą zabudowę i powierzchnie, pod którymi nie wolno albo nie ma sensu układać przewodów.</p></article>
          <article class="rk-calc-step"><h3>Wpisz temperatury i okładziny</h3><p>Podaj wspólne zasilanie i powrót oraz rzeczywisty opór wykończenia w każdym pomieszczeniu.</p></article>
          <article class="rk-calc-step"><h3>Sprawdź moc powierzchniową</h3><p>Jeżeli wymagana moc przekracza możliwości posadzki, nie naprawiaj wyniku samym zagęszczaniem rur — przeanalizuj cały układ.</p></article>
          <article class="rk-calc-step"><h3>Skontroluj pętle i hydraulikę</h3><p>Porównaj długości, przepływy, prędkości oraz orientacyjne straty ciśnienia. Zwróć uwagę na obieg najbardziej niekorzystny.</p></article>
          <article class="rk-calc-step"><h3>Przenieś wynik na rzut</h3><p>Dopiero rozmieszczenie pętli na planie potwierdzi rzeczywiste dobiegi, podział stref, liczbę sekcji i wykonalność instalacji.</p></article>
        </div>
      </section>

      <section class="rk-calc-section" id="rk-calc-project">
        <span class="rk-calc-kicker">Kalkulator a projekt</span>
        <h2>Czego w wynikach nadal brakuje wykonawcy?</h2>
        <p class="rk-calc-lead">Lista metrów i przepływów nie pokazuje, gdzie ma rozpocząć się ślimak, jak ominąć dylatację, jak przejść przez komunikację ani które pętle tworzą wspólną strefę. Profesjonalna dokumentacja scala termikę, geometrię i hydraulikę na rzucie budynku.</p>

        <div class="rk-calc-grid-3">
          <article class="rk-calc-card"><span class="rk-calc-card-number">01</span><h3>Rzut każdej pętli</h3><p>Przebieg, kierunek, numer obwodu, rozstaw, strefy brzegowe, dylatacje i powierzchnie wyłączone z grzania.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">02</span><h3>Tabela nastaw</h3><p>Długość, moc, projektowy przepływ i identyfikacja każdej pętli, dzięki którym można uruchomić i zrównoważyć instalację.</p></article>
          <article class="rk-calc-card"><span class="rk-calc-card-number">03</span><h3>Schemat hydrauliczny</h3><p>Rozdzielacze, magistrale, pompy, armatura, źródło ciepła i wymagania przepływowe pokazane jako jeden współpracujący system.</p></article>
        </div>

        <p style="margin-top:22px">Przy dużych przeszkleniach osobnego sprawdzenia wymaga <a href="https://projekt-ogrzewania.pl/strefa-brzegowa-obwodowa-w-ogrzewaniu-podlogowym/">strefa brzegowa ogrzewania podłogowego</a>. Rodzaj przewodu i jego rzeczywista średnica zostały szczegółowo opisane w poradniku <a href="https://projekt-ogrzewania.pl/rura-pex-do-ogrzewania-podlogowego/">rura PEX do ogrzewania podłogowego</a>.</p>
      </section>

      <section class="rk-calc-section" id="rk-calc-faq">
        <span class="rk-calc-kicker">Pytania użytkowników</span>
        <h2>FAQ — kompleksowy kalkulator ogrzewania podłogowego</h2>
        <div class="rk-calc-faq">
          <details>
            <summary>Czy kalkulator ogrzewania podłogowego zastępuje projekt?</summary>
            <div class="rk-calc-faq-answer"><p>Nie. Kalkulator pokazuje zależności i orientacyjne parametry na podstawie wpisanych danych, ale nie wykonuje pełnych obliczeń przegród, nie rozrysowuje pętli, nie zna oporów całej armatury ani charakterystyki konkretnej pompy. Do wykonania instalacji potrzebny jest projekt dopasowany do rzutu budynku.</p></div>
          </details>
          <details>
            <summary>Ile metrów rury potrzeba na 1 m² ogrzewania podłogowego?</summary>
            <div class="rk-calc-faq-answer"><p>Teoretycznie około 20 m/m² przy rozstawie 5 cm, 10 m/m² przy 10 cm, 6,67 m/m² przy 15 cm i 5 m/m² przy 20 cm. Do tego trzeba doliczyć łuki, podział pola oraz osobne odcinki zasilania i powrotu każdej pętli.</p></div>
          </details>
          <details>
            <summary>Jaka jest maksymalna długość pętli podłogówki?</summary>
            <div class="rk-calc-faq-answer"><p>Nie istnieje jedna długość gwarantująca poprawność każdej instalacji. Dla rury 16×2 mm często projektuje się pętle około 80–100 m, ale wynik trzeba sprawdzić na podstawie przepływu, średnicy wewnętrznej, oporów miejscowych i ciśnienia dostępnego z pompy.</p></div>
          </details>
          <details>
            <summary>Jak kalkulator dobiera rozstaw rur?</summary>
            <div class="rk-calc-faq-answer"><p>Porównuje wymaganą moc z 1 m² czynnej posadzki z orientacyjnymi możliwościami rozstawów 20, 15, 10 i 5 cm przy podanych temperaturach oraz oporze okładziny. Wybiera najszerszy rozstaw spełniający uproszczone kryterium, lecz wynik wymaga weryfikacji dla konkretnego systemu podłogi.</p></div>
          </details>
          <details>
            <summary>Jak obliczyć przepływ w pętli ogrzewania podłogowego?</summary>
            <div class="rk-calc-faq-answer"><p>Przepływ wynika z mocy przenoszonej przez pętlę oraz różnicy temperatury między zasilaniem a powrotem. Dla wody można użyć zależności V̇ ≈ Φ/(4180×ΔT)×60, otrzymując l/min, a następnie podzielić przepływ pomieszczenia pomiędzy jego obwody.</p></div>
          </details>
          <details>
            <summary>Czy każda łazienka powinna mieć rury co 10 cm?</summary>
            <div class="rk-calc-faq-answer"><p>Nie automatycznie. Łazienki często wymagają gęstego rozstawu z powodu temperatury projektowej 24°C i małej wolnej powierzchni, ale ostateczna decyzja zależy od strat, temperatury wody, okładziny i dostępnego pola grzewczego.</p></div>
          </details>
          <details>
            <summary>Czy kalkulator dobierze pompę obiegową?</summary>
            <div class="rk-calc-faq-answer"><p>Kalkulator podaje przepływ całkowity i orientacyjny opór najbardziej wymagającej pętli. Pełny dobór pompy wymaga jeszcze oporów magistrali, rozdzielacza, zaworów, filtrów, źródła ciepła i innych elementów wspólnego obiegu.</p></div>
          </details>
          <details>
            <summary>Jak obliczana jest pojemność wodna rur?</summary>
            <div class="rk-calc-faq-answer"><p>Pojemność wynika z pola przekroju wewnętrznego przewodu pomnożonego przez jego długość. Dla rury 16×2 mm o średnicy wewnętrznej około 12 mm jest to około 0,113 litra na metr. Całkowity zład instalacji obejmuje również rozdzielacze, magistrale, źródło i ewentualny bufor.</p></div>
          </details>
        </div>
      </section>

      <section class="rk-calc-section" aria-label="Źródła techniczne">
        <div class="rk-calc-sources">
          <strong>Podstawa techniczna i źródła opracowania</strong>
          <p>Projektowe obciążenie cieplne pomieszczeń i budynku: <a href="https://sklep.pkn.pl/pn-en-12831-1-2017-08e.html" target="_blank" rel="noopener nofollow">PN-EN 12831-1:2017-08 — Polski Komitet Normalizacyjny</a>. Określanie mocy cieplnej ogrzewania podłogowego: <a href="https://sklep.pkn.pl/pn-en-1264-2-2021-10e.html" target="_blank" rel="noopener nofollow">PN-EN 1264-2:2021-10 — PKN</a> oraz <a href="https://www.iso.org/standard/74683.html" target="_blank" rel="noopener nofollow">ISO 11855-2:2021</a>. Projektowanie i wymiarowanie systemów płaszczyznowych: <a href="https://www.iso.org/standard/74684.html" target="_blank" rel="noopener nofollow">ISO 11855-3:2021</a>. Kryteria projektowe wodnych instalacji ogrzewczych: <a href="https://sklep.pkn.pl/normy/pn-en-12828-a1-2014-05e.html" target="_blank" rel="noopener nofollow">PN-EN 12828+A1:2014-05 — PKN</a>. Dostęp do źródeł: 26 sierpnia 2026 r.</p>
          <p>Model termiczny kalkulatora jest uproszczeniem edukacyjnym. Nie odtwarza pełnych krzywych charakterystycznych konkretnego systemu, metod numerycznych ani badań systemowych opisanych w normach. Model hydrauliczny używa przybliżonych właściwości wody, równania Darcy’ego–Weisbacha oraz dodatku na opory miejscowe.</p>
        </div>
      </section>

      <section class="rk-calc-author" id="rk-calc-author" aria-label="Autor opracowania">
        <input type="radio" name="rk-calc-author-tabs" id="rk-calc-author-about" checked="">
        <input type="radio" name="rk-calc-author-tabs" id="rk-calc-author-exp">
        <input type="radio" name="rk-calc-author-tabs" id="rk-calc-author-sites">

        <div class="rk-calc-author-head">
          <div><h2>Autor opracowania</h2><p>Obliczenia techniczne przedstawione w sposób użyteczny dla inwestora i wykonawcy.</p></div>
          <span class="rk-calc-author-mark">E‑E‑A‑T • HVAC</span>
        </div>

        <div class="rk-calc-author-layout">
          <aside class="rk-calc-author-side">
            <div class="rk-calc-author-photo"><img src="https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp" alt="Robert Kucharski — projektant instalacji ogrzewania podłogowego" width="360" height="360" loading="lazy" decoding="async"></div>
            <div class="rk-calc-author-name">Robert Kucharski</div>
            <div class="rk-calc-author-role">Projektant instalacji sanitarnych<br>Specjalista HVAC i ogrzewania podłogowego</div>
          </aside>

          <div class="rk-calc-author-main">
            <blockquote class="rk-calc-author-quote"><p>„Dobry kalkulator nie ma zastępować projektu. Ma pokazać inwestorowi, że długość rury, liczba pętli, przepływ i opór hydrauliczny są jednym układem zależności — zmiana jednej wartości zawsze wpływa na pozostałe.”</p></blockquote>

            <div class="rk-calc-author-tabs" role="tablist" aria-label="Informacje o autorze">
              <label class="rk-calc-author-tab" for="rk-calc-author-about" role="tab">O autorze</label>
              <label class="rk-calc-author-tab" for="rk-calc-author-exp" role="tab">Doświadczenie</label>
              <label class="rk-calc-author-tab" for="rk-calc-author-sites" role="tab">Portale</label>
            </div>

            <div class="rk-calc-author-panel rk-calc-author-panel-about">
              <p>Robert Kucharski projektuje wodne instalacje ogrzewania podłogowego i przygotowuje techniczne publikacje dotyczące obliczeń cieplnych, hydrauliki, źródeł ciepła, automatyki oraz świadomego prowadzenia inwestycji. W opracowaniach rozdziela szybkie oszacowanie od parametrów, które muszą wynikać z dokumentacji wykonawczej.</p>
              <p><a href="https://projekt-ogrzewania.pl/author/admin3399/">Zobacz profil i pozostałe opracowania autora</a>.</p>
            </div>

            <div class="rk-calc-author-panel rk-calc-author-panel-exp">
              <p>Doświadczenie autora obejmuje obliczenia obciążenia cieplnego pomieszczeń, dobór temperatury zasilania, rozstawu i długości pętli, przepływów, oporów hydraulicznych, rozdzielaczy oraz pomp obiegowych. Projekty łączą dane cieplne z możliwym do wykonania przebiegiem rur i tabelą nastaw dla każdej pętli.</p>
            </div>

            <div class="rk-calc-author-panel rk-calc-author-panel-sites">
              <p>Autor jest właścicielem trzech serwisów poświęconych projektowaniu instalacji, budowie i remontom. Powiązanie portali jest podane jawnie, aby czytelnik znał autorstwo oraz kontekst linkowania.</p>
              <div class="rk-calc-site-links">
                <a href="https://projekt-ogrzewania.pl/">Projekt-Ogrzewania.pl</a>
                <a href="https://remont.biz.pl/" target="_blank" rel="noopener nofollow">Remont.biz.pl</a>
                <a href="https://sobir.pl/" target="_blank" rel="noopener nofollow">Sobir.pl</a>
              </div>
            </div>
          </div>
        </div>
      </section>

      <section class="rk-calc-final-cta" aria-label="Profesjonalny projekt ogrzewania podłogowego">
        <div class="rk-calc-final-cta-content">
          <span class="rk-calc-kicker" style="color:#79f1ff">Od szacunku do dokumentacji wykonawczej</span>
          <h2>Każde pomieszczenie potrzebuje własnych obliczeń i rzeczywistego przebiegu pętli</h2>
          <p>Projekt ogrzewania podłogowego określa obciążenie cieplne, aktywne powierzchnie, rozstaw i długość każdego obwodu, projektowe przepływy, opory hydrauliczne, nastawy rozdzielacza oraz schemat współpracy ze źródłem ciepła. Otrzymujesz dokumentację, którą można przekazać wykonawcy przed ułożeniem rur i zalaniem posadzki.</p>
          <a class="rk-calc-cta-button rk-calc-sales-cta" href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/">Zamów kompletny projekt ogrzewania podłogowego</a>
          <small class="rk-calc-disclosure">Odnośnik prowadzi do strony sprzedażowej Projekt-Ogrzewania.pl — serwisu należącego do autora artykułu.</small>
        </div>
      </section>
    </div>
  </div>
</article>

<!-- RK_CALC_SCHEMA -->
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "TechArticle",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article",
      "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/",
      "headline": "Kompleksowy kalkulator ogrzewania podłogowego – rury, pętle, przepływy i hydraulika",
      "description": "Kompleksowy kalkulator ogrzewania podłogowego obliczy rury, pętle, przepływy i zład. Sprawdź pomieszczenia, rozstaw oraz hydraulikę instalacji dla Twojego domu.",
      "dateModified": "2026-08-26",
      "inLanguage": "pl-PL",
      "mainEntityOfPage": {
        "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webpage"
      },
      "author": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "reviewedBy": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "accountablePerson": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "publisher": {
        "@id": "https://projekt-ogrzewania.pl/#organization"
      },
      "copyrightHolder": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "isPartOf": {
        "@id": "https://projekt-ogrzewania.pl/#website"
      },
      "articleSection": [
        "Kalkulatory budowlane",
        "Ogrzewanie podłogowe",
        "Projektowanie instalacji",
        "Hydraulika"
      ],
      "keywords": [
        "kompleksowy kalkulator ogrzewania podłogowego",
        "kalkulator ogrzewania podłogowego online",
        "kalkulator liczby pętli podłogówki",
        "kalkulator długości rury ogrzewania podłogowego",
        "kalkulator przepływu podłogówki",
        "rozstaw rur ogrzewania podłogowego",
        "opory hydrauliczne pętli",
        "pojemność wodna ogrzewania podłogowego"
      ],
      "about": [
        {
          "@type": "Thing",
          "name": "Wodne ogrzewanie podłogowe"
        },
        {
          "@type": "Thing",
          "name": "Obliczenia hydrauliczne pętli grzewczych"
        },
        {
          "@type": "Thing",
          "name": "Rozstaw i długość rur"
        },
        {
          "@type": "Thing",
          "name": "Przepływy na rozdzielaczu"
        }
      ],
      "citation": [
        "https://sklep.pkn.pl/pn-en-12831-1-2017-08e.html",
        "https://sklep.pkn.pl/pn-en-1264-2-2021-10e.html",
        "https://www.iso.org/standard/74683.html",
        "https://www.iso.org/standard/74684.html",
        "https://sklep.pkn.pl/normy/pn-en-12828-a1-2014-05e.html"
      ]
    },
    {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#webpage",
      "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/",
      "name": "Kompleksowy kalkulator ogrzewania podłogowego – rury, pętle, przepływy i hydraulika",
      "description": "Kompleksowy kalkulator ogrzewania podłogowego obliczy rury, pętle, przepływy i zład. Sprawdź pomieszczenia, rozstaw oraz hydraulikę instalacji dla Twojego domu.",
      "dateModified": "2026-08-26",
      "inLanguage": "pl-PL",
      "isPartOf": {
        "@id": "https://projekt-ogrzewania.pl/#website"
      },
      "breadcrumb": {
        "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#breadcrumb"
      },
      "mainEntity": [
        {
          "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#article"
        },
        {
          "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#application"
        },
        {
          "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#faq"
        }
      ]
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#breadcrumb",
      "itemListElement": [
        {
          "@type": "ListItem",
          "position": 1,
          "name": "Strona główna",
          "item": "https://projekt-ogrzewania.pl/"
        },
        {
          "@type": "ListItem",
          "position": 2,
          "name": "Narzędzia i kalkulatory",
          "item": "https://projekt-ogrzewania.pl/category/narzedzia-i-kalkulatory/"
        },
        {
          "@type": "ListItem",
          "position": 3,
          "name": "Kompleksowy kalkulator ogrzewania podłogowego",
          "item": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/"
        }
      ]
    },
    {
      "@type": "WebApplication",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#application",
      "name": "Kompleksowy kalkulator ogrzewania podłogowego",
      "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-tool",
      "description": "Wielopomieszczeniowy kalkulator orientacyjnej długości rur, liczby pętli, rozstawu, przepływów, prędkości wody, strat ciśnienia i pojemności wodnej ogrzewania podłogowego.",
      "applicationCategory": "EducationalApplication",
      "applicationSubCategory": "HVAC calculation tool",
      "operatingSystem": "Dowolny system z nowoczesną przeglądarką internetową",
      "browserRequirements": "JavaScript oraz obsługa standardów HTML5",
      "isAccessibleForFree": true,
      "inLanguage": "pl-PL",
      "author": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "publisher": {
        "@id": "https://projekt-ogrzewania.pl/#organization"
      },
      "featureList": [
        "Obsługa wielu pomieszczeń",
        "Obliczanie wymaganej mocy powierzchniowej",
        "Orientacyjny dobór rozstawu rur",
        "Szacowanie długości rur i liczby pętli",
        "Obliczanie przepływu pomieszczeń i pętli",
        "Obliczanie prędkości wody i liczby Reynoldsa",
        "Szacowanie strat ciśnienia",
        "Obliczanie pojemności wodnej rur"
      ],
      "offers": {
        "@type": "Offer",
        "price": "0",
        "priceCurrency": "PLN"
      }
    },
    {
      "@type": "HowTo",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#howto",
      "name": "Jak poprawnie korzystać z kalkulatora ogrzewania podłogowego",
      "description": "Sześć kroków od obciążenia cieplnego pomieszczeń do weryfikacji pętli, przepływów i przeniesienia wyników na rzut budynku.",
      "inLanguage": "pl-PL",
      "step": [
        {
          "@type": "HowToStep",
          "position": 1,
          "name": "Zdobądź obciążenie pomieszczeń",
          "text": "Najlepiej użyj wyników obliczeń cieplnych. Jeżeli przyjmujesz W/m², potraktuj rezultat wyłącznie jako wariant orientacyjny.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        },
        {
          "@type": "HowToStep",
          "position": 2,
          "name": "Wyznacz czynne pola podłogi",
          "text": "Odejmij stałą zabudowę i powierzchnie, pod którymi nie wolno albo nie ma sensu układać przewodów.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        },
        {
          "@type": "HowToStep",
          "position": 3,
          "name": "Wpisz temperatury i okładziny",
          "text": "Podaj wspólne zasilanie i powrót oraz rzeczywisty opór wykończenia w każdym pomieszczeniu.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        },
        {
          "@type": "HowToStep",
          "position": 4,
          "name": "Sprawdź moc powierzchniową",
          "text": "Jeżeli wymagana moc przekracza możliwości posadzki, nie naprawiaj wyniku samym zagęszczaniem rur — przeanalizuj cały układ.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        },
        {
          "@type": "HowToStep",
          "position": 5,
          "name": "Skontroluj pętle i hydraulikę",
          "text": "Porównaj długości, przepływy, prędkości oraz orientacyjne straty ciśnienia. Zwróć uwagę na obieg najbardziej niekorzystny.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        },
        {
          "@type": "HowToStep",
          "position": 6,
          "name": "Przenieś wynik na rzut",
          "text": "Dopiero rozmieszczenie pętli na planie potwierdzi rzeczywiste dobiegi, podział stref, liczbę sekcji i wykonalność instalacji.",
          "url": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#rk-calc-howto"
        }
      ]
    },
    {
      "@type": "FAQPage",
      "@id": "https://projekt-ogrzewania.pl/kompleksowy-kalkulator-ogrzewania-podlogowego/#faq",
      "inLanguage": "pl-PL",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Czy kalkulator ogrzewania podłogowego zastępuje projekt?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Nie. Kalkulator pokazuje zależności i orientacyjne parametry na podstawie wpisanych danych, ale nie wykonuje pełnych obliczeń przegród, nie rozrysowuje pętli, nie zna oporów całej armatury ani charakterystyki konkretnej pompy. Do wykonania instalacji potrzebny jest projekt dopasowany do rzutu budynku."
          }
        },
        {
          "@type": "Question",
          "name": "Ile metrów rury potrzeba na 1 m² ogrzewania podłogowego?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Teoretycznie około 20 m/m² przy rozstawie 5 cm, 10 m/m² przy 10 cm, 6,67 m/m² przy 15 cm i 5 m/m² przy 20 cm. Do tego trzeba doliczyć łuki, podział pola oraz osobne odcinki zasilania i powrotu każdej pętli."
          }
        },
        {
          "@type": "Question",
          "name": "Jaka jest maksymalna długość pętli podłogówki?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Nie istnieje jedna długość gwarantująca poprawność każdej instalacji. Dla rury 16×2 mm często projektuje się pętle około 80–100 m, ale wynik trzeba sprawdzić na podstawie przepływu, średnicy wewnętrznej, oporów miejscowych i ciśnienia dostępnego z pompy."
          }
        },
        {
          "@type": "Question",
          "name": "Jak kalkulator dobiera rozstaw rur?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Porównuje wymaganą moc z 1 m² czynnej posadzki z orientacyjnymi możliwościami rozstawów 20, 15, 10 i 5 cm przy podanych temperaturach oraz oporze okładziny. Wybiera najszerszy rozstaw spełniający uproszczone kryterium, lecz wynik wymaga weryfikacji dla konkretnego systemu podłogi."
          }
        },
        {
          "@type": "Question",
          "name": "Jak obliczyć przepływ w pętli ogrzewania podłogowego?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Przepływ wynika z mocy przenoszonej przez pętlę oraz różnicy temperatury między zasilaniem a powrotem. Dla wody można użyć zależności V̇ ≈ Φ/(4180×ΔT)×60, otrzymując l/min, a następnie podzielić przepływ pomieszczenia pomiędzy jego obwody."
          }
        },
        {
          "@type": "Question",
          "name": "Czy każda łazienka powinna mieć rury co 10 cm?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Nie automatycznie. Łazienki często wymagają gęstego rozstawu z powodu temperatury projektowej 24°C i małej wolnej powierzchni, ale ostateczna decyzja zależy od strat, temperatury wody, okładziny i dostępnego pola grzewczego."
          }
        },
        {
          "@type": "Question",
          "name": "Czy kalkulator dobierze pompę obiegową?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Kalkulator podaje przepływ całkowity i orientacyjny opór najbardziej wymagającej pętli. Pełny dobór pompy wymaga jeszcze oporów magistrali, rozdzielacza, zaworów, filtrów, źródła ciepła i innych elementów wspólnego obiegu."
          }
        },
        {
          "@type": "Question",
          "name": "Jak obliczana jest pojemność wodna rur?",
          "acceptedAnswer": {
            "@type": "Answer",
            "text": "Pojemność wynika z pola przekroju wewnętrznego przewodu pomnożonego przez jego długość. Dla rury 16×2 mm o średnicy wewnętrznej około 12 mm jest to około 0,113 litra na metr. Całkowity zład instalacji obejmuje również rozdzielacze, magistrale, źródło i ewentualny bufor."
          }
        }
      ]
    },
    {
      "@type": "Person",
      "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/author/admin3399/",
      "image": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp",
        "contentUrl": "https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp",
        "width": 360,
        "height": 360
      },
      "jobTitle": "Projektant instalacji sanitarnych, specjalista HVAC i ogrzewania podłogowego",
      "description": "Projektant wodnych instalacji ogrzewania podłogowego i autor opracowań technicznych dotyczących obliczeń cieplnych, hydrauliki, źródeł ciepła i automatyki. Właściciel serwisów Projekt-Ogrzewania.pl, Remont.biz.pl i Sobir.pl.",
      "knowsAbout": [
        "projektowanie ogrzewania podłogowego",
        "obliczenia obciążenia cieplnego",
        "hydraulika instalacji grzewczych",
        "dobór pomp obiegowych",
        "równoważenie hydrauliczne",
        "pompy ciepła"
      ],
      "sameAs": [
        "https://projekt-ogrzewania.pl/",
        "https://remont.biz.pl/",
        "https://sobir.pl/"
      ],
      "owns": [
        {
          "@id": "https://projekt-ogrzewania.pl/#organization"
        },
        {
          "@id": "https://remont.biz.pl/#organization"
        },
        {
          "@id": "https://sobir.pl/#organization"
        }
      ]
    },
    {
      "@type": "Organization",
      "@id": "https://projekt-ogrzewania.pl/#organization",
      "name": "Projekt Ogrzewania",
      "url": "https://projekt-ogrzewania.pl/",
      "description": "Serwis poświęcony projektowaniu wodnego ogrzewania podłogowego, należący do Roberta Kucharskiego.",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/Projekt-ogrzewania-logo-1.jpg",
        "contentUrl": "https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/Projekt-ogrzewania-logo-1.jpg"
      },
      "founder": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "owner": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      }
    },
    {
      "@type": "Organization",
      "@id": "https://remont.biz.pl/#organization",
      "name": "Remont.biz.pl",
      "url": "https://remont.biz.pl/",
      "description": "Serwis budowlano-remontowy należący do Roberta Kucharskiego.",
      "founder": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "owner": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      }
    },
    {
      "@type": "Organization",
      "@id": "https://sobir.pl/#organization",
      "name": "Sobir.pl",
      "url": "https://sobir.pl/",
      "description": "Portal o budowie, instalacjach i technologii domu należący do Roberta Kucharskiego.",
      "founder": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      },
      "owner": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      }
    },
    {
      "@type": "WebSite",
      "@id": "https://projekt-ogrzewania.pl/#website",
      "url": "https://projekt-ogrzewania.pl/",
      "name": "Projekt Ogrzewania",
      "description": "Projektowanie ogrzewania podłogowego i techniczna wiedza o instalacjach grzewczych.",
      "inLanguage": "pl-PL",
      "publisher": {
        "@id": "https://projekt-ogrzewania.pl/#organization"
      },
      "copyrightHolder": {
        "@id": "https://projekt-ogrzewania.pl/#/schema/person/8f64aaec51c6581f1ab55e3d7f3a82d1"
      }
    }
  ]
}
</script>

<!-- RK_CALC_SCRIPT -->
<script>
(function () {
  "use strict";

  function initializeFloorCalculator() {
    var root = document.getElementById("rk-floor-calc-guide");
    if (!root) {
      return false;
    }
    if (root.getAttribute("data-rk-calc-ready") === "1") {
      return true;
    }

    var form = document.getElementById("rk-calc-form");
    var roomList = document.getElementById("rk-calc-room-list");
    if (!form) {
      return false;
    }
    if (!roomList) {
      return false;
    }

    var roomCounter = roomList.querySelectorAll(".rk-calc-room").length;
    var sampleRooms = [
      { name: "Salon z aneksem", type: "standard", area: 35, active: 30, load: 1400, floor: "0.01", distance: 7, spacing: "auto" },
      { name: "Łazienka", type: "bathroom", area: 8, active: 6, load: 560, floor: "0.01", distance: 6, spacing: "auto" },
      { name: "Sypialnia", type: "standard", area: 15, active: 13, load: 600, floor: "0.07", distance: 9, spacing: "auto" }
    ];

    function byId(id) {
      return document.getElementById(id);
    }

    function clamp(value, minimum, maximum) {
      return Math.min(maximum, Math.max(minimum, value));
    }

    function numberFromElement(element, fallback) {
      if (!element) {
        return fallback;
      }
      var raw = String(element.value).replace(",", ".");
      var parsed = Number(raw);
      return Number.isFinite(parsed) ? parsed : fallback;
    }

    function numberFromId(id, fallback) {
      return numberFromElement(byId(id), fallback);
    }

    function formatNumber(value, digits) {
      return new Intl.NumberFormat("pl-PL", {
        minimumFractionDigits: digits,
        maximumFractionDigits: digits
      }).format(value);
    }

    function polishPlural(value, singular, paucal, plural) {
      var integer = Math.abs(Math.round(value));
      var lastTwo = integer % 100;
      var last = integer % 10;
      if (integer === 1) {
        return singular;
      }
      if (last >= 2) {
        if (last <= 4) {
          if (lastTwo < 12) {
            return paucal;
          }
          if (lastTwo > 14) {
            return paucal;
          }
        }
      }
      return plural;
    }

    function setText(id, value) {
      var element = byId(id);
      if (element) {
        element.textContent = value;
      }
    }

    function getRoomType(type) {
      if (type === "bathroom") {
        return { indoor: 24, maxSurface: 33, label: "Łazienka" };
      }
      if (type === "edge") {
        return { indoor: 21, maxSurface: 35, label: "Strefa brzegowa" };
      }
      return { indoor: 21, maxSurface: 29, label: "Pokój" };
    }

    function capacityForSpacing(spacing, meanWater, indoor, floorResistance) {
      var coefficients = {
        5: 6.3,
        10: 5.7,
        15: 5.0,
        20: 4.3
      };
      var coefficient = coefficients[spacing] || coefficients[15];
      var temperatureDifference = Math.max(0, meanWater - indoor);
      var floorFactor = 1 / (1 + 4 * floorResistance);
      return coefficient * temperatureDifference * floorFactor;
    }

    function chooseSpacing(requiredOutput, meanWater, indoor, floorResistance) {
      var options = [20, 15, 10, 5];
      var chosen = 5;
      options.some(function (spacing) {
        var capacity = capacityForSpacing(spacing, meanWater, indoor, floorResistance);
        if (capacity >= requiredOutput) {
          chosen = spacing;
          return true;
        }
        return false;
      });
      return chosen;
    }

    function frictionFactor(reynolds, diameter) {
      if (reynolds <= 0) {
        return 0;
      }
      if (reynolds < 2300) {
        return 64 / Math.max(1, reynolds);
      }
      var roughness = 0.000007;
      var term = Math.pow(roughness / (3.7 * diameter), 1.11) + 6.9 / reynolds;
      var denominator = -1.8 * Math.log10(term);
      return 1 / Math.pow(denominator, 2);
    }

    function calculateRoom(row, index, settings) {
      var nameInput = row.querySelector(".rk-room-name");
      var typeInput = row.querySelector(".rk-room-type");
      var areaInput = row.querySelector(".rk-room-area");
      var activeInput = row.querySelector(".rk-room-active");
      var loadInput = row.querySelector(".rk-room-load");
      var floorInput = row.querySelector(".rk-room-floor");
      var distanceInput = row.querySelector(".rk-room-distance");
      var spacingInput = row.querySelector(".rk-room-spacing");

      var name = nameInput ? nameInput.value.trim() : "";
      if (!name) {
        name = "Pomieszczenie " + (index + 1);
      }

      var typeValue = typeInput ? typeInput.value : "standard";
      var type = getRoomType(typeValue);
      var area = clamp(numberFromElement(areaInput, 1), 0.1, 200);
      var activeRaw = clamp(numberFromElement(activeInput, area), 0.1, 200);
      var active = Math.min(activeRaw, area);
      var load = clamp(numberFromElement(loadInput, 50), 1, 15000);
      var floorResistance = clamp(numberFromElement(floorInput, 0.01), 0, 0.2);
      var distance = clamp(numberFromElement(distanceInput, 0), 0, 50);
      var spacingValue = spacingInput ? spacingInput.value : "auto";

      var requiredOutput = load / active;
      var spacing = spacingValue === "auto"
        ? chooseSpacing(requiredOutput, settings.meanWater, type.indoor, floorResistance)
        : clamp(Number(spacingValue), 5, 20);
      var availableOutput = capacityForSpacing(spacing, settings.meanWater, type.indoor, floorResistance);
      var availablePower = availableOutput * active;

      var fieldLength = active / (spacing / 100) * settings.geometryFactor;
      var availableFieldPerLoop = settings.targetLength - 2 * distance;
      var loops = 1;
      var geometryImpossible = false;
      if (availableFieldPerLoop > 5) {
        loops = Math.max(1, Math.ceil(fieldLength / availableFieldPerLoop));
      } else {
        loops = Math.max(1, Math.ceil(fieldLength / Math.max(5, settings.targetLength * 0.55)));
        geometryImpossible = true;
      }
      if (loops > 24) {
        loops = 24;
        geometryImpossible = true;
      }

      var connectionLength = 2 * distance * loops;
      var totalLength = fieldLength + connectionLength;
      var averageLoopLength = totalLength / loops;
      var roomFlow = load / (4180 * settings.deltaT) * 60;
      var loopFlow = roomFlow / loops;
      var volumetricFlow = loopFlow / 1000 / 60;
      var pipeArea = Math.PI * Math.pow(settings.pipeDiameter, 2) / 4;
      var velocity = pipeArea > 0 ? volumetricFlow / pipeArea : 0;
      var reynolds = settings.density * velocity * settings.pipeDiameter / settings.viscosity;
      var factor = frictionFactor(reynolds, settings.pipeDiameter);
      var pressurePa = factor * averageLoopLength / settings.pipeDiameter * settings.density * Math.pow(velocity, 2) / 2;
      var pressureKpa = pressurePa * 1.2 / 1000;
      var volume = totalLength * pipeArea * 1000;
      var deliveredOutput = Math.min(requiredOutput, availableOutput);
      var surfaceTemperature = type.indoor + deliveredOutput / 10.8;

      var thermalStatus = "Wstępnie OK";
      var hydraulicStatus = "Wstępnie OK";
      var errors = [];
      var warnings = [];

      if (activeRaw > area) {
        errors.push(name + ": powierzchnia grzewcza jest większa od powierzchni pomieszczenia");
      }
      if (availablePower + 1 < load) {
        thermalStatus = "Niedobór mocy";
        errors.push(name + ": wybrany rozstaw i temperatury nie pokrywają wpisanej straty");
      }
      if (surfaceTemperature > type.maxSurface) {
        thermalStatus = "Sprawdź temperaturę";
        errors.push(name + ": szacowana temperatura powierzchni przekracza przyjęty limit strefy");
      }
      if (geometryImpossible) {
        hydraulicStatus = "Do korekty";
        errors.push(name + ": odległość od rozdzielacza lub geometria uniemożliwia docelową długość pętli");
      }
      if (averageLoopLength > settings.targetLength + 0.5) {
        hydraulicStatus = "Do korekty";
        errors.push(name + ": średnia długość pętli przekracza ustawiony cel");
      }
      if (pressureKpa > 20) {
        hydraulicStatus = "Do korekty";
        errors.push(name + ": orientacyjny opór pętli przekracza 20 kPa");
      } else if (pressureKpa > 15) {
        hydraulicStatus = "Sprawdź";
        warnings.push(name + ": orientacyjny opór pętli przekracza 15 kPa");
      }
      if (velocity > 0.6) {
        hydraulicStatus = "Do korekty";
        errors.push(name + ": prędkość w rurze przekracza 0,60 m/s");
      } else if (velocity < 0.1) {
        if (hydraulicStatus === "Wstępnie OK") {
          hydraulicStatus = "Sprawdź";
        }
        warnings.push(name + ": bardzo mała prędkość wymaga sprawdzenia regulacji i odpowietrzania");
      } else if (velocity < 0.15) {
        if (hydraulicStatus === "Wstępnie OK") {
          hydraulicStatus = "Sprawdź";
        }
        warnings.push(name + ": prędkość jest niższa od typowego zakresu kontrolnego");
      }

      return {
        name: name,
        type: type,
        area: area,
        active: active,
        load: load,
        floorResistance: floorResistance,
        distance: distance,
        spacing: spacing,
        requiredOutput: requiredOutput,
        availableOutput: availableOutput,
        availablePower: availablePower,
        fieldLength: fieldLength,
        connectionLength: connectionLength,
        totalLength: totalLength,
        loops: loops,
        averageLoopLength: averageLoopLength,
        roomFlow: roomFlow,
        loopFlow: loopFlow,
        velocity: velocity,
        reynolds: reynolds,
        pressureKpa: pressureKpa,
        volume: volume,
        surfaceTemperature: surfaceTemperature,
        thermalStatus: thermalStatus,
        hydraulicStatus: hydraulicStatus,
        errors: errors,
        warnings: warnings
      };
    }

    function makeCell(label, value, emphasize) {
      var cell = document.createElement("td");
      cell.setAttribute("data-label", label);
      if (emphasize) {
        var strong = document.createElement("strong");
        strong.textContent = value;
        cell.appendChild(strong);
      } else {
        cell.textContent = value;
      }
      return cell;
    }

    function appendRow(body, cells) {
      var row = document.createElement("tr");
      cells.forEach(function (cell) {
        row.appendChild(cell);
      });
      body.appendChild(row);
    }

    function renderTables(results, settings) {
      var thermalBody = byId("rk-calc-thermal-body");
      var geometryBody = byId("rk-calc-geometry-body");
      var hydraulicBody = byId("rk-calc-hydraulic-body");
      if (!thermalBody) {
        return;
      }
      if (!geometryBody) {
        return;
      }
      if (!hydraulicBody) {
        return;
      }

      thermalBody.textContent = "";
      geometryBody.textContent = "";
      hydraulicBody.textContent = "";

      results.forEach(function (result) {
        appendRow(thermalBody, [
          makeCell("Pomieszczenie", result.name, true),
          makeCell("Strata", formatNumber(result.load, 0) + " W"),
          makeCell("Pow. czynna", formatNumber(result.active, 1) + " m²"),
          makeCell("Wymagane q", formatNumber(result.requiredOutput, 1) + " W/m²"),
          makeCell("Rozstaw", formatNumber(result.spacing, 0) + " cm"),
          makeCell("Szac. możliwości", formatNumber(result.availableOutput, 1) + " W/m²"),
          makeCell("Temp. powierzchni", formatNumber(result.surfaceTemperature, 1) + "°C"),
          makeCell("Ocena", result.thermalStatus, true)
        ]);

        appendRow(geometryBody, [
          makeCell("Pomieszczenie", result.name, true),
          makeCell("Rozstaw", formatNumber(result.spacing, 0) + " cm"),
          makeCell("Długość pola", formatNumber(result.fieldLength, 1) + " m"),
          makeCell("Dobiegi", formatNumber(result.connectionLength, 1) + " m"),
          makeCell("Rura łącznie", formatNumber(result.totalLength, 1) + " m"),
          makeCell("Pętle", formatNumber(result.loops, 0)),
          makeCell("Śr. pętla", formatNumber(result.averageLoopLength, 1) + " m"),
          makeCell("Zład rur", formatNumber(result.volume, 1) + " l")
        ]);

        appendRow(hydraulicBody, [
          makeCell("Pomieszczenie", result.name, true),
          makeCell("Przepływ pom.", formatNumber(result.roomFlow, 2) + " l/min"),
          makeCell("Przepływ pętli", formatNumber(result.loopFlow, 2) + " l/min"),
          makeCell("Prędkość", formatNumber(result.velocity, 3) + " m/s"),
          makeCell("Re", formatNumber(result.reynolds, 0)),
          makeCell("Opór pętli", formatNumber(result.pressureKpa, 1) + " kPa"),
          makeCell("ΔT", formatNumber(settings.deltaT, 1) + " K"),
          makeCell("Ocena", result.hydraulicStatus, true)
        ]);
      });
    }

    function renderBars(results) {
      var bars = byId("rk-calc-bars");
      if (!bars) {
        return;
      }
      bars.textContent = "";
      var maximum = 1;
      results.forEach(function (result) {
        maximum = Math.max(maximum, result.requiredOutput);
      });

      results.forEach(function (result) {
        var row = document.createElement("div");
        row.className = "rk-calc-bar-row";

        var name = document.createElement("div");
        name.className = "rk-calc-bar-name";
        name.textContent = result.name;

        var track = document.createElement("div");
        track.className = "rk-calc-bar-track";
        var fill = document.createElement("div");
        fill.className = "rk-calc-bar-fill";
        fill.style.width = clamp(result.requiredOutput / maximum * 100, 0, 100).toFixed(2) + "%";
        if (result.thermalStatus !== "Wstępnie OK") {
          fill.style.background = "linear-gradient(90deg, #ff7438, #e34837)";
        }
        track.appendChild(fill);

        var value = document.createElement("div");
        value.className = "rk-calc-bar-value";
        value.textContent = formatNumber(result.requiredOutput, 1) + " W/m²";

        row.appendChild(name);
        row.appendChild(track);
        row.appendChild(value);
        bars.appendChild(row);
      });
    }

    function updateStatus(errors, warnings, settings) {
      var status = byId("rk-calc-status");
      if (!status) {
        return;
      }

      var title = "Wstępne kryteria kalkulatora są spełnione";
      var copy = "Wynik nadal wymaga przeniesienia na rzut oraz sprawdzenia pełnego obiegu hydraulicznego.";
      var className = "rk-calc-status";

      if (settings.globalError) {
        className += " is-danger";
        title = "Temperatura powrotu musi być niższa od temperatury zasilania";
        copy = "Na potrzeby obliczenia przyjęto zastępcze ΔT = 1 K. Popraw temperatury wspólne, aby uzyskać użyteczny wynik.";
      } else if (errors.length > 0) {
        className += " is-danger";
        title = formatNumber(errors.length, 0) + " " + polishPlural(errors.length, "element wymaga", "elementy wymagają", "elementów wymaga") + " korekty";
        copy = errors.slice(0, 3).join(" • ");
        if (errors.length > 3) {
          copy += " • oraz " + formatNumber(errors.length - 3, 0) + " kolejne";
        }
      } else if (warnings.length > 0) {
        className += " is-warning";
        title = formatNumber(warnings.length, 0) + " " + polishPlural(warnings.length, "parametr wymaga", "parametry wymagają", "parametrów wymaga") + " sprawdzenia";
        copy = warnings.slice(0, 3).join(" • ");
        if (warnings.length > 3) {
          copy += " • oraz " + formatNumber(warnings.length - 3, 0) + " kolejne";
        }
      }

      status.className = className;
      setText("rk-calc-status-title", title);
      setText("rk-calc-status-copy", copy);
    }

    function calculate() {
      var supply = numberFromId("rk-calc-supply", 35);
      var returnTemperature = numberFromId("rk-calc-return", 28);
      var pipeDiameter = numberFromId("rk-calc-pipe", 0.012);
      var targetLength = numberFromId("rk-calc-loop-target", 90);
      var geometryFactor = numberFromId("rk-calc-geometry-factor", 1.05);
      var rawDeltaT = supply - returnTemperature;
      var globalError = rawDeltaT <= 0;
      var deltaT = globalError ? 1 : rawDeltaT;

      var settings = {
        supply: supply,
        returnTemperature: returnTemperature,
        meanWater: (supply + returnTemperature) / 2,
        pipeDiameter: pipeDiameter,
        targetLength: targetLength,
        geometryFactor: geometryFactor,
        deltaT: deltaT,
        density: 995,
        viscosity: 0.0008,
        globalError: globalError
      };

      var rows = Array.prototype.slice.call(roomList.querySelectorAll(".rk-calc-room"));
      var results = rows.map(function (row, index) {
        return calculateRoom(row, index, settings);
      });

      var totals = results.reduce(function (accumulator, result) {
        accumulator.load += result.load;
        accumulator.area += result.area;
        accumulator.active += result.active;
        accumulator.pipe += result.totalLength;
        accumulator.loops += result.loops;
        accumulator.flow += result.roomFlow;
        accumulator.volume += result.volume;
        accumulator.maxPressure = Math.max(accumulator.maxPressure, result.pressureKpa);
        accumulator.errors = accumulator.errors.concat(result.errors);
        accumulator.warnings = accumulator.warnings.concat(result.warnings);
        return accumulator;
      }, {
        load: 0,
        area: 0,
        active: 0,
        pipe: 0,
        loops: 0,
        flow: 0,
        volume: 0,
        maxPressure: 0,
        errors: [],
        warnings: []
      });

      setText("rk-result-load", formatNumber(totals.load, 0) + " W");
      setText("rk-result-pipe", formatNumber(totals.pipe, 0) + " m");
      setText("rk-result-loops", formatNumber(totals.loops, 0));
      setText("rk-result-flow", formatNumber(totals.flow * 0.06, 2) + " m³/h");
      setText("rk-result-area", formatNumber(totals.area, 1) + " m²");
      setText("rk-result-active", formatNumber(totals.active, 1) + " m²");
      setText("rk-result-volume", formatNumber(totals.volume, 1) + " l");
      setText("rk-result-pressure", formatNumber(totals.maxPressure, 1) + " kPa");

      renderTables(results, settings);
      renderBars(results);
      updateStatus(totals.errors, totals.warnings, settings);
      updateRoomIndexes();
    }

    function roomMarkup() {
      return [
        '<span class="rk-calc-room-index">01</span>',
        '<div class="rk-calc-field"><label>Nazwa</label><input class="rk-room-name" type="text" value="" maxlength="50"></div>',
        '<div class="rk-calc-field"><label>Typ strefy</label><select class="rk-room-type"><option value="standard">Pokój 20–21°C</option><option value="bathroom">Łazienka 24°C</option><option value="edge">Strefa brzegowa</option></select></div>',
        '<div class="rk-calc-field"><label>Powierzchnia</label><input class="rk-room-area" type="number" min="1" max="200" step="0.1" value="12"><small>m²</small></div>',
        '<div class="rk-calc-field"><label>Pow. grzewcza</label><input class="rk-room-active" type="number" min="0.5" max="200" step="0.1" value="10"><small>m²</small></div>',
        '<div class="rk-calc-field"><label>Strata cieplna</label><input class="rk-room-load" type="number" min="50" max="15000" step="10" value="500"><small>W</small></div>',
        '<div class="rk-calc-field"><label>Okładzina</label><select class="rk-room-floor"><option value="0.01">Płytki R=0,01</option><option value="0.03">Winyl R=0,03</option><option value="0.07">Panel R=0,07</option><option value="0.10">Drewno R=0,10</option><option value="0.15">Dywan R=0,15</option></select></div>',
        '<div class="rk-calc-field"><label>Odległość</label><input class="rk-room-distance" type="number" min="0" max="50" step="0.5" value="6"><small>m do rozdzielacza</small></div>',
        '<div class="rk-calc-field"><label>Rozstaw</label><select class="rk-room-spacing"><option value="auto">Dobierz orientacyjnie</option><option value="5">5 cm</option><option value="10">10 cm</option><option value="15">15 cm</option><option value="20">20 cm</option></select></div>',
        '<button class="rk-calc-room-remove" type="button" aria-label="Usuń pomieszczenie">×</button>'
      ].join("");
    }

    function setRoomData(row, data) {
      row.querySelector(".rk-room-name").value = data.name;
      row.querySelector(".rk-room-type").value = data.type;
      row.querySelector(".rk-room-area").value = data.area;
      row.querySelector(".rk-room-active").value = data.active;
      row.querySelector(".rk-room-load").value = data.load;
      row.querySelector(".rk-room-floor").value = data.floor;
      row.querySelector(".rk-room-distance").value = data.distance;
      row.querySelector(".rk-room-spacing").value = data.spacing;
    }

    function createRoom(data) {
      roomCounter += 1;
      var row = document.createElement("div");
      row.className = "rk-calc-room";
      row.setAttribute("data-room-id", String(roomCounter));
      row.innerHTML = roomMarkup();
      setRoomData(row, data || {
        name: "Nowe pomieszczenie",
        type: "standard",
        area: 12,
        active: 10,
        load: 500,
        floor: "0.07",
        distance: 6,
        spacing: "auto"
      });
      roomList.appendChild(row);
      updateRoomIndexes();
      return row;
    }

    function updateRoomIndexes() {
      var rooms = roomList.querySelectorAll(".rk-calc-room");
      rooms.forEach(function (room, index) {
        var badge = room.querySelector(".rk-calc-room-index");
        var remove = room.querySelector(".rk-calc-room-remove");
        if (badge) {
          badge.textContent = String(index + 1).padStart(2, "0");
        }
        if (remove) {
          remove.disabled = rooms.length === 1;
          remove.setAttribute("aria-disabled", rooms.length === 1 ? "true" : "false");
        }
      });
    }

    function restoreSample() {
      roomList.textContent = "";
      roomCounter = 0;
      sampleRooms.forEach(function (data) {
        createRoom(data);
      });
      byId("rk-calc-supply").value = "35";
      byId("rk-calc-return").value = "28";
      byId("rk-calc-pipe").value = "0.012";
      byId("rk-calc-loop-target").value = "90";
      byId("rk-calc-geometry-factor").value = "1.05";
      calculate();
    }

    form.addEventListener("submit", function (event) {
      event.preventDefault();
      calculate();
      var results = byId("rk-calc-results");
      if (results) {
        var reducedMotion = false;
        if (window.matchMedia) {
          reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
        }
        results.scrollIntoView({
          behavior: reducedMotion ? "auto" : "smooth",
          block: "start"
        });
      }
    });

    form.addEventListener("input", function () {
      calculate();
    });

    form.addEventListener("change", function () {
      calculate();
    });

    var addRoomButton = byId("rk-calc-add-room");
    if (addRoomButton) {
      addRoomButton.addEventListener("click", function () {
        var count = roomList.querySelectorAll(".rk-calc-room").length;
        if (count >= 20) {
          return;
        }
        var row = createRoom();
        calculate();
        var firstInput = row.querySelector("input");
        if (firstInput) {
          firstInput.focus();
          firstInput.select();
        }
      });
    }

    var resetButton = byId("rk-calc-reset");
    if (resetButton) {
      resetButton.addEventListener("click", restoreSample);
    }

    roomList.addEventListener("click", function (event) {
      var target = event.target;
      if (!target) {
        return;
      }
      var removeButton = target.closest(".rk-calc-room-remove");
      if (!removeButton) {
        return;
      }
      var rooms = roomList.querySelectorAll(".rk-calc-room");
      if (rooms.length <= 1) {
        return;
      }
      var row = removeButton.closest(".rk-calc-room");
      if (row) {
        row.remove();
        calculate();
      }
    });

    var tabs = root.querySelectorAll(".rk-calc-tab[data-tab]");
    tabs.forEach(function (tab) {
      tab.addEventListener("click", function () {
        var tabName = tab.getAttribute("data-tab");
        tabs.forEach(function (item) {
          var active = item === tab;
          item.classList.toggle("is-active", active);
          item.setAttribute("aria-selected", active ? "true" : "false");
        });
        var panels = root.querySelectorAll(".rk-calc-tab-panel[data-panel]");
        panels.forEach(function (panel) {
          panel.classList.toggle("is-active", panel.getAttribute("data-panel") === tabName);
        });
      });
    });

    var navigationLinks = root.querySelectorAll(".rk-calc-nav a[href^='#']");
    navigationLinks.forEach(function (link) {
      link.addEventListener("click", function (event) {
        var targetId = link.getAttribute("href");
        if (!targetId) {
          return;
        }
        var target = root.querySelector(targetId);
        if (!target) {
          return;
        }
        event.preventDefault();
        var reducedMotion = false;
        if (window.matchMedia) {
          reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
        }
        target.scrollIntoView({
          behavior: reducedMotion ? "auto" : "smooth",
          block: "start"
        });
        if (window.history) {
          if (window.history.replaceState) {
            window.history.replaceState(null, "", targetId);
          }
        }
      });
    });

    var progress = root.querySelector(".rk-calc-progress");
    function updateProgress() {
      if (!progress) {
        return;
      }
      var rectangle = root.getBoundingClientRect();
      var available = root.offsetHeight - window.innerHeight;
      var passed = -rectangle.top;
      var ratio = available > 0 ? clamp(passed / available, 0, 1) : 0;
      progress.style.width = ratio * 100 + "%";
    }

    window.addEventListener("scroll", updateProgress, { passive: true });
    window.addEventListener("resize", updateProgress);
    updateRoomIndexes();
    calculate();
    updateProgress();
    root.setAttribute("data-rk-calc-ready", "1");
    return true;
  }

  function attemptFloorCalculatorInitialization() {
    initializeFloorCalculator();
  }

  if (document.readyState === "loading") {
    document.addEventListener("DOMContentLoaded", attemptFloorCalculatorInitialization);
  } else {
    attemptFloorCalculatorInitialization();
  }

  window.addEventListener("load", attemptFloorCalculatorInitialization);
  window.setTimeout(attemptFloorCalculatorInitialization, 250);
  window.setTimeout(attemptFloorCalculatorInitialization, 1200);
  window.setTimeout(attemptFloorCalculatorInitialization, 3000);

  if (window.MutationObserver) {
    var observer = new MutationObserver(function () {
      var root = document.getElementById("rk-floor-calc-guide");
      if (root) {
        initializeFloorCalculator();
        if (root.getAttribute("data-rk-calc-ready") === "1") {
          observer.disconnect();
        }
      }
    });
    observer.observe(document.documentElement, { childList: true, subtree: true });
  }
}());
</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>
