lido-player 0.0.2-beta-22-dev → 0.0.2-beta-23-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/cjs/{decode-Cr5DANqc.js → decode-BDs2S8om.js} +1 -1
  2. package/dist/cjs/{index-0BvcfeCt.js → index-D5olYRJo.js} +130 -21
  3. package/dist/cjs/index.cjs.js +1 -1
  4. package/dist/cjs/lido-avatar_22.cjs.entry.js +38 -18
  5. package/dist/collection/components/flashCard/lido-flash-card.js +30 -3
  6. package/dist/collection/components/trace/lido-trace.js +6 -13
  7. package/dist/collection/stories/Templates/balancing/balancing.stories.js +2 -2
  8. package/dist/collection/utils/utilsHandlers/dragDropHandler.js +129 -20
  9. package/dist/components/index.js +1 -1
  10. package/dist/components/lido-flash-card.js +1 -1
  11. package/dist/components/lido-home.js +1 -1
  12. package/dist/components/lido-root.js +1 -1
  13. package/dist/components/lido-trace.js +1 -1
  14. package/dist/components/p-D0cGjo5e.js +1 -0
  15. package/dist/components/{p-CkxAm8rY.js → p-Ds-d6wd0.js} +2 -2
  16. package/dist/components/p-Lg85waqZ.js +1 -0
  17. package/dist/esm/{decode-DkSXjv7K.js → decode-CAwfe7ub.js} +1 -1
  18. package/dist/esm/{index-D9-TTsdZ.js → index-bo7729YG.js} +130 -21
  19. package/dist/esm/index.js +1 -1
  20. package/dist/esm/lido-avatar_22.entry.js +38 -18
  21. package/dist/lido-player/index.esm.js +1 -1
  22. package/dist/lido-player/lido-player.esm.js +1 -1
  23. package/dist/lido-player/{p-35fa0b8b.entry.js → p-461a3d23.entry.js} +2 -2
  24. package/dist/lido-player/{p-Dc8j8Hxw.js → p-D4kAEWCU.js} +1 -1
  25. package/dist/lido-player/p-VRJMO_sg.js +1 -0
  26. package/dist/types/components/flashCard/lido-flash-card.d.ts +4 -0
  27. package/package.json +1 -1
  28. package/dist/components/p-BUfCIPRa.js +0 -1
  29. package/dist/components/p-u3czV7QM.js +0 -1
  30. package/dist/lido-player/p-D2iINRNN.js +0 -1
@@ -88,7 +88,11 @@ export declare class LidoFlash {
88
88
  flipped: boolean;
89
89
  autoFlipAfter: number;
90
90
  private autoFlipTimer?;
91
+ private instructionStartTimer?;
92
+ private frontStartTimer?;
91
93
  private instructionDone;
94
+ private instructionStarted;
95
+ private onAudioStarted;
92
96
  private onAudioEnded;
93
97
  /**
94
98
  * CSS margin value applied to each child element inside the container.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lido-player",
3
- "version": "0.0.2-beta-22-dev",
3
+ "version": "0.0.2-beta-23-dev",
4
4
  "description": "Stencil Component For Lido Player",
5
5
  "main": "dist/index.cjs.js",
6
6
  "module": "dist/index.js",
@@ -1 +0,0 @@
1
- import{t,p as i,H as s,f as e,a,A as o,k as n,i as h,h as d,b as r}from"./index.js";const l=i(class extends s{constructor(t){super(),!1!==t&&this.__registerHost(),this.value="",this.height="auto",this.width="auto",this.ariaLabel="",this.ariaHidden="",this.x="0px",this.y="0px",this.z="0",this.bgColor="",this.type="",this.tabIndex=0,this.visible=!0,this.audio="",this.onTouch="",this.onInCorrect="",this.onCorrect="",this.onEntry="",this.flipped=!1,this.autoFlipAfter=4500,this.instructionDone=!1,this.onAudioEnded=t=>{var i;const s=null===(i=t.detail)||void 0===i?void 0:i.target,a=this.instructionText();if(s&&(s===a||"lido-avatar"===s.id||this.el.contains(s)))if(s===this.instructionText())this.instructionDone=!0,window.setTimeout((()=>{this.speakFront()}),1200);else if(s===this.frontText()){if(this.flipped)return;this.autoFlipTimer&&window.clearTimeout(this.autoFlipTimer),this.autoFlipTimer=window.setTimeout((()=>{this.flipped||this.handleFlip()}),this.autoFlipAfter)}else s===this.backText()?this.flipped&&this.showArrow():"lido-avatar"===s.id&&e("this.avatarAnimate='Idle'",s)},this.margin="",this.disableSpeak=!1,this.style={},this.delayVisible="",this.updateStyles=()=>{const t=window.innerHeight>window.innerWidth?"portrait":"landscape";this.style={height:a(this.height,t)||"200px",width:a(this.width,t)||"200px",backgroundColor:a(this.bgColor,t),top:a(this.y,t),left:a(this.x,t),zIndex:this.z,display:this.visible?this.display?a(this.display,t):"inline-block":"none",flexDirection:this.direction?a(this.direction,t):void 0,margin:a(this.margin,t)}},this.handleFlip=()=>{var t;this.autoFlipTimer&&window.clearTimeout(this.autoFlipTimer),o.getI().stop();const i=!this.flipped;if(this.flipped=!this.flipped,this.setArrowVisible(!1),i){const i=this.backText();i&&(null===(t=i.textContent)||void 0===t?void 0:t.trim())?e("this.speak='true'",i):this.showArrow()}else this.speakFront()},this.instructionText=()=>{var t;return document.getElementById((null===(t=this.el.closest("lido-container"))||void 0===t?void 0:t.getAttribute("template-id"))||"")},this.frontText=()=>this.el.querySelector(".card-front lido-text"),this.backText=()=>this.el.querySelector(".card-back lido-text"),this.speakFront=()=>{var t;const i=this.frontText();this.instructionDone&&!this.flipped&&i&&(null===(t=i.textContent)||void 0===t?void 0:t.trim())&&e("this.speak='true'",i)},this.showArrow=()=>{if(!this.flipped)return;const t=document.getElementById("arrow");if(!t)return;t.getAttribute("onTouch")||t.setAttribute("onTouch","this.nextBtn='true';");const i=document.getElementById("lido-avatar"),s=t.getAttribute("audio");i&&s&&(i.setAttribute("audio",s),t.removeAttribute("audio")),this.setArrowVisible(!0),i&&(e("this.avatarAnimate='Idle speak'",i),o.getI().play(i,!0))},this.setArrowVisible=t=>{const i=document.getElementById("arrow");if(!i)return;i.visible=t,i.setAttribute("visible",String(t)),i.style.display=t?"block":"none",i.style.visibility=t?"visible":"hidden",i.style.opacity=t?"1":"0";const s=i.querySelector("lido-image");s&&(s.style.display=t?"flex":"none",s.style.visibility=t?"visible":"hidden",s.style.opacity=t?"1":"0"),"function"==typeof i.updateStyles&&i.updateStyles()}}handleFlippedChange(){}componentWillLoad(){this.updateStyles(),window.addEventListener("resize",this.updateStyles),window.addEventListener("load",this.updateStyles)}componentDidLoad(){n(this.el,this.delayVisible),h(this.el,this.type),window.addEventListener("lidoAudioEnded",this.onAudioEnded)}disconnectedCallback(){window.removeEventListener("lidoAudioEnded",this.onAudioEnded),this.autoFlipTimer&&window.clearTimeout(this.autoFlipTimer),window.removeEventListener("resize",this.updateStyles),window.removeEventListener("load",this.updateStyles)}render(){return d(r,{key:"8d65b494352e0c0aefb3815c87a798967ccb65aa",value:this.value,"tab-index":this.tabIndex,style:this.style,"aria-label":this.ariaLabel,"aria-hidden":this.ariaHidden,audio:this.audio,onTouch:this.onTouch,onCorrect:this.onCorrect,onInCorrect:this.onInCorrect,onEntry:this.onEntry,type:this.type,onClick:this.handleFlip,"disable-speak":this.disableSpeak},d("div",{key:"db3d4fce4f9f54437485ab1274b1f9bd3b3486bc",class:"card "+(this.flipped?"flipped":"")},d("div",{key:"d37770b0b08eac533265d7f8049c598df047aa37",class:"card-face card-front"},null!=this.front?this.front:d("slot",{name:"front"})),d("div",{key:"2f8431017cfed9f9adb679442be833a65704d41e",class:"card-face card-back"},null!=this.back?this.back:d("slot",{name:"back"}))))}get el(){return this}static get watchers(){return{flipped:[{handleFlippedChange:0}]}}static get style(){return'.card{position:relative;width:100%;height:100%;transform-style:preserve-3d;transition:transform 0.6s ease;cursor:pointer}.card.flipped{transform:rotateY(180deg)}.card-face{position:absolute;width:100%;height:100%;backface-visibility:hidden;display:flex;align-items:center;justify-content:center}.card-back{transform:rotateY(180deg)}lido-container[template-id="flashcardtemplate"] #arrow{position:absolute !important;left:auto !important;top:50% !important;right:13.3% !important;transform:translateY(-50%);z-index:4 !important;overflow:visible}@media (orientation: portrait){lido-container[template-id="flashcardtemplate"] #arrow{right:-4.3% !important}}'}},[260,"lido-flash-card",{value:[1],height:[1],width:[1],ariaLabel:[1,"aria-label"],ariaHidden:[1,"aria-hidden"],x:[1],y:[1],z:[1],bgColor:[1,"bg-color"],type:[1],tabIndex:[2,"tab-index"],visible:[4],audio:[1],onTouch:[1,"on-touch"],onInCorrect:[1,"on-in-correct"],onCorrect:[1,"on-correct"],onEntry:[1,"on-entry"],direction:[1],display:[1],front:[8],back:[8],flipped:[1540],autoFlipAfter:[2,"auto-flip-after"],margin:[1],disableSpeak:[4,"disable-speak"],delayVisible:[1,"delay-visible"],style:[32]},void 0,{flipped:[{handleFlippedChange:0}]}]);function c(){"undefined"!=typeof customElements&&["lido-flash-card"].forEach((i=>{"lido-flash-card"===i&&(customElements.get(t(i))||customElements.define(t(i),l))}))}c();export{l as L,c as d}
@@ -1 +0,0 @@
1
- import{t,p as i,H as e,B as s,getAssetPath as n,c as o,k as r,E as a,F as h,s as l,f as c,w as d,g as u,j as f,a as w,h as g,b as m}from"./index.js";const v=i(class extends e{constructor(t){super(),!1!==t&&this.__registerHost(),this.showSpeakIcon=!1,this.id="",this.svgSource="",this.svgUrls=[],this.audioUrls=[],this.currentSvgIndex=0,this.moving=!1,this.value="",this.height="auto",this.width="auto",this.audio="",this.x="0px",this.y="0px",this.z="0",this.ariaLabel="",this.ariaHidden="",this.tabIndex=0,this.mode=s.ShowFlow,this.fingerHintUrl=n("assets/Tracing-hand.svg"),this.highlightTextId="",this.animationTrace=!1,this.delayVisible="",this.disableSpeak=!1,this.style={},this.handleWindowResize=()=>this.updateStyles(),this.handleWindowLoad=()=>this.updateStyles(),this.fileIndex=-1,this.isDragging=!1,this.activePointerId=null,this.activeTraceState=null,this.freeTraceUpdateCounter=0,this.idleTimer=null,this.fingerImg=null}async initializeSVG(){this.cleanupTraceState(this.activeTraceState);let t={fileIndex:-1,currentPathIndex:0,lastLength:0,totalPathLength:0,isDragging:!1,circle:null,paths:[],svg:null,proximityThreshold:60,freeTraceProximityThreshold:350,rafId:null,pointerMoveEvent:null,activePointerId:null,mode:this.mode,flowMarkers:[],freeTraceLines:[],currentFreePath:[],lastPointerPos:null,dragOffset:null,isCompletingPath:!1,touchProximityThreshold:null,pointerTransform:null,pointerRect:null};this.activeTraceState=t;const i=this.svgUrls[this.currentSvgIndex];i&&""!==i.trim()?(await this.fetchSVG(o(i)),await this.loadAnotherSVG(t,!0)):console.error("No SVG URL provided or index out of bounds.")}componentDidLoad(){r(this.el,this.delayVisible)}componentWillLoad(){this.updateStyles(),window.addEventListener("resize",this.handleWindowResize),window.addEventListener("load",this.handleWindowLoad),this.svgUrls=this.svgSource.split(";").map((t=>t.trim())),this.currentSvgIndex=0,this.showSpeakIcon&&(a(this.el),this.el.append(a(this.el))),this.initializeSVG()}disconnectedCallback(){window.removeEventListener("resize",this.handleWindowResize),window.removeEventListener("load",this.handleWindowLoad),this.cleanupTraceState(this.activeTraceState),this.activeTraceState=null}cleanupTraceState(t){var i;t&&(null===(i=t.cleanup)||void 0===i||i.call(t),t.rafId&&cancelAnimationFrame(t.rafId),t.rafId=null,t.pointerMoveEvent=null,t.pathSamples=[],t.paths=[],t.svg=null,null!==this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null),this.hideFingerHint())}resetIdleTimer(t){null!==this.idleTimer&&(clearTimeout(this.idleTimer),this.idleTimer=null),this.idleTimer=window.setTimeout((()=>{this.showFingerHint(t)}),3e3)}showFingerHint(t){var i;if(this.fingerImg)return;const e=t.paths[t.currentPathIndex];if(!e)return;const s=document.createElementNS("http://www.w3.org/2000/svg","image"),n=new Image;n.onload=()=>{s.setAttributeNS("http://www.w3.org/1999/xlink","href",o(this.fingerHintUrl))},n.onerror=()=>{s.setAttributeNS("http://www.w3.org/1999/xlink","href",o(h))},n.src=o(this.fingerHintUrl||h),s.setAttribute("width","40"),s.setAttribute("height","40"),s.setAttribute("id","lido-finger-hint"),s.style.pointerEvents="none",s.style.opacity="0.8",s.setAttribute("x","0"),s.setAttribute("y","0");const r=document.createElementNS("http://www.w3.org/2000/svg","animateMotion");r.setAttribute("dur","2s"),r.setAttribute("repeatCount","indefinite");const a=document.createElementNS("http://www.w3.org/2000/svg","mpath");a.setAttributeNS("http://www.w3.org/1999/xlink","href",`#${e.id}`),r.appendChild(a),s.appendChild(r),null===(i=t.svg)||void 0===i||i.appendChild(s),this.fingerImg=s}hideFingerHint(){this.fingerImg&&this.fingerImg.parentNode&&this.fingerImg.parentNode.removeChild(this.fingerImg),this.fingerImg=null}async fetchSVG(t){const i=await fetch(t);if(!i.ok)throw new Error(`Failed to fetch SVG (${t}): ${i.statusText}`);return await i.text()}calculateBoundingBox(t,i=22){let e=1/0,s=1/0,n=-1/0,o=-1/0;return t.forEach((t=>{const i=t.getTotalLength();for(let r=0;r<=100;r++){const a=t.getPointAtLength(r/100*i);a.x<e&&(e=a.x),a.y<s&&(s=a.y),a.x>n&&(n=a.x),a.y>o&&(o=a.y)}})),e-=i,s-=i,n+=i,o+=i,{minX:e,minY:s,maxX:n,maxY:o}}insertSVG(t){const i=document.getElementById("lido-svgContainer");if(!i)return;i.innerHTML=t;const e=i.querySelector("svg");e.classList.add("lido-trace-svg"),e.removeAttribute("width"),e.removeAttribute("height");const s=e.querySelectorAll("path, line"),n=this.calculateBoundingBox(Array.from(s));e.setAttribute("viewBox",`${n.minX} ${n.minY} ${n.maxX-n.minX} ${n.maxY-n.minY}`)}getSVGElement(){return document.getElementById("lido-svgContainer").querySelector("svg")}getPaths(t){return Array.from(t.querySelectorAll("path, line"))}createFlowMarkersForPath(t){var i;if(!t)return;const e=t.ownerSVGElement;if(!e)return;const s=document.createElementNS("http://www.w3.org/2000/svg","path");s.setAttribute("d",t.getAttribute("d")||""),s.setAttribute("stroke","blue"),s.setAttribute("stroke-width","2"),s.setAttribute("stroke-dasharray","6,6"),s.setAttribute("fill","none"),s.setAttribute("class","lido-flow-indicator"),null===(i=t.parentNode)||void 0===i||i.appendChild(s);let n=e.querySelector("defs#lido-flow-defs");n||(n=document.createElementNS("http://www.w3.org/2000/svg","defs"),n.setAttribute("id","lido-flow-defs"),e.insertBefore(n,e.firstChild));const o=`arrow-${Math.random().toString(36)}`,r=document.createElementNS("http://www.w3.org/2000/svg","marker");r.setAttribute("id",o),r.setAttribute("markerWidth","10"),r.setAttribute("markerHeight","10"),r.setAttribute("refX","5"),r.setAttribute("refY","5"),r.setAttribute("orient","auto"),r.setAttribute("markerUnits","strokeWidth");const a=document.createElementNS("http://www.w3.org/2000/svg","path");return a.setAttribute("d","M0,0 L10,5 L0,10 L2,5 Z"),a.setAttribute("fill","blue"),r.appendChild(a),n.appendChild(r),s.setAttribute("marker-end",`url(#${o})`),s}updateFlowIndicators(t){t.svg.querySelectorAll(".lido-flow-indicator").forEach((i=>{t.mode===s.NoFlow?i.style.display="none":t.mode===s.ShowFlow&&(i.style.display="block")}))}setupDrawingPath(t){t.paths.forEach(((i,e)=>{const n=i.getTotalLength();i._lidoTraceLength=n,i._lidoTraceStart=i.getPointAtLength(0),i._lidoTraceEnd=i.getPointAtLength(n),i._lidoTraceIsClosed=this.getDistanceSquared(i._lidoTraceStart,i._lidoTraceEnd)<200;const o=n/192||1,r=[];for(let t=0;t<=192;t++){const e=Math.min(n,t*o),s=i.getPointAtLength(e);r.push({x:s.x,y:s.y,length:e})}i._lidoTraceSamples=r,i._lidoTraceSampleStep=o,i.setAttribute("id","lido-path-"+e);const a=i.cloneNode();a.style.opacity="100",a.style["stroke-opacity"]="100";const h=i.style["stroke-width"]||i.getAttribute("stroke-width");a.setAttribute("stroke-width",h),a.setAttribute("stroke-dasharray",n.toString()),a.setAttribute("stroke-dashoffset",n.toString()),i.parentNode.appendChild(a,i),i.setAttribute("class","lido-trace-path"),a.setAttribute("class","lido-trace-path-green"),i.greenPath=a,i.classList.add(t.mode),t.mode===s.BlindTracing||t.mode===s.BlindFreeTrace?i.setAttribute("stroke","none"):(i.setAttribute("stroke","#000"),i.setAttribute("stroke-width",h),i.setAttribute("fill","none"),i.setAttribute("stroke-dasharray",n.toString()),i.setAttribute("stroke-dashoffset","0")),e===t.currentPathIndex&&t.mode===s.ShowFlow&&(t.flowMarkers=this.createFlowMarkersForPath(i))})),t.totalPathLength=t.paths[t.currentPathIndex]._lidoTraceLength}setupDraggableCircle(t){var i;const e=t.paths[0].getPointAtLength(0),s=document.createElementNS("http://www.w3.org/2000/svg","circle");t.paths[t.currentPathIndex].style["stroke-width"]||t.paths[t.currentPathIndex].getAttribute("stroke-width"),s.setAttribute("id","lido-draggableCircle"),s.setAttribute("cx",e.x.toString()),s.setAttribute("cy",e.y.toString()),s.setAttribute("r","20"),s.setAttribute("fill","#CF1565"),null===(i=t.svg)||void 0===i||i.appendChild(s),t.circle=s,this.resetIdleTimer(t)}addEventListeners(t){var i,e,s,n;if(!t.circle||!t.paths||0===t.paths.length)return;t.svg.style.touchAction="none",t.circle.style.touchAction="none";const o=i=>{i.preventDefault(),t.pointerRect=t.svg.getBoundingClientRect(),t.pointerTransform=this.getSvgViewBoxTransform(t.svg,t.pointerRect);const e=this.getPointerPosition(i,t.svg,t.pointerTransform,t.pointerRect),s={x:parseFloat(t.circle.getAttribute("cx")),y:parseFloat(t.circle.getAttribute("cy"))},n=this.getDistanceSquared(e,s),o=this.getProximityThresholdForEvent(t,i);if(n<=o*o||"touch"===i.pointerType){t.isDragging=!0,t.activePointerId=i.pointerId,t.dragOffset={x:e.x-s.x,y:e.y-s.y};try{t.circle.setPointerCapture(i.pointerId)}catch(t){}t.lastPointerPos=s}this.hideFingerHint(),this.resetIdleTimer(t)},r=i=>{t.isDragging&&i.pointerId===t.activePointerId&&(i.preventDefault(),t.pointerMoveEvent=i,t.rafId||(t.rafId=requestAnimationFrame((()=>{this.handlePointerMove(t),t.rafId=null}))))},a=i=>{i.pointerId===t.activePointerId&&(t.isDragging=!1,t.activePointerId=null,t.lastPointerPos=null,t.dragOffset=null,this.hideFingerHint(),this.resetIdleTimer(t))};null===(i=t.svg)||void 0===i||i.addEventListener("pointerup",a),null===(e=t.svg)||void 0===e||e.addEventListener("pointercancel",a);const h=t=>{t.preventDefault()};t.circle.addEventListener("pointerdown",o,{passive:!1}),null===(s=t.svg)||void 0===s||s.addEventListener("pointermove",r),null===(n=t.svg)||void 0===n||n.addEventListener("contextmenu",h),t.cleanup=()=>{var i,e,s,n,l;null===(i=t.circle)||void 0===i||i.removeEventListener("pointerdown",o),null===(e=t.svg)||void 0===e||e.removeEventListener("pointermove",r),null===(s=t.svg)||void 0===s||s.removeEventListener("pointerup",a),null===(n=t.svg)||void 0===n||n.removeEventListener("pointercancel",a),null===(l=t.svg)||void 0===l||l.removeEventListener("contextmenu",h),t.isDragging=!1,t.activePointerId=null}}async handlePointerMove(t){var i,e,n,o,r;if(!t.isDragging)return;if(!t.circle||!t.paths||0===t.paths.length)return;if(t.isCompletingPath)return;this.hideFingerHint();const a=t.pointerMoveEvent,h=this.getPointerPosition(a,t.svg,t.pointerTransform,t.pointerRect),l=t.dragOffset?{x:h.x-t.dragOffset.x,y:h.y-t.dragOffset.y}:h,c={x:parseFloat(t.circle.getAttribute("cx")),y:parseFloat(t.circle.getAttribute("cy"))};let d=1/0;if(t.lastPointerPos){const i=l.x-t.lastPointerPos.x,e=l.y-t.lastPointerPos.y;if(d=i*i+e*e,d<1)return}const u=t.paths[t.currentPathIndex];if(!u)return void console.error("No valid path found at the current index");const f=this.getProximityThresholdForEvent(t,a),w=f*f,g=this.getDistanceSquared(l,c),m="touch"===a.pointerType?Math.max(4*f,180):Math.max(2*f,120);if(g>m*m)return;const v=t.mode===s.FreeTrace||t.mode===s.BlindFreeTrace,p=this.getClosestPointOnPath(u,l,v?void 0:t.lastLength);if(this.getDistanceSquared(l,p)>w)return;if(v){if(this.freeTraceUpdateCounter=(this.freeTraceUpdateCounter||0)+1,this.freeTraceUpdateCounter%2!=0)return;if(t.currentFreePath||(t.currentFreePath=[]),!t.currentFreePath[t.currentPathIndex]){const e=document.createElementNS("http://www.w3.org/2000/svg","polyline"),s=t.paths[t.currentPathIndex].style["stroke-width"]||t.paths[t.currentPathIndex].getAttribute("stroke-width");e.setAttribute("stroke-width",s),e.setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke","lightgreen"),e.setAttribute("points",`${l.x},${l.y}`),null===(i=t.svg)||void 0===i||i.appendChild(e),t.currentFreePath[t.currentPathIndex]=e,t.currentFreePolylinePoints=t.currentFreePolylinePoints||[],t.currentFreePolylinePoints[t.currentPathIndex]=[{x:l.x,y:l.y}],t.lastPointerPos=l,t.freeTracePointsCount=1}const s=10;if(t.freeTracePointsCount=(t.freeTracePointsCount||1)+1,t.freeTracePointsCount>s)return;t.currentFreePolylinePoints=t.currentFreePolylinePoints||[];let n=t.currentFreePolylinePoints[t.currentPathIndex]||[];n.push({x:l.x,y:l.y}),t.currentFreePolylinePoints[t.currentPathIndex]=n;const o=n.map((t=>`${t.x},${t.y}`)).join(" ");return t.currentFreePath[t.currentPathIndex].setAttribute("points",o),t.circle.setAttribute("cx",l.x.toString()),t.circle.setAttribute("cy",l.y.toString()),t.circle.parentNode!==t.svg&&(null===(e=t.svg)||void 0===e||e.appendChild(t.circle)),t.lastPointerPos=l,void(n.length>=s&&(this.moveToNextPath(t),t.currentFreePath[t.currentPathIndex]=null,t.currentFreePolylinePoints[t.currentPathIndex]=[],t.freeTracePointsCount=0))}const x=Math.min("touch"===a.pointerType?480:320,Math.max("touch"===a.pointerType?220:160,.45*t.totalPathLength)),y=Math.min(60,Math.max(24,.12*t.totalPathLength));let k=p,b=k.length>=t.lastLength-20&&k.length-t.lastLength<=80;if(!b){const i=this.getClosestPointOnPath(u,l),e=this.getDistanceSquared(l,i);d>=64&&e<=w&&i.length>=t.lastLength-20&&i.length-t.lastLength<=x&&i.length<t.totalPathLength-y&&(k=i,b=!0)}if(t.isDragging&&b)if(t.lastLength=Math.max(t.lastLength,k.length),t.lastPointerPos=l,(Math.abs(k.x-c.x)>1||Math.abs(k.y-c.y)>1)&&(t.circle.setAttribute("cx",k.x.toString()),t.circle.setAttribute("cy",k.y.toString())),t.circle.parentNode!==t.svg&&(null===(n=t.svg)||void 0===n||n.appendChild(t.circle)),null===(o=u.greenPath)||void 0===o||o.setAttribute("stroke-dashoffset",(t.totalPathLength-t.lastLength).toString()),null!==(r=u._lidoTraceIsClosed)&&void 0!==r&&r&&t.totalPathLength>50){if(t.lastLength/t.totalPathLength>=.95){if(t.isCompletingPath)return;t.isCompletingPath=!0,await this.animatePathToEnd(t,u),t.currentPathIndex<t.paths.length-1?this.moveToNextPath(t):t.currentPathIndex===t.paths.length-1&&this.moveToNextContainer()}}else if(t.totalPathLength-1-t.lastLength<5&&t.currentPathIndex<t.paths.length-1){if(t.isCompletingPath)return;t.isCompletingPath=!0,this.moveToNextPath(t)}else if(t.totalPathLength-1-t.lastLength<5&&t.currentPathIndex===t.paths.length-1){if(t.isCompletingPath)return;t.isCompletingPath=!0,this.moveToNextContainer()}}animatePathToEnd(t,i,e=300){if(!i||!t.svg)return Promise.resolve();if(t._animatingToEnd)return Promise.resolve();t._animatingToEnd=!0;const s=t.lastLength||0,n=i.getTotalLength(),o=performance.now(),r=i.greenPath||i.parentNode&&i.parentNode.querySelector(".lido-trace-path-green");return new Promise((a=>{const h=l=>{const c=Math.min(1,(l-o)/e),d=s+(n-s)*c;t.lastLength=d;const u=i.getPointAtLength(d);if(t.circle&&(t.circle.setAttribute("cx",u.x.toString()),t.circle.setAttribute("cy",u.y.toString())),r&&r.setAttribute("stroke-dashoffset",(t.totalPathLength-d).toString()),c<1)requestAnimationFrame(h);else{if(t.lastLength=n,t.circle){const e=i.getPointAtLength(n);t.circle.setAttribute("cx",e.x.toString()),t.circle.setAttribute("cy",e.y.toString())}r&&r.setAttribute("stroke-dashoffset","0"),t._animatingToEnd=!1,a()}};requestAnimationFrame(h)}))}async moveToNextContainer(){if(this.isDragging=!1,this.moving)return;if(this.moving=!0,this.highlightTextId&&this.highlightLetter(this.currentSvgIndex),this.animationTrace&&await this.playTraceAnimation(),l(!0),this.currentSvgIndex<this.svgUrls.length-1)return await new Promise((t=>setTimeout(t,1e3))),this.currentSvgIndex++,await this.initializeSVG(),document.getElementById("lido-svgContainer").style.visibility="visible",this.moving=!1,void(this.el&&this.onCorrect&&await c(this.onCorrect,this.el));const t=document.querySelector(d),i=t.getAttribute("onCorrect");t&&i&&(await new Promise((t=>setTimeout(t,1e3))),await c(i,this.el)),u(),f()}getPointerPosition(t,i,e,s){var n;const o=this.getPointerPositionFromViewBox(t,i,e,s);if(o)return o;const r=i.createSVGPoint();r.x=t.clientX,r.y=t.clientY;const a=null===(n=i.getScreenCTM())||void 0===n?void 0:n.inverse();return a?r.matrixTransform(a):{x:t.clientX,y:t.clientY}}getPointerPositionFromViewBox(t,i,e,s){const n=s||i.getBoundingClientRect(),o=i.viewBox.baseVal;if(!(n.width&&n.height&&o.width&&o.height))return null;const{offsetX:r,offsetY:a,scaleX:h,scaleY:l}=e||this.getSvgViewBoxTransform(i,n);return{x:o.x+(t.clientX-n.left-r)/h,y:o.y+(t.clientY-n.top-a)/l}}getSvgViewBoxTransform(t,i=t.getBoundingClientRect()){const e=t.viewBox.baseVal,s=t.preserveAspectRatio.baseVal,n=i.width/e.width,o=i.height/e.height;if(1===s.align)return{offsetX:0,offsetY:0,scaleX:n,scaleY:o};const r=2===s.meetOrSlice?Math.max(n,o):Math.min(n,o),a=e.width*r,h=e.height*r;let l=0,c=0;const d=s.align;return 3===d||6===d||9===d?l=(i.width-a)/2:4!==d&&7!==d&&10!==d||(l=i.width-a),5===d||6===d||7===d?c=(i.height-h)/2:8!==d&&9!==d&&10!==d||(c=i.height-h),{offsetX:l,offsetY:c,scaleX:r,scaleY:r}}getProximityThresholdForEvent(t,i){const e=t.mode===s.FreeTrace||t.mode===s.BlindFreeTrace?t.freeTraceProximityThreshold:t.proximityThreshold;if("touch"!==(null==i?void 0:i.pointerType)||!t.svg)return e;const n=t.svg.getBoundingClientRect(),o=t.svg.viewBox.baseVal;if(!(n.width&&n.height&&o.width&&o.height))return e;const{scaleX:r,scaleY:a}=this.getSvgViewBoxTransform(t.svg,n),h=44*Math.max(1/r,1/a);return Math.max(e,h)}getDistanceSquared(t,i){const e=t.x-i.x,s=t.y-i.y;return e*e+s*s}getClosestPointOnPath(t,i,e){var s;const n=null!==(s=t._lidoTraceLength)&&void 0!==s?s:t.getTotalLength(),o=t._lidoTraceSamples,r=t._lidoTraceSampleStep;if((null==o?void 0:o.length)&&r){const s=void 0===e?n:150,a=void 0===e?0:Math.max(0,e-s),h=void 0===e?n:Math.min(n,e+s);let l=o[Math.max(0,Math.min(o.length-1,Math.round((e||0)/r)))],c=1/0;for(const t of o){if(t.length<a||t.length>h)continue;const e=this.getDistanceSquared(i,t);e<c&&(c=e,l=t)}const d=6,u=Math.max(a,l.length-r),f=Math.min(h,l.length+r);let w=Object.assign({},l),g=c;for(let e=u;e<=f;e+=d){const s=t.getPointAtLength(e),n=this.getDistanceSquared(i,s);n<g&&(g=n,w={x:s.x,y:s.y,length:e})}return w}let a={x:0,y:0,length:0},h=1/0,l=0,c=n;void 0!==e&&(l=Math.max(0,e-150),c=Math.min(n,e+150));let d={length:l};for(let e=l;e<=c;e+=40){const s=t.getPointAtLength(e),n=this.getDistanceSquared(i,s);n<h&&(h=n,d={x:s.x,y:s.y,length:e})}const u=Math.max(0,d.length-40),f=Math.min(n,d.length+40);h=1/0;for(let e=u;e<=f;e+=6){const s=t.getPointAtLength(e),n=this.getDistanceSquared(i,s);n<h&&(h=n,a={x:s.x,y:s.y,length:e})}return a}async loadAnotherSVG(t,i){t.isDragging=!1;try{t.svg&&this.cleanupPreviousSVG(t);const i=await this.fetchSVG(o(this.svgSource.split(";").map((t=>t.trim()))[this.currentSvgIndex]));this.insertSVG(i),t.svg=this.getSVGElement(),this.mode!==s.BlindTracing&&this.mode!==s.BlindFreeTrace||t.svg.querySelectorAll("image").forEach((t=>{t.style.display="none"})),t.paths=this.getPaths(t.svg),this.setupDrawingPath(t),this.setupDraggableCircle(t),this.addEventListeners(t)}catch(t){console.error(`Error loading SVG (${this.svgSource}):`,t)}}cleanupPreviousSVG(t){var i,e;t.circle&&(null===(i=t.svg)||void 0===i||i.removeChild(t.circle),t.circle=null),(null===(e=t.svg)||void 0===e?void 0:e.querySelectorAll(".lido-flow-indicator")).forEach((t=>{t.remove()})),t.currentPathIndex=0,t.lastLength=0,t.totalPathLength=t.paths[0].getTotalLength(),this.hideFingerHint(),this.resetIdleTimer(t)}async moveToNextPath(t){var i,e;if(t.isDragging=!1,t.currentPathIndex++,t.lastLength=0,t.isCompletingPath=!1,this.hideFingerHint(),t.currentPathIndex>=t.paths.length)return void this.moveToNextContainer();const n=t.paths[t.currentPathIndex];if(!n)return void console.error("No valid path found at the next index");t.totalPathLength=n.getTotalLength();const o=n.getPointAtLength(0);null===(i=t.circle)||void 0===i||i.setAttribute("cx",o.x.toString()),null===(e=t.circle)||void 0===e||e.setAttribute("cy",o.y.toString()),t.mode===s.ShowFlow&&(t.flowMarkers=this.createFlowMarkersForPath(n)),this.resetIdleTimer(t)}async playTraceAnimation(){const t=document.getElementById(this.id);t&&(t.classList.add("trace-animate"),await new Promise((t=>setTimeout(t,500))),t.classList.remove("trace-animate"))}async highlightLetter(t){if(!document.getElementById(d))return;const i=this.el;if(!i)return;const e=this.highlightTextId;if(!e)return;const s=document.getElementById(e);if(!s)return;const n=this.audio;if(!n)return;this.audioUrls=n.split(";").map((t=>t.trim()));const r=s.getAttribute("span-type");if(!r)return;const a=s.querySelector(".lido-text-content");if(a){if("letters"===r){const e=a.querySelectorAll(".text-letters");if(t<0||t>=e.length)return;const n=e[t];if(n){const t=i.querySelector("#lido-svgContainer");if(await c("this.alignMatch='true';",s,t),t.style.animation="trace-animation 0.4s forwards",t.style.setProperty("--trace-width",n.offsetWidth-5+"px"),t.style.setProperty("--trace-height",n.offsetHeight-5+"px"),await c("this.alignMatch='true';",n,t),setTimeout((()=>{n.classList.add("letter-highlight"),t.style.transform="",t.style.animation="",t.style.visibility="hidden"}),500),this.audioUrls[this.currentSvgIndex]){const t=new Audio(o(this.audioUrls[this.currentSvgIndex]));await t.play()}}}if("words"===r){const i=a.querySelectorAll(".text-words");if(t<0||t>=i.length)return;const e=i[t];if(e&&(e.classList.add("word-highlight"),this.audioUrls[this.currentSvgIndex])){const t=new Audio(o(this.audioUrls[this.currentSvgIndex]));await t.play()}}}}updateStyles(){const t=window.innerHeight>window.innerWidth?"portrait":"landscape";this.style={height:w(this.height,t),width:w(this.width,t),top:w(this.y,t),left:w(this.x,t),zIndex:this.z}}render(){return g(m,{key:"fecd265e2c8a5f7d391fe99e35739f76759da5b6",class:"lido-trace",id:this.id,audio:this.audio,onCorrect:this.onCorrect,onInCorrect:this.onInCorrect,style:this.style,"aria-label":this.ariaLabel,"aria-hidden":this.ariaHidden,tabindex:this.tabIndex,"disable-speak":this.disableSpeak},g("div",{key:"677681edfa9da3e7f8bea5f79d62900322262460",style:this.style,id:"lido-svgContainer"}))}static get assetsDirs(){return["assets"]}get el(){return this}static get watchers(){return{svgSource:[{initializeSVG:0}],mode:[{initializeSVG:0}]}}static get style(){return":host{display:block;position:relative}#lido-svgContainer{display:flex;justify-content:center;align-items:center;overflow:hidden}.lido-trace-svg{width:100%;height:100%;touch-action:none}#lido-draggableCircle{cursor:pointer;fill:#CF1565;transition:fill 0.2s, r 0.2s}.lido-blindTracing{stroke:none !important}.lido-blindFreeTrace{stroke:none !important}.lido-hovered{cursor:grab;fill:darkred}#lido-controls{position:fixed;bottom:0;left:0;right:0;display:flex;justify-content:space-between;padding:10px;background-color:#f0f0f0;border-top:1px solid #ccc}button{padding:10px;font-size:16px}@media (max-width: 600px){button{padding:8px;font-size:14px}}.lido-trace-path-green{}.lido-flow-indicator{stroke:blue;stroke-width:2;stroke-dasharray:6, 6;fill:none}.lido-trace{height:700px;width:700px;z-index:1;justify-items:center;align-content:center}.trace-animate{animation:trace-bounce 0.5s}@keyframes trace-bounce{0%{transform:scale(1)}30%{transform:scale(1.05)}60%{transform:scale(0.95)}100%{transform:scale(1)}}"}},[0,"lido-trace",{showSpeakIcon:[4,"show-speak-icon"],id:[1],svgSource:[1,"svg-source"],value:[1],height:[1],width:[1],audio:[1],x:[1],y:[1],z:[1],ariaLabel:[1,"aria-label"],ariaHidden:[1,"aria-hidden"],tabIndex:[2,"tab-index"],mode:[1],fingerHintUrl:[1,"finger-hint-url"],onInCorrect:[1,"on-in-correct"],onCorrect:[1,"on-correct"],highlightTextId:[1,"highlight-text-id"],animationTrace:[4,"animation-trace"],delayVisible:[1,"delay-visible"],disableSpeak:[4,"disable-speak"],svgUrls:[32],audioUrls:[32],currentSvgIndex:[32],moving:[32],style:[32],fileIndex:[32],isDragging:[32],activePointerId:[32],idleTimer:[32],fingerImg:[32]},void 0,{svgSource:[{initializeSVG:0}],mode:[{initializeSVG:0}]}]);function p(){"undefined"!=typeof customElements&&["lido-trace"].forEach((i=>{"lido-trace"===i&&(customElements.get(t(i))||customElements.define(t(i),v))}))}p();export{v as L,p as d}