1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1978],{16171:(e,t,n)=>{n.d(t,{CQ:()=>k,D5:()=>v,GA:()=>l,GZ:()=>f,HE:()=>N,LU:()=>s,Mu:()=>h,N9:()=>r,Pr:()=>M,QW:()=>F,Qn:()=>x,V:()=>p,Xp:()=>w,bM:()=>m,j3:()=>d,jf:()=>a,k1:()=>u,n4:()=>j,oK:()=>o,qW:()=>g,t6:()=>c,w9:()=>P,wF:()=>i,xT:()=>b,yQ:()=>y});let i={standard:"IEC 62676-4",title:"Video surveillance systems for use in security applications â Part 4: Application guidelines",label:"IEC 62676-4 â DORI pixel-density criteria (Detect / Observe / Recognise / Identify); the fifth tier shown, Inspect, is an industry extension, not part of the standard",url:null,retrievedAt:"2026-06-27",note:"DORI tiers are the IEC 62676-4 minimum horizontal pixel densities. Inspect (â¥1000 px/m) is the forensic tier used in practice above Identify. Densities are stated in pixels per metre of scene width."},s=[{key:"detect",label:"Detect",ppm:25,task:"Tell that a person or object is present in the scene."},{key:"observe",label:"Observe",ppm:62.5,task:"Follow movement and note characteristic details such as distinctive clothing."},{key:"recognise",label:"Recognise",ppm:125,task:"Say with confidence whether a person shown is the same as one seen before."},{key:"identify",label:"Identify",ppm:250,task:"Establish the identity of an individual beyond reasonable doubt."},{key:"inspect",label:"Inspect",ppm:1e3,task:"Read fine forensic detail â a vehicle number plate or banknote serial within the field of view. (Industry extension beyond the four IEC 62676-4 tiers.)"}];s.reduce((e,t)=>(e[t.key]=t,e),{});let l=[{slug:"1mp-720p",label:"1MP",longLabel:"1MP / 720p",horizontalPixels:1280},{slug:"2mp-1080p",label:"2MP",longLabel:"2MP / 1080p",horizontalPixels:1920},{slug:"4mp",label:"4MP",longLabel:"4MP",horizontalPixels:2560},{slug:"5mp",label:"5MP",longLabel:"5MP",horizontalPixels:2944},{slug:"6mp",label:"6MP",longLabel:"6MP",horizontalPixels:3072},{slug:"8mp-4k",label:"8MP",longLabel:"8MP / 4K",horizontalPixels:3840},{slug:"12mp",label:"12MP",longLabel:"12MP",horizontalPixels:4e3}],a="4mp",o=6,r=.5,c=60,d=3.281,x=l.map(e=>e.slug);function m(e){return l.find(t=>t.slug===e)}function p(e){let{horizontalPixels:t,sceneWidthM:n}=e,i=Number.isFinite(n)&&n>0?n:r,l=t/i,a=null;for(let e of s)l>=e.ppm&&(a=e);let o=s.map(e=>({tier:e,maxWidthM:t/e.ppm}));return{horizontalPixels:t,sceneWidthM:i,ppm:l,pxPerFoot:l/d,achievedTier:a,tierMaxWidths:o}}let h=5,u=150,f=1,g=40,b=1,v=120,y=10,j=60,w=5.6,k=4,M=1,N=120;function F(e){let{sensorWidthMm:t,focalLengthMm:n}=e;if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n<=0)return h;let i=2*Math.atan(t/(2*n))*(180/Math.PI);return!Number.isFinite(i)||i<=0?h:Math.min(u,Math.max(h,i))}function P(e){let{distanceM:t,hfovDegrees:n}=e;if(!Number.isFinite(t)||!Number.isFinite(n)||t<=0||n<=0||n>=180)return r;let i=2*t*Math.tan(n/2*(Math.PI/180));return i>0?i:r}},21978:(e,t,n)=>{n.r(t),n.d(t,{CctvResolutionPpm:()=>y});var i=n(95155),s=n(12115),l=n(52056),a=n(93499),o=n(1053),r=n(69532),c=n(95738),d=n(21680),x=n(67021),m=n(16171);let p=(0,n(23650).h3)("wide"),h="/tools/cctv-resolution-calculator",u=["fov","lens"],f={sw:m.oK,res:m.jf,geo:"fov",dist:m.yQ,hfov:m.n4,senw:m.Xp,focal:m.CQ},g=Object.keys(f);function b(e){return e>=100?e.toFixed(0):e>=10?e.toFixed(1):e.toFixed(2)}function v(e){switch(e){case"fov":return"Derived from the distance and field of view you entered â user-supplied geometry, not a camera-model lookup";case"lens":return"Derived from the distance, sensor width and focal length you entered â user-supplied geometry, not a camera-model lookup";default:return"Set directly on the scene-width control"}}function y(){let{initial:e}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[t,n]=(0,s.useState)(()=>(null==e?void 0:e.sw)!=null?(0,x.U)(String(e.sw),{min:m.N9,max:m.t6,step:.5,fallback:m.oK}
1):m.oK),[c,p]=(0,s.useState)(()=>(null==e?void 0:e.res)?(0,x.uL)(e.res,m.Qn,m.jf):m.jf),[y,k]=(0,s.useState)(()=>(0,x.uL)(null==e?void 0:e.geo,u,"fov")),[M,N]=(0,s.useState)(()=>(null==e?void 0:e.dist)!=null?(0,x.U)(String(e.dist),{min:m.Pr,max:m.HE,step:1,fallback:m.yQ}):m.yQ),[F,P]=(0,s.useState)(()=>(null==e?void 0:e.hfov)!=null?(0,x.U)(String(e.hfov),{min:m.Mu,max:m.k1,step:1,fallback:m.n4}):m.n4),[C,S]=(0,s.useState)(()=>(null==e?void 0:e.senw)!=null?(0,x.U)(String(e.senw),{min:m.GZ,max:m.qW,step:.1,fallback:m.Xp}):m.Xp),[L,D]=(0,s.useState)(()=>(null==e?void 0:e.focal)!=null?(0,x.U)(String(e.focal),{min:m.xT,max:m.D5,step:.1,fallback:m.CQ}):m.CQ),[I,A]=(0,s.useState)("direct"),{markResult:R}=(0,d.K)({slug:"cctv-resolution-calculator",category:"security",title:"CCTV Resolution / PPM Calculator"}),z=(0,s.useRef)(!1);function E(){z.current=!0}let O=(0,s.useRef)(!1);(0,s.useEffect)(()=>{let t=window.location.search;if((0,x.MP)(t,g)){var i,s;let l=new URLSearchParams(t);n((0,x.U)(l.get("sw"),{min:m.N9,max:m.t6,step:.5,fallback:null!=(i=null==e?void 0:e.sw)?i:m.oK})),p((0,x.uL)(l.get("res"),m.Qn,null!=(s=null==e?void 0:e.res)?s:m.jf)),k((0,x.uL)(l.get("geo"),u,"fov")),N((0,x.U)(l.get("dist"),{min:m.Pr,max:m.HE,step:1,fallback:m.yQ})),P((0,x.U)(l.get("hfov"),{min:m.Mu,max:m.k1,step:1,fallback:m.n4})),S((0,x.U)(l.get("senw"),{min:m.GZ,max:m.qW,step:.1,fallback:m.Xp})),D((0,x.U)(l.get("focal"),{min:m.xT,max:m.D5,step:.1,fallback:m.CQ})),A("direct")}O.current=!0},[]);let W=(0,s.useMemo)(()=>{var e;return null!=(e=(0,m.bM)(c))?e:(0,m.bM)(m.jf)},[c]),T=(0,s.useMemo)(()=>(0,m.V)({horizontalPixels:W.horizontalPixels,sceneWidthM:t}),[W,t]),U=(0,s.useMemo)(()=>"lens"===y?(0,m.QW)({sensorWidthMm:C,focalLengthMm:L}):F,[y,C,L,F]),H=(0,s.useMemo)(()=>(0,m.w9)({distanceM:M,hfovDegrees:U}),[M,U]),Q=(0,s.useMemo)(()=>{let e="lens"===y,n=e?void 0:F,i=e?C:void 0,s=e?L:void 0;return(0,x.Xe)(h,{sw:t,res:c,geo:y,dist:M,hfov:n,senw:i,focal:s},f)},[t,c,y,M,F,C,L]),V=(0,s.useRef)((0,x.sg)(e=>{try{window.history.replaceState({},"",e)}catch(e){}},250));(0,s.useEffect)(()=>{O.current&&(window.location.pathname===h&&V.current(Q),z.current&&R())},[Q,R]);let B=T.achievedTier,G=T.tierMaxWidths.find(e=>"identify"===e.tier.key).maxWidthM,q=T.tierMaxWidths.find(e=>"recognise"===e.tier.key).maxWidthM,X="".concat(W.label," identifies a face up to ~").concat(b(G)," m wide; recognises up to ~").concat(b(q)," m."),K=[];return B?"detect"===B.key&&K.push({level:"info",text:"Detect only â you can tell someone is present, but not follow detail or recognise them. Tighten the scene or raise resolution to reach Recognise / Identify."}):K.push({level:"warn",text:"At ".concat(T.ppm.toFixed(0)," px/m the scene is below the Detect threshold (25 px/m). Narrow the scene width or step up resolution before this view is useful.")}),t>G&&B&&"inspect"!==B.key&&K.push({level:"info",text:"This scene is wider than the Identify limit (~".concat(b(G)," m) for ").concat(W.label,". For evidential face identity across the full width, split the scene across cameras or step up resolution.")}),(0,i.jsx)(o.tC,{ariaLabel:"CCTV Resolution / PPM Calculator",titleAs:"h1",kicker:"â Calculator \xb7 CCTV resolution & pixel density (DORI)",title:(0,i.jsxs)(i.Fragment,{children:["Scene width, resolution â"," ",(0,i.jsx)("em",{className:"font-light italic text-sc-gold-500",children:"pixels per metre."})]}),lede:(0,i.jsx)(i.Fragment,{children:"Set the horizontal scene width you need to cover and a camera resolution. The calculator returns the pixel density (px/m and px/ft), the DORI tier achieved and the maximum scene width that still meets each tier. IEC 62676-4 criteria, cited."}),visualAspect:"16/9",visualCaption:"IEC 62676-4 DORI \xb7 nominal pixels â lens, lighting and compression all reduce usable detail.",confidence:"indicative",changesThis:["Lens quality, focus & optical resolving power","Scene contrast, lighting & motion blur","Codec compression at the recorded bitrate","Where the subject sits within the field of view"],inputs:(0,i.jsx)(j,{sceneWidthM:t,setSceneWidthM:e=>{E(),A("direct"),n(e)},resolutionSlug:W.slug,setResolutionSlug:e=>{E(),p(e)},geoMode:y,setGeoMode:e=>{E(),k(e)},distanceM:M,setDistanceM:e=>{E(),N(e)},hfovDeg:F,setHfovDeg:e=>{E(),P(e)},sensorWidthMm:C,setSensorWidthMm:e=>{E(),S(e)},focalLengthMm:L,setFocalLengthMm:e=>{E(),D(e)},effectiveHfovDeg:U,derivedWidthM:H,onApplyFov:function(){let e=Math.min(m.t6,Math.max(m.N9,H));E(),n(Math.round(2*e)/2),A(y)}}),visual:(0,i.jsx)(w,{ppm:T.ppm,sceneWidthM:t,achieved:B,resolutionLabel:W.longLabel,horizontalPixels:W.horizontalPixels}),mobileAnswer:"".concat(T.ppm.toFixed(0)," px/m \xb7 ").concat(B?B.label:"below Detect"," \xb7 ").concat(W.longLabel),headline:(0,i.jsxs)("div",{children:[(0,i.jsx)("div",{role:"status","aria-live":"polite",className:"sr-only",children:"At a ".concat(b(t)," metre scene width, a ").concat(W.longLabel," camera (").concat(W.horizontalPixels," horizontal pixels) gives ").concat(T.ppm.toFixed(0)," pixels per metre, which is ").concat(T.pxPerFoot.toFixed(0)," pixels per foot. The DORI tier achieved is ").concat(B?B.label:"below Detect",". ").concat(X," Scene width provenance: ").concat(v(I).toLowerCase(),".")}),(0,i.jsxs)("div",{className:"grid gap-6 sm:grid-cols-3",children:[(0,i.jsx)(o.g1,{label:"Pixel density",value:(T.ppm,T.ppm.toFixed(0)),unit:"px/m \xb7 ".concat(T.pxPerFoot.toFixed(0)," px/ft"),accent:!0}
1),(0,i.jsx)(o.g1,{label:"DORI tier achieved",value:B?B.label:"Below Detect",unit:B?"⥠".concat(B.ppm," px/m"):"< 25 px/m"}),(0,i.jsx)(o.g1,{label:"Scene width",value:b(t),unit:"m \xb7 ".concat(W.label)})]}),(0,i.jsxs)("p",{className:"mt-4 text-[12px] italic leading-[1.5] text-sc-ink-700",children:[X," Resolution pixels are nominal sensor formats â real usable detail is reduced by lens, scene, lighting and compression. This is a planning sense-check, not a survey or a camera layout."]})]}),reviewHandoff:{slug:"cctv-resolution-calculator",shareUrl:Q},whatsappContext:["".concat(T.ppm.toFixed(0)," px/m (").concat(T.pxPerFoot.toFixed(0)," px/ft) at ").concat(b(t)," m scene width"),"DORI tier achieved: ".concat(B?B.label:"below Detect"),"".concat(W.longLabel," \xb7 ").concat(W.horizontalPixels," horizontal pixels")],resultActions:(0,i.jsx)(r.A,{url:Q,analytics:{toolSlug:"cctv-resolution-calculator",toolCategory:"security"}}),spec:(0,i.jsxs)("dl",{children:[(0,i.jsx)(o.g3,{k:"resolution",v:"".concat(W.longLabel," \xb7 ").concat(W.horizontalPixels," px wide (nominal)")}),(0,i.jsx)(o.g3,{k:"scene width",v:"".concat(b(t)," m")}),(0,i.jsx)(o.g3,{k:"width source",v:v(I)}),(0,i.jsx)(o.g3,{k:"density",v:"".concat(T.ppm.toFixed(0)," px/m \xb7 ").concat(T.pxPerFoot.toFixed(0)," px/ft")}),(0,i.jsx)(o.g3,{k:"achieved",v:B?"".concat(B.label," (").concat(B.task,")"):"Below Detect â no usable DORI tier"}),(0,i.jsxs)("div",{className:"mt-3 border-t border-sc-stone-300 pt-3",children:[(0,i.jsxs)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-ink-700",children:["Max scene width per tier â ",W.label]}),(0,i.jsxs)("table",{className:"mt-2 w-full text-[12.5px] text-sc-ink-900",children:[(0,i.jsxs)("caption",{className:"sr-only",children:["Maximum scene width per DORI tier at ",W.label,": tier, minimum pixels per metre, and the widest scene that still meets it."]}),(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{className:"font-mono text-[11px] uppercase tracking-[0.18em] text-sc-ink-700",children:[(0,i.jsx)("th",{scope:"col",className:"py-1 pr-2 text-left font-normal",children:"Tier"}),(0,i.jsx)("th",{scope:"col",className:"py-1 pr-2 text-left font-normal",children:"Min px/m"}),(0,i.jsx)("th",{scope:"col",className:"py-1 text-right font-normal",children:"Max width"})]})}),(0,i.jsx)("tbody",{children:T.tierMaxWidths.map(e=>{let{tier:n,maxWidthM:s}=e,l=!!B&&s>=t;return(0,i.jsxs)("tr",{className:"border-t border-sc-stone-300/70",children:[(0,i.jsx)("td",{className:"py-1.5 pr-2",children:(0,i.jsx)("span",{className:l?"text-sc-copper-700":"",children:n.label})}),(0,i.jsx)("td",{className:"py-1.5 pr-2 font-mono text-[11px] text-sc-ink-700",children:n.ppm}),(0,i.jsxs)("td",{className:"py-1.5 text-right font-mono text-[11.5px]",children:[b(s)," m",(0,i.jsxs)("span",{className:"ml-1 text-[11px] text-sc-ink-700",children:["(",(s*m.j3).toFixed(0)," ft)"]})]})]},n.key)})})]}),(0,i.jsx)("p",{className:"mt-2 text-[11px] italic leading-[1.4] text-sc-ink-700",children:"Max width = nominal horizontal pixels \xf7 the tier's minimum px/m. Wider scenes than this fall below the tier."})]})]}),warnings:K.length>0?(0,i.jsxs)("div",{className:"space-y-2",children:[(0,i.jsx)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-ink-700",children:"Feasibility"}),K.map((e,t)=>(0,i.jsxs)(o.QT,{level:e.level,children:[(0,i.jsx)(l.A,{className:"mt-0.5 h-3.5 w-3.5 shrink-0","aria-hidden":!0}),(0,i.jsx)("p",{children:e.text})]},t))]}):null,source:(0,i.jsxs)("div",{className:"space-y-3",children:[(0,i.jsxs)("div",{className:"border-t border-sc-stone-300 pt-3",children:[(0,i.jsx)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-ink-700",children:"Source"}),m.wF.url?(0,i.jsxs)("a",{href:m.wF.url,target:"_blank",rel:"noopener noreferrer",className:"mt-1 inline-flex min-h-[44px] items-center gap-1 text-[12.5px] text-sc-copper-700 underline-offset-2 hover:underline",children:[m.wF.label,(0,i.jsx)(a.A,{className:"h-3 w-3","aria-hidden":!0})]}):(0,i.jsxs)("p",{className:"mt-1 text-[12.5px] text-sc-ink-800",children:[m.wF.label," â published by the IEC and available from the IEC webstore."]}),(0,i.jsxs)("p",{className:"mt-1 font-mono text-[11px] uppercase tracking-[0.2em] text-sc-ink-700",children:[m.wF.standard," \xb7 retrieved ",m.wF.retrievedAt]})]}),(0,i.jsx)(r.A,{url:Q,analytics:{toolSlug:"cctv-resolution-calculator",toolCategory:"security"}})]})})}function j(e){let{sceneWidthM:t,setSceneWidthM:n,resolutionSlug:s,setResolutionSlug:l,geoMode:a,setGeoMode:o,distanceM:r,setDistanceM:d,hfovDeg:x,setHfovDeg:p,sensorWidthMm:h,setSensorWidthMm:u,focalLengthMm:f,setFocalLengthMm:g,effectiveHfovDeg:v,derivedWidthM:y,onApplyFov:j}=e;return(0,i.jsxs)("div",{className:"space-y-5",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-gold-600",children:"Configure"}),(0,i.jsx)("p",{className:"mt-1 font-mono text-[11px] uppercase tracking-[0.2em] text-sc-ink-700",children:"Scene width \xb7 resolution"})]}),(0,i.jsxs)(c.LP,{label:"Horizontal scene width â ".concat(b(t)," m"),children:[(0,i.jsx)(c.m0,{min:m.N9,max:m.t6,step:.5,value:t,onChange:n,ariaLabel:"Horizontal scene width in metres"}),(0,i.jsxs)("div",{className:"flex justify-between font-mono text-[11px] uppercase tracking-[0.18em] text-sc-ink-700",children:[(0,i.jsx)("span",{children:"0.5 m face"}),(0,i.jsx)("span",{children:"6 m doorway"}),(0,i.jsx)("span",{children:"60 m forecourt"})]})]}),(0,i.jsxs)(c.LP,{label:"Camera resolution",children:[(0,i.jsx)(c.x9,{value:s,onChange:l,ariaLabel:"Camera resolution",children:m.GA.map(e=>(0,i.jsxs)("option",{value:e.slug,children:[e.longLabel," (",e.horizontalPixels," px)"]},e.slug))}),(0,i.jsx)(c.sO,{children:"Nominal horizontal sensor format. Real usable detail is lower."})]}),(0,i.jsxs)("div",{className:"border-t border-sc-stone-300 pt-4",children:[(0,i.jsx)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-gold-600",children:"Optional \xb7 derive scene width"}),(0,i.jsx)("p",{className:"mt-1 text-[11.5px] italic leading-[1.4] text-sc-ink-700",children:"From figures you type off the datasheet in front of you. sceneWidth = 2 \xb7 distance \xb7 tan(HFOV \xf7 2)."}),(0,i.jsx)("p",{className:"mt-1 font-mono text-[11px] uppercase tracking-[0.2em] text-sc-copper-700",children:"User-supplied geometry \xb7 no camera model is consulted"}),(0,i.jsx)("div",{className:"mt-3",children:(0,i.jsx)(c._R,{label:"What do you know?",value:a,onChange:o,options:[{value:"fov",label:"HFOV"}
1,{value:"lens",label:"Sensor + lens"}]})}),(0,i.jsxs)("div",{className:"mt-3 space-y-4",children:[(0,i.jsx)(c.LP,{label:"Distance to scene â ".concat(r," m"),children:(0,i.jsx)(c.m0,{min:m.Pr,max:m.HE,step:1,value:r,onChange:d,ariaLabel:"Camera distance to scene in metres"})}),"fov"===a?(0,i.jsxs)(c.LP,{label:"Horizontal field of view â ".concat(x,"\xb0"),children:[(0,i.jsx)(c.m0,{min:m.Mu,max:m.k1,step:1,value:x,onChange:p,ariaLabel:"Horizontal field of view in degrees"}),(0,i.jsx)(c.sO,{children:"The lens HFOV from your camera or lens datasheet."})]}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(c.LP,{label:"Sensor imaging width â ".concat(h.toFixed(1)," mm"),children:[(0,i.jsx)(c.m0,{min:m.GZ,max:m.qW,step:.1,value:h,onChange:u,ariaLabel:"Sensor imaging width in millimetres"}),(0,i.jsx)(c.sO,{children:"The imaging-area width in mm, not the format label â â1/2.8-inchâ is a tube-diameter convention, not a width. Read it off the sensor or camera datasheet."})]}),(0,i.jsxs)(c.LP,{label:"Lens focal length â ".concat(f.toFixed(1)," mm"),children:[(0,i.jsx)(c.m0,{min:m.xT,max:m.D5,step:.1,value:f,onChange:g,ariaLabel:"Lens focal length in millimetres"}),(0,i.jsxs)(c.sO,{children:["HFOV = 2 \xb7 atan(sensor width \xf7 2 \xb7 focal length) ="," ",v.toFixed(1),"\xb0."]})]})]}),(0,i.jsxs)("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-sc-ink-700",children:["Your geometry â width â ",b(y)," m"]}),(0,i.jsx)("button",{type:"button",onClick:j,className:"inline-flex min-h-[44px] min-h-[44px] items-center justify-center border border-sc-stone-300 bg-sc-ivory-50 px-4 py-2.5 font-mono text-[11px] uppercase tracking-[0.22em] text-sc-ink-900 transition hover:bg-sc-stone-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sc-gold-500/80 focus-visible:ring-offset-2 focus-visible:ring-offset-sc-paper-100",children:"Use this scene width"})]})]}),(0,i.jsx)("div",{className:"border-t border-sc-stone-300 pt-3",children:(0,i.jsxs)("p",{className:"font-mono text-[11px] uppercase tracking-[0.2em] text-sc-ink-700",children:[m.LU.length," DORI tiers \xb7 IEC 62676-4 \xb7 cited"]})})]})}function w(e){let{ppm:t,sceneWidthM:n,achieved:s,resolutionLabel:l,horizontalPixels:a}=e,o="#3E4341",r="#A2823A",c="#9A6B3F",d="#F1ECDE",x=e=>(Math.log(Math.min(1200,Math.max(12.5,e)))-Math.log(12.5))/(Math.log(1200)-Math.log(12.5)),h=120+960*x(t);return(0,i.jsxs)("svg",{viewBox:"0 0 ".concat(1200," ").concat(600),preserveAspectRatio:"xMidYMid meet",role:"img","aria-label":"Pixel-density gauge across the DORI tiers",className:"block h-full w-full",children:[(0,i.jsx)("defs",{children:(0,i.jsxs)("linearGradient",{id:"ppmBg",x1:"0",x2:"0",y1:"0",y2:"1",children:[(0,i.jsx)("stop",{offset:"0%",stopColor:"#FBF8F1"}),(0,i.jsx)("stop",{offset:"100%",stopColor:d})]})}),(0,i.jsx)("rect",{width:1200,height:600,fill:"url(#ppmBg)"}),(0,i.jsxs)("text",{x:600,y:90,fontSize:p.atPx(12.4),textAnchor:"middle",fill:"#181A19",children:[t.toFixed(0)," px/m"]}),(0,i.jsxs)("text",{x:600,y:128,fontSize:p.figure,textAnchor:"middle",fill:c,fontFamily:"ui-monospace, monospace",letterSpacing:.6,children:[l," \xb7 ",a," PX ACROSS ",n.toFixed(1)," M"]}),(0,i.jsx)("text",{x:600,y:200,fontSize:p.atPx(19.1),textAnchor:"middle",fill:s?r:o,fontWeight:300,children:s?s.label:"Below Detect"}),(0,i.jsx)("rect",{x:120,y:360,width:960,height:40,fill:d,stroke:"#D2C7B2",strokeWidth:1}),m.LU.map(e=>{let n=120+960*x(e.ppm),s=t>=e.ppm;return(0,i.jsxs)("g",{children:[s?(0,i.jsx)("rect",{x:120,y:360,width:Math.max(0,n-120),height:40,fill:"rgba(125, 177, 107, 0.18)"}):null,(0,i.jsx)("line",{x1:n,y1:354,x2:n,y2:406,stroke:o,strokeWidth:1}),(0,i.jsx)("text",{x:n,y:408+Math.round(p.value),fontSize:p.value,textAnchor:"middle",fill:s?c:o,fontFamily:"ui-monospace, monospace",letterSpacing:.4,children:e.label}),(0,i.jsx)("text",{x:n,y:408+Math.round(2.4*p.value),fontSize:p.micro,textAnchor:"middle",fill:o,fontFamily:"ui-monospace, monospace",children:e.ppm})]},e.key)}),(0,i.jsx)("line",{x1:h,y1:332,x2:h,y2:408,stroke:r,strokeWidth:2.5}),(0,i.jsx)("polygon",{points:"".concat(h-8,",").concat(332," ").concat(h+8,",").concat(332," ").concat(h,",").concat(346),fill:r}),(0,i.jsx)("text",{x:600,y:576-Math.round(1.35*p.label),fontSize:p.label,textAnchor:"middle",fill:o,fontFamily:"ui-monospace, monospace",letterSpacing:.5,children:"IEC 62676-4 DORI \xb7 NOMINAL PIXELS"}),(0,i.jsx)("text",{x:600,y:576,fontSize:p.label,textAnchor:"middle",fill:o,fontFamily:"ui-monospace, monospace",letterSpacing:.5,children:"LENS / LIGHTING / COMPRESSION REDUCE USABLE DETAIL"})]})}},23650:(e,t,n)=>{n.d(t,{An:()=>i,Mo:()=>c,X5:()=>s,h3:()=>a});let i=11;function s(e,t){let n=e/Math.max(1,t),s=e=>Math.round(e*n*100)/100;return{unitsPerPx:n,units:s,floor:s(i),px:e=>Math.round(e/n*100)/100}}let l={standard:.7135,tall:.6719,compact:.7061,small:.8054,column:.8633,band:.6386,wide:.4778,wideSpeaker:.4761,wideShort:.4076};function a(e){let t=l[e],n=e=>
1Math.round(e/t*100)/100,s=Math.ceil(i/t*100)/100,a=n(.65);return{micro:s,label:Math.round((s+a)*100)/100,value:Math.round((s+2*a)*100)/100,figure:Math.round((s+4*a)*100)/100,pxAt:(e,t)=>Math.round(e*t*100)/100,atPx:e=>Math.round(100*n(e))/100}}let o="en-IN";function r(e,t){return t?/^[A-Za-z0-9]/.test(t)?"".concat(e," ").concat(t):"".concat(e).concat(t):e}function c(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!Number.isFinite(e))return r("â",t.unit);let n=t.decimals;return r(void 0===n?e.toLocaleString(o,{maximumFractionDigits:20}):e.toLocaleString(o,{minimumFractionDigits:n,maximumFractionDigits:n}),t.unit)}},93499:(e,t,n)=>{n.d(t,{A:()=>i});let i=(0,n(71847).A)("ExternalLink",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]])},95738:(e,t,n)=>{n.d(t,{LP:()=>l,_R:()=>o,m0:()=>c,sO:()=>a,x9:()=>r});var i=n(95155),s=n(12115);function l(e){let{label:t,children:n}=e;return(0,i.jsxs)("div",{className:"space-y-1.5",children:[(0,i.jsx)("p",{className:"font-mono text-[11px] uppercase tracking-[0.22em] text-sc-ink-700",children:t}),n]})}function a(e){let{children:t}=e;return(0,i.jsx)("p",{className:"text-[11.5px] leading-[1.4] text-sc-ink-700",children:t})}function o(e){let{label:t,value:n,options:a,onChange:o}=e,r=(0,s.useRef)(null),c=a.findIndex(e=>e.value===n),d=c>=0?c:0;return(0,i.jsx)(l,{label:t,children:(0,i.jsx)("div",{ref:r,role:"radiogroup","aria-label":t,onKeyDown:e=>{var t,n;let i=a.length;if(0===i)return;let s=d;if("ArrowRight"===e.key||"ArrowDown"===e.key)s=(d+1)%i;else if("ArrowLeft"===e.key||"ArrowUp"===e.key)s=(d-1+i)%i;else if("Home"===e.key)s=0;else{if("End"!==e.key)return;s=i-1}e.preventDefault(),o(a[s].value),null==(n=r.current)||null==(t=n.querySelectorAll("[role='radio']")[s])||t.focus()},className:"inline-flex border border-sc-stone-300",children:a.map((e,t)=>(0,i.jsx)("button",{role:"radio","aria-checked":n===e.value,tabIndex:t===d?0:-1,onClick:()=>o(e.value),type:"button",className:"inline-flex min-h-[46px] min-w-[44px] items-center justify-center px-4 py-2.5 font-mono text-[11px] uppercase tracking-[0.22em] transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-sc-gold-500/80 focus-visible:ring-offset-2 focus-visible:ring-offset-sc-paper-100 ".concat(n===e.value?"bg-sc-ink-900 text-sc-ivory-50":"text-sc-ink-800 hover:bg-sc-stone-200"),children:e.label},e.value))})})}function r(e){let{value:t,onChange:n,children:s,ariaLabel:l}=e;return(0,i.jsx)("select",{value:t,onChange:e=>n(e.target.value),"aria-label":l,className:"block min-h-[46px] w-full border border-sc-stone-300 bg-sc-ivory-50 px-3 py-2.5 text-[13.5px] text-sc-ink-900 focus:border-sc-copper-600 focus:outline-none focus-visible:ring-2 focus-visible:ring-sc-gold-500/80 focus-visible:ring-offset-2 focus-visible:ring-offset-sc-paper-100",children:s})}function c(e){let{value:t,min:n,max:s,step:l,onChange:a,ariaLabel:o}=e;return(0,i.jsx)("input",{type:"range",min:n,max:s,step:l,value:t,onChange:e=>a(Number(e.target.value)),"aria-label":o,className:"block h-[44px] h-[46px] w-full cursor-pointer touch-pan-y accent-sc-copper-600"})}}}]);
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.