<?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 ogrzewanie - Projekt Ogrzewania</title>
	<atom:link href="https://projekt-ogrzewania.pl/tag/ogrzewanie/feed/" rel="self" type="application/rss+xml" />
	<link>https://projekt-ogrzewania.pl/tag/ogrzewanie/</link>
	<description>Twój partner w projektowaniu komfortu – profesjonalne ogrzewanie podłogowe dla Twojego domu.</description>
	<lastBuildDate>Mon, 31 Aug 2026 19:54:40 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://projekt-ogrzewania.pl/wp-content/uploads/2024/09/cropped-Projekt-ogrzewania-logo-1-32x32.jpg</url>
	<title>Archiwa ogrzewanie - Projekt Ogrzewania</title>
	<link>https://projekt-ogrzewania.pl/tag/ogrzewanie/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Salon ile pętli podłogówki? Kalkulator długości rur i przepływu.</title>
		<link>https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/</link>
					<comments>https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#comments</comments>
		
		<dc:creator><![CDATA[Robert Kucharski]]></dc:creator>
		<pubDate>Wed, 12 Feb 2025 10:31:08 +0000</pubDate>
				<category><![CDATA[Instalacje grzewcze]]></category>
		<category><![CDATA[Niskotemperaturowe systemy grzewcze]]></category>
		<category><![CDATA[Nowoczesne systemy grzewcze]]></category>
		<category><![CDATA[Ogrzewanie podłogowe]]></category>
		<category><![CDATA[Poradniki budowlane]]></category>
		<category><![CDATA[Poradniki instalacyjne]]></category>
		<category><![CDATA[Porady ekspertów]]></category>
		<category><![CDATA[Rozstaw pętli]]></category>
		<category><![CDATA[Rozstaw rur ogrzewania]]></category>
		<category><![CDATA[Rozstaw rur podłogówki]]></category>
		<category><![CDATA[Rozstaw rur w podłogówce]]></category>
		<category><![CDATA[Salon]]></category>
		<category><![CDATA[Systemy grzewcze]]></category>
		<category><![CDATA[budowa]]></category>
		<category><![CDATA[efektywność energetyczna]]></category>
		<category><![CDATA[instalacje]]></category>
		<category><![CDATA[ogrzewanie]]></category>
		<category><![CDATA[ogrzewanie podłogowe]]></category>
		<category><![CDATA[pętle grzewcze]]></category>
		<category><![CDATA[podłogówka]]></category>
		<category><![CDATA[poradnik]]></category>
		<category><![CDATA[remont]]></category>
		<category><![CDATA[salon]]></category>
		<guid isPermaLink="false">https://projekt-ogrzewania.pl/?p=2173</guid>

					<description><![CDATA[<p>Planujesz ogrzewanie podłogowe w salonie i zastanawiasz się, ile pętli podłogówki będzie optymalne dla Twojej przestrzeni? W tym artykule znajdziesz szczegółowe wyliczenia dla salonów o powierzchni od 20 m² do 50 m², uwzględniające rozstaw rur, długość pętli oraz praktyczne wskazówki. Dowiesz się, jak rozplanować pętle grzewcze, aby zapewnić równomierne nagrzewanie podłogi i efektywność systemu. Sprawdź, jak dostosować liczbę pętli do swojego metrażu i uniknąć typowych błędów!</p>
<p>Artykuł <a href="https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/">Salon ile pętli podłogówki? Kalkulator długości rur i przepływu.</a> pochodzi z serwisu <a href="https://projekt-ogrzewania.pl">Projekt Ogrzewania</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<style>
  #rk-salon-guide {
    --rk-dark: #102536;
    --rk-navy: #14384d;
    --rk-blue: #078fbe;
    --rk-cyan: #25c7d8;
    --rk-cyan-soft: #e8fbff;
    --rk-orange: #ff6a3d;
    --rk-orange-soft: #fff1eb;
    --rk-green: #16836b;
    --rk-green-soft: #eaf8f3;
    --rk-yellow: #d89c19;
    --rk-yellow-soft: #fff8df;
    --rk-red: #d94b3d;
    --rk-red-soft: #fff0ee;
    --rk-purple: #695ac9;
    --rk-purple-soft: #f1efff;
    --rk-ink: #1f2c37;
    --rk-text: #475967;
    --rk-muted: #6b7e8a;
    --rk-line: #d5e4eb;
    --rk-soft: #f4f9fb;
    --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.75;
  }

  #rk-salon-guide,
  #rk-salon-guide * { box-sizing: border-box; }
  #rk-salon-guide img,
  #rk-salon-guide svg,
  #rk-salon-guide canvas { max-width: 100%; }
  #rk-salon-guide button,
  #rk-salon-guide input,
  #rk-salon-guide select,
  #rk-salon-guide label,
  #rk-salon-guide summary,
  #rk-salon-guide a { font: inherit; -webkit-tap-highlight-color: transparent; }
  #rk-salon-guide button,
  #rk-salon-guide input,
  #rk-salon-guide select { max-width: 100%; }
  #rk-salon-guide a {
    color: var(--rk-blue);
    font-weight: 780;
    text-decoration-thickness: 1px;
    text-underline-offset: 3px;
  }
  #rk-salon-guide a:hover,
  #rk-salon-guide a:focus-visible { color: var(--rk-red); }
  #rk-salon-guide p,
  #rk-salon-guide ul,
  #rk-salon-guide ol { margin-top: 0; margin-bottom: 1.08em; }
  #rk-salon-guide h2,
  #rk-salon-guide h3,
  #rk-salon-guide h4 {
    margin-top: 0;
    color: var(--rk-dark);
    font-weight: 920;
    letter-spacing: -.035em;
    line-height: 1.15;
  }
  #rk-salon-guide h2 { margin-bottom: 18px; font-size: clamp(1.72rem, 4vw, 2.68rem); }
  #rk-salon-guide h3 { margin-bottom: 11px; font-size: clamp(1.12rem, 2.35vw, 1.46rem); }
  #rk-salon-guide h4 { margin-bottom: 8px; font-size: 1.02rem; }
  #rk-salon-guide strong { color: var(--rk-dark); }

  #rk-salon-guide .rk-salon-progress {
    position: fixed;
    z-index: 9999;
    top: 0;
    left: 0;
    width: 0;
    height: 4px;
    background: linear-gradient(90deg, var(--rk-cyan), var(--rk-orange));
    box-shadow: 0 0 12px rgba(37, 199, 216, .5);
    pointer-events: none;
  }

  #rk-salon-guide .rk-salon-shell {
    overflow: hidden;
    border: 1px solid var(--rk-line);
    border-radius: 26px;
    background: var(--rk-white);
    box-shadow: 0 24px 70px rgba(16, 37, 54, .11);
  }

  #rk-salon-guide .rk-salon-hero {
    position: relative;
    overflow: hidden;
    padding: clamp(38px, 7vw, 78px) clamp(25px, 6vw, 76px) 42px;
    color: var(--rk-white);
    background:
      radial-gradient(circle at 91% 4%, rgba(37, 199, 216, .32), transparent 28%),
      radial-gradient(circle at 6% 95%, rgba(255, 106, 61, .22), transparent 27%),
      linear-gradient(135deg, #0d2332 0%, #143e53 58%, #0b6680 100%);
  }
  #rk-salon-guide .rk-salon-hero::after {
    position: absolute;
    right: -70px;
    bottom: -115px;
    width: 340px;
    height: 340px;
    border: 44px solid rgba(255, 255, 255, .055);
    border-radius: 50%;
    content: "";
  }
  #rk-salon-guide .rk-salon-kicker {
    display: inline-flex;
    align-items: center;
    gap: 9px;
    margin-bottom: 15px;
    color: #78efff;
    font-size: .69rem;
    font-weight: 950;
    letter-spacing: .09em;
    line-height: 1.2;
    text-transform: uppercase;
  }
  #rk-salon-guide .rk-salon-kicker::before {
    width: 9px;
    height: 9px;
    border-radius: 50%;
    background: var(--rk-orange);
    box-shadow: 0 0 0 6px rgba(255, 106, 61, .14);
    content: "";
  }
  #rk-salon-guide .rk-salon-hero-title {
    position: relative;
    z-index: 1;
    max-width: 940px;
    margin: 0 0 19px;
    color: var(--rk-white);
    font-size: clamp(2.05rem, 5.4vw, 4.35rem);
    font-weight: 950;
    letter-spacing: -.055em;
    line-height: 1.01;
  }
  #rk-salon-guide .rk-salon-hero-title span { color: #78efff; }
  #rk-salon-guide .rk-salon-lead {
    position: relative;
    z-index: 1;
    max-width: 880px;
    margin-bottom: 25px;
    color: #d8e9ef;
    font-size: clamp(1.02rem, 2vw, 1.24rem);
    line-height: 1.68;
  }
  #rk-salon-guide .rk-salon-hero-tags {
    position: relative;
    z-index: 1;
    display: flex;
    flex-wrap: wrap;
    gap: 9px;
    margin-bottom: 28px;
  }
  #rk-salon-guide .rk-salon-hero-tag {
    display: inline-flex;
    align-items: center;
    min-height: 38px;
    padding: 8px 13px;
    border: 1px solid rgba(255, 255, 255, .18);
    border-radius: 999px;
    color: #eefcff;
    background: rgba(255, 255, 255, .075);
    font-size: .72rem;
    font-weight: 850;
    line-height: 1.3;
  }
  #rk-salon-guide .rk-salon-byline {
    position: relative;
    z-index: 1;
    display: flex;
    flex-wrap: wrap;
    gap: 8px 18px;
    color: #bad3dc;
    font-size: .72rem;
    font-weight: 720;
  }
  #rk-salon-guide .rk-salon-byline strong { color: var(--rk-white); }
  #rk-salon-guide .rk-salon-hero-metrics {
    position: relative;
    z-index: 1;
    display: grid;
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 12px;
    margin-top: 34px;
  }
  #rk-salon-guide .rk-salon-hero-metric {
    padding: 17px 18px;
    border: 1px solid rgba(255, 255, 255, .14);
    border-radius: 16px;
    background: rgba(5, 24, 36, .28);
    backdrop-filter: blur(6px);
  }
  #rk-salon-guide .rk-salon-hero-metric b {
    display: block;
    margin-bottom: 4px;
    color: #7af0ff;
    font-size: 1.04rem;
    font-weight: 950;
  }
  #rk-salon-guide .rk-salon-hero-metric span {
    display: block;
    color: #d5e7ec;
    font-size: .7rem;
    line-height: 1.45;
  }

  #rk-salon-guide .rk-salon-nav {
    position: sticky;
    z-index: 20;
    top: 0;
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    align-items: center;
    gap: 10px;
    padding: 11px clamp(14px, 3vw, 28px);
    border-bottom: 1px solid var(--rk-line);
    background: rgba(255, 255, 255, .97);
    box-shadow: 0 8px 24px rgba(16, 37, 54, .07);
    backdrop-filter: blur(10px);
  }
  #rk-salon-guide .rk-salon-nav-label {
    color: var(--rk-dark);
    font-size: .62rem;
    font-weight: 950;
    letter-spacing: .06em;
    text-transform: uppercase;
    white-space: nowrap;
  }
  #rk-salon-guide .rk-salon-nav-track {
    display: flex;
    gap: 7px;
    overflow-x: auto;
    padding: 2px 2px 5px;
    scrollbar-color: var(--rk-cyan) var(--rk-soft);
    scrollbar-width: thin;
  }
  #rk-salon-guide .rk-salon-nav-track a {
    flex: 0 0 auto;
    padding: 7px 11px;
    border-radius: 999px;
    color: var(--rk-navy);
    background: var(--rk-soft);
    font-size: .64rem;
    font-weight: 900;
    line-height: 1.2;
    text-decoration: none;
    white-space: nowrap;
  }
  #rk-salon-guide .rk-salon-nav-track a:hover,
  #rk-salon-guide .rk-salon-nav-track a:focus-visible { color: var(--rk-white); background: var(--rk-blue); }

  #rk-salon-guide .rk-salon-content { padding: clamp(26px, 5.5vw, 64px); }
  #rk-salon-guide .rk-salon-section {
    margin-bottom: clamp(48px, 8vw, 86px);
    scroll-margin-top: 88px;
  }
  #rk-salon-guide .rk-salon-section:last-child { margin-bottom: 0; }
  #rk-salon-guide .rk-salon-section-head { max-width: 900px; margin-bottom: 24px; }
  #rk-salon-guide .rk-salon-section-head > p:last-child { margin-bottom: 0; color: var(--rk-text); font-size: 1.02rem; }
  #rk-salon-guide .rk-salon-eyebrow {
    display: block;
    margin-bottom: 9px;
    color: var(--rk-blue);
    font-size: .67rem;
    font-weight: 950;
    letter-spacing: .08em;
    text-transform: uppercase;
  }
  #rk-salon-guide .rk-salon-grid-2,
  #rk-salon-guide .rk-salon-grid-3,
  #rk-salon-guide .rk-salon-grid-4 { display: grid; gap: 18px; }
  #rk-salon-guide .rk-salon-grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  #rk-salon-guide .rk-salon-grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  #rk-salon-guide .rk-salon-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  #rk-salon-guide .rk-salon-card {
    padding: clamp(21px, 3.5vw, 31px);
    border: 1px solid var(--rk-line);
    border-radius: 18px;
    background: var(--rk-white);
    box-shadow: 0 10px 28px rgba(16, 37, 54, .065);
  }
  #rk-salon-guide .rk-salon-card p:last-child,
  #rk-salon-guide .rk-salon-card ul:last-child,
  #rk-salon-guide .rk-salon-card ol:last-child { margin-bottom: 0; }
  #rk-salon-guide .rk-salon-card-accent { border-top: 5px solid var(--rk-cyan); }
  #rk-salon-guide .rk-salon-card-orange { border-top: 5px solid var(--rk-orange); }
  #rk-salon-guide .rk-salon-card-green { border-top: 5px solid var(--rk-green); }
  #rk-salon-guide .rk-salon-card-purple { border-top: 5px solid var(--rk-purple); }
  #rk-salon-guide .rk-salon-number {
    display: grid;
    place-items: center;
    width: 42px;
    height: 42px;
    margin-bottom: 15px;
    border-radius: 13px;
    color: var(--rk-white);
    background: var(--rk-blue);
    font-size: .85rem;
    font-weight: 950;
  }
  #rk-salon-guide .rk-salon-answer {
    position: relative;
    overflow: hidden;
    padding: clamp(27px, 5vw, 45px);
    border-radius: 22px;
    color: var(--rk-white);
    background: linear-gradient(135deg, var(--rk-dark), #18516a);
  }
  #rk-salon-guide .rk-salon-answer::after {
    position: absolute;
    right: -72px;
    bottom: -86px;
    width: 225px;
    height: 225px;
    border: 32px solid rgba(255,255,255,.05);
    border-radius: 50%;
    content: "";
  }
  #rk-salon-guide .rk-salon-answer h3 { position: relative; z-index: 1; color: var(--rk-white); }
  #rk-salon-guide .rk-salon-answer p { position: relative; z-index: 1; color: #d9ebf0; }
  #rk-salon-guide .rk-salon-answer p:last-child { margin-bottom: 0; }
  #rk-salon-guide .rk-salon-answer strong { color: #7af0ff; }
  #rk-salon-guide .rk-salon-note,
  #rk-salon-guide .rk-salon-warning,
  #rk-salon-guide .rk-salon-good {
    padding: 19px 21px;
    border-left: 5px solid;
    border-radius: 0 14px 14px 0;
  }
  #rk-salon-guide .rk-salon-note { border-color: var(--rk-blue); background: var(--rk-cyan-soft); }
  #rk-salon-guide .rk-salon-warning { border-color: var(--rk-orange); background: var(--rk-orange-soft); }
  #rk-salon-guide .rk-salon-good { border-color: var(--rk-green); background: var(--rk-green-soft); }
  #rk-salon-guide .rk-salon-note p:last-child,
  #rk-salon-guide .rk-salon-warning p:last-child,
  #rk-salon-guide .rk-salon-good p:last-child { margin-bottom: 0; }
  #rk-salon-guide .rk-salon-formula {
    overflow-x: auto;
    margin: 22px 0;
    padding: 19px 22px;
    border: 1px solid var(--rk-line);
    border-radius: 15px;
    color: var(--rk-dark);
    background: var(--rk-soft);
    font-family: "SFMono-Regular", Consolas, "Liberation Mono", monospace;
    font-size: clamp(.82rem, 2vw, 1rem);
    font-weight: 800;
    text-align: center;
    white-space: nowrap;
  }
  #rk-salon-guide .rk-salon-mini-label {
    display: inline-block;
    margin-bottom: 7px;
    color: var(--rk-blue);
    font-size: .63rem;
    font-weight: 950;
    letter-spacing: .06em;
    text-transform: uppercase;
  }

  #rk-salon-guide .rk-salon-table-wrap {
    overflow-x: auto;
    border: 1px solid var(--rk-line);
    border-radius: 18px;
    background: var(--rk-white);
    box-shadow: 0 10px 28px rgba(16,37,54,.055);
  }
  #rk-salon-guide .rk-salon-table { width: 100%; border-collapse: collapse; }
  #rk-salon-guide .rk-salon-table th,
  #rk-salon-guide .rk-salon-table td { padding: 15px 16px; border-bottom: 1px solid var(--rk-line); text-align: left; vertical-align: top; }
  #rk-salon-guide .rk-salon-table tr:last-child td { border-bottom: 0; }
  #rk-salon-guide .rk-salon-table th {
    color: var(--rk-white);
    background: var(--rk-navy);
    font-size: .69rem;
    font-weight: 900;
    letter-spacing: .025em;
    line-height: 1.35;
    text-transform: uppercase;
  }
  #rk-salon-guide .rk-salon-table td { color: var(--rk-text); font-size: .84rem; }
  #rk-salon-guide .rk-salon-table tbody tr:nth-child(even) td { background: #f8fbfc; }

  #rk-salon-guide .rk-salon-tool {
    overflow: hidden;
    border: 1px solid #345d70;
    border-radius: 24px;
    color: var(--rk-white);
    background: #102b3b;
    box-shadow: 0 22px 58px rgba(16,37,54,.18);
  }
  #rk-salon-guide .rk-salon-tool-head {
    padding: clamp(27px, 5vw, 45px);
    background:
      radial-gradient(circle at 94% 8%, rgba(37,199,216,.25), transparent 33%),
      linear-gradient(135deg, #123044, #17566b);
  }
  #rk-salon-guide .rk-salon-tool-head h3 { margin-bottom: 10px; color: var(--rk-white); font-size: clamp(1.45rem, 3.5vw, 2.35rem); }
  #rk-salon-guide .rk-salon-tool-head p { max-width: 880px; margin-bottom: 0; color: #d3e8ee; }
  #rk-salon-guide .rk-salon-tool-body { display: grid; gap: 18px; padding: clamp(18px, 3.5vw, 32px); }
  #rk-salon-guide .rk-salon-tool-panel {
    padding: clamp(19px, 3vw, 29px);
    border: 1px solid #3b6375;
    border-radius: 18px;
    background: #173545;
  }
  #rk-salon-guide .rk-salon-tool-panel h4 { margin-bottom: 7px; color: var(--rk-white); font-size: 1.13rem; }
  #rk-salon-guide .rk-salon-tool-panel > p { color: #bed5de; font-size: .75rem; }
  #rk-salon-guide .rk-salon-input-group + .rk-salon-input-group {
    margin-top: 24px;
    padding-top: 22px;
    border-top: 1px solid #3b6375;
  }
  #rk-salon-guide .rk-salon-input-title {
    display: block;
    margin-bottom: 12px;
    color: #6feafa;
    font-size: .64rem;
    font-weight: 950;
    letter-spacing: .07em;
    text-transform: uppercase;
  }
  #rk-salon-guide .rk-salon-fields {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 14px;
  }
  #rk-salon-guide .rk-salon-field { min-width: 0; }
  #rk-salon-guide .rk-salon-field label {
    display: block;
    margin-bottom: 6px;
    color: #eaf8fb;
    font-size: .7rem;
    font-weight: 850;
    line-height: 1.35;
  }
  #rk-salon-guide .rk-salon-field input,
  #rk-salon-guide .rk-salon-field select {
    width: 100%;
    min-height: 46px;
    padding: 10px 11px;
    border: 1px solid #88a8b5;
    border-radius: 10px;
    color: var(--rk-dark);
    background: var(--rk-white);
    font-size: .86rem;
    outline: 0;
  }
  #rk-salon-guide .rk-salon-field input:focus,
  #rk-salon-guide .rk-salon-field select:focus { border-color: var(--rk-cyan); box-shadow: 0 0 0 3px rgba(37,199,216,.18); }
  #rk-salon-guide .rk-salon-field small { display: block; margin-top: 5px; color: #9dbac5; font-size: .61rem; line-height: 1.4; }
  #rk-salon-guide .rk-salon-tool-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 11px; margin-top: 22px; }
  #rk-salon-guide .rk-salon-calc-button,
  #rk-salon-guide .rk-salon-reset-button {
    min-height: 47px;
    padding: 11px 18px;
    border-radius: 11px;
    cursor: pointer;
    font-weight: 900;
    line-height: 1.2;
  }
  #rk-salon-guide .rk-salon-calc-button { border: 1px solid var(--rk-cyan); color: var(--rk-dark); background: var(--rk-cyan); }
  #rk-salon-guide .rk-salon-reset-button { border: 1px solid #7093a2; color: #eaf8fb; background: transparent; }
  #rk-salon-guide .rk-salon-calc-button:hover,
  #rk-salon-guide .rk-salon-calc-button:focus-visible { background: #75effa; }
  #rk-salon-guide .rk-salon-reset-button:hover,
  #rk-salon-guide .rk-salon-reset-button:focus-visible { border-color: var(--rk-white); color: var(--rk-white); }
  #rk-salon-guide .rk-salon-error {
    display: none;
    margin-top: 17px;
    padding: 13px 15px;
    border-left: 4px solid var(--rk-orange);
    border-radius: 0 10px 10px 0;
    color: #ffe8df;
    background: rgba(217,75,61,.19);
    font-size: .74rem;
  }
  #rk-salon-guide .rk-salon-error.is-visible { display: block; }
  #rk-salon-guide .rk-salon-results { display: grid; gap: 18px; }
  #rk-salon-guide .rk-salon-result-lead {
    padding: clamp(23px, 4vw, 35px);
    border: 1px solid #3d6e7e;
    border-radius: 18px;
    background: linear-gradient(135deg, #173c4e, #195a6c);
  }
  #rk-salon-guide .rk-salon-result-lead span {
    display: block;
    margin-bottom: 5px;
    color: #8aedfa;
    font-size: .64rem;
    font-weight: 950;
    letter-spacing: .07em;
    text-transform: uppercase;
  }
  #rk-salon-guide .rk-salon-result-lead strong {
    display: block;
    color: var(--rk-white);
    font-size: clamp(2rem, 6vw, 4rem);
    font-weight: 950;
    letter-spacing: -.055em;
    line-height: 1;
  }
  #rk-salon-guide .rk-salon-result-lead p { margin: 12px 0 0; color: #d6eaf0; font-size: .8rem; }
  #rk-salon-guide .rk-salon-metrics {
    display: grid;
    grid-template-columns: repeat(4, minmax(0, 1fr));
    gap: 12px;
  }
  #rk-salon-guide .rk-salon-metric {
    min-width: 0;
    padding: 17px;
    border: 1px solid #3d6272;
    border-radius: 14px;
    background: #122f3f;
  }
  #rk-salon-guide .rk-salon-metric span { display: block; margin-bottom: 6px; color: #9dbdc8; font-size: .59rem; font-weight: 850; line-height: 1.35; text-transform: uppercase; }
  #rk-salon-guide .rk-salon-metric strong { display: block; color: var(--rk-white); font-size: 1.22rem; font-weight: 950; line-height: 1.15; overflow-wrap: anywhere; }
  #rk-salon-guide .rk-salon-metric small { display: block; margin-top: 5px; color: #89aab6; font-size: .57rem; line-height: 1.35; }
  #rk-salon-guide .rk-salon-result-status {
    padding: 17px 19px;
    border-left: 5px solid var(--rk-green);
    border-radius: 0 13px 13px 0;
    color: #d9f5eb;
    background: rgba(22,131,107,.19);
    font-size: .78rem;
  }
  #rk-salon-guide .rk-salon-result-status.is-borderline { border-color: var(--rk-yellow); color: #fff2c4; background: rgba(216,156,25,.16); }
  #rk-salon-guide .rk-salon-result-status.is-warning { border-color: var(--rk-orange); color: #ffe3d9; background: rgba(255,106,61,.16); }
  #rk-salon-guide .rk-salon-result-status strong { color: inherit; }
  #rk-salon-guide .rk-salon-compare-wrap { overflow-x: auto; border: 1px solid #3d6272; border-radius: 15px; }
  #rk-salon-guide .rk-salon-compare { width: 100%; border-collapse: collapse; min-width: 720px; }
  #rk-salon-guide .rk-salon-compare th,
  #rk-salon-guide .rk-salon-compare td { padding: 13px 14px; border-bottom: 1px solid #3d6272; text-align: left; }
  #rk-salon-guide .rk-salon-compare tr:last-child td { border-bottom: 0; }
  #rk-salon-guide .rk-salon-compare th { color: #a9cad4; background: #102b3b; font-size: .61rem; font-weight: 900; text-transform: uppercase; }
  #rk-salon-guide .rk-salon-compare td { color: #e6f3f6; font-size: .72rem; }
  #rk-salon-guide .rk-salon-compare tr.is-recommended td { color: var(--rk-white); background: rgba(37,199,216,.13); font-weight: 850; }
  #rk-salon-guide .rk-salon-badge {
    display: inline-flex;
    padding: 5px 8px;
    border-radius: 999px;
    color: var(--rk-white);
    background: var(--rk-blue);
    font-size: .56rem;
    font-weight: 950;
    line-height: 1.2;
  }
  #rk-salon-guide .rk-salon-badge.is-pass { background: var(--rk-green); }
  #rk-salon-guide .rk-salon-badge.is-limit { background: var(--rk-yellow); }
  #rk-salon-guide .rk-salon-badge.is-fail { background: var(--rk-red); }
  #rk-salon-guide .rk-salon-visual-grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px;
    align-items: stretch;
  }
  #rk-salon-guide .rk-salon-chart-card,
  #rk-salon-guide .rk-salon-plan-card {
    min-width: 0;
    padding: 20px;
    border: 1px solid #3d6272;
    border-radius: 16px;
    background: #122f3f;
  }
  #rk-salon-guide .rk-salon-chart-card h4,
  #rk-salon-guide .rk-salon-plan-card h4 { color: var(--rk-white); }
  #rk-salon-guide .rk-salon-chart-card p,
  #rk-salon-guide .rk-salon-plan-card p { color: #a9c5cf; font-size: .67rem; }
  #rk-salon-guide .rk-salon-canvas-wrap {
    position: relative;
    width: 100%;
    min-height: 270px;
    border-radius: 12px;
    background: #f7fbfc;
  }
  #rk-salon-guide .rk-salon-canvas-wrap canvas { display: block; width: 100%; height: 270px; }
  #rk-salon-guide .rk-salon-plan-svg { display: block; width: 100%; min-height: 270px; border-radius: 12px; background: #f7fbfc; }
  #rk-salon-guide .rk-salon-diagnostics { display: grid; gap: 10px; }
  #rk-salon-guide .rk-salon-diagnostic {
    padding: 13px 15px;
    border-left: 4px solid var(--rk-cyan);
    border-radius: 0 10px 10px 0;
    color: #d8edf2;
    background: rgba(37,199,216,.08);
    font-size: .7rem;
  }
  #rk-salon-guide .rk-salon-diagnostic.is-warn { border-color: var(--rk-orange); background: rgba(255,106,61,.1); }
  #rk-salon-guide .rk-salon-tool-foot { padding: 0 clamp(18px, 3.5vw, 32px) 25px; color: #8eacb7; font-size: .61rem; }

  #rk-salon-guide .rk-salon-cta {
    position: relative;
    overflow: hidden;
    margin: clamp(50px, 8vw, 84px) 0;
    padding: clamp(28px, 5vw, 48px);
    border-radius: 23px;
    color: var(--rk-white);
    background: linear-gradient(135deg, #123044, #12647d);
    box-shadow: 0 20px 52px rgba(16,37,54,.17);
  }
  #rk-salon-guide .rk-salon-cta::after {
    position: absolute;
    right: -75px;
    bottom: -105px;
    width: 255px;
    height: 255px;
    border: 35px solid rgba(255,255,255,.055);
    border-radius: 50%;
    content: "";
  }
  #rk-salon-guide .rk-salon-cta-title { position: relative; z-index: 1; max-width: 850px; margin-bottom: 13px; color: var(--rk-white); font-size: clamp(1.4rem, 3.5vw, 2.3rem); font-weight: 950; letter-spacing: -.035em; line-height: 1.15; }
  #rk-salon-guide .rk-salon-cta p { position: relative; z-index: 1; max-width: 900px; color: #d7eaf0; }
  #rk-salon-guide .rk-salon-cta-button {
    position: relative;
    z-index: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 50px;
    padding: 12px 19px;
    border-radius: 11px;
    color: var(--rk-dark);
    background: var(--rk-cyan);
    box-shadow: 0 9px 23px rgba(0,0,0,.13);
    font-weight: 950;
    line-height: 1.25;
    text-align: center;
    text-decoration: none;
  }
  #rk-salon-guide .rk-salon-cta-button:hover,
  #rk-salon-guide .rk-salon-cta-button:focus-visible { color: var(--rk-dark); background: #79f1fb; transform: translateY(-1px); }

  #rk-salon-guide .rk-salon-steps { display: grid; gap: 13px; counter-reset: rk-salon-step; }
  #rk-salon-guide .rk-salon-step {
    position: relative;
    padding: 20px 20px 20px 73px;
    border: 1px solid var(--rk-line);
    border-radius: 15px;
    background: var(--rk-white);
  }
  #rk-salon-guide .rk-salon-step::before {
    position: absolute;
    top: 19px;
    left: 20px;
    display: grid;
    place-items: center;
    width: 36px;
    height: 36px;
    border-radius: 11px;
    color: var(--rk-white);
    background: var(--rk-blue);
    content: counter(rk-salon-step);
    counter-increment: rk-salon-step;
    font-size: .75rem;
    font-weight: 950;
  }
  #rk-salon-guide .rk-salon-step h3 { margin-bottom: 5px; font-size: 1.05rem; }
  #rk-salon-guide .rk-salon-step p { margin-bottom: 0; color: var(--rk-text); font-size: .88rem; }
  #rk-salon-guide .rk-salon-checklist { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; padding: 0; list-style: none; }
  #rk-salon-guide .rk-salon-checklist li {
    position: relative;
    margin: 0;
    padding: 16px 17px 16px 47px;
    border: 1px solid var(--rk-line);
    border-radius: 14px;
    background: var(--rk-white);
    color: var(--rk-text);
  }
  #rk-salon-guide .rk-salon-checklist li::before {
    position: absolute;
    top: 17px;
    left: 17px;
    display: grid;
    place-items: center;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    color: var(--rk-white);
    background: var(--rk-green);
    content: "✓";
    font-size: .65rem;
    font-weight: 950;
  }

  #rk-salon-guide .rk-salon-faq { display: grid; gap: 11px; }
  #rk-salon-guide .rk-salon-faq details { overflow: hidden; border: 1px solid var(--rk-line); border-radius: 14px; background: var(--rk-white); }
  #rk-salon-guide .rk-salon-faq summary {
    position: relative;
    padding: 18px 54px 18px 20px;
    color: var(--rk-dark);
    cursor: pointer;
    font-weight: 900;
    line-height: 1.4;
    list-style: none;
  }
  #rk-salon-guide .rk-salon-faq summary::-webkit-details-marker { display: none; }
  #rk-salon-guide .rk-salon-faq summary::after {
    position: absolute;
    top: 50%;
    right: 19px;
    display: grid;
    place-items: center;
    width: 27px;
    height: 27px;
    border-radius: 8px;
    color: var(--rk-blue);
    background: var(--rk-cyan-soft);
    content: "+";
    font-size: 1.1rem;
    transform: translateY(-50%);
  }
  #rk-salon-guide .rk-salon-faq details[open] summary::after { content: "−"; }
  #rk-salon-guide .rk-salon-faq-answer { padding: 0 20px 19px; color: var(--rk-text); }
  #rk-salon-guide .rk-salon-faq-answer p:last-child { margin-bottom: 0; }
  #rk-salon-guide .rk-salon-sources { padding: 0; list-style: none; counter-reset: rk-salon-source; }
  #rk-salon-guide .rk-salon-sources li {
    position: relative;
    margin-bottom: 11px;
    padding: 15px 16px 15px 54px;
    border: 1px solid var(--rk-line);
    border-radius: 13px;
    background: var(--rk-soft);
    color: var(--rk-text);
  }
  #rk-salon-guide .rk-salon-sources li::before {
    position: absolute;
    top: 15px;
    left: 15px;
    display: grid;
    place-items: center;
    width: 27px;
    height: 27px;
    border-radius: 8px;
    color: var(--rk-white);
    background: var(--rk-blue);
    content: counter(rk-salon-source);
    counter-increment: rk-salon-source;
    font-size: .64rem;
    font-weight: 950;
  }

  #rk-salon-guide .rk-salon-author {
    overflow: hidden;
    margin-top: clamp(50px, 8vw, 82px);
    border: 1px solid var(--rk-line);
    border-radius: 23px;
    background: var(--rk-white);
    box-shadow: 0 18px 48px rgba(16,37,54,.1);
    scroll-margin-top: 88px;
  }
  #rk-salon-guide .rk-salon-author > input { position: absolute; opacity: 0; pointer-events: none; }
  #rk-salon-guide .rk-salon-author-head { display: flex; align-items: center; justify-content: space-between; gap: 19px; padding: 27px clamp(22px, 5vw, 46px); color: var(--rk-white); background: var(--rk-dark); }
  #rk-salon-guide .rk-salon-author-head h2 { margin-bottom: 7px; color: var(--rk-white); }
  #rk-salon-guide .rk-salon-author-head p { margin-bottom: 0; color: #d1e5ec; }
  #rk-salon-guide .rk-salon-author-mark { display: inline-flex; flex: 0 0 auto; padding: 9px 13px; border: 1px solid rgba(255,255,255,.18); border-radius: 999px; color: #7af0ff; font-size: .63rem; font-weight: 950; letter-spacing: .06em; white-space: nowrap; }
  #rk-salon-guide .rk-salon-author-layout { display: grid; grid-template-columns: 295px minmax(0, 1fr); }
  #rk-salon-guide .rk-salon-author-side { padding: 35px 27px; border-right: 1px solid var(--rk-line); background: #f8fbfc; text-align: center; }
  #rk-salon-guide .rk-salon-author-photo { overflow: hidden; width: 156px; height: 156px; margin: 0 auto 18px; border: 7px solid var(--rk-white); border-radius: 50%; box-shadow: 0 10px 28px rgba(16,37,54,.14); }
  #rk-salon-guide .rk-salon-author-photo img { width: 100%; height: 100%; object-fit: cover; }
  #rk-salon-guide .rk-salon-author-name { color: var(--rk-dark); font-size: 1.25rem; font-weight: 950; }
  #rk-salon-guide .rk-salon-author-role { margin-top: 7px; color: var(--rk-blue); font-size: .68rem; font-weight: 950; line-height: 1.45; text-transform: uppercase; }
  #rk-salon-guide .rk-salon-author-social-label { margin-top: 26px; color: var(--rk-muted); font-size: .64rem; font-weight: 900; letter-spacing: .05em; text-transform: uppercase; }
  #rk-salon-guide .rk-salon-author-social { display: flex; justify-content: center; gap: 9px; margin-top: 10px; }
  #rk-salon-guide .rk-salon-author-social a { display: grid; place-items: center; width: 42px; height: 42px; border: 1px solid var(--rk-line); border-radius: 12px; color: var(--rk-navy); background: var(--rk-white); transition: .2s ease; }
  #rk-salon-guide .rk-salon-author-social a:hover,
  #rk-salon-guide .rk-salon-author-social a:focus-visible { border-color: var(--rk-cyan); color: var(--rk-blue); transform: translateY(-2px); }
  #rk-salon-guide .rk-salon-author-social svg { width: 20px; height: 20px; fill: currentColor; }
  #rk-salon-guide .rk-salon-author-main { min-width: 0; padding: 38px clamp(25px, 5vw, 48px); }
  #rk-salon-guide .rk-salon-author-quote { position: relative; margin: 0 0 22px; padding: 30px 25px 25px 70px; border-radius: 16px; background: var(--rk-cyan-soft); }
  #rk-salon-guide .rk-salon-author-quote::before { position: absolute; top: 3px; left: 24px; color: var(--rk-cyan); content: "“"; font-size: 4.8rem; font-weight: 950; line-height: 1; }
  #rk-salon-guide .rk-salon-author-quote p { margin-bottom: 0; color: var(--rk-dark); font-size: .98rem; font-style: italic; font-weight: 800; }
  #rk-salon-guide .rk-salon-author-tabs { display: grid; grid-template-columns: repeat(3, 1fr); border: 1px solid var(--rk-line); border-radius: 14px 14px 0 0; background: var(--rk-soft); }
  #rk-salon-guide .rk-salon-author-tab { padding: 13px 8px; border-right: 1px solid var(--rk-line); color: var(--rk-muted); cursor: pointer; font-size: .68rem; font-weight: 950; text-align: center; text-transform: uppercase; }
  #rk-salon-guide .rk-salon-author-tab:last-child { border-right: 0; }
  #rk-salon-guide .rk-salon-author-panel { display: none; padding: 23px; border: 1px solid var(--rk-line); border-top: 0; border-radius: 0 0 14px 14px; color: var(--rk-text); }
  #rk-salon-guide .rk-salon-author-panel p:last-child { margin-bottom: 0; }
  #rk-salon-author-about:checked ~ .rk-salon-author-layout .rk-salon-author-panel-about,
  #rk-salon-author-exp:checked ~ .rk-salon-author-layout .rk-salon-author-panel-exp,
  #rk-salon-author-method:checked ~ .rk-salon-author-layout .rk-salon-author-panel-method { display: block; }
  #rk-salon-author-about:checked ~ .rk-salon-author-layout label[for="rk-salon-author-about"],
  #rk-salon-author-exp:checked ~ .rk-salon-author-layout label[for="rk-salon-author-exp"],
  #rk-salon-author-method:checked ~ .rk-salon-author-layout label[for="rk-salon-author-method"] { color: var(--rk-blue); background: var(--rk-white); box-shadow: inset 0 -4px 0 var(--rk-blue); }
  #rk-salon-guide .rk-salon-site-links { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 13px; }
  #rk-salon-guide .rk-salon-site-links a { padding: 7px 10px; border: 1px solid var(--rk-line); border-radius: 9px; background: var(--rk-white); font-size: .72rem; text-decoration: none; }

  #rk-salon-guide .rk-salon-final-cta { margin-bottom: 0; background: linear-gradient(135deg, #0e2433, #174d63); }
  #rk-salon-guide .rk-salon-disclaimer { margin-top: 18px; color: var(--rk-muted); font-size: .69rem; }

  @media (max-width: 980px) {
    #rk-salon-guide .rk-salon-grid-4,
    #rk-salon-guide .rk-salon-fields,
    #rk-salon-guide .rk-salon-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    #rk-salon-guide .rk-salon-grid-3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
    #rk-salon-guide .rk-salon-author-layout { grid-template-columns: 1fr; }
    #rk-salon-guide .rk-salon-author-side { border-right: 0; border-bottom: 1px solid var(--rk-line); }
  }

  @media (max-width: 760px) {
    #rk-salon-guide { margin: 18px auto 44px; font-size: 16px; }
    #rk-salon-guide .rk-salon-shell { border-radius: 18px; }
    #rk-salon-guide .rk-salon-hero-metrics,
    #rk-salon-guide .rk-salon-grid-2,
    #rk-salon-guide .rk-salon-grid-3,
    #rk-salon-guide .rk-salon-grid-4,
    #rk-salon-guide .rk-salon-visual-grid,
    #rk-salon-guide .rk-salon-checklist { grid-template-columns: 1fr; }
    #rk-salon-guide .rk-salon-nav { grid-template-columns: 1fr; gap: 5px; }
    #rk-salon-guide .rk-salon-nav-label { padding-left: 2px; }
    #rk-salon-guide .rk-salon-table-wrap { overflow: visible; border: 0; box-shadow: none; background: transparent; }
    #rk-salon-guide .rk-salon-table,
    #rk-salon-guide .rk-salon-table tbody,
    #rk-salon-guide .rk-salon-table tr,
    #rk-salon-guide .rk-salon-table td { display: block; width: 100%; }
    #rk-salon-guide .rk-salon-table thead { display: none; }
    #rk-salon-guide .rk-salon-table tr { overflow: hidden; margin-bottom: 12px; border: 1px solid var(--rk-line); border-radius: 14px; background: var(--rk-white); box-shadow: 0 8px 22px rgba(16,37,54,.055); }
    #rk-salon-guide .rk-salon-table td,
    #rk-salon-guide .rk-salon-table tbody tr:nth-child(even) td { display: grid; grid-template-columns: minmax(116px, 42%) minmax(0, 1fr); gap: 12px; padding: 12px 14px; background: var(--rk-white); }
    #rk-salon-guide .rk-salon-table td::before { color: var(--rk-muted); content: attr(data-label); font-size: .65rem; font-weight: 900; line-height: 1.35; text-transform: uppercase; }
    #rk-salon-guide .rk-salon-table tr:last-child td { border-bottom: 1px solid var(--rk-line); }
    #rk-salon-guide .rk-salon-table tr td:last-child { border-bottom: 0; }
    #rk-salon-guide .rk-salon-compare-wrap { overflow: visible; border: 0; }
    #rk-salon-guide .rk-salon-compare,
    #rk-salon-guide .rk-salon-compare tbody,
    #rk-salon-guide .rk-salon-compare tr,
    #rk-salon-guide .rk-salon-compare td { display: block; width: 100%; min-width: 0; }
    #rk-salon-guide .rk-salon-compare thead { display: none; }
    #rk-salon-guide .rk-salon-compare tr {
      overflow: hidden;
      margin-bottom: 12px;
      border: 1px solid #3d6272;
      border-radius: 13px;
      background: #102b3b;
    }
    #rk-salon-guide .rk-salon-compare td,
    #rk-salon-guide .rk-salon-compare tr.is-recommended td {
      display: grid;
      grid-template-columns: minmax(118px, 43%) minmax(0, 1fr);
      gap: 11px;
      padding: 11px 13px;
      background: transparent;
    }
    #rk-salon-guide .rk-salon-compare tr.is-recommended { background: rgba(37,199,216,.13); }
    #rk-salon-guide .rk-salon-compare td::before {
      color: #9dbdc8;
      content: attr(data-label);
      font-size: .58rem;
      font-weight: 900;
      line-height: 1.35;
      text-transform: uppercase;
    }
    #rk-salon-guide .rk-salon-compare tr:last-child td { border-bottom: 1px solid #3d6272; }
    #rk-salon-guide .rk-salon-compare tr td:last-child { border-bottom: 0; }
  }

  @media (max-width: 560px) {
    #rk-salon-guide .rk-salon-content { padding: 23px 15px; }
    #rk-salon-guide .rk-salon-hero { padding: 32px 20px 30px; }
    #rk-salon-guide .rk-salon-fields,
    #rk-salon-guide .rk-salon-metrics { grid-template-columns: 1fr; }
    #rk-salon-guide .rk-salon-tool-body { padding: 14px; }
    #rk-salon-guide .rk-salon-tool-panel { padding: 18px 14px; }
    #rk-salon-guide .rk-salon-tool-actions { display: grid; }
    #rk-salon-guide .rk-salon-calc-button,
    #rk-salon-guide .rk-salon-reset-button { width: 100%; }
    #rk-salon-guide .rk-salon-author-head { display: block; }
    #rk-salon-guide .rk-salon-author-mark { margin-top: 17px; white-space: normal; }
    #rk-salon-guide .rk-salon-author-main { padding: 24px 18px; }
    #rk-salon-guide .rk-salon-author-quote { padding: 65px 20px 22px; }
    #rk-salon-guide .rk-salon-author-quote::before { left: 20px; }
    #rk-salon-guide .rk-salon-author-tab { font-size: .56rem; }
    #rk-salon-guide .rk-salon-step { padding-left: 64px; }
    #rk-salon-guide .rk-salon-step::before { left: 15px; }
  }

  @media (prefers-reduced-motion: reduce) {
    #rk-salon-guide *,
    #rk-salon-guide *::before,
    #rk-salon-guide *::after { scroll-behavior: auto !important; transition: none !important; animation: none !important; }
  }
</style>

<article id="rk-salon-guide" itemscope="" itemtype="https://schema.org/TechArticle">
  <div class="rk-salon-progress" aria-hidden="true"></div>
  <div class="rk-salon-shell">
    <header class="rk-salon-hero">
      <span class="rk-salon-kicker">Obliczenia pętli w salonie</span>
      <div class="rk-salon-hero-title">Ile pętli podłogówki w salonie? <span>Policz rury, dobiegi i przepływ</span></div>
      <p class="rk-salon-lead">Sam metraż salonu nie wyznacza liczby obwodów. Potrzebne są jeszcze: powierzchnia rzeczywiście ogrzewana, rozstaw rur, strefa przy przeszkleniu, odległość od rozdzielacza, wymagana moc oraz przyjęte ograniczenia hydrauliczne.</p>
      <div class="rk-salon-hero-tags" aria-label="Zakres opracowania">
        <span class="rk-salon-hero-tag">powierzchnia czynna</span>
        <span class="rk-salon-hero-tag">rozstaw 10–20 cm</span>
        <span class="rk-salon-hero-tag">dobiegi do rozdzielacza</span>
        <span class="rk-salon-hero-tag">przepływ i opory</span>
        <span class="rk-salon-hero-tag">warianty n−1 / n / n+1</span>
      </div>
      <div class="rk-salon-byline">
        <span>Autor: <strong>Robert Kucharski</strong></span>
        <span>Aktualizacja techniczna: <strong>31 sierpnia 2026 r.</strong></span>
        <span>Czas czytania: <strong>około 18 minut</strong></span>
      </div>
      <div class="rk-salon-hero-metrics" aria-label="Najważniejsze zasady">
        <div class="rk-salon-hero-metric"><b>Nie z samego m²</b><span>Liczba pętli wynika z metrów rury, geometrii i hydrauliki.</span></div>
        <div class="rk-salon-hero-metric"><b>Dobieg × liczba pętli</b><span>Każdy obwód ma własne zasilanie i powrót do rozdzielacza.</span></div>
        <div class="rk-salon-hero-metric"><b>Jedna wspólna analiza</b><span>Kalkulator porównuje kilka liczb obwodów przy tych samych danych.</span></div>
      </div>
    </header>

    <nav class="rk-salon-nav" aria-label="Skróty do wszystkich części artykułu">
      <span class="rk-salon-nav-label">Na skróty — wszystkie H2</span>
      <div class="rk-salon-nav-track">
        <a href="#rk-salon-szybka">Szybka odpowiedź</a>
        <a href="#rk-salon-dlaczego">Dlaczego nie sam metraż</a>
        <a href="#rk-salon-powierzchnia">Powierzchnia czynna</a>
        <a href="#rk-salon-dlugosc">Długość i dobiegi</a>
        <a href="#rk-salon-analizator">Analizator</a>
        <a href="#rk-salon-wynik">Interpretacja wyniku</a>
        <a href="#rk-salon-przyklady">20–50 m²</a>
        <a href="#rk-salon-rozstaw">Rozstaw rur</a>
        <a href="#rk-salon-strefa">Okna i strefa brzegowa</a>
        <a href="#rk-salon-kuchnia">Salon z kuchnią</a>
        <a href="#rk-salon-zabudowa">Wyspa, kominek, meble</a>
        <a href="#rk-salon-hydraulika">Hydraulika i przepływ</a>
        <a href="#rk-salon-rownosc">Równe długości?</a>
        <a href="#rk-salon-dylatacje">Dylatacje</a>
        <a href="#rk-salon-bledy">Błędy</a>
        <a href="#rk-salon-checklista">Checklista</a>
        <a href="#rk-salon-faq">FAQ</a>
        <a href="#rk-salon-zrodla">Źródła</a>
        <a href="#rk-salon-autor">Autor</a>
      </div>
    </nav>

    <div class="rk-salon-content">
      <section class="rk-salon-section" id="rk-salon-szybka">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Odpowiedź w 30 sekund</span>
          <h2>Ile pętli podłogówki w salonie?</h2>
          <p>W salonie o powierzchni około 20–30 m² często pojawiają się 2–3 obwody, a przy 35–50 m² zwykle 3–6. To wyłącznie orientacyjny przedział — nie reguła projektowa.</p>
        </div>
        <div class="rk-salon-answer">
          <h3>Liczbę pętli wyznacza się w dwóch krokach</h3>
          <p>Najpierw szacujemy metry rury w rzeczywiście ogrzewanym polu i dodajemy <strong>osobne dobiegi każdej pętli</strong>. Następnie sprawdzamy, czy podział zapewnia akceptowalną długość obwodu, przepływ, prędkość i spadek ciśnienia.</p>
          <p>Jeżeli geometria salonu, dylatacje, wyspa, kominek lub okno HST wymuszają inny przebieg rur, liczba pętli może być większa niż wynik prostego dzielenia metrów.</p>
        </div>
        <div class="rk-salon-grid-3" style="margin-top:18px">
          <div class="rk-salon-card rk-salon-card-accent"><span class="rk-salon-mini-label">Krok 1</span><h3>Metry w polu</h3><p>Powierzchnię czynną dzielimy przez rozstaw, osobno dla części podstawowej i ewentualnej strefy brzegowej.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><span class="rk-salon-mini-label">Krok 2</span><h3>Dwa dobiegi</h3><p>Do każdej pętli doliczamy drogę od rozdzielacza do pola oraz powrót.</p></div>
          <div class="rk-salon-card rk-salon-card-green"><span class="rk-salon-mini-label">Krok 3</span><h3>Kontrola hydrauliczna</h3><p>Sprawdzamy przepływ na obwód i orientacyjny spadek ciśnienia przy podanej średnicy wewnętrznej.</p></div>
        </div>
      </section>

      <section class="rk-salon-section" id="rk-salon-dlaczego">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Metraż to za mało</span>
          <h2>Dlaczego sam metraż salonu nie wyznacza liczby pętli?</h2>
          <p>Dwa salony po 35 m² mogą potrzebować innego podziału, mimo identycznej powierzchni wpisanej w projekcie architektonicznym.</p>
        </div>
        <div class="rk-salon-grid-2">
          <div class="rk-salon-card">
            <h3>Salon A</h3>
            <ul>
              <li>regularny prostokąt,</li>
              <li>rozdzielacz za ścianą,</li>
              <li>mało stałej zabudowy,</li>
              <li>jeden rozstaw na całej powierzchni.</li>
            </ul>
            <p>Taki układ można zwykle podzielić na równe pola bez długich dobiegów.</p>
          </div>
          <div class="rk-salon-card">
            <h3>Salon B</h3>
            <ul>
              <li>kształt litery L i otwarta kuchnia,</li>
              <li>wyspa oraz kominek,</li>
              <li>daleki rozdzielacz,</li>
              <li>duże przeszklenie z innym rozstawem.</li>
            </ul>
            <p>Ta sama powierzchnia może wymagać dodatkowego obwodu z przyczyn geometrycznych lub hydraulicznych.</p>
          </div>
        </div>
        <div class="rk-salon-warning" style="margin-top:18px"><p><strong>Ważne:</strong> źródło ciepła nie ustala liczby pętli wprost. Pompa ciepła lub kocioł wpływają na planowane temperatury wody, ale o podziale salonu decydują obciążenie cieplne, rozstaw, geometria i hydraulika.</p></div>
      </section>

      <section class="rk-salon-section" id="rk-salon-powierzchnia">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Najważniejsza dana wejściowa</span>
          <h2>Powierzchnia całkowita a powierzchnia czynna podłogówki w salonie</h2>
          <p>Do obliczenia długości rury służy pole, na którym rzeczywiście można ułożyć ogrzewanie. Nie wolno automatycznie odejmować stałych 10 lub 15%.</p>
        </div>
        <div class="rk-salon-grid-2">
          <div class="rk-salon-card rk-salon-card-green">
            <h3>Powierzchnia czynna</h3>
            <p>To fragment podłogi objęty rurami i przewidziany do oddawania ciepła. Powinien wynikać z rzutu, wymiarów zabudowy oraz ustalonego sposobu prowadzenia instalacji.</p>
            <div class="rk-salon-formula">A<sub>czynna</sub> = A<sub>salonu</sub> − A<sub>wyłączona</sub></div>
          </div>
          <div class="rk-salon-card rk-salon-card-orange">
            <h3>Wymagana moc jednostkowa</h3>
            <p>Po ograniczeniu powierzchni czynnej ta sama strata ciepła musi zostać pokryta przez mniejsze pole grzewcze.</p>
            <div class="rk-salon-formula">q<sub>wym</sub> = Q<sub>salonu</sub> / A<sub>czynna</sub></div>
          </div>
        </div>
        <p>Jeżeli salon traci 2400 W, a rury mogą znaleźć się na 30 m², wymagana średnia moc wynosi 80 W/m². Gdy czynne pole spadnie do 24 m², rośnie do 100 W/m². Sama większa liczba pętli nie tworzy dodatkowej powierzchni grzewczej i nie gwarantuje uzyskania tej mocy.</p>
        <div class="rk-salon-note"><p>O wpływie mebli i stałej zabudowy przeczytasz szerzej w opracowaniu <a href="https://projekt-ogrzewania.pl/wodne-ogrzewanie-podlogowe-a-meble-jak-polaczyc-komfort-i-aranzacje/">ogrzewanie podłogowe a meble i aranżacja</a>.</p></div>
      </section>

      <section class="rk-salon-section" id="rk-salon-dlugosc">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Dwa składniki długości</span>
          <h2>Jak oszacować długość rury i prawidłowo doliczyć dobiegi?</h2>
          <p>Najczęstszy błąd polega na dodaniu jednego wspólnego dobiegu do całego salonu. W rzeczywistości każdy równoległy obwód wraca osobno do rozdzielacza.</p>
        </div>
        <h3>Rura w polu grzewczym</h3>
        <div class="rk-salon-formula">L<sub>pole</sub> ≈ k × [(A<sub>główna</sub> / s<sub>główna</sub>) + (A<sub>brzegowa</sub> / s<sub>brzegowa</sub>)]</div>
        <p>Rozstawy <em>s</em> wpisujemy w metrach. Współczynnik <em>k</em> tworzy jawną rezerwę na łuki, podejścia i niedokładność prostego modelu powierzchniowego. Kalkulator pozwala ustawić go samodzielnie.</p>
        <h3>Dobiegi wszystkich pętli</h3>
        <div class="rk-salon-formula">L<sub>całkowita</sub> ≈ L<sub>pole</sub> + n × 2d</div>
        <p>Jeśli rozdzielacz znajduje się 6 m od początku pola, jedna pętla otrzymuje około 12 m dobiegu. Cztery pętle to już około 48 m dodatkowej rury, a nie 12 m.</p>
        <h3>Wstępna liczba obwodów z warunku długości</h3>
        <div class="rk-salon-formula">n<sub>min</sub> = ceil[L<sub>pole</sub> / (L<sub>limit</sub> − 2d)]</div>
        <p>Limit długości w kalkulatorze jest <strong>parametrem projektowym użytkownika</strong>. Domyślne 100 m dla rury 16 × 2 mm pokazuje popularną konwencję biurową, a nie uniwersalny limit przypisany bezpośrednio przez normę. Szczegółowe omówienie znajdziesz we wpisie <a href="https://projekt-ogrzewania.pl/ile-metrow-podlogowki-na-jednej-petli/">ile metrów podłogówki na jednej pętli</a>.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-analizator">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Jedno narzędzie zamiast kilku gadżetów</span>
          <h2>Interaktywny analizator liczby pętli w salonie</h2>
          <p>Wpisz własne założenia. Narzędzie najpierw obliczy długość rury, a następnie zwiększy liczbę obwodów do momentu spełnienia wpisanego limitu długości i referencyjnego spadku ciśnienia.</p>
        </div>

        <div class="rk-salon-tool" data-rk-salon-calculator="">
          <div class="rk-salon-tool-head">
            <span class="rk-salon-kicker">Kalkulator wstępnego podziału</span>
            <h3>Policz pętle, przepływ i orientacyjny opór</h3>
            <p>Wszystkie dane są ułożone kolejno. Wyniki, porównanie wariantów, wykresy oraz schemat pojawiają się poniżej formularza, dlatego układ nie pozostawia pustej kolumny na dużym ekranie.</p>
          </div>

          <div class="rk-salon-tool-body">
            <div class="rk-salon-tool-panel">
              <h4>Dane salonu i prowadzenia rur</h4>
              <p>Nie wpisuj automatycznego procentu zabudowy. Powierzchnię czynną odczytaj z rzutu lub oszacuj na podstawie rzeczywistych wymiarów.</p>

              <div class="rk-salon-input-group">
                <span class="rk-salon-input-title">1. Powierzchnia i rozstaw</span>
                <div class="rk-salon-fields">
                  <div class="rk-salon-field">
                    <label for="rk-salon-total-area">Powierzchnia salonu [m²]</label>
                    <input id="rk-salon-total-area" type="number" min="1" max="200" step="0.1" value="35" inputmode="decimal">
                    <small>Całe pomieszczenie z rzutu.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-active-area">Powierzchnia czynna [m²]</label>
                    <input id="rk-salon-active-area" type="number" min="0.5" max="200" step="0.1" value="30" inputmode="decimal">
                    <small>Rzeczywiste pole objęte rurami.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-edge-area">Strefa brzegowa [m²]</label>
                    <input id="rk-salon-edge-area" type="number" min="0" max="100" step="0.1" value="4" inputmode="decimal">
                    <small>Wpisz 0, jeśli jej nie wydzielasz.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-main-spacing">Rozstaw podstawowy [cm]</label>
                    <select id="rk-salon-main-spacing">
                      <option value="10">10 cm</option>
                      <option value="12.5">12,5 cm</option>
                      <option value="15" selected="">15 cm</option>
                      <option value="20">20 cm</option>
                    </select>
                    <small>Wynik obliczeń cieplnych, nie źródła ciepła.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-edge-spacing">Rozstaw w strefie [cm]</label>
                    <select id="rk-salon-edge-spacing">
                      <option value="5">5 cm</option>
                      <option value="10" selected="">10 cm</option>
                      <option value="12.5">12,5 cm</option>
                      <option value="15">15 cm</option>
                    </select>
                    <small>Używany tylko, gdy strefa ma więcej niż 0 m².</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-run">Dobieg w jedną stronę [m]</label>
                    <input id="rk-salon-run" type="number" min="0" max="50" step="0.1" value="6" inputmode="decimal">
                    <small>Od rozdzielacza do początku pola.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-allowance">Rezerwa geometryczna [%]</label>
                    <input id="rk-salon-allowance" type="number" min="0" max="25" step="0.5" value="5" inputmode="decimal">
                    <small>Na łuki i uproszczenie modelu.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-length-limit">Limit projektowy pętli [m]</label>
                    <input id="rk-salon-length-limit" type="number" min="30" max="180" step="1" value="100" inputmode="decimal">
                    <small>Edytowalne założenie, nie wartość normowa.</small>
                  </div>
                </div>
              </div>

              <div class="rk-salon-input-group">
                <span class="rk-salon-input-title">2. Moc i hydraulika</span>
                <div class="rk-salon-fields">
                  <div class="rk-salon-field">
                    <label for="rk-salon-heat-loss">Strata ciepła salonu [W]</label>
                    <input id="rk-salon-heat-loss" type="number" min="100" max="30000" step="10" value="2400" inputmode="numeric">
                    <small>Projektowe obciążenie pomieszczenia.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-delta-t">Różnica zasilanie–powrót ΔT [K]</label>
                    <input id="rk-salon-delta-t" type="number" min="2" max="15" step="0.5" value="5" inputmode="decimal">
                    <small>Służy do wyznaczenia przepływu wody.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-inner-diameter">Średnica wewnętrzna [mm]</label>
                    <input id="rk-salon-inner-diameter" type="number" min="7" max="25" step="0.1" value="12" inputmode="decimal">
                    <small>Dla rury 16 × 2 mm geometrycznie 12 mm.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-water-temp">Temperatura wody [°C]</label>
                    <input id="rk-salon-water-temp" type="number" min="5" max="80" step="1" value="30" inputmode="decimal">
                    <small>Model koryguje lepkość wody.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-extra-loss">Dodatkowy opór obwodu [kPa]</label>
                    <input id="rk-salon-extra-loss" type="number" min="0" max="50" step="0.1" value="3" inputmode="decimal">
                    <small>Rozdzielacz, zawór i lokalne opory pętli.</small>
                  </div>
                  <div class="rk-salon-field">
                    <label for="rk-salon-loss-limit">Limit spadku ciśnienia [kPa]</label>
                    <input id="rk-salon-loss-limit" type="number" min="3" max="100" step="1" value="20" inputmode="decimal">
                    <small>Własne kryterium do porównania wariantów.</small>
                  </div>
                </div>
              </div>

              <div class="rk-salon-tool-actions">
                <button class="rk-salon-calc-button" type="button" id="rk-salon-calculate">Przelicz analizę</button>
                <button class="rk-salon-reset-button" type="button" id="rk-salon-reset">Przywróć dane przykładowe</button>
              </div>
              <div class="rk-salon-error" id="rk-salon-error" role="alert"></div>
            </div>

            <div class="rk-salon-results" id="rk-salon-results" aria-live="polite">
              <div class="rk-salon-result-lead">
                <span>Wstępnie rekomendowany wariant</span>
                <strong id="rk-salon-loop-count">—</strong>
                <p id="rk-salon-result-summary">Wprowadź dane lub pozostaw wartości przykładowe.</p>
              </div>

              <div class="rk-salon-metrics" aria-label="Najważniejsze wyniki">
                <div class="rk-salon-metric"><span>Rura w polu</span><strong id="rk-salon-field-length">—</strong><small>bez dobiegów</small></div>
                <div class="rk-salon-metric"><span>Rura łącznie</span><strong id="rk-salon-total-length">—</strong><small>pole i dobiegi wszystkich pętli</small></div>
                <div class="rk-salon-metric"><span>Średnia długość pętli</span><strong id="rk-salon-average-length">—</strong><small>wartość referencyjna</small></div>
                <div class="rk-salon-metric"><span>Wymagana moc podłogi</span><strong id="rk-salon-unit-load">—</strong><small>Q salonu / powierzchnia czynna</small></div>
                <div class="rk-salon-metric"><span>Przepływ całkowity</span><strong id="rk-salon-total-flow">—</strong><small>dla podanej mocy i ΔT</small></div>
                <div class="rk-salon-metric"><span>Średnio na pętlę</span><strong id="rk-salon-loop-flow">—</strong><small>przy równym podziale obciążenia</small></div>
                <div class="rk-salon-metric"><span>Spadek referencyjny</span><strong id="rk-salon-pressure-loss">—</strong><small>Darcy–Weisbach i opór dodatkowy</small></div>
                <div class="rk-salon-metric"><span>Prędkość w rurze</span><strong id="rk-salon-velocity">—</strong><small>dla średniego przepływu pętli</small></div>
              </div>

              <div class="rk-salon-result-status" id="rk-salon-status">Wynik pojawi się po obliczeniu.</div>

              <div class="rk-salon-tool-panel">
                <h4>Porównanie liczby pętli n−1 / n / n+1</h4>
                <p>Jedna wspólna tabela pokazuje wpływ liczby obwodów na długość, przepływ i opór. Wartości są średnimi dla równego podziału pola i mocy.</p>
                <div class="rk-salon-compare-wrap">
                  <table class="rk-salon-compare">
                    <thead>
                      <tr>
                        <th>Pętle</th>
                        <th>Rura łącznie</th>
                        <th>Śr. długość</th>
                        <th>Przepływ / pętlę</th>
                        <th>Spadek ciśnienia</th>
                        <th>Ocena</th>
                      </tr>
                    </thead>
                    <tbody id="rk-salon-compare-body"></tbody>
                  </table>
                </div>
              </div>

              <div class="rk-salon-visual-grid">
                <div class="rk-salon-chart-card">
                  <h4>Długość i spadek ciśnienia</h4>
                  <p>Słupki pokazują średnią długość pętli. Punkty pokazują referencyjny spadek ciśnienia dla kolejnych wariantów.</p>
                  <div class="rk-salon-canvas-wrap"><canvas id="rk-salon-chart" width="600" height="270" role="img" aria-label="Wykres porównujący długość pętli i spadek ciśnienia dla kilku liczb obwodów"></canvas></div>
                </div>
                <div class="rk-salon-plan-card">
                  <h4>Schematyczny podział salonu</h4>
                  <p>Rysunek pokazuje ideę podziału pola i strefę przy przeszkleniu. Nie jest planem wykonawczym ani trasą ślimaków.</p>
                  <svg class="rk-salon-plan-svg" id="rk-salon-plan" viewBox="0 0 600 270" role="img" aria-label="Schemat podziału salonu na pętle i strefę przy przeszkleniu"></svg>
                </div>
              </div>

              <div class="rk-salon-tool-panel">
                <h4>Diagnostyka danych</h4>
                <p>Komunikaty wskazują ograniczenia prostego modelu i miejsca wymagające sprawdzenia na rzucie.</p>
                <div class="rk-salon-diagnostics" id="rk-salon-diagnostics"></div>
              </div>
            </div>
          </div>
          <div class="rk-salon-tool-foot">Analizator jest narzędziem edukacyjnym i wstępnym. Nie wyznacza wydajności konkretnego systemu podłogowego, temperatury powierzchni ani rzeczywistej trasy każdej pętli. Opór obliczany jest dla wody i wpisanej średnicy wewnętrznej.</div>
        </div>
      </section>

      <aside class="rk-salon-cta" aria-label="Projekt pętli na rzucie">
        <div class="rk-salon-cta-title">Kalkulator podzielił metry, ale nie widzi kształtu Twojego salonu</div>
        <p>Analizator policzył liczbę obwodów wynikającą z powierzchni, rozstawu, dobiegów i przyjętych ograniczeń hydraulicznych. Nie zna jednak rzeczywistego kształtu salonu, położenia wyspy, kominka, okien HST, drzwi, dylatacji ani trasy każdego ślimaka. Dopiero rozrysowanie pętli na rzucie pozwala przypisać im rzeczywiste długości, moce, przepływy i nastawy rozdzielacza.</p>
        <a class="rk-salon-cta-button rk-salon-sales-cta" href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/">Zamów projekt z pętlami rozrysowanymi na rzucie</a>
      </aside>

      <section class="rk-salon-section" id="rk-salon-wynik">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Co oznaczają liczby</span>
          <h2>Jak interpretować wynik analizatora?</h2>
          <p>Wynik „4 pętle” nie znaczy, że każda z nich ma mieć dokładnie jedną czwartą salonu i identyczną długość. To punkt startowy do rozrysowania instalacji.</p>
        </div>
        <div class="rk-salon-grid-3">
          <div class="rk-salon-card rk-salon-card-accent"><h3>Wariant n−1</h3><p>Pokazuje, co stanie się po zmniejszeniu liczby obwodów: pętle będą dłuższe, a przepływ i opór pojedynczej pętli zwykle wzrosną.</p></div>
          <div class="rk-salon-card rk-salon-card-green"><h3>Wariant n</h3><p>To pierwszy wariant spełniający oba wpisane kryteria w modelu średnim. Geometria może wymusić dodatkowy podział.</p></div>
          <div class="rk-salon-card rk-salon-card-purple"><h3>Wariant n+1</h3><p>Zmniejsza średnią długość i przepływ na obwód, lecz dodaje rurę w dobiegach, zajmuje kolejną sekcję rozdzielacza i wymaga regulacji.</p></div>
        </div>
        <div class="rk-salon-note" style="margin-top:18px"><p><strong>Najważniejsze ograniczenie:</strong> analizator zakłada równy podział długości i obciążenia. W projekcie pętla przy dużym przeszkleniu może otrzymać większy przepływ niż obwód położony w głębi salonu.</p></div>
      </section>

      <section class="rk-salon-section" id="rk-salon-przyklady">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Porównanie pod wspólnymi warunkami</span>
          <h2>Ile pętli podłogówki na 20, 25, 30, 35, 40 i 50 m²?</h2>
          <p>Poniższa tabela nie jest gotowym doborem. Wszystkie wiersze przyjmują identyczne, jawne założenia: cała podana powierzchnia jest czynna, rozstaw 15 cm, brak osobnej strefy brzegowej, 5% rezerwy geometrycznej, dobieg 6 m w jedną stronę i limit projektowy 100 m.</p>
        </div>
        <div class="rk-salon-table-wrap">
          <table class="rk-salon-table">
            <thead><tr><th>Powierzchnia czynna</th><th>Rura w polu</th><th>Wstępna liczba pętli</th><th>Rura z dobiegami</th><th>Średnio na pętlę</th><th>Co sprawdzić</th></tr></thead>
            <tbody>
              <tr><td data-label="Powierzchnia czynna">20 m²</td><td data-label="Rura w polu">około 140 m</td><td data-label="Pętle">2</td><td data-label="Rura z dobiegami">około 164 m</td><td data-label="Średnia">około 82 m</td><td data-label="Co sprawdzić">Geometrię i przepływ każdej pętli.</td></tr>
              <tr><td data-label="Powierzchnia czynna">25 m²</td><td data-label="Rura w polu">około 175 m</td><td data-label="Pętle">2</td><td data-label="Rura z dobiegami">około 199 m</td><td data-label="Średnia">około 100 m</td><td data-label="Co sprawdzić">Wariant graniczny; często warto porównać 3 pętle.</td></tr>
              <tr><td data-label="Powierzchnia czynna">30 m²</td><td data-label="Rura w polu">około 210 m</td><td data-label="Pętle">3</td><td data-label="Rura z dobiegami">około 246 m</td><td data-label="Średnia">około 82 m</td><td data-label="Co sprawdzić">Wpływ zabudowy i okna HST.</td></tr>
              <tr><td data-label="Powierzchnia czynna">35 m²</td><td data-label="Rura w polu">około 245 m</td><td data-label="Pętle">3</td><td data-label="Rura z dobiegami">około 281 m</td><td data-label="Średnia">około 94 m</td><td data-label="Co sprawdzić">Opór i rzeczywisty podział pola.</td></tr>
              <tr><td data-label="Powierzchnia czynna">40 m²</td><td data-label="Rura w polu">około 280 m</td><td data-label="Pętle">4</td><td data-label="Rura z dobiegami">około 328 m</td><td data-label="Średnia">około 82 m</td><td data-label="Co sprawdzić">Dylatacje i przejścia między polami.</td></tr>
              <tr><td data-label="Powierzchnia czynna">50 m²</td><td data-label="Rura w polu">około 350 m</td><td data-label="Pętle">4</td><td data-label="Rura z dobiegami">około 398 m</td><td data-label="Średnia">około 100 m</td><td data-label="Co sprawdzić">Hydraulika lub geometria mogą wskazać 5 pętli.</td></tr>
            </tbody>
          </table>
        </div>
        <p class="rk-salon-disclaimer">Zmiana rozstawu z 15 na 10 cm zwiększa orientacyjną ilość rury w polu o około 50% przy tej samej powierzchni. Długi dobieg również może zwiększyć liczbę pętli, mimo niezmienionego metrażu salonu.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-rozstaw">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Ciepło najpierw, metry później</span>
          <h2>Rozstaw 10, 15 czy 20 cm a liczba pętli w salonie</h2>
          <p>Gęstszy rozstaw zwiększa długość rury, ale nie powinien być wybierany wyłącznie po to, aby „wyszło więcej pętli”. Najpierw trzeba sprawdzić wymaganą moc i warunki pracy powierzchni grzewczej.</p>
        </div>
        <div class="rk-salon-table-wrap">
          <table class="rk-salon-table">
            <thead><tr><th>Rozstaw</th><th>Orientacyjna rura na 1 m² pola</th><th>Wpływ na liczbę pętli</th><th>Warunek zastosowania</th></tr></thead>
            <tbody>
              <tr><td data-label="Rozstaw">10 cm</td><td data-label="Rura / m²">około 10 m przed rezerwą</td><td data-label="Wpływ">Więcej metrów i zwykle więcej obwodów.</td><td data-label="Warunek">Musi wynikać z obliczeń mocy, temperatur i konstrukcji podłogi.</td></tr>
              <tr><td data-label="Rozstaw">15 cm</td><td data-label="Rura / m²">około 6,7 m przed rezerwą</td><td data-label="Wpływ">Często stanowi wariant pośredni.</td><td data-label="Warunek">Nadal wymaga sprawdzenia wydajności i temperatury powierzchni.</td></tr>
              <tr><td data-label="Rozstaw">20 cm</td><td data-label="Rura / m²">około 5 m przed rezerwą</td><td data-label="Wpływ">Mniej metrów może zmniejszyć liczbę obwodów.</td><td data-label="Warunek">Tylko jeśli konkretny system zapewnia wymaganą moc i równomierność.</td></tr>
            </tbody>
          </table>
        </div>
        <p>Pełne porównanie opisuje artykuł <a href="https://projekt-ogrzewania.pl/rozstaw-rur-w-ogrzewaniu-podlogowym-co-10-czy-15-cm/">rozstaw rur w ogrzewaniu podłogowym: 10 czy 15 cm</a>. Liczba pętli jest skutkiem przyjętego rozstawu, a nie kryterium doboru rozstawu.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-strefa">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Duże przeszklenia</span>
          <h2>Okno HST i strefa brzegowa — czy potrzebna jest osobna pętla?</h2>
          <p>Duże przeszklenie może zwiększać lokalne obciążenie cieplne, ale nie oznacza automatycznie strefy o szerokości 1 m, rozstawu 10 cm ani osobnego obwodu.</p>
        </div>
        <div class="rk-salon-grid-3">
          <div class="rk-salon-card"><h3>Kiedy strefa ma sens?</h3><p>Gdy obliczenia i charakterystyka systemu wskazują, że lokalnie potrzebna jest większa wydajność lub wyższa temperatura powierzchni w dozwolonych granicach.</p></div>
          <div class="rk-salon-card"><h3>W tej samej pętli</h3><p>Strefę można czasem włączyć w obwód obsługujący resztę salonu. Trzeba wtedy znać jej udział w mocy i zaplanować trasę rury.</p></div>
          <div class="rk-salon-card"><h3>Osobny obwód</h3><p>Może ułatwić przypisanie przepływu i prowadzenie rur, jeśli strefa jest duża, ma wyraźnie inne obciążenie lub wymaga niezależnego pola.</p></div>
        </div>
        <p>W analizatorze powierzchnia strefy jest podawana wprost, a nie jako stałe 20% salonu. Zobacz także opracowanie <a href="https://projekt-ogrzewania.pl/strefa-brzegowa-w-ogrzewaniu-podlogowym/">strefa brzegowa w ogrzewaniu podłogowym</a>.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-kuchnia">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Jedna przestrzeń, kilka funkcji</span>
          <h2>Salon z kuchnią i jadalnią — jak podzielić otwartą strefę?</h2>
          <p>Otwarta przestrzeń nie musi oznaczać jednego olbrzymiego obwodu ani automatycznie osobnych pętli dla każdej funkcji wnętrza.</p>
        </div>
        <div class="rk-salon-steps">
          <div class="rk-salon-step"><h3>Wyznacz pola rzeczywiście dostępne</h3><p>Odrysuj stałą zabudowę kuchenną, wyspę, kominek, schody i elementy wymagające wyłączenia lub indywidualnego uzgodnienia.</p></div>
          <div class="rk-salon-step"><h3>Nałóż granice jastrychu i przejścia</h3><p>Sprawdź geometrię pól, dylatacje, przewężenia oraz miejsca, w których rury muszą przejść przez drzwi lub komunikację.</p></div>
          <div class="rk-salon-step"><h3>Podziel moc, nie tylko metry kwadratowe</h3><p>Obwód przy przeszkleniu może przenosić inne obciążenie niż obwód pod stołem w głębi pomieszczenia.</p></div>
          <div class="rk-salon-step"><h3>Dopiero wtedy przypisz długości i przepływy</h3><p>Końcowy podział powinien pasować do rozdzielacza, kryterium oporu i możliwości regulacji.</p></div>
        </div>
        <div class="rk-salon-note" style="margin-top:18px"><p>Praktyczny sposób prowadzenia ślimaków omawia poradnik <a href="https://projekt-ogrzewania.pl/jak-zaplanowac-rozmieszczenie-petli-grzewczych-w-ogrzewaniu-podlogowym/">jak zaplanować rozmieszczenie pętli grzewczych</a>.</p></div>
      </section>

      <section class="rk-salon-section" id="rk-salon-zabudowa">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Rzut ważniejszy niż procent</span>
          <h2>Wyspa, kominek, kanapa i stałe meble a pętle podłogówki</h2>
          <p>Nie każdy mebel wymaga wyłączenia ogrzewania, a nie każdy fragment podłogi powinien być ogrzewany. Decyzję podejmuje się dla konkretnego elementu i planowanej aranżacji.</p>
        </div>
        <div class="rk-salon-grid-2">
          <div class="rk-salon-card rk-salon-card-orange">
            <h3>Elementy wymagające uzgodnienia</h3>
            <ul>
              <li>kominek i jego fundament lub płyta ochronna,</li>
              <li>stała zabudowa bez prześwitu,</li>
              <li>wyspa z instalacjami i mocowaniem do posadzki,</li>
              <li>schody, prowadnice drzwi i kotwy konstrukcyjne.</li>
            </ul>
          </div>
          <div class="rk-salon-card rk-salon-card-green">
            <h3>Elementy, których nie odejmuje się automatycznie</h3>
            <ul>
              <li>kanapa na nóżkach,</li>
              <li>stół i krzesła,</li>
              <li>mobilne szafki,</li>
              <li>przyszła aranżacja, która może się zmienić.</li>
            </ul>
          </div>
        </div>
        <p>Najbezpieczniej nanieść wyłączenia na rzut i policzyć ich rzeczywistą powierzchnię. Dzięki temu kalkulator nie opiera się na arbitralnym założeniu, że w każdym salonie znika dokładnie 15% pola.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-hydraulika">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Podział przepływu</span>
          <h2>Liczba pętli, całkowity przepływ i spadek ciśnienia</h2>
          <p>Dodanie pętli nie zwiększa automatycznie całkowitego przepływu wymaganego przez salon. Dzieli go pomiędzy większą liczbę równoległych obwodów.</p>
        </div>
        <h3>Przepływ wynikający z mocy</h3>
        <div class="rk-salon-formula">V̇<sub>salonu</sub> [l/min] ≈ Q<sub>salonu</sub> / (69,8 × ΔT)</div>
        <p>Dla 2400 W i różnicy temperatur 5 K otrzymujemy około 6,9 l/min łącznie. Przy trzech identycznie obciążonych pętlach byłoby to średnio około 2,3 l/min na obwód, a przy czterech około 1,7 l/min. W rzeczywistym projekcie podział zależy od mocy przypisanej do każdego pola.</p>
        <h3>Opór nie wynika wyłącznie z długości</h3>
        <p>Spadek ciśnienia zależy jednocześnie od długości, średnicy wewnętrznej, przepływu, właściwości medium, temperatury i oporów miejscowych. Dlatego nie można przypisać jednej wartości kPa do „pętli 100 m” bez pozostałych danych.</p>
        <div class="rk-salon-grid-3">
          <div class="rk-salon-card"><h3>Dłuższa pętla</h3><p>Przy tym samym przepływie i średnicy zwiększa stratę liniową.</p></div>
          <div class="rk-salon-card"><h3>Większy przepływ</h3><p>Zwiększa prędkość, a opory rosną nieliniowo.</p></div>
          <div class="rk-salon-card"><h3>Mniejsza średnica</h3><p>Silnie wpływa na prędkość i gradient ciśnienia.</p></div>
        </div>
        <p>Jeśli chcesz analizować cały układ, skorzystaj z osobnego opracowania <a href="https://projekt-ogrzewania.pl/kalkulator-doboru-pompy-obiegowej-w-ogrzewaniu-podlogowym/">kalkulator doboru pompy obiegowej</a>. Regulację poszczególnych obwodów opisuje poradnik <a href="https://projekt-ogrzewania.pl/rotametr-wskaznik-przeplywu-w-rozdzielaczu-ogrzewania-podlogowego/">rotametr i ustawienie przepływu</a>.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-rownosc">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Równoważenie zamiast dogmatu</span>
          <h2>Czy pętle podłogówki w salonie muszą mieć równą długość?</h2>
          <p>Nie istnieje uniwersalna zasada, że wszystkie pętle muszą różnić się o mniej niż 10 lub 15%. Dążenie do podobnych oporów ułatwia regulację, ale sama długość nie opisuje całej hydrauliki.</p>
        </div>
        <div class="rk-salon-grid-2">
          <div class="rk-salon-card rk-salon-card-green">
            <h3>Różne długości mogą działać prawidłowo</h3>
            <p>Jeżeli każdej pętli przypisano właściwy przepływ, sprawdzono opór i rozdzielacz pozwala na regulację, obwody nie muszą być geometrycznymi kopiami.</p>
          </div>
          <div class="rk-salon-card rk-salon-card-orange">
            <h3>Skrajności utrudniają regulację</h3>
            <p>Bardzo krótki obwód obok długiego może wymagać mocnego dławienia. To nie oznacza automatycznie hałasu ani „kradzieży całego przepływu”, ale zwiększa wymagania regulacyjne.</p>
          </div>
        </div>
        <p>W projekcie porównuje się nie tylko metry, lecz także przepływ, spadek ciśnienia, przypisaną moc i nastawę. Problem z nadmiernie długim obwodem omawia artykuł <a href="https://projekt-ogrzewania.pl/za-dluga-petla-podlogowki/">za długa pętla podłogówki</a>.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-dylatacje">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Granice pól jastrychu</span>
          <h2>Dylatacja a podział pętli w dużym salonie</h2>
          <p>Podział jastrychu zależy od jego rodzaju, geometrii, wymiarów pól, konstrukcji systemu i zaleceń dokumentacji. Jedna stała powierzchnia graniczna nie pasuje do każdego rozwiązania.</p>
        </div>
        <div class="rk-salon-grid-3">
          <div class="rk-salon-card"><span class="rk-salon-number">1</span><h3>Ustal pola jastrychu</h3><p>Granice powinny być znane przed trasowaniem rur, a nie dorysowane po wykonaniu podłogówki.</p></div>
          <div class="rk-salon-card"><span class="rk-salon-number">2</span><h3>Ogranicz przejścia</h3><p>Jeżeli rura przecina dylatację, przejście projektuje się świadomie i zabezpiecza zgodnie z systemem.</p></div>
          <div class="rk-salon-card"><span class="rk-salon-number">3</span><h3>Dopasuj pętle</h3><p>W wielu przypadkach korzystne jest przypisanie obwodów do pól, ale geometria budynku rozstrzyga szczegóły.</p></div>
        </div>
        <p>Więcej informacji znajdziesz w poradniku <a href="https://projekt-ogrzewania.pl/izolacja-brzegowa-i-dylatacje-w-instalacji-ogrzewania-podlogowego/">izolacja brzegowa i dylatacje w ogrzewaniu podłogowym</a>.</p>
      </section>

      <section class="rk-salon-section" id="rk-salon-bledy">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Co najczęściej psuje wynik</span>
          <h2>Najczęstsze błędy przy ustalaniu liczby pętli w salonie</h2>
          <p>Większość błędów nie wynika z samego dzielenia metrów, lecz z niewłaściwych danych wejściowych i zbyt kategorycznej interpretacji.</p>
        </div>
        <div class="rk-salon-grid-2">
          <div class="rk-salon-card rk-salon-card-orange"><h3>Dodanie jednego dobiegu</h3><p>Każda pętla ma własne zasilanie i powrót. Wspólny dobieg dodany raz zaniża całkowitą długość rury.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><h3>Stałe 15% na meble</h3><p>Powierzchnia wyłączona powinna wynikać z rzutu. Jedna wartość procentowa nie pasuje do wszystkich aranżacji.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><h3>100 m jako „nakaz normy”</h3><p>Długość jest kryterium projektowym zależnym od przepływu, średnicy, oporu i założeń instalacji.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><h3>Opór liczony tylko z metrów</h3><p>Bez przepływu, średnicy wewnętrznej, medium i oporów miejscowych wartość kPa nie jest miarodajna.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><h3>Rozstaw z nazwy źródła</h3><p>Pompa ciepła nie oznacza automatycznie 10 cm, a kocioł nie oznacza 15 cm. Liczy się wymagany efekt cieplny.</p></div>
          <div class="rk-salon-card rk-salon-card-orange"><h3>Ignorowanie geometrii</h3><p>Wynik kalkulatora nie uwzględni drzwi, przewężeń, kominka i trasy ślimaka, dopóki nie pojawią się na rzucie.</p></div>
        </div>
      </section>

      <section class="rk-salon-section" id="rk-salon-checklista">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Przed ułożeniem rur</span>
          <h2>Checklista podziału salonu na pętle</h2>
          <p>Przed zatwierdzeniem liczby obwodów sprawdź komplet danych, a nie tylko wynik w metrach.</p>
        </div>
        <ul class="rk-salon-checklist">
          <li>Znam projektową stratę ciepła salonu w watach.</li>
          <li>Mam rzeczywistą powierzchnię czynną z rzutu.</li>
          <li>Rozstaw rur wynika z obliczeń cieplnych.</li>
          <li>Strefa przy przeszkleniu ma określoną powierzchnię.</li>
          <li>Każdej pętli doliczono zasilanie i powrót.</li>
          <li>Znam średnicę wewnętrzną, a nie tylko nazwę rury.</li>
          <li>Sprawdzono przepływ przypisany do każdego obwodu.</li>
          <li>Sprawdzono spadek ciśnienia wraz z oporami miejscowymi.</li>
          <li>Podział uwzględnia wyspę, kominek i stałą zabudowę.</li>
          <li>Pętle pasują do pól jastrychu i dylatacji.</li>
          <li>Rozdzielacz ma odpowiednią liczbę sekcji z rezerwą projektową.</li>
          <li>Na rysunku podano długości, przepływy i nastawy.</li>
        </ul>
      </section>

      <section class="rk-salon-section" id="rk-salon-faq">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Pytania inwestorów i wykonawców</span>
          <h2>Ile pętli podłogówki w salonie — FAQ</h2>
          <p>Krótkie odpowiedzi na pytania, które najczęściej pojawiają się przed rozrysowaniem instalacji.</p>
        </div>
        <div class="rk-salon-faq">
          <details><summary>Ile pętli podłogówki na salon 20 m²?</summary><div class="rk-salon-faq-answer"><p>Przy przykładowym rozstawie 15 cm, krótkim dobiegu i całej powierzchni czynnej często wychodzą 2 pętle. Ostateczny wynik zależy od mocy, geometrii, średnicy rury i przyjętego limitu oporu.</p></div></details>
          <details><summary>Ile pętli podłogówki na 30 m² salonu?</summary><div class="rk-salon-faq-answer"><p>W przejrzystym przykładzie z tego artykułu wychodzą 3 pętle, ale gęstszy rozstaw, daleki rozdzielacz, duże przeszklenie lub nieregularny rzut mogą zmienić podział.</p></div></details>
          <details><summary>Ile pętli podłogówki na salon 40 m²?</summary><div class="rk-salon-faq-answer"><p>Przy rozstawie 15 cm, dobiegu 6 m w jedną stronę i limicie 100 m przykład wskazuje 4 pętle. To nie jest uniwersalna rekomendacja bez obliczeń cieplnych i hydraulicznych.</p></div></details>
          <details><summary>Czy salon 50 m² wystarczą 4 pętle?</summary><div class="rk-salon-faq-answer"><p>Mogą wystarczyć w jednym układzie, a w innym potrzebne będzie 5 lub więcej. Cztery pętle w przykładzie są blisko wpisanego limitu długości, dlatego trzeba sprawdzić hydraulikę i rozrysować rzeczywiste trasy.</p></div></details>
          <details><summary>Ile m² może ogrzewać jedna pętla?</summary><div class="rk-salon-faq-answer"><p>Nie ma jednej wartości. Pole na pętlę zależy od rozstawu, dobiegu, obciążenia cieplnego, przepływu, średnicy i geometrii. Przy rozstawie 10 cm na tę samą powierzchnię potrzeba około 50% więcej rury niż przy 15 cm.</p></div></details>
          <details><summary>Czy przy oknie HST zawsze robi się osobną pętlę?</summary><div class="rk-salon-faq-answer"><p>Nie. Osobna pętla może być uzasadniona wielkością strefy, jej obciążeniem i geometrią, ale nie jest automatycznym wymogiem dla każdego przeszklenia.</p></div></details>
          <details><summary>Czy pętle w jednym salonie muszą być identycznej długości?</summary><div class="rk-salon-faq-answer"><p>Nie. Ważne jest, aby każda pętla miała obliczony przepływ, akceptowalny opór i możliwość regulacji. Podobne długości zwykle ułatwiają równoważenie, lecz nie są celem samym w sobie.</p></div></details>
          <details><summary>Czy limit 100 m dla rury 16 × 2 mm wynika wprost z normy?</summary><div class="rk-salon-faq-answer"><p>Nie należy przedstawiać go jako uniwersalnego nakazu normowego. To często stosowane kryterium projektowe. Dopuszczalną długość ocenia się razem z przepływem, średnicą wewnętrzną, oporem i charakterystyką całej instalacji.</p></div></details>
          <details><summary>Czy więcej pętli oznacza większy całkowity przepływ?</summary><div class="rk-salon-faq-answer"><p>Nie automatycznie. Całkowity przepływ wynika przede wszystkim z wymaganej mocy i projektowej różnicy temperatur. Więcej obwodów dzieli tę wartość pomiędzy pętle.</p></div></details>
          <details><summary>Czy kalkulator wystarczy do wykonania podłogówki w salonie?</summary><div class="rk-salon-faq-answer"><p>Nie. Kalkulator daje wstępny podział przy uproszczonej geometrii. Projekt powinien uwzględniać rzut, wyłączenia, dylatacje, rzeczywiste trasy, temperatury, przepływy, straty ciśnienia i nastawy rozdzielacza.</p></div></details>
        </div>
      </section>

      <section class="rk-salon-section" id="rk-salon-zrodla">
        <div class="rk-salon-section-head">
          <span class="rk-salon-eyebrow">Metodyka i weryfikacja</span>
          <h2>Źródła i zakres techniczny opracowania</h2>
          <p>Artykuł rozdziela metodykę cieplną, projektowanie i wykonanie instalacji. Linki prowadzą wyłącznie do organizacji normalizacyjnej, bez producentów i ofert handlowych.</p>
        </div>
        <ol class="rk-salon-sources">
          <li><a href="https://www.iso.org/standard/74683.html" target="_blank" rel="noopener nofollow">ISO 11855-2:2021 — determination of the design heating and cooling capacity</a>. Metody wyznaczania wydajności powierzchni grzewczych przy określonych warunkach.</li>
          <li><a href="https://www.iso.org/standard/74684.html" target="_blank" rel="noopener nofollow">ISO 11855-3:2021 — dimensioning</a>. Zasady wymiarowania wodnych systemów ogrzewania i chłodzenia powierzchniowego.</li>
          <li><a href="https://www.iso.org/standard/74685.html" target="_blank" rel="noopener nofollow">ISO 11855-5:2021 — installation</a>. Zagadnienia dotyczące instalowania systemów ogrzewania i chłodzenia powierzchniowego.</li>
        </ol>
        <div class="rk-salon-warning"><p><strong>Zakres kalkulatora:</strong> model długości jest geometrycznym przybliżeniem, a model oporów wykorzystuje równanie Darcy’ego–Weisbacha dla wody i średniego przepływu. Nie zastępuje charakterystyk konkretnego systemu, obliczeń temperatury powierzchni ani projektu wykonawczego.</p></div>
      </section>

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

        <header class="rk-salon-author-head">
          <div>
            <span class="rk-salon-kicker">Autor i odpowiedzialność merytoryczna</span>
            <h2>Robert Kucharski</h2>
            <p>Projektant instalacji sanitarnych • specjalista HVAC i ogrzewania podłogowego</p>
          </div>
          <span class="rk-salon-author-mark">PROJEKTOWANIE • HYDRAULIKA • EDUKACJA</span>
        </header>

        <div class="rk-salon-author-layout">
          <aside class="rk-salon-author-side">
            <div class="rk-salon-author-photo"><img src="https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp" alt="Robert Kucharski — projektant instalacji sanitarnych i ogrzewania podłogowego" width="600" height="600" loading="lazy" decoding="async"></div>
            <div class="rk-salon-author-name">Robert Kucharski</div>
            <div class="rk-salon-author-role">Projektant instalacji sanitarnych<br>Specjalista HVAC i ogrzewania podłogowego</div>
            <div class="rk-salon-author-social-label">Profile autora</div>
            <div class="rk-salon-author-social" aria-label="Profile Roberta Kucharskiego w mediach społecznościowych">
              <a href="https://www.linkedin.com/in/robert-kucharski-38069b48/" target="_blank" rel="noopener nofollow me" aria-label="Robert Kucharski na LinkedIn"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5.3 3.6A2.3 2.3 0 1 1 .7 3.6a2.3 2.3 0 0 1 4.6 0ZM1.1 8h4.3v13H1.1V8Zm6.9 0h4.1v1.8h.1c.6-1.1 2-2.3 4.1-2.3 4.4 0 5.2 2.9 5.2 6.7V21h-4.3v-6c0-1.4 0-3.3-2-3.3s-2.3 1.6-2.3 3.2V21H8V8Z"></path></svg></a>
              <a href="https://www.facebook.com/projektogrzewaniapl" target="_blank" rel="noopener nofollow me" aria-label="Projekt Ogrzewania na Facebooku"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M24 12.1C24 5.4 18.6 0 12 0S0 5.4 0 12.1C0 18.1 4.4 23 10.1 24v-8.4H7.1v-3.5h3V9.5c0-3 1.8-4.7 4.5-4.7 1.3 0 2.7.2 2.7.2v3h-1.5c-1.5 0-1.9.9-1.9 1.8v2.2h3.3l-.5 3.5h-2.8V24C19.6 23 24 18.1 24 12.1Z"></path></svg></a>
              <a href="https://x.com/Projekt_HVAC" target="_blank" rel="noopener nofollow me" aria-label="Projekt HVAC w serwisie X"><svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18.9 2H22l-6.8 7.8L23.2 22h-6.3L12 15.6 6.4 22H3.3l7.2-8.2L.8 2h6.5l4.4 5.8L18.9 2Zm-1.1 17.9h1.7L6.4 4H4.6l13.2 15.9Z"></path></svg></a>
            </div>
          </aside>

          <div class="rk-salon-author-main">
            <blockquote class="rk-salon-author-quote"><p>„Liczba pętli nie powinna powstawać przez mechaniczne podzielenie metrażu salonu. Dobry podział łączy bilans cieplny, rzeczywistą geometrię, długości dobiegów i hydraulikę każdego obwodu.”</p></blockquote>
            <div class="rk-salon-author-tabs" role="tablist" aria-label="Informacje o autorze">
              <label class="rk-salon-author-tab" for="rk-salon-author-about">O autorze</label>
              <label class="rk-salon-author-tab" for="rk-salon-author-exp">Praktyka</label>
              <label class="rk-salon-author-tab" for="rk-salon-author-method">Metodyka</label>
            </div>
            <div class="rk-salon-author-panel rk-salon-author-panel-about">
              <p>Robert Kucharski opracowuje projekty wodnego ogrzewania podłogowego oraz materiały techniczne dla inwestorów i wykonawców. W pracy łączy obliczenia strat ciepła pomieszczeń z doborem temperatur, rozstawów rur, długości pętli, przepływów, spadków ciśnienia i nastaw rozdzielaczy.</p>
              <p>Jego celem jest przełożenie obliczeń na czytelną dokumentację wykonawczą: trasę każdego obwodu na rzucie, jego długość, przypisaną moc, przepływ oraz wartość potrzebną do regulacji. Dzięki temu wykonawca nie musi odtwarzać założeń projektu na budowie.</p>
              <p><a href="https://projekt-ogrzewania.pl/author/admin3399/">Zobacz profil autora i pozostałe opracowania</a>.</p>
            </div>
            <div class="rk-salon-author-panel rk-salon-author-panel-exp">
              <p>Przy podziale dużych salonów i otwartych stref dziennych Robert analizuje powierzchnię czynną, lokalne obciążenia przy przeszkleniach, pola jastrychu, dobiegi do rozdzielacza oraz możliwość hydraulicznego zrównoważenia obwodów. Nie zakłada jednej powierzchni na pętlę ani sztywnej równości długości.</p>
              <p>Materiały edukacyjne powstają na podstawie tej samej kolejności pracy: dane budynku, bilans cieplny, dobór powierzchni grzewczej, trasowanie, obliczenia hydrauliczne i kontrola wykonawcza. Kalkulatory pokazują założenia oraz ograniczenia, zamiast wydawać kategoryczną decyzję bez rzutu.</p>
            </div>
            <div class="rk-salon-author-panel rk-salon-author-panel-method">
              <p>W tym opracowaniu oddzielono trzy poziomy decyzji: wydajność cieplną podłogi, geometryczny podział salonu oraz hydraulikę pętli. Model kalkulatora jest jawny, a limit długości i limit spadku ciśnienia pozostają edytowalnymi kryteriami projektowymi.</p>
              <p>Robert jest właścicielem i autorem serwisów branżowych, których powiązanie podaje jawnie:</p>
              <div class="rk-salon-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>

      <aside class="rk-salon-cta rk-salon-final-cta" aria-label="Zamówienie projektu ogrzewania podłogowego">
        <div class="rk-salon-cta-title">Otrzymaj projekt z rzeczywistym podziałem salonu na pętle</div>
        <p>Projekt obejmuje rozrysowane trasy obwodów, długości rur, przepływy, spadki ciśnienia i nastawy rozdzielacza. Podział jest dopasowany do rzutu, źródła ciepła, konstrukcji podłogi, stref wyłączonych i wymaganej mocy pomieszczeń.</p>
        <a class="rk-salon-cta-button rk-salon-sales-cta" href="https://projekt-ogrzewania.pl/produkt/projekt-instalacji-ogrzewania-podlogowego-podlogowki/">Zamów kompletny projekt ogrzewania podłogowego</a>
      </aside>
    </div>
  </div>
</article>

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "WebSite",
      "@id": "https://projekt-ogrzewania.pl/#website",
      "url": "https://projekt-ogrzewania.pl/",
      "name": "Projekt Ogrzewania",
      "inLanguage": "pl-PL",
      "publisher": {"@id": "https://projekt-ogrzewania.pl/#organization"}
    },
    {
      "@type": "Organization",
      "@id": "https://projekt-ogrzewania.pl/#organization",
      "name": "Projekt Ogrzewania",
      "url": "https://projekt-ogrzewania.pl/",
      "logo": {
        "@type": "ImageObject",
        "url": "https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp"
      },
      "founder": {"@id": "https://projekt-ogrzewania.pl/#robert-kucharski"}
    },
    {
      "@type": "Organization",
      "@id": "https://remont.biz.pl/#organization",
      "name": "Remont.biz.pl",
      "url": "https://remont.biz.pl/",
      "founder": {"@id": "https://projekt-ogrzewania.pl/#robert-kucharski"}
    },
    {
      "@type": "Organization",
      "@id": "https://sobir.pl/#organization",
      "name": "Sobir.pl",
      "url": "https://sobir.pl/",
      "founder": {"@id": "https://projekt-ogrzewania.pl/#robert-kucharski"}
    },
    {
      "@type": "Person",
      "@id": "https://projekt-ogrzewania.pl/#robert-kucharski",
      "name": "Robert Kucharski",
      "url": "https://projekt-ogrzewania.pl/author/admin3399/",
      "image": "https://projekt-ogrzewania.pl/wp-content/uploads/2026/04/PO-Robert-Kucharski.webp",
      "jobTitle": "Projektant instalacji sanitarnych, specjalista HVAC i ogrzewania podłogowego",
      "worksFor": {"@id": "https://projekt-ogrzewania.pl/#organization"},
      "knowsAbout": [
        "ogrzewanie podłogowe",
        "obliczenia strat ciepła",
        "hydraulika instalacji grzewczych",
        "projektowanie pętli grzewczych",
        "równoważenie hydrauliczne"
      ],
      "sameAs": [
        "https://www.linkedin.com/in/robert-kucharski-38069b48/",
        "https://www.facebook.com/projektogrzewaniapl",
        "https://x.com/Projekt_HVAC",
        "https://remont.biz.pl/",
        "https://sobir.pl/"
      ]
    },
    {
      "@type": "WebPage",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#webpage",
      "url": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/",
      "name": "Ile pętli podłogówki w salonie? Kalkulator długości rur i przepływu",
      "description": "Oblicz wstępną liczbę pętli w salonie z uwzględnieniem powierzchni czynnej, rozstawu, dobiegu, przepływu i spadku ciśnienia.",
      "isPartOf": {"@id": "https://projekt-ogrzewania.pl/#website"},
      "breadcrumb": {"@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#breadcrumb"},
      "mainEntity": {"@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#article"},
      "inLanguage": "pl-PL",
      "dateModified": "2026-08-31"
    },
    {
      "@type": "BreadcrumbList",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#breadcrumb",
      "itemListElement": [
        {"@type": "ListItem", "position": 1, "name": "Strona główna", "item": "https://projekt-ogrzewania.pl/"},
        {"@type": "ListItem", "position": 2, "name": "Blog", "item": "https://projekt-ogrzewania.pl/blog/"},
        {"@type": "ListItem", "position": 3, "name": "Ile pętli podłogówki w salonie?", "item": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/"}
      ]
    },
    {
      "@type": "WebApplication",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#calculator",
      "name": "Interaktywny analizator liczby pętli w salonie",
      "url": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#rk-salon-analizator",
      "applicationCategory": "UtilitiesApplication",
      "operatingSystem": "Any",
      "browserRequirements": "JavaScript",
      "inLanguage": "pl-PL",
      "isAccessibleForFree": true,
      "offers": {"@type": "Offer", "price": "0", "priceCurrency": "PLN"},
      "creator": {"@id": "https://projekt-ogrzewania.pl/#robert-kucharski"},
      "description": "Narzędzie szacuje długość rury, liczbę pętli, przepływ i referencyjny spadek ciśnienia na podstawie jawnych danych użytkownika."
    },
    {
      "@type": "HowTo",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#howto",
      "name": "Jak wstępnie wyznaczyć liczbę pętli podłogówki w salonie",
      "description": "Kolejność obliczeń łącząca powierzchnię czynną, rozstaw, dobiegi, moc i hydraulikę.",
      "totalTime": "PT20M",
      "step": [
        {"@type": "HowToStep", "position": 1, "name": "Wyznacz powierzchnię czynną", "text": "Odejmij wyłącznie rzeczywiste, uzgodnione strefy bez rur."},
        {"@type": "HowToStep", "position": 2, "name": "Dobierz rozstaw", "text": "Ustal rozstaw podstawowy i ewentualny rozstaw strefy brzegowej na podstawie obliczeń cieplnych."},
        {"@type": "HowToStep", "position": 3, "name": "Oblicz rurę w polu", "text": "Podziel powierzchnie przez odpowiadające im rozstawy i zastosuj jawną rezerwę geometryczną."},
        {"@type": "HowToStep", "position": 4, "name": "Dodaj dobiegi", "text": "Dla każdej pętli dodaj osobno odcinek zasilający i powrotny."},
        {"@type": "HowToStep", "position": 5, "name": "Wyznacz przepływy", "text": "Oblicz całkowity przepływ z mocy i różnicy temperatur, a następnie przypisz moc do poszczególnych obwodów."},
        {"@type": "HowToStep", "position": 6, "name": "Sprawdź hydraulikę i geometrię", "text": "Porównaj długość, spadek ciśnienia, pola jastrychu oraz rzeczywisty przebieg pętli na rzucie."}
      ]
    },
    {
      "@type": "FAQPage",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#faq",
      "mainEntity": [
        {"@type": "Question", "name": "Ile pętli podłogówki na salon 20 m²?", "acceptedAnswer": {"@type": "Answer", "text": "Przy przykładowym rozstawie 15 cm, krótkim dobiegu i całej powierzchni czynnej często wychodzą 2 pętle. Ostateczny wynik zależy od mocy, geometrii, średnicy rury i przyjętego limitu oporu."}},
        {"@type": "Question", "name": "Ile pętli podłogówki na 30 m² salonu?", "acceptedAnswer": {"@type": "Answer", "text": "W przejrzystym przykładzie z artykułu wychodzą 3 pętle, ale gęstszy rozstaw, daleki rozdzielacz, duże przeszklenie lub nieregularny rzut mogą zmienić podział."}},
        {"@type": "Question", "name": "Ile pętli podłogówki na salon 40 m²?", "acceptedAnswer": {"@type": "Answer", "text": "Przy rozstawie 15 cm, dobiegu 6 m w jedną stronę i limicie 100 m przykład wskazuje 4 pętle. To nie jest uniwersalna rekomendacja bez obliczeń cieplnych i hydraulicznych."}},
        {"@type": "Question", "name": "Czy salon 50 m² wystarczą 4 pętle?", "acceptedAnswer": {"@type": "Answer", "text": "Mogą wystarczyć w jednym układzie, a w innym potrzebne będzie 5 lub więcej. Cztery pętle w przykładzie są blisko wpisanego limitu długości, dlatego trzeba sprawdzić hydraulikę i rozrysować rzeczywiste trasy."}},
        {"@type": "Question", "name": "Ile m² może ogrzewać jedna pętla?", "acceptedAnswer": {"@type": "Answer", "text": "Nie ma jednej wartości. Pole na pętlę zależy od rozstawu, dobiegu, obciążenia cieplnego, przepływu, średnicy i geometrii."}},
        {"@type": "Question", "name": "Czy przy oknie HST zawsze robi się osobną pętlę?", "acceptedAnswer": {"@type": "Answer", "text": "Nie. Osobna pętla może być uzasadniona wielkością strefy, jej obciążeniem i geometrią, ale nie jest automatycznym wymogiem dla każdego przeszklenia."}},
        {"@type": "Question", "name": "Czy pętle w jednym salonie muszą być identycznej długości?", "acceptedAnswer": {"@type": "Answer", "text": "Nie. Ważne jest, aby każda pętla miała obliczony przepływ, akceptowalny opór i możliwość regulacji. Podobne długości zwykle ułatwiają równoważenie."}},
        {"@type": "Question", "name": "Czy limit 100 m dla rury 16 × 2 mm wynika wprost z normy?", "acceptedAnswer": {"@type": "Answer", "text": "Nie należy przedstawiać go jako uniwersalnego nakazu normowego. To często stosowane kryterium projektowe oceniane razem z przepływem, średnicą wewnętrzną i oporem."}},
        {"@type": "Question", "name": "Czy więcej pętli oznacza większy całkowity przepływ?", "acceptedAnswer": {"@type": "Answer", "text": "Nie automatycznie. Całkowity przepływ wynika przede wszystkim z wymaganej mocy i projektowej różnicy temperatur. Więcej obwodów dzieli tę wartość pomiędzy pętle."}},
        {"@type": "Question", "name": "Czy kalkulator wystarczy do wykonania podłogówki w salonie?", "acceptedAnswer": {"@type": "Answer", "text": "Nie. Kalkulator daje wstępny podział przy uproszczonej geometrii. Projekt powinien uwzględniać rzut, wyłączenia, dylatacje, rzeczywiste trasy, przepływy i straty ciśnienia."}}
      ]
    },
    {
      "@type": "TechArticle",
      "@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#article",
      "headline": "Ile pętli podłogówki w salonie? Kalkulator długości rur i przepływu",
      "description": "Oblicz wstępną liczbę pętli w salonie z uwzględnieniem powierzchni czynnej, rozstawu, dobiegu, przepływu i spadku ciśnienia.",
      "url": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/",
      "mainEntityOfPage": {"@id": "https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/#webpage"},
      "author": {"@id": "https://projekt-ogrzewania.pl/#robert-kucharski"},
      "publisher": {"@id": "https://projekt-ogrzewania.pl/#organization"},
      "dateModified": "2026-08-31",
      "inLanguage": "pl-PL",
      "articleSection": "Ogrzewanie podłogowe",
      "keywords": [
        "ile pętli podłogówki w salonie",
        "ile pętli podłogówki na 30 m²",
        "salon z kuchnią ile pętli",
        "powierzchnia czynna podłogówki",
        "dobieg do rozdzielacza",
        "długość pętli ogrzewania podłogowego"
      ],
      "isBasedOn": [
        "https://www.iso.org/standard/74683.html",
        "https://www.iso.org/standard/74684.html",
        "https://www.iso.org/standard/74685.html"
      ],
      "about": [
        {"@type": "Thing", "name": "Ogrzewanie podłogowe"},
        {"@type": "Thing", "name": "Pętle grzewcze w salonie"},
        {"@type": "Thing", "name": "Hydraulika instalacji grzewczych"}
      ]
    }
  ]
}
</script>

<script>
(function () {
  "use strict";

  var root = document.getElementById("rk-salon-guide");
  if (!root) { return; }

  var defaults = {
    "rk-salon-total-area": 35,
    "rk-salon-active-area": 30,
    "rk-salon-edge-area": 4,
    "rk-salon-main-spacing": 15,
    "rk-salon-edge-spacing": 10,
    "rk-salon-run": 6,
    "rk-salon-allowance": 5,
    "rk-salon-length-limit": 100,
    "rk-salon-heat-loss": 2400,
    "rk-salon-delta-t": 5,
    "rk-salon-inner-diameter": 12,
    "rk-salon-water-temp": 30,
    "rk-salon-extra-loss": 3,
    "rk-salon-loss-limit": 20
  };

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

  function numberValue(id, fallback) {
    var element = byId(id);
    if (!element) { return fallback; }
    var parsed = Number.parseFloat(String(element.value).replace(",", "."));
    if (!Number.isFinite(parsed)) { return fallback; }
    return parsed;
  }

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

  function formatNumber(value, digits) {
    if (!Number.isFinite(value)) { return "—"; }
    return value.toLocaleString("pl-PL", {
      minimumFractionDigits: digits,
      maximumFractionDigits: digits
    });
  }

  function loopWord(value) {
    if (value === 1) { return "pętla"; }
    var last = value % 10;
    var lastTwo = value % 100;
    if (last >= 2) {
      if (last <= 4) {
        if (lastTwo < 12) { return "pętle"; }
        if (lastTwo > 14) { return "pętle"; }
      }
    }
    return "pętli";
  }

  function readData() {
    return {
      totalArea: numberValue("rk-salon-total-area", defaults["rk-salon-total-area"]),
      activeArea: numberValue("rk-salon-active-area", defaults["rk-salon-active-area"]),
      edgeArea: numberValue("rk-salon-edge-area", defaults["rk-salon-edge-area"]),
      mainSpacing: numberValue("rk-salon-main-spacing", defaults["rk-salon-main-spacing"]),
      edgeSpacing: numberValue("rk-salon-edge-spacing", defaults["rk-salon-edge-spacing"]),
      run: numberValue("rk-salon-run", defaults["rk-salon-run"]),
      allowance: numberValue("rk-salon-allowance", defaults["rk-salon-allowance"]),
      lengthLimit: numberValue("rk-salon-length-limit", defaults["rk-salon-length-limit"]),
      heatLoss: numberValue("rk-salon-heat-loss", defaults["rk-salon-heat-loss"]),
      deltaT: numberValue("rk-salon-delta-t", defaults["rk-salon-delta-t"]),
      innerDiameter: numberValue("rk-salon-inner-diameter", defaults["rk-salon-inner-diameter"]),
      waterTemp: numberValue("rk-salon-water-temp", defaults["rk-salon-water-temp"]),
      extraLoss: numberValue("rk-salon-extra-loss", defaults["rk-salon-extra-loss"]),
      lossLimit: numberValue("rk-salon-loss-limit", defaults["rk-salon-loss-limit"])
    };
  }

  function validateData(data) {
    var errors = [];
    if (!(data.totalArea > 0)) { errors.push("Powierzchnia salonu musi być większa od zera."); }
    if (!(data.activeArea > 0)) { errors.push("Powierzchnia czynna musi być większa od zera."); }
    if (data.activeArea > data.totalArea) { errors.push("Powierzchnia czynna nie może być większa od całej powierzchni salonu."); }
    if (data.edgeArea < 0) { errors.push("Powierzchnia strefy brzegowej nie może być ujemna."); }
    if (data.edgeArea > data.activeArea) { errors.push("Strefa brzegowa nie może być większa od powierzchni czynnej."); }
    if (!(data.mainSpacing > 0)) { errors.push("Rozstaw podstawowy musi być większy od zera."); }
    if (!(data.edgeSpacing > 0)) { errors.push("Rozstaw strefy musi być większy od zera."); }
    if (data.run < 0) { errors.push("Dobieg nie może być ujemny."); }
    if (data.allowance < 0) { errors.push("Rezerwa geometryczna nie może być ujemna."); }
    if (!(data.lengthLimit > 0)) { errors.push("Limit długości musi być większy od zera."); }
    if (!(data.heatLoss > 0)) { errors.push("Strata ciepła musi być większa od zera."); }
    if (!(data.deltaT > 0)) { errors.push("Różnica temperatur musi być większa od zera."); }
    if (!(data.innerDiameter > 0)) { errors.push("Średnica wewnętrzna musi być większa od zera."); }
    if (!(data.lossLimit > 0)) { errors.push("Limit spadku ciśnienia musi być większy od zera."); }
    if (data.lengthLimit <= (2 * data.run + 5)) { errors.push("Limit pętli jest zbyt mały w stosunku do dwóch dobiegów."); }
    return errors;
  }

  function hydraulicForLoop(length, flowLitresMinute, data) {
    var diameter = data.innerDiameter / 1000;
    var flowCubicSecond = flowLitresMinute / 60000;
    var area = Math.PI * diameter * diameter / 4;
    var velocity = flowCubicSecond / area;
    var temperatureOffset = data.waterTemp - 20;
    var density = clamp(998.2 - 0.3 * temperatureOffset, 970, 1001);
    var kinematicViscosity = 1.004e-6 * Math.exp(-0.022 * temperatureOffset);
    kinematicViscosity = clamp(kinematicViscosity, 0.4e-6, 1.8e-6);
    var reynolds = velocity * diameter / kinematicViscosity;
    var friction = 0;
    if (reynolds > 0) {
      if (reynolds < 2300) {
        friction = 64 / reynolds;
      } else {
        var roughness = 0.0000015;
        var term = roughness / (3.7 * diameter) + 5.74 / Math.pow(reynolds, 0.9);
        friction = 0.25 / Math.pow(Math.log10(term), 2);
      }
    }
    var linearLoss = friction * (length / diameter) * (density * velocity * velocity / 2) / 1000;
    return {
      loss: linearLoss + data.extraLoss,
      linearLoss: linearLoss,
      velocity: velocity,
      reynolds: reynolds
    };
  }

  function candidateFor(count, fieldLength, totalFlow, data) {
    var totalLength = fieldLength + count * 2 * data.run;
    var averageLength = totalLength / count;
    var flowPerLoop = totalFlow / count;
    var hydraulic = hydraulicForLoop(averageLength, flowPerLoop, data);
    var passesLength = averageLength <= data.lengthLimit;
    var passesLoss = hydraulic.loss <= data.lossLimit;
    var assessment = "za mało obwodów";
    var badgeClass = "is-fail";
    if (passesLength) {
      if (passesLoss) {
        var lengthRatio = averageLength / data.lengthLimit;
        var lossRatio = hydraulic.loss / data.lossLimit;
        assessment = "spełnia kryteria";
        badgeClass = "is-pass";
        if (lengthRatio > 0.9) {
          assessment = "wariant graniczny";
          badgeClass = "is-limit";
        } else if (lossRatio > 0.85) {
          assessment = "wariant graniczny";
          badgeClass = "is-limit";
        }
      }
    }
    return {
      count: count,
      totalLength: totalLength,
      averageLength: averageLength,
      flowPerLoop: flowPerLoop,
      pressureLoss: hydraulic.loss,
      velocity: hydraulic.velocity,
      reynolds: hydraulic.reynolds,
      passesLength: passesLength,
      passesLoss: passesLoss,
      assessment: assessment,
      badgeClass: badgeClass
    };
  }

  function calculateModel(data) {
    var mainArea = data.activeArea - data.edgeArea;
    var mainSpacingMetres = data.mainSpacing / 100;
    var edgeSpacingMetres = data.edgeSpacing / 100;
    var allowanceFactor = 1 + data.allowance / 100;
    var fieldLength = mainArea / mainSpacingMetres;
    if (data.edgeArea > 0) { fieldLength += data.edgeArea / edgeSpacingMetres; }
    fieldLength *= allowanceFactor;

    var usableFieldPerLoop = data.lengthLimit - 2 * data.run;
    var countFromLength = Math.max(1, Math.ceil(fieldLength / usableFieldPerLoop));
    var totalFlow = data.heatLoss / (69.8 * data.deltaT);
    var recommendedCount = countFromLength;
    var recommended = candidateFor(recommendedCount, fieldLength, totalFlow, data);

    while (recommendedCount < 30) {
      if (recommended.passesLength) {
        if (recommended.passesLoss) { break; }
      }
      recommendedCount += 1;
      recommended = candidateFor(recommendedCount, fieldLength, totalFlow, data);
    }

    var startCount = Math.max(1, recommendedCount - 1);
    var candidateCounts = [startCount, recommendedCount, recommendedCount + 1];
    var uniqueCounts = [];
    candidateCounts.forEach(function (value) {
      if (uniqueCounts.indexOf(value) === -1) { uniqueCounts.push(value); }
    });
    var candidates = uniqueCounts.map(function (value) {
      return candidateFor(value, fieldLength, totalFlow, data);
    });

    return {
      mainArea: mainArea,
      excludedArea: data.totalArea - data.activeArea,
      fieldLength: fieldLength,
      totalFlow: totalFlow,
      unitLoad: data.heatLoss / data.activeArea,
      countFromLength: countFromLength,
      recommendedCount: recommendedCount,
      recommended: recommended,
      candidates: candidates
    };
  }

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

  function renderComparison(model) {
    var body = byId("rk-salon-compare-body");
    if (!body) { return; }
    var rows = model.candidates.map(function (candidate) {
      var rowClass = candidate.count === model.recommendedCount ? " class=\"is-recommended\"" : "";
      var label = candidate.count === model.recommendedCount ? "rekomendowany" : candidate.assessment;
      return "<tr" + rowClass + ">" +
        "<td data-label=\"Liczba obwodów\"><strong>" + candidate.count + "</strong> " + loopWord(candidate.count) + "</td>" +
        "<td data-label=\"Rura łącznie\">" + formatNumber(candidate.totalLength, 0) + " m</td>" +
        "<td data-label=\"Średnia długość\">" + formatNumber(candidate.averageLength, 1) + " m</td>" +
        "<td data-label=\"Przepływ na pętlę\">" + formatNumber(candidate.flowPerLoop, 2) + " l/min</td>" +
        "<td data-label=\"Spadek ciśnienia\">" + formatNumber(candidate.pressureLoss, 1) + " kPa</td>" +
        "<td data-label=\"Ocena\"><span class=\"rk-salon-badge " + candidate.badgeClass + "\">" + label + "</span></td>" +
        "</tr>";
    });
    body.innerHTML = rows.join("");
  }

  function renderDiagnostics(data, model) {
    var container = byId("rk-salon-diagnostics");
    if (!container) { return; }
    var messages = [];
    var excludedShare = model.excludedArea / data.totalArea;

    if (excludedShare > 0.3) {
      messages.push({warn: true, text: "Powierzchnia czynna jest mniejsza od 70% salonu. Sprawdź na rzucie, czy wszystkie wyłączenia są rzeczywiście trwałe i czy pozostałe pole może pokryć stratę ciepła."});
    } else {
      messages.push({warn: false, text: "Powierzchnia wyłączona wynosi " + formatNumber(model.excludedArea, 1) + " m². Kalkulator nie narzucił stałego procentu zabudowy."});
    }

    if (data.run > 10) {
      messages.push({warn: true, text: "Dobieg jest długi. Każda dodatkowa pętla dodaje około " + formatNumber(2 * data.run, 1) + " m rury zasilającej i powrotnej."});
    } else {
      messages.push({warn: false, text: "Do każdego obwodu doliczono osobno dwa dobiegi po " + formatNumber(data.run, 1) + " m."});
    }

    if (data.edgeArea > 0) {
      messages.push({warn: false, text: "Strefa brzegowa obejmuje " + formatNumber(data.edgeArea, 1) + " m² przy rozstawie " + formatNumber(data.edgeSpacing, 1) + " cm. Kalkulator nie przesądza, czy wymaga osobnej pętli."});
    } else {
      messages.push({warn: false, text: "Nie wydzielono strefy brzegowej. Zweryfikuj lokalne obciążenie przy dużych przeszkleniach."});
    }

    if (model.unitLoad > 100) {
      messages.push({warn: true, text: "Wymagana moc jednostkowa wynosi " + formatNumber(model.unitLoad, 0) + " W/m². Sama większa liczba pętli nie potwierdza, że podłoga uzyska taką moc bez przekroczenia ograniczeń temperatury powierzchni."});
    } else {
      messages.push({warn: false, text: "Wymagana średnia moc czynnego pola wynosi " + formatNumber(model.unitLoad, 0) + " W/m². Trzeba ją jeszcze sprawdzić dla konkretnej konstrukcji podłogi i parametrów wody."});
    }

    if (model.recommendedCount > model.countFromLength) {
      messages.push({warn: true, text: "Samo kryterium długości wskazało " + model.countFromLength + " " + loopWord(model.countFromLength) + ", ale model hydrauliczny zwiększył wynik do " + model.recommendedCount + "."});
    } else {
      messages.push({warn: false, text: "Wpisane kryterium długości i referencyjnego oporu spełnia pierwszy wspólny wariant: " + model.recommendedCount + " " + loopWord(model.recommendedCount) + "."});
    }

    messages.push({warn: true, text: "Geometria, dylatacje, kominek, wyspa i rzeczywista trasa ślimaka mogą wymusić jeszcze inny podział niż model średni."});

    container.innerHTML = messages.map(function (item) {
      var className = item.warn ? "rk-salon-diagnostic is-warn" : "rk-salon-diagnostic";
      return "<div class=\"" + className + "\">" + item.text + "</div>";
    }).join("");
  }

  function drawChart(data, model) {
    var canvas = byId("rk-salon-chart");
    if (!canvas) { return; }
    var context = canvas.getContext("2d");
    if (!context) { return; }
    var wrapperWidth = canvas.parentElement ? canvas.parentElement.clientWidth : 600;
    var displayWidth = Math.max(300, wrapperWidth);
    var displayHeight = 270;
    var pixelRatio = window.devicePixelRatio || 1;
    canvas.width = Math.round(displayWidth * pixelRatio);
    canvas.height = Math.round(displayHeight * pixelRatio);
    canvas.style.width = displayWidth + "px";
    canvas.style.height = displayHeight + "px";
    context.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
    context.clearRect(0, 0, displayWidth, displayHeight);

    var padding = {left: 48, right: 48, top: 30, bottom: 43};
    var plotWidth = displayWidth - padding.left - padding.right;
    var plotHeight = displayHeight - padding.top - padding.bottom;
    var lengthMax = Math.max(data.lengthLimit * 1.2, 120);
    var lossMax = Math.max(data.lossLimit * 1.35, 25);
    var candidates = model.candidates;

    context.font = "11px system-ui, sans-serif";
    context.lineWidth = 1;
    for (var grid = 0; grid <= 4; grid += 1) {
      var y = padding.top + plotHeight * grid / 4;
      context.strokeStyle = "#d8e6eb";
      context.beginPath();
      context.moveTo(padding.left, y);
      context.lineTo(displayWidth - padding.right, y);
      context.stroke();
      var lengthValue = lengthMax * (1 - grid / 4);
      var lossValue = lossMax * (1 - grid / 4);
      context.fillStyle = "#617784";
      context.textAlign = "right";
      context.fillText(formatNumber(lengthValue, 0), padding.left - 7, y + 4);
      context.textAlign = "left";
      context.fillText(formatNumber(lossValue, 0), displayWidth - padding.right + 7, y + 4);
    }

    var lengthLimitY = padding.top + plotHeight * (1 - data.lengthLimit / lengthMax);
    context.setLineDash([6, 5]);
    context.strokeStyle = "#ff6a3d";
    context.beginPath();
    context.moveTo(padding.left, lengthLimitY);
    context.lineTo(displayWidth - padding.right, lengthLimitY);
    context.stroke();
    context.setLineDash([]);

    var step = plotWidth / candidates.length;
    var barWidth = Math.min(62, step * 0.45);
    var points = [];
    candidates.forEach(function (candidate, index) {
      var centerX = padding.left + step * index + step / 2;
      var barHeight = clamp(candidate.averageLength / lengthMax, 0, 1) * plotHeight;
      var barY = padding.top + plotHeight - barHeight;
      context.fillStyle = candidate.count === model.recommendedCount ? "#078fbe" : "#8fb8c7";
      context.fillRect(centerX - barWidth / 2, barY, barWidth, barHeight);
      context.fillStyle = "#203744";
      context.textAlign = "center";
      context.fillText(candidate.count + " " + loopWord(candidate.count), centerX, displayHeight - 20);
      context.fillText(formatNumber(candidate.averageLength, 0) + " m", centerX, Math.max(15, barY - 7));

      var pointY = padding.top + plotHeight * (1 - clamp(candidate.pressureLoss / lossMax, 0, 1));
      points.push({x: centerX, y: pointY, value: candidate.pressureLoss});
    });

    context.strokeStyle = "#ff6a3d";
    context.lineWidth = 3;
    context.beginPath();
    points.forEach(function (point, index) {
      if (index === 0) { context.moveTo(point.x, point.y); }
      else { context.lineTo(point.x, point.y); }
    });
    context.stroke();
    points.forEach(function (point) {
      context.fillStyle = "#ff6a3d";
      context.beginPath();
      context.arc(point.x, point.y, 5, 0, Math.PI * 2);
      context.fill();
      context.fillStyle = "#203744";
      context.textAlign = "center";
      context.fillText(formatNumber(point.value, 1) + " kPa", point.x, point.y - 10);
    });

    context.save();
    context.translate(13, padding.top + plotHeight / 2);
    context.rotate(-Math.PI / 2);
    context.fillStyle = "#47606d";
    context.textAlign = "center";
    context.fillText("długość [m]", 0, 0);
    context.restore();
    context.save();
    context.translate(displayWidth - 9, padding.top + plotHeight / 2);
    context.rotate(Math.PI / 2);
    context.fillStyle = "#47606d";
    context.textAlign = "center";
    context.fillText("spadek [kPa]", 0, 0);
    context.restore();
  }

  function svgElement(name, attributes) {
    var element = document.createElementNS("http://www.w3.org/2000/svg", name);
    Object.keys(attributes).forEach(function (key) {
      element.setAttribute(key, String(attributes[key]));
    });
    return element;
  }

  function drawPlan(data, model) {
    var svg = byId("rk-salon-plan");
    if (!svg) { return; }
    while (svg.firstChild) { svg.removeChild(svg.firstChild); }

    var roomX = 40;
    var roomY = 34;
    var roomWidth = 520;
    var roomHeight = 190;
    var count = model.recommendedCount;
    var edgeShare = data.activeArea > 0 ? data.edgeArea / data.activeArea : 0;
    var edgeWidth = clamp(roomWidth * edgeShare, 0, roomWidth * 0.32);

    svg.appendChild(svgElement("rect", {x: roomX, y: roomY, width: roomWidth, height: roomHeight, rx: 13, fill: "#e9f3f6", stroke: "#14384d", "stroke-width": 2}));
    if (edgeWidth > 1) {
      svg.appendChild(svgElement("rect", {x: roomX + roomWidth - edgeWidth, y: roomY, width: edgeWidth, height: roomHeight, rx: 9, fill: "#ffe4d9"}));
    }

    var bandHeight = roomHeight / count;
    for (var index = 0; index < count; index += 1) {
      var top = roomY + index * bandHeight;
      var center = top + bandHeight / 2;
      if (index > 0) {
        svg.appendChild(svgElement("line", {x1: roomX, y1: top, x2: roomX + roomWidth, y2: top, stroke: "#9fb8c3", "stroke-width": 1, "stroke-dasharray": "5 5"}));
      }
      var pathData = "M " + (roomX + 20) + " " + center;
      var segments = 7;
      for (var segment = 1; segment <= segments; segment += 1) {
        var x = roomX + 20 + (roomWidth - 40) * segment / segments;
        var offset = segment % 2 === 0 ? -bandHeight * 0.22 : bandHeight * 0.22;
        pathData += " L " + x + " " + (center + offset);
      }
      svg.appendChild(svgElement("path", {d: pathData, fill: "none", stroke: index % 2 === 0 ? "#078fbe" : "#16836b", "stroke-width": 3, "stroke-linecap": "round", "stroke-linejoin": "round"}));
      var loopText = svgElement("text", {x: roomX + 9, y: center - 7, fill: "#102536", "font-size": 11, "font-weight": 800});
      loopText.textContent = "P" + (index + 1);
      svg.appendChild(loopText);
    }

    svg.appendChild(svgElement("line", {x1: roomX + roomWidth - 130, y1: roomY - 8, x2: roomX + roomWidth, y2: roomY - 8, stroke: "#25c7d8", "stroke-width": 7, "stroke-linecap": "round"}));
    var windowText = svgElement("text", {x: roomX + roomWidth - 128, y: roomY - 16, fill: "#14384d", "font-size": 11, "font-weight": 800});
    windowText.textContent = "przeszklenie / HST";
    svg.appendChild(windowText);

    if (edgeWidth > 1) {
      var edgeText = svgElement("text", {x: roomX + roomWidth - edgeWidth / 2, y: roomY + roomHeight + 22, fill: "#d94b3d", "font-size": 11, "font-weight": 800, "text-anchor": "middle"});
      edgeText.textContent = "strefa " + formatNumber(data.edgeArea, 1) + " m²";
      svg.appendChild(edgeText);
    }
    var caption = svgElement("text", {x: roomX, y: 258, fill: "#5f7783", "font-size": 11});
    caption.textContent = count + " " + loopWord(count) + " • schemat ideowy, nie trasa wykonawcza";
    svg.appendChild(caption);
  }

  function renderModel(data, model) {
    var recommendation = model.recommended;
    setText("rk-salon-loop-count", model.recommendedCount + " " + loopWord(model.recommendedCount));
    setText("rk-salon-result-summary", "Pierwszy wspólny wariant spełniający wpisany limit długości " + formatNumber(data.lengthLimit, 0) + " m i referencyjny limit oporu " + formatNumber(data.lossLimit, 0) + " kPa.");
    setText("rk-salon-field-length", formatNumber(model.fieldLength, 0) + " m");
    setText("rk-salon-total-length", formatNumber(recommendation.totalLength, 0) + " m");
    setText("rk-salon-average-length", formatNumber(recommendation.averageLength, 1) + " m");
    setText("rk-salon-unit-load", formatNumber(model.unitLoad, 0) + " W/m²");
    setText("rk-salon-total-flow", formatNumber(model.totalFlow, 2) + " l/min");
    setText("rk-salon-loop-flow", formatNumber(recommendation.flowPerLoop, 2) + " l/min");
    setText("rk-salon-pressure-loss", formatNumber(recommendation.pressureLoss, 1) + " kPa");
    setText("rk-salon-velocity", formatNumber(recommendation.velocity, 2) + " m/s");

    var status = byId("rk-salon-status");
    if (status) {
      status.className = "rk-salon-result-status";
      var lengthRatio = recommendation.averageLength / data.lengthLimit;
      var lossRatio = recommendation.pressureLoss / data.lossLimit;
      if (lengthRatio > 0.9) {
        status.className += " is-borderline";
        status.innerHTML = "<strong>Wariant graniczny długościowo.</strong> Średnia pętla wykorzystuje ponad 90% wpisanego limitu. Porównaj wariant z dodatkowym obwodem i sprawdź geometrię na rzucie.";
      } else if (lossRatio > 0.85) {
        status.className += " is-borderline";
        status.innerHTML = "<strong>Wariant graniczny hydraulicznie.</strong> Referencyjny opór wykorzystuje ponad 85% wpisanego limitu. Sprawdź krytyczną, a nie tylko średnią pętlę.";
      } else {
        status.innerHTML = "<strong>Wariant spełnia wpisane kryteria modelu.</strong> Nie jest to jeszcze potwierdzenie wydajności cieplnej ani poprawności rzeczywistej trasy pętli.";
      }
      if (model.recommendedCount >= 30) {
        status.className = "rk-salon-result-status is-warning";
        status.innerHTML = "<strong>Nie uzyskano rozsądnego wariantu w zakresie modelu.</strong> Sprawdź dane wejściowe, jednostki i przyjęte limity.";
      }
    }

    renderComparison(model);
    renderDiagnostics(data, model);
    drawChart(data, model);
    drawPlan(data, model);
  }

  function calculate() {
    var data = readData();
    var errors = validateData(data);
    var errorBox = byId("rk-salon-error");
    if (errors.length > 0) {
      if (errorBox) {
        errorBox.textContent = errors.join(" ");
        errorBox.classList.add("is-visible");
      }
      return;
    }
    if (errorBox) {
      errorBox.textContent = "";
      errorBox.classList.remove("is-visible");
    }
    renderModel(data, calculateModel(data));
  }

  function resetCalculator() {
    Object.keys(defaults).forEach(function (id) {
      var element = byId(id);
      if (element) { element.value = String(defaults[id]); }
    });
    calculate();
  }

  var calculateButton = byId("rk-salon-calculate");
  var resetButton = byId("rk-salon-reset");
  if (calculateButton) { calculateButton.addEventListener("click", calculate); }
  if (resetButton) { resetButton.addEventListener("click", resetCalculator); }

  var calculator = root.querySelector("[data-rk-salon-calculator]");
  if (calculator) {
    calculator.querySelectorAll("input, select").forEach(function (field) {
      field.addEventListener("change", calculate);
      field.addEventListener("input", function () {
        window.clearTimeout(field.rkSalonTimer);
        field.rkSalonTimer = window.setTimeout(calculate, 220);
      });
    });
  }

  var navLinks = root.querySelectorAll(".rk-salon-nav-track a[href^='#']");
  navLinks.forEach(function (link) {
    link.addEventListener("click", function (event) {
      var target = root.querySelector(link.getAttribute("href"));
      if (!target) { return; }
      event.preventDefault();
      target.scrollIntoView({behavior: "smooth", block: "start"});
    });
  });

  function updateProgress() {
    var progress = root.querySelector(".rk-salon-progress");
    if (!progress) { return; }
    var documentElement = document.documentElement;
    var scrollTop = window.pageYOffset || documentElement.scrollTop || 0;
    var scrollable = documentElement.scrollHeight - documentElement.clientHeight;
    var percentage = scrollable > 0 ? scrollTop / scrollable * 100 : 0;
    progress.style.width = clamp(percentage, 0, 100) + "%";
  }

  var resizeTimer = 0;
  window.addEventListener("scroll", updateProgress, {passive: true});
  window.addEventListener("resize", function () {
    window.clearTimeout(resizeTimer);
    resizeTimer = window.setTimeout(calculate, 140);
  });

  calculate();
  updateProgress();
}());
</script>
<p>Artykuł <a href="https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/">Salon ile pętli podłogówki? Kalkulator długości rur i przepływu.</a> pochodzi z serwisu <a href="https://projekt-ogrzewania.pl">Projekt Ogrzewania</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://projekt-ogrzewania.pl/salon-ile-petli-podlogowki/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
