1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[62468],{89555:(e,t,n)=>{n.d(t,{B$:()=>a,Sb:()=>h,WN:()=>d,Zo:()=>c,_T:()=>m,a2:()=>r,gl:()=>i,hX:()=>f,qH:()=>u,wl:()=>p,zO:()=>x});let a={P1:"Perfect Unison",m2:"Minor Second",M2:"Major Second",m3:"Minor Third",M3:"Major Third",P4:"Perfect Fourth",TT:"Tritone",P5:"Perfect Fifth",m6:"Minor Sixth",M6:"Major Sixth",m7:"Minor Seventh",M7:"Major Seventh",P8:"Perfect Octave",m9:"Minor Ninth",M9:"Major Ninth",m10:"Minor Tenth",M10:"Major Tenth",P11:"Perfect Eleventh",A11:"Augmented Eleventh",P12:"Perfect Twelfth",m13:"Minor Thirteenth",M13:"Major Thirteenth",m14:"Minor Fourteenth",M14:"Major Fourteenth",P15:"Perfect Fifteenth"},r={major:"Major",minor:"Minor",diminished:"Diminished",augmented:"Augmented",maj7:"Major 7th",min7:"Minor 7th",7:"Dominant 7th",m7b5:"Half-diminished 7th",dim7:"Diminished 7th",sus2:"Sus2",sus4:"Sus4",sus4b5:"Sus4 b5",maj6:"Major 6",min6:"Minor 6",majadd2:"Major Add 2",majadd4:"Major Add 4",majaddb6:"Major Add b6",minadd2:"Minor Add 2",minadd4:"Minor Add 4",minaddb6:"Minor Add b6",phrygian:"Phrygian",lydian:"Lydian",locrian:"Locrian",phrygianmajor:"Phrygian Major",phrygianminor:"Phrygian Minor",lydianmajor:"Lydian Major",lydianminor:"Lydian Minor",maj7sus2:"Major 7 Sus2",maj7sus4:"Major 7 Sus4","7sus4":"Dominant 7th Sus4",augmaj7:"Augmented Major 7th",dimmaj7:"Diminished Major 7th",minmaj7:"Minor Major 7th",lydiandom:"Lydian Dominant",phrygiandom:"Phrygian Dominant",phrygianmaj7:"Phrygian Major 7th",lydianmaj7:"Lydian Major 7th",maj9:"Major 9th","maj7#11":"Maj7#11",maj13:"Major 13th",min9:"Minor 9th",min11:"Minor 11th",min13:"Minor 13th",minmaj9:"Minor Major 9th",minmaj11:"Minor Major 11th",minmaj13:"Minor Major 13th"},i={major:"Major (Ionian)",dorian:"Dorian",phrygian:"Phrygian",lydian:"Lydian",mixolydian:"Mixolydian",aeolian:"Aeolian (Natural Minor)",locrian:"Locrian","harmonic-minor":"Harmonic Minor","melodic-minor":"Melodic Minor (Ascending)",dorianb2:"Dorian â2",lydianaugmented:"Lydian Augmented",lydiandominant:"Mixolydian #11",mixolydianb6:"Mixolydian â6",locriannatural2:"Locrian â®2",altered:"Altered Scale","melodic-minor-2":"Dorian â2 (Phrygian â®6)","melodic-minor-3":"Lydian Augmented","melodic-minor-4":"Lydian Dominant (Mixolydian â¯4)","melodic-minor-5":"Mixolydian â6 (Aeolian Dominant)","melodic-minor-6":"Locrian â®2 (Half-Diminished â®2)","melodic-minor-7":"Altered Scale (Super Locrian)",locrian6:"Locrian â®6",ionianaugmented:"Ionian Augmented","dorian#4":"Dorian â¯4",phrygiandominant:"Phrygian Dominant","lydian#2":"Lydian â¯2",alteredbb7:"Altered Dominant bb7",wholetone:"Whole Tone",diminished:"Diminished (Half-Whole)",diminished2:"Diminished (Whole-Half)","diminished(wh)":"Diminished (Whole-Half)","diminished(hw)":"Diminished (Half-Whole)",augmented:"Augmented Scale",majorpentatonic:"Major Pentatonic",minorpentatonic:"Minor Pentatonic",majorblues:"Major Blues",minorblues:"Minor Blues",majorbebop:"Major Bebop",minorbebop:"Minor Bebop",dominantbebop:"Dominant Bebop",melodicminorbebop:"Melodic Minor Bebop"},l={diminished:"diminished(hw)",diminished2:"diminished(wh)","melodic-minor-2":"dorianb2","melodic-minor-3":"lydianaugmented","melodic-minor-4":"lydiandominant","melodic-minor-5":"mixolydianb6","melodic-minor-6":"locriannatural2","melodic-minor-7":"altered"},o=Object.entries(l),s=new Set(o.map(e=>{let[t]=e;return t})),d=Object.keys(i).filter(e=>!s.has(e)),c=e=>o.filter(t=>{let[,n]=t;return n===e}).map(e=>{let[t]=e;return t}),m=e=>{var t;return null!==(t=l[e])&&void 0!==t?t:e},u=e=>{let t=new Set,n=[];return e.forEach(e=>{let a=m(e);t.has(a)||(t.add(a),n.push(a))}),n},h=e=>{let t={...e};return o.forEach(n=>{let[a,r]=n;e[a]&&(t[r]=!0)}),t},p=new Set(["major","minor","diminished","sus2","sus4","sus4b5"]),x=new Set(["maj7","min7","7","m7b5","dim7"]),f=e=>p.has(e)?3:x.has(e)?4:1},19966:(e,t,n)=>{n.d(t,{Ac:()=>r,Rm:()=>i,cd:()=>s,jR:()=>l,kS:()=>o});let a=()=>"vibrate"in navigator,r=()=>{if(a())try{navigator.vibrate(100)}catch(e){console.warn("Haptic feedback failed:",e)}},i=()=>{if(a())try{navigator.vibrate([80,50,80,50,80])}catch(e){console.warn("Haptic feedback failed:",e)}},l=()=>{if(a())try{navigator.vibrate(15)}catch(e){}},o=()=>
1{if(a())try{navigator.vibrate(30)}catch(e){}},s=()=>{if(a())try{navigator.vibrate([20,30,20])}catch(e){}}},76211:(e,t,n)=>{n.d(t,{A:()=>f});var a=n(95155),r=n(12115),i=n(79469),l=n(19966),o=n(35462);let s=["a","w","s","e","d","f","t","g","y","h","u","j","k"],d={"1P":"P1","2m":"m2","2M":"M2","3m":"m3","3M":"M3","4P":"P4","4A":"TT","5d":"TT","5P":"P5","6m":"m6","6M":"M6","7m":"m7","7M":"M7","8P":"P8","9m":"m9","9M":"M9","10m":"m10","10M":"M10","11P":"P11","11A":"A11","12P":"P12","13m":"m13","13M":"M13","14m":"m14","14M":"M14","15P":"P15"},c=e=>d[e]||e,m=["P1","m2","M2","m3","M3","P4","TT","P5","m6","M6","m7","M7","P8"],u=["P1","m2","M2","m3","M3","P4","TT","P5","m6","M6","m7","M7","P8","m9","M9","m10","M10","P11","A11","P12","m13","M13","m14","M14","P15"],h=["from-amber-400 via-orange-500 to-red-600","from-indigo-400 via-purple-500 to-pink-600","from-emerald-400 via-teal-500 to-cyan-600","from-rose-400 via-pink-500 to-fuchsia-600","from-sky-400 via-blue-500 to-indigo-600","from-lime-400 via-green-500 to-emerald-600"],p=e=>{let t={"Minor 2nd":"m2","Major 2nd":"M2","Minor 3rd":"m3","Major 3rd":"M3","Perfect 4th":"P4",Tritone:"TT","Augmented Fourth":"Aug4","Augmented Fourth (Tritone)":"Aug4","Augmented 4th":"Aug4","Perfect 5th":"P5","Minor 6th":"m6","Major 6th":"M6","Minor 7th":"m7","Major 7th":"M7",Octave:"Oct",Unison:"Uni","Minor Second":"m2","Major Second":"M2","Minor Third":"m3","Major Third":"M3","Perfect Fourth":"P4","Perfect Fifth":"P5","Minor Sixth":"m6","Major Sixth":"M6","Minor Seventh":"m7","Major Seventh":"M7"},n=e.replace(/\s*\([^)]*\)\s*/g,"").trim();return t[e]||t[n]||n.substring(0,4)},x=e=>e.replace(/\s*\([^)]*\)\s*/g,"").trim(),f=e=>{let{sortedIntervals:t,handleAnswer:n,intervalFullNameMap:d,disabled:f=!1,isCompoundIntervals:g=!1}=e,b=(0,r.useRef)(0),M=t.length,v=(0,r.useMemo)(()=>t.map(c),[t]),j=(0,r.useMemo)(()=>{let e={};return t.forEach(t=>{e[c(t)]=t}),e},[t]),w=(0,r.useCallback)(e=>{var t;return 2===M?0===e?"A":"D":(null===(t=s[e])||void 0===t?void 0:t.toUpperCase())||""},[M]);(0,r.useEffect)(()=>{if(f)return;let e=e=>{var a;let r=e.target,i=null==r?void 0:null===(a=r.tagName)||void 0===a?void 0:a.toLowerCase();if("input"===i||"textarea"===i||"select"===i||(null==r?void 0:r.isContentEditable)||document.querySelector('[role="dialog"], .modal, [data-state="open"][data-dialog]'))return;let l=performance.now();if(l-b.current<160)return;let o=e.key.toLowerCase(),d=-1;2===M?"a"===o||"arrowleft"===o?d=0:("d"===o||"arrowright"===o)&&(d=1):d=s.indexOf(o),-1!==d&&d<M&&(b.current=l,e.preventDefault(),n(t[d]))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[f,M,t,n]);let y=e=>{let{interval:t,index:r,size:s="md"}=e,c=d[t],m=p(c),u=x(c);return(0,a.jsxs)("button",{onClick:()=>n(t),onPointerDown:()=>(0,l.jR)(),disabled:f,"aria-label":(0,o.Cu)(t),className:"group relative mx-auto ".concat({lg:"w-[120px] h-[120px] sm:w-[150px] sm:h-[150px]",md:"w-[95px] h-[95px] sm:w-[115px] sm:h-[115px]",sm:"w-[70px] h-[70px] sm:w-[85px] sm:h-[85px]",xs:"w-[58px] h-[58px] sm:w-[70px] sm:h-[70px]"}[s],"\n disabled:opacity-50 disabled:cursor-not-allowed\n transition-transform duration-300 hover:scale-105 active:scale-95"),children:[(0,a.jsxs)("div",{className:"absolute inset-0 rounded-full bg-[#0a0a0a] shadow-[0_4px_20px_rgba(0,0,0,0.4),inset_0_1px_3px_rgba(0,0,0,0.6)] group-hover:shadow-[0_6px_25px_rgba(0,0,0,0.5),inset_0_1px_3px_rgba(0,0,0,0.6)] transition-all duration-300 overflow-hidden",children:[(0,a.jsx)("div",{className:"absolute inset-0 rounded-full",style:{background:"radial-gradient(circle at 50% 50%,\n transparent 0%,\n transparent 92%,\n rgba(40,40,40,0.5) 94%,\n rgba(60,60,60,0.3) 96%,\n rgba(20,20,20,0.8) 98%,\n rgba(10,10,10,1) 100%)"}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full",style:{background:"\n repeating-radial-gradient(circle at 50% 50%,\n #050505 0px,\n #0d0d0d 0.6px,\n #1a1a1a 0.9px,\n #121212 1.2px,\n #080808 1.5px,\n #050505 2px\n )\n "}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-70",style:{background:"repeating-radial-gradient(circle at 48% 52%,\
1n rgba(0,0,0,0.8) 0px,\n rgba(0,0,0,0.6) 0.5px,\n transparent 1px,\n rgba(80,80,80,0.3) 2px,\n rgba(30,30,30,0.4) 2.5px,\n transparent 3px,\n transparent 5px)"}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-25",style:{background:"repeating-radial-gradient(circle at 52% 48%,\n transparent 0px,\n rgba(255,255,255,0.04) 0.8px,\n transparent 1.2px,\n transparent 2px)"}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-40",style:{background:"conic-gradient(from 30deg, transparent 0%, rgba(255,255,255,0.12) 12%, transparent 20%, rgba(255,255,255,0.06) 45%, transparent 55%)"}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-35 mix-blend-overlay pointer-events-none",style:{backgroundImage:"url(\"data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E\")",backgroundSize:"100% 100%"}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-20 pointer-events-none",style:{background:"\n linear-gradient(23deg, transparent 0%, transparent 48%, rgba(255,255,255,0.03) 48.5%, transparent 49%),\n linear-gradient(78deg, transparent 0%, transparent 72%, rgba(255,255,255,0.02) 72.5%, transparent 73%),\n linear-gradient(156deg, transparent 0%, transparent 31%, rgba(255,255,255,0.025) 31.5%, transparent 32%),\n linear-gradient(234deg, transparent 0%, transparent 65%, rgba(0,0,0,0.15) 65.5%, transparent 66%)\n "}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-15 pointer-events-none",style:{background:"\n radial-gradient(ellipse 25% 20% at 35% 40%, rgba(0,0,0,0.2) 0%, transparent 60%),\n radial-gradient(ellipse 20% 25% at 68% 55%, rgba(0,0,0,0.15) 0%, transparent 50%)\n "}}),(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-30 pointer-events-none",style:{backgroundImage:"radial-gradient(circle at 22% 18%, rgba(180,180,180,0.4) 0.3px, transparent 0.3px),\n radial-gradient(circle at 67% 34%, rgba(200,200,200,0.3) 0.4px, transparent 0.4px),\n radial-gradient(circle at 45% 78%, rgba(190,190,190,0.35) 0.35px, transparent 0.35px),\n radial-gradient(circle at 83% 62%, rgba(180,180,180,0.3) 0.3px, transparent 0.3px)",backgroundSize:"100% 100%"}})]}),(0,a.jsxs)("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2\n ".concat({lg:"w-[32%] h-[32%]",md:"w-[30%] h-[30%]",sm:"w-[35%] h-[35%]",xs:"w-[38%] h-[38%]"}[s]," rounded-full\n flex flex-col items-center justify-center\n shadow-[0_2px_6px_rgba(0,0,0,0.3)]\n bg-gradient-to-br ").concat(h[r%h.length]),children:[(0,a.jsx)("div",{className:"absolute inset-0 rounded-full opacity-25",style:{background:"radial-gradient(circle at 35% 35%, rgba(255,255,255,0.4) 0%, transparent 40%)"}}),(0,a.jsx)("div",{className:"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-1 h-1 sm:w-1.5 sm:h-1.5 rounded-full bg-[#111]"})]}),(()=>{let e={xs:{mobile:10,desktop:9},sm:{mobile:10,desktop:9},md:{mobile:10,desktop:10},lg:{mobile:12,desktop:9}},t=e[s].mobile,n=e[s].desktop,i="interval-".concat(r,"-").concat(m.replace(/\s/g,""));return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("svg",{className:"absolute inset-0 z-10 w-full h-full sm:hidden pointer-events-none",viewBox:"0 0 100 100",style:{transform:"rotate(-90deg)"},children:[(0,a.jsx)("defs",{children:(0,a.jsx)("path",{id:"".concat(i,"-vinyl-m"),d:"M 50,".concat(18," A ").concat(32,",").concat(32," 0 1,1 49.99,").concat(18),fill:"none"})}),(0,a.jsx)("text",{fill:"white",fontWeight:"bold",fontSize:t,style:{filter:"drop-shadow(0 1px 2px rgba(0,0,0,0.8))"},children:(0,a.jsx)("textPath",{href:"#".concat(i,"-vinyl-m"),startOffset:"25%",textAnchor:"middle",dy:"4",children:u})})]}),(0,a.jsxs)("svg",{className:"absolute inset-0 z-10 w-full h-full hidden sm:block pointer-events-none",viewBox:"0 0 100 100",style:{transform:"rotate(-90deg)"},children:[(0,a.jsx)("defs",{children:(0,a.jsx)("path",{id:"".concat(i,"-vinyl-d"),d:"M 50,".concat(18," A ").concat(32,",").concat(32," 0 1,1 49.99,").concat(18),fill:"none"})}),(0,a.jsx)("text",{fill:"white",fontWeight:"bold",fontSize:n,style:{filter:"drop-shadow(0 1px 2px rgba(0,0,0,0.8))"},children:(0,a.jsx)("textPath",{href:"#".concat(i,"-vinyl-d"),startOffset:"25%",textAnchor:"middle",dy:"4",children:u})})]})]})})(),"sm"!==s&&"xs"!==s&&(0,a.jsx)(i.u,{className:"absolute bottom-1 left-1/2 -translate-x-1/2 z-10 hidden sm:inline-flex bg-black/40 border-white/20 text-white/80 text-[8px]",children:2===M?0===r?"â":"â":w(r)})]})};if(2===M)return(0,a.jsx)("div",{className:"w-full flex justify-center px-3",children:(0,a.jsx)("div",{className:"grid grid-cols-2 gap-4 sm:gap-6",children:t.map((e,t)=>(0,a.jsx)(y,{interval:e,index:t,size:"lg"},e))})});if(3===M)return(0,a.jsx)("div",{className:"w-full flex justify-center px-3",children:(0,a.jsxs)("div",{className:"flex flex-col items-center gap-3 sm:gap-4",children:[(0,a.jsx)(y,{interval:t[0],index:0,size:"md"}),(0,a.jsx)("div",{className:"flex gap-3 sm:gap-4",children:t.slice(1).map((e,t)=>(0,a.jsx)(y,{interval:e,index:t+1,size:"md"},e))})]})});if(4===M)return(0,a.jsx)("div",{className:"w-full flex justify-center px-3",children:(0,a.jsx)("div",{className:"grid grid-cols-2 gap-3 sm:gap-4",children:t.map((e,t)=>(0,a.jsx)(y,{interval:e,index:t,size:"md"},e))})});if(M<=6)return(0,a.jsx)("div",{className:"w-full flex justify-center px-2",children:(0,a.jsx)("div",{className:"grid grid-cols-3 gap-2 sm:gap-3",children:t.map((e,t)=>(0,a.jsx)(y,{interval:e,index:t,size:"sm"},e))})});if(M>=7){let e=e=>{let t=d[e]||e;return t.toLowerCase().includes("tritone")||"TT"===e?"TT":t.replace("Perfect ","P").replace("Major ","M").replace("Minor ","m").replace("Augmented ","A").replace("Diminished ","d").replace("Unison","1").replace("Second","2").replace("Third","3").replace("Fourth","4").replace("Fifth","5").replace("Sixth","6").replace("Seventh","7").replace("Octave","8").replace("Ninth","9").replace("Tenth","10").replace("Eleventh","11").replace("Twelfth","12").replace("Thirteenth","13").replace("Fourteenth","14").replace("Fifteenth","15").trim()},t=g?u:m,r=g?[1,3,6,8,10,13,15,18,20,22]:[1,3,6,8,10],i=t.filter((e,t)=>
1!r.includes(t)).length,s=g?120:160,c=g?75:100;return(0,a.jsxs)("div",{className:"w-full space-y-2",children:[(0,a.jsx)("div",{className:"w-full scrollbar-none",children:(0,a.jsxs)("div",{className:"relative mx-auto",role:"group","aria-label":"Interval piano keyboard",style:{width:"100%",maxWidth:"".concat(i*(g?42:56),"px"),height:"".concat(s,"px")},children:[t.map((s,d)=>{let c=v.includes(s);if(r.includes(d))return null;let m=e(s),u=c&&!f,h=j[s]||s,p=t.slice(0,d).filter((e,t)=>!r.includes(t)).length;return(0,a.jsx)("button",{onClick:()=>u&&n(h),onPointerDown:()=>u&&(0,l.jR)(),disabled:!u,"aria-label":"".concat((0,o.Cu)(h)).concat(c?"":", not available"),"aria-disabled":!u,className:"\n absolute top-0\n font-bold\n flex flex-col items-center justify-end\n pb-2 sm:pb-3\n border rounded-b-lg\n transition-colors duration-100\n ".concat(c?"bg-gradient-to-b from-white via-zinc-50 to-zinc-200 text-zinc-700 hover:to-zinc-300 active:to-zinc-400 cursor-pointer border-zinc-300":"bg-gradient-to-b from-zinc-200 via-zinc-300 to-zinc-400 dark:from-zinc-300 dark:via-zinc-400 dark:to-zinc-500 text-zinc-400 dark:text-zinc-500 border-zinc-400 cursor-not-allowed","\n "),style:{left:"".concat(p/i*100,"%"),width:"".concat(1/i*100,"%"),height:"100%",boxShadow:"inset 0 -6px 12px rgba(0,0,0,0.08), 0 2px 4px rgba(0,0,0,0.15)"},children:(0,a.jsx)("span",{className:"leading-none text-[8px] sm:text-xs font-semibold",children:m})},s)}),t.map((d,m)=>{let u=v.includes(d);if(!r.includes(m))return null;let h=e(d),p=u&&!f,x=j[d]||d,g=t.slice(0,m).filter((e,t)=>!r.includes(t)).length,b=100/i,M=.65*b;return(0,a.jsx)("button",{onClick:()=>p&&n(x),onPointerDown:()=>p&&(0,l.jR)(),disabled:!p,"aria-label":"".concat((0,o.Cu)(x)).concat(u?"":", not available"),"aria-disabled":!p,className:"\n absolute top-0\n font-bold\n flex flex-col items-center justify-end\n pb-1 sm:pb-2 \n rounded-b-md\n transition-colors duration-100\n ",style:{left:"".concat(g*b-M/2,"%"),width:"".concat(M,"%"),height:"".concat(c/s*100,"%"),zIndex:20,background:u?"linear-gradient(to bottom, #3f3f46, #27272a, #18181b)":"linear-gradient(to bottom, #52525b, #3f3f46, #27272a)",color:u?"#d4d4d8":"#71717a",cursor:u?"pointer":"not-allowed",boxShadow:"0 4px 8px rgba(0,0,0,0.5), inset 0 -2px 6px rgba(0,0,0,0.4)"},onMouseEnter:e=>{u&&(e.currentTarget.style.background="linear-gradient(to bottom, #52525b, #3f3f46, #27272a)")},onMouseLeave:e=>{u&&(e.currentTarget.style.background="linear-gradient(to bottom, #3f3f46, #27272a, #18181b)")},children:(0,a.jsx)("span",{className:"leading-none text-[6px] sm:text-[10px]",children:h})},d)})]})}),(0,a.jsxs)("p",{className:"text-center text-[9px] sm:text-xs text-zinc-400 px-2",children:[(0,a.jsx)("span",{className:"hidden sm:inline",children:"Intervals are always shown from C - this is intentional for relative pitch training. "}),(0,a.jsx)("span",{className:"sm:hidden",children:"Intervals shown from C for relative pitch training. "}),(0,a.jsx)("span",{className:"text-zinc-500 italic",children:"Sorry, perfect pitch gang! \uD83C\uDFB5"})]})]})}return null}},88507:(e,t,n)=>{n.d(t,{Gu:()=>i,xZ:()=>r}),n(81798);let a=["P1","m2","M2","m3","M3","P4","TT","P5","m6","M6","m7","M7","P8","m9","M9","m10","M10","P11","A11","P12","m13","M13","m14","M14","P15"];function r(e){return e.sort((e,t)=>a.indexOf(e)-a.indexOf(t))}let i={"1P":"Perfect Unison","2m":"Minor Second","2M":"Major Second","3m":"Minor Third","3M":"Major Third","4P":"Perfect Fourth","4A":"Augmented Fourth (Tritone)","5P":"Perfect Fifth","6m":"Minor Sixth","6M":"Major Sixth","7m":"Minor Seventh","7M":"Major Seventh","8P":"Perfect Octave","9m":"Minor Ninth","9M":"Major Ninth","10m":"Minor Tenth","10M":"Major Tenth","11P":"Perfect Eleventh","11A":"Augmented Eleventh","12P":"Perfect Twelfth","13m":"Minor Thirteenth","13M":"Major Thirteenth","14m":"Minor Fourteenth","14M":"Major Fourteenth","15P":"Perfect Fifteenth"}},62468:(e,t,n)=>{n.r(t),n.d(t,{default:()=>y});var a=n(95155),r=n(12115),i=n(43226),l=n(11536),o=n(89227),s=n(73616),d=n(56114);let c=e=>{let{notes:t,showSecondNote:n=!0,isHarmonic:i=!1,isAscending:l=!0}=e,o=(0,r.useRef)(null),s=(0,r.useCallback)(e=>{let t=Math.floor(e/12)-1;return"".concat(["c","c#","d","d#","e","f","f#","g","g#","a","a#","b"][e%12],"/").concat(t)},[]);return(0,r.useEffect)(()=>
1{if(!o.current)return;let e=o.current;e.innerHTML="";let a=new d.Renderer(e,d.Renderer.Backends.SVG);a.resize(400,150);let r=a.getContext();r.setFillStyle("black"),r.setStrokeStyle("black");let c=t.filter(e=>null!=e&&"number"==typeof e.midi&&!isNaN(e.midi)&&e.midi>=0&&e.midi<=127);if(0===c.length){console.warn("IntervalNotationComponent: No valid notes with valid MIDI values"),new d.Stave(10,40,380).addClef("treble").setContext(r).draw();return}let m=c.map(e=>({...e,midi:e.midi})),u=60>Math.min(...m.map(e=>e.midi))?"bass":"treble",h=new d.Stave(20,40,360);h.addClef(u).setContext(r).draw();let p=[];if(i){let e=(n?m:[m[0]]).map(e=>s(e.midi)),t=new d.StaveNote({clef:u,keys:e,duration:"w"});e.forEach((e,n)=>{let a=e.split("/")[0];a.includes("#")?t.addModifier(new d.Accidental("#"),n):a.length>1&&a.endsWith("b")&&t.addModifier(new d.Accidental("b"),n)}),p=[t]}else if(m.length>1&&n){let e=l?m[0]:m[1],t=l?m[1]:m[0];p=[new d.StaveNote({clef:u,keys:[s(e.midi)],duration:"q"}),new d.StaveNote({clef:u,keys:[s(t.midi)],duration:"q"})],[e,t].forEach((e,t)=>{let n=s(e.midi).split("/")[0];n.includes("#")?p[t].addModifier(new d.Accidental("#"),0):n.length>1&&n.endsWith("b")&&p[t].addModifier(new d.Accidental("b"),0)})}else{let e=m[0],t=new d.StaveNote({clef:u,keys:[s(e.midi)],duration:"q"}),n=s(e.midi).split("/")[0];n.includes("#")?t.addModifier(new d.Accidental("#"),0):n.length>1&&n.endsWith("b")&&t.addModifier(new d.Accidental("b"),0),p=[t]}if(0===p.length){console.warn("IntervalNotationComponent: No valid stave notes to render");return}try{let e=new d.Voice({num_beats:p.length,beat_value:4});e.setStrict(!1),e.addTickables(p),new d.Formatter().joinVoices([e]).format([e],350),e.draw(r,h)}catch(e){console.error("VexFlow rendering error:",e),new d.Stave(20,40,360).addClef(u).setContext(r).draw()}},[t,n,i,l,s]),(0,a.jsx)("div",{className:"flex justify-center items-center h-[180px] w-full",children:(0,a.jsx)("div",{ref:o,className:"bg-white w-full max-w-[400px] h-[150px] overflow-hidden rounded-lg"})})};var m=n(76211),u=n(86877),h=n(89555),p=n(51569),x=n(75556),f=n(81798),g=n(68174),b=n(13374),M=n(88507),v=n(21567),j=n(19966),w=n(35462);let y=e=>{let{settings:t,onBackToSettings:n,hideBackButton:d=!1,hideKeyboardHints:y=!1,onAnswerResult:P,shouldAutoAdvance:N}=e,[S,k]=(0,r.useState)(60),[A,T]=(0,r.useState)(62),[C,D]=(0,r.useState)(null),[E,z]=(0,r.useState)(!1),[L,F]=(0,r.useState)(!1),[R,I]=(0,r.useState)(!1),[_,B]=(0,r.useState)(null),[H,O]=(0,r.useState)(null),[W,q]=(0,r.useState)(null),[J,U]=(0,r.useState)(!0),[$,V]=(0,r.useState)(!1),[Z,G]=(0,r.useState)(!1),[Q,X]=(0,r.useState)([]),K=(0,r.useRef)(null),Y=(0,r.useRef)(null),ee=(0,r.useRef)(!1),[et,en]=(0,r.useState)(!1),[ea,er]=(0,r.useState)(!1),ei=(0,r.useRef)(null),el=(0,r.useRef)(null),eo=(0,r.useRef)(null),es=(0,r.useMemo)(()=>(0,M.xZ)(t.selectedIntervals),[t.selectedIntervals]),ed=(0,r.useCallback)(e=>{var t;return null!==(t=h.B$[e])&&void 0!==t?t:e},[]),ec={P1:0,m2:1,M2:2,m3:3,M3:4,P4:5,TT:6,P5:7,m6:8,M6:9,m7:10,M7:11,P8:12,m9:13,M9:14,m10:15,M10:16,P11:17,A11:18,P12:19,m13:20,M13:21,m14:22,M14:23,P15:24},em=(0,r.useMemo)(()=>t.selectedIntervals.some(e=>{let t=ec[e];return void 0!==t&&t>12}),[t.selectedIntervals]);(0,r.useEffect)(()=>()=>{o.JD.stopAllSounds(),ei.current&&clearTimeout(ei.current)},[]),(0,r.useEffect)(()=>((async()=>{try{await o.JD.waitForLoad(),K.current=new x.Howl({src:["/sounds/correct.mp3"],volume:.2,html5:!1}),Y.current=new x.Howl({src:["/sounds/wrong.mp3"],volume:.2,html5:!1}),F(!0)}catch(e){}})(),()=>{o.JD.stopAllSounds(),K.current&&K.current.unload(),Y.current&&Y.current.unload()}),[]);let eu=(0,r.useCallback)((e,n)=>{if(L&&!ee.current)try{ee.current=!0,I(!0);let a=f.L7.fromMidi(e),r=f.L7.fromMidi(n);"harmonic"===t.direction?(o.JD.playExerciseSequence([a,r],!0),setTimeout(()=>{I(!1),ee.current=!1},1e3)):(o.JD.playExerciseNote(a),setTimeout(()=>{o.JD.playExerciseNote(r),setTimeout(()=>{I(!1),ee.current=!1},500)},500))}catch(e){I(!1),ee.current=!1}},[t.direction,L]),eh=(0,r.useCallback)(async()=>{let e,n;if(ee.current)return;$||V(!0);let a=f.L7.midi("C3"),r=f.L7.midi("C5"),i=t.selectedIntervals[Math.floor(Math.random()*t.selectedIntervals.length)],l=ec[i];if(void 0===l)return;let o="ascending"===t.direction||"descending"!==t.direction&&.5>Math.random(),s=0;do e=Math.floor(Math.random()*(r-a+1))+a,n=o?e+l:e-l,s++;while(n<a||n>r||s<50&&i===el.current&&e===eo.current);el.current=i,eo.current=e,k(e),T(n),D(i),U(o),z(!1),B(null),O(null),q(null),en(!1),er(!1),G(!1),eu(e,n)},[t.selectedIntervals,t.direction,eu,$]),ep=(0,r.useCallback)(()=>{ei.current&&(clearTimeout(ei.current),ei.current=null),en(!1),er(!1),o.JD.stopAllSounds(),I(!1),ee.current=!1,eh()},[eh]),ex=(0,r.useRef)(N);ex.current=N;let ef=(0,r.useCallback)(e=>{ei.current&&clearTimeout(ei.current),ei.current=setTimeout(()=>{(!ex.current||ex.current())&&ep()},e)},[ep]),eg=(0,r.useCallback)(()=>{L&&!ee.current&&eu(S,A)},[S,A,eu,L]);(0,p.B)({onSpacebar:eg,disabled:!L||R});let eb=(0,r.useCallback)(e=>{if(!C||Z)return;G(!0);let t=e===C;null==P||P({isCorrect:t,item:C,answer:e});let n=ed(e),a=ed(C);B(t?"Correct!":"Not quite."),O(t?"correct":"wrong"),q(a),z(!0),en(!0),er(!t),X(e=>[...e,{id:"".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,8)),label:n,correctLabel:t?void 0:a,result:t?"correct":"wrong"}]),t?((0,j.Ac)(),K.current&&K.current.play(),(0,s.ly)()?ef(1100):er(!0)):((0,j.Rm)(),Y.current&&Y.current.play())},[C,Z,ed,ef,P]),eM=(0,r.useCallback)(()=>
1{if(!C||Z)return;G(!0),(0,j.Rm)(),Y.current&&Y.current.play();let e=ed(C);B("Revealed"),O("wrong"),q(e),z(!0),en(!0),er(!0),X(t=>[...t,{id:"".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,8)),label:"Revealed",correctLabel:e,result:"wrong"}])},[C,Z,ed]);return(0,r.useEffect)(()=>{if(!et)return;let e=e=>{"Enter"===e.key&&(e.preventDefault(),ep())};return window.addEventListener("keydown",e),()=>{window.removeEventListener("keydown",e)}},[et,ep]),(0,r.useEffect)(()=>{L&&t.selectedIntervals.length>0&&!C&&eh()},[L,t.selectedIntervals.length,eh,C]),(0,a.jsxs)("div",{className:"relative w-full px-2 sm:px-6",children:[(0,a.jsxs)("div",{className:"mx-auto flex w-full max-w-xl flex-col gap-3 sm:gap-4",children:[(0,a.jsx)("div",{className:"h-[180px]",children:L&&C?(0,a.jsx)(c,{notes:[{midi:J?S:A,duration:"q"},{midi:J?A:S,duration:"q"}],showSecondNote:E,isHarmonic:"harmonic"===t.direction,isAscending:J}):(0,a.jsx)("div",{className:"flex h-full items-center justify-center text-sm text-muted-foreground",children:L?"Setting up the next intervalâ¦":"Initializing audioâ¦"})}),(0,a.jsx)(u.A,{items:Q,placeholder:"Answer history will appear here once you start guessing"}),(0,a.jsx)("div",{className:"flex min-h-[28px] flex-col items-center justify-center text-center","aria-live":"polite",children:_&&(0,a.jsxs)("div",{className:(0,v.cn)("flex flex-col items-center gap-1","correct"===H?"text-primary":"text-destructive"),children:[(0,a.jsx)("div",{className:"text-lg font-semibold",children:_}),W&&(0,a.jsxs)("div",{className:"text-sm text-muted-foreground",children:["wrong"===H?"Correct answer:":"Answer:"," ",W]})]})}),(0,a.jsx)(m.A,{firstNote:S,sortedIntervals:es,handleAnswer:eb,intervalFullNameMap:h.B$,disabled:!L||Z,isCompoundIntervals:em}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex flex-wrap justify-center gap-3 sm:gap-4",children:[(0,a.jsxs)(i.$,{onClick:eg,variant:"secondary",className:"flex items-center gap-2",disabled:!L||!C||R,"aria-label":(0,w.M6)().listenAgain,children:[(0,a.jsx)(l.Swo,{className:"text-sm"})," Repeat"]}),(0,a.jsxs)(i.$,{onClick:eM,variant:"secondary",className:"flex items-center gap-2",disabled:!L||!C||Z,"aria-label":(0,w.M6)().reveal,children:[(0,a.jsx)(l.Ny1,{className:"text-sm"})," Reveal Answer"]}),!d&&(0,a.jsxs)(i.$,{onClick:n,variant:"secondary",className:"hidden sm:flex items-center gap-2","aria-label":(0,w.M6)().back,children:[(0,a.jsx)(l.QVr,{className:"text-sm"})," Back to Settings"]})]}),(0,a.jsx)("div",{className:"mt-3 flex justify-center",children:(0,a.jsx)(b.A,{})}),!y&&(0,a.jsxs)("div",{className:"mt-4 text-center text-xs text-muted-foreground hidden sm:block",children:["Press ",(0,a.jsx)("kbd",{className:"rounded bg-muted px-2 py-1",children:"Space"})," to repeat â¢",(0,a.jsx)("span",{className:"mx-1"}),"Press ",(0,a.jsx)("kbd",{className:"rounded bg-muted px-2 py-1",children:"Enter"})," for the next prompt"]})]})]}),(0,a.jsx)(g.A,{open:et&&ea,title:"correct"===H?"Correct!":"Revealed"===_?"Answer: ".concat(null!=W?W:""):W?"Correct answer: ".concat(W):void 0,message:"correct"===H?"Take a moment to absorb. Tap Next when you're ready.":"Revealed"===_?"Listen again or move to the next interval.":"Listen again, or continue when you are ready.",variant:"correct"===H?"correct":"wrong"===H?"wrong":"neutral",onRepeat:eg,onNext:ep,withinParent:!0})]})}}}]);
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.