PageSourceSearch

https://toolbreezy.com/_next/static/chunks/49916-63914475b81dec64.js

js toolbreezy.com collected 2026-09-24 14:58:08 UTC 42,469 bytes, 21 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[49916],{49916:(e,t,a)=>{a.r(t),a.d(t,{addressCarriesOwnState:()=>G,default:()=>U});var s=a(95155),i=a(12115),r=a(33789),o=a(33534),n=a(16110),l=a(69869),h=a(12513),u=a(27784);let d=1.2742580966400001,c={key:"masonry",label:"exposed stone, tile, brick or concrete",lowFt3PerSqFt:2,highFt3PerSqFt:3,sourceWording:"Exposed Stone, Tile, Brick, or Concrete"},m={key:"logWall",label:"uninsulated log wall",lowFt3PerSqFt:1.5,highFt3PerSqFt:2,sourceWording:"Uninsulated Log Walls"},p=[{key:"standardGlass",label:"standard glass door and windows",lowFt3PerSqFt:1.5,highFt3PerSqFt:1.5,sourceWording:"Standard Glass Doors / Windows"},{key:"fullGlass",label:"full glass wall or double pane glazing",lowFt3PerSqFt:3,highFt3PerSqFt:3,sourceWording:"Full Glass Walls / Double Pane"},c,m],g="UL 875 in the United States and CSA C22.2 No. 164 in Canada, tied to NFPA 70, the National Electrical Code.",w=[{where:"Top of the heater up to the ceiling",lowIn:44,highIn:48,condition:"to an unprotected combustible ceiling"},{where:"Side and rear walls, shielded unit",lowIn:2,highIn:6,condition:"wall-mounted electric units with integrated shielding"},{where:"Side and rear walls, unshielded unit",lowIn:18,highIn:24,condition:"unshielded or larger units near combustible wood walls"},{where:"Front of the heater to the guard rail",lowIn:2,highIn:8,condition:"to the safety guard rail in front of the stones"},{where:"Clear walking space in front",lowIn:36,highIn:36,condition:"clear pathway in front of the heater for user movement"}],f={minPlanDimensionFt:2,maxPlanDimensionFt:30,minCeilingFt:5,minHeaterKw:.5,maxHeaterKw:40},b=e=>null==e||!Number.isFinite(e),x=(e,t)=>{let a=10**t;return Math.round(e*a)/a},v=e=>`${x(e,2)} kW`,y=e=>{let t=x(e,2);return`${t} ${1===t?"foot":"feet"}`},j=e=>b(e)?0:e,F={rawVolumeFt3:null,rawVolumeM3:null,interiorSurfaceSqFt:null,declaredSurfaceSqFt:null,terms:[],adjustedVolumeFt3Low:null,adjustedVolumeFt3High:null,ceilingFactor:null,exteriorFactorLow:null,exteriorFactorHigh:null,requiredKwLow:null,requiredKwHigh:null,metricRuleKwLow:null,metricRuleKwHigh:null,publishedFloorKwLow:null,publishedFloorKwHigh:null,supplyClass:null},k={wood:"A wood-fired sauna stove is not rated in kilowatts and it is not sized by this arithmetic. Its maker states the room volume range the stove was tested for, in cubic feet or cubic meters, and that range is what you match your room against. The published rule this page uses is written for electric heaters and the research says nothing at all about wood, so there is no honest number to give you here. There is also a flue, a hearth and a set of clearances involved that an electric heater does not have.",gas:"A gas sauna heater is vented, and a vented appliance is sized and installed off its own listing and the gas code rather than off a room-volume rule. The research behind this page covers electric heaters only. A licensed gas fitter sizes this one.",infrared:"An infrared cabin is not sized by room volume at all. An infrared panel warms the person in front of it rather than heating the air in the room, so the figure that matters is panel coverage and placement against where somebody sits, not cubic feet of air. The published rule on this page would give you a number, and the number would be meaningless."},N={limitVerdict:null,heaterKw:null,coversFt3:null,achievedFt3PerKwLow:null,achievedFt3PerKwHigh:null,timesDesignLow:null,timesDesignHigh:null},$={208:208,230:230,240:240},q=[`It will not tell you what clearance your heater needs. The published envelope is on this page as a reference, and the figures that govern your installation are on the appliance's own listing under ${g} A manufacturer who builds a heat shield into the casing is listed for a shorter clearance than one who does not, and only the listing knows which you have.`,"It will not tell you a heater is too big. The research publishes a maximum room volume per kilowatt and n
1o minimum, so there is no published line to check an oversized heater against, and inventing one would be worse than saying nothing. The room volume range on the heater itself is what answers that.","It will not size a breaker or a wire. The National Electrical Code treats a sauna heater as a continuous load and requires the circuit to be sized at 125 percent of it, and the research says plainly that the final circuit design belongs to a licensed electrician.","It will not size a wood-fired stove, a gas heater or an infrared cabin. The rule here is written for electric heaters, and a wood stove is rated against a room volume range by its maker while an infrared panel warms a person rather than a room.","It will not size a room with a ceiling over 8 feet. The research calls that a design fault to fix by dropping the ceiling or raising the benches, because the heat layer sits above the bathers whatever heater goes in.","It will not size a room past 15 kilowatts. That is the ceiling residential electric heaters are built to in North America, and beyond it the supply is commercial three-phase and the job belongs to an engineer.","It will not name a heater model or a size ladder, because the sizes on offer differ between manufacturers and the research does not publish a list.","It will not say an installation is safe or code compliant. It runs published trade figures against measurements you took, and the heater listing and the inspector who signs the permit are what decide."],H="This page applies a published trade rule to a room you measured, and it is not an inspection, an approval or a substitute for the instructions that come with the heater. The two failures here run in opposite directions: an undersized heater never reaches temperature and wastes the build, while an oversized one in a small room is a burn and fire risk, and that is the direction people err in because the intuition that bigger is safer runs backwards. The research behind this page publishes a maximum room volume per kilowatt and n
1o minimum, so nothing here calls a heater too large, and the room volume range the appliance is listed for is the figure that answers it. The clearance table on this page is a reference and not a check, because the research says the distances vary by manufacturer engineering, which means the numbers that govern are on the listing your heater carries under "+g+' The published imperial and metric rules do not agree with each other: 45 cubic feet per kilowatt is 1.274 cubic meters per kilowatt, so the metric rule of thumb asks for about 27 percent more output, and the metric surface allowance of 1.2 cubic meters per square meter works out at 3.94 cubic feet per square foot against the imperial 1.5 for standard glass. This page sizes with the imperial set because the worked example in the research, a 15 kilowatt heater covering 600 to 700 cubic feet reproduces the imperial rate and does not reproduce the metric one, and both readings are printed so you can see the gap. Where the source gives a range, for stone, tile and log surfaces and for the outdoor adjustment, this page carries the range through instead of picking an end, and it reads the 10 percent per foot ceiling uplift proportionally because the source says "every additional foot" without saying whether a part foot counts. Three figures here are assumptions this page made rather than figures the research gave: the 2 to 30 foot limit on room length and width, the 5 foot minimum ceiling, and the 0.5 to 40 kilowatt range for a heater you enter, and all three only ever produce a question rather than an answer. The sizing rule itself comes from sauna trade sources rather than from a code document, unlike the clearance standards, so treat the kilowatt figure as a starting point for a conversation with a supplier and an electrician.';var L=a(49480);let S="toolbreezy:sauna-heater-size-calculator",K="flex h-9 w-full rounded-md border border-input bg-background px-2 text-sm shadow-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",T=e=>""===e.trim()?null:(0,L.jO)(e),P=e=>x(e,0).toLocaleString(void 0,{maximumFractionDigits:0}),E=e=>x(e,1).toLocaleString(void 0,{maximumFractionDigits:1}),I=e=>x(e,2).toLocaleString(void 0,{maximumFractionDigits:2}),z=["unanswered","electric","wood","gas","infrared"],W={unanswered:"Pick one before anything else",electric:"Electric, rated in kilowatts",wood:"Wood-fired sauna stove",gas:"Gas, with a flue",infrared:"Infrared cabin with panels"},C=["unanswered","insulated","not-insulated","unsure"],A={unanswered:"Pick one before anything else",insulated:"Insulated: mineral wool, foil vapor barrier, wood paneling","not-insulated":"Not insulated to that specification",unsure:"I do not know what is behind the paneling"},V=["unanswered","no","yes"],R={unanswered:"Pick one before anything else",no:"No, it is indoors with warm rooms around it",yes:"Yes, outdoors or against a cold exterior wall"},D=["unanswered","240","230","208"],M={unanswered:"Pick your supply voltage",240:"240 V, the usual North American residential supply",230:"230 V, the usual European supply",208:"208 V, a three-phase building supply"},O=["ht","in","ex","v","l","w","h","g","fg","ms","lg","kw"];function G(e){let t=new URLSearchParams(e.replace(/^\?/,""));return(0,l.Yc)(t,O)}function U(){let[e,t]=(0,i.useState)("unanswered"),[a,L]=(0,i.useState)("unanswered"),[U,Y]=(0,i.useState)("unanswered"),[B,_]=(0,i.useState)("6"),[Z,J]=(0,i.useState)("5"),[Q,X]=(0,i.useState)("7"),[ee,et]=(0,i.useState)(""),[ea,es]=(0,i.useState)(""),[ei,er]=(0,i.useState)(""),[eo,en]=(0,i.useState)(""),[el,eh]=(0,i.useState)(""),[eu,ed]=(0,i.useState)("unanswered");(0,i.useEffect)(()=>{let e=new URLSearchParams(window.location.search),a=(t,a)=>{let s=e.get(t);return null!==s&&a.includes(s)?s:null};if(G(window.location.search)){let s=t=>e.get(t),i=a("ht",z);i&&t(i);let r=a("in",C);r&&L(r);let o=a("ex",V);o&&Y(o);let n=a("v",D);n&&ed(n),null!==s("l")&&_(s("l").slice(0,10)),null!==s("w")&&J(s("w").slice(0,10)),null!==s("h")&&X(s("h").slice(0,10)),null!==s("g")&&et(s("g").slice(0,10)),null!==s("fg")&&es(s("fg").slice(0,10)),null!==s("ms")&&er(s("ms").slice(0,10)),null!==s("lg")&&en(s("lg").slice(0,10)),null!==s("kw")&&eh(s("kw").slice(0,10));return}let s=(0,h.y5)(S);s.found&&(t(s.oneOf("ht",z,"unanswered")),L(s.oneOf("in",C,"unanswered")),Y(s.oneOf("ex",V,"unanswered")),ed(s.oneOf("v",D,"unanswered")),_(s.str("l","6",10)),J(s.str("w","5",10)),X(s.str("h","7",10)),et(s.str("g","",10)),es(s.str("fg","",10)),er(s.str("ms","",10)),en(s.str("lg","",10)),eh(s.str("kw","",10)))},[]),(0,u.Vd)(S,()=>JSON.stringify({ht:e,in:a,ex:U,v:eu,l:B,w:Z,h:Q,g:ee,fg:ea,ms:ei,lg:eo,kw:el}),[e,a,U,eu,B,Z,Q,ee,ea,ei,eo,el],{debounceMs:250});let ec=(0,i.useMemo)(()=>(function(e){let t=[],a=[],s=[],i=(e,i,r,o={})=>({...F,...o,verdict:e,refusals:t,missing:a,notes:s,headline:i,problem:r}),r=k[e.heater],o="string"==typeof r?r:null;if(null!==o&&t.push(o),"not-insulated"===e.insulation&&t.push("The published rule this page uses assumes a finished, insulated room: at least 2 inches of mineral wool, a foil vapor barrier and wood paneling over it. For a room that is not built that way, the only uninsulated surfaces the research prices are log walls, stone, tile, brick and concrete, each entered below by area. A plain uninsulated stud wall has no published multiplier, so there is no honest number to print. Insulate the room to that specification and come back, or ask the heater manufacturer what they rate their units for in an uninsulated space."),"electric"!==e.heater&&null===o&&a.push("Say what kind of heater this is. Only an electric heater is sized in kilowatts against a room volume, and the other kinds are sized by their own listing instead."),"insulated"!==e.insulation&&"not-insulated"!==e.insulation&&a.push("Say whether the room is insulated to the baseline the rule assumes, which is 2 inches of mineral wool, a foil vapor barrier and wood paneling. Every figure on this page rests on that assumption, so it is not something to leave blank."),"yes"!==e.exteriorExposure&&"no"!==e.exteriorExposure&&a.push("Say whether the sauna is outdoors or shares uninsulated exterior walls in a cold climate. The published adjustment for that is 15 to 25 percent on the final output, which is the difference between one heater size and the next."),t.length>0)return i("refuse","This page will not size a heater for this, and the reasons are below.",null);if(a.length>0)return i("incomplete","Answer the questions above and this page can go on.",null);let n=e.lengthFt,l=e.widthFt,h=e.ceilingHeightFt;if(b(n)||b(l)||b(h))return a.push("Measure the inside of the sauna, wall to wall and floor to ceiling, and enter the length, the width and the ceiling height in feet."),i("incomplete","Enter the room and this page will work out the output it needs.",null);for(let[e,t]of[["length",n],["width",l]])if(t<f.minPlanDimensionFt||t>f.maxPlanDimensionFt)return i("incomplete","Enter the room and this page will work out the output it needs.",`A ${e} of ${y(t)} is outside the ${f.minPlanDimensionFt} to ${f.maxPlanDimensionFt} foot range this page covers. Measure the inside of the room in feet, and if the figure is right then this is a specification job rather than a calculator one.`);if(h>8)return t.push(`At ${y(h)} the ceiling is over the 8 foot limit, and the research calls that a design fault rather than a sizing problem. Heat stratifies, so a tall ceiling parks the hot layer well above the bathers' heads and a bigger heater does not bring it back down. The published fix is to drop the ceiling or raise the benches, and only then to 
1size a heater. Note that the same source writes this limit as 2.4 meters as well, which is ${x(7.8740157480314945,2)} feet, so its two spellings of the boundary sit about an inch and a half apart.`),i("refuse","This page will not size a heater for this room, and the reason is below.",null);if(h<f.minCeilingFt)return i("incomplete","Enter the room and this page will work out the output it needs.",`A ceiling height of ${y(h)} is below the ${f.minCeilingFt} foot floor this page works within. That bound is this page's own rather than the research's, and it is here so that a mistyped figure produces a question instead of a kilowatt answer.`);let u=n*l*h,g=u/35.314666721488585,w=2*(n*l+n*h+l*h),N={standardGlass:j(e.standardGlassSqFt),fullGlass:j(e.fullGlassSqFt),masonry:j(e.masonrySqFt),logWall:j(e.logWallSqFt)};for(let e of p){let t=N[e.key];if(t<0)return i("incomplete","Enter the room and this page will work out the output it needs.",`An area of ${x(t,2)} square feet for ${e.label} is below zero. Leave the box empty if the room has none of it.`)}let $=N.standardGlass+N.fullGlass+N.masonry+N.logWall;if($>w)return i("incomplete","Enter the room and this page will work out the output it needs.",`You have declared ${x($,1)} square feet of glass, stone and log surface, and a room ${y(n)} by ${y(l)} by ${y(h)} has only ${x(w,1)} square feet of interior surface in total, counting the floor and the ceiling. Check the figures, because one of them is measuring something the room does not have.`,{rawVolumeFt3:u,rawVolumeM3:g,interiorSurfaceSqFt:w,declaredSurfaceSqFt:$});let q=[],H=0,L=0,S=(e,t,a,s,i)=>{let r=s/45,o=i/45;H+=r,L+=o,q.push({key:e,label:t,detail:a,addedFt3Low:s,addedFt3High:i,addedFractionLow:null,addedFractionHigh:null,addedKwLow:r,addedKwHigh:o,runningKwLow:H,runningKwHigh:L})},K=(e,t,a,s,i)=>{let r=H*s,o=L*i;H+=r,L+=o,q.push({key:e,label:t,detail:a,addedFt3Low:null,addedFt3High:null,addedFractionLow:s,addedFractionHigh:i,addedKwLow:r,addedKwHigh:o,runningKwLow:H,runningKwHigh:L})};for(let e of(S("room","The room itself",`${y(n)} by ${y(l)} by ${y(h)} is ${x(u,1)} cubic feet, and the published design rate is one kilowatt for every 45 cubic feet.`,u,u),p)){let t=N[e.key];if(t<=0)continue;let a=e.lowFt3PerSqFt===e.highFt3PerSqFt?`${e.lowFt3PerSqFt} cubic feet`:`${e.lowFt3PerSqFt} to ${e.highFt3PerSqFt} cubic feet`;S(e.key,`Allowance for ${e.label}`,`${x(t,1)} square feet of it, and the published allowance is ${a} of virtual volume for every square foot. The source calls this class "${e.sourceWording}".`,t*e.lowFt3PerSqFt,t*e.highFt3PerSqFt)}let T=q.reduce((e,t)=>e+(t.addedFt3Low??0),0),P=q.reduce((e,t)=>e+(t.addedFt3High??0),0),E=1+.1*Math.max(0,h-7);E>1&&K("ceiling","Ceiling above the baseline height",`The published baseline assumes a ceiling no higher than 7 feet and adds 10 percent for every foot above it. Yours is ${y(h)}, so that is ${x((E-1)*100,1)} percent. The source does not say whether a part of a foot counts, and this page applies the rate proportionally.`,E-1,E-1);let I="yes"===e.exteriorExposure;I&&K("exterior","Outdoors or against a cold exterior wall","The published adjustment for an outdoor unit, or one sharing uninsulated exterior walls in a cold climate, is 15 to 25 percent on the final output. The same research gives a flat 1 to 1.5 kilowatts for the same situation in its metric section, and the two agree for any heater between 4 and 10 kilowatts.",.15,.25);let z=H,W=L,C={rawVolumeFt3:u,rawVolumeM3:g,interiorSurfaceSqFt:w,declaredSurfaceSqFt:$,terms:q,adjustedVolumeFt3Low:T,adjustedVolumeFt3High:P,ceilingFactor:E,exteriorFactorLow:I?1.15:1,exteriorFactorHigh:I?1.25:1,requiredKwLow:z,requiredKwHigh:W,metricRuleKwLow:T/35.314666721488585,metricRuleKwHigh:P/35.314666721488585,publishedFloorKwLow:T/50,publishedFloorKwHigh:P/50};if(W>
115)return t.push(`Worked through the published rule, this room lands above the 15 kilowatt ceiling that residential electric sauna heaters are built to in North America, which the research pairs with a room of roughly 600 to 700 cubic feet. Past that the supply is commercial three-phase and the specification is a job for an engineer, and the same research says outright that a free calculator should stop rather than print a number for a room this size. Your adjusted volume is ${x(P,0)} cubic feet.`),i("refuse","This room is past the residential ceiling, so this page stops here.",null,{rawVolumeFt3:u,rawVolumeM3:g,interiorSurfaceSqFt:w,declaredSurfaceSqFt:$});let A=W>9?"beyond-residential":"residential";return"beyond-residential"===A&&s.push(`At ${v(W)} this is past the 9 kilowatt mark where the research stops calling a build a standard residential setup, and it puts the band at 9 to 10.5 kilowatts. A heater this size wants a heavy-duty subpanel or a commercial three-phase supply. Take the figure to an electrical engineer or a licensed electrician before you order anything, because the supply is likely to cost more than the heater.`),s.push("Round up to the next output the manufacturer actually offers, never down. This page will not name a size ladder, because the research does not publish one and the sizes on offer differ between makers."),s.push(`The metric rule of thumb, one kilowatt per cubic meter, reads the same adjusted volume as ${v(C.metricRuleKwLow)} to ${v(C.metricRuleKwHigh)}. That is ${x(d,3)} times what the imperial rate above gives, because 45 cubic feet per kilowatt and one cubic meter per kilowatt are not the same rule. The imperial rate is used here because the research's own 15 kilowatt example reproduces it and does not reproduce the metric one. If a dealer quotes you the higher figure, that is where it comes from.`),s.push(`The published absolute limit is one kilowatt per 50 cubic feet, so for this room nothing under ${v(C.publishedFloorKwHigh)} can hold temperature at all. That is a floor rather than a target, and it sits below the design figure on purpose.`),P>T&&s.push(`The answer is a band rather than one number because the research publishes a range for the surfaces you entered rather than a single figure: ${c.lowFt3PerSqFt} to ${c.highFt3PerSqFt} cubic feet a square foot for stone, tile, brick and concrete, and ${m.lowFt3PerSqFt} to ${m.highFt3PerSqFt} for log walls. Picking an end would make this page look more certain than the source it is built on.`),i("compute",`This room needs ${v(z)}${W>z?` to ${v(W)}`:""} of electric heater under the published rule, worked out term by term below.`,null,{...C,supplyClass:A})})({heater:e,insulation:a,exteriorExposure:U,lengthFt:T(B),widthFt:T(Z),ceilingHeightFt:T(Q),standardGlassSqFt:T(ee),fullGlassSqFt:T(ea),masonrySqFt:T(ei),logWallSqFt:T(eo)}),[e,a,U,B,Z,Q,ee,ea,ei,eo]),em=(0,i.useMemo)(()=>(function(e,t){let a=[],s=[],i=(e,t,i,r={})=>({...N,...r,verdict:e,refusals:a,notes:s,headline:t,problem:i});if("compute"!==e.verdict||null===e.adjustedVolumeFt3Low||null===e.adjustedVolumeFt3High||null===e.requiredKwLow||null===e.requiredKwHigh)return i("incomplete","Describe the room first. A heater can only be checked against a room this page has worked out.",null);if(b(t))return i("incomplete","Enter the output of the heater you have or are being quoted, in kilowatts.",null);if(t<f.minHeaterKw||t>f.maxHeaterKw)return i("incomplete","Enter the output of the heater you have or are being quoted, in kilowatts.",`A heater output of ${v(t)} is outside the ${f.minHeaterKw} to ${f.maxHeaterKw} kilowatt range this page works within. Read the figure off the data plate, where it is given in kilowatts rather than in watts.`);let r=50*t,o=e.adjustedVolumeFt3Low/t,n=e.adjustedVolumeFt3High/t,l={heaterKw:t,coversFt3:r,achievedFt3PerKwLow:o,achievedFt3PerKwHigh:n,timesDesignLow:t/e.requiredKwLow,timesDesignHigh:t/e.requiredKwHigh},h=r<e.adjustedVolumeFt3Low?"under-published-limit":r>=e.adjustedVolumeFt3High?"clears-published-limit":"depends";return"under-published-limit"===h?(a.push(`At ${v(t)}
1 this heater is under the published limit for this room whichever end of the band you read. One kilowatt is allowed to cover at most 50 cubic feet, so ${v(t)} covers ${x(r,0)} cubic feet, and your adjusted volume is ${x(e.adjustedVolumeFt3Low,0)} cubic feet at its lowest reading. Each kilowatt would be carrying ${x(o,1)} cubic feet. The research says a heater in that position never reaches its target temperature, short cycles its elements and voids the manufacturer's warranty, so this page will not tell you it works.`),i("refuse","This heater is under the published limit for a room this size.",null,{...l,limitVerdict:h})):("depends"===h?s.push(`Whether this heater clears the published limit depends on where in the band your stone or log surfaces actually fall. At the low reading of ${x(e.adjustedVolumeFt3Low,0)} cubic feet it clears, at the high reading of ${x(e.adjustedVolumeFt3High,0)} it does not, and the source publishes both. Treat that as a reason to go up a size rather than as a pass.`):s.push("This heater clears the published maximum of one kilowatt per 50 cubic feet across the whole band. That is the only test on this page it can pass, and passing it is not the same as being right for the room."),t<e.requiredKwHigh&&s.push(`It is still under the design figure of ${v(e.requiredKwLow)}${e.requiredKwHigh>e.requiredKwLow?` to ${v(e.requiredKwHigh)}`:""}, at ${x(l.timesDesignHigh,2)} times the top of it. The design rate is what the published method sizes to and the limit above is only the point at which a heater stops working at all, so a heater between the two heats the room slowly and runs near flat out doing it.`),s.push("Nothing here says this heater is too big, because the research publishes no minimum room volume per kilowatt and this page will not invent one. What answers that question is the room volume range the heater itself is listed for, which is on the data plate and in the manual. An oversized heater in a small room is a real hazard rather than a theoretical one, and it is the direction people err in."),i("compute",`At ${v(t)} this heater covers ${x(r,0)} cubic feet at the published maximum, against an adjusted volume of ${x(e.adjustedVolumeFt3Low,0)}${e.adjustedVolumeFt3High>e.adjustedVolumeFt3Low?` to ${x(e.adjustedVolumeFt3High,0)}`:""} cubic feet.`,null,{...l,limitVerdict:h}))})(ec,T(el)),[ec,el]),ep=(0,i.useMemo)(()=>(function(e,t,a){let s={problem:null,volts:null,ampsLow:null,ampsHigh:null,basis:null};if("compute"!==e.verdict||null===e.requiredKwLow||null===e.requiredKwHigh)return{...s,problem:"Describe the room first, and the current draw follows from the output."};let i=$[t],r="number"==typeof i?i:void 0;if(void 0===r)return{...s,problem:"Pick the supply voltage before this page prints a current. It will not guess one, because the current scales inversely with it and a 208 volt supply draws about 15 percent more than a 240 volt supply for the same heater."};let o=null!==a&&Number.isFinite(a)&&a>=f.minHeaterKw&&a<=f.maxHeaterKw;return{problem:null,volts:r,ampsLow:1e3*(o?a:e.requiredKwLow)/r,ampsHigh:1e3*(o?a:e.requiredKwHigh)/r,basis:o?"entered":"required"}})(ec,eu,T(el)),[ec,eu,el]),eg={ht:e,in:a,ex:U,v:eu,l:B||null,w:Z||null,h:Q||null,g:ee||null,fg:ea||null,ms:ei||null,lg:eo||null,kw:el||null},ew=(e,t,a)=>t>e?`${I(e)} to ${I(t)} ${a}`:`${I(e)} ${a}`,ef=["SAUNA HEATER SIZE","",ec.headline,"",...ec.refusals.map(e=>`REFUSED: ${e}`),...ec.missing.map(e=>`STILL NEEDED: ${e}`),ec.problem?`PROBLEM: ${ec.problem}`:"","",null!==ec.rawVolumeFt3&&null!==ec.rawVolumeM3?`Room volume         ${E(ec.rawVolumeFt3)} cu ft  (${I(ec.rawVolumeM3)} cu m)`:"",ec.terms.length>0?["","How the output was built up",...ec.terms.map(e=>`  ${e.label.padEnd(42)} ${null!==e.addedFt3Low&&null!==e.addedFt3High?`+${ew(e.addedFt3Low,e.addedFt3High,"cu ft")}`:`+${P((e.addedFractionLow??0)*100)}${(e.addedFractionHigh??0)>(e.addedFractionLow??0)?` to ${P((e.addedFractionHigh??0)*100)}`:""} percent`}`),...ec.terms.map(e=>`  ${e.label.padEnd(42)} ${ew(e.addedKwLow,e.addedKwHigh,"kW")}`)].join("\n"):"",null!==ec.requiredKwLow&&null!==ec.requiredKwHigh?["",`REQUIRED OUTPUT     ${ew(ec.requiredKwLow,ec.requiredKwHigh,"kW")}`,null!==ec.publishedFloorKwLow&&null!==ec.publishedFloorKwHigh?`Published floor     ${ew(ec.publishedFloorKwLow,ec.publishedFloorKwHigh,"kW")}  (1 kW per 50 cu ft, the absolute limit)`:"",null!==ec.metricRuleKwLow&&null!==ec.metricRuleKwHigh?`Metric rule reading ${ew(ec.metricRuleKwLow,ec.metricRuleKwHigh,"kW")}  (1 kW per cubic meter, ${I(d)}
1x the imperial rate)`:""].filter(Boolean).join("\n"):"",null!==ep.ampsLow&&null!==ep.ampsHigh&&null!==ep.volts?`
2Current at ${ep.volts} V   ${ew(ep.ampsLow,ep.ampsHigh,"A")}  ${"entered"===ep.basis?"for the heater you entered":"for the required output"}
3                       (the breaker and the wire are an electrician's job)`:"","incomplete"!==em.verdict?["","The heater you entered",`  ${em.headline}`,...em.refusals.map(e=>`  REFUSED: ${e}`)].join("\n"):"","",...ec.notes.map(e=>`NOTE: ${e}`),...em.notes.map(e=>`NOTE: ${e}`),"","PUBLISHED CLEARANCE ENVELOPE, FOR REFERENCE ONLY",...w.map(e=>`  ${e.where.padEnd(40)} ${e.highIn>e.lowIn?`${e.lowIn} to ${e.highIn}`:`${e.lowIn}`} in  (${e.condition})`),`  Set by ${g} The listing on your own heater is what governs.`,"",H].filter(e=>""!==e).join("\n"),eb=e=>e?"border-destructive/50 bg-destructive/5":"bg-muted",ex=[{key:"standardGlass",value:ee,set:et,hint:"square feet of ordinary glass door and window"},{key:"fullGlass",value:ea,set:es,hint:"square feet of full glass wall or double pane"},{key:"masonry",value:ei,set:er,hint:"square feet of stone, tile, brick or concrete, not the floor"},{key:"logWall",value:eo,set:en,hint:"square feet of uninsulated log wall"}];return(0,s.jsxs)("div",{className:"space-y-6",children:[(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"First, what are we actually sizing?"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Only an electric heater is sized in kilowatts against a room volume. The published rule also assumes a finished, insulated room, so if that assumption does not hold then the arithmetic underneath this page does not hold either."}),(0,s.jsxs)("div",{className:"mt-4 grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-ht",children:"What kind of heater?"}),(0,s.jsx)("select",{id:"shs-ht",className:K,value:e,onChange:e=>t(e.target.value),children:z.map(e=>(0,s.jsx)("option",{value:e,children:W[e]},e))})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-in",children:"Is the room insulated to the baseline?"}),(0,s.jsx)("select",{id:"shs-in",className:K,value:a,onChange:e=>L(e.target.value),children:C.map(e=>(0,s.jsx)("option",{value:e,children:A[e]},e))}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"At least 2 inches of mineral wool, a foil vapor barrier over it, then the wood paneling."})]}),(0,s.jsxs)("div",{className:"space-y-1.5 sm:col-span-2",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-ex",children:"Is it outdoors, or against a cold exterior wall?"}),(0,s.jsx)("select",{id:"shs-ex",className:K,value:U,onChange:e=>Y(e.target.value),children:V.map(e=>(0,s.jsx)("option",{value:e,children:R[e]},e))}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"The published adjustment for that is 15 to 25 percent on the final output, which is usually one heater size."})]})]}),(0,s.jsxs)("div",{className:`mt-4 rounded-md border p-3 text-sm ${eb("refuse"===ec.verdict)}`,children:[(0,s.jsx)("p",{className:"font-medium",children:ec.headline}),ec.refusals.length>0&&(0,s.jsx)("ul",{className:"mt-2 list-disc space-y-2 pl-5",children:ec.refusals.map(e=>(0,s.jsx)("li",{children:e},e))}),ec.missing.length>0&&(0,s.jsx)("ul",{className:"mt-2 list-disc space-y-2 pl-5 text-muted-foreground",children:ec.missing.map(e=>(0,s.jsx)("li",{children:e},e))}),ec.problem&&(0,s.jsx)("p",{className:"mt-2 text-muted-foreground",children:ec.problem})]})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The room, measured on the inside"}),(0,s.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["Measure wall to wall and floor to ceiling, inside the paneling rather than outside the framing. Ceiling height matters twice over, because it adds volume and because the published rule adds a further ",10," percent for every foot above"," ",7," feet."]}
3),(0,s.jsxs)("div",{className:"mt-4 grid gap-4 sm:grid-cols-3",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-l",children:"Length"}),(0,s.jsx)(r.p,{id:"shs-l",inputMode:"decimal",className:"font-mono",value:B,onChange:e=>_(e.target.value)}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"feet"})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-w",children:"Width"}),(0,s.jsx)(r.p,{id:"shs-w",inputMode:"decimal",className:"font-mono",value:Z,onChange:e=>J(e.target.value)}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"feet"})]}),(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-h",children:"Ceiling height"}),(0,s.jsx)(r.p,{id:"shs-h",inputMode:"decimal",className:"font-mono",value:Q,onChange:e=>X(e.target.value)}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground",children:["feet, refused above ",8]})]})]}),null!==ec.rawVolumeFt3&&null!==ec.rawVolumeM3&&(0,s.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["That is ",E(ec.rawVolumeFt3)," cubic feet, which is ",I(ec.rawVolumeM3)," cubic meters by exact conversion.",null!==ec.interiorSurfaceSqFt?` The room has ${P(ec.interiorSurfaceSqFt)} square feet of interior surface in total, counting the floor and the ceiling.`:""]})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"Surfaces that leak heat, by area"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Each of these is converted into extra cubic feet of virtual volume before the kilowatts are worked out, at the rate the published rule gives for that surface by name. Leave a box empty if the room has none of it."}),(0,s.jsx)("div",{className:"mt-4 grid gap-4 sm:grid-cols-2",children:ex.map(e=>{let t=p.find(t=>t.key===e.key),a=void 0===t?"":t.lowFt3PerSqFt===t.highFt3PerSqFt?`${t.lowFt3PerSqFt} cu ft per sq ft`:`${t.lowFt3PerSqFt} to ${t.highFt3PerSqFt} cu ft per sq ft`;return(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:`shs-${e.key}`,children:void 0===t?e.key:t.label}),(0,s.jsx)(r.p,{id:`shs-${e.key}`,inputMode:"decimal",className:"font-mono",value:e.value,onChange:t=>e.set(t.target.value)}),(0,s.jsxs)("p",{className:"text-xs text-muted-foreground",children:[e.hint,", at ",a]})]},e.key)})})]}),ec.terms.length>0&&null!==ec.requiredKwLow&&null!==ec.requiredKwHigh&&(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"How the output was built up"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"Every row adds to the one above it, so the last running figure is the answer. The attribution is the useful part, because it shows which decision about the room is costing you the kilowatts."}),(0,s.jsx)("div",{className:"mt-3 space-y-2 text-sm",children:ec.terms.map(e=>(0,s.jsxs)("div",{className:"border-t pt-2",children:[(0,s.jsxs)("div",{className:"flex flex-wrap justify-between gap-2",children:[(0,s.jsx)("span",{className:"font-medium",children:e.label}),(0,s.jsx)("span",{className:"shrink-0 tabular-nums",children:null!==e.addedFt3Low&&null!==e.addedFt3High?`+${ew(e.addedFt3Low,e.addedFt3High,"cu ft")}`:`+${E((e.addedFractionLow??0)*100)}${(e.addedFractionHigh??0)>(e.addedFractionLow??0)?` to ${E((e.addedFractionHigh??0)*100)}`:""} percent`})]}),(0,s.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:e.detail}),(0,s.jsxs)("div",{className:"mt-1 flex flex-wrap justify-between gap-2 text-xs text-muted-foreground",children:[(0,s.jsxs)("span",{children:["adds ",ew(e.addedKwLow,e.addedKwHigh,"kW")]}),(0,s.jsxs)("span",{className:"tabular-nums",children:["running total ",ew(e.runningKwLow,e.runningKwHigh,"kW")]})]})]},e.key))}),(0,s.jsxs)("div",{className:`mt-4 rounded-md border p-3 text-sm ${eb(!1)}`,children:[(0,s.jsxs)("p",{className:"font-medium",children:["Required output ",ew(ec.requiredKwLow,ec.requiredKwHigh,"kW")]}),(0,s.jsx)("p",{className:"mt-1 text-muted-foreground",children:"Round up to the next output your manufacturer actually offers, never down."}),(0,s.jsxs)("div",{className:"mt-3 space-y-1 text-xs text-muted-foreground",children:[null!==ec.publishedFloorKwLow&&null!==ec.publishedFloorKwHigh&&(0,s.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,s.jsxs)("span",{children:["Published floor, one kilowatt per ",50," cubic feet"]}),(0,s.jsx)("span",{className:"shrink-0 tabular-nums",children:ew(ec.publishedFloorKwLow,ec.publishedFloorKwHigh,"kW")})]}),null!==ec.metricRuleKwLow&&null!==ec.metricRuleKwHigh&&(0,s.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,s.jsx)("span",{children:"The metric rule of thumb, one kilowatt per cubic meter"}),(0,s.jsx)("span",{className:"shrink-0 tabular-nums",children:ew(ec.metricRuleKwLow,ec.metricRuleKwHigh,"kW")})]})]})]}),ec.notes.length>0&&(0,s.jsx)("ul",{className:"mt-4 list-disc space-y-2 pl-5 text-sm text-muted-foreground",children:ec.notes.map(e=>(0,s.jsx)("li",{children:e},e))})]}),"compute"===ec.verdict&&(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"Check a heater you have or were quoted"}),(0,s.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["One test runs here: whether the heater falls under the published maximum of one kilowatt per ",50," cubic feet of room. Nothing on this page will tell you a heater is too large, because the research publishes no lower bound to check that against."]}),(0,s.jsxs)("div",{className:"mt-4 grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-kw",children:"Heater output"}),(0,s.jsx)(r.p,{id:"shs-kw",inputMode:"decimal",className:"font-mono",value:el,onChange:e=>eh(e.target.value)}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:"kilowatts, off the data plate or the quote"})]}),null!==em.coversFt3&&(0,s.jsxs)("div",{className:"space-y-1 text-sm sm:pt-6",children:[(0,s.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Covers, at the published maximum"}),(0,s.jsxs)("span",{className:"tabular-nums",children:[P(em.coversFt3)," cu ft"]})]}),null!==em.achievedFt3PerKwLow&&null!==em.achievedFt3PerKwHigh&&(0,s.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,s.jsx)("span",{className:"text-muted-foreground",children:"Your ratio"}),(0,s.jsx)("span",{className:"tabular-nums",children:ew(em.achievedFt3PerKwLow,em.achievedFt3PerKwHigh,"cu ft per kW")})]})]})]}),(0,s.jsxs)("div",{className:`mt-4 rounded-md border p-3 text-sm ${eb("refuse"===em.verdict)}`,children:[(0,s.jsx)("p",{className:"font-medium",children:em.headline}),em.refusals.length>0&&(0,s.jsx)("ul",{className:"mt-2 list-disc space-y-2 pl-5",children:em.refusals.map(e=>(0,s.jsx)("li",{children:e},e))}),em.problem&&(0,s.jsx)("p",{className:"mt-2 text-muted-foreground",children:em.problem}),em.notes.length>0&&(0,s.jsx)("ul",{className:"mt-2 list-disc space-y-2 pl-5 text-muted-foreground",children:em.notes.map(e=>(0,s.jsx)("li",{children:e},e))})]})]}),"compute"===ec.verdict&&(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"What it draws, and what this page will not size"}),(0,s.jsxs)("div",{className:"mt-4 grid gap-4 sm:grid-cols-2",children:[(0,s.jsxs)("div",{className:"space-y-1.5",children:[(0,s.jsx)("label",{className:"text-sm font-medium",htmlFor:"shs-v",children:"Supply voltage"}),(0,s.jsx)("select",{id:"shs-v",className:K,value:eu,onChange:e=>ed(e.target.value),children:D.map(e=>(0,s.jsx)("option",{value:e,children:M[e]},e))})]}),(0,s.jsx)("div",{className:"space-y-1 text-sm sm:pt-6",children:null!==ep.ampsLow&&null!==ep.ampsHigh&&null!==ep.volts?(0,s.jsxs)("div",{className:"flex justify-between gap-4",children:[(0,s.jsxs)("span",{className:"text-muted-foreground",children:["Current at ",ep.volts," V,"," ","entered"===ep.basis?"for the heater you entered":"for the required output"]}),(0,s.jsx)("span",{className:"tabular-nums",children:ew(ep.ampsLow,ep.ampsHigh,"A")})]}):(0,s.jsx)("p",{className:"text-muted-foreground",children:ep.problem})})]}),(0,s.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"That is 
3watts divided by volts and nothing more. The National Electrical Code treats a sauna heater as a continuous load and requires the circuit to be sized at 125 percent of it, and the breaker, the conductor and the disconnect are a licensed electrician's work rather than a calculator's."})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"Clearances, for reference and not as a check"}),(0,s.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["This page will not tell you what clearance your heater needs, and the table below is here so you know roughly what to expect rather than so you can measure against it. The figures that govern your installation are printed on your own heater's listing under"," ",g," A unit with a heat shield built into the casing is listed for a much shorter side clearance than one without, and only the listing knows which you have."]}),(0,s.jsx)("div",{className:"mt-3 space-y-1 text-sm",children:w.map(e=>(0,s.jsxs)("div",{className:"flex flex-wrap justify-between gap-2 border-t pt-1",children:[(0,s.jsxs)("span",{children:[e.where,(0,s.jsx)("span",{className:"block text-xs text-muted-foreground",children:e.condition})]}),(0,s.jsxs)("span",{className:"shrink-0 tabular-nums",children:[e.highIn>e.lowIn?`${e.lowIn} to ${e.highIn}`:`${e.lowIn}`," in"]})]},e.where))})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"What this page will not work out"}),(0,s.jsx)("ul",{className:"mt-2 list-disc space-y-2 pl-5 text-sm text-muted-foreground",children:q.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsxs)("div",{className:"rounded-lg border p-4",children:[(0,s.jsx)("h3",{className:"text-sm font-medium",children:"The arithmetic in full"}),(0,s.jsx)("pre",{className:"mt-2 overflow-x-auto rounded bg-muted p-3 font-mono text-sm",children:`raw volume      = length x width x ceiling height
4adjusted volume = raw volume
5                  + glass sq ft        x 1.5
6                  + full glass sq ft   x 3.0
7                  + stone/tile sq ft   x 2.0 to 3.0
8                  + log wall sq ft     x 1.5 to 2.0
9
10required kW     = adjusted volume / 45
11                  x ceiling factor
12                  x exterior factor
13
14ceiling factor  = 1 + 0.1 per foot above 7 ft, refused above 8 ft
15exterior factor = 1, or 1.15 to 1.25 outdoors or on a cold wall
16
17published floor = adjusted volume / 50   the absolute maximum volume per kW
18metric reading  = adjusted volume / ${I(35.314666721488585)}   the metric rule, ${I(d)}x higher
19
20refused above 9 kW as a standard residential build
21refused above 15 kW entirely`}),(0,s.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["The two published rules do not agree with each other. One cubic meter is"," ",I(35.314666721488585)," cubic feet, so a metric rule of one kilowatt per cubic meter asks for ",I(d)," times what the imperial rate asks for. This page sizes on the imperial rate, because the same research says a 15 kilowatt heater covers 600 to 700 cubic feet and only the imperial rate reproduces that."]})]}),(0,s.jsx)(n.i,{value:ef,label:"Copy the sizing, the terms and the refusals"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:H}),(0,s.jsx)(o.ToolActions,{share:()=>(0,l.CZ)(O.map(e=>({key:e,value:eg[e]}))),title:"Sauna Heater Size Calculator",queryIsImpersonal:"the sauna room dimensions, surface areas and heater output you entered"})]})}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.