PageSourceSearch

https://xtdiagnostics.com/assets/equipment-tag-reader-DZGtFIqR.js

js xtdiagnostics.com collected 2026-10-07 17:44:25 UTC 21,805 bytes, 2 lines download raw bytes

1import{j as e}from"./query-vendor-ByfTUmMZ.js";import{r as s}from"./react-vendor-B6J3qve5.js";import{db as H,o as B,t as n,aJ as J,dk as Q,S as X,dl as P,dm as Y,c as d,d as m,L as U,B as c,X as K,C as Z,b3 as D,a as ee,b as te,ap as ae,dn as se,bl as re,de as ne,dp as ie,W as le,J as w,I as q}from"./index-Bi6nofvk.js";import{S as I}from"./scan-line-BUWTlIwr.js";import{U as oe}from"./upload-CEaMTGNG.js";import{C as A}from"./circle-alert-C1Jz5Ybq.js";import{C as M}from"./circle-check-DQ1gM3PL.js";import{F as ce}from"./file-text-DXJwnZOx.js";import{C as de}from"./copy-DzFJnt7a.js";import{S as me}from"./shield-check-UrwzSFaE.js";const _="Not clearly visible",L=[{key:"equipmentType",label:"Equipment type"},{key:"manufacturer",label:"Manufacturer"},{key:"brand",label:"Brand"},{key:"model",label:"Model number"},{key:"serialNumber",label:"Serial number"},{key:"voltage",label:"Voltage"},{key:"phase",label:"Phase"},{key:"amps",label:"Amps"},{key:"hertz",label:"Frequency (Hz)"},{key:"gasType",label:"Gas type"},{key:"manufactureDate",label:"Manufacture date"},{key:"certifications",label:"Certifications"},{key:"otherSpecs",label:"Other visible specs"},{key:"notes",label:"Notes"}];function he(i){return i==="High"?"bg-emerald-500/15 text-emerald-300 border-emerald-500/30":i==="Medium"?"bg-amber-500/15 text-amber-300 border-amber-500/30":"bg-rose-500/15 text-rose-300 border-rose-500/30"}function W(i){return!!i&&i!==_}function we(){const[i,y]=s.useState(null),[p,j]=s.useState(null),[r,f]=s.useState(null),[g,N]=s.useState(!1),[x,C]=s.useState(0),[h,u]=s.useState(null),k=s.useRef(null),v=s.useRef(null),b=s.useRef(null),{startDiagnosis:l,findPart:O}=H(),{toast:T}=B();s.useEffect(()=>{n("equipment_tag_reader_view"),n("equipment_tag_reader_open",{tool_name:"equipment_tag_reader"}),J({workflow:"tag_reader"})},[]);const{mutate:$,isPending:z}=Q({mutation:{onSuccess:t=>{u(null),f(t),n("equipment_tag_read_success",{confidence:t.confidence}),n("equipment_tag_scan_completed",{tool_name:"equipment_tag_reader",confidence:t.confidence}),requestAnimationFrame(()=>{b.current?.scrollIntoView({behavior:"smooth",block:"start"})})},onError:t=>{n("equipment_tag_read_failed");const a=t,o=a?.data??null;if(a?.status===429&&o?.captchaRequired){u({kind:"captcha",message:o.error??"Please complete the verification to continue."});return}if(a?.status===503&&o?.circuitOpen){u({kind:"circuit",message:o.error??"The free reader is paused due to high demand. Please try again later."});return}if(a?.status===429){u({kind:"rate",message:o?.error??"You've reached the free limit for now. Please try again later."});return}T({title:"Couldn't read that tag",description:"We couldn't read that data plate. Try a clearer, well-lit, straight-on photo of the label.",variant:"destructive"})}}}),F=s.useCallback(t=>{const a=new FileReader;a.onload=o=>{const R=o.target?.result;y(R),j(R.split(",")[1]??null),f(null),n("tag_reader_upload")},a.readAsDataURL(t)},[]),E=t=>{const a=t.target.files?.[0];a&&F(a)},G=t=>{t.preventDefault();const a=t.dataTransfer.files?.[0];a&&a.type.startsWith("image/")&&F(a)},S=()=>{y(null),j(null),f(null),u(null)},V=t=>{p&&(n("equipment_tag_read_started"),n("equipment_tag_scan_started",{tool_name:"equipment_tag_reader"}),$({data:{imageBase64:p,sourcePage:"/equipment-tag-reader",captchaToken:null}}))};return e.jsxs(e.Fragment,{children:[e.jsx(X,{title:P.title,description:P.description,path:"/equipment-tag-reader",jsonLd:Y()}),e.jsx("section",{className:"border-b border-border/40 bg-gradient-to-b from-primary/5 to-transparent",children:e.jsxs("div",{className:"container mx-auto max-w-screen-md px-4 py-12 text-center",children:[e.jsxs("div",{className:"inline-flex items-center gap-2 rounded-full border border-border/50 bg-card/50 px-3 py-1 text-xs font-medium text-muted-foreground mb-4",children:[e.jsx(I,{className:"h-3.5 w-3.5 text-primary"}),"Free tool · No login required"]}),e.jsx("h1",{className:"text-3xl sm:text-4xl font-bold tracking-tight",children:"Free Equipment Tag Reader"}),e.jsx("p",{className:"text-muted-foreground mt-3 text-base sm:text-lg",children:"Snap or upload a photo of any equipment data plate. Our AI reads the manufacturer, model, serial number, and electrical or gas ratings in seconds — so you can find the right part, manual, or fix faster."})]})}),e.jsxs("div",{className:"container mx-auto max-w-screen-md px-4 py-10 space-y-12",children:[e.jsx("section",{className:"space-y-6",children:z?e.jsx(d,{className:"border-border/50",children:e.jsxs(m,{className:"py-16 flex flex-col items-center gap-4",children:[e.jsx("div",{className:"w-16 h-16 rounded-full border-2 border-primary/20 flex items-center justify-center",children:e.jsx(U,{className:"h-8 w-8 text-primary animate-spin"})}),e.jsx("p",{className:"text-sm text-muted-foreground",children:"Reading the data plate…"})]})}):e.jsxs(e.Fragment,{children:[i?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"relative rounded-xl overflow-hidden border border-border/50",children:[e.jsx("img",{src:i,alt:"Equipment data plate preview",className:"w-full object-contain max-h-72 bg-muted"}),e.jsx(c,{variant:"secondary",size:"icon",className:"absolute top-2 right-2",onClick:S,"data-testid":"button-remove-image",children:e.jsx(K,{className:"h-4 w-4"})})]}),!r&&e.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[e.jsx(c,{variant:"outline",onClick:S,"data-testid":"button-retake",children:"Retake"}),e.jsxs(c,{onClick:()=>V(),className:"font-semibold","data-testid":"button-read-tag",children:[e.jsx(I,{className:"h-4 w-4 mr-2"}),"Read Tag"]})]})]}):e.jsxs("div",{"data-testid":"dropzone-tag",onDrop:G,onDragOver:t=>t.preventDefault(),className:"border-2 border-dashed border-border/60 rounded-xl p-10 flex flex-col items-center justify-center gap-4 text-center hover:border-primary/50 hover:bg-muted/20 transition-colors cursor-pointer",onClick:()=>k.current?.click(),children:[e.jsx("div",{className:"p-4 rounded-full bg-muted",children:e.jsx(oe,{className:"h-8 w-8 text-muted-foreground"})}),e.jsxs("div",{children:[e.jsx("p",{className:"font-medium text-foreground",children:"Drop a data-
1plate photo here or tap to upload"}),e.jsx("p",{className:"text-sm text-muted-foreground mt-1",children:"JPG, PNG, WebP supported"})]}),e.jsx("input",{ref:k,type:"file",accept:"image/*",className:"hidden",onChange:E,"data-testid":"input-file-upload"})]}),!i&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"relative flex items-center gap-3",children:[e.jsx("div",{className:"flex-1 h-px bg-border"}),e.jsx("span",{className:"text-xs text-muted-foreground uppercase tracking-wider",children:"or use camera"}),e.jsx("div",{className:"flex-1 h-px bg-border"})]}),e.jsxs(c,{variant:"outline",className:"w-full h-14 gap-3 text-base",onClick:()=>v.current?.click(),"data-testid":"button-take-photo",children:[e.jsx(Z,{className:"h-5 w-5"}),"Take Photo with Camera"]}),e.jsx("input",{ref:v,type:"file",accept:"image/*",capture:"environment",className:"hidden",onChange:E,"data-testid":"input-camera-capture"}),e.jsx(d,{className:"border-amber-500/20 bg-amber-500/5",children:e.jsxs(m,{className:"p-4 flex gap-3",children:[e.jsx(A,{className:"h-4 w-4 text-amber-400 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-xs text-amber-300/80",children:"For best results, fill the frame with the plate, hold the camera straight on, and use good lighting. Clean off grease or dust first."})]})})]}),h&&e.jsx(d,{className:"border-amber-500/30 bg-amber-500/5","data-testid":"tag-block",children:e.jsxs(m,{className:"p-5 space-y-4",children:[e.jsxs("div",{className:"flex gap-3",children:[e.jsx(D,{className:"h-5 w-5 text-amber-400 flex-shrink-0 mt-0.5"}),e.jsxs("div",{className:"space-y-1",children:[e.jsx("p",{className:"text-sm font-semibold text-foreground",children:h.kind==="captcha"?"Quick verification needed":h.kind==="circuit"?"Reader temporarily paused":"Free limit reached"}),e.jsx("p",{className:"text-xs text-amber-200/80",children:h.message})]})]}),h.kind==="captcha"&&e.jsx("p",{className:"text-xs text-muted-foreground",children:"Too many attempts from this network. Please try again later."})]})})]})}),r&&e.jsxs("section",{ref:b,className:"space-y-6 scroll-mt-20","data-testid":"tag-results",children:[e.jsxs("div",{className:"flex items-center justify-between gap-3 flex-wrap",children:[e.jsx("h2",{className:"text-xl font-bold tracking-tight",children:"Extracted equipment details"}),e.jsxs("span",{className:`inline-flex items-center gap-1.5 rounded-full border px-3 py-1 text-xs font-semibold ${he(r.confidence)}`,"data-testid":"badge-confidence",children:[e.jsx(M,{className:"h-3.5 w-3.5"}),r.confidence," confidence"]})]}),e.jsx(d,{className:"border-border/50",children:e.jsx(m,{className:"p-0 divide-y divide-border/40",children:L.map(t=>{const a=r[t.key]??_,o=W(a);return e.jsxs("div",{className:"flex items-start justify-between gap-4 px-4 py-3","data-testid":`field-${t.key}`,children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:t.label}),e.jsx("span",{className:`text-sm text-right font-medium ${o?"text-foreground":"text-muted-foreground/50 italic font-normal"}`,children:a})]},t.key)})})}),r.confidence==="Low"&&e.jsx(d,{className:"border-amber-500/20 bg-amber-500/5",children:e.jsxs(m,{className:"p-4 flex gap-3",children:[e.jsx(A,{className:"h-4 w-4 text-amber-400 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-xs text-amber-300/80",children:"Some of this plate was hard to read. Double-check the fields above against the physical label, or retake a clearer photo."})]})}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold mb-3",children:"What's next?"}),e.jsxs("div",{className:"grid sm:grid-cols-2 gap-3",children:[e.jsxs(c,{variant:"outline",className:"h-auto py-3 justify-start gap-3",onClick:()=>{n("equipment_tag_next_step_click",{step:"diagnose"}),l()},"data-testid":"next-diagnose",children:[e.jsx(ee,{className:"h-5 w-5 text-primary flex-shrink-0"}),e.jsxs("span",{className:"text-left",children:[e.jsx("span",{className:"block text-sm font-semibold",children:"Start full diagnosis"}),e.jsx("span",{className:"block text-xs text-muted-foreground",children:"Figure out what's wrong"})]})]}),e.jsxs(c,{variant:"outline",className:"h-auto py-3 justify-start gap-3",onClick:()=>{n("find_parts_click"),O()},"data-testid":"next-find-parts",children:[e.jsx(te,{className:"h-5 w-5 text-primary flex-shrink-0"}),e.jsxs("span",{className:"text-left",children:[e.jsx("span",{className:"block text-sm font-semibold",children:"Find parts"}),e.jsx("span",{className:"block text-xs text-muted-foreground",children:"Match a replacement part"})]})]}),e.jsxs(c,{variant:"outline",className:"h-auto py-3 justify-start gap-3",onClick:()=>{n("find_manual_click");const t=[r.manufacturer,r.model,"service manual"].filter(o=>W(o)).join(" "),a=`https://www.google.com/search?q=${encodeURIComponent(t||"equipment service manual")}`;window.open(a,"_blank","noopener,noreferrer")},"data-testid":"next-find-manual",children:[e.jsx(ce,{className:"h-5 w-5 text-primary flex-shrink-0"}),e.jsxs("span",{className:"text-left",children:[e.jsx("span",{className:"block text-sm font-semibold",children:"Find manual"}),e.jsx("span",{className:"block text-xs text-muted-foreground",children:"Search for the service manual"})]})]}),e.jsxs(c,{variant:"outline",className:"h-auto py-3 justify-start gap-3",onClick:async()=>{n("equipment_tag_next_step_click",{step:"copy"});const t=L.map(a=>`${a.label}: ${r[a.key]??_}`).join(`
2`);try{await navigator.clipboard.writeText(t),N(!0),setTimeout(()=>N(!1),2e3)}catch{T({title:"Copy failed",description:"Your browser blocked clipboard access."})}},"data-testid":"next-copy",children:[g?e.jsx(ae,{className:"h-5 w-5 text-emerald-400 flex-shrink-0"}):e.jsx(de,{className:"h-5 w-5 text-primary flex-shrink-0"}),e.jsxs("span",{className:"text-left",children:[e.jsx("span",{className:"block text-sm font-semibold",children:g?"Copied!":"Copy results"}),e.jsx("span",{className:"block text-xs text-muted-foreground",children:"Save the details as text"})]})]})]})]}),e.jsx(ue,{readId:r.id,writeToken:r.writeToken}),e.jsx(c,{variant:"ghost",className:"w-full",onClick:S,"data-testid":"button-read-another",children:"Read another tag"})]}),e.jsx(d,{className:"border-emerald-500/20 bg-emerald-500/5",children:e.jsxs(m,{className:"p-4 flex gap-3",children:[e.jsx(me,{className:"h-4 w-4 text-emerald-400 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-xs text-emerald-200/90",children:"Your photo is processed securely on our server and is not stored. We keep only the extracted text so we can show your results."})]})}),e.jsxs("article",{className:"prose-sm max-w-none space-y-8 text-muted-foreground leading-relaxed",children:[e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight text-foreground",children:"Read any equipment data plate in seconds"}),e.jsx("p",{children:"Every commercial machine — from a reach-in refrigerator to a rooftop HVAC unit, a commercial fryer, a pallet jack, or an industrial mixer — carries a data plate. This small metal or sticker label, also called a 
2nameplate or rating plate, is the single most useful source of truth about your equipment. It tells you who built it, exactly which model it is, when it was made, and the electrical or gas specifications it was designed to run on. The problem is that data plates are easy to misread: the print is tiny, often stamped into brushed metal, tucked behind a panel, or worn down by years of heat, grease, and cleaning chemicals. The XTDiagnostics Equipment Tag Reader removes that friction. Take a photo, and our AI transcribes every readable field for you — no typing, no squinting, and no guesswork."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight text-foreground",children:"Why the model and serial number matter"}),e.jsx("p",{children:`When something breaks, the very first thing a parts supplier, a manufacturer's warranty desk, or a service technician will ask for is the model and serial number. Those two values turn a vague description — "the walk-in cooler in the back" — into a precise, orderable identity. The model number narrows replacement parts to the exact components that fit your unit, instead of a close-but-wrong substitute that wastes a return shipment and a second service trip. The serial number pins down the production run, which matters because manufacturers frequently revise parts mid-model; a gasket or control board that fit the first batch may not fit a later one. The seri
2al number also establishes the manufacture date, which determines whether your equipment is still under warranty. Reading both correctly the first time is the difference between a same-day fix and a week of back-and-forth.`})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight text-foreground",children:"What the Equipment Tag Reader extracts"}),e.jsxs("p",{children:["Point the camera at the plate and the reader pulls the fields that technicians actually use: manufacturer and brand, model number, serial number, and equipment type, plus the electrical ratings that govern any repair or installation — voltage, phase, full-load amps, and frequency in hertz. For gas-fired equipment it captures the gas type, so you know whether you're working on a natural gas or LP/propane unit before you touch a single fitting. It also surfaces the manufacture date, listed safety certifications such as UL, NSF, and ETL, and any other printed specs like BTU input, wattage, refrigerant charge, or horsepower. Crucially, the tool never invents a value. If a field is worn away, cropped out of the frame, or too blurry to trust, it returns ",e.jsxs("strong",{children:['"',_,'"']})," instead of a confident-sounding guess — because a wrong part number is worse than a blank."]})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight text-foreground",children:"How to photograph a data plate for the best read"}),e.jsx("p",{children:"The quality of your photo is the single biggest factor in how much the reader can extract. Start by wiping the plate clean — a quick pass with a cloth removes the grease film that scatters light and hides characters. Fill the frame with the label so the text is as large as possible, and hold the camera square to the plate rather than at an angle, which distorts stamped characters. Good, even lighting helps enormously; if the plate is in a dark cabinet or behind a unit, use a flashlight or your phone's torch from the side to bring out engraved text without glare. If a plate is split across two areas, photograph the busiest section first. When a field still comes back as not clearly visible, retake the shot from a slightly different angle — raised lettering often reads better with light raking across it."})]}),e.jsxs("div",{className:"space-y-3",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight text-foreground",children:"From tag to fix — what to do next"}),e.jsxs("p",{children:["Reading the plate is the starting line, not the finish. Once you have the model and serial number, you can move straight into solving the actual problem. Use ",e.jsx("strong",{children:"Find Parts"})," to match an exact replacement component to your unit, ",e.jsx("strong",{children:"Find Manual"})," to track down the service documentation for that specific model, or ",e.jsx("strong",{children:"Start Full Diagnosis"})," to let XTDiagnostics walk you through what's wrong and how to fix it based on your symptoms. Because the reader is free and requires no account, it's also a fast way to build an equipment list for a kitchen, a fleet of pallet jacks, or a building full of HVAC units — snap each plate, save the profile, and you'll have an organized record the next time anything needs service. The tool is built for technicians, facility managers, restaurant operators, and anyone who maintains commercial equipment and is tired of squinting at faded labels."]})]})]}),e.jsxs("section",{className:"space-y-4",children:[e.jsx("h2",{className:"text-2xl font-bold tracking-tight",children:"Frequently asked questions"}),e.jsx("div",{className:"space-y-2",children:se.map((t,a)=>e.jsxs(d,{className:"border-border/50 overflow-hidden",children:[e.jsxs("button",{className:"w-full flex items-center justify-between gap-4 p-4 text-left",onClick:()=>C(x===a?null:a),"data-testid":`faq-${a}`,children:[e.jsx("span",{className:"text-sm font-semibold",children:t.q}),e.jsx(re,{className:`h-4 w-4 text-muted-foreground flex-shrink-0 transition-transform ${x===a?"rotate-180":""}`})]}),x===a&&e.jsx("div",{className:"px-4 pb-4 text-sm text-muted-foreground leading-relaxed",children:t.a})]},t.q))})]}),e.jsxs("div",{className:"rounded-xl border border-amber-500/30 bg-amber-500/10 p-5 flex gap-3",children:[e.jsx(D,{className:"h-5 w-5 text-amber-400 flex-shrink-0 mt-0.5"}),e.jsx("p",{className:"text-sm text-amber-200/90",children:ne})]})]})]})}function ue({readId:i,writeToken:y}){const[p,j]=s.useState(""),[r,f]=s.useState(""),[g,N]=s.useState(""),[x,C]=s.useState(""),[h,u]=s.useState(!1),{toast:k}=B(),{mutate:v,isPending:b}=ie({mutation:{onSuccess:()=>{u(!0),n("lead_form_submit")},onError:()=>{k({title:"Couldn't save",description:"Something went wrong saving your details. Please try again.",variant:"destructive"})}}});return h?e.jsx(d,{className:"border-emerald-500/30 bg-emerald-500/5",children:e.jsxs(m,{className:"p-5 flex items-center gap-3",children:[e.jsx(M,{className:"h-5 w-5 text-emerald-400 flex-shrink-0"}),e.jsx("p",{className:"text-sm text-emerald-200/90",children:"Saved! We'll keep your equipment profile on file. Thanks for using XTDiagnostics."})]})}):e.jsx(d,{className:"border-primary/20 bg-primary/5",children:e.jsxs(m,{className:"p-5 space-y-4",children:[e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx(le,{className:"h-5 w-5 text-primary flex-shrink-0 mt-0.5"}),e.jsxs("div",{children:[e.jsx("h3",{className:"text-sm font-semibold",children:"Save your equipment profile"}),e.jsx("p",{className:"text-xs text-muted-foreground mt-0.5",children:"Optional — get these details emailed to you and let our team help you source parts or schedule service."})]})]}),e.jsxs("form",{className:"grid sm:grid-cols-2 gap-3",onSubmit:l=>{l.preventDefault(),!(!p.trim()||!r.trim())&&v({data:{id:i,writeToken:y,name:p.trim(),email:r.trim(),companyName:g.trim()||null,phone:x.trim()||null}})},children:[e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(w,{htmlFor:"tag-name",className:"text-xs",children:"Name *"}),e.jsx(q,{id:"tag-name",value:p,onChange:l=>j(l.target.value),required:!0,"data-testid":"input-lead-name"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(w,{htmlFor:"tag-email",className:"text-xs",children:"Email *"}),e.jsx(q,{id:"tag-email",type:"email",value:r,onChange:l=>f(l.target.value),required:!0,"data-testid":"input-lead-email"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(w,{htmlFor:"tag-company",className:"text-xs",children:"Company (optional)"}),e.jsx(q,{id:"tag-company",value:g,onChange:l=>N(l.target.value),"data-testid":"input-lead-company"})]}),e.jsxs("div",{className:"space-y-1.5",children:[e.jsx(w,{htmlFor:"tag-phone",className:"text-xs",children:"Phone (optional)"}),e.jsx(q,{id:"tag-phone",type:"tel",value:x,onChange:l=>C(l.target.value),"data-testid":"input-lead-phone"})]}),e.jsx("div",{className:"sm:col-span-2",children:e.jsxs(c,{type:"submit",className:"w-full font-semibold",disabled:b,"data-testid":"button-save-lead",children:[b?e.jsx(U,{className:"h-4 w-4 mr-2 animate-spin"}):null,"Save my equipment profile"]})})]})]})})}export{we as default};

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.