/* ===== ProSkale Success Stories (scoped init, supports multiple blocks) ===== */ (function(){ // Shared data (edit these to your real case studies) const STORIES = [ { id:'fintech', title:'FinTech Platform Modernization', icon:'💰', color:'#0ea5e9', industry:'FinTech', img:'https://orpical.com/wp-content/uploads/2023/07/digital-transformation-in-banking.png', gradient:'radial-gradient(1200px 400px at 10% -10%, rgba(14,165,233,.20), transparent 60%), linear-gradient(135deg, rgba(14,165,233,.12), rgba(99,102,241,.12))', lead:'Legacy monolith with poor UX, slow deployments, and scalability bottlenecks.', solution:[ 'Split monolith to microservices with API gateway', 'React/Next.js front-end with design tokens', 'CI/CD with canary releases and automated QA', 'Observability via OpenTelemetry + Grafana' ], results:['70% faster loads','3× engagement','99.99% uptime','Zero-downtime releases'], stats:{a:'70%',aText:'faster page loads',b:'3×',bText:'increase in engagement'} }, { id:'commerce', title:'E-Commerce PWA Development', icon:'🛍️', color:'#f97316', industry:'E-Commerce', img:'https://img.freepik.com/premium-photo/ecommerce-business-concept_204719-89016.jpg?w=740&q=80', gradient:'radial-gradient(1200px 400px at 0% -10%, rgba(249,115,22,.18), transparent 60%), linear-gradient(135deg, rgba(251,146,60,.12), rgba(236,72,153,.12))', lead:'Mobile-first, offline-capable shopping with lightning performance.', solution:[ 'PWA with Vue 3 + Nuxt, edge caching', 'Headless cart & checkout', 'Image/CDN optimization and code splitting', 'A/B testing pipeline for features' ], results:['+40% mobile conversions','60% faster pages','Offline experience','SEO boost (SSR)'], stats:{a:'+40%',aText:'mobile conversion lift',b:'60%',bText:'faster LCP'} }, { id:'health', title:'Healthcare SaaS Collaboration', icon:'🏥', color:'#10b981', industry:'Healthcare', img:'https://kms-healthcare.com/wp-content/uploads/2023/09/agile-software-development-in-healthcare-2-1024x575.png', gradient:'radial-gradient(1200px 400px at 10% -10%, rgba(16,185,129,.18), transparent 60%), linear-gradient(135deg, rgba(16,185,129,.12), rgba(59,130,246,.12))', lead:'HIPAA-compliant, real-time collaboration app with strict latency targets.', solution:[ 'React + TypeScript + WebRTC for video', 'FastAPI microservices on Azure AKS', 'End-to-end encryption & audit trails', 'Autoscaling with HPA & queues' ], results:['HIPAA compliant','50ms avg latency','10k+ concurrent users','Secure audit logs'], stats:{a:'50ms',aText:'average latency',b:'10k+',bText:'concurrent users'} } ]; // Initialize each block on the page document.querySelectorAll('.ps-stories').forEach((root) => { const $ = (s, el=root) => el.querySelector(s); const $$ = (s, el=root) => Array.from(el.querySelectorAll(s)); const INDUSTRIES = ['All', ...Array.from(new Set(STORIES.map(s=>s.industry)))]; const storyFilters = $('#storyFilters'); const rail = $('#storiesRail'); const dotsWrap = $('#storiesDots'); const btnPrev = $('#storiesPrev'); const btnNext = $('#storiesNext'); const sModal = $('#storyModal'); const sClose = $('#storyClose'); const sIcon = $('#storyIcon'); const sTitle = $('#storyTitle'); const sIndustry = $('#storyIndustry'); const sLead = $('#storyLead'); const sSol = $('#storySolution'); const sRes = $('#storyResults'); const sStatA = $('#storyStatA'); const sStatAT= $('#storyStatAText'); const sStatB = $('#storyStatB'); const sStatBT= $('#storyStatBText'); const sDots = $('#storyDots'); const sPrev = $('#storyPrev'); const sNext = $('#storyNext'); let activeFilter='All', visible=STORIES.slice(), activeIndex=0, modalIndex=0; // Filters storyFilters.innerHTML = INDUSTRIES .map(n=>``) .join(''); storyFilters.addEventListener('click', (e)=>{ const b=e.target.closest('.filter-chip'); if(!b) return; activeFilter=b.dataset.name; $$('.filter-chip', storyFilters).forEach(x=>x.classList.toggle('active', x===b)); renderStories(); }); // Card template function card(s,i){ return `
${s.title}
${s.title}
${s.industry}
${(s.results||[]).slice(0,3).map(b=>`${b}`).join('')}
${s.stats.a}${s.stats.aText}
${s.stats.b}${s.stats.bText}
`; } function renderStories(){ visible = STORIES.filter(s => activeFilter === 'All' || s.industry === activeFilter); rail.innerHTML = visible.map((s,i)=>card(s,i)).join(''); $$('.story-card', rail).forEach(c => c.addEventListener('click', () => openModal(+c.dataset.index))); activeIndex = 0; renderDots(); scrollTo(0, false); } function renderDots(){ dotsWrap.innerHTML = visible.map((_,i)=>``).join(''); $$('.car-dot', dotsWrap).forEach(d => d.addEventListener('click', () => scrollTo(+d.dataset.i))); } function scrollTo(i, smooth=true){ activeIndex = Math.max(0, Math.min(i, visible.length - 1)); const card = rail.children[activeIndex]; if (!card) return; const left = card.offsetLeft - (rail.clientWidth - card.clientWidth)/2; rail.scrollTo({ left, behavior: smooth ? 'smooth' : 'auto' }); renderDots(); } btnPrev.addEventListener('click', () => scrollTo(activeIndex - 1)); btnNext.addEventListener('click', () => scrollTo(activeIndex + 1)); rail.addEventListener('keydown', e => { if (e.key === 'ArrowRight') scrollTo(activeIndex + 1); if (e.key === 'ArrowLeft') scrollTo(activeIndex - 1); }); // Modal function openModal(i){ modalIndex = i; fillModal(); sModal.classList.add('show'); sModal.setAttribute('aria-hidden','false'); document.body.style.overflow = 'hidden'; } function closeModal(){ sModal.classList.remove('show'); sModal.setAttribute('aria-hidden','true'); document.body.style.overflow = ''; } function fillModal(){ const s = visible[modalIndex]; if (!s) return; sIcon.textContent = s.icon; sTitle.textContent = s.title; sIndustry.textContent = s.industry; sLead.textContent = s.lead; sSol.innerHTML = s.solution.map(x=>`
  • ${x}
  • `).join(''); sRes.innerHTML = s.results.map(x=>`${x}`).join(''); sStatA.textContent = s.stats.a; sStatAT.textContent = s.stats.aText; sStatB.textContent = s.stats.b; sStatBT.textContent = s.stats.bText; sDots.innerHTML = visible.map((_,i)=>``).join(''); $$('.car-dot', sDots).forEach(d => d.addEventListener('click', () => { modalIndex = +d.dataset.i; fillModal(); })); } $('#storyClose').addEventListener('click', closeModal); sModal.addEventListener('click', e => { if (e.target === sModal) closeModal(); }); $('#storyPrev').addEventListener('click', () => { modalIndex = (modalIndex - 1 + visible.length) % visible.length; fillModal(); }); $('#storyNext').addEventListener('click', () => { modalIndex = (modalIndex + 1) % visible.length; fillModal(); }); document.addEventListener('keydown', e => { if (sModal.classList.contains('show') && e.key === 'Escape') closeModal(); }); // Init renderStories(); }); })(); function showTab(evt, tabId) { const tabs = document.querySelectorAll(".tab-content"); const buttons = document.querySelectorAll(".tablink"); tabs.forEach(tab => tab.classList.remove("active")); buttons.forEach(btn => btn.classList.remove("active")); document.getElementById(tabId).classList.add("active"); evt.currentTarget.classList.add("active"); } (() => { const STORIES = [ {id:'fintech',title:'FinTech Platform Modernization',icon:'💰',color:'#0ea5e9',industry:'FinTech',img:'https://orpical.com/wp-content/uploads/2023/07/digital-transformation-in-banking.png',gradient:'radial-gradient(1200px 400px at 10% -10%, rgba(14,165,233,.20), transparent 60%), linear-gradient(135deg, rgba(14,165,233,.12), rgba(99,102,241,.12))',lead:'Legacy monolith with poor UX, slow deployments, and scalability bottlenecks.',solution:['Split monolith to microservices with API gateway','React/Next.js front-end with design tokens','CI/CD with canary releases and automated QA','Observability via OpenTelemetry + Grafana'],results:['70% faster loads','3× engagement','99.99% uptime','Zero-downtime releases'],stats:{a:'70%',aText:'faster page loads',b:'3×',bText:'increase in engagement'}}, {id:'commerce',title:'E-Commerce PWA Development',icon:'🛍️',color:'#f97316',industry:'E-Commerce',img:'https://img.freepik.com/premium-photo/ecommerce-business-concept_204719-89016.jpg?w=740&q=80',gradient:'radial-gradient(1200px 400px at 0% -10%, rgba(249,115,22,.18), transparent 60%), linear-gradient(135deg, rgba(251,146,60,.12), rgba(236,72,153,.12))',lead:'Mobile-first, offline-capable shopping with lightning performance.',solution:['PWA with Vue 3 + Nuxt, edge caching','Headless cart & checkout','Image/CDN optimization and code splitting','A/B testing pipeline for features'],results:['+40% mobile conversions','60% faster pages','Offline experience','SEO boost (SSR)'],stats:{a:'+40%',aText:'mobile conversion lift',b:'60%',bText:'faster LCP'}}, {id:'health',title:'Healthcare SaaS Collaboration',icon:'🏥',color:'#10b981',industry:'Healthcare',img:'https://kms-healthcare.com/wp-content/uploads/2023/09/agile-software-development-in-healthcare-2-1024x575.png',gradient:'radial-gradient(1200px 400px at 10% -10%, rgba(16,185,129,.18), transparent 60%), linear-gradient(135deg, rgba(16,185,129,.12), rgba(59,130,246,.12))',lead:'HIPAA-compliant, real-time collaboration app with strict latency targets.',solution:['React + TypeScript + WebRTC for video','FastAPI microservices on Azure AKS','End-to-end encryption & audit trails','Autoscaling with HPA & queues'],results:['HIPAA compliant','50ms avg latency','10k+ concurrent users','Secure audit logs'],stats:{a:'50ms',aText:'average latency',b:'10k+',bText:'concurrent users'}} ]; const INDUSTRIES = ['All', ...Array.from(new Set(STORIES.map(s=>s.industry)))]; const storyFilters = $('#storyFilters'); const rail = $('#storiesRail'); const dotsWrap = $('#storiesDots'); const btnPrev = $('#storiesPrev'); const btnNext = $('#storiesNext'); let activeFilter='All', visible=STORIES.slice(), activeIndex=0; storyFilters.innerHTML = INDUSTRIES.map(n=>``).join(''); storyFilters.addEventListener('click', e=>{ const b=e.target.closest('.filter-chip'); if(!b) return; activeFilter=b.dataset.name; $$('.filter-chip', storyFilters).forEach(x=>x.classList.toggle('active', x===b)); renderStories(); }); function card(s,i){ return `
    ${s.title}
    ${s.title}
    ${s.industry}
    ${(s.results||[]).slice(0,3).map(b=>`${b}`).join('')}
    ${s.stats.a}${s.stats.aText}
    ${s.stats.b}${s.stats.bText}
    `; } function renderStories(){ visible = STORIES.filter(s=>activeFilter==='All' || s.industry===activeFilter); rail.innerHTML = visible.map((s,i)=>card(s,i)).join(''); $$('.story-card', rail).forEach(c=>c.addEventListener('click',()=>openModal(+c.dataset.index))); activeIndex = 0; renderDots(); scrollTo(0,false); } function renderDots(){ dotsWrap.innerHTML = visible.map((_,i)=>``).join(''); $$('.car-dot', dotsWrap).forEach(d=>d.addEventListener('click',()=>scrollTo(+d.dataset.i))); } function scrollTo(i, smooth=true){ activeIndex=Math.max(0,Math.min(i,visible.length-1)); const card = rail.children[activeIndex]; if(!card) return; const left = card.offsetLeft - (rail.clientWidth - card.clientWidth)/2; rail.scrollTo({left,behavior:smooth?'smooth':'auto'}); renderDots(); } btnPrev.addEventListener('click', ()=>scrollTo(activeIndex-1)); btnNext.addEventListener('click', ()=>scrollTo(activeIndex+1)); rail.addEventListener('keydown', e=>{ if(e.key==='ArrowRight')scrollTo(activeIndex+1); if(e.key==='ArrowLeft')scrollTo(activeIndex-1); }); /* modal */ const sModal=$('#storyModal'); const sClose=$('#storyClose'); const sIcon=$('#storyIcon'); const sTitle=$('#storyTitle'); const sIndustry=$('#storyIndustry'); const sLead=$('#storyLead'); const sSol=$('#storySolution'); const sRes=$('#storyResults'); const sStatA=$('#storyStatA'); const sStatAT=$('#storyStatAText'); const sStatB=$('#storyStatB'); const sStatBT=$('#storyStatBText'); const sDots=$('#storyDots'); const sPrev=$('#storyPrev'); const sNext=$('#storyNext'); let modalIndex=0; function openModal(i){ modalIndex=i; fill(); sModal.classList.add('show'); sModal.setAttribute('aria-hidden','false'); document.body.style.overflow='hidden'; } function closeModal(){ sModal.classList.remove('show'); sModal.setAttribute('aria-hidden','true'); document.body.style.overflow=''; } function fill(){ const s=visible[modalIndex]; if(!s) return; sIcon.textContent=s.icon; sTitle.textContent=s.title; sIndustry.textContent=s.industry; sLead.textContent=s.lead; sSol.innerHTML=s.solution.map(x=>`
  • ${x}
  • `).join(''); sRes.innerHTML=s.results.map(x=>`${x}`).join(''); sStatA.textContent=s.stats.a; sStatAT.textContent=s.stats.aText; sStatB.textContent=s.stats.b; sStatBT.textContent=s.stats.bText; sDots.innerHTML=visible.map((_,i)=>``).join(''); $$('.car-dot', sDots).forEach(d=>d.addEventListener('click',()=>{modalIndex=+d.dataset.i; fill();})); } sClose.addEventListener('click',closeModal); sModal.addEventListener('click',e=>{ if(e.target===sModal) closeModal(); }); sPrev.addEventListener('click',()=>{ modalIndex=(modalIndex-1+visible.length)%visible.length; fill(); }); sNext.addEventListener('click',()=>{ modalIndex=(modalIndex+1)%visible.length; fill(); }); document.addEventListener('keydown',e=>{ if(!sModal.classList.contains('show')) return; if(e.key==='Escape') closeModal(); }); renderStories(); })(); Skip to main content

    Leave a Reply