@ourroadmaps/web-sdk 0.3.0 → 1.0.0
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.
- package/dist/chunk-46WI5367.cjs +900 -0
- package/dist/chunk-46WI5367.cjs.map +1 -0
- package/dist/{chunk-ZPPQHIRO.cjs → chunk-EKWWSLHU.cjs} +11 -2
- package/dist/chunk-EKWWSLHU.cjs.map +1 -0
- package/dist/chunk-HOJDCIWN.js +897 -0
- package/dist/chunk-HOJDCIWN.js.map +1 -0
- package/dist/{chunk-XFAAEDJK.js → chunk-JPUN7P3T.js} +11 -2
- package/dist/chunk-JPUN7P3T.js.map +1 -0
- package/dist/index.cjs +16 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/overlay/index.cjs +3 -3
- package/dist/overlay/index.js +1 -1
- package/dist/overlay.global.js +2 -2
- package/dist/overlay.global.js.map +1 -1
- package/dist/review/index.cjs +13 -0
- package/dist/review/index.cjs.map +1 -0
- package/dist/review/index.d.cts +42 -0
- package/dist/review/index.d.ts +42 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review.global.js +338 -0
- package/dist/review.global.js.map +1 -0
- package/package.json +11 -10
- package/dist/chunk-XFAAEDJK.js.map +0 -1
- package/dist/chunk-ZPPQHIRO.cjs.map +0 -1
package/dist/overlay.global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var OurRoadmaps=(()=>{var E=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var j=(i,e,t)=>e in i?E(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var q=(i,e)=>{for(var t in e)E(i,t,{get:e[t],enumerable:!0})},K=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of W(e))!z.call(i,o)&&o!==t&&E(i,o,{get:()=>e[o],enumerable:!(n=U(e,o))||n.enumerable});return i};var Y=i=>K(E({},"__esModule",{value:!0}),i);var s=(i,e,t)=>j(i,typeof e!="symbol"?e+"":e,t);var ct={};q(ct,{Overlay:()=>x,createOverlay:()=>lt});function d(i){return typeof i=="object"&&"selector"in i}function g(i){return typeof i=="object"&&"cursor"in i&&i.cursor===!0}function h(i){return typeof i=="object"&&"x"in i&&"y"in i&&!("selector"in i)}function _(i){return d(i)?document.querySelector(i.selector):null}function Q(i,e="center"){switch(e){case"top":return{x:i.left+i.width/2,y:i.top};case"bottom":return{x:i.left+i.width/2,y:i.bottom};case"left":return{x:i.left,y:i.top+i.height/2};case"right":return{x:i.right,y:i.top+i.height/2};case"top-left":return{x:i.left,y:i.top};case"top-right":return{x:i.right,y:i.top};case"bottom-left":return{x:i.left,y:i.bottom};case"bottom-right":return{x:i.right,y:i.bottom};case"center":return{x:i.left+i.width/2,y:i.top+i.height/2}}}function c(i,e){if(h(i))return i;if(g(i))return e;if(d(i)){let t=document.querySelector(i.selector);if(!t)return i.fallback??null;let n=t.getBoundingClientRect(),o=Q(n,i.anchor);return i.offset&&(o.x+=i.offset.x,o.y+=i.offset.y),o}return null}function D(i){let e=i.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth}var p={cursorMove:600,cursorClick:150,clickRipple:400,annotationIn:200,annotationOut:150,scrollPause:300},f={easeOut:"cubic-bezier(0, 0, 0.2, 1)",easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",linear:"linear"};function S(i){return new Promise(e=>setTimeout(e,i))}function I(){return[{opacity:0,transform:"scale(0.9)"},{opacity:1,transform:"scale(1)"}]}function B(){return[{opacity:1},{opacity:0}]}var u=class{constructor(e,t,n,o){s(this,"id");s(this,"config");s(this,"element",null);s(this,"container");s(this,"reducedMotion");s(this,"hideTimeout",null);s(this,"currentAnimation",null);this.id=e,this.config=t,this.container=n,this.reducedMotion=o}async show(){this.config.delay&&this.config.delay>0&&await new Promise(t=>setTimeout(t,this.config.delay)),this.element=this.createElement(),this.config.color&&this.element.style.setProperty("--annotation-color",this.config.color),this.container.appendChild(this.element);let e=this.reducedMotion?1:p.annotationIn;this.currentAnimation=this.element.animate(I(),{duration:e,easing:f.easeOut,fill:"forwards"}),await this.currentAnimation.finished,this.currentAnimation=null,this.config.duration&&this.config.duration>0&&(this.hideTimeout=setTimeout(()=>this.hide(),this.config.duration))}async hide(){if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null),!this.element)return;let e=this.reducedMotion?1:p.annotationOut;this.currentAnimation=this.element.animate(B(),{duration:e,easing:f.linear,fill:"forwards"}),await this.currentAnimation.finished,this.currentAnimation=null,this.element.remove(),this.element=null}cancelAnimations(){this.currentAnimation?.cancel(),this.currentAnimation=null}destroy(){this.hideTimeout&&clearTimeout(this.hideTimeout),this.cancelAnimations(),this.element?.remove()}};var L=12,T=8,y=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");s(this,"pathElement",null);s(this,"markerDef",null);this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","g");t.classList.add("arrow");let n=`arrowhead-${this.id}`;this.markerDef=document.createElementNS("http://www.w3.org/2000/svg","defs");let o=document.createElementNS("http://www.w3.org/2000/svg","marker");o.setAttribute("id",n),o.setAttribute("markerWidth",String(L)),o.setAttribute("markerHeight",String(T)),o.setAttribute("refX",String(L)),o.setAttribute("refY",String(T/2)),o.setAttribute("orient","auto"),o.setAttribute("markerUnits","userSpaceOnUse");let r=document.createElementNS("http://www.w3.org/2000/svg","polygon");return r.setAttribute("points",`0,0 ${L},${T/2} 0,${T}`),r.setAttribute("fill","currentColor"),o.appendChild(r),this.markerDef.appendChild(o),t.appendChild(this.markerDef),this.pathElement=document.createElementNS("http://www.w3.org/2000/svg","path"),this.pathElement.setAttribute("marker-end",`url(#${n})`),this.pathElement.setAttribute("fill","none"),this.pathElement.setAttribute("stroke","currentColor"),t.appendChild(this.pathElement),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}resolveTargetPoint(t){if(h(t))return c(t,this.cursorPosition);if(g(t))return this.cursorPosition;if(d(t)){let n=document.querySelector(t.selector);if(!n)return t.fallback??null;let o=n.getBoundingClientRect();return{x:o.left+o.width/2,y:o.top+o.height/2}}return null}updatePosition(){if(!this.pathElement)return;let t=this.config.from,n=this.config.to,o=this.resolveTargetPoint(t),r=this.resolveTargetPoint(n);if(!o||!r)return;let a=`M ${o.x} ${o.y} L ${r.x} ${r.y}`;this.pathElement.setAttribute("d",a)}async show(){await super.show(),this.updatePosition()}destroy(){this.pathElement=null,this.markerDef=null,super.destroy()}};var A=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElement("div");t.className="badge",t.textContent=String(this.config.number);let n=c(this.config.target,this.cursorPosition);return n&&(t.style.left=`${n.x}px`,t.style.top=`${n.y}px`),t}};var X=4,H=4,w=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","rect");return t.classList.add("box"),t.setAttribute("rx",String(H)),t.setAttribute("ry",String(H)),this.config.dashed&&t.setAttribute("stroke-dasharray","8 4"),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.element,n=this.config.target,o=this.config.padding??X,r;if(d(n)){let a=document.querySelector(n.selector);if(!a)return;r=a.getBoundingClientRect()}else if(h(n)){let a=c(n,this.cursorPosition);if(!a)return;let l=this.config.size?.width??100,m=this.config.size?.height??100;r=new DOMRect(a.x,a.y,l,m)}else return;t.setAttribute("x",String(r.left-o)),t.setAttribute("y",String(r.top-o)),t.setAttribute("width",String(r.width+o*2)),t.setAttribute("height",String(r.height+o*2))}async show(){await super.show(),this.updatePosition()}};var Z=4,b=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","ellipse");return t.classList.add("circle"),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.element,n=this.config.target,o=this.config.padding??Z,r;if(d(n)){let v=document.querySelector(n.selector);if(!v)return;r=v.getBoundingClientRect()}else if(h(n)){let v=c(n,this.cursorPosition);if(!v)return;let G=this.config.size?.width??100,F=this.config.size?.height??100;r=new DOMRect(v.x,v.y,G,F)}else return;let a=r.left+r.width/2,l=r.top+r.height/2,m=r.width/2+o,R=r.height/2+o;t.setAttribute("cx",String(a)),t.setAttribute("cy",String(l)),t.setAttribute("rx",String(m)),t.setAttribute("ry",String(R))}async show(){await super.show(),this.updatePosition()}};var J=8,C=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElement("div");return t.className="label",t.textContent=this.config.text,t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.config.target,n=this.config.position||"top",o=this.config.gap??J,r;if(g(t)){if(!this.cursorPosition)return;r=new DOMRect(this.cursorPosition.x,this.cursorPosition.y,0,0)}else if(h(t)){let l=c(t,this.cursorPosition);if(!l)return;r=new DOMRect(l.x,l.y,0,0)}else if(d(t)){let l=document.querySelector(t.selector);if(!l)return;r=l.getBoundingClientRect()}else return;let a=this.calculatePosition(r,n,o);this.element.style.left=`${a.x}px`,this.element.style.top=`${a.y}px`,this.element.style.transform=this.getTransform(n)}calculatePosition(t,n,o){let r=t.left+t.width/2,a=t.top+t.height/2;switch(n){case"top":return{x:r,y:t.top-o};case"top-left":return{x:t.left,y:t.top-o};case"top-right":return{x:t.right,y:t.top-o};case"bottom":return{x:r,y:t.bottom+o};case"bottom-left":return{x:t.left,y:t.bottom+o};case"bottom-right":return{x:t.right,y:t.bottom+o};case"left":return{x:t.left-o,y:a};case"right":return{x:t.right+o,y:a};default:return{x:r,y:t.top-o}}}getTransform(t){switch(t){case"top":case"bottom":return"translate(-50%, -100%)";case"top-left":case"bottom-left":return"translate(0, -100%)";case"top-right":case"bottom-right":return"translate(-100%, -100%)";case"left":return"translate(-100%, -50%)";case"right":return"translate(0, -50%)";default:return"translate(-50%, -100%)"}}async show(){await super.show(),this.updatePosition()}};var tt=0;function et(){return`ann-${++tt}`}var O=class{constructor(e,t,n,o,r){s(this,"config");s(this,"domContainer");s(this,"svgContainer");s(this,"annotations",new Map);s(this,"reducedMotion");s(this,"getCursorPosition");this.config=e,this.domContainer=t,this.svgContainer=n,this.reducedMotion=o,this.getCursorPosition=r}get activeIds(){return Array.from(this.annotations.keys())}show(e){return Array.isArray(e)?e.map(t=>this.showOne(t)):this.showOne(e)}showOne(e){let t=e.id??et(),n=this.getCursorPosition(),o={...e,color:e.color??this.config.color},r;switch(e.type){case"arrow":r=new y(t,o,this.svgContainer,this.reducedMotion,n);break;case"badge":r=new A(t,o,this.domContainer,this.reducedMotion,n);break;case"box":r=new w(t,o,this.svgContainer,this.reducedMotion,n);break;case"circle":r=new b(t,o,this.svgContainer,this.reducedMotion,n);break;case"label":r=new C(t,o,this.domContainer,this.reducedMotion,n);break;default:throw new Error(`Unknown annotation type: ${e.type}`)}return this.annotations.set(t,r),r.show(),t}hide(e){let t=Array.isArray(e)?e:[e];for(let n of t){let o=this.annotations.get(n);o&&(o.hide(),this.annotations.delete(n))}}hideAll(){for(let e of this.annotations.values())e.hide();this.annotations.clear()}arrow(e,t,n){return this.show({type:"arrow",from:e,to:t,...n})}badge(e,t,n){return this.show({type:"badge",target:e,number:t,...n})}box(e,t){return this.show({type:"box",target:e,...t})}circle(e,t){return this.show({type:"circle",target:e,...t})}label(e,t,n){return this.show({type:"label",target:e,text:t,...n})}cancelAllAnimations(){for(let e of this.annotations.values())e.cancelAnimations()}destroy(){for(let e of this.annotations.values())e.destroy();this.annotations.clear()}};function ot(i){let e=i.replace("#",""),t=parseInt(e,16);return[t>>16&255,t>>8&255,t&255]}function nt(i){let[e,t,n]=ot(i).map(o=>{let r=o/255;return r<=.03928?r/12.92:((r+.055)/1.055)**2.4});return .2126*e+.7152*t+.0722*n}function V(i){return nt(i)>.5?"black":"white"}async function N(i){let e=i.getBoundingClientRect();if(!(e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth))return new Promise(n=>{i.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});let o=new IntersectionObserver(r=>{r[0]?.isIntersecting&&(o.disconnect(),n())},{threshold:.5});o.observe(i),setTimeout(()=>{o.disconnect(),n()},1e3)})}var it=`<svg class="cursor-arrow" viewBox="0 0 24 24">
|
|
1
|
+
"use strict";var OurRoadmaps=(()=>{var E=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var j=(i,e,t)=>e in i?E(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var q=(i,e)=>{for(var t in e)E(i,t,{get:e[t],enumerable:!0})},K=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of W(e))!z.call(i,o)&&o!==t&&E(i,o,{get:()=>e[o],enumerable:!(n=U(e,o))||n.enumerable});return i};var Y=i=>K(E({},"__esModule",{value:!0}),i);var s=(i,e,t)=>j(i,typeof e!="symbol"?e+"":e,t);var ct={};q(ct,{Overlay:()=>x,createOverlay:()=>lt});function d(i){return typeof i=="object"&&"selector"in i}function g(i){return typeof i=="object"&&"cursor"in i&&i.cursor===!0}function h(i){return typeof i=="object"&&"x"in i&&"y"in i&&!("selector"in i)}function _(i){return d(i)?document.querySelector(i.selector):null}function Q(i,e="center"){switch(e){case"top":return{x:i.left+i.width/2,y:i.top};case"bottom":return{x:i.left+i.width/2,y:i.bottom};case"left":return{x:i.left,y:i.top+i.height/2};case"right":return{x:i.right,y:i.top+i.height/2};case"top-left":return{x:i.left,y:i.top};case"top-right":return{x:i.right,y:i.top};case"bottom-left":return{x:i.left,y:i.bottom};case"bottom-right":return{x:i.right,y:i.bottom};case"center":return{x:i.left+i.width/2,y:i.top+i.height/2}}}function c(i,e){if(h(i))return i;if(g(i))return e;if(d(i)){let t=document.querySelector(i.selector);if(!t)return i.fallback??null;let n=t.getBoundingClientRect(),o=Q(n,i.anchor);return i.offset&&(o.x+=i.offset.x,o.y+=i.offset.y),o}return null}function D(i){let e=i.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth}var p={cursorMove:600,cursorClick:150,clickRipple:400,annotationIn:200,annotationOut:150,scrollPause:300},f={easeOut:"cubic-bezier(0, 0, 0.2, 1)",easeInOut:"cubic-bezier(0.4, 0, 0.2, 1)",linear:"linear"};function S(i){return new Promise(e=>setTimeout(e,i))}function B(){return[{opacity:0,transform:"scale(0.9)"},{opacity:1,transform:"scale(1)"}]}function I(){return[{opacity:1},{opacity:0}]}var u=class{constructor(e,t,n,o){s(this,"id");s(this,"config");s(this,"element",null);s(this,"container");s(this,"reducedMotion");s(this,"hideTimeout",null);s(this,"currentAnimation",null);this.id=e,this.config=t,this.container=n,this.reducedMotion=o}async show(){this.config.delay&&this.config.delay>0&&await new Promise(t=>setTimeout(t,this.config.delay)),this.element=this.createElement(),this.config.color&&this.element.style.setProperty("--annotation-color",this.config.color),this.container.appendChild(this.element);let e=this.reducedMotion?1:p.annotationIn;this.currentAnimation=this.element.animate(B(),{duration:e,easing:f.easeOut,fill:"forwards"}),await this.currentAnimation.finished,this.currentAnimation=null,this.config.duration&&this.config.duration>0&&(this.hideTimeout=setTimeout(()=>this.hide(),this.config.duration))}async hide(){if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=null),!this.element)return;let e=this.reducedMotion?1:p.annotationOut;this.currentAnimation=this.element.animate(I(),{duration:e,easing:f.linear,fill:"forwards"}),await this.currentAnimation.finished,this.currentAnimation=null,this.element.remove(),this.element=null}cancelAnimations(){this.currentAnimation?.cancel(),this.currentAnimation=null}destroy(){this.hideTimeout&&clearTimeout(this.hideTimeout),this.cancelAnimations(),this.element?.remove()}};var L=12,T=8,y=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");s(this,"pathElement",null);s(this,"markerDef",null);this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","g");t.classList.add("arrow"),t.style.color=this.config.color??"#3B82F6";let n=`arrowhead-${this.id}`;this.markerDef=document.createElementNS("http://www.w3.org/2000/svg","defs");let o=document.createElementNS("http://www.w3.org/2000/svg","marker");o.setAttribute("id",n),o.setAttribute("markerWidth",String(L)),o.setAttribute("markerHeight",String(T)),o.setAttribute("refX",String(L)),o.setAttribute("refY",String(T/2)),o.setAttribute("orient","auto"),o.setAttribute("markerUnits","userSpaceOnUse");let r=document.createElementNS("http://www.w3.org/2000/svg","polygon");return r.setAttribute("points",`0,0 ${L},${T/2} 0,${T}`),r.setAttribute("fill","currentColor"),o.appendChild(r),this.markerDef.appendChild(o),t.appendChild(this.markerDef),this.pathElement=document.createElementNS("http://www.w3.org/2000/svg","path"),this.pathElement.setAttribute("marker-end",`url(#${n})`),this.pathElement.setAttribute("fill","none"),this.pathElement.setAttribute("stroke","currentColor"),t.appendChild(this.pathElement),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}resolveTargetPoint(t){if(h(t))return c(t,this.cursorPosition);if(g(t))return this.cursorPosition;if(d(t)){let n=document.querySelector(t.selector);if(!n)return t.fallback??null;let o=n.getBoundingClientRect();return{x:o.left+o.width/2,y:o.top+o.height/2}}return null}updatePosition(){if(!this.pathElement)return;let t=this.config.from,n=this.config.to,o=this.resolveTargetPoint(t),r=this.resolveTargetPoint(n);if(!o||!r)return;let a=`M ${o.x} ${o.y} L ${r.x} ${r.y}`;this.pathElement.setAttribute("d",a)}async show(){await super.show(),this.updatePosition()}destroy(){this.pathElement=null,this.markerDef=null,super.destroy()}};var A=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElement("div");t.className="badge",t.textContent=String(this.config.number);let n=c(this.config.target,this.cursorPosition);return n&&(t.style.left=`${n.x}px`,t.style.top=`${n.y}px`),t}};var X=4,H=4,b=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","rect");t.classList.add("box");let n=this.config.color??"#3B82F6";return t.setAttribute("stroke",n),t.setAttribute("stroke-width","2"),t.setAttribute("fill","none"),t.setAttribute("rx",String(H)),t.setAttribute("ry",String(H)),this.config.dashed&&t.setAttribute("stroke-dasharray","8 4"),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.element,n=this.config.target,o=this.config.padding??X,r;if(d(n)){let a=document.querySelector(n.selector);if(!a)return;r=a.getBoundingClientRect()}else if(h(n)){let a=c(n,this.cursorPosition);if(!a)return;let l=this.config.size?.width??100,m=this.config.size?.height??100;r=new DOMRect(a.x,a.y,l,m)}else return;t.setAttribute("x",String(r.left-o)),t.setAttribute("y",String(r.top-o)),t.setAttribute("width",String(r.width+o*2)),t.setAttribute("height",String(r.height+o*2))}async show(){await super.show(),this.updatePosition()}};var Z=4,w=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElementNS("http://www.w3.org/2000/svg","ellipse");t.classList.add("circle");let n=this.config.color??"#3B82F6";return t.setAttribute("stroke",n),t.setAttribute("stroke-width","2"),t.setAttribute("fill","none"),t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.element,n=this.config.target,o=this.config.padding??Z,r;if(d(n)){let v=document.querySelector(n.selector);if(!v)return;r=v.getBoundingClientRect()}else if(h(n)){let v=c(n,this.cursorPosition);if(!v)return;let G=this.config.size?.width??100,F=this.config.size?.height??100;r=new DOMRect(v.x,v.y,G,F)}else return;let a=r.left+r.width/2,l=r.top+r.height/2,m=r.width/2+o,R=r.height/2+o;t.setAttribute("cx",String(a)),t.setAttribute("cy",String(l)),t.setAttribute("rx",String(m)),t.setAttribute("ry",String(R))}async show(){await super.show(),this.updatePosition()}};var J=8,C=class extends u{constructor(t,n,o,r,a){super(t,n,o,r);s(this,"cursorPosition");this.cursorPosition=a}createElement(){let t=document.createElement("div");return t.className="label",t.textContent=this.config.text,t}setCursorPosition(t){this.cursorPosition=t,this.element&&this.updatePosition()}updatePosition(){if(!this.element)return;let t=this.config.target,n=this.config.position||"top",o=this.config.gap??J,r;if(g(t)){if(!this.cursorPosition)return;r=new DOMRect(this.cursorPosition.x,this.cursorPosition.y,0,0)}else if(h(t)){let l=c(t,this.cursorPosition);if(!l)return;r=new DOMRect(l.x,l.y,0,0)}else if(d(t)){let l=document.querySelector(t.selector);if(!l)return;r=l.getBoundingClientRect()}else return;let a=this.calculatePosition(r,n,o);this.element.style.left=`${a.x}px`,this.element.style.top=`${a.y}px`,this.element.style.transform=this.getTransform(n)}calculatePosition(t,n,o){let r=t.left+t.width/2,a=t.top+t.height/2;switch(n){case"top":return{x:r,y:t.top-o};case"top-left":return{x:t.left,y:t.top-o};case"top-right":return{x:t.right,y:t.top-o};case"bottom":return{x:r,y:t.bottom+o};case"bottom-left":return{x:t.left,y:t.bottom+o};case"bottom-right":return{x:t.right,y:t.bottom+o};case"left":return{x:t.left-o,y:a};case"right":return{x:t.right+o,y:a};default:return{x:r,y:t.top-o}}}getTransform(t){switch(t){case"top":case"bottom":return"translate(-50%, -100%)";case"top-left":case"bottom-left":return"translate(0, -100%)";case"top-right":case"bottom-right":return"translate(-100%, -100%)";case"left":return"translate(-100%, -50%)";case"right":return"translate(0, -50%)";default:return"translate(-50%, -100%)"}}async show(){await super.show(),this.updatePosition()}};var tt=0;function et(){return`ann-${++tt}`}var O=class{constructor(e,t,n,o,r){s(this,"config");s(this,"domContainer");s(this,"svgContainer");s(this,"annotations",new Map);s(this,"reducedMotion");s(this,"getCursorPosition");this.config=e,this.domContainer=t,this.svgContainer=n,this.reducedMotion=o,this.getCursorPosition=r}get activeIds(){return Array.from(this.annotations.keys())}show(e){return Array.isArray(e)?e.map(t=>this.showOne(t)):this.showOne(e)}showOne(e){let t=e.id??et(),n=this.getCursorPosition(),o={...e,color:e.color??this.config.color},r;switch(e.type){case"arrow":r=new y(t,o,this.svgContainer,this.reducedMotion,n);break;case"badge":r=new A(t,o,this.domContainer,this.reducedMotion,n);break;case"box":r=new b(t,o,this.svgContainer,this.reducedMotion,n);break;case"circle":r=new w(t,o,this.svgContainer,this.reducedMotion,n);break;case"label":r=new C(t,o,this.domContainer,this.reducedMotion,n);break;default:throw new Error(`Unknown annotation type: ${e.type}`)}return this.annotations.set(t,r),r.show(),t}hide(e){let t=Array.isArray(e)?e:[e];for(let n of t){let o=this.annotations.get(n);o&&(o.hide(),this.annotations.delete(n))}}hideAll(){for(let e of this.annotations.values())e.hide();this.annotations.clear()}arrow(e,t,n){return this.show({type:"arrow",from:e,to:t,...n})}badge(e,t,n){return this.show({type:"badge",target:e,number:t,...n})}box(e,t){return this.show({type:"box",target:e,...t})}circle(e,t){return this.show({type:"circle",target:e,...t})}label(e,t,n){return this.show({type:"label",target:e,text:t,...n})}cancelAllAnimations(){for(let e of this.annotations.values())e.cancelAnimations()}destroy(){for(let e of this.annotations.values())e.destroy();this.annotations.clear()}};function ot(i){let e=i.replace("#",""),t=parseInt(e,16);return[t>>16&255,t>>8&255,t&255]}function nt(i){let[e,t,n]=ot(i).map(o=>{let r=o/255;return r<=.03928?r/12.92:((r+.055)/1.055)**2.4});return .2126*e+.7152*t+.0722*n}function V(i){return nt(i)>.5?"black":"white"}async function N(i){let e=i.getBoundingClientRect();if(!(e.top>=0&&e.left>=0&&e.bottom<=window.innerHeight&&e.right<=window.innerWidth))return new Promise(n=>{i.scrollIntoView({behavior:"smooth",block:"center",inline:"center"});let o=new IntersectionObserver(r=>{r[0]?.isIntersecting&&(o.disconnect(),n())},{threshold:.5});o.observe(i),setTimeout(()=>{o.disconnect(),n()},1e3)})}var it=`<svg class="cursor-arrow" viewBox="0 0 24 24">
|
|
2
2
|
<path d="M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87a.5.5 0 0 0 .35-.85L6.35 2.85a.5.5 0 0 0-.85.36Z"/>
|
|
3
3
|
</svg>`,P=class{constructor(e,t){s(this,"container");s(this,"element");s(this,"labelElement");s(this,"rippleElement");s(this,"currentAnimation",null);s(this,"activeRipples",new Set);s(this,"_position",null);s(this,"_isVisible",!0);s(this,"reducedMotion");this.container=e,this.reducedMotion=t,this.element=document.createElement("div"),this.element.className="cursor",this.element.innerHTML=`${it}<div class="cursor-label">Guide</div>`,this.labelElement=this.element.querySelector(".cursor-label"),this.rippleElement=document.createElement("div"),this.rippleElement.className="click-ripple",e.appendChild(this.element),e.appendChild(this.rippleElement)}get position(){return this._position}get isVisible(){return this._isVisible}show(){this._isVisible=!0,this.element.classList.remove("hidden")}hide(){this._isVisible=!1,this.element.classList.add("hidden")}setName(e){this.labelElement.textContent=e}setColor(e){this.element.style.setProperty("--cursor-color",e),this.element.style.setProperty("--cursor-text-color",V(e))}async moveTo(e,t){let n=_(e);n&&!D(n)&&(await N(n),await S(p.scrollPause));let o=c(e,this._position);if(!o){console.warn("[Overlay] Target not found:",e);return}this.currentAnimation?.cancel();let r=this.reducedMotion?1:t?.duration??p.cursorMove,a=this._position??o;this.currentAnimation=this.element.animate([{transform:`translate(${a.x}px, ${a.y}px)`},{transform:`translate(${o.x}px, ${o.y}px)`}],{duration:r,easing:f.easeInOut,fill:"forwards"});try{await this.currentAnimation.finished,this._position=o}catch{}finally{this.currentAnimation=null}}async click(e){if(e&&await this.moveTo(e),!this._position)return;let t=this.reducedMotion?1:p.cursorClick,n=this.element.animate([{transform:`translate(${this._position.x}px, ${this._position.y}px) scale(1)`},{transform:`translate(${this._position.x}px, ${this._position.y}px) scale(0.85)`},{transform:`translate(${this._position.x}px, ${this._position.y}px) scale(1)`}],{duration:t,easing:f.easeOut});this.showRipple(this._position),await n.finished}showRipple(e){let t=this.rippleElement.cloneNode();t.style.left=`${e.x}px`,t.style.top=`${e.y}px`,this.container.appendChild(t),this.activeRipples.add(t);let n=this.reducedMotion?1:p.clickRipple,o=t.animate([{opacity:.4,transform:"translate(-50%, -50%) scale(0)"},{opacity:0,transform:"translate(-50%, -50%) scale(2)"}],{duration:n,easing:f.easeOut});o.onfinish=()=>{t.remove(),this.activeRipples.delete(t)}}cancelAnimations(){this.currentAnimation?.cancel(),this.currentAnimation=null;for(let e of this.activeRipples)e.remove();this.activeRipples.clear()}destroy(){this.cancelAnimations(),this.element.remove(),this.rippleElement.remove()}};var $=`
|
|
4
4
|
:host {
|
|
@@ -119,5 +119,5 @@
|
|
|
119
119
|
transition-duration: 0.01ms !important;
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
|
-
`;var
|
|
122
|
+
`;var k=class{constructor(e,t,n){s(this,"cursor");s(this,"annotations");s(this,"callbacks");s(this,"isRunning",!1);s(this,"currentIndex",0);s(this,"abortController",null);this.cursor=e,this.annotations=t,this.callbacks=n}get running(){return this.isRunning}get actionIndex(){return this.isRunning?this.currentIndex:null}async play(e){this.isRunning&&(console.warn("[Overlay] Stopping current playback to start new script"),this.stop()),this.isRunning=!0,this.currentIndex=0,this.abortController=new AbortController,e.cursor&&(e.cursor.name&&this.cursor.setName(e.cursor.name),e.cursor.color&&this.cursor.setColor(e.cursor.color),e.cursor.visible===!1?this.cursor.hide():this.cursor.show()),this.callbacks.onStart();try{for(let t=0;t<e.actions.length&&this.isRunning;t++){this.currentIndex=t;let n=e.actions[t];this.callbacks.onAction(n,t,"start");try{await this.executeAction(n)}catch(o){if(o instanceof Error&&o.name==="AbortError")break;this.callbacks.onError(o,n)}this.callbacks.onAction(n,t,"complete")}this.isRunning&&this.callbacks.onComplete()}finally{this.isRunning=!1,this.abortController=null}}stop(){this.isRunning&&(this.isRunning=!1,this.abortController?.abort(),this.cursor.cancelAnimations(),this.annotations.cancelAllAnimations(),this.callbacks.onStop())}async executeAction(e){switch(e.type){case"move":await this.executeMove(e);break;case"click":await this.executeClick(e);break;case"wait":await this.executeWait(e);break;case"setCursor":this.executeSetCursor(e);break;case"showAnnotations":this.executeShowAnnotations(e);break;case"hideAnnotations":this.executeHideAnnotations(e);break;default:console.warn("[Overlay] Unknown action type:",e.type)}}async executeMove(e){await this.cursor.moveTo(e.target,{duration:e.duration}),e.showAnnotations&&this.annotations.show(e.showAnnotations)}async executeClick(e){await this.cursor.click(e.target)}async executeWait(e){await S(e.duration)}executeSetCursor(e){e.visible!==void 0&&(e.visible?this.cursor.show():this.cursor.hide()),e.name&&this.cursor.setName(e.name),e.color&&this.cursor.setColor(e.color)}executeShowAnnotations(e){this.annotations.show(e.annotations)}executeHideAnnotations(e){e.ids?this.annotations.hide(e.ids):this.annotations.hideAll()}destroy(){this.stop()}};var rt="#3B82F6",st="#EF4444",at=9999,M=class M{constructor(e={}){s(this,"root");s(this,"shadow");s(this,"container");s(this,"svgContainer");s(this,"domContainer");s(this,"_cursor");s(this,"_annotations");s(this,"timeline");s(this,"reducedMotion");s(this,"motionQuery");s(this,"eventHandlers",new Map);s(this,"_isDestroyed",!1);s(this,"handleMotionChange",e=>{this.reducedMotion=e.matches});let t=e.container??document.body,n=e.zIndex??at;this.motionQuery=window.matchMedia("(prefers-reduced-motion: reduce)"),this.reducedMotion=this.motionQuery.matches,this.motionQuery.addEventListener("change",this.handleMotionChange),this.root=document.createElement("div"),this.root.id="ourroadmaps-overlay",this.shadow=this.root.attachShadow({mode:"open"});let o=document.createElement("style");o.textContent=$,this.shadow.appendChild(o),this.container=document.createElement("div"),this.container.className="overlay-container",this.container.style.setProperty("--overlay-z-index",String(n)),this.shadow.appendChild(this.container),this.svgContainer=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svgContainer.setAttribute("class","annotations-svg"),this.container.appendChild(this.svgContainer),this.domContainer=document.createElement("div"),this.domContainer.className="annotations-dom",this.container.appendChild(this.domContainer);let r={name:e.cursor?.name??"Guide",color:e.cursor?.color??rt,visible:e.cursor?.visible??!0};this._cursor=new P(this.container,this.reducedMotion),this._cursor.setName(r.name),this._cursor.setColor(r.color),r.visible||this._cursor.hide();let a={color:e.annotations?.color??st,strokeWidth:e.annotations?.strokeWidth??3};this._annotations=new O(a,this.domContainer,this.svgContainer,this.reducedMotion,()=>this._cursor.position),this.timeline=new k(this._cursor,this._annotations,{onStart:()=>this.emit("start"),onComplete:()=>this.emit("complete"),onStop:()=>this.emit("stop"),onError:(l,m)=>{this.emit("error",{code:"ANIMATION_FAILED",message:l.message,action:m})},onAction:(l,m,R)=>this.emit("action",l,m,R)}),t.appendChild(this.root)}get cursor(){return this._cursor}get annotations(){return this._annotations}get isPlaying(){return this.timeline.running}get currentActionIndex(){return this.timeline.actionIndex}get isDestroyed(){return this._isDestroyed}validateAction(e,t){let n=[];if(!e||typeof e!="object")return n.push(`Action ${t} must be an object`),n;let o=e;return M.VALID_ACTION_TYPES.includes(o.type)||n.push(`Action ${t} has invalid type: ${o.type}`),o.type==="wait"&&typeof o.duration!="number"&&n.push(`Wait action ${t} must have a numeric duration`),o.type==="move"&&!o.target&&n.push(`Move action ${t} must have a target`),n}validate(e){let t=[],n=[];if(!e||typeof e!="object")return t.push("Script must be an object"),{valid:!1,errors:t,warnings:n};let o=e;if(o.version!==1&&t.push("Script version must be 1"),!Array.isArray(o.actions))t.push("Script must have an actions array");else for(let r=0;r<o.actions.length;r++)t.push(...this.validateAction(o.actions[r],r));return{valid:t.length===0,errors:t,warnings:n}}async play(e){if(this._isDestroyed)throw new Error("Overlay has been destroyed");let t=this.validate(e);if(!t.valid)throw new Error(`Invalid script: ${t.errors.join(", ")}`);await this.timeline.play(e)}stop(){this.timeline.stop()}on(e,t){return this.eventHandlers.has(e)||this.eventHandlers.set(e,new Set),this.eventHandlers.get(e).add(t),()=>{this.eventHandlers.get(e)?.delete(t)}}emit(e,...t){let n=this.eventHandlers.get(e);if(n)for(let o of n)try{o(...t)}catch(r){console.error(`[Overlay] Error in ${e} handler:`,r)}}destroy(){this._isDestroyed||(this._isDestroyed=!0,this.timeline.destroy(),this._cursor.destroy(),this._annotations.destroy(),this.motionQuery.removeEventListener("change",this.handleMotionChange),this.eventHandlers.clear(),this.root.remove())}};s(M,"VALID_ACTION_TYPES",["move","click","wait","setCursor","showAnnotations","hideAnnotations"]);var x=M;function lt(i){return new x(i)}return Y(ct);})();
|
|
123
123
|
//# sourceMappingURL=overlay.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/overlay/index.ts","../src/overlay/targeting.ts","../src/overlay/animations.ts","../src/overlay/annotations/Base.ts","../src/overlay/annotations/Arrow.ts","../src/overlay/annotations/Badge.ts","../src/overlay/annotations/Box.ts","../src/overlay/annotations/Circle.ts","../src/overlay/annotations/Label.ts","../src/overlay/AnnotationManager.ts","../src/shared/colors.ts","../src/overlay/scroller.ts","../src/overlay/Cursor.ts","../src/overlay/styles.ts","../src/overlay/Timeline.ts","../src/overlay/Overlay.ts"],"sourcesContent":["import { Overlay } from './Overlay'\nimport type { OverlayController, OverlayOptions } from './types'\n\nexport { Overlay }\n\nexport function createOverlay(options?: OverlayOptions): OverlayController {\n return new Overlay(options)\n}\n\n// Re-export types\nexport type {\n Action,\n Anchor,\n Annotation,\n AnnotationBase,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n ClickAction,\n Coordinates,\n CursorConfig,\n CursorController,\n CursorTarget,\n HideAnnotationsAction,\n LabelAnnotation,\n LabelPosition,\n MoveAction,\n OverlayController,\n OverlayError,\n OverlayOptions,\n OverlayScript,\n OverlayScriptV1,\n SelectorTarget,\n SetCursorAction,\n ShowAnnotationsAction,\n Target,\n ValidationResult,\n WaitAction,\n} from './types'\n","import type { Anchor, Coordinates, CursorTarget, SelectorTarget, Target } from './types'\n\n/**\n * Type guard for SelectorTarget\n */\nexport function isSelectorTarget(target: Target): target is SelectorTarget {\n return typeof target === 'object' && 'selector' in target\n}\n\n/**\n * Type guard for CursorTarget\n */\nexport function isCursorTarget(target: Target): target is CursorTarget {\n return typeof target === 'object' && 'cursor' in target && target.cursor === true\n}\n\n/**\n * Type guard for Coordinates\n */\nexport function isCoordinates(target: Target): target is Coordinates {\n return typeof target === 'object' && 'x' in target && 'y' in target && !('selector' in target)\n}\n\n/**\n * Resolve a selector to an element\n */\nexport function resolveElement(target: Target): HTMLElement | null {\n if (isSelectorTarget(target)) {\n return document.querySelector(target.selector)\n }\n return null\n}\n\n/**\n * Calculate anchor position on a rect\n */\nfunction getAnchorPosition(rect: DOMRect, anchor: Anchor = 'center'): Coordinates {\n switch (anchor) {\n case 'top':\n return { x: rect.left + rect.width / 2, y: rect.top }\n case 'bottom':\n return { x: rect.left + rect.width / 2, y: rect.bottom }\n case 'left':\n return { x: rect.left, y: rect.top + rect.height / 2 }\n case 'right':\n return { x: rect.right, y: rect.top + rect.height / 2 }\n case 'top-left':\n return { x: rect.left, y: rect.top }\n case 'top-right':\n return { x: rect.right, y: rect.top }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom }\n case 'center':\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n}\n\n/**\n * Resolve a target to coordinates\n * @param target - The target to resolve\n * @param cursorPosition - Current cursor position (for CursorTarget)\n */\nexport function resolveCoordinates(\n target: Target,\n cursorPosition: Coordinates | null,\n): Coordinates | null {\n if (isCoordinates(target)) {\n return target\n }\n\n if (isCursorTarget(target)) {\n return cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n\n const rect = element.getBoundingClientRect()\n const position = getAnchorPosition(rect, target.anchor)\n\n if (target.offset) {\n position.x += target.offset.x\n position.y += target.offset.y\n }\n\n return position\n }\n\n return null\n}\n\n/**\n * Get bounding rect for a target\n */\nexport function getTargetRect(target: Target): DOMRect | null {\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n return element?.getBoundingClientRect() ?? null\n }\n return null\n}\n\n/**\n * Check if an element is in the viewport\n */\nexport function isInViewport(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n )\n}\n","/**\n * Animation duration constants (in milliseconds)\n */\nexport const DURATIONS = {\n cursorMove: 600,\n cursorClick: 150,\n clickRipple: 400,\n annotationIn: 200,\n annotationOut: 150,\n scrollPause: 300,\n} as const\n\n/**\n * CSS easing functions\n */\nexport const EASINGS = {\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n} as const\n\n/**\n * Promise-based delay utility\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Create keyframes for fade-in animation with scale\n */\nexport function fadeInKeyframes(): Keyframe[] {\n return [\n { opacity: 0, transform: 'scale(0.9)' },\n { opacity: 1, transform: 'scale(1)' },\n ]\n}\n\n/**\n * Create keyframes for fade-out animation\n */\nexport function fadeOutKeyframes(): Keyframe[] {\n return [{ opacity: 1 }, { opacity: 0 }]\n}\n\n/**\n * Run animation and return promise\n */\nexport function animate(\n element: HTMLElement | SVGElement,\n keyframes: Keyframe[],\n options: KeyframeAnimationOptions,\n): Animation {\n return element.animate(keyframes, options)\n}\n","import { DURATIONS, EASINGS, fadeInKeyframes, fadeOutKeyframes } from '../animations'\nimport type { Annotation } from '../types'\n\nexport abstract class BaseAnnotation {\n readonly id: string\n readonly config: Annotation\n protected element: HTMLElement | SVGElement | null = null\n protected container: Element\n protected reducedMotion: boolean\n private hideTimeout: ReturnType<typeof setTimeout> | null = null\n private currentAnimation: Animation | null = null\n\n constructor(id: string, config: Annotation, container: Element, reducedMotion: boolean) {\n this.id = id\n this.config = config\n this.container = container\n this.reducedMotion = reducedMotion\n }\n\n /**\n * Create and return the DOM/SVG element\n * Subclasses must implement this\n */\n protected abstract createElement(): HTMLElement | SVGElement\n\n /**\n * Render the annotation with animation\n */\n async show(): Promise<void> {\n // Wait for delay if specified\n if (this.config.delay && this.config.delay > 0) {\n await new Promise((r) => setTimeout(r, this.config.delay))\n }\n\n // Create element\n this.element = this.createElement()\n\n // Apply color if specified\n if (this.config.color) {\n this.element.style.setProperty('--annotation-color', this.config.color)\n }\n\n // Add to DOM\n this.container.appendChild(this.element)\n\n // Animate in\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationIn\n this.currentAnimation = this.element.animate(fadeInKeyframes(), {\n duration,\n easing: EASINGS.easeOut,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Set up auto-hide if duration is specified\n if (this.config.duration && this.config.duration > 0) {\n this.hideTimeout = setTimeout(() => this.hide(), this.config.duration)\n }\n }\n\n /**\n * Hide and remove the annotation\n */\n async hide(): Promise<void> {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n this.hideTimeout = null\n }\n\n if (!this.element) return\n\n // Animate out\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationOut\n this.currentAnimation = this.element.animate(fadeOutKeyframes(), {\n duration,\n easing: EASINGS.linear,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Remove from DOM\n this.element.remove()\n this.element = null\n }\n\n /**\n * Cancel any running animations\n */\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n }\n this.cancelAnimations()\n this.element?.remove()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { ArrowAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst ARROWHEAD_LENGTH = 12\nconst ARROWHEAD_WIDTH = 8\n\nexport class Arrow extends BaseAnnotation {\n declare readonly config: ArrowAnnotation\n private cursorPosition: Coordinates | null\n private pathElement: SVGPathElement | null = null\n private markerDef: SVGDefsElement | null = null\n\n constructor(\n id: string,\n config: ArrowAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGGElement {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n g.classList.add('arrow')\n\n // Create marker definition for arrowhead\n const markerId = `arrowhead-${this.id}`\n this.markerDef = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', markerId)\n marker.setAttribute('markerWidth', String(ARROWHEAD_LENGTH))\n marker.setAttribute('markerHeight', String(ARROWHEAD_WIDTH))\n marker.setAttribute('refX', String(ARROWHEAD_LENGTH))\n marker.setAttribute('refY', String(ARROWHEAD_WIDTH / 2))\n marker.setAttribute('orient', 'auto')\n marker.setAttribute('markerUnits', 'userSpaceOnUse')\n\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n polygon.setAttribute(\n 'points',\n `0,0 ${ARROWHEAD_LENGTH},${ARROWHEAD_WIDTH / 2} 0,${ARROWHEAD_WIDTH}`,\n )\n polygon.setAttribute('fill', 'currentColor')\n\n marker.appendChild(polygon)\n this.markerDef.appendChild(marker)\n g.appendChild(this.markerDef)\n\n // Create path for the line\n this.pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n this.pathElement.setAttribute('marker-end', `url(#${markerId})`)\n this.pathElement.setAttribute('fill', 'none')\n this.pathElement.setAttribute('stroke', 'currentColor')\n g.appendChild(this.pathElement)\n\n return g\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private resolveTargetPoint(\n target: Coordinates | { selector: string } | { cursor: true },\n ): Coordinates | null {\n if (isCoordinates(target)) {\n return resolveCoordinates(target, this.cursorPosition)\n }\n\n if (isCursorTarget(target)) {\n return this.cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n const rect = element.getBoundingClientRect()\n // Calculate center of element\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n\n return null\n }\n\n private updatePosition(): void {\n if (!this.pathElement) return\n\n const from = this.config.from\n const to = this.config.to\n\n const startPoint = this.resolveTargetPoint(from)\n const endPoint = this.resolveTargetPoint(to)\n\n if (!startPoint || !endPoint) return\n\n // Calculate path - straight line for now\n const d = `M ${startPoint.x} ${startPoint.y} L ${endPoint.x} ${endPoint.y}`\n this.pathElement.setAttribute('d', d)\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n\n override destroy(): void {\n this.pathElement = null\n this.markerDef = null\n super.destroy()\n }\n}\n","import { resolveCoordinates } from '../targeting'\nimport type { BadgeAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nexport class Badge extends BaseAnnotation {\n declare readonly config: BadgeAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BadgeAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const badge = document.createElement('div')\n badge.className = 'badge'\n badge.textContent = String(this.config.number)\n\n // Position the badge\n const coords = resolveCoordinates(this.config.target, this.cursorPosition)\n if (coords) {\n badge.style.left = `${coords.x}px`\n badge.style.top = `${coords.y}px`\n }\n\n return badge\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { BoxAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\nconst DEFAULT_RADIUS = 4\n\nexport class Box extends BaseAnnotation {\n declare readonly config: BoxAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BoxAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGRectElement {\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.classList.add('box')\n\n rect.setAttribute('rx', String(DEFAULT_RADIUS))\n rect.setAttribute('ry', String(DEFAULT_RADIUS))\n\n if (this.config.dashed) {\n rect.setAttribute('stroke-dasharray', '8 4')\n }\n\n return rect\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const rect = this.element as SVGRectElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n rect.setAttribute('x', String(bounds.left - padding))\n rect.setAttribute('y', String(bounds.top - padding))\n rect.setAttribute('width', String(bounds.width + padding * 2))\n rect.setAttribute('height', String(bounds.height + padding * 2))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { CircleAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\n\nexport class Circle extends BaseAnnotation {\n declare readonly config: CircleAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: CircleAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGEllipseElement {\n const ellipse = document.createElementNS('http://www.w3.org/2000/svg', 'ellipse')\n ellipse.classList.add('circle')\n\n return ellipse\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const ellipse = this.element as SVGEllipseElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n // Calculate center and radii\n const cx = bounds.left + bounds.width / 2\n const cy = bounds.top + bounds.height / 2\n const rx = bounds.width / 2 + padding\n const ry = bounds.height / 2 + padding\n\n ellipse.setAttribute('cx', String(cx))\n ellipse.setAttribute('cy', String(cy))\n ellipse.setAttribute('rx', String(rx))\n ellipse.setAttribute('ry', String(ry))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { Coordinates, LabelAnnotation, LabelPosition } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_GAP = 8\n\nexport class Label extends BaseAnnotation {\n declare readonly config: LabelAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: LabelAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const el = document.createElement('div')\n el.className = 'label'\n el.textContent = this.config.text\n return el\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const target = this.config.target\n const position = this.config.position || 'top'\n const gap = this.config.gap ?? DEFAULT_GAP\n\n let anchorRect: DOMRect\n\n if (isCursorTarget(target)) {\n if (!this.cursorPosition) return\n // Create a synthetic DOMRect for cursor position\n anchorRect = new DOMRect(this.cursorPosition.x, this.cursorPosition.y, 0, 0)\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n anchorRect = new DOMRect(resolved.x, resolved.y, 0, 0)\n } else if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n anchorRect = el.getBoundingClientRect()\n } else {\n return\n }\n\n const coords = this.calculatePosition(anchorRect, position, gap)\n this.element.style.left = `${coords.x}px`\n this.element.style.top = `${coords.y}px`\n this.element.style.transform = this.getTransform(position)\n }\n\n private calculatePosition(rect: DOMRect, position: LabelPosition, gap: number): Coordinates {\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n\n switch (position) {\n case 'top':\n return { x: centerX, y: rect.top - gap }\n case 'top-left':\n return { x: rect.left, y: rect.top - gap }\n case 'top-right':\n return { x: rect.right, y: rect.top - gap }\n case 'bottom':\n return { x: centerX, y: rect.bottom + gap }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom + gap }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom + gap }\n case 'left':\n return { x: rect.left - gap, y: centerY }\n case 'right':\n return { x: rect.right + gap, y: centerY }\n default:\n return { x: centerX, y: rect.top - gap }\n }\n }\n\n private getTransform(position: LabelPosition): string {\n switch (position) {\n case 'top':\n case 'bottom':\n return 'translate(-50%, -100%)'\n case 'top-left':\n case 'bottom-left':\n return 'translate(0, -100%)'\n case 'top-right':\n case 'bottom-right':\n return 'translate(-100%, -100%)'\n case 'left':\n return 'translate(-100%, -50%)'\n case 'right':\n return 'translate(0, -50%)'\n default:\n return 'translate(-50%, -100%)'\n }\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { Arrow, Badge, type BaseAnnotation, Box, Circle, Label } from './annotations'\nimport type {\n Annotation,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n Coordinates,\n LabelAnnotation,\n Target,\n} from './types'\n\ntype ArrowOptions = Omit<Partial<ArrowAnnotation>, 'type' | 'from' | 'to'>\ntype BadgeOptions = Omit<Partial<BadgeAnnotation>, 'type' | 'target' | 'number'>\ntype BoxOptions = Omit<Partial<BoxAnnotation>, 'type' | 'target'>\ntype CircleOptions = Omit<Partial<CircleAnnotation>, 'type' | 'target'>\ntype LabelOptions = Omit<Partial<LabelAnnotation>, 'type' | 'target' | 'text'>\n\nlet idCounter = 0\n\nfunction generateId(): string {\n return `ann-${++idCounter}`\n}\n\nexport class AnnotationManager implements AnnotationsController {\n private config: AnnotationsConfig\n private domContainer: HTMLElement\n private svgContainer: SVGSVGElement\n private annotations = new Map<string, BaseAnnotation>()\n private reducedMotion: boolean\n private getCursorPosition: () => Coordinates | null\n\n constructor(\n config: AnnotationsConfig,\n domContainer: HTMLElement,\n svgContainer: SVGSVGElement,\n reducedMotion: boolean,\n getCursorPosition: () => Coordinates | null,\n ) {\n this.config = config\n this.domContainer = domContainer\n this.svgContainer = svgContainer\n this.reducedMotion = reducedMotion\n this.getCursorPosition = getCursorPosition\n }\n\n get activeIds(): string[] {\n return Array.from(this.annotations.keys())\n }\n\n // Overloaded show method\n show(annotation: Annotation): string\n show(annotations: Annotation[]): string[]\n show(input: Annotation | Annotation[]): string | string[] {\n if (Array.isArray(input)) {\n return input.map((a) => this.showOne(a))\n }\n return this.showOne(input)\n }\n\n private showOne(annotation: Annotation): string {\n const id = annotation.id ?? generateId()\n const cursorPos = this.getCursorPosition()\n\n // Apply default color from config if not specified\n const annotationWithDefaults = {\n ...annotation,\n color: annotation.color ?? this.config.color,\n }\n\n let instance: BaseAnnotation\n\n switch (annotation.type) {\n case 'arrow':\n instance = new Arrow(\n id,\n annotationWithDefaults as ArrowAnnotation,\n this.svgContainer, // SVG for arrows\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'badge':\n instance = new Badge(\n id,\n annotationWithDefaults as BadgeAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'box':\n instance = new Box(\n id,\n annotationWithDefaults as BoxAnnotation,\n this.svgContainer, // SVG for boxes\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'circle':\n instance = new Circle(\n id,\n annotationWithDefaults as CircleAnnotation,\n this.svgContainer, // SVG for circles\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'label':\n instance = new Label(\n id,\n annotationWithDefaults as LabelAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n default:\n throw new Error(`Unknown annotation type: ${(annotation as Annotation).type}`)\n }\n\n this.annotations.set(id, instance)\n instance.show()\n\n return id\n }\n\n // Overloaded hide method\n hide(id: string): void\n hide(ids: string[]): void\n hide(input: string | string[]): void {\n const ids = Array.isArray(input) ? input : [input]\n for (const id of ids) {\n const annotation = this.annotations.get(id)\n if (annotation) {\n annotation.hide()\n this.annotations.delete(id)\n }\n }\n }\n\n hideAll(): void {\n for (const annotation of this.annotations.values()) {\n annotation.hide()\n }\n this.annotations.clear()\n }\n\n // Convenience methods\n arrow(from: Target, to: Target, options?: ArrowOptions): string {\n return this.show({ type: 'arrow', from, to, ...options })\n }\n\n badge(target: Target, number: number, options?: BadgeOptions): string {\n return this.show({ type: 'badge', target, number, ...options })\n }\n\n box(target: Target, options?: BoxOptions): string {\n return this.show({ type: 'box', target, ...options })\n }\n\n circle(target: Target, options?: CircleOptions): string {\n return this.show({ type: 'circle', target, ...options })\n }\n\n label(target: Target, text: string, options?: LabelOptions): string {\n return this.show({ type: 'label', target, text, ...options })\n }\n\n cancelAllAnimations(): void {\n for (const annotation of this.annotations.values()) {\n annotation.cancelAnimations()\n }\n }\n\n destroy(): void {\n for (const annotation of this.annotations.values()) {\n annotation.destroy()\n }\n this.annotations.clear()\n }\n}\n","/**\n * Convert hex color to RGB array\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const cleaned = hex.replace('#', '')\n const bigint = parseInt(cleaned, 16)\n return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255]\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1\n */\nexport function getLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const sRGB = c / 255\n return sRGB <= 0.03928 ? sRGB / 12.92 : ((sRGB + 0.055) / 1.055) ** 2.4\n })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/**\n * Get contrasting text color for a background\n */\nexport function getContrastColor(hex: string): 'white' | 'black' {\n return getLuminance(hex) > 0.5 ? 'black' : 'white'\n}\n","/**\n * Scroll element into view if not fully visible\n * Returns a promise that resolves when scroll is complete\n */\nexport async function scrollIntoViewIfNeeded(element: HTMLElement): Promise<void> {\n const rect = element.getBoundingClientRect()\n const isFullyVisible =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n\n if (isFullyVisible) {\n return\n }\n\n return new Promise((resolve) => {\n // Use scrollIntoView with smooth behavior\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n })\n\n // Wait for scroll to complete using IntersectionObserver\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry?.isIntersecting) {\n observer.disconnect()\n resolve()\n }\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n\n // Fallback timeout in case observer doesn't fire\n setTimeout(() => {\n observer.disconnect()\n resolve()\n }, 1000)\n })\n}\n","import { getContrastColor } from '../shared/colors'\nimport { DURATIONS, delay, EASINGS } from './animations'\nimport { scrollIntoViewIfNeeded } from './scroller'\nimport { isInViewport, resolveCoordinates, resolveElement } from './targeting'\nimport type { Coordinates, CursorController, Target } from './types'\n\nconst CURSOR_ARROW_SVG = `<svg class=\"cursor-arrow\" viewBox=\"0 0 24 24\">\n <path d=\"M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87a.5.5 0 0 0 .35-.85L6.35 2.85a.5.5 0 0 0-.85.36Z\"/>\n</svg>`\n\nexport class Cursor implements CursorController {\n private container: HTMLElement\n private element: HTMLDivElement\n private labelElement: HTMLDivElement\n private rippleElement: HTMLDivElement\n private currentAnimation: Animation | null = null\n private activeRipples = new Set<HTMLDivElement>()\n private _position: Coordinates | null = null\n private _isVisible = true\n private reducedMotion: boolean\n\n constructor(container: HTMLElement, reducedMotion: boolean) {\n this.container = container\n this.reducedMotion = reducedMotion\n\n // Create cursor element\n this.element = document.createElement('div')\n this.element.className = 'cursor'\n this.element.innerHTML = `${CURSOR_ARROW_SVG}<div class=\"cursor-label\">Guide</div>`\n this.labelElement = this.element.querySelector('.cursor-label') as HTMLDivElement\n\n // Create ripple element\n this.rippleElement = document.createElement('div')\n this.rippleElement.className = 'click-ripple'\n\n container.appendChild(this.element)\n container.appendChild(this.rippleElement)\n }\n\n get position(): Coordinates | null {\n return this._position\n }\n\n get isVisible(): boolean {\n return this._isVisible\n }\n\n show(): void {\n this._isVisible = true\n this.element.classList.remove('hidden')\n }\n\n hide(): void {\n this._isVisible = false\n this.element.classList.add('hidden')\n }\n\n setName(name: string): void {\n this.labelElement.textContent = name\n }\n\n setColor(color: string): void {\n this.element.style.setProperty('--cursor-color', color)\n this.element.style.setProperty('--cursor-text-color', getContrastColor(color))\n }\n\n async moveTo(target: Target, options?: { duration?: number }): Promise<void> {\n // Scroll element into view if needed\n const el = resolveElement(target)\n if (el && !isInViewport(el)) {\n await scrollIntoViewIfNeeded(el)\n await delay(DURATIONS.scrollPause)\n }\n\n // Resolve target coordinates\n const coords = resolveCoordinates(target, this._position)\n if (!coords) {\n console.warn('[Overlay] Target not found:', target)\n return\n }\n\n // Cancel any existing animation\n this.currentAnimation?.cancel()\n\n const duration = this.reducedMotion ? 1 : (options?.duration ?? DURATIONS.cursorMove)\n\n const from = this._position ?? coords\n\n this.currentAnimation = this.element.animate(\n [\n { transform: `translate(${from.x}px, ${from.y}px)` },\n { transform: `translate(${coords.x}px, ${coords.y}px)` },\n ],\n { duration, easing: EASINGS.easeInOut, fill: 'forwards' },\n )\n\n try {\n await this.currentAnimation.finished\n this._position = coords\n } catch {\n // Animation was cancelled\n } finally {\n this.currentAnimation = null\n }\n }\n\n async click(target?: Target): Promise<void> {\n // Move to target if provided\n if (target) {\n await this.moveTo(target)\n }\n\n if (!this._position) return\n\n const duration = this.reducedMotion ? 1 : DURATIONS.cursorClick\n\n // Press animation\n const pressAnimation = this.element.animate(\n [\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(0.85)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n // Show ripple\n this.showRipple(this._position)\n\n await pressAnimation.finished\n }\n\n private showRipple(position: Coordinates): void {\n const ripple = this.rippleElement.cloneNode() as HTMLDivElement\n ripple.style.left = `${position.x}px`\n ripple.style.top = `${position.y}px`\n this.container.appendChild(ripple)\n this.activeRipples.add(ripple)\n\n const duration = this.reducedMotion ? 1 : DURATIONS.clickRipple\n\n const animation = ripple.animate(\n [\n { opacity: 0.4, transform: 'translate(-50%, -50%) scale(0)' },\n { opacity: 0, transform: 'translate(-50%, -50%) scale(2)' },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n animation.onfinish = () => {\n ripple.remove()\n this.activeRipples.delete(ripple)\n }\n }\n\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n for (const r of this.activeRipples) {\n r.remove()\n }\n this.activeRipples.clear()\n }\n\n destroy(): void {\n this.cancelAnimations()\n this.element.remove()\n this.rippleElement.remove()\n }\n}\n","export const OVERLAY_STYLES = `\n:host {\n all: initial;\n}\n\n.overlay-container {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: var(--overlay-z-index, 9999);\n overflow: hidden;\n}\n\n/* Cursor */\n.cursor {\n position: absolute;\n display: flex;\n align-items: flex-start;\n gap: 2px;\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));\n will-change: transform;\n transition: opacity 0.15s ease-out;\n}\n\n.cursor.hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n.cursor-arrow {\n width: 20px;\n height: 20px;\n fill: var(--cursor-color, #3B82F6);\n}\n\n.cursor-label {\n background: var(--cursor-color, #3B82F6);\n color: var(--cursor-text-color, white);\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: 4px;\n white-space: nowrap;\n margin-top: 12px;\n}\n\n/* Click Ripple */\n.click-ripple {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--cursor-color, #3B82F6);\n opacity: 0;\n transform: translate(-50%, -50%) scale(0);\n pointer-events: none;\n}\n\n/* Annotations SVG Layer */\n.annotations-svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* Annotations DOM Layer */\n.annotations-dom {\n position: absolute;\n inset: 0;\n}\n\n/* Badge */\n.badge {\n position: absolute;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translate(-50%, -50%);\n}\n\n/* Label */\n.label {\n position: absolute;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: 6px;\n max-width: 280px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n}\n\n/* Note: Box, Circle, and Arrow annotations use SVG elements\n styled via attributes, not CSS classes */\n\n/* Reduced Motion */\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n`\n","import type { AnnotationManager } from './AnnotationManager'\nimport { delay } from './animations'\nimport type { Cursor } from './Cursor'\nimport type {\n Action,\n ClickAction,\n HideAnnotationsAction,\n MoveAction,\n OverlayScript,\n SetCursorAction,\n ShowAnnotationsAction,\n WaitAction,\n} from './types'\n\nexport interface TimelineCallbacks {\n onStart: () => void\n onComplete: () => void\n onStop: () => void\n onError: (error: Error, action?: Action) => void\n onAction: (action: Action, index: number, phase: 'start' | 'complete') => void\n}\n\nexport class Timeline {\n private cursor: Cursor\n private annotations: AnnotationManager\n private callbacks: TimelineCallbacks\n private isRunning = false\n private currentIndex = 0\n private abortController: AbortController | null = null\n\n constructor(cursor: Cursor, annotations: AnnotationManager, callbacks: TimelineCallbacks) {\n this.cursor = cursor\n this.annotations = annotations\n this.callbacks = callbacks\n }\n\n get running(): boolean {\n return this.isRunning\n }\n\n get actionIndex(): number | null {\n return this.isRunning ? this.currentIndex : null\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this.isRunning) {\n console.warn('[Overlay] Stopping current playback to start new script')\n this.stop()\n }\n\n this.isRunning = true\n this.currentIndex = 0\n this.abortController = new AbortController()\n\n // Apply script-level config\n if (script.cursor) {\n if (script.cursor.name) this.cursor.setName(script.cursor.name)\n if (script.cursor.color) this.cursor.setColor(script.cursor.color)\n if (script.cursor.visible === false) this.cursor.hide()\n else this.cursor.show()\n }\n\n this.callbacks.onStart()\n\n try {\n for (let i = 0; i < script.actions.length; i++) {\n if (!this.isRunning) break\n\n this.currentIndex = i\n const action = script.actions[i]\n\n this.callbacks.onAction(action, i, 'start')\n\n try {\n await this.executeAction(action)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n break\n }\n this.callbacks.onError(err as Error, action)\n // Continue to next action after error\n }\n\n this.callbacks.onAction(action, i, 'complete')\n }\n\n if (this.isRunning) {\n this.callbacks.onComplete()\n }\n } finally {\n this.isRunning = false\n this.abortController = null\n }\n }\n\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n this.abortController?.abort()\n\n // Cancel all animations\n this.cursor.cancelAnimations()\n this.annotations.cancelAllAnimations()\n\n this.callbacks.onStop()\n }\n\n private async executeAction(action: Action): Promise<void> {\n switch (action.type) {\n case 'move':\n await this.executeMove(action)\n break\n case 'click':\n await this.executeClick(action)\n break\n case 'wait':\n await this.executeWait(action)\n break\n case 'setCursor':\n this.executeSetCursor(action)\n break\n case 'showAnnotations':\n this.executeShowAnnotations(action)\n break\n case 'hideAnnotations':\n this.executeHideAnnotations(action)\n break\n default:\n console.warn('[Overlay] Unknown action type:', (action as Action).type)\n }\n }\n\n private async executeMove(action: MoveAction): Promise<void> {\n await this.cursor.moveTo(action.target, { duration: action.duration })\n\n // Simple mode: show annotations on arrival\n if (action.showAnnotations) {\n this.annotations.show(action.showAnnotations)\n }\n }\n\n private async executeClick(action: ClickAction): Promise<void> {\n await this.cursor.click(action.target)\n }\n\n private async executeWait(action: WaitAction): Promise<void> {\n await delay(action.duration)\n }\n\n private executeSetCursor(action: SetCursorAction): void {\n if (action.visible !== undefined) {\n if (action.visible) this.cursor.show()\n else this.cursor.hide()\n }\n if (action.name) this.cursor.setName(action.name)\n if (action.color) this.cursor.setColor(action.color)\n }\n\n private executeShowAnnotations(action: ShowAnnotationsAction): void {\n this.annotations.show(action.annotations)\n }\n\n private executeHideAnnotations(action: HideAnnotationsAction): void {\n if (action.ids) {\n this.annotations.hide(action.ids)\n } else {\n this.annotations.hideAll()\n }\n }\n\n destroy(): void {\n this.stop()\n }\n}\n","import { AnnotationManager } from './AnnotationManager'\nimport { Cursor } from './Cursor'\nimport { OVERLAY_STYLES } from './styles'\nimport { Timeline } from './Timeline'\nimport type {\n Action,\n AnnotationsController,\n CursorController,\n OverlayController,\n OverlayError,\n OverlayEventType,\n OverlayOptions,\n OverlayScript,\n ValidationResult,\n} from './types'\n\nconst DEFAULT_CURSOR_COLOR = '#3B82F6'\nconst DEFAULT_ANNOTATION_COLOR = '#EF4444'\nconst DEFAULT_Z_INDEX = 9999\n\ntype EventHandler =\n | (() => void)\n | ((error: OverlayError) => void)\n | ((action: Action, index: number, phase: 'start' | 'complete') => void)\n\nexport class Overlay implements OverlayController {\n private root: HTMLElement\n private shadow: ShadowRoot\n private container: HTMLElement\n private svgContainer: SVGSVGElement\n private domContainer: HTMLElement\n\n private _cursor: Cursor\n private _annotations: AnnotationManager\n private timeline: Timeline\n\n private reducedMotion: boolean\n private motionQuery: MediaQueryList\n\n private eventHandlers = new Map<OverlayEventType, Set<EventHandler>>()\n private _isDestroyed = false\n\n constructor(options: OverlayOptions = {}) {\n const parentContainer = options.container ?? document.body\n const zIndex = options.zIndex ?? DEFAULT_Z_INDEX\n\n // Check for reduced motion preference\n this.motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n this.reducedMotion = this.motionQuery.matches\n this.motionQuery.addEventListener('change', this.handleMotionChange)\n\n // Create root element\n this.root = document.createElement('div')\n this.root.id = 'ourroadmaps-overlay'\n\n // Create shadow DOM\n this.shadow = this.root.attachShadow({ mode: 'open' })\n\n // Add styles\n const styleEl = document.createElement('style')\n styleEl.textContent = OVERLAY_STYLES\n this.shadow.appendChild(styleEl)\n\n // Create container structure\n this.container = document.createElement('div')\n this.container.className = 'overlay-container'\n this.container.style.setProperty('--overlay-z-index', String(zIndex))\n this.shadow.appendChild(this.container)\n\n // Create SVG layer for arrows\n this.svgContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svgContainer.setAttribute('class', 'annotations-svg')\n this.container.appendChild(this.svgContainer)\n\n // Create DOM layer for other annotations\n this.domContainer = document.createElement('div')\n this.domContainer.className = 'annotations-dom'\n this.container.appendChild(this.domContainer)\n\n // Initialize cursor\n const cursorConfig = {\n name: options.cursor?.name ?? 'Guide',\n color: options.cursor?.color ?? DEFAULT_CURSOR_COLOR,\n visible: options.cursor?.visible ?? true,\n }\n\n this._cursor = new Cursor(this.container, this.reducedMotion)\n this._cursor.setName(cursorConfig.name)\n this._cursor.setColor(cursorConfig.color)\n if (!cursorConfig.visible) this._cursor.hide()\n\n // Initialize annotation manager\n const annotationsConfig = {\n color: options.annotations?.color ?? DEFAULT_ANNOTATION_COLOR,\n strokeWidth: options.annotations?.strokeWidth ?? 3,\n }\n\n this._annotations = new AnnotationManager(\n annotationsConfig,\n this.domContainer,\n this.svgContainer,\n this.reducedMotion,\n () => this._cursor.position,\n )\n\n // Initialize timeline\n this.timeline = new Timeline(this._cursor, this._annotations, {\n onStart: () => this.emit('start'),\n onComplete: () => this.emit('complete'),\n onStop: () => this.emit('stop'),\n onError: (error, action) => {\n this.emit('error', {\n code: 'ANIMATION_FAILED',\n message: error.message,\n action,\n })\n },\n onAction: (action, index, phase) => this.emit('action', action, index, phase),\n })\n\n // Mount to DOM\n parentContainer.appendChild(this.root)\n }\n\n // Note: Reduced motion preference is checked at construction time for cursor/annotations.\n // This handler updates our flag but doesn't propagate to already-constructed components.\n // This is acceptable since reduced motion is typically set before page interaction.\n private handleMotionChange = (e: MediaQueryListEvent): void => {\n this.reducedMotion = e.matches\n }\n\n // Controller interface\n get cursor(): CursorController {\n return this._cursor\n }\n\n get annotations(): AnnotationsController {\n return this._annotations\n }\n\n get isPlaying(): boolean {\n return this.timeline.running\n }\n\n get currentActionIndex(): number | null {\n return this.timeline.actionIndex\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n private static readonly VALID_ACTION_TYPES = [\n 'move',\n 'click',\n 'wait',\n 'setCursor',\n 'showAnnotations',\n 'hideAnnotations',\n ]\n\n private validateAction(action: unknown, index: number): string[] {\n const errors: string[] = []\n\n if (!action || typeof action !== 'object') {\n errors.push(`Action ${index} must be an object`)\n return errors\n }\n\n const a = action as Record<string, unknown>\n\n if (!Overlay.VALID_ACTION_TYPES.includes(a.type as string)) {\n errors.push(`Action ${index} has invalid type: ${a.type}`)\n }\n\n if (a.type === 'wait' && typeof a.duration !== 'number') {\n errors.push(`Wait action ${index} must have a numeric duration`)\n }\n\n if (a.type === 'move' && !a.target) {\n errors.push(`Move action ${index} must have a target`)\n }\n\n return errors\n }\n\n validate(script: unknown): ValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!script || typeof script !== 'object') {\n errors.push('Script must be an object')\n return { valid: false, errors, warnings }\n }\n\n const s = script as Record<string, unknown>\n\n if (s.version !== 1) {\n errors.push('Script version must be 1')\n }\n\n if (!Array.isArray(s.actions)) {\n errors.push('Script must have an actions array')\n } else {\n for (let i = 0; i < s.actions.length; i++) {\n errors.push(...this.validateAction(s.actions[i], i))\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this._isDestroyed) {\n throw new Error('Overlay has been destroyed')\n }\n\n const validation = this.validate(script)\n if (!validation.valid) {\n throw new Error(`Invalid script: ${validation.errors.join(', ')}`)\n }\n\n await this.timeline.play(script)\n }\n\n stop(): void {\n this.timeline.stop()\n }\n\n on(event: 'start', handler: () => void): () => void\n on(event: 'complete', handler: () => void): () => void\n on(event: 'stop', handler: () => void): () => void\n on(event: 'error', handler: (error: OverlayError) => void): () => void\n on(\n event: 'action',\n handler: (action: Action, index: number, phase: 'start' | 'complete') => void,\n ): () => void\n on(event: OverlayEventType, handler: EventHandler): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler)\n\n return () => {\n this.eventHandlers.get(event)?.delete(handler)\n }\n }\n\n private emit(event: 'start' | 'complete' | 'stop'): void\n private emit(event: 'error', error: OverlayError): void\n private emit(event: 'action', action: Action, index: number, phase: 'start' | 'complete'): void\n private emit(event: OverlayEventType, ...args: unknown[]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: Event handler args vary by event type\n ;(handler as any)(...args)\n } catch (err) {\n console.error(`[Overlay] Error in ${event} handler:`, err)\n }\n }\n }\n }\n\n destroy(): void {\n if (this._isDestroyed) return\n\n this._isDestroyed = true\n\n // Stop any running playback\n this.timeline.destroy()\n\n // Clean up components\n this._cursor.destroy()\n this._annotations.destroy()\n\n // Clean up motion listener\n this.motionQuery.removeEventListener('change', this.handleMotionChange)\n\n // Clear event handlers\n this.eventHandlers.clear()\n\n // Remove from DOM\n this.root.remove()\n }\n}\n"],"mappings":"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","names":["overlay_exports","__export","Overlay","createOverlay","isSelectorTarget","target","isCursorTarget","isCoordinates","resolveElement","getAnchorPosition","rect","anchor","resolveCoordinates","cursorPosition","element","position","isInViewport","element","rect","DURATIONS","EASINGS","delay","ms","resolve","fadeInKeyframes","fadeOutKeyframes","BaseAnnotation","id","config","container","reducedMotion","__publicField","r","duration","DURATIONS","fadeInKeyframes","EASINGS","fadeOutKeyframes","ARROWHEAD_LENGTH","ARROWHEAD_WIDTH","Arrow","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","g","markerId","marker","polygon","coords","target","isCoordinates","resolveCoordinates","isCursorTarget","isSelectorTarget","element","rect","from","to","startPoint","endPoint","d","Badge","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","badge","coords","resolveCoordinates","DEFAULT_PADDING","DEFAULT_RADIUS","Box","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","rect","coords","target","padding","bounds","isSelectorTarget","el","isCoordinates","resolved","resolveCoordinates","width","height","DEFAULT_PADDING","Circle","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","ellipse","coords","target","padding","bounds","isSelectorTarget","el","isCoordinates","resolved","resolveCoordinates","width","height","cx","cy","rx","ry","DEFAULT_GAP","Label","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","el","coords","target","position","gap","anchorRect","isCursorTarget","isCoordinates","resolved","resolveCoordinates","isSelectorTarget","rect","centerX","centerY","idCounter","generateId","AnnotationManager","config","domContainer","svgContainer","reducedMotion","getCursorPosition","__publicField","input","a","annotation","id","cursorPos","annotationWithDefaults","instance","Arrow","Badge","Box","Circle","Label","ids","from","to","options","target","number","text","hexToRgb","hex","cleaned","bigint","getLuminance","r","g","b","c","sRGB","getContrastColor","scrollIntoViewIfNeeded","element","rect","resolve","observer","entries","CURSOR_ARROW_SVG","Cursor","container","reducedMotion","__publicField","name","color","getContrastColor","target","options","el","resolveElement","isInViewport","scrollIntoViewIfNeeded","delay","DURATIONS","coords","resolveCoordinates","duration","from","EASINGS","pressAnimation","position","ripple","animation","r","OVERLAY_STYLES","Timeline","cursor","annotations","callbacks","__publicField","script","i","action","err","delay","DEFAULT_CURSOR_COLOR","DEFAULT_ANNOTATION_COLOR","DEFAULT_Z_INDEX","_Overlay","options","__publicField","parentContainer","zIndex","styleEl","OVERLAY_STYLES","cursorConfig","Cursor","annotationsConfig","AnnotationManager","Timeline","error","action","index","phase","errors","a","script","warnings","s","i","validation","event","handler","args","handlers","err","Overlay","createOverlay","options","Overlay"]}
|
|
1
|
+
{"version":3,"sources":["../src/overlay/index.ts","../src/overlay/targeting.ts","../src/overlay/animations.ts","../src/overlay/annotations/Base.ts","../src/overlay/annotations/Arrow.ts","../src/overlay/annotations/Badge.ts","../src/overlay/annotations/Box.ts","../src/overlay/annotations/Circle.ts","../src/overlay/annotations/Label.ts","../src/overlay/AnnotationManager.ts","../src/shared/colors.ts","../src/overlay/scroller.ts","../src/overlay/Cursor.ts","../src/overlay/styles.ts","../src/overlay/Timeline.ts","../src/overlay/Overlay.ts"],"sourcesContent":["import { Overlay } from './Overlay'\nimport type { OverlayController, OverlayOptions } from './types'\n\nexport { Overlay }\n\nexport function createOverlay(options?: OverlayOptions): OverlayController {\n return new Overlay(options)\n}\n\n// Re-export types\nexport type {\n Action,\n Anchor,\n Annotation,\n AnnotationBase,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n ClickAction,\n Coordinates,\n CursorConfig,\n CursorController,\n CursorTarget,\n HideAnnotationsAction,\n LabelAnnotation,\n LabelPosition,\n MoveAction,\n OverlayController,\n OverlayError,\n OverlayOptions,\n OverlayScript,\n OverlayScriptV1,\n SelectorTarget,\n SetCursorAction,\n ShowAnnotationsAction,\n Target,\n ValidationResult,\n WaitAction,\n} from './types'\n","import type { Anchor, Coordinates, CursorTarget, SelectorTarget, Target } from './types'\n\n/**\n * Type guard for SelectorTarget\n */\nexport function isSelectorTarget(target: Target): target is SelectorTarget {\n return typeof target === 'object' && 'selector' in target\n}\n\n/**\n * Type guard for CursorTarget\n */\nexport function isCursorTarget(target: Target): target is CursorTarget {\n return typeof target === 'object' && 'cursor' in target && target.cursor === true\n}\n\n/**\n * Type guard for Coordinates\n */\nexport function isCoordinates(target: Target): target is Coordinates {\n return typeof target === 'object' && 'x' in target && 'y' in target && !('selector' in target)\n}\n\n/**\n * Resolve a selector to an element\n */\nexport function resolveElement(target: Target): HTMLElement | null {\n if (isSelectorTarget(target)) {\n return document.querySelector(target.selector)\n }\n return null\n}\n\n/**\n * Calculate anchor position on a rect\n */\nfunction getAnchorPosition(rect: DOMRect, anchor: Anchor = 'center'): Coordinates {\n switch (anchor) {\n case 'top':\n return { x: rect.left + rect.width / 2, y: rect.top }\n case 'bottom':\n return { x: rect.left + rect.width / 2, y: rect.bottom }\n case 'left':\n return { x: rect.left, y: rect.top + rect.height / 2 }\n case 'right':\n return { x: rect.right, y: rect.top + rect.height / 2 }\n case 'top-left':\n return { x: rect.left, y: rect.top }\n case 'top-right':\n return { x: rect.right, y: rect.top }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom }\n case 'center':\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n}\n\n/**\n * Resolve a target to coordinates\n * @param target - The target to resolve\n * @param cursorPosition - Current cursor position (for CursorTarget)\n */\nexport function resolveCoordinates(\n target: Target,\n cursorPosition: Coordinates | null,\n): Coordinates | null {\n if (isCoordinates(target)) {\n return target\n }\n\n if (isCursorTarget(target)) {\n return cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n\n const rect = element.getBoundingClientRect()\n const position = getAnchorPosition(rect, target.anchor)\n\n if (target.offset) {\n position.x += target.offset.x\n position.y += target.offset.y\n }\n\n return position\n }\n\n return null\n}\n\n/**\n * Get bounding rect for a target\n */\nexport function getTargetRect(target: Target): DOMRect | null {\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n return element?.getBoundingClientRect() ?? null\n }\n return null\n}\n\n/**\n * Check if an element is in the viewport\n */\nexport function isInViewport(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n )\n}\n","/**\n * Animation duration constants (in milliseconds)\n */\nexport const DURATIONS = {\n cursorMove: 600,\n cursorClick: 150,\n clickRipple: 400,\n annotationIn: 200,\n annotationOut: 150,\n scrollPause: 300,\n} as const\n\n/**\n * CSS easing functions\n */\nexport const EASINGS = {\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n} as const\n\n/**\n * Promise-based delay utility\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Create keyframes for fade-in animation with scale\n */\nexport function fadeInKeyframes(): Keyframe[] {\n return [\n { opacity: 0, transform: 'scale(0.9)' },\n { opacity: 1, transform: 'scale(1)' },\n ]\n}\n\n/**\n * Create keyframes for fade-out animation\n */\nexport function fadeOutKeyframes(): Keyframe[] {\n return [{ opacity: 1 }, { opacity: 0 }]\n}\n\n/**\n * Run animation and return promise\n */\nexport function animate(\n element: HTMLElement | SVGElement,\n keyframes: Keyframe[],\n options: KeyframeAnimationOptions,\n): Animation {\n return element.animate(keyframes, options)\n}\n","import { DURATIONS, EASINGS, fadeInKeyframes, fadeOutKeyframes } from '../animations'\nimport type { Annotation } from '../types'\n\nexport abstract class BaseAnnotation {\n readonly id: string\n readonly config: Annotation\n protected element: HTMLElement | SVGElement | null = null\n protected container: Element\n protected reducedMotion: boolean\n private hideTimeout: ReturnType<typeof setTimeout> | null = null\n private currentAnimation: Animation | null = null\n\n constructor(id: string, config: Annotation, container: Element, reducedMotion: boolean) {\n this.id = id\n this.config = config\n this.container = container\n this.reducedMotion = reducedMotion\n }\n\n /**\n * Create and return the DOM/SVG element\n * Subclasses must implement this\n */\n protected abstract createElement(): HTMLElement | SVGElement\n\n /**\n * Render the annotation with animation\n */\n async show(): Promise<void> {\n // Wait for delay if specified\n if (this.config.delay && this.config.delay > 0) {\n await new Promise((r) => setTimeout(r, this.config.delay))\n }\n\n // Create element\n this.element = this.createElement()\n\n // Apply color if specified\n if (this.config.color) {\n this.element.style.setProperty('--annotation-color', this.config.color)\n }\n\n // Add to DOM\n this.container.appendChild(this.element)\n\n // Animate in\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationIn\n this.currentAnimation = this.element.animate(fadeInKeyframes(), {\n duration,\n easing: EASINGS.easeOut,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Set up auto-hide if duration is specified\n if (this.config.duration && this.config.duration > 0) {\n this.hideTimeout = setTimeout(() => this.hide(), this.config.duration)\n }\n }\n\n /**\n * Hide and remove the annotation\n */\n async hide(): Promise<void> {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n this.hideTimeout = null\n }\n\n if (!this.element) return\n\n // Animate out\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationOut\n this.currentAnimation = this.element.animate(fadeOutKeyframes(), {\n duration,\n easing: EASINGS.linear,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Remove from DOM\n this.element.remove()\n this.element = null\n }\n\n /**\n * Cancel any running animations\n */\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n }\n this.cancelAnimations()\n this.element?.remove()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { ArrowAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst ARROWHEAD_LENGTH = 12\nconst ARROWHEAD_WIDTH = 8\n\nexport class Arrow extends BaseAnnotation {\n declare readonly config: ArrowAnnotation\n private cursorPosition: Coordinates | null\n private pathElement: SVGPathElement | null = null\n private markerDef: SVGDefsElement | null = null\n\n constructor(\n id: string,\n config: ArrowAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGGElement {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n g.classList.add('arrow')\n g.style.color = this.config.color ?? '#3B82F6'\n\n // Create marker definition for arrowhead\n const markerId = `arrowhead-${this.id}`\n this.markerDef = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', markerId)\n marker.setAttribute('markerWidth', String(ARROWHEAD_LENGTH))\n marker.setAttribute('markerHeight', String(ARROWHEAD_WIDTH))\n marker.setAttribute('refX', String(ARROWHEAD_LENGTH))\n marker.setAttribute('refY', String(ARROWHEAD_WIDTH / 2))\n marker.setAttribute('orient', 'auto')\n marker.setAttribute('markerUnits', 'userSpaceOnUse')\n\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n polygon.setAttribute(\n 'points',\n `0,0 ${ARROWHEAD_LENGTH},${ARROWHEAD_WIDTH / 2} 0,${ARROWHEAD_WIDTH}`,\n )\n polygon.setAttribute('fill', 'currentColor')\n\n marker.appendChild(polygon)\n this.markerDef.appendChild(marker)\n g.appendChild(this.markerDef)\n\n // Create path for the line\n this.pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n this.pathElement.setAttribute('marker-end', `url(#${markerId})`)\n this.pathElement.setAttribute('fill', 'none')\n this.pathElement.setAttribute('stroke', 'currentColor')\n g.appendChild(this.pathElement)\n\n return g\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private resolveTargetPoint(\n target: Coordinates | { selector: string } | { cursor: true },\n ): Coordinates | null {\n if (isCoordinates(target)) {\n return resolveCoordinates(target, this.cursorPosition)\n }\n\n if (isCursorTarget(target)) {\n return this.cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n const rect = element.getBoundingClientRect()\n // Calculate center of element\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n\n return null\n }\n\n private updatePosition(): void {\n if (!this.pathElement) return\n\n const from = this.config.from\n const to = this.config.to\n\n const startPoint = this.resolveTargetPoint(from)\n const endPoint = this.resolveTargetPoint(to)\n\n if (!startPoint || !endPoint) return\n\n // Calculate path - straight line for now\n const d = `M ${startPoint.x} ${startPoint.y} L ${endPoint.x} ${endPoint.y}`\n this.pathElement.setAttribute('d', d)\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n\n override destroy(): void {\n this.pathElement = null\n this.markerDef = null\n super.destroy()\n }\n}\n","import { resolveCoordinates } from '../targeting'\nimport type { BadgeAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nexport class Badge extends BaseAnnotation {\n declare readonly config: BadgeAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BadgeAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const badge = document.createElement('div')\n badge.className = 'badge'\n badge.textContent = String(this.config.number)\n\n // Position the badge\n const coords = resolveCoordinates(this.config.target, this.cursorPosition)\n if (coords) {\n badge.style.left = `${coords.x}px`\n badge.style.top = `${coords.y}px`\n }\n\n return badge\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { BoxAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\nconst DEFAULT_RADIUS = 4\n\nexport class Box extends BaseAnnotation {\n declare readonly config: BoxAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BoxAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGRectElement {\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.classList.add('box')\n\n const color = this.config.color ?? '#3B82F6'\n rect.setAttribute('stroke', color)\n rect.setAttribute('stroke-width', '2')\n rect.setAttribute('fill', 'none')\n\n rect.setAttribute('rx', String(DEFAULT_RADIUS))\n rect.setAttribute('ry', String(DEFAULT_RADIUS))\n\n if (this.config.dashed) {\n rect.setAttribute('stroke-dasharray', '8 4')\n }\n\n return rect\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const rect = this.element as SVGRectElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n rect.setAttribute('x', String(bounds.left - padding))\n rect.setAttribute('y', String(bounds.top - padding))\n rect.setAttribute('width', String(bounds.width + padding * 2))\n rect.setAttribute('height', String(bounds.height + padding * 2))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { CircleAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\n\nexport class Circle extends BaseAnnotation {\n declare readonly config: CircleAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: CircleAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGEllipseElement {\n const ellipse = document.createElementNS('http://www.w3.org/2000/svg', 'ellipse')\n ellipse.classList.add('circle')\n\n const color = this.config.color ?? '#3B82F6'\n ellipse.setAttribute('stroke', color)\n ellipse.setAttribute('stroke-width', '2')\n ellipse.setAttribute('fill', 'none')\n\n return ellipse\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const ellipse = this.element as SVGEllipseElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n // Calculate center and radii\n const cx = bounds.left + bounds.width / 2\n const cy = bounds.top + bounds.height / 2\n const rx = bounds.width / 2 + padding\n const ry = bounds.height / 2 + padding\n\n ellipse.setAttribute('cx', String(cx))\n ellipse.setAttribute('cy', String(cy))\n ellipse.setAttribute('rx', String(rx))\n ellipse.setAttribute('ry', String(ry))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { Coordinates, LabelAnnotation, LabelPosition } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_GAP = 8\n\nexport class Label extends BaseAnnotation {\n declare readonly config: LabelAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: LabelAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const el = document.createElement('div')\n el.className = 'label'\n el.textContent = this.config.text\n return el\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const target = this.config.target\n const position = this.config.position || 'top'\n const gap = this.config.gap ?? DEFAULT_GAP\n\n let anchorRect: DOMRect\n\n if (isCursorTarget(target)) {\n if (!this.cursorPosition) return\n // Create a synthetic DOMRect for cursor position\n anchorRect = new DOMRect(this.cursorPosition.x, this.cursorPosition.y, 0, 0)\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n anchorRect = new DOMRect(resolved.x, resolved.y, 0, 0)\n } else if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n anchorRect = el.getBoundingClientRect()\n } else {\n return\n }\n\n const coords = this.calculatePosition(anchorRect, position, gap)\n this.element.style.left = `${coords.x}px`\n this.element.style.top = `${coords.y}px`\n this.element.style.transform = this.getTransform(position)\n }\n\n private calculatePosition(rect: DOMRect, position: LabelPosition, gap: number): Coordinates {\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n\n switch (position) {\n case 'top':\n return { x: centerX, y: rect.top - gap }\n case 'top-left':\n return { x: rect.left, y: rect.top - gap }\n case 'top-right':\n return { x: rect.right, y: rect.top - gap }\n case 'bottom':\n return { x: centerX, y: rect.bottom + gap }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom + gap }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom + gap }\n case 'left':\n return { x: rect.left - gap, y: centerY }\n case 'right':\n return { x: rect.right + gap, y: centerY }\n default:\n return { x: centerX, y: rect.top - gap }\n }\n }\n\n private getTransform(position: LabelPosition): string {\n switch (position) {\n case 'top':\n case 'bottom':\n return 'translate(-50%, -100%)'\n case 'top-left':\n case 'bottom-left':\n return 'translate(0, -100%)'\n case 'top-right':\n case 'bottom-right':\n return 'translate(-100%, -100%)'\n case 'left':\n return 'translate(-100%, -50%)'\n case 'right':\n return 'translate(0, -50%)'\n default:\n return 'translate(-50%, -100%)'\n }\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { Arrow, Badge, type BaseAnnotation, Box, Circle, Label } from './annotations'\nimport type {\n Annotation,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n Coordinates,\n LabelAnnotation,\n Target,\n} from './types'\n\ntype ArrowOptions = Omit<Partial<ArrowAnnotation>, 'type' | 'from' | 'to'>\ntype BadgeOptions = Omit<Partial<BadgeAnnotation>, 'type' | 'target' | 'number'>\ntype BoxOptions = Omit<Partial<BoxAnnotation>, 'type' | 'target'>\ntype CircleOptions = Omit<Partial<CircleAnnotation>, 'type' | 'target'>\ntype LabelOptions = Omit<Partial<LabelAnnotation>, 'type' | 'target' | 'text'>\n\nlet idCounter = 0\n\nfunction generateId(): string {\n return `ann-${++idCounter}`\n}\n\nexport class AnnotationManager implements AnnotationsController {\n private config: AnnotationsConfig\n private domContainer: HTMLElement\n private svgContainer: SVGSVGElement\n private annotations = new Map<string, BaseAnnotation>()\n private reducedMotion: boolean\n private getCursorPosition: () => Coordinates | null\n\n constructor(\n config: AnnotationsConfig,\n domContainer: HTMLElement,\n svgContainer: SVGSVGElement,\n reducedMotion: boolean,\n getCursorPosition: () => Coordinates | null,\n ) {\n this.config = config\n this.domContainer = domContainer\n this.svgContainer = svgContainer\n this.reducedMotion = reducedMotion\n this.getCursorPosition = getCursorPosition\n }\n\n get activeIds(): string[] {\n return Array.from(this.annotations.keys())\n }\n\n // Overloaded show method\n show(annotation: Annotation): string\n show(annotations: Annotation[]): string[]\n show(input: Annotation | Annotation[]): string | string[] {\n if (Array.isArray(input)) {\n return input.map((a) => this.showOne(a))\n }\n return this.showOne(input)\n }\n\n private showOne(annotation: Annotation): string {\n const id = annotation.id ?? generateId()\n const cursorPos = this.getCursorPosition()\n\n // Apply default color from config if not specified\n const annotationWithDefaults = {\n ...annotation,\n color: annotation.color ?? this.config.color,\n }\n\n let instance: BaseAnnotation\n\n switch (annotation.type) {\n case 'arrow':\n instance = new Arrow(\n id,\n annotationWithDefaults as ArrowAnnotation,\n this.svgContainer, // SVG for arrows\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'badge':\n instance = new Badge(\n id,\n annotationWithDefaults as BadgeAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'box':\n instance = new Box(\n id,\n annotationWithDefaults as BoxAnnotation,\n this.svgContainer, // SVG for boxes\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'circle':\n instance = new Circle(\n id,\n annotationWithDefaults as CircleAnnotation,\n this.svgContainer, // SVG for circles\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'label':\n instance = new Label(\n id,\n annotationWithDefaults as LabelAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n default:\n throw new Error(`Unknown annotation type: ${(annotation as Annotation).type}`)\n }\n\n this.annotations.set(id, instance)\n instance.show()\n\n return id\n }\n\n // Overloaded hide method\n hide(id: string): void\n hide(ids: string[]): void\n hide(input: string | string[]): void {\n const ids = Array.isArray(input) ? input : [input]\n for (const id of ids) {\n const annotation = this.annotations.get(id)\n if (annotation) {\n annotation.hide()\n this.annotations.delete(id)\n }\n }\n }\n\n hideAll(): void {\n for (const annotation of this.annotations.values()) {\n annotation.hide()\n }\n this.annotations.clear()\n }\n\n // Convenience methods\n arrow(from: Target, to: Target, options?: ArrowOptions): string {\n return this.show({ type: 'arrow', from, to, ...options })\n }\n\n badge(target: Target, number: number, options?: BadgeOptions): string {\n return this.show({ type: 'badge', target, number, ...options })\n }\n\n box(target: Target, options?: BoxOptions): string {\n return this.show({ type: 'box', target, ...options })\n }\n\n circle(target: Target, options?: CircleOptions): string {\n return this.show({ type: 'circle', target, ...options })\n }\n\n label(target: Target, text: string, options?: LabelOptions): string {\n return this.show({ type: 'label', target, text, ...options })\n }\n\n cancelAllAnimations(): void {\n for (const annotation of this.annotations.values()) {\n annotation.cancelAnimations()\n }\n }\n\n destroy(): void {\n for (const annotation of this.annotations.values()) {\n annotation.destroy()\n }\n this.annotations.clear()\n }\n}\n","/**\n * Convert hex color to RGB array\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const cleaned = hex.replace('#', '')\n const bigint = parseInt(cleaned, 16)\n return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255]\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1\n */\nexport function getLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const sRGB = c / 255\n return sRGB <= 0.03928 ? sRGB / 12.92 : ((sRGB + 0.055) / 1.055) ** 2.4\n })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/**\n * Get contrasting text color for a background\n */\nexport function getContrastColor(hex: string): 'white' | 'black' {\n return getLuminance(hex) > 0.5 ? 'black' : 'white'\n}\n","/**\n * Scroll element into view if not fully visible\n * Returns a promise that resolves when scroll is complete\n */\nexport async function scrollIntoViewIfNeeded(element: HTMLElement): Promise<void> {\n const rect = element.getBoundingClientRect()\n const isFullyVisible =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n\n if (isFullyVisible) {\n return\n }\n\n return new Promise((resolve) => {\n // Use scrollIntoView with smooth behavior\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n })\n\n // Wait for scroll to complete using IntersectionObserver\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry?.isIntersecting) {\n observer.disconnect()\n resolve()\n }\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n\n // Fallback timeout in case observer doesn't fire\n setTimeout(() => {\n observer.disconnect()\n resolve()\n }, 1000)\n })\n}\n","import { getContrastColor } from '../shared/colors'\nimport { DURATIONS, delay, EASINGS } from './animations'\nimport { scrollIntoViewIfNeeded } from './scroller'\nimport { isInViewport, resolveCoordinates, resolveElement } from './targeting'\nimport type { Coordinates, CursorController, Target } from './types'\n\nconst CURSOR_ARROW_SVG = `<svg class=\"cursor-arrow\" viewBox=\"0 0 24 24\">\n <path d=\"M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87a.5.5 0 0 0 .35-.85L6.35 2.85a.5.5 0 0 0-.85.36Z\"/>\n</svg>`\n\nexport class Cursor implements CursorController {\n private container: HTMLElement\n private element: HTMLDivElement\n private labelElement: HTMLDivElement\n private rippleElement: HTMLDivElement\n private currentAnimation: Animation | null = null\n private activeRipples = new Set<HTMLDivElement>()\n private _position: Coordinates | null = null\n private _isVisible = true\n private reducedMotion: boolean\n\n constructor(container: HTMLElement, reducedMotion: boolean) {\n this.container = container\n this.reducedMotion = reducedMotion\n\n // Create cursor element\n this.element = document.createElement('div')\n this.element.className = 'cursor'\n this.element.innerHTML = `${CURSOR_ARROW_SVG}<div class=\"cursor-label\">Guide</div>`\n this.labelElement = this.element.querySelector('.cursor-label') as HTMLDivElement\n\n // Create ripple element\n this.rippleElement = document.createElement('div')\n this.rippleElement.className = 'click-ripple'\n\n container.appendChild(this.element)\n container.appendChild(this.rippleElement)\n }\n\n get position(): Coordinates | null {\n return this._position\n }\n\n get isVisible(): boolean {\n return this._isVisible\n }\n\n show(): void {\n this._isVisible = true\n this.element.classList.remove('hidden')\n }\n\n hide(): void {\n this._isVisible = false\n this.element.classList.add('hidden')\n }\n\n setName(name: string): void {\n this.labelElement.textContent = name\n }\n\n setColor(color: string): void {\n this.element.style.setProperty('--cursor-color', color)\n this.element.style.setProperty('--cursor-text-color', getContrastColor(color))\n }\n\n async moveTo(target: Target, options?: { duration?: number }): Promise<void> {\n // Scroll element into view if needed\n const el = resolveElement(target)\n if (el && !isInViewport(el)) {\n await scrollIntoViewIfNeeded(el)\n await delay(DURATIONS.scrollPause)\n }\n\n // Resolve target coordinates\n const coords = resolveCoordinates(target, this._position)\n if (!coords) {\n console.warn('[Overlay] Target not found:', target)\n return\n }\n\n // Cancel any existing animation\n this.currentAnimation?.cancel()\n\n const duration = this.reducedMotion ? 1 : (options?.duration ?? DURATIONS.cursorMove)\n\n const from = this._position ?? coords\n\n this.currentAnimation = this.element.animate(\n [\n { transform: `translate(${from.x}px, ${from.y}px)` },\n { transform: `translate(${coords.x}px, ${coords.y}px)` },\n ],\n { duration, easing: EASINGS.easeInOut, fill: 'forwards' },\n )\n\n try {\n await this.currentAnimation.finished\n this._position = coords\n } catch {\n // Animation was cancelled\n } finally {\n this.currentAnimation = null\n }\n }\n\n async click(target?: Target): Promise<void> {\n // Move to target if provided\n if (target) {\n await this.moveTo(target)\n }\n\n if (!this._position) return\n\n const duration = this.reducedMotion ? 1 : DURATIONS.cursorClick\n\n // Press animation\n const pressAnimation = this.element.animate(\n [\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(0.85)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n // Show ripple\n this.showRipple(this._position)\n\n await pressAnimation.finished\n }\n\n private showRipple(position: Coordinates): void {\n const ripple = this.rippleElement.cloneNode() as HTMLDivElement\n ripple.style.left = `${position.x}px`\n ripple.style.top = `${position.y}px`\n this.container.appendChild(ripple)\n this.activeRipples.add(ripple)\n\n const duration = this.reducedMotion ? 1 : DURATIONS.clickRipple\n\n const animation = ripple.animate(\n [\n { opacity: 0.4, transform: 'translate(-50%, -50%) scale(0)' },\n { opacity: 0, transform: 'translate(-50%, -50%) scale(2)' },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n animation.onfinish = () => {\n ripple.remove()\n this.activeRipples.delete(ripple)\n }\n }\n\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n for (const r of this.activeRipples) {\n r.remove()\n }\n this.activeRipples.clear()\n }\n\n destroy(): void {\n this.cancelAnimations()\n this.element.remove()\n this.rippleElement.remove()\n }\n}\n","export const OVERLAY_STYLES = `\n:host {\n all: initial;\n}\n\n.overlay-container {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: var(--overlay-z-index, 9999);\n overflow: hidden;\n}\n\n/* Cursor */\n.cursor {\n position: absolute;\n display: flex;\n align-items: flex-start;\n gap: 2px;\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));\n will-change: transform;\n transition: opacity 0.15s ease-out;\n}\n\n.cursor.hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n.cursor-arrow {\n width: 20px;\n height: 20px;\n fill: var(--cursor-color, #3B82F6);\n}\n\n.cursor-label {\n background: var(--cursor-color, #3B82F6);\n color: var(--cursor-text-color, white);\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: 4px;\n white-space: nowrap;\n margin-top: 12px;\n}\n\n/* Click Ripple */\n.click-ripple {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--cursor-color, #3B82F6);\n opacity: 0;\n transform: translate(-50%, -50%) scale(0);\n pointer-events: none;\n}\n\n/* Annotations SVG Layer */\n.annotations-svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* Annotations DOM Layer */\n.annotations-dom {\n position: absolute;\n inset: 0;\n}\n\n/* Badge */\n.badge {\n position: absolute;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translate(-50%, -50%);\n}\n\n/* Label */\n.label {\n position: absolute;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: 6px;\n max-width: 280px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n}\n\n/* Note: Box, Circle, and Arrow annotations use SVG elements\n styled via attributes, not CSS classes */\n\n/* Reduced Motion */\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n`\n","import type { AnnotationManager } from './AnnotationManager'\nimport { delay } from './animations'\nimport type { Cursor } from './Cursor'\nimport type {\n Action,\n ClickAction,\n HideAnnotationsAction,\n MoveAction,\n OverlayScript,\n SetCursorAction,\n ShowAnnotationsAction,\n WaitAction,\n} from './types'\n\nexport interface TimelineCallbacks {\n onStart: () => void\n onComplete: () => void\n onStop: () => void\n onError: (error: Error, action?: Action) => void\n onAction: (action: Action, index: number, phase: 'start' | 'complete') => void\n}\n\nexport class Timeline {\n private cursor: Cursor\n private annotations: AnnotationManager\n private callbacks: TimelineCallbacks\n private isRunning = false\n private currentIndex = 0\n private abortController: AbortController | null = null\n\n constructor(cursor: Cursor, annotations: AnnotationManager, callbacks: TimelineCallbacks) {\n this.cursor = cursor\n this.annotations = annotations\n this.callbacks = callbacks\n }\n\n get running(): boolean {\n return this.isRunning\n }\n\n get actionIndex(): number | null {\n return this.isRunning ? this.currentIndex : null\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this.isRunning) {\n console.warn('[Overlay] Stopping current playback to start new script')\n this.stop()\n }\n\n this.isRunning = true\n this.currentIndex = 0\n this.abortController = new AbortController()\n\n // Apply script-level config\n if (script.cursor) {\n if (script.cursor.name) this.cursor.setName(script.cursor.name)\n if (script.cursor.color) this.cursor.setColor(script.cursor.color)\n if (script.cursor.visible === false) this.cursor.hide()\n else this.cursor.show()\n }\n\n this.callbacks.onStart()\n\n try {\n for (let i = 0; i < script.actions.length; i++) {\n if (!this.isRunning) break\n\n this.currentIndex = i\n const action = script.actions[i]\n\n this.callbacks.onAction(action, i, 'start')\n\n try {\n await this.executeAction(action)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n break\n }\n this.callbacks.onError(err as Error, action)\n // Continue to next action after error\n }\n\n this.callbacks.onAction(action, i, 'complete')\n }\n\n if (this.isRunning) {\n this.callbacks.onComplete()\n }\n } finally {\n this.isRunning = false\n this.abortController = null\n }\n }\n\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n this.abortController?.abort()\n\n // Cancel all animations\n this.cursor.cancelAnimations()\n this.annotations.cancelAllAnimations()\n\n this.callbacks.onStop()\n }\n\n private async executeAction(action: Action): Promise<void> {\n switch (action.type) {\n case 'move':\n await this.executeMove(action)\n break\n case 'click':\n await this.executeClick(action)\n break\n case 'wait':\n await this.executeWait(action)\n break\n case 'setCursor':\n this.executeSetCursor(action)\n break\n case 'showAnnotations':\n this.executeShowAnnotations(action)\n break\n case 'hideAnnotations':\n this.executeHideAnnotations(action)\n break\n default:\n console.warn('[Overlay] Unknown action type:', (action as Action).type)\n }\n }\n\n private async executeMove(action: MoveAction): Promise<void> {\n await this.cursor.moveTo(action.target, { duration: action.duration })\n\n // Simple mode: show annotations on arrival\n if (action.showAnnotations) {\n this.annotations.show(action.showAnnotations)\n }\n }\n\n private async executeClick(action: ClickAction): Promise<void> {\n await this.cursor.click(action.target)\n }\n\n private async executeWait(action: WaitAction): Promise<void> {\n await delay(action.duration)\n }\n\n private executeSetCursor(action: SetCursorAction): void {\n if (action.visible !== undefined) {\n if (action.visible) this.cursor.show()\n else this.cursor.hide()\n }\n if (action.name) this.cursor.setName(action.name)\n if (action.color) this.cursor.setColor(action.color)\n }\n\n private executeShowAnnotations(action: ShowAnnotationsAction): void {\n this.annotations.show(action.annotations)\n }\n\n private executeHideAnnotations(action: HideAnnotationsAction): void {\n if (action.ids) {\n this.annotations.hide(action.ids)\n } else {\n this.annotations.hideAll()\n }\n }\n\n destroy(): void {\n this.stop()\n }\n}\n","import { AnnotationManager } from './AnnotationManager'\nimport { Cursor } from './Cursor'\nimport { OVERLAY_STYLES } from './styles'\nimport { Timeline } from './Timeline'\nimport type {\n Action,\n AnnotationsController,\n CursorController,\n OverlayController,\n OverlayError,\n OverlayEventType,\n OverlayOptions,\n OverlayScript,\n ValidationResult,\n} from './types'\n\nconst DEFAULT_CURSOR_COLOR = '#3B82F6'\nconst DEFAULT_ANNOTATION_COLOR = '#EF4444'\nconst DEFAULT_Z_INDEX = 9999\n\ntype EventHandler =\n | (() => void)\n | ((error: OverlayError) => void)\n | ((action: Action, index: number, phase: 'start' | 'complete') => void)\n\nexport class Overlay implements OverlayController {\n private root: HTMLElement\n private shadow: ShadowRoot\n private container: HTMLElement\n private svgContainer: SVGSVGElement\n private domContainer: HTMLElement\n\n private _cursor: Cursor\n private _annotations: AnnotationManager\n private timeline: Timeline\n\n private reducedMotion: boolean\n private motionQuery: MediaQueryList\n\n private eventHandlers = new Map<OverlayEventType, Set<EventHandler>>()\n private _isDestroyed = false\n\n constructor(options: OverlayOptions = {}) {\n const parentContainer = options.container ?? document.body\n const zIndex = options.zIndex ?? DEFAULT_Z_INDEX\n\n // Check for reduced motion preference\n this.motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n this.reducedMotion = this.motionQuery.matches\n this.motionQuery.addEventListener('change', this.handleMotionChange)\n\n // Create root element\n this.root = document.createElement('div')\n this.root.id = 'ourroadmaps-overlay'\n\n // Create shadow DOM\n this.shadow = this.root.attachShadow({ mode: 'open' })\n\n // Add styles\n const styleEl = document.createElement('style')\n styleEl.textContent = OVERLAY_STYLES\n this.shadow.appendChild(styleEl)\n\n // Create container structure\n this.container = document.createElement('div')\n this.container.className = 'overlay-container'\n this.container.style.setProperty('--overlay-z-index', String(zIndex))\n this.shadow.appendChild(this.container)\n\n // Create SVG layer for arrows\n this.svgContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svgContainer.setAttribute('class', 'annotations-svg')\n this.container.appendChild(this.svgContainer)\n\n // Create DOM layer for other annotations\n this.domContainer = document.createElement('div')\n this.domContainer.className = 'annotations-dom'\n this.container.appendChild(this.domContainer)\n\n // Initialize cursor\n const cursorConfig = {\n name: options.cursor?.name ?? 'Guide',\n color: options.cursor?.color ?? DEFAULT_CURSOR_COLOR,\n visible: options.cursor?.visible ?? true,\n }\n\n this._cursor = new Cursor(this.container, this.reducedMotion)\n this._cursor.setName(cursorConfig.name)\n this._cursor.setColor(cursorConfig.color)\n if (!cursorConfig.visible) this._cursor.hide()\n\n // Initialize annotation manager\n const annotationsConfig = {\n color: options.annotations?.color ?? DEFAULT_ANNOTATION_COLOR,\n strokeWidth: options.annotations?.strokeWidth ?? 3,\n }\n\n this._annotations = new AnnotationManager(\n annotationsConfig,\n this.domContainer,\n this.svgContainer,\n this.reducedMotion,\n () => this._cursor.position,\n )\n\n // Initialize timeline\n this.timeline = new Timeline(this._cursor, this._annotations, {\n onStart: () => this.emit('start'),\n onComplete: () => this.emit('complete'),\n onStop: () => this.emit('stop'),\n onError: (error, action) => {\n this.emit('error', {\n code: 'ANIMATION_FAILED',\n message: error.message,\n action,\n })\n },\n onAction: (action, index, phase) => this.emit('action', action, index, phase),\n })\n\n // Mount to DOM\n parentContainer.appendChild(this.root)\n }\n\n // Note: Reduced motion preference is checked at construction time for cursor/annotations.\n // This handler updates our flag but doesn't propagate to already-constructed components.\n // This is acceptable since reduced motion is typically set before page interaction.\n private handleMotionChange = (e: MediaQueryListEvent): void => {\n this.reducedMotion = e.matches\n }\n\n // Controller interface\n get cursor(): CursorController {\n return this._cursor\n }\n\n get annotations(): AnnotationsController {\n return this._annotations\n }\n\n get isPlaying(): boolean {\n return this.timeline.running\n }\n\n get currentActionIndex(): number | null {\n return this.timeline.actionIndex\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n private static readonly VALID_ACTION_TYPES = [\n 'move',\n 'click',\n 'wait',\n 'setCursor',\n 'showAnnotations',\n 'hideAnnotations',\n ]\n\n private validateAction(action: unknown, index: number): string[] {\n const errors: string[] = []\n\n if (!action || typeof action !== 'object') {\n errors.push(`Action ${index} must be an object`)\n return errors\n }\n\n const a = action as Record<string, unknown>\n\n if (!Overlay.VALID_ACTION_TYPES.includes(a.type as string)) {\n errors.push(`Action ${index} has invalid type: ${a.type}`)\n }\n\n if (a.type === 'wait' && typeof a.duration !== 'number') {\n errors.push(`Wait action ${index} must have a numeric duration`)\n }\n\n if (a.type === 'move' && !a.target) {\n errors.push(`Move action ${index} must have a target`)\n }\n\n return errors\n }\n\n validate(script: unknown): ValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!script || typeof script !== 'object') {\n errors.push('Script must be an object')\n return { valid: false, errors, warnings }\n }\n\n const s = script as Record<string, unknown>\n\n if (s.version !== 1) {\n errors.push('Script version must be 1')\n }\n\n if (!Array.isArray(s.actions)) {\n errors.push('Script must have an actions array')\n } else {\n for (let i = 0; i < s.actions.length; i++) {\n errors.push(...this.validateAction(s.actions[i], i))\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this._isDestroyed) {\n throw new Error('Overlay has been destroyed')\n }\n\n const validation = this.validate(script)\n if (!validation.valid) {\n throw new Error(`Invalid script: ${validation.errors.join(', ')}`)\n }\n\n await this.timeline.play(script)\n }\n\n stop(): void {\n this.timeline.stop()\n }\n\n on(event: 'start', handler: () => void): () => void\n on(event: 'complete', handler: () => void): () => void\n on(event: 'stop', handler: () => void): () => void\n on(event: 'error', handler: (error: OverlayError) => void): () => void\n on(\n event: 'action',\n handler: (action: Action, index: number, phase: 'start' | 'complete') => void,\n ): () => void\n on(event: OverlayEventType, handler: EventHandler): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler)\n\n return () => {\n this.eventHandlers.get(event)?.delete(handler)\n }\n }\n\n private emit(event: 'start' | 'complete' | 'stop'): void\n private emit(event: 'error', error: OverlayError): void\n private emit(event: 'action', action: Action, index: number, phase: 'start' | 'complete'): void\n private emit(event: OverlayEventType, ...args: unknown[]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: Event handler args vary by event type\n ;(handler as any)(...args)\n } catch (err) {\n console.error(`[Overlay] Error in ${event} handler:`, err)\n }\n }\n }\n }\n\n destroy(): void {\n if (this._isDestroyed) return\n\n this._isDestroyed = true\n\n // Stop any running playback\n this.timeline.destroy()\n\n // Clean up components\n this._cursor.destroy()\n this._annotations.destroy()\n\n // Clean up motion listener\n this.motionQuery.removeEventListener('change', this.handleMotionChange)\n\n // Clear event handlers\n this.eventHandlers.clear()\n\n // Remove from DOM\n this.root.remove()\n }\n}\n"],"mappings":"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","names":["overlay_exports","__export","Overlay","createOverlay","isSelectorTarget","target","isCursorTarget","isCoordinates","resolveElement","getAnchorPosition","rect","anchor","resolveCoordinates","cursorPosition","element","position","isInViewport","element","rect","DURATIONS","EASINGS","delay","ms","resolve","fadeInKeyframes","fadeOutKeyframes","BaseAnnotation","id","config","container","reducedMotion","__publicField","r","duration","DURATIONS","fadeInKeyframes","EASINGS","fadeOutKeyframes","ARROWHEAD_LENGTH","ARROWHEAD_WIDTH","Arrow","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","g","markerId","marker","polygon","coords","target","isCoordinates","resolveCoordinates","isCursorTarget","isSelectorTarget","element","rect","from","to","startPoint","endPoint","d","Badge","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","badge","coords","resolveCoordinates","DEFAULT_PADDING","DEFAULT_RADIUS","Box","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","rect","color","coords","target","padding","bounds","isSelectorTarget","el","isCoordinates","resolved","resolveCoordinates","width","height","DEFAULT_PADDING","Circle","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","ellipse","color","coords","target","padding","bounds","isSelectorTarget","el","isCoordinates","resolved","resolveCoordinates","width","height","cx","cy","rx","ry","DEFAULT_GAP","Label","BaseAnnotation","id","config","container","reducedMotion","cursorPosition","__publicField","el","coords","target","position","gap","anchorRect","isCursorTarget","isCoordinates","resolved","resolveCoordinates","isSelectorTarget","rect","centerX","centerY","idCounter","generateId","AnnotationManager","config","domContainer","svgContainer","reducedMotion","getCursorPosition","__publicField","input","a","annotation","id","cursorPos","annotationWithDefaults","instance","Arrow","Badge","Box","Circle","Label","ids","from","to","options","target","number","text","hexToRgb","hex","cleaned","bigint","getLuminance","r","g","b","c","sRGB","getContrastColor","scrollIntoViewIfNeeded","element","rect","resolve","observer","entries","CURSOR_ARROW_SVG","Cursor","container","reducedMotion","__publicField","name","color","getContrastColor","target","options","el","resolveElement","isInViewport","scrollIntoViewIfNeeded","delay","DURATIONS","coords","resolveCoordinates","duration","from","EASINGS","pressAnimation","position","ripple","animation","r","OVERLAY_STYLES","Timeline","cursor","annotations","callbacks","__publicField","script","i","action","err","delay","DEFAULT_CURSOR_COLOR","DEFAULT_ANNOTATION_COLOR","DEFAULT_Z_INDEX","_Overlay","options","__publicField","parentContainer","zIndex","styleEl","OVERLAY_STYLES","cursorConfig","Cursor","annotationsConfig","AnnotationManager","Timeline","error","action","index","phase","errors","a","script","warnings","s","i","validation","event","handler","args","handlers","err","Overlay","createOverlay","options","Overlay"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk46WI5367_cjs = require('../chunk-46WI5367.cjs');
|
|
4
|
+
require('../chunk-4DE2IREA.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "Review", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunk46WI5367_cjs.Review; }
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=index.cjs.map
|
|
13
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface PinData {
|
|
2
|
+
pinX: number;
|
|
3
|
+
pinY: number;
|
|
4
|
+
element: {
|
|
5
|
+
selector: string;
|
|
6
|
+
tag: string;
|
|
7
|
+
text: string;
|
|
8
|
+
ariaLabel: string | null;
|
|
9
|
+
className: string;
|
|
10
|
+
boundingBox: {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
w: number;
|
|
14
|
+
h: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
context: {
|
|
18
|
+
parentTag: string;
|
|
19
|
+
parentText: string;
|
|
20
|
+
grandparentTag: string;
|
|
21
|
+
siblings: string[];
|
|
22
|
+
nearbyText: string;
|
|
23
|
+
};
|
|
24
|
+
viewportWidth: number;
|
|
25
|
+
viewportHeight: number;
|
|
26
|
+
}
|
|
27
|
+
interface ReviewOptions {
|
|
28
|
+
apiUrl?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
declare class Review {
|
|
32
|
+
private root;
|
|
33
|
+
private shadow;
|
|
34
|
+
private mode;
|
|
35
|
+
private _isDestroyed;
|
|
36
|
+
constructor(_options?: ReviewOptions);
|
|
37
|
+
init(): Promise<void>;
|
|
38
|
+
private showErrorOverlay;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { type PinData, Review, type ReviewOptions };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
interface PinData {
|
|
2
|
+
pinX: number;
|
|
3
|
+
pinY: number;
|
|
4
|
+
element: {
|
|
5
|
+
selector: string;
|
|
6
|
+
tag: string;
|
|
7
|
+
text: string;
|
|
8
|
+
ariaLabel: string | null;
|
|
9
|
+
className: string;
|
|
10
|
+
boundingBox: {
|
|
11
|
+
x: number;
|
|
12
|
+
y: number;
|
|
13
|
+
w: number;
|
|
14
|
+
h: number;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
context: {
|
|
18
|
+
parentTag: string;
|
|
19
|
+
parentText: string;
|
|
20
|
+
grandparentTag: string;
|
|
21
|
+
siblings: string[];
|
|
22
|
+
nearbyText: string;
|
|
23
|
+
};
|
|
24
|
+
viewportWidth: number;
|
|
25
|
+
viewportHeight: number;
|
|
26
|
+
}
|
|
27
|
+
interface ReviewOptions {
|
|
28
|
+
apiUrl?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
declare class Review {
|
|
32
|
+
private root;
|
|
33
|
+
private shadow;
|
|
34
|
+
private mode;
|
|
35
|
+
private _isDestroyed;
|
|
36
|
+
constructor(_options?: ReviewOptions);
|
|
37
|
+
init(): Promise<void>;
|
|
38
|
+
private showErrorOverlay;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export { type PinData, Review, type ReviewOptions };
|