PageSourceSearch

https://bravara.com/_next/static/chunks/pages/basketball-scoreboard-2719fbe3c0f90f79.js

js bravara.com collected 2026-10-09 22:46:01 UTC 61,075 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9286],{88542:function(e,t,a){(window.__NEXT_P=window.__NEXT_P||[]).push(["/basketball-scoreboard",function(){return a(31233)}])},25401:function(e,t,a){"use strict";a.d(t,{Z:function(){return r},u:function(){return l}});var s=a(85893),n=a(97703),o=a.n(n);let l=e=>({"@context":"https://schema.org","@type":"FAQPage",mainEntity:e.map(e=>{let{q:t,a}=e;return{"@type":"Question",name:t,acceptedAnswer:{"@type":"Answer",text:a}}})});function r(e){let{items:t,headingLevel:a=3}=e,n="h".concat(a);return(0,s.jsx)("div",{className:o().faq,children:t.map((e,t)=>{let{q:a,a:l}=e;return(0,s.jsxs)("details",{className:o().faqItem,open:0===t,children:[(0,s.jsxs)("summary",{children:[(0,s.jsx)(n,{children:a}),(0,s.jsx)("span",{"aria-hidden":"true",className:o().faqIcon})]}),(0,s.jsx)("p",{children:l})]},a)})})}},88608:function(e,t,a){"use strict";a.d(t,{Z:function(){return n}});var s=a(67294);function n(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];(0,s.useEffect)(()=>(document.documentElement.classList.add("bv-root"),()=>document.documentElement.classList.remove("bv-root")),[]),(0,s.useEffect)(()=>{let e;let t=document.querySelector(".bv-page");t&&!t.classList.contains("is-loaded")&&(e=requestAnimationFrame(()=>requestAnimationFrame(()=>t.classList.add("is-loaded"))));let a=Array.from(document.querySelectorAll(".bv-reveal:not(.is-in), .bv-chapter:not(.is-in)"));if(!a.length)return()=>e&&cancelAnimationFrame(e);if("undefined"==typeof IntersectionObserver)return a.forEach(e=>e.classList.add("is-in")),()=>e&&cancelAnimationFrame(e);let s=new IntersectionObserver(e=>{e.forEach(e=>{e.isIntersecting&&(e.target.classList.add("is-in"),s.unobserve(e.target))})},{rootMargin:"0px 0px 10% 0px",threshold:0});return a.forEach(e=>s.observe(e)),()=>{s.disconnect(),e&&cancelAnimationFrame(e)}},e)}},27990:function(e,t,a){"use strict";a.d(t,{Z:function(){return n}});var s=a(11163);function n(){let e=(0,s.useRouter)();if(!e.isReady)return null;let t=e.query.promo_code;return(Array.isArray(t)?t[0]:t)||null}},31233:function(e,t,a){"use strict";a.r(t),a.d(t,{default:function(){return es}});var s=a(85893),n=a(41664),o=a.n(n),l=a(94116),r=a(88608),c=a(25401),i=a(67294),d=a(73935),h=a(4269),p=a.n(h),u=a(28964),m=a(99155);let x=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return function(){return(0,s.jsx)("svg",{viewBox:"0 0 24 24",width:"18",height:"18",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",...t,children:e})}},b={play:x((0,s.jsx)("path",{d:"M7 4.5v15l13-7.5z",fill:"currentColor",stroke:"none"})),pause:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("rect",{x:"5.5",y:"4.5",width:"4.5",height:"15",rx:"1",fill:"currentColor",stroke:"none"}),(0,s.jsx)("rect",{x:"14",y:"4.5",width:"4.5",height:"15",rx:"1",fill:"currentColor",stroke:"none"})]})),undo:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M9 14 4 9l5-5"}),(0,s.jsx)("path",{d:"M4 9h10.5a5.5 5.5 0 0 1 0 11H11"})]})),swap:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M7 4 3 8l4 4"}),(0,s.jsx)("path",{d:"M3 8h18"}),(0,s.jsx)("path",{d:"m17 12 4 4-4 4"}),(0,s.jsx)("path",{d:"M21 16H3"})]})),horn:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M3 10v4h4l6 5V5L7 10z"}),(0,s.jsx)("path",{d:"M16.5 8.5a5 5 0 0 1 0 7"}),(0,s.jsx)("path",{d:"M19.5 5.5a9 9 0 0 1 0 13"})]})),gear:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M4 6h10M18 6h2M4 12h3M11 12h9M4 18h12M20 18h0"}),(0,s.jsx)("circle",{cx:"16",cy:"6",r:"2"}),(0,s.jsx)("circle",{cx:"9",cy:"12",r:"2"}),(0,s.jsx)("circle",{cx:"18",cy:"18",r:"2"})]})),expand:x((0,s.jsx)("path",{d:"M4 9V4h5M20 9V4h-5M4 15v5h5M20 15v5h-5"})),tv:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("rect",{x:"3",y:"4.5",width:"18",height:"12",rx:"2"}),(0,s.jsx)("path",{d:"M8 20h8M12 16.5V20"})]})),close:x((0,s.jsx)("path",{d:"M6 6l12 12M18 6 6 18"})),arrow:x((0,s.jsx)("path",{d:"M5 12h14M13 6l6 6-6 6"})),print:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M7 8V4h10v4"}),(0,s.jsx)("rect",{x:"4",y:"8",width:"16",height:"8",rx:"2"}),(0,s.jsx)("path",{d:"M7 14h10v6H7z"})]})),copy:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("rect",{x:"8",y:"8",width:"12",height:"12",rx:"2"}),(0,s.jsx)("path",{d:"M16 8V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8a2 2 0 0 0 2 2h2"})]})),check:x((0,s.jsx)("path",{d:"m5 12.5 4.5 4.5L19 7.5"})),download:x((0,s.jsx)("path",{d:"M12 4v11M7 11l5 5 5-5M5 20h14"})),pencil:x((0,s.jsx)("path",{d:"M4 20h4L19 9l-4-4L4 16zM13.5 6.5l4 4"})),list:x((0,s.jsx)("path",{d:"M8 6h12M8 12h12M8 18h12M4 6h0M4 12h0M4 18h0"})),file:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("path",{d:"M7 3h7l5 5v13H7z"}),(0,s.jsx)("path",{d:"M14 3v5h5M10 13h6M10 17h6"})]})),sheet:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("rect",{x:"4",y:"4",width:"16",height:"16",rx:"2"}),(0,s.jsx)("path",{d:"M4 10h16M4 15h16M10 4v16"})]})),share:x((0,s.jsx)("path",{d:"M12 15V4M8 8l4-4 4 4M5 13v5a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-5"})),live:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"2.5",fill:"currentColor",stroke:"none"}),(0,s.jsx)("path",{d:"M7.5 7.5a6.4 6.4 0 0 0 0 9M16.5 7.5a6.4 6.4 0 0 1 0 9M4.5 4.5a10.6 10.6 0 0 0 0 15M19.5 4.5a10.6 10.6 0 0 1 0 15"})]})),cog:x((0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("circle",{cx:"12",cy:"12",r:"3"}),(0,s.jsx)("path",{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33h0a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h0a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82v0a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"})]})),plus:x((0,s.jsx)("path",{d:"M12 5v14M5 12h14"})),trash:x((0,s.jsx)("path",{d:"M4 7h16M10 11v6M14 11v6M6 7l1 12h10l1-12M9 7V4h6v3"})),jersey:x((0,s.jsx)("path",{d:"M8 3 3 6l2 4 2-1v11h10V9l2 1 2-4-5-3a4 4 0 0 1-8 0z"}))};var j=a(66505);let g={w:612,h:792,margin:48};function y(e,t,a,s){let n=g.w-2*g.margin,o=a.reduce((e,t)=>
1e+(t.w||0),0),l=a.filter(e=>!e.w).length,r=a.map(e=>e.w||(n-o)/l),c=(t,s,o)=>{let l=g.margin;o&&(e.setFillColor(241,241,241),e.rect(g.margin,s,n,20,"F")),e.setFont("helvetica",o?"bold":"normal"),e.setFontSize(o?8.5:10),e.setTextColor(o?90:20),t.forEach((t,n)=>{let c="left"===a[n].align,i=e.splitTextToSize(String(null!=t?t:""),r[n]-12)[0]||"";a[n].bold&&!o&&e.setFont("helvetica","bold"),e.text(o?i.toUpperCase():i,c?l+6:l+r[n]/2,s+13.5,{align:c?"left":"center"}),a[n].bold&&!o&&e.setFont("helvetica","normal"),l+=r[n]}),e.setDrawColor(200),e.line(g.margin,s+20,g.margin+n,s+20)},i=a.map(e=>e.label);for(let a of(c(i,t,!0),t+=20,s))t+20>g.h-g.margin&&(e.addPage(),c(i,t=g.margin,!0),t+=20),c(a,t,!1),t+=20;return t}function f(e,t,a){return t+60>g.h-g.margin&&(e.addPage(),t=g.margin),e.setFont("helvetica","bold"),e.setFontSize(12),e.setTextColor(20),e.text(a,g.margin,t+22),t+30}let v=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"pdf";return"".concat(e.teams.map(e=>e.name.trim()||"team").join("-vs-").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,""),"-box-score.").concat(t)};async function k(e){let{jsPDF:t}=await Promise.all([a.e(7847),a.e(6432),a.e(6650)]).then(a.bind(a,91819)),s=new t({unit:"pt",format:"letter"}),[n,o]=e.teams;s.setFont("helvetica","bold"),s.setFontSize(20),s.setTextColor(20),s.text("".concat(e.final?"Final: ":"").concat(n.name," ").concat((0,j.Gs)(e,0),", ").concat(o.name," ").concat((0,j.Gs)(e,1)),g.margin,g.margin+16),s.setFont("helvetica","normal"),s.setFontSize(10),s.setTextColor(110),s.text(new Date().toLocaleDateString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),g.margin,g.margin+34);let l=(0,j.KS)(e),r=y(s,g.margin+50,[{label:"Team",align:"left"},...l[0].map((t,a)=>({label:(0,j.Z8)(e.rules,a+1),w:48})),{label:e.final?"Final":"Total",w:60,bold:!0}],[0,1].map(t=>[e.teams[t].name,...l[t],(0,j.Gs)(e,t)]));[0,1].forEach(t=>{let a=(0,j.WP)(e,t);a.length&&(r=f(s,r,e.teams[t].name),r=y(s,r,[{label:"#",w:40},{label:"Player",align:"left"},{label:"2PT",w:48},{label:"3PT",w:48},{label:"FT",w:48},{label:"Fouls",w:52},{label:"Points",w:60,bold:!0}],a.map(e=>[e.num,e.name,e.fg2,e.fg3,e.ft,e.fouls,e.pts])))});let c=(0,j.Yo)(e);c.length&&(r=f(s,r,"Play by play"),y(s,r,[{label:"Period",w:56},{label:"Clock",w:56},{label:"Play",align:"left"},{label:"Score",w:64,bold:!0}],c.map(e=>[e.period,e.clock,e.text.replace("−","-"),e.score])));let i=s.getNumberOfPages();for(let e=1;e<=i;e+=1)s.setPage(e),s.setFont("helvetica","normal"),s.setFontSize(8.5),s.setTextColor(130),s.text("Scored with the free basketball scoreboard at bravara.com/basketball-scoreboard",g.margin,g.h-26);s.save(v(e))}let _=e=>(0,j.KS)(e)[0].map((t,a)=>(0,j.Z8)(e.rules,a+1));function w(e){let[t,a]=e.teams,[s,n]=[(0,j.Gs)(e,0),(0,j.Gs)(e,1)],o=["".concat(e.final?"Final":"Score",": ").concat(t.name," ").concat(s,", ").concat(a.name," ").concat(n)],l=(0,j.KS)(e);return o.push("By period (".concat(_(e).join(", "),"): ").concat(t.name," ").concat(l[0].join("-"),", ").concat(a.name," ").concat(l[1].join("-"))),[0,1].forEach(t=>{let a=(0,j.WP)(e,t).filter(e=>e.pts>0).sort((e,t)=>t.pts-e.pts).map(e=>"".concat(e.name||"#".concat(e.num)," ").concat(e.pts));a.length&&o.push("".concat(e.teams[t].name,": ").concat(a.join(", ")))}),o.join("\n")}let N=e=>String(e).replace(/[&<>"]/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[e]);function C(e){let t=document.createElement("iframe");t.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0",document.body.appendChild(t),t.contentDocument.open(),t.contentDocument.write(function(e){let t=_(e),a=(0,j.KS)(e),s="<table><tr><th></th>".concat(t.map(e=>"<th>".concat(e,"</th>")).join(""),"<th>").concat(e.final?"Final":"Total","</th></tr>").concat([0,1].map(t=>'<tr><td class="l">'.concat(N(e.teams[t].name),"</td>").concat(a[t].map(e=>"<td>".concat(e,"</td>")).join(""),"<td><b>").concat((0,j.Gs)(e,t),"</b></td></tr>")).join(""),"</table>"),n=[0,1].map(t=>{let a=(0,j.WP)(e,t);return a.length?"<h2>".concat(N(e.teams[t].name),'</h2><table><tr><th>#</th><th class="l">Player</th><th>2PT</th><th>3PT</th><th>FT</th><th>Fouls</th><th>Points</th></tr>').concat(a.map(e=>"<tr><td>".concat(N(e.num),'</td><td class="l">').concat(N(e.name),"</td><td>").concat(e.fg2,"</td><td>").concat(e.fg3,"</td><td>").concat(e.ft,"</td><td>").concat(e.fouls,"</td><td><b>").concat(e.pts,"</b></td></tr>")).join(""),"</table>"):""}).join(""),o=log.length?'<h2>Play by play</h2><table><tr><th>Period</th><th>Clock</th><th class="l">Play</th><th>Score</th></tr>'.concat(log.map(e=>"<tr><td>".concat(e.period,"</td><td>").concat(e.clock,'</td><td class="l">').concat(N(e.text),"</td><td>").concat(e.score,"</td></tr>")).join(""),"</table>"):"";return'<!doctype html><html><head><meta charset="utf-8"><title>'.concat(N(e.teams[0].name)," vs ").concat(N(e.teams[1].name),"</title><style>\n    body{font:14px/1.4 Arial,Helvetica,sans-serif;color:#111;margin:32px}\n    h1{font-size:24px;margin:0 0 4px}h2{font-size:16px;margin:26px 0 6px}p{margin:0 0 18px;color:#555}\n    table{border-collapse:collapse;width:100%}th,td{border:1px solid #bbb;padding:6px 10px;text-align:center}\n    th{background:#f1f1f1;font-size:12px;text-transform:uppercase;letter-spacing:.04em}.l{text-align:left}\n    footer{margin-top:28px;font-size:11px;
1color:#777}\n  </style></head><body>\n    <h1>").concat(e.final?"Final: ":"").concat(N(e.teams[0].name)," ").concat((0,j.Gs)(e,0),", ").concat(N(e.teams[1].name)," ").concat((0,j.Gs)(e,1),"</h1>\n    <p>").concat(new Date().toLocaleDateString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),"</p>\n    ").concat(s).concat(n).concat(o,"\n    <footer>Scored with the free basketball scoreboard at bravara.com/basketball-scoreboard</footer>\n  </body></html>")}(e)),t.contentDocument.close(),t.contentWindow.focus(),t.contentWindow.print(),setTimeout(()=>t.remove(),6e4)}function S(e){let{state:t,onResume:a,onExport:n}=e,l=_(t),r=(0,j.KS)(t),c=[(0,j.Gs)(t,0),(0,j.Gs)(t,1)],i=t.final&&c[0]!==c[1]?c[0]>c[1]?0:1:null;return(0,j.Yo)(t),(0,s.jsxs)("div",{className:p().summary,children:[t.final&&(0,s.jsxs)("div",{className:p().cardHead,children:[(0,s.jsx)("h3",{children:"Final score"}),(0,s.jsx)("button",{type:"button",onClick:a,children:"Back to the game"})]}),(0,s.jsx)("div",{className:p().tableScroll,children:(0,s.jsxs)("table",{className:p().line,children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:"Team"}),l.map(e=>(0,s.jsx)("th",{scope:"col",children:e},e)),(0,s.jsx)("th",{scope:"col",children:t.final?"Final":"Total"})]})}),(0,s.jsx)("tbody",{children:[0,1].map(e=>(0,s.jsxs)("tr",{className:i===e?p().won:void 0,children:[(0,s.jsxs)("th",{scope:"row",children:[(0,s.jsx)("i",{style:{background:t.teams[e].color}}),t.teams[e].name]}),r[e].map((e,t)=>(0,s.jsx)("td",{children:e},t)),(0,s.jsx)("td",{children:(0,s.jsx)("b",{children:c[e]})})]},e))})]})}),[0,1].map(e=>{let a=(0,j.WP)(t,e);return a.length?(0,s.jsxs)("div",{className:p().box,children:[(0,s.jsx)("h4",{children:t.teams[e].name}),(0,s.jsx)("div",{className:p().tableScroll,children:(0,s.jsxs)("table",{className:p().line,children:[(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:"Player"}),(0,s.jsx)("th",{scope:"col",children:"2PT"}),(0,s.jsx)("th",{scope:"col",children:"3PT"}),(0,s.jsx)("th",{scope:"col",children:"FT"}),(0,s.jsx)("th",{scope:"col",children:"Fouls"}),(0,s.jsx)("th",{scope:"col",children:"Points"})]})}),(0,s.jsx)("tbody",{children:a.map(e=>(0,s.jsxs)("tr",{children:[(0,s.jsxs)("th",{scope:"row",children:[(0,s.jsx)("em",{children:e.num}),e.name]}),(0,s.jsx)("td",{children:e.fg2}),(0,s.jsx)("td",{children:e.fg3}),(0,s.jsx)("td",{children:e.ft}),(0,s.jsx)("td",{className:e.fouls>=t.rules.foulOut?p().out:void 0,children:e.fouls}),(0,s.jsx)("td",{children:(0,s.jsx)("b",{children:e.pts})})]},e.id))})]})})]},e):null}),(0,s.jsx)("div",{className:p().summaryActions,children:(0,s.jsxs)("button",{type:"button",className:p().primary,onClick:n,children:[(0,s.jsx)(b.download,{}),"Export"]})}),(0,s.jsxs)("div",{className:p().appNote,children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("b",{children:"Coaching this team all season?"}),(0,s.jsx)("span",{children:"The free Bravara app keeps your schedule, team chat and at-home drills in one place for players and parents."})]}),(0,s.jsx)(o(),{href:"/download",children:"Get the free app"})]})]})}var T=a(47592);function F(e){let{title:t,onClose:a,children:n,wide:o}=e,[l,r]=(0,i.useState)(null);return((0,i.useEffect)(()=>{r(document.fullscreenElement||document.body);let e=e=>"Escape"===e.key&&a();return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[a]),l)?(0,d.createPortal)((0,s.jsx)("div",{className:"".concat(p().theme," ").concat(p().scrim),onMouseDown:e=>e.target===e.currentTarget&&a(),children:(0,s.jsxs)("div",{className:"".concat(p().dialog," ").concat(o?p().dialogWide:""),role:"dialog","aria-modal":"true","aria-label":t,children:[(0,s.jsxs)("header",{children:[(0,s.jsx)("h2",{children:t}),(0,s.jsx)("button",{type:"button",onClick:a,"aria-label":"Close",children:(0,s.jsx)(b.close,{})})]}),n]})}),l):null}function M(e){let{label:t,value:a,onChange:n,min:o=0,max:l=99,unit:r,off:c}=e;return(0,s.jsxs)("div",{className:p().field,children:[(0,s.jsx)("span",{children:t}),(0,s.jsxs)("div",{className:p().stepper,children:[(0,s.jsx)("button",{type:"button",onClick:()=>n(Math.max(o,a-1)),disabled:a<=o,"aria-label":"Lower ".concat(t),children:"−"}),(0,s.jsxs)("b",{children:[c&&0===a?c:a,r&&!(c&&0===a)?(0,s.jsxs)("small",{children:[" ",r]}):null]}),(0,s.jsx)("button",{type:"button",onClick:()=>n(Math.min(l,a+1)),disabled:a>=l,"aria-label":"Raise ".concat(t),children:"+"})]})]})}function E(e){let{label:t,value:a,options:n,onChange:o}=e;return(0,s.jsxs)("div",{className:p().field,children:[(0,s.jsx)("span",{children:t}),(0,s.jsx)("div",{className:p().choice,children:n.map(e=>{let[t,n]=e;return(0,s.jsx)("button",{type:"button","aria-pressed":t===a,onClick:()=>o(t),children:n},String(t))})})]})}function A(e){let{state:t,dispatch:a,onClose:n}=e,o=t.rules,l=e=>a({type:"rules",rules:{...e,preset:"custom"}});return(0,s.jsxs)(F,{title:"Game setup",onClose:n,wide:!0,children:[(0,s.jsxs)("div",{className:p().dialogBody,
1children:[(0,s.jsx)("div",{className:p().nameFields,children:t.teams.map((e,t)=>(0,s.jsxs)("label",{style:{"--team":e.color},children:[(0,s.jsx)("span",{children:0===t?"Home team":"Guest team"}),(0,s.jsx)("input",{value:e.name,maxLength:18,placeholder:0===t?"Home":"Guest",onChange:e=>a({type:"team",team:t,patch:{name:e.target.value}}),onFocus:e=>e.target.select()})]},t))}),(0,s.jsx)("div",{className:p().presets,children:j.Td.map(e=>{let t=j.PG[e];return(0,s.jsxs)("button",{type:"button","aria-pressed":o.preset===e,onClick:()=>a({type:"preset",preset:e}),children:[(0,s.jsx)("b",{children:t.label}),(0,s.jsxs)("span",{children:[t.periods," \xd7 ",t.periodMin," min",t.shot?" \xb7 ".concat(t.shot,"s shot clock"):""]})]},e)})}),!(0,j.VN)(t)&&(0,s.jsx)("p",{className:p().note,children:"The game has started, so the clock keeps its current time. New lengths apply from the next period."}),(0,s.jsxs)("div",{className:p().fields,children:[(0,s.jsx)(E,{label:"Game is played in",value:o.periods,options:[[4,"Quarters"],[2,"Halves"]],onChange:e=>l({periods:e})}),(0,s.jsx)(M,{label:2===o.periods?"Minutes per half":"Minutes per quarter",value:o.periodMin,min:1,max:30,unit:"min",onChange:e=>l({periodMin:e})}),(0,s.jsx)(M,{label:"Overtime",value:o.otMin,min:1,max:10,unit:"min",onChange:e=>l({otMin:e})}),(0,s.jsx)(E,{label:"Shot clock",value:o.shot,options:[[0,"Off"],[24,"24"],[30,"30"],[35,"35"]],onChange:e=>l({shot:e,shotReset:24===e?14:30===e?20:0})}),(0,s.jsx)(M,{label:"Bonus starts on team foul",value:o.bonusAt,min:0,max:15,off:"Off",onChange:e=>l({bonusAt:e})}),(0,s.jsx)(M,{label:"Double bonus on team foul",value:o.doubleAt,min:0,max:20,off:"Off",onChange:e=>l({doubleAt:e})}),4===o.periods&&(0,s.jsx)(E,{label:"Team fouls reset",value:o.foulWindow,options:[["period","Each quarter"],["half","Each half"]],onChange:e=>l({foulWindow:e})}),(0,s.jsx)(M,{label:"Timeouts per team",value:o.timeouts,min:0,max:9,onChange:e=>l({timeouts:e})}),(0,s.jsx)(E,{label:"Timeout length",value:o.timeoutSec||60,options:[[30,"30s"],[45,"45s"],[60,"60s"],[75,"75s"]],onChange:e=>a({type:"rules",rules:{timeoutSec:e}})}),(0,s.jsx)(M,{label:"Fouls to foul out",value:o.foulOut,min:3,max:8,onChange:e=>l({foulOut:e})}),(0,s.jsx)(E,{label:"Horn and buzzer",value:o.sound,options:[[!0,"On"],[!1,"Off"]],onChange:e=>a({type:"rules",rules:{sound:e}})})]})]}),(0,s.jsxs)("footer",{children:[(0,s.jsxs)("span",{className:p().count,children:["Need something else?"," ",(0,s.jsx)("a",{href:"mailto:[email protected]?subject=Basketball%20scoreboard%20request",children:"Send request"})]}),(0,s.jsx)("button",{type:"button",className:p().primary,onClick:n,children:"Done"})]})]})}function L(e){let{state:t,ms:a,dispatch:n,onClose:o}=e,l=Math.ceil(a/1e3),[r,c]=(0,i.useState)(String(Math.floor(l/60))),[d,h]=(0,i.useState)(String(l%60).padStart(2,"0")),u=e=>{e.preventDefault(),n({type:"clock/set",ms:(60*(parseInt(r,10)||0)+Math.min(59,parseInt(d,10)||0))*1e3}),o()},m=(e,t)=>a=>e(a.target.value.replace(/\D/g,"").slice(0,t));return(0,s.jsx)(F,{title:"Set the game clock",onClose:o,children:(0,s.jsxs)("form",{onSubmit:u,children:[(0,s.jsxs)("div",{className:"".concat(p().dialogBody," ").concat(p().timeBody),children:[(0,s.jsxs)("label",{children:[(0,s.jsx)("input",{inputMode:"numeric",value:r,onChange:m(c,2),onFocus:e=>e.target.select(),autoFocus:!0,"aria-label":"Minutes"}),(0,s.jsx)("span",{children:"min"})]}),(0,s.jsx)("b",{children:":"}),(0,s.jsxs)("label",{children:[(0,s.jsx)("input",{inputMode:"numeric",value:d,onChange:m(h,2),onFocus:e=>e.target.select(),"aria-label":"Seconds"}),(0,s.jsx)("span",{children:"sec"})]})]}),(0,s.jsxs)("footer",{children:[(0,s.jsx)("button",{type:"button",onClick:()=>{n({type:"clock/set",ms:(t.period>t.rules.periods?t.rules.otMin:t.rules.periodMin)*6e4}),o()},children:"Reset to full period"}),(0,s.jsx)("button",{type:"submit",className:p().primary,children:"Set time"})]})]})})}let G=0,P=()=>({key:"r".concat(G+=1),id:null,num:"",name:""});function B(e){let{state:t,team:a,dispatch:n,onClose:o}=e,l=t.teams[a],[r,c]=(0,i.useState)(()=>[...l.players.map(e=>({key:e.id,...e})),...Array.from({length:l.players.length?1:5},P)]),[d,h]=(0,i.useState)(!1),[u,m]=(0,i.useState)(""),[x,g]=(0,i.useState)(null),y=(e,t)=>c(a=>a.map(a=>a.key===e?{...a,...t}:a)),f=()=>{let e=P();c(t=>[...t,e]),g(e.key)},v=new Set,k=r.filter(e=>e.num&&!v.has(e.num)&&v.add(e.num)).slice(0,20).map(e=>({id:e.id||"p".concat(Date.now().toString(36)).concat(e.key),num:e.num,name:e.name.trim()})),_=r.find((e,t)=>e.num&&r.findIndex(t=>t.num===e.num)!==t),w=()=>{let e=(0,j.a7)(u).map(e=>({...P(),num:e.num,name:e.name}));c(t=>[...t.filter(e=>e.num||e.name),...e]),m(""),h(!1)},N=()=>{n({type:"team",team:a,patch:{players:k}}),o()};return(0,s.jsxs)(F,{title:"".concat(l.name||"Team"," players"),onClose:o,children:[(0,s.jsxs)("div",{className:p().dialogBody,style:{"--team":l.color},children:[(0,s.jsx)("p",{className:p().note,children:"Add jersey numbers. Names are optional. When this team scores or fouls, you pick the player and the scoreboard keeps their points and fouls."}),d?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("textarea",{className:p().roster,rows:8,value:u,onChange:e=>m(e.target.value),placeholder:"4 Maya\n10 Jordan\n12\n23 Sam",autoFocus:!0,spellCheck:!1,"aria-label":"Roster, one player per line"}),(0,s.jsxs)("div",{className:p().rosterTools,children:[(0,s.jsx)("button",{type:"button",onClick:()=>h(!1),children:"Cancel"}),(0,s.jsxs)("button",{type:"button",className:p().primary,onClick:w,disabled:!(0,j.a7)(u).length,children:["Add ",(0,j.a7)(u).length||""," players"]})]})]}):(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("ul",{className:p().rosterRows,children:r.map((e,t)=>(0,s.jsxs)("li",{children:[(0,s.jsx)("input",{className:p().jersey,inputMode:"numeric",placeholder:"#",value:e.num,maxLength:3,"aria-label":"Player ".concat(t+1," number"),autoFocus:x?x===e.ke
1y:0===t&&!l.players.length,onChange:t=>y(e.key,{num:t.target.value.replace(/\D/g,"").slice(0,3)})}),(0,s.jsx)("input",{className:p().playerName,placeholder:"Name (optional)",value:e.name,maxLength:30,"aria-label":"Player ".concat(t+1," name"),onChange:t=>y(e.key,{name:t.target.value}),onKeyDown:e=>"Enter"===e.key&&t===r.length-1&&f()}),(0,s.jsx)("button",{type:"button",onClick:()=>c(t=>t.filter(t=>t.key!==e.key)),"aria-label":"Remove player ".concat(e.num||t+1),children:(0,s.jsx)(b.trash,{})})]},e.key))}),_&&(0,s.jsxs)("p",{className:p().warn,children:["#",_.num," is on the list twice. Only the first one is kept."]}),(0,s.jsxs)("div",{className:p().rosterTools,children:[(0,s.jsxs)("button",{type:"button",onClick:f,disabled:r.length>=20,children:[(0,s.jsx)(b.plus,{}),"Add a player"]}),(0,s.jsx)("button",{type:"button",onClick:()=>h(!0),children:"Paste a list"})]})]})]}),(0,s.jsxs)("footer",{children:[(0,s.jsxs)("span",{className:p().count,children:[k.length," ",1===k.length?"player":"players"]}),(0,s.jsx)("button",{type:"button",className:p().primary,onClick:N,disabled:d,children:"Save players"})]})]})}let q={1:"free throw",2:"two",3:"three"};function H(e){let{state:t,pending:a,onPick:n,onSkip:o,onUndo:l}=e,[r,c]=(0,i.useState)(null),[h,u]=(0,i.useState)(""),m=t.teams[a.team],x=(0,j.WP)(t,a.team),g="foul"===a.kind;if((0,i.useEffect)(()=>c(document.fullscreenElement||document.body),[]),(0,i.useEffect)(()=>{let e=e=>{if(!e.metaKey&&!e.ctrlKey&&!e.altKey){if("Escape"===e.key)o();else if(/^\d$/.test(e.key))u(t=>(t+e.key).slice(-3));else if("Backspace"===e.key)u(e=>e.slice(0,-1));else{if("Enter"!==e.key)return;let t=x.find(e=>e.num===h);t&&n(t.id)}e.preventDefault()}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)}),!r)return null;let y=g?"Who fouled?":"Who made the ".concat(q[a.pts]||"basket","?");return(0,d.createPortal)((0,s.jsx)("div",{className:"".concat(p().theme," ").concat(p().scrim," ").concat(p().pickScrim),onMouseDown:e=>e.target===e.currentTarget&&o(),children:(0,s.jsxs)("div",{className:p().picker,role:"dialog","aria-modal":"true","aria-label":y,style:{"--team":m.color},children:[(0,s.jsxs)("header",{children:[(0,s.jsx)("span",{className:p().pickBadge,children:g?"Foul":"+".concat(a.pts)}),(0,s.jsxs)("div",{children:[(0,s.jsx)("h2",{children:y}),(0,s.jsx)("p",{children:m.name})]})]}),(0,s.jsx)("div",{className:p().pickGrid,children:x.map(e=>{let a=e.fouls>=t.rules.foulOut;return(0,s.jsxs)("button",{type:"button",className:"".concat(a?p().pickOut:""," ").concat(h&&e.num===h?p().pickTyped:""),onClick:()=>n(e.id),children:[(0,s.jsx)("b",{children:e.num}),(0,s.jsx)("span",{children:e.name||"\xa0"}),(0,s.jsx)("small",{children:g?"".concat(e.fouls," ").concat(1===e.fouls?"foul":"fouls").concat(a?" \xb7 out":""):"".concat(e.pts," pts")})]},e.id)})}),(0,s.jsxs)("footer",{children:[(0,s.jsxs)("button",{type:"button",onClick:l,children:[(0,s.jsx)(b.undo,{}),"Undo it"]}),(0,s.jsx)("button",{type:"button",onClick:o,children:"Skip, no player"})]})]})}),r)}function O(e){let{shortcuts:t,onClose:a}=e;return(0,s.jsx)(F,{title:"Keyboard shortcuts",onClose:a,children:(0,s.jsx)("div",{className:p().dialogBody,children:(0,s.jsx)("dl",{className:p().keys,children:t.map(e=>{let[t,a]=e;return(0,s.jsxs)("div",{children:[(0,s.jsx)("dt",{children:t.split(" ").map(e=>(0,s.jsx)("kbd",{children:e},e))}),(0,s.jsx)("dd",{children:a})]},t)})})})})}function I(e){let{state:t,onClose:a}=e,[n,o]=(0,i.useState)(!1),[l,r]=(0,i.useState)(!1),[c,d]=t.teams,h=async()=>{o(!0);try{await k(t)}catch(e){C(t)}o(!1)},u=async()=>{try{await navigator.clipboard.writeText(w(t)),r(!0),setTimeout(()=>r(!1),2e3)}catch(e){window.prompt("Copy the result:",w(t))}},m=[{key:"pdf",icon:(0,s.jsx)(b.file,{}),title:n?"Making the PDF":"Download PDF",text:"Score, box score and play by play, ready to send or file.",onClick:h,tone:p().tonePdf},{key:"csv",icon:(0,s.jsx)(b.sheet,{}),title:"Download CSV",text:"Open it in Excel or Google Sheets.",onClick:()=>(function(e){let t=URL.createObjectURL(new Blob(["\uFEFF",(0,j.pL)(e)],{type:"text/csv;charset=utf-8"})),a=document.createElement("a");a.href=t,a.download=v(e,"csv"),document.body.appendChild(a),a.click(),a.remove(),setTimeout(()=>URL.revokeObjectURL(t),1e3)})(t),tone:p().toneCsv},{key:"print",icon:(0,s.jsx)(b.print,{}),title:"Print",text:"A paper copy for the scorer's table or the league.",onClick:()=>C(t),tone:p().tonePrint},{key:"copy",icon:l?(0,s.jsx)(b.check,{}):(0,s.jsx)(b.copy,{}),title:l?"Copied":"Copy the result",text:"The score and top scorers as text, for a team chat or email.",onClick:u,tone:p().toneCopy}];return(0,s.jsx)(F,{title:"Export the game",onClose:a,children:(0,s.jsxs)("div",{className:p().dialogBody,
1children:[(0,s.jsx)("div",{className:p().exportScore,children:[c,d].map((e,a)=>(0,s.jsxs)("div",{style:{"--team":e.color},children:[(0,s.jsx)("i",{}),(0,s.jsx)("span",{children:e.name||(0===a?"Home":"Guest")}),(0,s.jsx)("b",{children:(0,j.Gs)(t,a)})]},a))}),(0,s.jsx)("div",{className:p().exportGrid,children:m.map(e=>(0,s.jsxs)("button",{type:"button",className:e.tone,onClick:e.onClick,disabled:"pdf"===e.key&&n,children:[(0,s.jsx)("span",{children:e.icon}),(0,s.jsx)("b",{children:e.title}),(0,s.jsx)("small",{children:e.text})]},e.key))})]})})}function R(e){let{live:t,onClose:n}=e,[o,l]=(0,i.useState)(null),[r,c]=(0,i.useState)(!1),d=t.id?(0,T.LL)(t.id):null,{id:h,start:u}=t;(0,i.useEffect)(()=>{h||u()},[h,u]),(0,i.useEffect)(()=>{if(!d)return;let e=!1;return a.e(2592).then(a.t.bind(a,92592,19)).then(e=>e.toDataURL(d,{margin:1,width:480,color:{dark:"#0d1f3a",light:"#ffffff"}})).then(t=>!e&&l(t)).catch(()=>{}),()=>{e=!0}},[d]);let m=async()=>{try{await navigator.clipboard.writeText(d),c(!0),setTimeout(()=>c(!1),2e3)}catch(e){window.prompt("Copy the link:",d)}},x=()=>navigator.share({title:"Live basketball score",url:d}).catch(()=>{}),j="undefined"!=typeof navigator&&"function"==typeof navigator.share;return(0,s.jsx)(F,{title:"Share the live score",onClose:n,children:(0,s.jsx)("div",{className:p().dialogBody,children:d?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("p",{className:p().note,children:"Parents and fans open this link to follow the score, clock and fouls on their phones. It updates as you score."}),(0,s.jsxs)("div",{className:p().shareCard,children:[(0,s.jsx)("div",{className:p().shareQr,children:o&&(0,s.jsx)("img",{src:o,alt:"QR code for the live score page",width:"160",height:"160"})}),(0,s.jsxs)("div",{className:p().shareSide,children:[(0,s.jsxs)("span",{className:"".concat(p().liveTag," ").concat("retrying"===t.status?p().liveOff:""),children:[(0,s.jsx)("i",{}),"retrying"===t.status?"Reconnecting":"Live"]}),(0,s.jsx)("a",{href:d,target:"_blank",rel:"noreferrer",children:d.replace(/^https?:\/\//,"")}),(0,s.jsxs)("div",{children:[(0,s.jsxs)("button",{type:"button",className:p().primary,onClick:m,children:[r?(0,s.jsx)(b.check,{}):(0,s.jsx)(b.copy,{}),r?"Copied":"Copy link"]}),j&&(0,s.jsxs)("button",{type:"button",onClick:x,children:[(0,s.jsx)(b.share,{}),"Send"]})]})]})]}),(0,s.jsx)("p",{className:p().shareFine,children:"Anyone with the link can watch. Player names stay on this device, so the page shows jersey numbers only. A new game gets a new link."})]}):(0,s.jsx)("div",{className:p().shareWait,children:"failed"===t.status?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("p",{children:"Couldn't make the link. Check your internet connection and try again."}),(0,s.jsx)("button",{type:"button",className:p().primary,onClick:u,children:"Try again"})]}):(0,s.jsx)("p",{children:"Making your link…"})})})})}var D=a(90061),z=a(67554);let W=[["Space","Start or stop the clock"],["1 2 3","Home +1, +2, +3"],["8 9 0","Guest +1, +2, +3"],["F","Home foul"],["J","Guest foul"],["S","Reset the shot clock"],["D","Shot clock to the short reset"],["P","Flip the possession arrow"],["H","Sound the horn"],["Z","Undo the last entry"]];function V(e){let{state:t,team:a,dispatch:n,onAct:o,onRoster:l}=e,r=t.teams[a],[c,d]=(0,i.useState)(!1),h=r.players.length?(0,j.WP)(t,a):[],u=h.filter(e=>e.fouls>=t.rules.foulOut),m=(0,j.Cp)(t,a);return(0,s.jsxs)("section",{className:p().team,style:{"--team":r.color},"aria-label":r.name,children:[(0,s.jsxs)("div",{className:p().teamHead,children:[(0,s.jsx)("button",{type:"button",className:p().swatch,onClick:()=>d(e=>!e),"aria-label":"".concat(r.name," color"),"aria-expanded":c}),(0,s.jsxs)("label",{className:p().nameField,children:[(0,s.jsx)("input",{className:p().teamName,value:r.name,maxLength:18,placeholder:0===a?"Home team name":"Guest team name","aria-label":0===a?"Home team name":"Guest team name",onChange:e=>n({type:"team",team:a,patch:{name:e.target.value}}),onFocus:e=>e.target.select()}),(0,s.jsx)(b.pencil,{})]})]}),c&&(0,s.jsx)("div",{className:p().palette,children:j.ct.map(e=>(0,s.jsx)("button",{type:"button",style:{background:e},"aria-label":"Use color ".concat(e),"aria-pressed":e===r.color,onClick:()=>{n({type:"team",team:a,patch:{color:e}}),d(!1)}},e))}),(0,s.jsx)("div",{className:p().points,children:[1,2,3].map(e=>(0,s.jsxs)("button",{type:"button",onClick:()=>o({type:"score",team:a,pts:e}),children:["+",e]},e))}),(0,s.jsxs)("div",{className:p().teamRow,children:[(0,s.jsxs)("button",{type:"button",className:p().foulBtn,onClick:()=>o({type:"foul",team:a}),children:["Foul",(0,s.jsx)("b",{children:(0,j.WM)(t,a)})]}),(0,s.jsxs)("button",{type:"button",className:p().toBtn,disabled:0===m,onClick:()=>o({type:"timeout",team:a}),children:["Timeout",(0,s.jsxs)("b",{children:[m," left"]})]}),(0,s.jsx)("button",{type:"button",className:p().minus,disabled:0===(0,j.Gs)(t,a),onClick:()=>o({type:"adjust",team:a,pts:-1}),"aria-label":"Take 1 point off ".concat(r.name),children:"−1"})]}),h.length>0?(0,s.jsxs)("button",{type:"button",className:p().rosterBar,onClick:l,"aria-label":"Edit the ".concat(r.name," roster"),children:[(0,s.jsx)("span",{className:p().rosterNums,children:h.map(e=>(0,s.jsxs)("i",{className:e.fouls>=t.rules.foulOut?p().numOut:void 0,title:"#".concat(e.num).concat(e.name?" ".concat(e.name):"",": ").concat(e.pts," points, ").concat(e.fouls," fouls"),children:[e.num,e.fouls>0&&(0,s.jsx)("sup",{children:e.fouls})]},e.id))}),(0,s.jsx)("em",{children:"Edit"})]}):(0,s.jsxs)("button",{type:"button",className:p().addPlayers,onClick:l,children:[(0,s.jsx)(b.jersey,{}),(0,s.jsxs)("span",{children:[(0,s.jsx)("b",{children:"Add players"}),(0,s.jsx)("small",{children:"Track each player's points and fouls"})]}),(0,s.jsx)(b.plus,{})]}),u.length>0&&(0,s.jsxs)("p",{className:p().fouledOut,children:["Fouled out: ",u.map(e=>
1"#".concat(e.num)).join(", ")]})]})}function Y(){let{state:e,dispatch:t,now:a,ready:n}=(0,z.Fi)(),l=(0,z.$p)(e,t,n),[r,c]=(0,i.useState)(null),[h,x]=(0,i.useState)(null),[g,y]=(0,i.useState)(!1),[f,v]=(0,i.useState)(!1),[k,_]=(0,i.useState)("log"),w=(0,i.useRef)(null),N=(0,i.useRef)(!1),C=null!=e.clock.startedAt,T=(0,j.Vq)(e.clock,a),F=(0,j.zF)(e),M=e.final||!C&&T<=0,E=(0,i.useCallback)(a=>{if((0,D.Il)(),"skip"===a.type)return x(null);if("assign"===a.type)return t(a),x(null);if(t(a),"score"===a.type||"foul"===a.type){let t=e.teams[a.team].players.length>0;x(t?{team:a.team,id:e.seq+1,kind:a.type,pts:a.pts}:null)}else("undo"===a.type||"reset"===a.type)&&x(null);"clock/start"!==a.type||N.current||(N.current=!0,(0,u.L)("Basketball Scoreboard Start",{level:e.rules.preset}))},[t,e.seq,e.teams,e.rules.preset]),G=(0,i.useCallback)(()=>E({type:C?"clock/stop":"clock/start"}),[E,C]),P=()=>{"final"===F.kind?(E({type:"final",final:!0}),(0,u.L)("Basketball Scoreboard Final",{level:e.rules.preset})):E({type:"period/set",period:e.period+1})},q=()=>{window.open("/basketball-scoreboard/display","bravara-scoreboard-display","popup,width=1280,height=720"),(0,u.L)("Basketball Scoreboard Display")},Y=()=>y(!0);(0,i.useEffect)(()=>{if(g)try{var e,t,a,s;null===(e=w.current)||void 0===e||null===(t=e.requestFullscreen)||void 0===t||null===(a=t.call(e))||void 0===a||null===(s=a.catch)||void 0===s||s.call(a,()=>{})}catch(e){}},[g]);let U=(0,i.useCallback)(()=>{y(!1);try{document.fullscreenElement&&document.exitFullscreen()}catch(e){}},[]);(0,i.useEffect)(()=>{let e=()=>!document.fullscreenElement&&y(!1);return document.addEventListener("fullscreenchange",e),()=>document.removeEventListener("fullscreenchange",e)},[]),(0,i.useEffect)(()=>{let t=t=>{if(r||t.metaKey||t.ctrlKey||t.altKey||h&&" "!==t.key||/^(INPUT|TEXTAREA|SELECT)$/.test(t.target.tagName)||t.target.isContentEditable)return;let a=t.key.toLowerCase(),s={" ":()=>G(),1:()=>E({type:"score",team:0,pts:1}),2:()=>E({type:"score",team:0,pts:2}),3:()=>E({type:"score",team:0,pts:3}),8:()=>E({type:"score",team:1,pts:1}
1),9:()=>E({type:"score",team:1,pts:2}),0:()=>E({type:"score",team:1,pts:3}),f:()=>E({type:"foul",team:0}),j:()=>E({type:"foul",team:1}),s:()=>E({type:"shot/reset",sec:e.rules.shot}),d:()=>E({type:"shot/reset",sec:e.rules.shotReset||e.rules.shot}),p:()=>E({type:"possession/flip"}),z:()=>E({type:"undo"}),h:()=>{(0,D.Il)(),(0,D.Rl)(1.8)},escape:()=>g&&U()};s[a]&&(t.preventDefault(),"BUTTON"===t.target.tagName&&t.target.blur(),s[a]())};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[E,G,r,h,g,U,e.rules.shot,e.rules.shotReset]);let K=[...e.log].reverse(),Z=f?K:K.slice(0,5);(0,i.useEffect)(()=>{e.final&&_("box")},[e.final]);let Q=()=>{(!e.log.length||window.confirm("Start a new game? The score, fouls and play log will be cleared. Team names and rosters stay."))&&(E({type:"reset"}),_("log"))},J=(0,s.jsxs)("div",{className:"".concat(p().theme," ").concat(p().tool," ").concat(g?p().full:""),ref:w,"data-ready":n,children:[(0,s.jsxs)("div",{className:p().faceWrap,children:[!g&&(0,s.jsx)("button",{type:"button",className:p().cog,onClick:()=>c("setup"),"aria-label":"Game setup",title:"Game setup",children:(0,s.jsx)(b.cog,{})}),(0,s.jsx)(m.Z,{state:e,now:a,onClock:()=>c("time")})]}),!g&&(0,s.jsxs)("div",{className:p().gameStrip,children:[(0,s.jsxs)("div",{className:p().periodPick,children:[(0,s.jsx)("span",{children:"Period"}),(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"period/set",period:e.period-1}),disabled:1===e.period,"aria-label":"Previous period",children:"−"}),(0,s.jsx)("b",{children:(0,j.Z8)(e.rules,e.period,!0)}),(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"period/set",period:e.period+1}),"aria-label":"Next period",children:"+"})]}),(0,s.jsxs)("div",{className:p().gameActions,children:[e.final?(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"final",final:!1}),children:"Back to the game"}):(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"final",final:!0}),disabled:!e.log.length,children:"End game"}),(0,s.jsx)("button",{type:"button",onClick:Q,children:"New game"})]})]}),(0,s.jsxs)("div",{className:p().controls,children:[M?(0,s.jsxs)("div",{className:p().periodEnd,children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("small",{children:e.final?"Final":"End of ".concat((0,j.Z8)(e.rules,e.period,!0).replace(/^OT$/,"overtime"))}),(0,s.jsxs)("b",{children:[e.teams[0].name||"Home"," ",(0,j.Gs)(e,0)," ",(0,s.jsx)("i",{children:"\xb7"})," ",e.teams[1].name||"Guest"," ",(0,j.Gs)(e,1)]})]}),e.final?(0,s.jsxs)("button",{type:"button",className:p().periodNext,onClick:()=>c("export"),children:[(0,s.jsx)(b.download,{}),"Export the game"]}):(0,s.jsxs)("button",{type:"button",className:p().periodNext,onClick:P,children:[F.label,(0,s.jsx)(b.arrow,{})]}),(0,s.jsx)("button",{type:"button",className:p().periodFix,onClick:()=>e.final?E({type:"final",final:!1}):c("time"),children:e.final?"Back to the game":"Put time back on the clock"})]}):(0,s.jsxs)("div",{className:p().clockBar,children:[(0,s.jsx)("button",{type:"button",className:p().nudge,onClick:()=>E({type:"clock/adjust",delta:-1e3}),"aria-label":"Take 1 second off the clock",children:"−1s"}),(0,s.jsxs)("button",{type:"button",className:"".concat(p().go," ").concat(C?p().goStop:""),onClick:G,children:[C?(0,s.jsx)(b.pause,{}):(0,s.jsx)(b.play,{}),C?"Stop clock":"Start clock"]}),(0,s.jsx)("button",{type:"button",className:p().nudge,onClick:()=>E({type:"clock/adjust",delta:1e3}),"aria-label":"Add 1 second to the clock",children:"+1s"})]}),e.rules.shot>0&&!M&&(0,s.jsxs)("div",{className:p().subBar,children:[(0,s.jsxs)("button",{type:"button",onClick:()=>E({type:"shot/reset",sec:e.rules.shot}),children:["Shot clock ",e.rules.shot]}),e.rules.shotReset>0&&(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"shot/reset",sec:e.rules.shotReset}),children:e.rules.shotReset})]}),(0,s.jsxs)("div",{className:p().teams,children:[(0,s.jsx)(V,{state:e,team:0,dispatch:t,onAct:E,onRoster:()=>c("roster0")}),(0,s.jsx)(V,{state:e,team:1,dispatch:t,onAct:E,onRoster:()=>c("roster1")})]}),(0,s.jsxs)("div",{className:p().bar,children:[(0,s.jsxs)("div",{className:p().quick,children:[(0,s.jsxs)("button",{type:"button",onClick:()=>E({type:"undo"}),disabled:!e.log.length,children:[(0,s.jsx)(b.undo,{}),"Undo"]}),(0,s.jsxs)("button",{type:"button",onClick:()=>E({type:"possession/flip"}),children:[(0,s.jsx)(b.swap,{}),"Possession"]}),(0,s.jsxs)("button",{type:"button",onClick:()=>{(0,D.Il)(),(0,D.Rl)(1.8)},children:[(0,s.jsx)(b.horn,{}),"Horn"]}),g&&(0,s.jsxs)("button",{type:"button",onClick:U,children:[(0,s.jsx)(b.close,{}),"Exit full screen"]})]}),!g&&(0,s.jsxs)("div",{className:p().dock,role:"toolbar","aria-label":"Game tools",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>c("setup"),children:[(0,s.jsx)(b.gear,{}),(0,s.jsx)("span",{children:"Setup"})]}),(0,s.jsxs)("button",{type:"button",onClick:()=>c("export"),children:[(0,s.jsx)(b.download,{}),(0,s.jsx)("span",{children:"Export"})]}),(0,s.jsxs)("button",{type:"button",className:l.id?p().liveOn:void 0,onClick:()=>{c("share"),l.id||(0,u.L)("Basketball Scoreboard Share")},children:[(0,s.jsx)(b.live,{}),(0,s.jsx)("span",{children:l.id?"Live link":"Share live"})]}),(0,s.jsxs)("button",{type:"button",onClick:Y,title:"Fill this screen with the board and the buttons",children:[(0,s.jsx)(b.expand,{}),(0,s.jsx)("span",{children:"Full screen"})]}),(0,s.jsxs)("button",{type:"button",onClick:q,title:"Open the board alone in a second window, for a TV or projector",children:[(0,s.jsx)(b.tv,{}),(0,s.jsx)("span",{children:"TV display"})]})]})]})]}),!g&&(0,s.jsxs)("div",{className:p().below,children:[(0,s.jsxs)("div",{className:p().panel,children:[(0,s.jsxs)("div",{className:p().tabs,role:"tablist","aria-label":"Game record",children:[(0,s.jsxs)("button",{type:"button",role:"tab","aria-selected":"log"===k,onClick:()=>_("log"),children:["Play log",K.length>0&&(0,s.jsx)("i",{children:K.length})]}),(0,s.jsx)("button",{type:"button",role:"tab","aria-selected":"box"===k,onClick:()=>_("box"),children:"Box score"}),"log"===k&&K.length>5&&(0,s.jsx)("button",{type:"button",className:p().tabAside,onClick:()=>v(e=>
1!e),children:f?"Show less":"Show all"})]}),"box"===k?(0,s.jsx)(S,{state:e,onResume:()=>E({type:"final",final:!1}),onExport:()=>c("export")}):0===K.length?(0,s.jsx)("p",{className:p().empty,children:"Points, fouls and timeouts show up here. Tap the \xd7 next to one to take it back."}):(0,s.jsx)("ol",{className:p().log,children:Z.map(t=>(0,s.jsxs)("li",{children:[(0,s.jsx)("i",{style:{background:e.teams[t.team].color}}),(0,s.jsx)("span",{children:(0,j.yY)(e,t)}),(0,s.jsxs)("time",{children:[(0,j.Z8)(e.rules,t.period)," ",(0,j.D4)(t.clockMs,!1)]}),(0,s.jsx)("button",{type:"button",onClick:()=>E({type:"undo",id:t.id}),"aria-label":"Remove: ".concat((0,j.yY)(e,t)),children:"\xd7"})]},t.id))})]}),(0,s.jsx)("p",{className:p().saved,children:"Your browser saves where you left off, one game at a time. Starting a new game replaces it, so export first if you want to keep it."}),(0,s.jsxs)("p",{className:p().saved,children:[(0,s.jsx)("button",{type:"button",onClick:()=>c("shortcuts"),children:"Keyboard shortcuts"}),(0,s.jsx)(o(),{href:"/basketball-coaching-tools",children:"More free basketball tools"})]})]}),h&&!r&&(0,s.jsx)(H,{state:e,pending:h,onPick:e=>E({type:"assign",id:h.id,player:e}),onSkip:()=>E({type:"skip"}),onUndo:()=>E({type:"undo",id:h.id})}),"share"===r&&(0,s.jsx)(R,{live:l,onClose:()=>c(null)}),"export"===r&&(0,s.jsx)(I,{state:e,onClose:()=>c(null)}),"setup"===r&&(0,s.jsx)(A,{state:e,dispatch:t,onClose:()=>c(null)}),"time"===r&&(0,s.jsx)(L,{state:e,ms:T,dispatch:t,onClose:()=>c(null)}),"shortcuts"===r&&(0,s.jsx)(O,{shortcuts:W,onClose:()=>c(null)}),("roster0"===r||"roster1"===r)&&(0,s.jsx)(B,{state:e,team:"roster0"===r?0:1,dispatch:t,onClose:()=>c(null)})]});return g?(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("div",{className:p().placeholder}),(0,d.createPortal)(J,document.body)]}):J}var U=a(97703),K=a.n(U),Z=a(44725),Q=a.n(Z),J=a(61153),X=a(27990);let $=[["Pick your level","Open Game setup and choose youth, high school, college, NBA or FIBA. That sets the period length, shot clock and foul rules. Change any of them for your league."],["Name the teams","Type over Home and Guest and tap the dot to pick each team's color."],["Run the game","Start and stop the clock, tap +1, +2 or +3 for baskets, and tap Foul or Timeout. The bonus light and the horn take care of themselves."],["Put it on the TV and share it","Press TV display and drag that window to the gym TV or projector. Press Share live to give parents a link that follows the game on their phones."]],ee=[["Youth leagues","4 quarters, often 6 or 8 minutes","2 to 3 minutes","Usually none"],["High school (NFHS)","4 quarters of 8 minutes","4 minutes","35 seconds in states that use one"],["College men (NCAA)","2 halves of 20 minutes","5 minutes","30 seconds"],["College women (NCAA)","4 quarters of 10 minutes","5 minutes","30 seconds"],["NBA","4 quarters of 12 minutes","5 minutes","24 seconds"],["FIBA","4 quarters of 10 minutes","5 minutes","24 seconds"]],et=[["High school (NFHS)","Each quarter","Two free throws starting with the 5th team foul of the quarter"],["College men (NCAA)","Each half","One-and-one on the 7th team foul of the half, two free throws from the 10th"],["College women (NCAA)","Each quarter","Two free throws starting with the 5th team foul of the quarter"],["NBA","Each quarter","Two free throws starting with the 5th team foul of the quarter, or the 2nd in the last two minutes"],["FIBA","Each quarter","Two free throws starting with the 5th team foul of the quarter"]],ea=[{q:"Is this basketball scoreboard free?",a:"Yes. There is no signup, no ads and no limit on games. Open the page and start the clock."},{q:"How do I show the basketball scoreboard on a TV?",a:"Connect a laptop to the TV with an HDMI cable or screen mirroring. Press TV display, drag the new window onto the TV and make it full screen. You keep scoring in the first window and the TV follows. On a phone or tablet, mirror your screen to the TV and press Full screen."},{q:"Can parents follow the score on their phones?",a:"Yes. Press Share live and the scoreboard makes a link and a QR code. Anyone who opens it sees the score, clock, fouls and every basket as you enter them. The page shows jersey numbers, not player names."},{q:"Is there a basketball scoreboard app?",a:"You don't need to install one. This scoreboard runs in the browser on an iPhone, iPad, Android ph
1one or any laptop, and it saves your game on the device. Add the page to your home screen and it opens like an app."},{q:"Does the scoreboard have a buzzer?",a:"Yes. A horn sounds when the game clock reaches zero, and a different buzzer sounds when the shot clock runs out. There is also a Horn button for substitutions. You can turn the sound off in Game setup."},{q:"Does the scoreboard have a shot clock?",a:"Yes. Turn it on in Game setup and pick 24, 30 or 35 seconds. It runs with the game clock, starts over after a made basket, and has a short reset for offensive rebounds. A buzzer sounds when it runs out."},{q:"How does the bonus light work?",a:"The scoreboard counts team fouls for the quarter or half. When a team reaches the limit, the bonus light turns on for the other team, which now shoots free throws on each foul. You can set the foul numbers for your league in Game setup."},{q:"Can I track player points and fouls?",a:"Yes. Add a roster with jersey numbers. After each basket or foul, tap the player's number. The scoreboard keeps each player's points and fouls, warns you when someone fouls out, and gives you a box score at the end."},{q:"What happens if I close the page during a game?",a:"The game is saved on your device after every tap. Open the page again and the score, fouls, clock and play log are where you left them."},{q:"Does it work without internet?",a:"Once the page has loaded, the clock and scoring keep working without a connection. You need the internet to open the page again."},{q:"Can I use it for 3-on-3 or a running clock?",a:"Yes. Set the game to two halves or four quarters of any length and leave the clock running through dead balls. For 3-on-3, use +1 and +2 and set one long period."}];function es(){let e=(0,X.Z)();(0,r.Z)();let t=(0,J.OR)(J.zi.basketballScoreboard);return(0,s.jsx)(l.Z,{headerStyle:9,footerStyle:9,headTitle:t.title,metaDescription:t.description,canonicalUrl:t.canonicalUrl,ogImage:t.ogImage,ogImageAlt:t.ogImageAlt,promoCode:e,jsonLd:[(0,J.ge)({name:"Basketball Scoreboard",description:J.zi.basketballScoreboard.description,url:t.canonicalUrl,type:"WebApplication",operatingSystem:"Any device with a modern web browser",isFree:!0}),(0,c.u)(ea),(0,J.yf)([{name:"Home",url:"/"},{name:"Basketball Coaching Tools",url:"/basketball-coaching-tools"},{name:"Basketball Scoreboard",url:J.zi.basketballScoreboard.path}])],children:(0,s.jsxs)("div",{className:"bv-page ".concat(K().page),children:[(0,s.jsx)("div",{className:"bv-grain","aria-hidden":"true"}),(0,s.jsxs)("section",{className:"".concat(K().subHero," ").concat(Q().hero),children:[(0,s.jsx)("div",{className:K().arenaLights,"aria-hidden":"true"}),(0,s.jsxs)("div",{className:"bv-container ".concat(Q().heroInner),children:[(0,s.jsxs)("ol",{className:K().crumbs,children:[(0,s.jsx)("li",{children:(0,s.jsx)(o(),{href:"/",children:"Home"})}),(0,s.jsx)("li",{children:(0,s.jsx)(o(),{href:"/basketball-coaching-tools",children:"Basketball"})}),(0,s.jsx)("li",{"aria-current":"page",children:"Scoreboard"})]}),(0,s.jsxs)("h1",{className:"bv-display",children:[(0,s.jsx)("span",{className:"bv-slot",children:(0,s.jsx)("span",{style:{"--d":".08s"},children:"Basketball scoreboard"})})," ",(0,s.jsx)("span",{className:"bv-slot",children:(0,s.jsx)("span",{style:{"--d":".16s"},children:(0,s.jsx)("em",{children:"free and online"})})})]}),(0,s.jsx)("p",{className:"".concat(K().subLede," bv-reveal"),style:{"--d":".24s"},children:"Keep score for any basketball game from a phone, tablet or laptop. It has a game clock, shot clock, team fouls, the bonus, timeouts and the possession arrow, a second window for the gym TV and a live link for parents."})]})]}),(0,s.jsxs)("section",{className:"bv-container ".concat(K().overlap),children:[(0,s.jsx)("h2",{className:K().srOnly,children:"Online basketball scoreboard"}),(0,s.jsx)(Y,{}),(0,s.jsx)("ul",{className:Q().promise,children:["Free","No signup","No ads","Saves as you go"].map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsx)("section",{className:K().section,children:(0,s.jsxs)("div",{className:"bv-container",children:[(0,s.jsxs)("div",{className:"".concat(K().sectionHead," bv-reveal"),children:[(0,s.jsx)("span",{className:"bv-eyebrow",children:"Getting started"}),(0,s.jsx)("h2",{className:"bv-display",children:"How to use the basketball scoreboard"})]}),(0,s.jsx)("ol",{className:Q().steps,children:$.map((e,t)=>{let[a,n]=e;return(0,s.jsxs)("li",{className:"bv-reveal",style:{"--d":"".concat(.06*t,"s")},children:[(0,s.jsx)("span",{children:t+1}),(0,s.jsx)("h3",{children:a}),(0,s.jsx)("p",{children:n})]},a)})})]})}),(0,s.jsxs)("section",{className:"".concat(K().section," ").concat(K().sectionWhite),children:[(0,s.jsxs)("div",{className:"bv-container ".concat(K().twoCol),children:[(0,s.jsxs)("div",{className:"".concat(K().sectionHead," bv-reveal"),children:[(0,s.jsx)("span",{className:"bv-eyebrow",children:"Clocks"}),(0,s.jsx)("h2",{className:"bv-display",children:"Basketball scoreboard 
1with shot clock and game clock"})]}),(0,s.jsxs)("div",{className:"".concat(K().prose," bv-reveal"),style:{"--d":".08s"},children:[(0,s.jsx)("p",{children:"The game clock counts down each quarter or half and shows tenths of a second in the last minute. Tap the clock to set any time, or use the −1s and +1s buttons to fix a late whistle. The horn sounds at zero, and the scoreboard offers the next period, overtime if the score is tied, or the end of the game."}),(0,s.jsx)("p",{children:"The shot clock is off for youth and most high school games. Turn it on in Game setup for 24, 30 or 35 seconds. It starts and stops with the game clock and starts over after a made basket. Use the short reset after an offensive rebound. When less time is left in the period than on the shot clock, the shot clock turns off, the same as a gym scoreboard."}),(0,s.jsx)("p",{children:"If you only need a basketball timer for practice or a pickup game, skip the score buttons and run the clock."}),(0,s.jsx)("h3",{children:"Timeouts and the possession arrow"}),(0,s.jsx)("p",{children:"Tap Timeout to stop the clock, take one off that team's count and start a countdown on the board. It runs 60 seconds unless you pick another length in Game setup. The possession arrow points to the team that gets the ball on the next held ball. Flip it with one tap after each one."})]})]}),(0,s.jsx)("div",{className:"bv-container",children:(0,s.jsx)("div",{className:"".concat(K().tableCard," bv-reveal"),children:(0,s.jsx)("div",{className:K().tableScroll,children:(0,s.jsxs)("table",{children:[(0,s.jsx)("caption",{className:K().srOnly,children:"Basketball game length, overtime and shot clock by level"}),(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:"Level"}),(0,s.jsx)("th",{scope:"col",children:"Game length"}),(0,s.jsx)("th",{scope:"col",children:"Overtime"}),(0,s.jsx)("th",{scope:"col",children:"Shot clock"})]})}),(0,s.jsx)("tbody",{children:ee.map(e=>(0,s.jsx)("tr",{children:e.map(e=>(0,s.jsx)("td",{children:e},e))},e[0]))})]})})})})]}),(0,s.jsxs)("section",{className:K().section,children:[(0,s.jsxs)("div",{className:"bv-container ".concat(K().twoCol),children:[(0,s.jsxs)("div",{className:"".concat(K().sectionHead," bv-reveal"),children:[(0,s.jsx)("span",{className:"bv-eyebrow",children:"Fouls"}),(0,s.jsx)("h2",{className:"bv-display",children:"Team fouls and the bonus on a basketball scoreboard"})]}),(0,s.jsxs)("div",{className:"".concat(K().prose," bv-reveal"),style:{"--d":".08s"},children:[(0,s.jsx)("p",{children:"Every tap on Foul stops the clock and adds one to that team's fouls for the quarter or half. When a team reaches the limit, the bonus light turns on for the other team. Team fouls go back to zero when the next quarter or half starts, and overtime carries on from the last period."}),(0,s.jsx)("p",{children:"Youth leagues set their own numbers. Many follow the high school rule. Others still use the older rule of a one-and-one on the 7th team foul of the half and two shots on the 10th. Game setup has both, and you can type in any number your league uses."}),(0,s.jsx)("h3",{children:"Keep the scorebook at the same time"}),(0,s.jsx)("p",{children:"Add each team's jersey numbers and the scoreboard becomes your scorebook, so one scorekeeper can run the board and keep the book. After a basket or a foul, tap the player's number. You get each player's points and fouls, a warning when someone fouls out, the score by period and a box score you can print after the game."})]})]}),(0,s.jsx)("div",{className:"bv-container",children:(0,s.jsx)("div",{className:"".concat(K().tableCard," bv-reveal"),children:(0,s.jsx)("div",{className:K().tableScroll,children:(0,s.jsxs)("table",{children:[(0,s.jsx)("caption",{className:K().srOnly,children:"When the bonus starts at each level of basketball"}),(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:"Level"}),(0,s.jsx)("th",{scope:"col",children:"Team fouls reset"}),(0,s.jsx)("th",{scope:"col",children:"When the bonus starts"})]})}),(0,s.jsx)("tbody",{children:et.map(e=>(0,s.jsx)("tr",{children:e.map(e=>(0,s.jsx)("td",{children:e},e))},e[0]))})]})})})})]}),(0,s.jsx)("section",{className:"".concat(K().section," ").concat(K().sectionWhite),children:(0,s.jsxs)("div",{className:"bv-container ".concat(K().twoCol),children:[(0,s.jsxs)("div",{className:"".concat(K().sectionHead," bv-reveal"),children:[(0,s.jsx)("span",{className:"bv-eyebrow",children:"On a laptop"}),(0,s.jsx)("h2",{className:"bv-display",children:"Scoreboard keyboard shortcuts"}),(0,s.jsx)("p",{children:"At the scorer's table with a laptop, the keyboard is faster than the mouse. Home is under your left hand and the guest team under your right."})]}),(0,s.jsx)("div",{className:"".concat(K().tableCard," ").concat(Q().keysCard," bv-reveal"),style:{"--d":".08s"},children:(0,s.jsxs)("table",{children:[(0,s.jsx)("caption",{className:K().srOnly,children:"Basketball scoreboard keyboard shortcuts"}),(0,s.jsx)("thead",{children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",children:"Key"}),(0,s.jsx)("th",{scope:"col",children:"What it does"})]})}),(0,s.jsx)("tbody",{children:W.map(e=>
1{let[t,a]=e;return(0,s.jsxs)("tr",{children:[(0,s.jsx)("td",{children:t}),(0,s.jsx)("td",{children:a})]},t)})})]})})]})}),(0,s.jsxs)("section",{className:"".concat(K().section," ").concat(K().sectionTight),children:[(0,s.jsxs)("div",{className:"bv-container ".concat(K().faqGrid),style:{paddingTop:64},children:[(0,s.jsxs)("div",{className:"".concat(K().sectionHead," bv-reveal"),children:[(0,s.jsx)("span",{className:"bv-eyebrow",children:"Questions"}),(0,s.jsx)("h2",{className:"bv-display",children:"Basketball scoreboard FAQ"})]}),(0,s.jsx)(c.Z,{items:ea})]}),(0,s.jsxs)("div",{className:"bv-container",style:{marginTop:80},children:[(0,s.jsxs)("div",{className:"".concat(K().ctaCard," bv-reveal"),children:[(0,s.jsxs)("div",{children:[(0,s.jsx)("span",{className:"bv-eyebrow bv-eyebrow--gold ".concat(K().eyebrowOrange),children:"Free basketball play maker"}),(0,s.jsx)("h2",{className:"bv-display",children:"Draw the plays you run"}),(0,s.jsx)("p",{children:"Move the players, draw cuts and passes, and send the play to your team as a link they can watch on any phone."})]}),(0,s.jsx)(o(),{href:"/basketball-playmaker",className:"bv-btn bv-btn--gold",children:(0,s.jsx)("span",{children:"Open the play maker"})})]}),(0,s.jsxs)("p",{className:Q().more,children:["More free tools: ",(0,s.jsx)(o(),{href:"/basketball-court-dimensions",children:"court dimensions"}),", ",(0,s.jsx)(o(),{href:"/basketball-positions",children:"positions"}),", ",(0,s.jsx)(o(),{href:"/basketball-drills",children:"drills"}),","," ",(0,s.jsx)(o(),{href:"/basketball-depth-chart",children:"depth chart"})," and a ",(0,s.jsx)(o(),{href:"/tournament-schedule-maker",children:"tournament schedule maker"}),"."]})]})]})]})})}},97703:function(e){e.exports={page:"pages_page__IjFhl",eyebrowOrange:"pages_eyebrowOrange__GQMQ_",hbBeacon:"pages_hbBeacon__lLEpo",arenaHero:"pages_arenaHero__hW93S",arenaLights:"pages_arenaLights__iBngF",heroGrid:"pages_heroGrid__z8Frx",heroCopy:"pages_heroCopy__Ds7qx",lede:"pages_lede__8xdPL",heroActions:"pages_heroActions__iRGtU",heroStage:"pages_heroStage__N9Fya",spot:"pages_spot__Vhcla",heroTilt:"pages_heroTilt__8DYTy",heroCourtShell:"pages_heroCourtShell__bep8t",heroCourt:"pages_heroCourt__zhjLh",heroReflection:"pages_heroReflection__VxLXW",broadcast:"pages_broadcast__BrxgH",broadcastTop:"pages_broadcastTop__OgQ9a",live:"pages_live__PY3LU",blink:"pages_blink__XVQWH",stepCount:"pages_stepCount__epaSW",captionIn:"pages_captionIn__ect1X",broadcastBar:"pages_broadcastBar__nnUMa",capabilityRail:"pages_capabilityRail__qF6S6",section:"pages_section__gPRVI",sectionTight:"pages_sectionTight__gw3TR",sectionWhite:"pages_sectionWhite__dyW5o",sectionHead:"pages_sectionHead__Dly8_",subLede:"pages_subLede__nYxiV",onDark:"pages_onDark__wro1e",stepLedger:"pages_stepLedger__RYdA5",stepNumber:"pages_stepNumber__2Bpra",symbolsGrid:"pages_symbolsGrid__OG20C",legend:"pages_legend__9aV9i",compareGrid:"pages_compareGrid__sEJz0",compareTable:"pages_compareTable___wC5K",compareHead:"pages_compareHead__xCz2l",compareRow:"pages_compareRow__IzxCi",compareYes:"pages_compareYes___Jrsz",arenaBand:"pages_arenaBand__3arY5",whiteboardGrid:"pages_whiteboardGrid__bk8Y_",ipad:"pages_ipad__f4anw",ipadScreen:"pages_ipadScreen__eoTJ2",ipadBar:"pages_ipadBar__YEYur",ipadBody:"pages_ipadBody__DuiUL",ipadRail:"pages_ipadRail__ggG9G",ipadActive:"pages_ipadActive___rXkh",ipadCourt:"pages_ipadCourt__qatYx",pencil:"pages_pencil__lhx1Q",checkList:"pages_checkList__4U988",bandButton:"pages_bandButton__AHgbe",libraryHead:"pages_libraryHead__isvCU",filters:"pages_filters__Xsn62",playGrid:"pages_playGrid__zaH6q",playCard:"pages_playCard__j13SO",playCardLink:"pages_playCardLink__CCTR4",playCardCourt:"pages_playCardCourt__lgPJM",playCardSvg:"pages_playCardSvg__1F_Lq",playCardMeta:"pages_playCardMeta__yk5ji",tag:"pages_tag__9BKlK",tagAge:"pages_tagAge__ufWuE",playCardOpen:"pages_playCardOpen__sNBpM",centerLink:"pages_centerLink__DoDA2",printGrid:"pages_printGrid__6IvJG",inlineActions:"pages_inlineActions__ScBGa",paperStack:"pages_paperStack__Cw9bi",paper:"pages_paper__oCC2_",paperHead:"pages_paperHead__MOf_Z",qr:"pages_qr__L0uL0",paperGrid:"pages_paperGrid__m2T2W",faqGrid:"pages_faqGrid__gH8r9",faq:"pages_faq__Ozo8U",faqItem:"pages_faqItem__4C1C3",faqIcon:"pages_faqIcon__7l1em",finalBand:"pages_finalBand__lDs6D",finalInner:"pages_finalInner__btQ09",subHero:"pages_subHero__h999J",subHeroInner:"pages_subHeroInner__4dqwg",crumbs:"pages_crumbs__EgbjB",heroTags:"pages_heroTags__XLg7e",tagWarn:"pages_tagWarn__gU_Ll",overlap:"pages_overlap__LpWNs",twoCol:"pages_twoCol__GDU2T",prose:"pages_prose__iYkHe",tableCard:"pages_tableCard__SX3JS",tableScroll:"pages_tableScroll__AOcJ5",ctaCard:"pages_ctaCard__7N9qc",srOnly:"pages_srOnly__EVEIr"}},44725:function(e){e.exports={hero:"scoreboard-page_hero__N264A",heroInner:"scoreboard-page_heroInner__1UCxe",promise:"scoreboard-page_promise__9JoWF",steps:"scoreboard-page_steps__hKa_c",keysCard:"scoreboard-page_keysCard__ahX3v",more:"scoreboard-page_more__h57BG"}}},function(e){e.O(0,[3996,7361,5119,4116,386,9155,7554,9774,2888,179],function(){return e(e.s=88542)}),_N_E=e.O()}]);

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.