react-instagram-stories 0.0.1 → 1.0.1

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/index.cjs ADDED
@@ -0,0 +1,18 @@
1
+ 'use strict';var E=require('react'),reactRouterDom=require('react-router-dom'),jsxRuntime=require('react/jsx-runtime'),reactDom=require('react-dom');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var E__default=/*#__PURE__*/_interopDefault(E);var ne=E.memo(({avatarUrl:e,username:r,hasUnreadStories:o=false,onClick:n})=>{let[l,i]=E.useState(false),[a,c]=E.useState(false);return jsxRuntime.jsxs("button",{className:`story-avatar ${o?"story-avatar-unread":"story-avatar-read"}`,onClick:n,"aria-label":`View ${r}'s story`,children:[jsxRuntime.jsx("div",{className:"story-avatar-ring",children:jsxRuntime.jsx("div",{className:"story-avatar-image-wrapper",children:a?jsxRuntime.jsx("div",{className:"story-avatar-placeholder",children:r.charAt(0).toUpperCase()}):jsxRuntime.jsx("img",{src:e,alt:r,className:`story-avatar-image ${l?"story-avatar-image-loaded":""}`,loading:"lazy",onLoad:()=>i(true),onError:()=>c(true)})})}),jsxRuntime.jsx("span",{className:"story-avatar-username",children:r})]})});ne.displayName="Avatar";var q=90,xe=3,se=E.memo(({users:e,onAvatarClick:r})=>{let o=E.useRef(null),[n,l]=E.useState(0),[i,a]=E.useState(0),c=E.useCallback(()=>{o.current&&l(o.current.scrollLeft);},[]);E.useEffect(()=>{let u=()=>{o.current&&a(o.current.clientWidth);};return u(),window.addEventListener("resize",u),()=>{window.removeEventListener("resize",u);}},[]);let{startIndex:t,endIndex:m}=E__default.default.useMemo(()=>{let u=Math.floor(n/q),g=Math.ceil(i/q);return {startIndex:Math.max(0,u-xe),endIndex:Math.min(e.length,u+g+xe)}},[n,i,e.length]),d=e.length*q,s=e.slice(t,m).map((u,g)=>({user:u,index:t+g}));return jsxRuntime.jsx("div",{ref:o,className:"story-avatar-list",onScroll:c,role:"list","aria-label":"Stories",children:jsxRuntime.jsx("div",{className:"story-avatar-list-inner",style:{width:`${d}px`,position:"relative"},children:s.map(({user:u,index:g})=>jsxRuntime.jsx("div",{className:"story-avatar-item",style:{position:"absolute",left:`${g*q}px`,width:`${q}px`},role:"listitem",children:jsxRuntime.jsx(ne,{avatarUrl:u.avatarUrl,username:u.username,hasUnreadStories:u.hasUnreadStories,onClick:()=>r(g)})},u.id))})})});se.displayName="AvatarList";var we=({duration:e,onComplete:r,autoStart:o=true})=>{let[n,l]=E.useState(0),[i,a]=E.useState(!o),[c,t]=E.useState(e),m=E.useRef(null),d=E.useRef(0),s=E.useRef(null),u=E.useRef(),g=E.useCallback(()=>{if(!m.current||i)return;let _=Date.now()-m.current+d.current,T=Math.min(_/c,1);if(l(T),T>=1){r?.();return}s.current=requestAnimationFrame(u.current);},[c,i,r]);u.current=g;let f=E.useCallback(()=>{i||(m.current&&(d.current+=Date.now()-m.current),a(true),s.current&&(cancelAnimationFrame(s.current),s.current=null));},[i]),v=E.useCallback(()=>{i&&(m.current=Date.now(),a(false));},[i]),S=E.useCallback(()=>{s.current&&(cancelAnimationFrame(s.current),s.current=null),m.current=Date.now(),d.current=0,l(0),a(false),s.current=requestAnimationFrame(u.current);},[]),R=E.useCallback(_=>{t(_);},[]);return E.useEffect(()=>(i||(m.current=Date.now(),s.current=requestAnimationFrame(u.current)),()=>{s.current&&cancelAnimationFrame(s.current);}),[i]),E.useEffect(()=>()=>{s.current&&cancelAnimationFrame(s.current);},[]),{progress:n,isPaused:i,pause:f,resume:v,reset:S,setDuration:R}};var Ie=({onLeft:e,onRight:r,onSpace:o,onEscape:n,enabled:l=true})=>{E.useEffect(()=>{if(!l)return;let i=a=>{switch(a.key){case "ArrowLeft":a.preventDefault(),e?.();break;case "ArrowRight":a.preventDefault(),r?.();break;case " ":a.preventDefault(),o?.();break;case "Escape":a.preventDefault(),n?.();break}};return window.addEventListener("keydown",i),()=>{window.removeEventListener("keydown",i);}},[e,r,o,n,l]);};var Fe=e=>{let r=E.useRef(null),o=E.useRef(null);return E.useEffect(()=>{if(!e||!r.current)return;o.current=document.activeElement;let n=r.current,l=n.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),i=l[0],a=l[l.length-1];i?.focus();let c=t=>{t.key==="Tab"&&(t.shiftKey?document.activeElement===i&&(t.preventDefault(),a?.focus()):document.activeElement===a&&(t.preventDefault(),i?.focus()));};return n.addEventListener("keydown",c),()=>{n.removeEventListener("keydown",c),o.current?.focus();}},[e]),r};var Ee=()=>{let[e,r]=E.useState(!document.hidden);return E.useEffect(()=>{let o=()=>{r(!document.hidden);};return document.addEventListener("visibilitychange",o),()=>{document.removeEventListener("visibilitychange",o);}},[]),e};var ke=()=>{let e=E.useRef({}),r=E.useRef(new Set),o=E.useCallback(t=>new Promise((m,d)=>{if(e.current[t]){m();return}if(r.current.has(t)){let u=setInterval(()=>{(e.current[t]||!r.current.has(t))&&(clearInterval(u),m());},100);return}r.current.add(t);let s=new Image;s.onload=()=>{e.current[t]=true,r.current.delete(t),m();},s.onerror=()=>{r.current.delete(t),d(new Error(`Failed to load image: ${t}`));},s.src=t;}),[]),n=E.useCallback(t=>new Promise((m,d)=>{if(e.current[t]){m();return}if(r.current.has(t)){let v=setInterval(()=>{(e.current[t]||!r.current.has(t))&&(clearInterval(v),m());},100);return}r.current.add(t);let s=document.createElement("video");s.preload="auto";let u=()=>{e.current[t]=true,r.current.delete(t),f(),m();},g=()=>{r.current.delete(t),f(),d(new Error(`Failed to load video: ${t}`));},f=()=>{s.removeEventListener("canplaythrough",u),s.removeEventListener("error",g),s.src="";};s.addEventListener("canplaythrough",u),s.addEventListener("error",g),s.src=t,s.load();}),[]),l=E.useCallback(async t=>{try{t.type==="image"&&"src"in t?await o(t.src):t.type==="video"&&"src"in t&&await n(t.src);}catch(m){console.warn("Failed to preload story item:",m);}},[o,n]),i=E.useCallback(async t=>{let d=[];for(let s=0;s<t.length;s+=3)d.push(t.slice(s,s+3));for(let s of d)await Promise.allSettled(s.map(l));},[l]),a=E.useCallback(t=>e.current[t]||false,[]),c=E.useCallback(()=>{e.current={},r.current.clear();},[]);return E.useEffect(()=>()=>{c();},[c]),{preloadImage:o,preloadVideo:n,preloadStoryItem:l,preloadMultiple:i,isPreloaded:a,clearCache:c}};var ie=E.memo(({progress:e,isActive:r})=>{let o=Math.round(e*100);return jsxRuntime.jsx("div",{className:"story-progress-bar",role:"progressbar","aria-valuenow":r?o:e===1?100:0,"aria-valuemin":0,"aria-valuemax":100,"aria-label":`Story progress: ${o}%`,children:jsxRuntime.jsx("div",{className:"story-progress-bar-fill",style:{transform:`scaleX(${r?e:e===1?1:0})`}})})});ie.displayName="ProgressBar";var le=E.memo(({total:e,currentIndex:r,progress:o})=>jsxRuntime.jsx("div",{className:"story-progress-bars-container",children:Array.from({length:e}).map((n,l)=>jsxRuntime.jsx(ie,{progress:l<r?1:l===r?o:0,isActive:l===r},l))}));le.displayName="StoryProgressBars";var ce=E.memo(({item:e,isActive:r,isPaused:o,onDurationDetected:n,onLoadError:l,onBufferingChange:i,controls:a})=>{let c=E.useRef(null),[t,m]=E.useState(false),[d,s]=E.useState(true);E.useEffect(()=>{if(e.type!=="video"||!c.current||!r)return;let f=c.current;(async()=>{try{o?f.pause():await f.play();}catch(S){console.warn("Video play failed:",S);}})();},[e.type,r,o]),E.useEffect(()=>{if(e.type!=="video"||!c.current)return;let f=c.current,v=()=>{f.duration&&isFinite(f.duration)&&n?.(f.duration*1e3);},S=()=>{s(false);};return f.addEventListener("loadedmetadata",v),f.addEventListener("canplay",S),f.readyState>=1&&v(),f.readyState>=3&&S(),()=>{f.removeEventListener("loadedmetadata",v),f.removeEventListener("canplay",S);}},[e.type,n]),E.useEffect(()=>{if(e.type!=="video"||!c.current||!r)return;let f=c.current,v=()=>{i?.(true);},S=()=>{i?.(false);},R=()=>{i?.(true);};return f.addEventListener("waiting",v),f.addEventListener("playing",S),f.addEventListener("stalled",R),()=>{f.removeEventListener("waiting",v),f.removeEventListener("playing",S),f.removeEventListener("stalled",R);}},[e.type,r,i]),E.useEffect(()=>{if(e.type!=="video"||!c.current||!r)return;let f=c.current,v,S=()=>{f.duration&&isFinite(f.duration),v=requestAnimationFrame(S);};return v=requestAnimationFrame(S),()=>{cancelAnimationFrame(v);}},[e.type,r]);let u=E.useCallback(()=>{m(true),s(false),l?.();},[l]),g=E.useCallback(()=>{s(false);},[]);if(t)return jsxRuntime.jsx("div",{className:"story-item story-item-error",children:jsxRuntime.jsx("div",{className:"story-item-error-message",children:"Failed to load content"})});switch(e.type){case "image":return jsxRuntime.jsxs("div",{className:"story-item story-item-image",children:[d&&jsxRuntime.jsx("div",{className:"story-item-loader",children:jsxRuntime.jsx("div",{className:"story-item-spinner"})}),jsxRuntime.jsx("img",{src:e.src,alt:e.alt||"Story image",onError:u,onLoad:g,draggable:false,style:{opacity:d?0:1}})]});case "video":return jsxRuntime.jsxs("div",{className:"story-item story-item-video",children:[d&&jsxRuntime.jsx("div",{className:"story-item-loader",children:jsxRuntime.jsx("div",{className:"story-item-spinner"})}),jsxRuntime.jsx("video",{ref:c,src:e.src,playsInline:true,loop:false,onError:u,preload:"auto",style:{opacity:d?0:1}})]});case "text":return jsxRuntime.jsx("div",{className:"story-item story-item-text",style:{backgroundColor:e.backgroundColor||"#000",color:e.textColor||"#fff"},children:jsxRuntime.jsx("div",{className:"story-item-text-content",children:e.text})});case "custom_component":let f=e.component;return jsxRuntime.jsx("div",{className:"story-item story-item-component",children:jsxRuntime.jsx(f,{...a})});default:return null}});ce.displayName="StoryItem";var A=5e3,De=E__default.default.memo(({users:e,initialUserIndex:r,initialStoryIndex:o,isOpen:n,onClose:l,onStoryChange:i})=>{let[a,c]=E.useState(r),[t,m]=E.useState(o??0),[d,s]=E.useState(false);E.useEffect(()=>{c(r);},[r]),E.useEffect(()=>{m(o??0);},[o]);let[u,g]=E.useState(false),[f,v]=E.useState(null),[S,R]=E.useState(false),[_,T]=E.useState(false),pe=E.useRef(null),me=E.useRef(null),fe=E.useRef(0),ye=E.useRef(A),Z=E.useRef(false),b=e[a],U=b?.stories[t],B=b?.stories.length||0;E.useEffect(()=>{ye.current=U?.duration||A;},[U?.duration]);let _e=Fe(n),ee=Ee(),{preloadStoryItem:te}=ke(),N=E.useCallback(()=>s(true),[]),z=E.useCallback(()=>s(false),[]),ge=E.useRef(),x=we({duration:ye.current||A,onComplete:()=>ge.current?.(),autoStart:false}),He=E.useCallback(y=>{y?x.pause():d||x.resume();},[x,d]);E.useEffect(()=>{let y=U?.duration||A;x.setDuration(y);},[x,U?.duration]);let k=E.useCallback(()=>{if(b)if(t<B-1){let y=t+1,I=b.stories[y]?.duration||A;m(y),x.setDuration(I),x.reset();}else a<e.length-1?(T(true),setTimeout(()=>{g(true),v("left"),setTimeout(()=>{let y=a+1,O=e[y].stories[0]?.duration||A;c(y),m(0),g(false),v(null),T(false),x.setDuration(O),x.reset();},150);},1e3)):l();},[b,t,B,a,e,x,l]),H=E.useCallback(()=>{if(b)if(t>0){let y=t-1,I=b.stories[y]?.duration||A;m(y),x.setDuration(I),x.reset();}else a>0&&(T(true),setTimeout(()=>{g(true),v("right"),setTimeout(()=>{let y=a-1,w=e[y],I=w.stories.length-1,ve=w.stories[I]?.duration||A;c(y),m(I),g(false),v(null),T(false),x.setDuration(ve),x.reset();},150);},1e3));},[b,t,a,e,x]),re=E.useCallback(()=>{window.scrollTo(0,fe.current),l();},[l]);E.useEffect(()=>{ge.current=k;},[k]);let Oe=E.useMemo(()=>({pause:N,resume:z,next:k,prev:H,setDuration:y=>me.current?.setDuration(y)}),[N,z,k,H]),Ke=E.useCallback(y=>{let w=y.target;if(w.closest(".story-viewer-close")||w.closest("button")||w.closest("input")||w.closest("select")||w.closest("textarea"))return;let I=pe.current;if(!I)return;let O=I.getBoundingClientRect();y.clientX-O.left<O.width/2?H():k();},[H,k]),j=E.useRef(null),oe=E.useRef(false),qe=E.useCallback(y=>{oe.current=false,j.current={x:y.clientX,y:y.clientY},N();},[N]),Xe=E.useCallback(y=>{if(!j.current)return;let w=y.clientX-j.current.x,I=y.clientY-j.current.y;(Math.abs(w)>10||Math.abs(I)>10)&&(oe.current=true);},[]);Ie({onLeft:H,onRight:k,onSpace:()=>d?z():N(),onEscape:re,enabled:n}),E.useEffect(()=>{ee?ee&&!d&&z():N();},[ee,N,z,d]),E.useEffect(()=>{if(!n||!b)return;let y=[];t<B-1&&y.push(b.stories[t+1]),t>0&&y.push(b.stories[t-1]),a<e.length-1&&y.push(e[a+1].stories[0]),a>0&&y.push(e[a-1].stories[0]);let w=y.slice(0,3).map(I=>te(I).catch(()=>{}));Promise.all(w);},[n,b,a,t,B,e,te]),E.useEffect(()=>(n&&!Z.current?(Z.current=true,R(true),U&&te(U),setTimeout(()=>{R(false),fe.current=window.scrollY,document.body.style.overflow="hidden",x.resume();},1500)):n||(Z.current=false,document.body.style.overflow="",R(false),T(false)),()=>{document.body.style.overflow="";}),[n,x]),E.useEffect(()=>{i&&n&&i(a,t);},[a,t,i,n]);let Ye=E.useCallback(()=>{console.warn("Story item failed to load, skipping..."),setTimeout(k,500);},[k]);if(!n||!b||!U)return null;let je=jsxRuntime.jsxs("div",{ref:pe,className:"story-viewer",role:"dialog","aria-modal":"true","aria-label":`Stories by ${b?.username||"user"}`,"aria-describedby":"story-viewer-description",children:[jsxRuntime.jsx("div",{className:"story-viewer-overlay",onClick:re}),jsxRuntime.jsx("div",{id:"story-viewer-description",className:"sr-only",children:"Instagram-style stories viewer. Tap left side to go to previous story, right side to go to next story. Swipe left or right to navigate between users. Press Escape to close."}),jsxRuntime.jsxs("div",{"aria-live":"polite","aria-atomic":"true",className:"sr-only",children:["Viewing story ",t+1," of ",B," by"," ",b?.username]}),jsxRuntime.jsxs("div",{ref:_e,className:`story-viewer-content ${u?`story-viewer-transitioning story-viewer-transition-${f}`:""}`,onClick:Ke,onPointerDown:qe,onPointerMove:Xe,onMouseEnter:N,onMouseLeave:z,children:[jsxRuntime.jsxs("div",{className:"story-viewer-header",children:[jsxRuntime.jsx(le,{total:B,currentIndex:t,progress:x.progress}),jsxRuntime.jsxs("div",{className:"story-viewer-user-info",children:[jsxRuntime.jsx("img",{src:b.avatarUrl,alt:`${b.username} avatar`,className:"story-viewer-avatar"}),jsxRuntime.jsx("span",{className:"story-viewer-username",children:b.username})]}),jsxRuntime.jsx("button",{className:"story-viewer-close",onClick:re,"aria-label":"Close story viewer",type:"button",children:"\xD7"})]}),jsxRuntime.jsx("div",{className:"story-viewer-items",children:S||_?jsxRuntime.jsx("div",{className:"story-item-loader",children:jsxRuntime.jsx("div",{className:"story-item-spinner"})}):jsxRuntime.jsx(ce,{item:U,isActive:true,isPaused:d||oe.current,onDurationDetected:y=>me.current?.setDuration(y),onLoadError:Ye,onBufferingChange:He,controls:Oe})}),jsxRuntime.jsxs("div",{className:"story-viewer-nav-hints",children:[jsxRuntime.jsx("div",{className:"story-viewer-nav-hint story-viewer-nav-hint-left"}),jsxRuntime.jsx("div",{className:"story-viewer-nav-hint story-viewer-nav-hint-right"})]})]})]});return reactDom.createPortal(je,document.body)});function Ae(e,r){for(let o=0;o<e.length;o++){let l=e[o].stories.findIndex(i=>i.id===r);if(l!==-1)return {userIndex:o,storyIndex:l}}return null}var Be=({users:e,closeNavigateTo:r="/"})=>{let{storyId:o}=reactRouterDom.useParams(),n=reactRouterDom.useNavigate(),[l,i]=E.useState({isOpen:false,userIndex:0,storyIndex:0}),a=E.useRef(0);E.useEffect(()=>{if(o){let d=Ae(e,o);d&&i({isOpen:true,userIndex:d.userIndex,storyIndex:d.storyIndex});}},[o,e]);let c=E.useCallback(d=>{a.current=window.scrollY,i({isOpen:true,userIndex:d,storyIndex:0});let s=e[d];if(s&&s.stories.length>0){let u=s.stories[0].id;n(`/story/${u}`,{replace:true});}},[e,n]),t=E.useCallback(()=>{i({isOpen:false,userIndex:0,storyIndex:0}),requestAnimationFrame(()=>{window.scrollTo(0,a.current);}),n(r,{replace:true});},[n,r]),m=E.useCallback((d,s)=>{let u=e[d];if(u&&u.stories[s]){let g=u.stories[s].id;n(`/story/${g}`,{replace:true});}},[e,n]);return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(se,{users:e,onAvatarClick:c}),jsxRuntime.jsx(De,{users:e,initialUserIndex:l.userIndex,initialStoryIndex:l.storyIndex,isOpen:l.isOpen,onClose:t,onStoryChange:m})]})};var $e=({pause:e,resume:r,next:o})=>{let[n,l]=E__default.default.useState(null),[i,a]=E__default.default.useState([42,28,18,12]);E__default.default.useEffect(()=>(e(),()=>r()),[e,r]);let c=d=>{l(d);let s=[...i];s[d]+=1,a(s),setTimeout(()=>{r(),o();},2e3);},t=i.reduce((d,s)=>d+s,0);return jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",padding:"20px",width:"100%",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)"},children:[jsxRuntime.jsx("h2",{style:{color:"white",marginBottom:"10px",fontSize:"28px",fontWeight:"bold"},children:"Poll"}),jsxRuntime.jsx("p",{style:{color:"rgba(255,255,255,0.9)",marginBottom:"30px",fontSize:"18px"},children:"What's your favorite framework?"}),jsxRuntime.jsx("div",{style:{width:"100%"},children:["React","Vue","Angular","Svelte"].map((d,s)=>{let u=Math.round(i[s]/t*100),g=n===s;return jsxRuntime.jsxs("button",{onClick:()=>n===null&&c(s),disabled:n!==null,style:{width:"100%",padding:"16px 20px",margin:"8px 0",border:"none",borderRadius:"12px",background:n!==null?`linear-gradient(90deg, rgba(255,255,255,0.4) ${u}%, rgba(255,255,255,0.15) ${u}%)`:"rgba(255,255,255,0.2)",color:"white",fontSize:"16px",fontWeight:"600",cursor:n===null?"pointer":"default",transition:"all 0.3s ease",display:"flex",justifyContent:"space-between",alignItems:"center",backdropFilter:"blur(10px)"},children:[jsxRuntime.jsxs("span",{style:{display:"flex",alignItems:"center",gap:"10px"},children:[g&&"\u2713 ",d]}),n!==null&&jsxRuntime.jsxs("span",{children:[u,"%"]})]},s)})}),n!==null&&jsxRuntime.jsxs("p",{style:{color:"rgba(255,255,255,0.8)",marginTop:"20px",fontSize:"14px"},children:[t," votes \u2022 Thanks for voting!"]})]})},Ve=({pause:e,resume:r,next:o})=>{let[n,l]=E__default.default.useState(false),[i,a]=E__default.default.useState(null),c=2;E__default.default.useEffect(()=>(e(),()=>r()),[e,r]);let t=d=>{a(d),l(true),setTimeout(()=>{r(),o();},2500);};return jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",padding:"20px",width:"100%",background:"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)"},children:[jsxRuntime.jsx("div",{style:{fontSize:"48px",marginBottom:"20px",animation:"bounce 1s infinite"},children:"\u{1FA90}"}),jsxRuntime.jsx("h2",{style:{color:"white",marginBottom:"10px",fontSize:"24px",fontWeight:"bold",textAlign:"center"},children:"Quiz Time!"}),jsxRuntime.jsx("p",{style:{color:"rgba(255,255,255,0.9)",marginBottom:"30px",fontSize:"18px",textAlign:"center"},children:"Which is the largest planet in our solar system?"}),jsxRuntime.jsx("div",{style:{width:"100%"},children:["Mars","Venus","Jupiter","Saturn"].map((d,s)=>{let u=s===c,g=i===s,f="rgba(255,255,255,0.2)";return n&&(u?f="rgba(34, 197, 94, 0.6)":g&&(f="rgba(239, 68, 68, 0.6)")),jsxRuntime.jsxs("button",{onClick:()=>!n&&t(s),disabled:n,style:{width:"100%",padding:"16px 20px",margin:"8px 0",border:"none",borderRadius:"12px",background:f,color:"white",fontSize:"16px",fontWeight:"600",cursor:n?"default":"pointer",transition:"all 0.3s ease",display:"flex",justifyContent:"space-between",alignItems:"center"},children:[jsxRuntime.jsx("span",{children:d}),n&&u&&jsxRuntime.jsx("span",{children:"\u2713"}),n&&g&&!u&&jsxRuntime.jsx("span",{children:"\u2717"})]},s)})}),n&&jsxRuntime.jsx("p",{style:{color:"white",marginTop:"20px",fontSize:"16px",fontWeight:"bold"},children:i===c?"\u{1F389} Correct!":"\u274C Wrong! Jupiter is the largest."})]})},wt=()=>{let[e,r]=E__default.default.useState({days:12,hours:8,minutes:45,seconds:30});E__default.default.useEffect(()=>{let n=setInterval(()=>{r(l=>{let{days:i,hours:a,minutes:c,seconds:t}=l;return t--,t<0&&(t=59,c--),c<0&&(c=59,a--),a<0&&(a=23,i--),{days:i,hours:a,minutes:c,seconds:t}});},1e3);return ()=>clearInterval(n)},[]);let o=({value:n,label:l})=>jsxRuntime.jsxs("div",{style:{textAlign:"center"},children:[jsxRuntime.jsx("div",{style:{background:"rgba(255,255,255,0.2)",backdropFilter:"blur(10px)",borderRadius:"12px",padding:"15px 20px",minWidth:"70px"},children:jsxRuntime.jsx("div",{style:{fontSize:"32px",fontWeight:"bold",color:"white"},children:String(n).padStart(2,"0")})}),jsxRuntime.jsx("div",{style:{color:"rgba(255,255,255,0.8)",fontSize:"12px",marginTop:"8px",textTransform:"uppercase"},children:l})]});return jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",padding:"20px",width:"100%",background:"linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)"},children:[jsxRuntime.jsx("div",{style:{fontSize:"48px",marginBottom:"15px"},children:"\u{1F680}"}),jsxRuntime.jsx("h2",{style:{color:"white",marginBottom:"8px",fontSize:"24px",fontWeight:"bold"},children:"Product Launch"}),jsxRuntime.jsx("p",{style:{color:"rgba(255,255,255,0.7)",marginBottom:"30px",fontSize:"14px"},children:"Something amazing is coming..."}),jsxRuntime.jsxs("div",{style:{display:"flex",gap:"12px",marginBottom:"30px"},children:[jsxRuntime.jsx(o,{value:e.days,label:"Days"}),jsxRuntime.jsx(o,{value:e.hours,label:"Hours"}),jsxRuntime.jsx(o,{value:e.minutes,label:"Mins"}),jsxRuntime.jsx(o,{value:e.seconds,label:"Secs"})]}),jsxRuntime.jsx("button",{style:{padding:"14px 40px",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",border:"none",borderRadius:"30px",color:"white",fontSize:"16px",fontWeight:"bold",cursor:"pointer"},children:"Notify Me"})]})},It=()=>jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",height:"100%",background:"linear-gradient(180deg, #1a1a2e 0%, #16213e 100%)",position:"relative",overflow:"hidden"},children:[jsxRuntime.jsx("div",{style:{flex:1,display:"flex",alignItems:"center",justifyContent:"center",padding:"20px"},children:jsxRuntime.jsx("img",{src:"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop",alt:"Product",style:{width:"100%",height:"100%",objectFit:"cover",borderRadius:"20px",boxShadow:"0 20px 60px rgba(0,0,0,0.5)"}})}),jsxRuntime.jsxs("div",{style:{padding:"30px",background:"linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.8) 100%)"},children:[jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"8px",marginBottom:"10px"},children:[jsxRuntime.jsx("span",{style:{background:"#ef4444",color:"white",padding:"4px 10px",borderRadius:"20px",fontSize:"12px",fontWeight:"bold"},children:"NEW"}),jsxRuntime.jsx("span",{style:{color:"rgba(255,255,255,0.6)",fontSize:"12px"},children:"Limited Edition"})]}),jsxRuntime.jsx("h2",{style:{color:"white",fontSize:"24px",fontWeight:"bold",marginBottom:"8px"},children:"Premium Watch Collection"}),jsxRuntime.jsx("p",{style:{color:"rgba(255,255,255,0.7)",fontSize:"14px",marginBottom:"15px"},children:"Elegant design meets modern technology"}),jsxRuntime.jsxs("div",{style:{display:"flex",alignItems:"center",gap:"15px"},children:[jsxRuntime.jsx("span",{style:{color:"white",fontSize:"28px",fontWeight:"bold"},children:"$299"}),jsxRuntime.jsx("span",{style:{color:"rgba(255,255,255,0.5)",fontSize:"18px",textDecoration:"line-through"},children:"$399"})]}),jsxRuntime.jsx("button",{style:{width:"100%",marginTop:"20px",padding:"16px",background:"white",border:"none",borderRadius:"12px",color:"#1a1a2e",fontSize:"16px",fontWeight:"bold",cursor:"pointer"},children:"Shop Now \u2192"})]})]}),We=({pause:e,resume:r,next:o})=>{let[n,l]=E__default.default.useState(5),[i,a]=E__default.default.useState(false);E__default.default.useEffect(()=>(e(),()=>r()),[e,r]);let c=()=>{a(true),setTimeout(()=>{r(),o();},1500);};return jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100%",padding:"20px",width:"100%",background:"linear-gradient(135deg, #11998e 0%, #38ef7d 100%)"},children:[jsxRuntime.jsx("div",{style:{fontSize:"80px",marginBottom:"20px",transition:"all 0.3s"},children:["\u{1F622}","\u{1F615}","\u{1F610}","\u{1F642}","\u{1F60A}","\u{1F603}","\u{1F604}","\u{1F601}","\u{1F929}","\u{1F973}"][n-1]}),jsxRuntime.jsx("h2",{style:{color:"white",marginBottom:"10px",fontSize:"24px",fontWeight:"bold"},children:"Rate Your Experience"}),jsxRuntime.jsx("p",{style:{color:"rgba(255,255,255,0.9)",marginBottom:"30px",fontSize:"16px"},children:"How was your visit today?"}),i?jsxRuntime.jsxs("div",{style:{textAlign:"center"},children:[jsxRuntime.jsx("div",{style:{fontSize:"48px",marginBottom:"10px"},children:"\u{1F389}"}),jsxRuntime.jsx("p",{style:{color:"white",fontSize:"18px",fontWeight:"bold"},children:"Thanks for your feedback!"})]}):jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsxs("div",{style:{width:"100%",marginBottom:"20px"},children:[jsxRuntime.jsx("input",{type:"range",min:"1",max:"10",value:n,onChange:m=>l(parseInt(m.target.value)),style:{width:"100%",height:"8px",borderRadius:"4px",appearance:"none",background:"rgba(255,255,255,0.3)",cursor:"pointer"}}),jsxRuntime.jsxs("div",{style:{display:"flex",justifyContent:"space-between",color:"rgba(255,255,255,0.7)",fontSize:"12px",marginTop:"8px"},children:[jsxRuntime.jsx("span",{children:"1"}),jsxRuntime.jsx("span",{children:"10"})]})]}),jsxRuntime.jsxs("button",{onClick:c,style:{padding:"14px 50px",background:"white",border:"none",borderRadius:"30px",color:"#11998e",fontSize:"16px",fontWeight:"bold",cursor:"pointer"},children:["Submit (",n,"/10)"]})]})]})},Y=["https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4","https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4","https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4"],ze=["https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=1080&h=1920&fit=crop","https://images.unsplash.com/photo-1517841905240-472988babdf9?w=1080&h=1920&fit=crop"],W=["https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=150&h=150&fit=crop","https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop","https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop","https://images.unsplash.com/photo-1517841905240-472988babdf9?w=150&h=150&fit=crop","https://images.unsplash.com/photo-1539571696357-5a69c17a67c6?w=150&h=150&fit=crop","https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&h=150&fit=crop"],ue=[{id:"user-travel",username:"Travel",avatarUrl:W[0],hasUnreadStories:true,stories:[{id:"travel-1",type:"image",src:"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop",duration:5e3,alt:"Beautiful mountain landscape"},{id:"travel-2",type:"image",src:"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop",duration:5e3,alt:"Scenic ocean view"},{id:"travel-3",type:"text",text:`Adventure awaits! \u{1F30D}
2
+
3
+ Swipe to explore more destinations \u2192`,backgroundColor:"#FF6B6B",textColor:"#FFFFFF",duration:4e3},{id:"travel-4",type:"video",src:Y[0],duration:15e3}]},{id:"user-polls",username:"Interactive",avatarUrl:W[1],hasUnreadStories:true,stories:[{id:"poll-intro",type:"text",text:`Let's have some fun! \u{1F3AE}
4
+
5
+ Interactive stories ahead \u2192`,backgroundColor:"#667eea",textColor:"#FFFFFF",duration:3e3},{id:"poll-1",type:"custom_component",component:$e,duration:3e4},{id:"quiz-1",type:"custom_component",component:Ve,duration:3e4},{id:"slider-1",type:"custom_component",component:We,duration:3e4}]},{id:"user-product",username:"Shop",avatarUrl:W[2],hasUnreadStories:true,stories:[{id:"product-1",type:"custom_component",component:It,duration:8e3},{id:"product-2",type:"image",src:"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=1080&h=1920&fit=crop",duration:5e3,alt:"Product showcase"},{id:"product-3",type:"text",text:`Limited Time Offer! \u{1F525}
6
+
7
+ 50% OFF
8
+
9
+ Use code: STORY50`,backgroundColor:"#000000",textColor:"#FFFFFF",duration:5e3}]},{id:"user-launch",username:"Events",avatarUrl:W[3],hasUnreadStories:true,stories:[{id:"launch-1",type:"custom_component",component:wt,duration:1e4},{id:"launch-2",type:"text",text:`Mark your calendars! \u{1F4C5}
10
+
11
+ Big announcement coming soon...`,backgroundColor:"#302b63",textColor:"#FFFFFF",duration:4e3},{id:"launch-3",type:"image",src:"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=1080&h=1920&fit=crop",duration:5e3,alt:"Event teaser"}]},{id:"user-video",username:"Videos",avatarUrl:W[4],hasUnreadStories:true,stories:[{id:"video-1",type:"video",src:Y[1],duration:15e3},{id:"video-2",type:"video",src:Y[2],duration:15e3},{id:"video-3",type:"text",text:`More videos coming soon! \u{1F3AC}
12
+
13
+ Stay tuned \u2192`,backgroundColor:"#4ECDC4",textColor:"#FFFFFF",duration:3e3}]},{id:"user-lifestyle",username:"Lifestyle",avatarUrl:W[5],hasUnreadStories:false,stories:[{id:"lifestyle-1",type:"image",src:"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop",duration:5e3,alt:"Nature scene"},{id:"lifestyle-2",type:"image",src:"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop",duration:5e3,alt:"Peaceful landscape"},{id:"lifestyle-3",type:"text",text:`Find your peace \u{1F9D8}
14
+
15
+ Nature heals everything`,backgroundColor:"#45B7D1",textColor:"#FFFFFF",duration:4e3}]}],Ct=(e=50)=>{let r=[...ue];for(let o=ue.length;o<e;o++){let n=Math.random()>.3,l=Math.floor(Math.random()*5)+2;r.push({id:`user-${o}`,username:`User ${o}`,avatarUrl:`https://i.pravatar.cc/150?img=${o%70}`,hasUnreadStories:n,stories:Array.from({length:l},(i,a)=>{let c=Math.random();if(c<.5)return {id:`story-${o}-${a}`,type:"image",src:ze[Math.floor(Math.random()*ze.length)],duration:5e3,alt:`Story from User ${o}`};if(c<.7)return {id:`story-${o}-${a}`,type:"video",src:Y[Math.floor(Math.random()*Y.length)],duration:15e3};if(c<.9){let m=["#FF6B6B","#4ECDC4","#45B7D1","#FFA07A","#98D8C8","#667eea","#764ba2"];return {id:`story-${o}-${a}`,type:"text",text:`Hello from User ${o}! \u{1F44B}
16
+
17
+ This is story ${a+1}`,backgroundColor:m[Math.floor(Math.random()*m.length)],textColor:"#FFFFFF",duration:4e3}}let t=[$e,Ve,We];return {id:`story-${o}-${a}`,type:"custom_component",component:t[Math.floor(Math.random()*t.length)],duration:3e4}})});}return r};exports.Stories=Be;exports.demoUsers=ue;exports.generateDemoUsers=Ct;//# sourceMappingURL=index.cjs.map
18
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Avatar.tsx","../src/components/AvatarList.tsx","../src/hooks/useTimer.ts","../src/hooks/useKeyboard.ts","../src/hooks/useFocusTrap.ts","../src/hooks/usePageVisibility.ts","../src/hooks/usePreloader.ts","../src/components/ProgressBar.tsx","../src/components/StoryProgressBars.tsx","../src/components/StoryItem.tsx","../src/components/StoryViewer.tsx","../src/utils/storyHelpers.ts","../src/components/Stories.tsx","../src/utils/demoData.tsx"],"names":["Avatar","memo","avatarUrl","username","hasUnreadStories","onClick","imageLoaded","setImageLoaded","useState","imageError","setImageError","jsxs","jsx","AVATAR_WIDTH","OVERSCAN_COUNT","AvatarList","users","onAvatarClick","containerRef","useRef","scrollLeft","setScrollLeft","containerWidth","setContainerWidth","handleScroll","useCallback","useEffect","updateWidth","startIndex","endIndex","React","start","visibleCount","totalWidth","virtualItems","user","idx","index","useTimer","duration","onComplete","autoStart","progress","setProgress","isPaused","setIsPaused","currentDuration","setCurrentDuration","startTimeRef","accumulatedTimeRef","rafRef","updateProgressRef","updateProgress","elapsed","newProgress","pause","resume","reset","setDuration","ms","useKeyboard","onLeft","onRight","onSpace","onEscape","enabled","handleKeyDown","e","useFocusTrap","previousFocusRef","container","focusableElements","firstFocusable","lastFocusable","handleTabKey","usePageVisibility","isVisible","setIsVisible","handleVisibilityChange","usePreloader","cacheRef","loadingRef","preloadImage","src","resolve","reject","checkInterval","img","preloadVideo","video","handleCanPlay","cleanup","handleError","preloadStoryItem","item","error","preloadMultiple","items","chunks","i","chunk","isPreloaded","clearCache","ProgressBar","isActive","progressPercent","StoryProgressBars","total","currentIndex","_","StoryItem","onDurationDetected","onLoadError","onBufferingChange","controls","videoRef","hasError","setHasError","isLoading","setIsLoading","handleLoadedMetadata","handleWaiting","handlePlaying","handleStalled","rafId","syncProgress","handleImageLoad","Component","DEFAULT_DURATION","StoryViewer","initialUserIndex","initialStoryIndex","isOpen","onClose","onStoryChange","currentUserIndex","setCurrentUserIndex","currentStoryIndex","setCurrentStoryIndex","isTransitioning","setIsTransitioning","transitionDirection","setTransitionDirection","isUserLoading","setIsUserLoading","timerRef","scrollPositionRef","currentDurationRef","hasStartedLoadingRef","currentUser","currentStory","totalStories","focusTrapRef","isPageVisible","handlePause","handleResume","handleNextRef","timer","handleBufferingChange","buffering","handleNext","nextIndex","nextUserIndex","handlePrevious","prevIndex","prevUserIndex","prevUser","lastStoryIndex","handleClose","storyControls","useMemo","handleTap","event","target","rect","touchStartRef","isDraggingRef","handlePointerDown","handlePointerMove","deltaX","deltaY","itemsToPreload","preloadPromises","handleLoadError","content","createPortal","findStoryIndices","storyId","userIndex","storyIndex","story","Stories","closeNavigateTo","useParams","navigate","useNavigate","viewerState","setViewerState","indices","handleAvatarClick","firstStoryId","handleCloseViewer","handleStoryChange","Fragment","PollComponent","next","selected","setSelected","votes","setVotes","handleVote","option","newVotes","a","b","percentage","isSelected","QuizComponent","answered","setAnswered","correctAnswer","handleAnswer","isCorrect","bgColor","CountdownComponent","timeLeft","setTimeLeft","prev","days","hours","minutes","seconds","TimeBox","value","label","ProductShowcaseComponent","SliderComponent","setValue","submitted","setSubmitted","handleSubmit","sampleVideos","sampleImages","avatarImages","demoUsers","generateDemoUsers","count","hasUnread","storyCount","storyIdx","typeRandom","backgrounds","components"],"mappings":"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","file":"index.cjs","sourcesContent":["import { memo, useState } from 'react';\n\ninterface AvatarProps {\n avatarUrl: string;\n username: string;\n hasUnreadStories?: boolean;\n onClick: () => void;\n}\n\nexport const Avatar = memo<AvatarProps>(\n ({ avatarUrl, username, hasUnreadStories = false, onClick }) => {\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n\n return (\n <button\n className={`story-avatar ${hasUnreadStories ? 'story-avatar-unread' : 'story-avatar-read'}`}\n onClick={onClick}\n aria-label={`View ${username}'s story`}\n >\n <div className=\"story-avatar-ring\">\n <div className=\"story-avatar-image-wrapper\">\n {!imageError ? (\n <img\n src={avatarUrl}\n alt={username}\n className={`story-avatar-image ${imageLoaded ? 'story-avatar-image-loaded' : ''}`}\n loading=\"lazy\"\n onLoad={() => setImageLoaded(true)}\n onError={() => setImageError(true)}\n />\n ) : (\n <div className=\"story-avatar-placeholder\">\n {username.charAt(0).toUpperCase()}\n </div>\n )}\n </div>\n </div>\n <span className=\"story-avatar-username\">{username}</span>\n </button>\n );\n }\n);\n\nAvatar.displayName = 'Avatar';\n","import React, { useRef, useEffect, useState, useCallback, memo } from 'react';\nimport { User } from '../types';\nimport { Avatar } from './Avatar';\n\ninterface AvatarListProps {\n users: User[];\n onAvatarClick: (userIndex: number) => void;\n}\n\nconst AVATAR_WIDTH = 90; // Approximate width including margin\nconst OVERSCAN_COUNT = 3; // Render extra items outside viewport\n\nexport const AvatarList = memo<AvatarListProps>(({ users, onAvatarClick }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const [scrollLeft, setScrollLeft] = useState(0);\n const [containerWidth, setContainerWidth] = useState(0);\n\n // Update scroll position\n const handleScroll = useCallback(() => {\n if (containerRef.current) {\n setScrollLeft(containerRef.current.scrollLeft);\n }\n }, []);\n\n // Update container width on resize\n useEffect(() => {\n const updateWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.clientWidth);\n }\n };\n\n updateWidth();\n window.addEventListener('resize', updateWidth);\n\n return () => {\n window.removeEventListener('resize', updateWidth);\n };\n }, []);\n\n // Calculate visible range\n const { startIndex, endIndex } = React.useMemo(() => {\n const start = Math.floor(scrollLeft / AVATAR_WIDTH);\n const visibleCount = Math.ceil(containerWidth / AVATAR_WIDTH);\n \n return {\n startIndex: Math.max(0, start - OVERSCAN_COUNT),\n endIndex: Math.min(users.length, start + visibleCount + OVERSCAN_COUNT),\n };\n }, [scrollLeft, containerWidth, users.length]);\n\n // Calculate total width\n const totalWidth = users.length * AVATAR_WIDTH;\n\n // Virtual items to render\n const virtualItems = users.slice(startIndex, endIndex).map((user, idx) => ({\n user,\n index: startIndex + idx,\n }));\n\n return (\n <div\n ref={containerRef}\n className=\"story-avatar-list\"\n onScroll={handleScroll}\n role=\"list\"\n aria-label=\"Stories\"\n >\n <div\n className=\"story-avatar-list-inner\"\n style={{\n width: `${totalWidth}px`,\n position: 'relative',\n }}\n >\n {virtualItems.map(({ user, index }) => (\n <div\n key={user.id}\n className=\"story-avatar-item\"\n style={{\n position: 'absolute',\n left: `${index * AVATAR_WIDTH}px`,\n width: `${AVATAR_WIDTH}px`,\n }}\n role=\"listitem\"\n >\n <Avatar\n avatarUrl={user.avatarUrl}\n username={user.username}\n hasUnreadStories={user.hasUnreadStories}\n onClick={() => onAvatarClick(index)}\n />\n </div>\n ))}\n </div>\n </div>\n );\n});\n\nAvatarList.displayName = 'AvatarList';\n","import { useEffect, useRef, useState, useCallback } from \"react\";\n\nexport interface UseTimerOptions {\n duration: number;\n onComplete?: () => void;\n autoStart?: boolean;\n}\n\nexport interface UseTimerReturn {\n progress: number; // 0 to 1\n isPaused: boolean;\n pause: () => void;\n resume: () => void;\n reset: () => void;\n setDuration: (ms: number) => void;\n}\n\nexport const useTimer = ({\n duration,\n onComplete,\n autoStart = true,\n}: UseTimerOptions): UseTimerReturn => {\n const [progress, setProgress] = useState(0);\n const [isPaused, setIsPaused] = useState(!autoStart);\n const [currentDuration, setCurrentDuration] = useState(duration);\n\n const startTimeRef = useRef<number | null>(null);\n const accumulatedTimeRef = useRef(0);\n const rafRef = useRef<number | null>(null);\n const updateProgressRef = useRef<() => void>();\n\n const updateProgress = useCallback(() => {\n if (!startTimeRef.current || isPaused) return;\n\n const elapsed =\n Date.now() - startTimeRef.current + accumulatedTimeRef.current;\n const newProgress = Math.min(elapsed / currentDuration, 1);\n\n setProgress(newProgress);\n\n if (newProgress >= 1) {\n onComplete?.();\n return;\n }\n\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, [currentDuration, isPaused, onComplete]);\n\n // Keep the ref updated with the latest function\n updateProgressRef.current = updateProgress;\n\n const pause = useCallback(() => {\n if (isPaused) return;\n\n if (startTimeRef.current) {\n accumulatedTimeRef.current += Date.now() - startTimeRef.current;\n }\n\n setIsPaused(true);\n\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, [isPaused]);\n\n const resume = useCallback(() => {\n if (!isPaused) return;\n\n startTimeRef.current = Date.now();\n setIsPaused(false);\n }, [isPaused]);\n\n const reset = useCallback(() => {\n // Cancel any existing animation frame\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n\n startTimeRef.current = Date.now();\n accumulatedTimeRef.current = 0;\n setProgress(0);\n setIsPaused(false);\n\n // Force start animation frame\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }, []);\n\n const setDuration = useCallback((ms: number) => {\n setCurrentDuration(ms);\n }, []);\n\n // Start/restart animation loop when paused state changes\n useEffect(() => {\n if (!isPaused) {\n startTimeRef.current = Date.now();\n rafRef.current = requestAnimationFrame(updateProgressRef.current!);\n }\n\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, [isPaused]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (rafRef.current) {\n cancelAnimationFrame(rafRef.current);\n }\n };\n }, []);\n\n return {\n progress,\n isPaused,\n pause,\n resume,\n reset,\n setDuration,\n };\n};\n","import { useEffect } from 'react';\n\nexport interface UseKeyboardOptions {\n onLeft?: () => void;\n onRight?: () => void;\n onSpace?: () => void;\n onEscape?: () => void;\n enabled?: boolean;\n}\n\nexport const useKeyboard = ({\n onLeft,\n onRight,\n onSpace,\n onEscape,\n enabled = true,\n}: UseKeyboardOptions) => {\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault();\n onLeft?.();\n break;\n case 'ArrowRight':\n e.preventDefault();\n onRight?.();\n break;\n case ' ':\n e.preventDefault();\n onSpace?.();\n break;\n case 'Escape':\n e.preventDefault();\n onEscape?.();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown);\n };\n }, [onLeft, onRight, onSpace, onEscape, enabled]);\n};\n","import { useEffect, useRef } from 'react';\n\nexport const useFocusTrap = (enabled: boolean) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n if (!enabled || !containerRef.current) return;\n\n // Store the currently focused element\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n const container = containerRef.current;\n const focusableElements = container.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstFocusable = focusableElements[0];\n const lastFocusable = focusableElements[focusableElements.length - 1];\n\n // Focus first element\n firstFocusable?.focus();\n\n const handleTabKey = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n if (e.shiftKey) {\n if (document.activeElement === firstFocusable) {\n e.preventDefault();\n lastFocusable?.focus();\n }\n } else {\n if (document.activeElement === lastFocusable) {\n e.preventDefault();\n firstFocusable?.focus();\n }\n }\n };\n\n container.addEventListener('keydown', handleTabKey);\n\n return () => {\n container.removeEventListener('keydown', handleTabKey);\n \n // Restore focus to the previously focused element\n previousFocusRef.current?.focus();\n };\n }, [enabled]);\n\n return containerRef;\n};\n","import { useEffect, useState } from 'react';\n\nexport const usePageVisibility = () => {\n const [isVisible, setIsVisible] = useState(!document.hidden);\n\n useEffect(() => {\n const handleVisibilityChange = () => {\n setIsVisible(!document.hidden);\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n return () => {\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n };\n }, []);\n\n return isVisible;\n};\n","import { useEffect, useRef, useCallback } from 'react';\nimport { StoryItem } from '../types';\n\ninterface PreloadCache {\n [key: string]: boolean;\n}\n\nexport const usePreloader = () => {\n const cacheRef = useRef<PreloadCache>({});\n const loadingRef = useRef<Set<string>>(new Set());\n\n const preloadImage = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src]) {\n resolve();\n return;\n }\n\n if (loadingRef.current.has(src)) {\n // Already loading, wait for it\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const img = new Image();\n img.onload = () => {\n cacheRef.current[src] = true;\n loadingRef.current.delete(src);\n resolve();\n };\n img.onerror = () => {\n loadingRef.current.delete(src);\n reject(new Error(`Failed to load image: ${src}`));\n };\n img.src = src;\n });\n }, []);\n\n const preloadVideo = useCallback((src: string): Promise<void> => {\n return new Promise((resolve, reject) => {\n if (cacheRef.current[src]) {\n resolve();\n return;\n }\n\n if (loadingRef.current.has(src)) {\n const checkInterval = setInterval(() => {\n if (cacheRef.current[src] || !loadingRef.current.has(src)) {\n clearInterval(checkInterval);\n resolve();\n }\n }, 100);\n return;\n }\n\n loadingRef.current.add(src);\n\n const video = document.createElement('video');\n video.preload = 'auto';\n \n const handleCanPlay = () => {\n cacheRef.current[src] = true;\n loadingRef.current.delete(src);\n cleanup();\n resolve();\n };\n\n const handleError = () => {\n loadingRef.current.delete(src);\n cleanup();\n reject(new Error(`Failed to load video: ${src}`));\n };\n\n const cleanup = () => {\n video.removeEventListener('canplaythrough', handleCanPlay);\n video.removeEventListener('error', handleError);\n video.src = '';\n };\n\n video.addEventListener('canplaythrough', handleCanPlay);\n video.addEventListener('error', handleError);\n video.src = src;\n video.load();\n });\n }, []);\n\n const preloadStoryItem = useCallback(async (item: StoryItem): Promise<void> => {\n try {\n if (item.type === 'image' && 'src' in item) {\n await preloadImage(item.src);\n } else if (item.type === 'video' && 'src' in item) {\n await preloadVideo(item.src);\n }\n // Text and component types don't need preloading\n } catch (error) {\n console.warn('Failed to preload story item:', error);\n }\n }, [preloadImage, preloadVideo]);\n\n const preloadMultiple = useCallback(async (items: StoryItem[]): Promise<void> => {\n // Preload in parallel but limit concurrent loads\n const CONCURRENT_LIMIT = 3;\n const chunks: StoryItem[][] = [];\n \n for (let i = 0; i < items.length; i += CONCURRENT_LIMIT) {\n chunks.push(items.slice(i, i + CONCURRENT_LIMIT));\n }\n\n for (const chunk of chunks) {\n await Promise.allSettled(chunk.map(preloadStoryItem));\n }\n }, [preloadStoryItem]);\n\n const isPreloaded = useCallback((src: string): boolean => {\n return cacheRef.current[src] || false;\n }, []);\n\n const clearCache = useCallback(() => {\n cacheRef.current = {};\n loadingRef.current.clear();\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n clearCache();\n };\n }, [clearCache]);\n\n return {\n preloadImage,\n preloadVideo,\n preloadStoryItem,\n preloadMultiple,\n isPreloaded,\n clearCache,\n };\n};\n","import { memo } from \"react\";\n\ninterface ProgressBarProps {\n progress: number; // 0 to 1\n isActive: boolean;\n}\n\nexport const ProgressBar = memo<ProgressBarProps>(({ progress, isActive }) => {\n const progressPercent = Math.round(progress * 100);\n\n return (\n <div\n className=\"story-progress-bar\"\n role=\"progressbar\"\n aria-valuenow={isActive ? progressPercent : progress === 1 ? 100 : 0}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Story progress: ${progressPercent}%`}\n >\n <div\n className=\"story-progress-bar-fill\"\n style={{\n transform: `scaleX(${isActive ? progress : progress === 1 ? 1 : 0})`,\n }}\n />\n </div>\n );\n});\n\nProgressBar.displayName = \"ProgressBar\";\n","import { memo } from \"react\";\nimport { ProgressBar } from \"./ProgressBar\";\n\ninterface StoryProgressBarsProps {\n total: number;\n currentIndex: number;\n progress: number;\n}\n\nexport const StoryProgressBars = memo<StoryProgressBarsProps>(\n ({ total, currentIndex, progress }) => {\n return (\n <div className=\"story-progress-bars-container\">\n {Array.from({ length: total }).map((_, index) => (\n <ProgressBar\n key={index}\n progress={\n index < currentIndex ? 1 : index === currentIndex ? progress : 0\n }\n isActive={index === currentIndex}\n />\n ))}\n </div>\n );\n }\n);\n\nStoryProgressBars.displayName = \"StoryProgressBars\";\n","import { memo, useEffect, useRef, useState, useCallback } from \"react\";\nimport { StoryItem as StoryItemType, StoryItemControls } from \"../types\";\n\ninterface StoryItemProps {\n item: StoryItemType;\n isActive: boolean;\n isPaused: boolean;\n onDurationDetected?: (duration: number) => void;\n onLoadError?: () => void;\n onBufferingChange?: (isBuffering: boolean) => void;\n controls: StoryItemControls;\n}\n\nexport const StoryItem = memo<StoryItemProps>(\n ({ item, isActive, isPaused, onDurationDetected, onLoadError, onBufferingChange, controls }) => {\n const videoRef = useRef<HTMLVideoElement>(null);\n const [hasError, setHasError] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n\n // Handle video playback\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const playVideo = async () => {\n try {\n if (isPaused) {\n video.pause();\n } else {\n await video.play();\n }\n } catch (error) {\n console.warn(\"Video play failed:\", error);\n }\n };\n\n playVideo();\n }, [item.type, isActive, isPaused]);\n\n // Detect video duration\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current) return;\n\n const video = videoRef.current;\n\n const handleLoadedMetadata = () => {\n if (video.duration && isFinite(video.duration)) {\n onDurationDetected?.(video.duration * 1000);\n }\n };\n\n const handleCanPlay = () => {\n setIsLoading(false);\n };\n\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"canplay\", handleCanPlay);\n\n // Check if metadata already loaded\n if (video.readyState >= 1) {\n handleLoadedMetadata();\n }\n\n // Check if can play\n if (video.readyState >= 3) {\n handleCanPlay();\n }\n\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"canplay\", handleCanPlay);\n };\n }, [item.type, onDurationDetected]);\n\n // Handle video buffering states\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n\n const handleWaiting = () => {\n // Video is buffering\n onBufferingChange?.(true);\n };\n\n const handlePlaying = () => {\n // Video resumed after buffering\n onBufferingChange?.(false);\n };\n\n const handleStalled = () => {\n // Video stalled due to network issues\n onBufferingChange?.(true);\n };\n\n video.addEventListener(\"waiting\", handleWaiting);\n video.addEventListener(\"playing\", handlePlaying);\n video.addEventListener(\"stalled\", handleStalled);\n\n return () => {\n video.removeEventListener(\"waiting\", handleWaiting);\n video.removeEventListener(\"playing\", handlePlaying);\n video.removeEventListener(\"stalled\", handleStalled);\n };\n }, [item.type, isActive, onBufferingChange]);\n\n // Sync video progress with timer for more accurate progress bar\n useEffect(() => {\n if (item.type !== \"video\" || !videoRef.current || !isActive) return;\n\n const video = videoRef.current;\n let rafId: number;\n\n const syncProgress = () => {\n if (video.duration && isFinite(video.duration)) {\n // This allows the progress bar to sync with video playhead\n // The timer in StoryViewer will handle the actual progress\n }\n rafId = requestAnimationFrame(syncProgress);\n };\n\n rafId = requestAnimationFrame(syncProgress);\n\n return () => {\n cancelAnimationFrame(rafId);\n };\n }, [item.type, isActive]);\n\n const handleError = useCallback(() => {\n setHasError(true);\n setIsLoading(false);\n onLoadError?.();\n }, [onLoadError]);\n\n const handleImageLoad = useCallback(() => {\n setIsLoading(false);\n }, []);\n\n if (hasError) {\n return (\n <div className=\"story-item story-item-error\">\n <div className=\"story-item-error-message\">Failed to load content</div>\n </div>\n );\n }\n\n switch (item.type) {\n case \"image\":\n return (\n <div className=\"story-item story-item-image\">\n {isLoading && (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <img\n src={item.src}\n alt={item.alt || \"Story image\"}\n onError={handleError}\n onLoad={handleImageLoad}\n draggable={false}\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"video\":\n return (\n <div className=\"story-item story-item-video\">\n {isLoading && (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\"></div>\n </div>\n )}\n <video\n ref={videoRef}\n src={item.src}\n playsInline\n loop={false}\n onError={handleError}\n preload=\"auto\"\n style={{ opacity: isLoading ? 0 : 1 }}\n />\n </div>\n );\n\n case \"text\":\n return (\n <div\n className=\"story-item story-item-text\"\n style={{\n backgroundColor: item.backgroundColor || \"#000\",\n color: item.textColor || \"#fff\",\n }}\n >\n <div className=\"story-item-text-content\">{item.text}</div>\n </div>\n );\n\n case \"custom_component\":\n const Component = item.component;\n return (\n <div className=\"story-item story-item-component\">\n <Component {...controls} />\n </div>\n );\n\n default:\n return null;\n }\n }\n);\n\nStoryItem.displayName = \"StoryItem\";\n","import React, {\n useState,\n useEffect,\n useCallback,\n useRef,\n useMemo,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { User, StoryItem as StoryItemType, StoryItemControls } from \"../types\";\nimport { useTimer } from \"../hooks/useTimer\";\nimport { useKeyboard } from \"../hooks/useKeyboard\";\nimport { useFocusTrap } from \"../hooks/useFocusTrap\";\nimport { usePageVisibility } from \"../hooks/usePageVisibility\";\nimport { usePreloader } from \"../hooks/usePreloader\";\nimport { StoryProgressBars } from \"./StoryProgressBars\";\nimport { StoryItem } from \"./StoryItem\";\n\ninterface StoryViewerProps {\n users: User[];\n initialUserIndex: number;\n initialStoryIndex?: number;\n isOpen: boolean;\n onClose: () => void;\n onStoryChange?: (userIndex: number, storyIndex: number) => void;\n}\n\nconst DEFAULT_DURATION = 5000;\n\nexport const StoryViewer: React.FC<StoryViewerProps> = React.memo(\n ({ users, initialUserIndex, initialStoryIndex, isOpen, onClose, onStoryChange }) => {\n // State\n const [currentUserIndex, setCurrentUserIndex] = useState(initialUserIndex);\n const [currentStoryIndex, setCurrentStoryIndex] = useState(initialStoryIndex ?? 0);\n const [isPaused, setIsPaused] = useState(false);\n\n // Update indices when initial props change\n useEffect(() => {\n setCurrentUserIndex(initialUserIndex);\n }, [initialUserIndex]);\n\n useEffect(() => {\n setCurrentStoryIndex(initialStoryIndex ?? 0);\n }, [initialStoryIndex]);\n const [isTransitioning, setIsTransitioning] = useState(false);\n const [transitionDirection, setTransitionDirection] = useState<\n \"left\" | \"right\" | null\n >(null);\n const [isLoading, setIsLoading] = useState(false);\n const [isUserLoading, setIsUserLoading] = useState(false);\n\n // Refs\n const containerRef = useRef<HTMLDivElement>(null);\n const timerRef = useRef<any>(null);\n const scrollPositionRef = useRef(0);\n const currentDurationRef = useRef(DEFAULT_DURATION);\n const hasStartedLoadingRef = useRef(false);\n\n // Current data\n const currentUser = users[currentUserIndex];\n const currentStory = currentUser?.stories[currentStoryIndex];\n const totalStories = currentUser?.stories.length || 0;\n\n // Update duration ref when story changes\n useEffect(() => {\n currentDurationRef.current = currentStory?.duration || DEFAULT_DURATION;\n }, [currentStory?.duration]);\n\n // Hooks\n const focusTrapRef = useFocusTrap(isOpen);\n const isPageVisible = usePageVisibility();\n const { preloadStoryItem } = usePreloader();\n\n // Pause/Resume\n const handlePause = useCallback(() => setIsPaused(true), []);\n const handleResume = useCallback(() => setIsPaused(false), []);\n\n // Placeholder for handleNext - will be defined after timer\n const handleNextRef = useRef<() => void>();\n\n const timer = useTimer({\n duration: currentDurationRef.current || DEFAULT_DURATION,\n onComplete: () => handleNextRef.current?.(),\n autoStart: false,\n });\n\n // Handle video buffering\n const handleBufferingChange = useCallback((buffering: boolean) => {\n if (buffering) {\n timer.pause();\n } else if (!isPaused) {\n // Only resume if not manually paused\n timer.resume();\n }\n }, [timer, isPaused]);\n\n // Update timer duration when story changes\n useEffect(() => {\n const duration = currentStory?.duration || DEFAULT_DURATION;\n timer.setDuration(duration);\n }, [timer, currentStory?.duration]);\n\n // Navigation functions\n const handleNext = useCallback(() => {\n if (!currentUser) return;\n\n if (currentStoryIndex < totalStories - 1) {\n const nextIndex = currentStoryIndex + 1;\n const nextStory = currentUser.stories[nextIndex];\n const duration = nextStory?.duration || DEFAULT_DURATION;\n\n setCurrentStoryIndex(nextIndex);\n timer.setDuration(duration);\n timer.reset();\n } else if (currentUserIndex < users.length - 1) {\n // Show loading for next user\n setIsUserLoading(true);\n setTimeout(() => {\n // Transition to next user with slide animation\n setIsTransitioning(true);\n setTransitionDirection(\"left\");\n setTimeout(() => {\n const nextUserIndex = currentUserIndex + 1;\n const nextUser = users[nextUserIndex];\n const firstStory = nextUser.stories[0];\n const duration = firstStory?.duration || DEFAULT_DURATION;\n\n setCurrentUserIndex(nextUserIndex);\n setCurrentStoryIndex(0);\n setIsTransitioning(false);\n setTransitionDirection(null);\n setIsUserLoading(false); // Hide loading after indices are updated\n\n timer.setDuration(duration);\n timer.reset();\n }, 150); // Match CSS transition duration\n }, 1000); // Simulate 1s loading for user data\n } else {\n onClose();\n }\n }, [\n currentUser,\n currentStoryIndex,\n totalStories,\n currentUserIndex,\n users,\n timer,\n onClose,\n ]);\n\n const handlePrevious = useCallback(() => {\n if (!currentUser) return;\n\n if (currentStoryIndex > 0) {\n const prevIndex = currentStoryIndex - 1;\n const prevStory = currentUser.stories[prevIndex];\n const duration = prevStory?.duration || DEFAULT_DURATION;\n\n setCurrentStoryIndex(prevIndex);\n timer.setDuration(duration);\n timer.reset();\n } else if (currentUserIndex > 0) {\n // Show loading for previous user\n setIsUserLoading(true);\n setTimeout(() => {\n // Transition to previous user with slide animation\n setIsTransitioning(true);\n setTransitionDirection(\"right\");\n setTimeout(() => {\n const prevUserIndex = currentUserIndex - 1;\n const prevUser = users[prevUserIndex];\n const lastStoryIndex = prevUser.stories.length - 1;\n const lastStory = prevUser.stories[lastStoryIndex];\n const duration = lastStory?.duration || DEFAULT_DURATION;\n\n setCurrentUserIndex(prevUserIndex);\n setCurrentStoryIndex(lastStoryIndex);\n setIsTransitioning(false);\n setTransitionDirection(null);\n setIsUserLoading(false); // Hide loading after indices are updated\n\n timer.setDuration(duration);\n timer.reset();\n }, 150); // Match CSS transition duration\n }, 1000); // Simulate 1s loading for user data\n }\n }, [currentUser, currentStoryIndex, currentUserIndex, users, timer]);\n\n const handleClose = useCallback(() => {\n // Restore scroll position\n window.scrollTo(0, scrollPositionRef.current);\n onClose();\n }, [onClose]);\n\n // Update the ref when handleNext changes\n useEffect(() => {\n handleNextRef.current = handleNext;\n }, [handleNext]);\n\n // Story controls for custom components\n const storyControls: StoryItemControls = useMemo(\n () => ({\n pause: handlePause,\n resume: handleResume,\n next: handleNext,\n prev: handlePrevious,\n setDuration: (ms: number) => timerRef.current?.setDuration(ms),\n }),\n [handlePause, handleResume, handleNext, handlePrevious]\n );\n\n // Handle taps for story navigation\n const handleTap = useCallback(\n (event: React.MouseEvent) => {\n // Don't handle taps on interactive elements\n const target = event.target as HTMLElement;\n if (\n target.closest(\".story-viewer-close\") ||\n target.closest(\"button\") ||\n target.closest(\"input\") ||\n target.closest(\"select\") ||\n target.closest(\"textarea\")\n ) {\n return;\n }\n\n const container = containerRef.current;\n if (!container) return;\n\n const rect = container.getBoundingClientRect();\n const relativeX = event.clientX - rect.left;\n const isLeftSide = relativeX < rect.width / 2;\n\n if (isLeftSide) {\n handlePrevious();\n } else {\n handleNext();\n }\n },\n [handlePrevious, handleNext]\n );\n\n // Touch/mouse gesture handling\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n const isDraggingRef = useRef(false);\n\n const handlePointerDown = useCallback(\n (event: React.PointerEvent) => {\n isDraggingRef.current = false;\n touchStartRef.current = {\n x: event.clientX,\n y: event.clientY,\n };\n handlePause();\n },\n [handlePause]\n );\n\n const handlePointerMove = useCallback((event: React.PointerEvent) => {\n if (!touchStartRef.current) return;\n\n const deltaX = event.clientX - touchStartRef.current.x;\n const deltaY = event.clientY - touchStartRef.current.y;\n\n // Check if this is a drag (moved more than 10px)\n if (Math.abs(deltaX) > 10 || Math.abs(deltaY) > 10) {\n isDraggingRef.current = true;\n }\n }, []);\n\n // Keyboard support\n useKeyboard({\n onLeft: handlePrevious,\n onRight: handleNext,\n onSpace: () => (isPaused ? handleResume() : handlePause()),\n onEscape: handleClose,\n enabled: isOpen,\n });\n\n // Pause on page visibility change\n useEffect(() => {\n if (!isPageVisible) {\n handlePause();\n } else if (isPageVisible && !isPaused) {\n handleResume();\n }\n }, [isPageVisible, handlePause, handleResume, isPaused]);\n\n // Preload adjacent stories\n useEffect(() => {\n if (!isOpen || !currentUser) return;\n\n const itemsToPreload: StoryItemType[] = [];\n\n // Current user's adjacent stories\n if (currentStoryIndex < totalStories - 1) {\n itemsToPreload.push(currentUser.stories[currentStoryIndex + 1]);\n }\n if (currentStoryIndex > 0) {\n itemsToPreload.push(currentUser.stories[currentStoryIndex - 1]);\n }\n\n // Adjacent users' first stories\n if (currentUserIndex < users.length - 1) {\n itemsToPreload.push(users[currentUserIndex + 1].stories[0]);\n }\n if (currentUserIndex > 0) {\n itemsToPreload.push(users[currentUserIndex - 1].stories[0]);\n }\n\n // Limit concurrent preloads\n const preloadPromises = itemsToPreload\n .slice(0, 3)\n .map((item) => preloadStoryItem(item).catch(() => { }));\n\n Promise.all(preloadPromises);\n }, [\n isOpen,\n currentUser,\n currentUserIndex,\n currentStoryIndex,\n totalStories,\n users,\n preloadStoryItem,\n ]);\n\n // Handle initial loading when opening story viewer\n useEffect(() => {\n if (isOpen && !hasStartedLoadingRef.current) {\n hasStartedLoadingRef.current = true;\n setIsLoading(true);\n // Preload current story\n if (currentStory) {\n preloadStoryItem(currentStory);\n }\n // Simulate API call to fetch user stories\n setTimeout(() => {\n setIsLoading(false);\n scrollPositionRef.current = window.scrollY;\n document.body.style.overflow = \"hidden\";\n // Start timer when opening story viewer\n timer.resume();\n }, 1500); // Simulate 1.5s loading time\n } else if (!isOpen) {\n hasStartedLoadingRef.current = false;\n document.body.style.overflow = \"\";\n setIsLoading(false);\n setIsUserLoading(false);\n }\n\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [isOpen, timer]);\n\n // Notify parent of story changes\n useEffect(() => {\n if (onStoryChange && isOpen) {\n onStoryChange(currentUserIndex, currentStoryIndex);\n }\n }, [currentUserIndex, currentStoryIndex, onStoryChange, isOpen]);\n\n // Handle load errors\n const handleLoadError = useCallback(() => {\n console.warn(\"Story item failed to load, skipping...\");\n setTimeout(handleNext, 500);\n }, [handleNext]);\n\n // Early return\n if (!isOpen) {\n return null;\n }\n\n if (!currentUser || !currentStory) {\n return null;\n }\n\n const content = (\n <div\n ref={containerRef}\n className=\"story-viewer\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={`Stories by ${currentUser?.username || \"user\"}`}\n aria-describedby=\"story-viewer-description\"\n >\n <div className=\"story-viewer-overlay\" onClick={handleClose} />\n\n {/* Hidden description for screen readers */}\n <div id=\"story-viewer-description\" className=\"sr-only\">\n Instagram-style stories viewer. Tap left side to go to previous story,\n right side to go to next story. Swipe left or right to navigate\n between users. Press Escape to close.\n </div>\n\n {/* Live region for announcements */}\n <div aria-live=\"polite\" aria-atomic=\"true\" className=\"sr-only\">\n Viewing story {currentStoryIndex + 1} of {totalStories} by{\" \"}\n {currentUser?.username}\n </div>\n\n <div\n ref={focusTrapRef}\n className={`story-viewer-content ${isTransitioning\n ? `story-viewer-transitioning story-viewer-transition-${transitionDirection}`\n : \"\"\n }`}\n onClick={handleTap}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onMouseEnter={handlePause}\n onMouseLeave={handleResume}\n >\n <div className=\"story-viewer-header\">\n <StoryProgressBars\n total={totalStories}\n currentIndex={currentStoryIndex}\n progress={timer.progress}\n />\n\n <div className=\"story-viewer-user-info\">\n <img\n src={currentUser.avatarUrl}\n alt={`${currentUser.username} avatar`}\n className=\"story-viewer-avatar\"\n />\n <span className=\"story-viewer-username\">\n {currentUser.username}\n </span>\n </div>\n\n <button\n className=\"story-viewer-close\"\n onClick={handleClose}\n aria-label=\"Close story viewer\"\n type=\"button\"\n >\n ×\n </button>\n </div>\n\n <div className=\"story-viewer-items\">\n {isLoading || isUserLoading ? (\n <div className=\"story-item-loader\">\n <div className=\"story-item-spinner\" />\n </div>\n ) : (\n <StoryItem\n item={currentStory}\n isActive={true}\n isPaused={isPaused || isDraggingRef.current}\n onDurationDetected={(duration) =>\n timerRef.current?.setDuration(duration)\n }\n onLoadError={handleLoadError}\n onBufferingChange={handleBufferingChange}\n controls={storyControls}\n />\n )}\n </div>\n\n <div className=\"story-viewer-nav-hints\">\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-left\" />\n <div className=\"story-viewer-nav-hint story-viewer-nav-hint-right\" />\n </div>\n </div>\n </div>\n );\n\n return createPortal(content, document.body);\n }\n);\n","import { User } from '../types';\n\nexport interface StoryIndices {\n userIndex: number;\n storyIndex: number;\n}\n\n/**\n * Finds the user index and story index for a given story ID\n * @param users - Array of users\n * @param storyId - The story ID to find\n * @returns Object with userIndex and storyIndex, or null if not found\n */\nexport function findStoryIndices(users: User[], storyId: string): StoryIndices | null {\n for (let userIndex = 0; userIndex < users.length; userIndex++) {\n const user = users[userIndex];\n const storyIndex = user.stories.findIndex(story => story.id === storyId);\n if (storyIndex !== -1) {\n return { userIndex, storyIndex };\n }\n }\n return null;\n}\n\n/**\n * Gets the story ID for given user and story indices\n * @param users - Array of users\n * @param userIndex - Index of the user\n * @param storyIndex - Index of the story\n * @returns The story ID, or null if indices are invalid\n */\nexport function getStoryId(users: User[], userIndex: number, storyIndex: number): string | null {\n const user = users[userIndex];\n if (!user) return null;\n const story = user.stories[storyIndex];\n return story ? story.id : null;\n}","import React, { useState, useCallback, useRef, useEffect } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { User } from '../types';\nimport { AvatarList } from './AvatarList';\nimport { StoryViewer } from './StoryViewer';\nimport { findStoryIndices } from '../utils/storyHelpers';\n\ninterface StoriesProps {\n users: User[];\n closeNavigateTo?: string;\n}\n\nexport const Stories: React.FC<StoriesProps> = ({ users, closeNavigateTo = '/' }) => {\n const { storyId } = useParams<{ storyId?: string }>();\n const navigate = useNavigate();\n\n const [viewerState, setViewerState] = useState<{\n isOpen: boolean;\n userIndex: number;\n storyIndex: number;\n }>({\n isOpen: false,\n userIndex: 0,\n storyIndex: 0,\n });\n\n const scrollPositionRef = useRef(0);\n\n // Handle initial story from URL\n useEffect(() => {\n if (storyId) {\n const indices = findStoryIndices(users, storyId);\n if (indices) {\n setViewerState({\n isOpen: true,\n userIndex: indices.userIndex,\n storyIndex: indices.storyIndex,\n });\n }\n }\n }, [storyId, users]);\n\n const handleAvatarClick = useCallback((userIndex: number) => {\n // Save scroll position\n scrollPositionRef.current = window.scrollY;\n\n setViewerState({\n isOpen: true,\n userIndex,\n storyIndex: 0,\n });\n\n // Update URL with first story ID of the user\n const user = users[userIndex];\n if (user && user.stories.length > 0) {\n const firstStoryId = user.stories[0].id;\n navigate(`/story/${firstStoryId}`, { replace: true });\n }\n }, [users, navigate]);\n\n const handleCloseViewer = useCallback(() => {\n setViewerState({\n isOpen: false,\n userIndex: 0,\n storyIndex: 0,\n });\n\n // Restore scroll position\n requestAnimationFrame(() => {\n window.scrollTo(0, scrollPositionRef.current);\n });\n\n // Clear URL\n navigate(closeNavigateTo, { replace: true });\n }, [navigate, closeNavigateTo]);\n\n const handleStoryChange = useCallback((userIndex: number, storyIndex: number) => {\n const user = users[userIndex];\n if (user && user.stories[storyIndex]) {\n const storyId = user.stories[storyIndex].id;\n navigate(`/story/${storyId}`, { replace: true });\n }\n }, [users, navigate]);\n\n return (\n <>\n <AvatarList users={users} onAvatarClick={handleAvatarClick} />\n\n <StoryViewer\n users={users}\n initialUserIndex={viewerState.userIndex}\n initialStoryIndex={viewerState.storyIndex}\n isOpen={viewerState.isOpen}\n onClose={handleCloseViewer}\n onStoryChange={handleStoryChange}\n />\n </>\n );\n};\n","import { User, StoryItemControls } from \"../types\";\nimport React from \"react\";\n\n// ============================================\n// CUSTOM STORY COMPONENTS\n// ============================================\n\n// Interactive Poll Component\nexport const PollComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [selected, setSelected] = React.useState<number | null>(null);\n const [votes, setVotes] = React.useState([42, 28, 18, 12]);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleVote = (option: number) => {\n setSelected(option);\n const newVotes = [...votes];\n newVotes[option] += 1;\n setVotes(newVotes);\n setTimeout(() => {\n resume();\n next();\n }, 2000);\n };\n\n const total = votes.reduce((a, b) => a + b, 0);\n const options = [\"React\", \"Vue\", \"Angular\", \"Svelte\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n }}\n >\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"28px\", fontWeight: \"bold\" }}>\n Poll\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\" }}>\n What's your favorite framework?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const percentage = Math.round((votes[idx] / total) * 100);\n const isSelected = selected === idx;\n\n return (\n <button\n key={idx}\n onClick={() => selected === null && handleVote(idx)}\n disabled={selected !== null}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: selected !== null\n ? `linear-gradient(90deg, rgba(255,255,255,0.4) ${percentage}%, rgba(255,255,255,0.15) ${percentage}%)`\n : \"rgba(255,255,255,0.2)\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: selected === null ? \"pointer\" : \"default\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n backdropFilter: \"blur(10px)\",\n }}\n >\n <span style={{ display: \"flex\", alignItems: \"center\", gap: \"10px\" }}>\n {isSelected && \"✓ \"}\n {option}\n </span>\n {selected !== null && <span>{percentage}%</span>}\n </button>\n );\n })}\n </div>\n\n {selected !== null && (\n <p style={{ color: \"rgba(255,255,255,0.8)\", marginTop: \"20px\", fontSize: \"14px\" }}>\n {total} votes • Thanks for voting!\n </p>\n )}\n </div>\n );\n};\n\n// Quiz Component\nexport const QuizComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [answered, setAnswered] = React.useState(false);\n const [selected, setSelected] = React.useState<number | null>(null);\n const correctAnswer = 2;\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleAnswer = (idx: number) => {\n setSelected(idx);\n setAnswered(true);\n setTimeout(() => {\n resume();\n next();\n }, 2500);\n };\n\n const options = [\"Mars\", \"Venus\", \"Jupiter\", \"Saturn\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)\",\n }}\n >\n <div style={{\n fontSize: \"48px\",\n marginBottom: \"20px\",\n animation: \"bounce 1s infinite\"\n }}>\n 🪐\n </div>\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\", textAlign: \"center\" }}>\n Quiz Time!\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"18px\", textAlign: \"center\" }}>\n Which is the largest planet in our solar system?\n </p>\n\n <div style={{ width: \"100%\" }}>\n {options.map((option, idx) => {\n const isCorrect = idx === correctAnswer;\n const isSelected = selected === idx;\n\n let bgColor = \"rgba(255,255,255,0.2)\";\n if (answered) {\n if (isCorrect) bgColor = \"rgba(34, 197, 94, 0.6)\";\n else if (isSelected) bgColor = \"rgba(239, 68, 68, 0.6)\";\n }\n\n return (\n <button\n key={idx}\n onClick={() => !answered && handleAnswer(idx)}\n disabled={answered}\n style={{\n width: \"100%\",\n padding: \"16px 20px\",\n margin: \"8px 0\",\n border: \"none\",\n borderRadius: \"12px\",\n background: bgColor,\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"600\",\n cursor: answered ? \"default\" : \"pointer\",\n transition: \"all 0.3s ease\",\n display: \"flex\",\n justifyContent: \"space-between\",\n alignItems: \"center\",\n }}\n >\n <span>{option}</span>\n {answered && isCorrect && <span>✓</span>}\n {answered && isSelected && !isCorrect && <span>✗</span>}\n </button>\n );\n })}\n </div>\n\n {answered && (\n <p style={{\n color: \"white\",\n marginTop: \"20px\",\n fontSize: \"16px\",\n fontWeight: \"bold\"\n }}>\n {selected === correctAnswer ? \"🎉 Correct!\" : \"❌ Wrong! Jupiter is the largest.\"}\n </p>\n )}\n </div>\n );\n};\n\n// Countdown/Announcement Component\nexport const CountdownComponent: React.FC<StoryItemControls> = () => {\n const [timeLeft, setTimeLeft] = React.useState({\n days: 12,\n hours: 8,\n minutes: 45,\n seconds: 30,\n });\n\n React.useEffect(() => {\n const timer = setInterval(() => {\n setTimeLeft((prev) => {\n let { days, hours, minutes, seconds } = prev;\n seconds--;\n if (seconds < 0) {\n seconds = 59;\n minutes--;\n }\n if (minutes < 0) {\n minutes = 59;\n hours--;\n }\n if (hours < 0) {\n hours = 23;\n days--;\n }\n return { days, hours, minutes, seconds };\n });\n }, 1000);\n\n return () => clearInterval(timer);\n }, []);\n\n const TimeBox = ({ value, label }: { value: number; label: string }) => (\n <div style={{ textAlign: \"center\" }}>\n <div\n style={{\n background: \"rgba(255,255,255,0.2)\",\n backdropFilter: \"blur(10px)\",\n borderRadius: \"12px\",\n padding: \"15px 20px\",\n minWidth: \"70px\",\n }}\n >\n <div style={{ fontSize: \"32px\", fontWeight: \"bold\", color: \"white\" }}>\n {String(value).padStart(2, \"0\")}\n </div>\n </div>\n <div style={{ color: \"rgba(255,255,255,0.8)\", fontSize: \"12px\", marginTop: \"8px\", textTransform: \"uppercase\" }}>\n {label}\n </div>\n </div>\n );\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #0f0c29 0%, #302b63 50%, #24243e 100%)\",\n }}\n >\n <div style={{ fontSize: \"48px\", marginBottom: \"15px\" }}>🚀</div>\n <h2 style={{ color: \"white\", marginBottom: \"8px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Product Launch\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", marginBottom: \"30px\", fontSize: \"14px\" }}>\n Something amazing is coming...\n </p>\n\n <div style={{ display: \"flex\", gap: \"12px\", marginBottom: \"30px\" }}>\n <TimeBox value={timeLeft.days} label=\"Days\" />\n <TimeBox value={timeLeft.hours} label=\"Hours\" />\n <TimeBox value={timeLeft.minutes} label=\"Mins\" />\n <TimeBox value={timeLeft.seconds} label=\"Secs\" />\n </div>\n\n <button\n style={{\n padding: \"14px 40px\",\n background: \"linear-gradient(135deg, #667eea 0%, #764ba2 100%)\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"white\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Notify Me\n </button>\n </div>\n );\n};\n\n// Product Showcase Component\nexport const ProductShowcaseComponent: React.FC<StoryItemControls> = () => {\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n height: \"100%\",\n background: \"linear-gradient(180deg, #1a1a2e 0%, #16213e 100%)\",\n position: \"relative\",\n overflow: \"hidden\",\n }}\n >\n {/* Product Image */}\n <div style={{ flex: 1, display: \"flex\", alignItems: \"center\", justifyContent: \"center\", padding: \"20px\" }}>\n <img\n src=\"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=400&h=400&fit=crop\"\n alt=\"Product\"\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n borderRadius: \"20px\",\n boxShadow: \"0 20px 60px rgba(0,0,0,0.5)\",\n }}\n />\n </div>\n\n {/* Product Info */}\n <div\n style={{\n padding: \"30px\",\n background: \"linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.8) 100%)\",\n }}\n >\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"8px\", marginBottom: \"10px\" }}>\n <span style={{ background: \"#ef4444\", color: \"white\", padding: \"4px 10px\", borderRadius: \"20px\", fontSize: \"12px\", fontWeight: \"bold\" }}>\n NEW\n </span>\n <span style={{ color: \"rgba(255,255,255,0.6)\", fontSize: \"12px\" }}>Limited Edition</span>\n </div>\n <h2 style={{ color: \"white\", fontSize: \"24px\", fontWeight: \"bold\", marginBottom: \"8px\" }}>\n Premium Watch Collection\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.7)\", fontSize: \"14px\", marginBottom: \"15px\" }}>\n Elegant design meets modern technology\n </p>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"15px\" }}>\n <span style={{ color: \"white\", fontSize: \"28px\", fontWeight: \"bold\" }}>$299</span>\n <span style={{ color: \"rgba(255,255,255,0.5)\", fontSize: \"18px\", textDecoration: \"line-through\" }}>$399</span>\n </div>\n <button\n style={{\n width: \"100%\",\n marginTop: \"20px\",\n padding: \"16px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"12px\",\n color: \"#1a1a2e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Shop Now →\n </button>\n </div>\n </div>\n );\n};\n\n// Slider/Rating Component\nexport const SliderComponent: React.FC<StoryItemControls> = ({\n pause,\n resume,\n next,\n}) => {\n const [value, setValue] = React.useState(5);\n const [submitted, setSubmitted] = React.useState(false);\n\n React.useEffect(() => {\n pause();\n return () => resume();\n }, [pause, resume]);\n\n const handleSubmit = () => {\n setSubmitted(true);\n setTimeout(() => {\n resume();\n next();\n }, 1500);\n };\n\n const emojis = [\"😢\", \"😕\", \"😐\", \"🙂\", \"😊\", \"😃\", \"😄\", \"😁\", \"🤩\", \"🥳\"];\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n padding: \"20px\",\n width: \"100%\",\n background: \"linear-gradient(135deg, #11998e 0%, #38ef7d 100%)\",\n }}\n >\n <div style={{ fontSize: \"80px\", marginBottom: \"20px\", transition: \"all 0.3s\" }}>\n {emojis[value - 1]}\n </div>\n\n <h2 style={{ color: \"white\", marginBottom: \"10px\", fontSize: \"24px\", fontWeight: \"bold\" }}>\n Rate Your Experience\n </h2>\n <p style={{ color: \"rgba(255,255,255,0.9)\", marginBottom: \"30px\", fontSize: \"16px\" }}>\n How was your visit today?\n </p>\n\n {!submitted ? (\n <>\n <div style={{ width: \"100%\", marginBottom: \"20px\" }}>\n <input\n type=\"range\"\n min=\"1\"\n max=\"10\"\n value={value}\n onChange={(e) => setValue(parseInt(e.target.value))}\n style={{\n width: \"100%\",\n height: \"8px\",\n borderRadius: \"4px\",\n appearance: \"none\",\n background: \"rgba(255,255,255,0.3)\",\n cursor: \"pointer\",\n }}\n />\n <div style={{ display: \"flex\", justifyContent: \"space-between\", color: \"rgba(255,255,255,0.7)\", fontSize: \"12px\", marginTop: \"8px\" }}>\n <span>1</span>\n <span>10</span>\n </div>\n </div>\n\n <button\n onClick={handleSubmit}\n style={{\n padding: \"14px 50px\",\n background: \"white\",\n border: \"none\",\n borderRadius: \"30px\",\n color: \"#11998e\",\n fontSize: \"16px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n }}\n >\n Submit ({value}/10)\n </button>\n </>\n ) : (\n <div style={{ textAlign: \"center\" }}>\n <div style={{ fontSize: \"48px\", marginBottom: \"10px\" }}>🎉</div>\n <p style={{ color: \"white\", fontSize: \"18px\", fontWeight: \"bold\" }}>\n Thanks for your feedback!\n </p>\n </div>\n )}\n </div>\n );\n};\n\n// ============================================\n// DEMO DATA\n// ============================================\n\n// Sample working video URLs\nconst sampleVideos = [\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerEscapes.mp4\",\n \"https://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4\",\n];\n\n// Sample working image URLs from Unsplash\nconst sampleImages = [\n \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=1080&h=1920&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=1080&h=1920&fit=crop\",\n];\n\n// Avatar URLs\nconst avatarImages = [\n \"https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1494790108377-be9c29b29330?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1517841905240-472988babdf9?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1539571696357-5a69c17a67c6?w=150&h=150&fit=crop\",\n \"https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&h=150&fit=crop\",\n];\n\n// Main demo users with diverse story types\nexport const demoUsers: User[] = [\n {\n id: \"user-travel\",\n username: \"Travel\",\n avatarUrl: avatarImages[0],\n hasUnreadStories: true,\n stories: [\n {\n id: \"travel-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1682687220742-aba13b6e50ba?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Beautiful mountain landscape\",\n },\n {\n id: \"travel-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Scenic ocean view\",\n },\n {\n id: \"travel-3\",\n type: \"text\",\n text: \"Adventure awaits! 🌍\\n\\nSwipe to explore more destinations →\",\n backgroundColor: \"#FF6B6B\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"travel-4\",\n type: \"video\",\n src: sampleVideos[0],\n duration: 15000,\n },\n ],\n },\n {\n id: \"user-polls\",\n username: \"Interactive\",\n avatarUrl: avatarImages[1],\n hasUnreadStories: true,\n stories: [\n {\n id: \"poll-intro\",\n type: \"text\",\n text: \"Let's have some fun! 🎮\\n\\nInteractive stories ahead →\",\n backgroundColor: \"#667eea\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n {\n id: \"poll-1\",\n type: \"custom_component\",\n component: PollComponent,\n duration: 30000,\n },\n {\n id: \"quiz-1\",\n type: \"custom_component\",\n component: QuizComponent,\n duration: 30000,\n },\n {\n id: \"slider-1\",\n type: \"custom_component\",\n component: SliderComponent,\n duration: 30000,\n },\n ],\n },\n {\n id: \"user-product\",\n username: \"Shop\",\n avatarUrl: avatarImages[2],\n hasUnreadStories: true,\n stories: [\n {\n id: \"product-1\",\n type: \"custom_component\",\n component: ProductShowcaseComponent,\n duration: 8000,\n },\n {\n id: \"product-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1523275335684-37898b6baf30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Product showcase\",\n },\n {\n id: \"product-3\",\n type: \"text\",\n text: \"Limited Time Offer! 🔥\\n\\n50% OFF\\n\\nUse code: STORY50\",\n backgroundColor: \"#000000\",\n textColor: \"#FFFFFF\",\n duration: 5000,\n },\n ],\n },\n {\n id: \"user-launch\",\n username: \"Events\",\n avatarUrl: avatarImages[3],\n hasUnreadStories: true,\n stories: [\n {\n id: \"launch-1\",\n type: \"custom_component\",\n component: CountdownComponent,\n duration: 10000,\n },\n {\n id: \"launch-2\",\n type: \"text\",\n text: \"Mark your calendars! 📅\\n\\nBig announcement coming soon...\",\n backgroundColor: \"#302b63\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n {\n id: \"launch-3\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1492684223066-81342ee5ff30?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Event teaser\",\n },\n ],\n },\n {\n id: \"user-video\",\n username: \"Videos\",\n avatarUrl: avatarImages[4],\n hasUnreadStories: true,\n stories: [\n {\n id: \"video-1\",\n type: \"video\",\n src: sampleVideos[1],\n duration: 15000,\n },\n {\n id: \"video-2\",\n type: \"video\",\n src: sampleVideos[2],\n duration: 15000,\n },\n {\n id: \"video-3\",\n type: \"text\",\n text: \"More videos coming soon! 🎬\\n\\nStay tuned →\",\n backgroundColor: \"#4ECDC4\",\n textColor: \"#FFFFFF\",\n duration: 3000,\n },\n ],\n },\n {\n id: \"user-lifestyle\",\n username: \"Lifestyle\",\n avatarUrl: avatarImages[5],\n hasUnreadStories: false,\n stories: [\n {\n id: \"lifestyle-1\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Nature scene\",\n },\n {\n id: \"lifestyle-2\",\n type: \"image\",\n src: \"https://images.unsplash.com/photo-1426604966848-d7adac402bff?w=1080&h=1920&fit=crop\",\n duration: 5000,\n alt: \"Peaceful landscape\",\n },\n {\n id: \"lifestyle-3\",\n type: \"text\",\n text: \"Find your peace 🧘\\n\\nNature heals everything\",\n backgroundColor: \"#45B7D1\",\n textColor: \"#FFFFFF\",\n duration: 4000,\n },\n ],\n },\n];\n\n// Generate demo users for performance testing\nexport const generateDemoUsers = (count: number = 50): User[] => {\n const users: User[] = [...demoUsers];\n\n for (let i = demoUsers.length; i < count; i++) {\n const hasUnread = Math.random() > 0.3;\n const storyCount = Math.floor(Math.random() * 5) + 2;\n\n users.push({\n id: `user-${i}`,\n username: `User ${i}`,\n avatarUrl: `https://i.pravatar.cc/150?img=${i % 70}`,\n hasUnreadStories: hasUnread,\n stories: Array.from({ length: storyCount }, (_, storyIdx) => {\n const typeRandom = Math.random();\n\n // 50% images, 20% videos, 20% text, 10% custom\n if (typeRandom < 0.5) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"image\" as const,\n src: sampleImages[Math.floor(Math.random() * sampleImages.length)],\n duration: 5000,\n alt: `Story from User ${i}`,\n };\n }\n\n if (typeRandom < 0.7) {\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"video\" as const,\n src: sampleVideos[Math.floor(Math.random() * sampleVideos.length)],\n duration: 15000,\n };\n }\n\n if (typeRandom < 0.9) {\n const backgrounds = [\"#FF6B6B\", \"#4ECDC4\", \"#45B7D1\", \"#FFA07A\", \"#98D8C8\", \"#667eea\", \"#764ba2\"];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"text\" as const,\n text: `Hello from User ${i}! 👋\\n\\nThis is story ${storyIdx + 1}`,\n backgroundColor: backgrounds[Math.floor(Math.random() * backgrounds.length)],\n textColor: \"#FFFFFF\",\n duration: 4000,\n };\n }\n\n // Custom component\n const components = [PollComponent, QuizComponent, SliderComponent];\n return {\n id: `story-${i}-${storyIdx}`,\n type: \"custom_component\" as const,\n component: components[Math.floor(Math.random() * components.length)],\n duration: 30000,\n };\n }),\n });\n }\n\n return users;\n};\n"]}
@@ -0,0 +1,62 @@
1
+ import React, { ComponentType } from 'react';
2
+
3
+ type StoryItemType = 'image' | 'video' | 'text' | 'custom_component';
4
+ interface StoryItemMetadata {
5
+ [key: string]: any;
6
+ }
7
+ interface StoryItemControls {
8
+ pause: () => void;
9
+ resume: () => void;
10
+ next: () => void;
11
+ prev: () => void;
12
+ setDuration: (ms: number) => void;
13
+ }
14
+ interface BaseStoryItem {
15
+ id: string;
16
+ type: StoryItemType;
17
+ duration?: number;
18
+ metadata?: StoryItemMetadata;
19
+ alt?: string;
20
+ caption?: string;
21
+ }
22
+ interface ImageStoryItem extends BaseStoryItem {
23
+ type: 'image';
24
+ src: string;
25
+ duration?: number;
26
+ }
27
+ interface VideoStoryItem extends BaseStoryItem {
28
+ type: 'video';
29
+ src: string;
30
+ duration?: number;
31
+ }
32
+ interface TextStoryItem extends BaseStoryItem {
33
+ type: 'text';
34
+ text: string;
35
+ backgroundColor?: string;
36
+ textColor?: string;
37
+ duration?: number;
38
+ }
39
+ interface CustomComponentStoryItem extends BaseStoryItem {
40
+ type: 'custom_component';
41
+ component: ComponentType<StoryItemControls>;
42
+ duration?: number;
43
+ }
44
+ type StoryItem = ImageStoryItem | VideoStoryItem | TextStoryItem | CustomComponentStoryItem;
45
+ interface User {
46
+ id: string;
47
+ username: string;
48
+ avatarUrl: string;
49
+ stories: StoryItem[];
50
+ hasUnreadStories?: boolean;
51
+ }
52
+
53
+ interface StoriesProps {
54
+ users: User[];
55
+ closeNavigateTo?: string;
56
+ }
57
+ declare const Stories: React.FC<StoriesProps>;
58
+
59
+ declare const demoUsers: User[];
60
+ declare const generateDemoUsers: (count?: number) => User[];
61
+
62
+ export { Stories, type StoryItem, type StoryItemControls, type User, demoUsers, generateDemoUsers };
@@ -0,0 +1,62 @@
1
+ import React, { ComponentType } from 'react';
2
+
3
+ type StoryItemType = 'image' | 'video' | 'text' | 'custom_component';
4
+ interface StoryItemMetadata {
5
+ [key: string]: any;
6
+ }
7
+ interface StoryItemControls {
8
+ pause: () => void;
9
+ resume: () => void;
10
+ next: () => void;
11
+ prev: () => void;
12
+ setDuration: (ms: number) => void;
13
+ }
14
+ interface BaseStoryItem {
15
+ id: string;
16
+ type: StoryItemType;
17
+ duration?: number;
18
+ metadata?: StoryItemMetadata;
19
+ alt?: string;
20
+ caption?: string;
21
+ }
22
+ interface ImageStoryItem extends BaseStoryItem {
23
+ type: 'image';
24
+ src: string;
25
+ duration?: number;
26
+ }
27
+ interface VideoStoryItem extends BaseStoryItem {
28
+ type: 'video';
29
+ src: string;
30
+ duration?: number;
31
+ }
32
+ interface TextStoryItem extends BaseStoryItem {
33
+ type: 'text';
34
+ text: string;
35
+ backgroundColor?: string;
36
+ textColor?: string;
37
+ duration?: number;
38
+ }
39
+ interface CustomComponentStoryItem extends BaseStoryItem {
40
+ type: 'custom_component';
41
+ component: ComponentType<StoryItemControls>;
42
+ duration?: number;
43
+ }
44
+ type StoryItem = ImageStoryItem | VideoStoryItem | TextStoryItem | CustomComponentStoryItem;
45
+ interface User {
46
+ id: string;
47
+ username: string;
48
+ avatarUrl: string;
49
+ stories: StoryItem[];
50
+ hasUnreadStories?: boolean;
51
+ }
52
+
53
+ interface StoriesProps {
54
+ users: User[];
55
+ closeNavigateTo?: string;
56
+ }
57
+ declare const Stories: React.FC<StoriesProps>;
58
+
59
+ declare const demoUsers: User[];
60
+ declare const generateDemoUsers: (count?: number) => User[];
61
+
62
+ export { Stories, type StoryItem, type StoryItemControls, type User, demoUsers, generateDemoUsers };