PageSourceSearch

https://pharmaguide.ca/enterprise/

html pharmaguide.ca collected 2026-09-24 11:23:46 UTC 75,414 bytes, 1,295 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Enterprise Pharmacy Platform for Chains &amp; Payers | PharmaGuide</title><meta name="description" content="Multi-site pharmacy operations, program orchestration and reporting at national scale. SOC 2 Type II, data resident in Canada."><link rel="canonical" href="https://pharmaguide.ca/enterprise/"><link rel="icon" type="image/png" href="/favicon.png"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><link rel="sitemap" href="/sitemap-index.xml"><link rel="alternate" type="application/rss+xml" title="PharmaGuide Blog" href="/rss.xml"><meta property="og:type" content="website"><meta property="og:title" content="Enterprise Pharmacy Platform for Chains &amp; Payers | PharmaGuide"><meta property="og:description" content="Multi-site pharmacy operations, program orchestration and reporting at national scale. SOC 2 Type II, data resident in Canada."><meta property="og:url" content="https://pharmaguide.ca/enterprise/"><meta property="og:image" content="https://pharmaguide.ca/og/enterprise.png"><meta name="twitter:card" content="summary_large_image">
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","@id":"https://pharmaguide.ca/#organization","name":"PharmaGuide Inc.","url":"https://pharmaguide.ca/","logo":"https://pharmaguide.ca/assets/logos/pharmaguide.svg","foundingDate":"2018","description":"Canadian healthtech company building connected pharmacy software for documentation, booking, billing and analytics.","address":{"@type":"PostalAddress","streetAddress":"14-44 East Beaver Creek Road","addressLocality":"Richmond Hill","addressRegion":"ON","postalCode":"L4B 1G8","addressCountry":"CA"},"contactPoint":[{"@type":"ContactPoint","contactType":"sales","email":"[email protected]","areaServed":"CA","availableLanguage":["en","fr"]},{"@type":"ContactPoint","contactType":"technical support","email":"[email protected]","areaServed":"CA"}],"sameAs":["https://ca.linkedin.com/company/pharmaguide-inc","https://www.facebook.com/Pharmaguiderx/","https://x.com/PharmaGuideRX","https://www.instagram.com/pharmaguide_inc/"]}</script>
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"PhoxEnterprise","applicationCategory":"HealthApplication","applicationSubCategory":"Enterprise Pharmacy Platform","operatingSystem":"Web","url":"https://pharmaguide.ca/enterprise/","publisher":{"@id":"https://pharmaguide.ca/#organization"},"areaServed":{"@type":"Country","name":"Canada"}}</script>
1<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_astro/BaseLayout.BaBMYkWB.css"><link rel="stylesheet" href="/_astro/BenefitCards.aJWCva7c.css"><style>.apps-band[data-astro-cid-fkjhh7ct]{z-index:50;background:var(--band);position:relative}.band-shell[data-astro-cid-fkjhh7ct]{max-width:1280px;margin:0 auto;padding:0 32px}.band-bar[data-astro-cid-fkjhh7ct]{color:#fff;letter-spacing:.16em;text-transform:uppercase;text-align:left;cursor:pointer;background:0 0;border:0;align-items:center;gap:10px;width:100%;height:54px;padding:0;font-family:inherit;font-size:.72rem;font-weight:700;display:flex}.band-bar[data-astro-cid-fkjhh7ct]:focus-visible{outline-offset:-4px;border-radius:4px;outline:2px solid #fff}.band-caret[data-astro-cid-fkjhh7ct]{flex:none;width:12px;height:8px;transition:transform .16s}.band-panel[data-astro-cid-fkjhh7ct]{background:var(--band);opacity:0;visibility:hidden;border-top:1px solid #ffffff2e;max-height:min(72vh,660px);transition:opacity .16s,transform .16s,visibility 0s linear .16s;position:absolute;top:100%;left:0;right:0;overflow-y:auto;transform:translateY(-8px);box-shadow:0 18px 44px #0000003d}.apps-band[data-astro-cid-fkjhh7ct][data-open=true] .band-panel[data-astro-cid-fkjhh7ct],.apps-band[data-astro-cid-fkjhh7ct]:not([data-enhanced]):focus-within .band-panel[data-astro-cid-fkjhh7ct]{opacity:1;visibility:visible;transition:opacity .16s,transform .16s,visibility;transform:none}@media (hover:hover){.apps-band[data-astro-cid-fkjhh7ct]:not([data-enhanced]):hover .band-panel[data-astro-cid-fkjhh7ct]{opacity:1;visibility:visible;transition:opacity .16s,transform .16s,visibility;transform:none}}.apps-band[data-astro-cid-fkjhh7ct][data-open=true] .band-caret[data-astro-cid-fkjhh7ct],.apps-band[data-astro-cid-fkjhh7ct]:not([data-enhanced]):focus-within .band-caret[data-astro-cid-fkjhh7ct]{transform:rotate(180deg)}.panel-inner[data-astro-cid-fkjhh7ct]{max-width:1280px;margin:0 auto;padding:32px 32px 38px}.band-grid[data-astro-cid-fkjhh7ct]{grid-template-columns:repeat(6,minmax(0,1fr));gap:30px 26px;list-style:none;display:grid}.band-product[data-astro-cid-fkjhh7ct]{color:#fff;text-decoration:none;transition:opacity .16s;display:block}.band-product[data-astro-cid-fkjhh7ct]:hover{opacity:.75}.band-product[data-astro-cid-fkjhh7ct]:hover .band-tagline[data-astro-cid-fkjhh7ct]{text-decoration:underline}.band-product[data-astro-cid-fkjhh7ct]:focus-visible{outline-offset:6px;border-radius:4px;outline:2px solid #fff}.band-product[data-astro-cid-fkjhh7ct][aria-current=page] .band-tagline[data-astro-cid-fkjhh7ct]{text-underline-offset:3px;text-decoration:underline}.band-logo[data-astro-cid-fkjhh7ct]{object-fit:contain;object-position:left center;width:auto;max-width:100%;height:34px;margin-bottom:12px}.band-tagline[data-astro-cid-fkjhh7ct]{color:#fff;font-size:.8rem;line-height:1.45;display:block}@media (width<=1100px){.band-grid[data-astro-cid-fkjhh7ct]{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (width<=780px){.band-grid[data-astro-cid-fkjhh7ct]{grid-template-columns:repeat(2,minmax(0,1fr));gap:26px 20px}.band-shell[data-astro-cid-fkjhh7ct]{padding:0 20px}.panel-inner[data-astro-cid-fkjhh7ct]{padding:26px 20px 30px}.band-bar[data-astro-cid-fkjhh7ct]{height:48px}.band-logo[data-astro-cid-fkjhh7ct]{height:28px}}
2.section-image[data-astro-cid-dhjwuw5q]{width:100%;max-width:100%;height:auto;margin-inline:auto}.section-image[data-astro-cid-dhjwuw5q][data-size=small]{width:40%}.section-image[data-astro-cid-dhjwuw5q][data-size=medium]{width:65%}.section-image[data-astro-cid-dhjwuw5q][data-size=large]{width:85%}.section-image[data-astro-cid-dhjwuw5q][data-frame=on]{border-radius:var(--radius-md);box-shadow:var(--shadow-lg)}.section-image[data-astro-cid-dhjwuw5q][data-frame=on][data-shadow=md]{box-shadow:var(--shadow-md)}
3h2[data-astro-cid-hfe5g5fd]{margin-bottom:20px;font-size:clamp(1.6rem,3vw,2.2rem);font-weight:800}.does-grid[data-astro-cid-hfe5g5fd],.whofor-grid[data-astro-cid-hfe5g5fd]{gap:var(--block-gap);grid-template-columns:1fr 1.05fr;align-items:center;display:grid}.does-grid[data-astro-cid-hfe5g5fd] p[data-astro-cid-hfe5g5fd],.whofor-grid[data-astro-cid-hfe5g5fd] p[data-astro-cid-hfe5g5fd]{color:var(--text-body);margin-bottom:14px}.outcomes-title[data-astro-cid-hfe5g5fd],.lead[data-astro-cid-hfe5g5fd]{color:#7b52c1;font-weight:700}ul[data-astro-cid-hfe5g5fd]{margin-bottom:18px;list-style:none}li[data-astro-cid-hfe5g5fd]{color:var(--text-body);margin-bottom:10px;padding-left:26px;font-size:.95rem;position:relative}li[data-astro-cid-hfe5g5fd]:before{content:"";background:#7b52c1;border-radius:3px;width:10px;height:10px;position:absolute;top:.45em;
3left:0}.statement[data-astro-cid-hfe5g5fd]{color:#fff;padding:var(--section-pad-y-tight) 0;text-align:center;background:#3e2570}.statement-text[data-astro-cid-hfe5g5fd]{margin:0;font-size:clamp(1.6rem,3vw,2.2rem);font-weight:800;line-height:1.25}.who-images[data-astro-cid-hfe5g5fd]{grid-template-columns:1.4fr 1fr;align-items:stretch;gap:18px;display:grid}.who-images[data-astro-cid-hfe5g5fd] img[data-astro-cid-hfe5g5fd]{border-radius:var(--radius-md);box-shadow:var(--shadow-md);object-fit:cover;width:100%;height:100%}.tagline[data-astro-cid-hfe5g5fd]{color:#5b3a9b;font-weight:700}.impact[data-astro-cid-hfe5g5fd] h2[data-astro-cid-hfe5g5fd]{text-align:center}@media (width<=900px){.does-grid[data-astro-cid-hfe5g5fd],.whofor-grid[data-astro-cid-hfe5g5fd]{grid-template-columns:1fr}}
4</style><link rel="stylesheet" href="/_astro/vue-app.dSZgs8q7.css"></head><body><div class="scroll-progress" data-scroll-progress role="presentation" aria-hidden="true" style="--progress-from: #00A4B3; --progress-to: #00838F;" data-astro-cid-hfrh22jg></div>
4<script type="module">var e=document.querySelector(`[data-scroll-progress]`);e&&window.addEventListener(`scroll`,()=>{let t=document.documentElement.scrollHeight-window.innerHeight;t>0&&(e.style.width=window.scrollY/t*100+`%`)},{passive:!0});</script>
4<header class="site-header" data-astro-cid-nen7h5rs><div class="header-inner" data-astro-cid-nen7h5rs><a href="/" class="logo" aria-label="PharmaGuide home" data-astro-cid-nen7h5rs><img src="/assets/logos/pharmaguide.svg" alt="PharmaGuide" width="231" height="23" data-astro-cid-nen7h5rs></a><input type="checkbox" id="nav-toggle" class="nav-toggle" aria-label="Toggle navigation menu" data-astro-cid-nen7h5rs><label for="nav-toggle" class="nav-burger" aria-hidden="true" data-astro-cid-nen7h5rs><span data-astro-cid-nen7h5rs></span><span data-astro-cid-nen7h5rs></span><span data-astro-cid-nen7h5rs></span></label><nav class="site-nav" aria-label="Main" data-astro-cid-nen7h5rs><ul data-astro-cid-nen7h5rs><li data-astro-cid-nen7h5rs><a href="/pharmacies/" data-astro-cid-nen7h5rs>Pharmacies</a></li><li data-astro-cid-nen7h5rs><a href="/enterprise/" aria-current="page" data-astro-cid-nen7h5rs>Enterprise</a></li><li data-astro-cid-nen7h5rs><a href="/manufacturers/" data-astro-cid-nen7h5rs>Manufacturers</a></li><li data-astro-cid-nen7h5rs><a href="/institutions/" data-astro-cid-nen7h5rs>Institutions</a></li><li data-astro-cid-nen7h5rs><a href="/services/" data-astro-cid-nen7h5rs>Services</a></li></ul><div class="nav-ctas" data-astro-cid-nen7h5rs><a class="btn btn--primary" href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ2_hEFlAn7hqCDFW_WPXyzbys4piGcSUuxS_JSGEVAzJCQKTNMTL3te6_S1rSHeA_-yrFJb4GNQ" target="_blank" rel="noopener" data-astro-cid-nen7h5rs>Book a Demo</a><a class="btn btn--outline" href="https://phox.app/" target="_blank" rel="noopener" data-astro-cid-nen7h5rs>Log In / Sign Up</a></div></nav></div></header><main><nav class="apps-band" style="--band: #775EBA" aria-label="Apps &amp; Services" data-apps-band data-astro-cid-fkjhh7ct><div class="band-shell" data-astro-cid-fkjhh7ct><button type="button" class="band-bar" id="apps-band-bar-enterprise" aria-expanded="false" aria-controls="apps-band-panel-enterprise" data-astro-cid-fkjhh7ct><span class="band-label" data-astro-cid-fkjhh7ct>Apps &amp; Services</span><svg class="band-caret" viewBox="0 0 12 8" aria-hidden="true" focusable="false" data-astro-cid-fkjhh7ct><path d="M1 1.5 6 6.5l5-5" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" data-astro-cid-fkjhh7ct></path></svg></button></div><div class="band-panel" id="apps-band-panel-enterprise" aria-labelledby="apps-band-bar-enterprise" data-astro-cid-fkjhh7ct><div class="panel-inner" data-astro-cid-fkjhh7ct><ul class="band-grid" data-astro-cid-fkjhh7ct><li data-astro-cid-fkjhh7ct><a class="band-product" href="/modules/phantom/phantomai/" data-astro-cid-fkjhh7ct><img class="band-logo" src="/assets/logos/phantomai-light.svg" alt="PhantomAI" width="3571" height="880" loading="lazy" decoding="async" data-astro-cid-fkjhh7ct><span class="band-tagline" data-astro-cid-fkjhh7ct>Custom AI assistant for pharmacy workflows.</span></a></li><li data-astro-cid-fkjhh7ct><a class="band-product" href="/modules/phantom/phantomdev/" data-astro-cid-fkjhh7ct><img class="band-logo" src="/assets/logos/phantomdev-light.svg" alt="PhantomDev" width="4140" height="880" loading="lazy" decoding="async" data-astro-cid-fkjhh7ct><span class="band-tagline" data-astro-cid-fkjhh7ct>Tailored AI development for healthcare operations.</span></a></li><li data-astro-cid-fkjhh7ct><a class="band-product" href="/modules/phantom/phantomanalytics/" data-astro-cid-fkjhh7ct><img class="band-logo" src="/assets/logos/phantomanalytics-light.svg" alt="PhantomAnalytics" width="5484" height="880" loading="lazy" decoding="async" data-astro-cid-fkjhh7ct><span class="band-tagline" data-astro-cid-fkjhh7ct>Advanced data intelligence that turns patterns into performance.</span></a></li></ul></div></div></nav>
4<script type="module">for(let e of document.querySelectorAll(`[data-apps-band]`)){let t=e.querySelector(`.band-bar`);if(!t)continue;let n,r=!1,i=()=>e.dataset.open===`true`,a=r=>{clearTimeout(n),e.dataset.open=String(r),t.setAttribute(`aria-expanded`,String(r))},o=(e,t)=>{clearTimeout(n),n=setTimeout(()=>a(e),t)};e.addEventListener(`pointerenter`,e=>{e.pointerType!==`touch`&&o(!0,180)}),e.addEventListener(`pointerleave`,e=>{e.pointerType!==`touch`&&o(!1,140)}),t.addEventListener(`click`,()=>a(!i())),t.addEventListener(`focus`,()=>{!r&&t.matches(`:focus-visible`)&&a(!0)}),e.addEventListener(`focusout`,t=>{let n=t.relatedTarget;(!(n instanceof Node)||!e.contains(n))&&a(!1)}),document.addEventListener(`keydown`,n=>{if(n.key!==`Escape`||!i())return;let o=e.contains(document.activeElement);a(!1),o&&(r=!0,t.focus(),r=!1)}),document.addEventListener(`click`,t=>{if(!i())return;let n=t.target;n instanceof Node&&e.contains(n)||a(!1)}),a(!1),e.dataset.enhanced=``}</script>
4<section class="family-hero" style="background:linear-gradient(135deg, #A98BDD 0%, #8A63C9 45%, #5B3A9B 100%); --hero-cta-color:#5B3A9B; --hero-cta-hover:#5B3A9B" data-astro-cid-g2uco2pu><div class="wrap hero-grid" data-astro-cid-g2uco2pu><div class="hero-logo" data-astro-cid-g2uco2pu><img src="/assets/logos/phantom.svg" alt="PHANTOM logo" width="260" height="140" loading="eager" data-astro-cid-g2uco2pu></div><div class="hero-copy" data-astro-cid-g2uco2pu><p class="eyebrow" data-astro-cid-g2uco2pu>PHANTOM: PharmaGuide Elite Solutions.</p><h1 data-astro-cid-g2uco2pu>Custom Intelligence. Integrated Power. Total Control.</h1><p class="body" data-astro-cid-g2uco2pu>PHANTOM is PharmaGuide&#39;s premium innovation line for organizations that require highly customized AI, secure integrations, and advanced automation. Built for enterprises and forward-thinking pharmacy leaders, PHANTOM delivers precision-engineered solutions tailored to your systems, workflows, and growth strategy.</p><a class="btn btn--light" href="/contact/" data-astro-cid-g2uco2pu>Partner with Us</a></div></div></section><section class="cards-container" data-astro-cid-4vapkesh><div class="cards-grid" style="--cols:4" data-astro-cid-4vapkesh><div class="card card--list" data-astro-cid-4vapkesh><div class="card-image" data-astro-cid-4vapkesh><img src="/assets/uploads/stock-1677442136019.webp" alt="Custom AI Architecture" loading="lazy" data-astro-cid-4vapkesh></div><div class="card-content" data-astro-cid-4vapkesh><h3 class="card-title" data-astro-cid-4vapkesh>Custom AI Architecture</h3><ul class="card-list" data-astro-cid-4vapkesh><li data-astro-cid-4vapkesh>AI assistants trained on your proprietary data</li><li data-astro-cid-4vapkesh>Role-based intelligence tailored to your teams</li><li data-astro-cid-4vapkesh>Secure internal deployment</li><li data-astro-cid-4vapkesh>Continuous optimization based on usage</li></ul></div></div><div class="card card--list" data-astro-cid-4vapkesh><div class="card-image" data-astro-cid-4vapkesh><img src="/assets/uploads/stock-1518432031352.webp" alt="Intelligent Workflow Automation" loading="lazy" data-astro-cid-4vapkesh></div><div class="card-content" data-astro-cid-4vapkesh><h3 class="card-title" data-astro-cid-4vapkesh>Intelligent Workflow Automation</h3><ul class="card-list" data-astro-cid-4vapkesh><li data-astro-cid-4vapkesh>Automation of complex operational processes</li><li data-astro-cid-4vapkesh>Reduction of repetitive manual tasks</li><li data-astro-cid-4vapkesh>Smart triggers and decision routing</li><li data-astro-cid-4vapkesh>Increased speed, accuracy, and efficiency</li></ul></div></div><div class="card card--list" data-astro-cid-4vapkesh><div class="card-image" data-astro-cid-4vapkesh><img src="/assets/uploads/stock-1558494949.webp" alt="Deep System Integrations" loading="lazy" data-astro-cid-4vapkesh></div><div class="card-content" data-astro-cid-4vapkesh><h3 class="card-title" data-astro-cid-4vapkesh>Deep System Integrations</h3><ul class="card-list" data-astro-cid-4vapkesh><li data-astro-cid-4vapkesh>Seamless connectivity with dispensing systems</li><li data-astro-cid-4vapkesh>Integration with POS, CRM, ERP, and reporting tools</li><li data-astro-cid-4vapkesh>Unified data environment</li><li data-astro-cid-4vapkesh>Real-time operational visibility</li></ul></div></div><div class="card card--list" data-astro-cid-4vapkesh><div class="card-image" data-astro-cid-4vapkesh><img src="/assets/uploads/stock-1551288049.webp" alt="Strategic Performance Intelligence" loading="lazy" data-astro-cid-4vapkesh></div><div class="card-content" data-astro-cid-4vapkesh><h3 class="card-title" data-astro-cid-4vapkesh>Strategic Performance Intelligence</h3><ul class="card-list" data-astro-cid-4vapkesh><li data-astro-cid-4vapkesh>Advanced analytics and reporting dashboards</li><li data-astro-cid-4vapkesh>Operational trend monitoring</li><li data-astro-cid-4vapkesh>AI-driven insights for leadership</li><li data-astro-cid-4vapkesh>Scalable infrastructure built for growth</li></ul></div></div></div></section><section class="sect" data-astro-cid-hfe5g5fd><div class="wrap does-grid" data-astro-cid-hfe5g5fd><div data-astro-cid-hfe5g5fd><h2 data-astro-cid-hfe5g5fd>What PHANTOM Does</h2><p data-astro-cid-hfe5g5fd>PHANTOM designs bespoke AI and technology ecosystems for healthcare organizations that need more than off-the-shelf tools. From intelligent assistants trained on your proprietary data to deep integrations across pharmacy systems, PHANTOM transforms operational complexity into strategic advantage.</p><p class="outcomes-title" data-astro-cid-hfe5g5fd>Core outcomes:</p><ul data-astro-cid-hfe5g5fd><li data-astro-cid-hfe5g5fd>Custom-trained AI assistants</li><li data-astro-cid-hfe5g5fd>End-to-end workflow automation</li><li data-astro-cid-hfe5g5fd>Advanced system integrations</li><li data-astro-cid-hfe5g5fd>Secure data architecture</li><li data-astro-cid-hfe5g5fd>Enterprise performance optimization</li></ul></div><img class="section-image" data-size="full" data-frame="on" data-shadow="lg" src="/assets/wix/11062b_e31cf7f2c9e74238a0edbaf6b6c3728ff000.jpg" alt="Enterprise AI and intelligent operations" width="640" height="552" loading="lazy" data-astro-cid-dhjwuw5q></div></section><section class="sect steps-sect" data-astro-cid-e3jmmlrg><div class="wrap" data-astro-cid-e3jmmlrg><h2 data-astro-cid-e3jmmlrg>How PHANTOM creates impact</h2><div class="steps-grid with-image" data-astro-cid-e3jmmlrg><article class="step-card step-card--art" style="background:#9F7FD9" data-astro-cid-e3jmmlrg><div class="step-text" data-astro-cid-e3jmmlrg><span class="num" data-astro-cid-e3jmmlrg>1</span><h3 data-astro-cid-e3jmmlrg>Intelligent Automation</h3><p data-astro-cid-e3jmmlrg>Replace repetitive manual processes with AI-powered workflows designed around your exact operations.</p><p class="note" data-astro-cid-e3jmmlrg>
4Greater efficiency. Fewer errors. Higher output.</p></div><img class="step-art" src="/assets/wix/9debbf9f310949b5882d0b5937be94dc.png" alt="Unified digital ecosystem" loading="lazy" data-astro-cid-e3jmmlrg></article><article class="step-card" style="background:#7B52C1" data-astro-cid-e3jmmlrg><div class="step-text" data-astro-cid-e3jmmlrg><span class="num" data-astro-cid-e3jmmlrg>2</span><h3 data-astro-cid-e3jmmlrg>Unified Digital Ecosystems</h3><p data-astro-cid-e3jmmlrg>Connect dispensing platforms, analytics tools, reporting systems, and operational software into one intelligent infrastructure.</p><p class="note" data-astro-cid-e3jmmlrg>Full visibility. Real-time control. Scalable performance.</p></div></article><article class="step-card" style="background:#4B2E83" data-astro-cid-e3jmmlrg><div class="step-text" data-astro-cid-e3jmmlrg><span class="num" data-astro-cid-e3jmmlrg>3</span><h3 data-astro-cid-e3jmmlrg>Strategic Innovation</h3><p data-astro-cid-e3jmmlrg>Leverage advanced AI, machine learning, and predictive capabilities to move beyond operations and into optimization.</p><p class="note" data-astro-cid-e3jmmlrg>Data-driven growth. Competitive advantage. Future-ready systems.</p></div></article></div></div></section><section class="statement" data-astro-cid-hfe5g5fd><div class="wrap" data-astro-cid-hfe5g5fd><p class="statement-text" data-astro-cid-hfe5g5fd>Unlock Advanced Capability Without Operational Friction</p></div></section><section class="sect" data-astro-cid-hfe5g5fd><div class="wrap whofor-grid" data-astro-cid-hfe5g5fd><div data-astro-cid-hfe5g5fd><h2 data-astro-cid-hfe5g5fd>Who PHANTOM is for</h2><p class="lead" data-astro-cid-hfe5g5fd>Designed for organizations building what others can&rsquo;t.</p><ul data-astro-cid-hfe5g5fd><li data-astro-cid-hfe5g5fd>Multi-location pharmacy groups scaling operations</li><li data-astro-cid-hfe5g5fd>Enterprise healthcare organizations requiring system integration</li><li data-astro-cid-hfe5g5fd>Owners investing in AI-driven transformation</li><li data-astro-cid-hfe5g5fd>Leadership teams seeking operational intelligence and automation</li><li data-astro-cid-hfe5g5fd>Organizations with complex workflows that standard tools can’t support</li></ul><p class="tagline" data-astro-cid-hfe5g5fd>PHANTOM adapts to your infrastructure, data environment, and growth strategy.</p></div><div class="who-images" data-astro-cid-hfe5g5fd><img src="/assets/wix/11062b_ccba14fb8af34f528bf00d28a949acd5f000.jpg" alt="Enterprise team collaboration" width="815" height="458" loading="lazy" data-astro-cid-hfe5g5fd><img src="/assets/wix/ef9ce3e48be340a4b91f0c3e1644aa5b.jpg" alt="Business meeting analysis" width="441" height="572" loading="lazy" data-astro-cid-hfe5g5fd></div></div></section><section class="sect sect--alt impact" data-astro-cid-hfe5g5fd><div class="wrap" data-astro-cid-hfe5g5fd><h2 data-astro-cid-hfe5g5fd>Explore PHANTOM Products</h2></div>
4<script type="application/json" id="phantom-products-data">[{"name":"PhantomAI","title":"Your Private Intelligence Layer","description":"A fully customizable AI assistant trained on your documentation and workflows — delivering contextual answers and accelerating decisions. Secure, role-aware, built for healthcare.","logoUrl":"/assets/logos/phantomai-light.svg","ctaText":"Partner with Us","landingUrl":"/modules/phantom/phantomai/"},{"name":"PhantomDev","title":"Advanced Development & System Integration","description":"Tailored AI development for healthcare operations — connecting your technology ecosystem into one seamless environment through deep integrations and automation pipelines.","logoUrl":"/assets/logos/phantomdev-light.svg","ctaText":"Partner with Us","landingUrl":"/modules/phantom/phantomdev/"},{"name":"PhantomAnalytics","title":"Data Intelligence & Insights","description":"Advanced data intelligence that turns patterns into performance — real-time business intelligence, predictive analytics, and customizable dashboards for informed decisions.","logoUrl":"/assets/logos/phantomanalytics-light.svg","ctaText":"Partner with Us","landingUrl":"/modules/phantom/phantomanalytics/"}]</script>
4<div class="module-embed">
5<style>
6    :root {
7      --primary: #B199F1;
8      --primary-dark: #4B3781;
9      --primary-medium: #705AAC;
10      /* What a filled button with a white label paints (PAI-588). --primary is
11         2.41:1 against white and stays an outline/tint colour only; this is the
12         same purple the nav arrows and --primary-medium below already use, and it
13         is declared in src/styles/tokens.css so the contrast lives in one place. */
14      --accent-strong: var(--phantom-accent-strong);
15      --primary-light: #F5F0FE;
16      --primary-lighter: #DDD0F7;
17      --logo-bg: #5E479B;
18      --logo-bg-dark: #3F2D6E;
19      --text-dark: #242525;
20      --text-secondary: #5f6368;
21      --white: #ffffff;
22      --shadow: rgba(75, 55, 129, 0.15);
23      --shadow-hover: rgba(75, 55, 129, 0.25);
24    }
25
26    * {
27      margin: 0;
28      padding: 0;
29      box-sizing: border-box;
30    }
31
32    .module-embed {
33      overflow: hidden;
34    }
35
36    .module-embed {
37      font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
38      background: transparent;
39      color: var(--text-dark);
40      overflow: hidden;
41    }
42
43    .products-section {
44      max-width: 100%;
45      padding: var(--section-pad-y-tight) 0;
46      position: relative;
47      overflow: hidden;
48    }
49
50    /* The heading lives on the host page (CMS: Enterprise Page → Products
51       Section Heading); the embed deliberately renders none of its own. */
52
53    .carousel-container {
54      position: relative;
55      width: 100%;
56      padding: 0 80px;
57    }
58
59    .carousel-wrapper {
60      overflow: hidden;
61      width: 100%;
62      padding: 20px 0;
63    }
64
65    .carousel-track {
66      display: flex;
67      gap: 24px;
68      transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
69      align-items: stretch;
70      will-change: transform;
71    }
72
73    .product-card {
74      flex: 0 0 auto;
75      width: 280px;
76      height: 380px;
77      background: var(--white);
78      border-radius: 28px;
79      box-shadow: 0 4px 20px var(--shadow);
80      overflow: hidden;
81      display: flex;
82      flex-direction: row;
83      transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
84      cursor: pointer;
85      position: relative;
86    }
87
88    .product-card:hover {
89      box-shadow: 0 8px 40px var(--shadow-hover);
90      transform: translateY(-6px);
91    }
92
93    .product-card.active {
94      width: 780px;
95      cursor: default;
96    }
97
98    .product-card.active:hover {
99      transform: none;
100    }
101
102    /* Branded panel: the product logo centred on the PHANTOM gradient — no
103       photography, no white logo pill. */
104    .media-container {
105      flex: 0 0 100%;
106      width: 100%;
107      height: 100%;
108      position: relative;
109      overflow: hidden;
110      background: linear-gradient(145deg, var(--logo-bg) 0%, var(--logo-bg-dark) 100%);
111      border-radius: 28px;
112      transition: all 0.6s cubic-bezier(0.4, 0, 0.2, 1);
113      display: flex;
114      align-items: center;
115      justify-content: center;
116      padding: 32px;
117    }
118
119    .product-card.active .media-container {
120      flex: 0 0 380px;
121      width: 380px;
122      border-radius: 28px 0 0 28px;
123    }
124
125    .media-container img.logo-mark {
126      width: 78%;
127      max-width: 220px;
128      height: auto;
129      display: block;
130      transition: transform 0.6s ease;
131    }
132
133    .product-card:hover .media-container img.logo-mark {
134      transform: scale(1.05);
135    }
136
137    .product-card.active:hover .media-container img.logo-mark {
138      transform: none;
139    }
140
141    .content-container {
142      flex: 1;
143      padding: 48px 40px;
144      display: flex;
145      flex-direction: column;
146      justify-content: center;
147      opacity: 0;
148      visibility: hidden;
149      transition: opacity 0.5s ease 0.2s, visibility 0.5s ease;
150      min-width: 0;
151      background: var(--white);
152      border-radius: 0 28px 28px 0;
153    }
154
155    .product-card.active .content-container {
156      opacity: 1;
157      visibility: visible;
158    }
159
160    .product-title {
161      font-family: 'Montserrat', sans-serif;
162      font-size: 28px;
163      font-weight: 600;
164      color: var(--text-dark);
165      margin-bottom: 20px;
166      line-height: 1.3;
167    }
168
169    .product-description {
170      font-size: 16px;
171      line-height: 1.7;
172      color: var(--text-secondary);
173      margin-bottom: 28px;
174    }
175
176    .button-container {
177      display: flex;
178      flex-direction: column;
179      gap: 16px;
180      align-items: flex-start;
181    }
182
183    .btn-primary {
184      display: inline-flex;
185      align-items: center;
186      justify-content: center;
187      padding: 12px 14px;
188      height: 40px;
189      background: var(--primary-medium);
190      color: var(--white);
191      font-family: 'Montserrat', sans-serif;
192      font-size: 16px;
193      font-weight: 400;
194      letter-spacing: 0.1em;
195      text-decoration: none;
196      border: 1px solid var(--primary-medium);
197      border-radius: 20px;
198      cursor: pointer;
199      transition: all 0.3s ease;
200    }
201
202    .btn-primary:hover {
203      background: var(--white);
204      color: var(--primary-medium);
205      border-color: var(--primary-medium);
206    }
207
208    .learn-more {
209      display: inline-flex;
210      align-items: center;
211      gap: 8px;
212      color: var(--primary-medium);
213      font-weight: 600;
214      font-size: 15px;
215      text-decoration: none;
216      transition: gap 0.3s ease;
217    }
218
219    .learn-more:hover {
220      gap: 12px;
221    }
222
223    .learn-more svg {
224      width: 20px;
225      height: 20px;
226      fill: currentColor;
227    }
228
229    .nav-button {
230      position: absolute;
231      top: 50%;
232      transform: translateY(-50%);
233      width: 56px;
234      height: 56px;
235      border-radius: 50%;
236      background: var(--white);
237      border: none;
238      box-shadow: 0 2px 12px var(--shadow);
239      cursor: pointer;
240      display: flex;
241      align-items: center;
242      justify-content: center;
243      transition: all 0.3s ease;
244      z-index: 100;
245    }
246
247    .nav-button:hover {
248      background: var(--white);
249      box-shadow: 0 4px 20px var(--shadow-hover);
250      transform: translateY(-50%) scale(1.08);
251    }
252
253    .nav-button:active {
254      transform: translateY(-50%) scale(0.95);
255    }
256
257    .nav-button:disabled {
258      opacity: 0.4;
259      cursor: not-allowed;
260      transform: translateY(-50%);
261    }
262
263    .nav-button:disabled:hover {
264      background: var(--white);
265      box-shadow: 0 2px 12px var(--shadow);
266      transform: translateY(-50%);
267    }
268
269    .nav-button svg {
270      width: 24px;
271      height: 24px;
272      fill: var(--text-dark);
273    }
274
275    .nav-button.prev {
276      left: 16px;
277    }
278
279    .nav-button.next {
280      right: 16px;
281    }
282
283    .progress-container {
284      display: flex;
285      justify-content: center;
286      gap: 12px;
287      margin-top: var(--block-gap);
288    }
289
290    .progress-dot {
291      width: 12px;
292      height: 12px;
293      border-radius: 50%;
294      background: var(--primary-lighter);
295      cursor: pointer;
296      transition: all 0.3s ease;
297      border: none;
298    }
299
300    .progress-dot:hover {
301      background: var(--primary-medium);
302      opacity: 0.6;
303      transform: scale(1.15);
304    }
305
306    .progress-dot.active {
307      background: var(--primary-medium);
308      width: 32px;
309      border-radius: 6px;
310    }
311
312    @media (max-width: 1200px) {
313      .product-card {
314        width: 240px;
315        height: 340px;
316      }
317
318      .product-card.active {
319        width: 680px;
320      }
321
322      .product-card.active .media-container {
323        flex: 0 0 320px;
324        width: 320px;
325      }
326
327      .carousel-container {
328        padding: 0 60px;
329      }
330    }
331
332    @media (max-width: 900px) {
333      .product-card {
334        width: 200px;
335        height: 300px;
336      }
337
338      .product-card.active {
339        width: 560px;
340      }
341
342      .product-card.active .media-container {
343        flex: 0 0 260px;
344        width: 260px;
345      }
346
347      .content-container {
348        padding: 32px 28px;
349      }
350
351      .product-title {
352        font-size: 24px;
353      }
354
355      .carousel-container {
356        padding: 0 50px;
357      }
358
359      .nav-button {
360        width: 48px;
361        height: 48px;
362      }
363
364      .media-container img.logo-mark {
365        max-width: 180px;
366      }
367
368      .btn-primary {
369        padding: 12px 24px;
370        font-size: 14px;
371      }
372    }
373
374    @media (max-width: 700px) {
375      .product-card {
376        width: 160px;
377        height: 260px;
378        border-radius: 20px;
379      }
380
381      .product-card.active {
382        width: calc(100vw - 100px);
383        max-width: 480px;
384        flex-direction: column;
385        height: auto;
386      }
387
388      .product-card.active .media-container {
389        flex: 0 0 200px;
390        width: 100%;
391        height: 200px;
392        border-radius: 20px 20px 0 0;
393      }
394
395      .content-container {
396        border-radius: 0 0 20px 20px;
397      }
398
399      .media-container {
400        border-radius: 20px;
401      }
402
403      .carousel-container {
404        padding: 0 24px;
405      }
406
407      .carousel-track {
408        gap: 16px;
409      }
410
411      .nav-button {
412        width: 44px;
413        height: 44px;
414      }
415
416      .nav-button.prev {
417        left: 8px;
418      }
419
420      .nav-button.next {
421        right: 8px;
422      }
423    }
424
425    @media (max-width: 500px) {
426
427      .product-card {
428        width: 130px;
429        height: 220px;
430        border-radius: 18px;
431      }
432
433      .product-card.active .media-container {
434        height: 170px;
435        border-radius: 18px 18px 0 0;
436      }
437
438      .content-container {
439        border-radius: 0 0 18px 18px;
440        padding: 24px 20px;
441      }
442
443      .media-container {
444        border-radius: 18px;
445      }
446
447      .nav-button {
448        width: 40px;
449        height: 40px;
450      }
451
452      .product-description {
453        font-size: 14px;
454        margin-bottom: 20px;
455      }
456
457      .btn-primary {
458        padding: 10px 20px;
459        font-size: 13px;
460        width: 100%;
461      }
462
463      .button-container {
464        width: 100%;
465      }
466    }
467
468    /* ========================================
469       MOBILE CAROUSEL - Compact Card Slider
470       ======================================== */
471    @media (max-width: 768px) {
472
473      .carousel-container {
474        padding: 0;
475        position: relative;
476      }
477
478      .carousel-wrapper {
479        overflow: hidden;
480        width: 100%;
481        padding: 0 0 16px 0;
482      }
483
484      .carousel-track {
485        gap: 12px;
486        transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
487      }
488
489      /* Every card: compact vertical layout, symmetric peek on both sides */
490      .product-card,
491      .product-card.active {
492        flex: 0 0 calc(100vw - 52px);
493        width: calc(100vw - 52px);
494        height: auto;
495        flex-direction: column;
496        border-radius: 16px;
497        cursor: default;
498        transform: none !important;
499        box-shadow: 0 2px 12px var(--shadow);
500      }
501
502      .product-card:hover {
503        transform: none !important;
504        box-shadow: 0 2px 12px var(--shadow);
505      }
506
507      /* Compact branded panel */
508      .product-card .media-container,
509      .product-card.active .media-container {
510        flex: 0 0 150px;
511        width: 100%;
512        height: 150px;
513        border-radius: 16px 16px 0 0;
514        padding: 20px;
515      }
516
517      .product-card .media-container img.logo-mark,
518      .product-card.active .media-container img.logo-mark {
519        max-width: 170px;
520      }
521
522      /* Content always visible, tight padding */
523      .product-card .content-container,
524      .product-card.active .content-container {
525        opacity: 1;
526        visibility: visible;
527        padding: 14px 16px 18px;
528        border-radius: 0 0 16px 16px;
529      }
530
531      /* Tight typography */
532      .product-title {
533        font-size: 18px;
534        margin-bottom: 6px;
535        line-height: 1.25;
536      }
537
538      .product-description {
539        font-size: 13px;
540        line-height: 1.45;
541        margin-bottom: 12px;
542        display: -webkit-box;
543        -webkit-line-clamp: 3;
544        line-clamp: 3;
545        -webkit-box-orient: vertical;
546        overflow: hidden;
547      }
548
549      /* CTA row: wrap if needed so Learn more doesn't clip */
550      .button-container {
551        flex-direction: row;
552        flex-wrap: wrap;
553        align-items: center;
554        gap: 10px 16px;
555        width: auto;
556        padding-right: 4px;
557      }
558
559      .btn-primary {
560        padding: 7px 16px;
561        font-size: 13px;
562        height: 32px;
563        width: auto;
564        white-space: nowrap;
565      }
566
567      .learn-more {
568        font-size: 13px;
569        white-space: nowrap;
570      }
571
572      /* Hide desktop nav arrows */
573      .nav-button.prev,
574      .nav-button.next {
575        display: none;
576      }
577
578      /* Mobile nav arrows — centered on the panel's bottom edge */
579      .mobile-nav-arrow {
580        position: absolute;
581        top: 150px;
582        transform: translateY(-50%);
583        width: 40px;
584        height: 40px;
585        border-radius: 50%;
586        background: rgba(255, 255, 255, 0.8);
587        backdrop-filter: blur(4px);
588        -webkit-backdrop-filter: blur(4px);
589        border: none;
590        box-shadow: 0 1px 6px rgba(0, 0, 0, 0.12);
591        cursor: pointer;
592        display: flex;
593        align-items: center;
594        justify-content: center;
595        z-index: 10;
596        -webkit-tap-highlight-color: transparent;
597        transition: opacity 0.25s ease;
598      }
599
600      .mobile-nav-arrow:active {
601        transform: translateY(-50%) scale(0.9);
602      }
603
604      .mobile-nav-arrow.hidden {
605        opacity: 0;
606        pointer-events: none;
607      }
608
609      .mobile-nav-arrow svg {
610        width: 20px;
611        height: 20px;
612        fill: var(--text-dark);
613      }
614
615      .mobile-nav-arrow.mobile-prev {
616        left: 16px;
617      }
618
619      .mobile-nav-arrow.mobile-next {
620        right: 16px;
621      }
622
623      /* Compact dots — always visible */
624      .progress-container {
625        gap: 6px;
626      }
627
628      .progress-dot {
629        width: 8px;
630        height: 8px;
631      }
632
633      .progress-dot.active {
634        width: 24px;
635        border-radius: 4px;
636      }
637    }
638  </style>
639<style>
640  /* ===== Shared carousel card rule — src/lib/carousel-card.ts ===== */
641
642  /* Every width at which the card has a fixed height, so the content has to fit it. */
643  @media (min-width: 769px) {
644    .content-container {
645      padding: 32px 40px;
646      overflow: hidden;
647    }
648
649    .product-number,
650    .product-title,
651    .button-container {
652      flex: 0 0 auto;
653    }
654
655    .product-number { margin-bottom: 12px; }
656    .product-title { margin-bottom: 14px; }
657    .button-container { gap: 12px; }
658
659    .product-description {
660      flex: 0 1 auto;
661      min-height: 0;
662      line-height: 1.6;
663      margin-bottom: 18px;
664      display: -webkit-box;
665    -webkit-box-orient: vertical;
666    -webkit-line-clamp: 5;
667    line-clamp: 5;
668    overflow: hidden;
669    }
670  }
671
672  /* Cards grow by 40px per tier: five lines, a three-line heading and the CTA row do not
673     fit 380/340/300px at any padding worth calling padding. Widths are untouched — the
674     carousel script centres the track from CARD_WIDTH_COLLAPSED/EXPANDED. */
675  @media (min-width: 1201px) {
676    .product-card { height: 420px; }
677  }
678
679  @media (min-width: 901px) and (max-width: 1200px) {
680    .product-card { height: 380px; }
681
682    .content-container { padding: 28px 32px; }
683    .product-title { font-size: 24px; margin-bottom: 12px; }
684    .product-description { font-size: 15px; margin-bottom: 16px; }
685    .button-container { gap: 10px; }
686  }
687
688  /* The narrowest fixed-height card, and the only one where five lines plus PHALCON's
689     name badge needs the rhythm closed up to clear the padding. */
690  @media (min-width: 769px) and (max-width: 900px) {
691    .product-card { height: 340px; }
692
693    .content-container { padding: 24px 26px; }
694    .product-number { margin-bottom: 8px; }
695    .product-title { font-size: 20px; margin-bottom: 8px; }
696    .product-description { font-size: 14px; margin-bottom: 12px; }
697    .button-container { gap: 10px; }
698  }
699
700  /* Stacked mobile card: auto-height, so only the clamp applies. */
701  @media (max-width: 768px) {
702    .product-description {
703      display: -webkit-box;
704    -webkit-box-orient: vertical;
705    -webkit-line-clamp: 3;
706    line-clamp: 3;
707    overflow: hidden;
708    }
709  }
710
711  /* ===== PAI-560: row alignment and CTA hierarchy ===== */
712
713  /* The track is a plain left-aligned flex row that the script only ever
714     translates leftwards, so three cards on a wide screen sat pinned to the
715     section's left edge with the right half empty. Sized to its cards and given
716     auto margins, the row centres itself whenever it fits the wrapper — and the
717     margins resolve to zero the moment it overflows, which is exactly the
718     left-origin geometry the embeds' translate maths assumes. Their half of the
719     deal: centerActiveCard() bails out to translateX(0) in that same fits case. */
720  .carousel-track {
721    width: fit-content;
722    margin-left: auto;
723    margin-right: auto;
724  }
725
726  /* "Learn more" is the filled primary pill on every product card, and the
727     family CTA — the partnership or booking ask from cta-policy.ts — seconds 
727it
728     as an outlined one; the embeds ship those two treatments the other way
729     round. This comment ships inside every built page, so it must not spell any
730     family's label out: cta-policy.test.ts holds PHOENIX routes to never
731     mentioning a demo. The class names keep their historical meaning
732     (.btn-primary is the family CTA, .learn-more the product link) because the
733     carousel scripts and the width tests key on them; the swap is visual, and
734     it lives here so all five families change together.
735
736     Both treatments take --accent-strong rather than --primary, and for the same
737     reason from opposite sides — the same reason tokens.css gives for the teal's
738     .btn--primary/.btn--outline pair. Filling with the raw accent is what put a
739     white label on a 2.41:1 lavender here (PAI-588): an accent is chosen to read
740     as an outline on white, which is a job a filled surface behind white text
741     cannot borrow. Every embed maps --accent-strong onto its own family token
742     from tokens.css, and four of the five resolve to the accent unchanged. The
743     fallback keeps a family that has not been mapped yet painting what it paints
744     today rather than losing its background altogether —
745     family-accent-contrast.test.ts is what actually catches the missing mapping.
746
747     The outline carries the fill's colour as text on the white card, so it is the
748     same 4.5:1 question with the two grounds swapped, and it takes the same token.
749     Its border is restated below rather than left to the embed, which draws it
750     from --primary on four families and --primary-medium on the fifth.
751
752     Hover stays on --primary-dark: every family's is darker again than its strong
753     tier and clears AA on white, so this darkens the way #00838F darkens to
754     #00737D without a sixth colour to keep in step. */
755  .learn-more {
756    justify-content: center;
757    background: var(--accent-strong, var(--primary));
758    color: var(--white);
759    border: 1px solid var(--accent-strong, var(--primary));
760    border-radius: 20px;
761    transition: all 0.3s ease;
762  }
763
764  /* A filled button holds its width: no gap-stretch on hover. */
765  .learn-more:hover {
766    gap: 8px;
767    background: var(--primary-dark, var(--primary));
768    border-color: var(--primary-dark, var(--primary));
769  }
770
771  .btn-primary {
772    background: transparent;
773    color: var(--accent-strong, var(--primary));
774    border-color: var(--accent-strong, var(--primary));
775    letter-spacing: 0.02em;
776  }
777
778  .btn-primary:hover {
779    background: var(--accent-strong, var(--primary));
780    color: var(--white);
781    border-color: var(--accent-strong, var(--primary));
782  }
783
784  /* One compact box for the pair, per layout regime, so neither reads oversized
785     — the mobile metrics are the ones the embeds already give .btn-primary. */
786  @media (min-width: 769px) {
787    .btn-primary,
788    .learn-more {
789      height: 36px;
790      padding: 0 18px;
791      font-size: 14px;
792      font-weight: 600;
793    }
794  }
795
796  @media (max-width: 768px) {
797    .btn-primary,
798    .learn-more {
799      height: 32px;
800      padding: 7px 16px;
801      font-size: 13px;
802      font-weight: 600;
803    }
804  }
805</style>
806
807
808<section class="products-section">
809  <div class="carousel-container">
810    <button class="nav-button prev" aria-label="Previous product">
811      <svg viewBox="0 0 24 24">
812        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
813      </svg>
814    </button>
815
816    <div class="carousel-wrapper">
817      <div class="carousel-track" id="carouselTrack"><div class="product-card active" data-index="0"><div class="media-container"><img class="logo-mark" src="/assets/logos/phantomai-light.svg" alt="PhantomAI logo" loading="lazy"></div><div class="content-container"><h3 class="product-title">Your Private Intelligence Layer</h3><p class="product-description">A fully customizable AI assistant trained on your documentation and workflows — delivering contextual answers and accelerating decisions. Secure, role-aware, built for healthcare.</p><div class="button-container"><a href="/modules/phantom/phantomai/" target="_blank" rel="noopener noreferrer" class="learn-more">Learn more<svg viewBox="0 0 24 24">
817<path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg></a><a href="/contact/" class="btn-primary">Partner with Us</a></div></div></div><div class="product-card" data-index="1"><div class="media-container"><img class="logo-mark" src="/assets/logos/phantomdev-light.svg" alt="PhantomDev logo" loading="lazy"></div><div class="content-container"><h3 class="product-title">Advanced Development &amp; System Integration</h3><p class="product-description">Tailored AI development for healthcare operations — connecting your technology ecosystem into one seamless environment through deep integrations and automation pipelines.</p><div class="button-container"><a href="/modules/phantom/phantomdev/" target="_blank" rel="noopener noreferrer" class="learn-more">Learn more<svg viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg></a><a href="/contact/" class="btn-primary">Partner with Us</a></div></div></div><div class="product-card" data-index="2"><div class="media-container"><img class="logo-mark" src="/assets/logos/phantomanalytics-light.svg" alt="PhantomAnalytics logo" loading="lazy"></div><div class="content-container"><h3 class="product-title">Data Intelligence &amp; Insights</h3><p class="product-description">Advanced data intelligence that turns patterns into performance — real-time business intelligence, predictive analytics, and customizable dashboards for informed decisions.</p><div class="button-container"><a href="/modules/phantom/phantomanalytics/" target="_blank" rel="noopener noreferrer" class="learn-more">Learn more<svg viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg></a><a href="/contact/" class="btn-primary">Partner with Us</a></div></div></div></div>
818    </div>
819
820    <button class="nav-button next" aria-label="Next product">
821      <svg viewBox="0 0 24 24">
822        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/>
823      </svg>
824    </button>
825  </div>
826
827  <div class="progress-container" id="progressContainer">
828  </div>
829</section>
830
831<script>
832// Cards are CMS-managed (src/data/*-page.json). The host page injects them
833// as 
833<script type="application/json" id="phantom-products-data">.
834const productsConfig = JSON.parse(document.getElementById('phantom-products-data').textContent);
835
836const CARD_WIDTH_COLLAPSED = 280;
837const CARD_WIDTH_EXPANDED = 780;
838const GAP = 24;
839
840const carouselTrack = document.getElementById('carouselTrack');
841const progressContainer = document.getElementById('progressContainer');
842const prevButton = document.querySelector('.nav-button.prev');
843const nextButton = document.querySelector('.nav-button.next');
844
845let activeCardIndex = 0;
846
847function generateCards() {
848  /* The Astro page renders these cards server-side so the product copy is in the
849     HTML for crawlers and for anyone without JavaScript. When they are already
850     there, don't build a second set — just wire up the behaviour. */
851  const prerendered = carouselTrack.querySelectorAll('.product-card');
852  if (prerendered.length) {
853    prerendered.forEach((card, index) => {
854      card.addEventListener('click', (e) => {
855        if (!e.target.closest('.btn-primary') && !e.target.closest('.learn-more') && activeCardIndex !== index) {
856          openCard(index);
857        }
858      });
859    });
860    return;
861  }
862  productsConfig.forEach((product, index) => {
863    const card = document.createElement('div');
864    card.className = index === 0 ? 'product-card active' : 'product-card';
865    card.dataset.index = index;
866    /* The primary button goes to /contact/, not #book-demo: PHANTOM's ask is "Partner with
867       Us" (PAI-511), and a partnership button that opens the demo-booking calendar is the
868       incoherence the ticket is about. The label stays the editor's ctaText, which
869       cta-policy.test.ts holds to the policy; only the destination is fixed here, the way
870       python's and phalcon's fallback cards already point at it. */
871    card.innerHTML = `
872      <div class="media-container">
873        <img class="logo-mark" src="${product.logoUrl}" alt="${product.name} logo" loading="lazy">
874      </div>
875      <div class="content-container">
876        <h3 class="product-title">${product.title}</h3>
877        <p class="product-description">${product.description}</p>
878        <div class="button-container">
879          <a href="${product.landingUrl}" target="_blank" rel="noopener noreferrer" class="learn-more">Learn more<svg viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg></a>
880          <a href="/contact/" class="btn-primary">${product.ctaText}</a>
881        </div>
882      </div>
883    `;
884
885    card.addEventListener('click', (e) => {
886      if (!e.target.closest('.btn-primary') && !e.target.closest('.learn-more') && activeCardIndex !== index) {
887        openCard(index);
888      }
889    });
890
891    carouselTrack.appendChild(card);
892  });
893}
894
895function openCard(index) {
896  const cards = document.querySelectorAll('.product-card');
897
898  cards.forEach((card, i) => {
899    if (i === index) {
900      card.classList.add('active');
901    } else {
902      card.classList.remove('active');
903    }
904  });
905
906  activeCardIndex = index;
907  updateDots();
908  updateButtons();
909
910  setTimeout(() => {
911    centerActiveCard(index);
912  }, 50);
913}
914
915function centerActiveCard(index) {
916  const wrapper = document.querySelector('.carousel-wrapper');
917  const wrapperWidth = wrapper.offsetWidth;
918
919  /* One card is always expanded, so the row is the same width whichever card that
920     is. A row that fits the wrapper is centred by the track's auto margins
921     (src/lib/carousel-card.ts, PAI-560); translating it would drag it off-centre,
922     so only clear whatever transform a narrower window left behind. */
923  const trackWidth = CARD_WIDTH_EXPANDED + (productsConfig.length - 1) * (CARD_WIDTH_COLLAPSED + GAP);
924  if (trackWidth <= wrapperWidth) {
925    carouselTrack.style.transform = 'translateX(0)';
926    return;
927  }
928
929  let positionBeforeActive = 0;
930  for (let i = 0; i < index; i++) {
931    positionBeforeActive += CARD_WIDTH_COLLAPSED + GAP;
932  }
933
934  const activeCardWidth = CARD_WIDTH_EXPANDED;
935  const activeCardCenter = positionBeforeActive + (activeCardWidth / 2);
936  const offset = activeCardCenter - (wrapperWidth / 2);
937
938  carouselTrack.style.transform = `translateX(${-Math.max(0, offset)}px)`;
939}
940
941function generateDots() {
942  productsConfig.forEach((_, index) => {
943    const dot = document.createElement('button');
944    dot.className = index === 0 ? 'progress-dot active' : 'progress-dot';
945    dot.setAttribute('aria-label', `Go to ${productsConfig[index].name}`);
946    dot.addEventListener('click', () => {
947      openCard(index);
948    });
949    progressContainer.appendChild(dot);
950  });
951}
952
953function updateDots() {
954  const dots = document.querySelectorAll('.progress-dot');
955  dots.forEach((dot, index) => {
956    dot.classList.toggle('active', index === activeCardIndex);
957  });
958}
959
960function navigate(direction) {
961  const maxIndex = productsConfig.length - 1;
962  let newIndex = activeCardIndex;
963
964  if (direction === 'next' && activeCardIndex < maxIndex) {
965    newIndex = activeCardIndex + 1;
966  } else if (direction === 'prev' && activeCardIndex > 0) {
967    newIndex = activeCardIndex - 1;
968  }
969
970  if (newIndex !== activeCardIndex) {
971    openCard(newIndex);
972  }
973}
974
975function updateButtons() {
976  prevButton.disabled = activeCardIndex === 0;
977  nextButton.disabled = activeCardIndex === productsConfig.length - 1;
978}
979
980prevButton.addEventListener('click', () => navigate('prev'));
981nextButton.addEventListener('click', () => navigate('next'));
982
983document.addEventListener('keydown', (e) => {
984  if (e.key === 'ArrowLeft') navigate('prev');
985  if (e.key === 'ArrowRight') navigate('next');
986});
987
988function init() {
989  generateCards();
990  generateDots();
991  updateButtons();
992
993  setTimeout(() => {
994    centerActiveCard(0);
995  }, 100);
996}
997
998let resizeTimeout;
999window.addEventListener('resize', () => {
1000  clearTimeout(resizeTimeout);
1001  resizeTimeout = setTimeout(() => {
1002    centerActiveCard(activeCardIndex);
1003  }, 150);
1004});
1005
1006init();
1007
1008// ========================================
1009// 📱 MOBILE CAROUSEL - Compact Card Slider
1010// ========================================
1011(function() {
1012  let mobileInitialized = false;
1013  let mobilePrevBtn = null;
1014  let mobileNextBtn = null;
1015  let touchStartX = 0;
1016  let touchStartY = 0;
1017  let touchDeltaX = 0;
1018  let isSwiping = false;
1019  const SWIPE_THRESHOLD = 40;
1020  const MOBILE_GAP = 12;
1021
1022  function isMobile() {
1023    return window.innerWidth <= 768;
1024  }
1025
1026  function getCardWidth() {
1027    var card = document.querySelector('.product-card');
1028    return card ? card.offsetWidth : 0;
1029  }
1030
1031  function getSlideStep() {
1032    return getCardWidth() + MOBILE_GAP;
1033  }
1034
1035  function getPeekOffset() {
1036    var wrapper = document.querySelector('.carousel-wrapper');
1037    return wrapper ? (wrapper.offsetWidth - getCardWidth()) / 2 : 0;
1038  }
1039
1040  const _desktopOpenCard = openCard;
1041  openCard = function(index) {
1042    if (!isMobile()) {
1043      _desktopOpenCard(index);
1044      return;
1045    }
1046    activeCardIndex = index;
1047    slideTo(index);
1048    updateDots();
1049    updateMobileButtons();
1050  };
1051
1052  const _desktopCenterActiveCard = centerActiveCard;
1053  centerActiveCard = function(index) {
1054    if (isMobile()) {
1055      slideTo(index);
1056      return;
1057    }
1058    _desktopCenterActiveCard(index);
1059  };
1060
1061  function slideTo(index) {
1062    var offset = index * getSlideStep() - getPeekOffset();
1063    carouselTrack.style.transform = 'translateX(' + (-offset) + 'px)';
1064  }
1065
1066  function updateMobileButtons() {
1067    if (!mobilePrevBtn || !mobileNextBtn) return;
1068    mobilePrevBtn.classList.toggle('hidden', activeCardIndex === 0);
1069    mobileNextBtn.classList.toggle('hidden', activeCardIndex === productsConfig.length - 1);
1070  }
1071
1072  function createMobileArrows() {
1073    if (mobilePrevBtn) return;
1074    var container = document.querySelector('.carousel-container');
1075
1076    mobilePrevBtn = document.createElement('button');
1077    mobilePrevBtn.className = 'mobile-nav-arrow mobile-prev';
1078    mobilePrevBtn.setAttribute('aria-label', 'Previous product');
1079    mobilePrevBtn.innerHTML = '<svg viewBox="0 0 24 24"><path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/></svg>';
1080    mobilePrevBtn.addEventListener('click', function(e) {
1081      e.stopPropagation();
1082      if (activeCardIndex > 0) openCard(activeCardIndex - 1);
1083    });
1084
1085    mobileNextBtn = document.createElement('button');
1086    mobileNextBtn.className = 'mobile-nav-arrow mobile-next';
1087    mobileNextBtn.setAttribute('aria-label', 'Next product');
1088    mobileNextBtn.innerHTML = '<svg viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"/></svg>';
1089    mobileNextBtn.addEventListener('click', function(e) {
1090      e.stopPropagation();
1091      if (activeCardIndex < productsConfig.length - 1) openCard(activeCardIndex + 1);
1092    });
1093
1094    container.appendChild(mobilePrevBtn);
1095    container.appendChild(mobileNextBtn);
1096  }
1097
1098  function removeMobileArrows() {
1099    if (mobilePrevBtn) { mobilePrevBtn.remove(); mobilePrevBtn = null; }
1100    if (mobileNextBtn) { mobileNextBtn.remove(); mobileNextBtn = null; }
1101  }
1102
1103  function onTouchStart(e) {
1104    if (!isMobile()) return;
1105    touchStartX = e.touches[0].clientX;
1106    touchStartY = e.touches[0].clientY;
1107    touchDeltaX = 0;
1108    isSwiping = false;
1109    carouselTrack.style.transition = 'none';
1110  }
1111
1112  function onTouchMove(e) {
1113    if (!isMobile()) return;
1114    var dx = e.touches[0].clientX - touchStartX;
1115    var dy = e.touches[0].clientY - touchStartY;
1116
1117    if (!isSwiping && Math.abs(dx) > 10) {
1118      isSwiping = Math.abs(dx) > Math.abs(dy);
1119    }
1120
1121    if (isSwiping) {
1122      e.preventDefault();
1123      touchDeltaX = dx;
1124      var baseOffset = activeCardIndex * getSlideStep() - getPeekOffset();
1125      carouselTrack.style.transform = 'translateX(' + (-baseOffset + dx) + 'px)';
1126    }
1127  }
1128
1129  function onTouchEnd() {
1130    if (!isMobile() || !isSwiping) {
1131      carouselTrack.style.transition = '';
1132      return;
1133    }
1134    carouselTrack.style.transition = '';
1135    isSwiping = false;
1136
1137    if (touchDeltaX < -SWIPE_THRESHOLD && activeCardIndex < productsConfig.length - 1) {
1138      openCard(activeCardIndex + 1);
1139    } else if (touchDeltaX > SWIPE_THRESHOLD && activeCardIndex > 0) {
1140      openCard(activeCardIndex - 1);
1141    } else {
1142      slideTo(activeCardIndex);
1143    }
1144  }
1145
1146  function setupMobile() {
1147    if (mobileInitialized) return;
1148    mobileInitialized = true;
1149
1150    document.querySelectorAll('.product-card').forEach(function(card) {
1151      card.classList.remove('active');
1152    });
1153
1154    createMobileArrows();
1155    slideTo(activeCardIndex);
1156    updateMobileButtons();
1157
1158    var wrapper = document.querySelector('.carousel-wrapper');
1159    wrapper.addEventListener('touchstart', onTouchStart, { passive: true });
1160    wrapper.addEventListener('touchmove', onTouchMove, { passive: false });
1161    wrapper.addEventListener('touchend', onTouchEnd, { passive: true });
1162  }
1163
1164  function teardownMobile() {
1165    if (!mobileInitialized) return;
1166    mobileInitialized = false;
1167
1168    removeMobileArrows();
1169
1170    var wrapper = document.querySelector('.carousel-wrapper');
1171    wrapper.removeEventListener('touchstart', onTouchStart);
1172    wrapper.removeEventListener('touchmove', onTouchMove);
1173    wrapper.removeEventListener('touchend', onTouchEnd);
1174
1175    document.querySelectorAll('.product-card').forEach(function(card, i) {
1176      card.classList.toggle('active', i === activeCardIndex);
1177    });
1178    carouselTrack.style.transform = '';
1179    _desktopCenterActiveCard(activeCardIndex);
1180    updateButtons();
1181  }
1182
1183  function onResize() {
1184    if (isMobile()) {
1185      if (!mobileInitialized) {
1186        setupMobile();
1187      } else {
1188        slideTo(activeCardIndex);
1189      }
1190    } else {
1191      teardownMobile();
1192    }
1193  }
1194
1195  if (isMobile()) {
1196    setupMobile();
1197  }
1198
1199  window.addEventListener('resize', function() {
1200    clearTimeout(onResize._t);
1201    onResize._t = setTimeout(onResize, 150);
1202  });
1203})();
1204</script>
1204
1205
1206
1207</div></section></main><footer class="site-footer" data-astro-cid-jo6i4kqk><div class="footer-inner" data-astro-cid-jo6i4kqk><div class="footer-brand" data-astro-cid-jo6i4kqk><a href="/" class="logo" aria-label="PharmaGuide home" data-astro-cid-jo6i4kqk><img src="/assets/logos/pharmaguide.svg" alt="PharmaGuide" width="231" height="23" data-astro-cid-jo6i4kqk></a><div class="socials" data-astro-cid-jo6i4kqk><a href="https://ca.linkedin.com/company/pharmaguide-inc" target="_blank" rel="noopener" aria-label="LinkedIn" data-social="linkedin" data-astro-cid-jo6i4kqk><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false"><!-- Font Awesome Free 6.7.2 brand icon, CC BY 4.0 (fontawesome.com/license/free) - rescaled onto a 24x24 grid --><g transform="translate(1.5 0) scale(0.0469)"><path d="M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"/></g></svg>
1208</a><a href="https://www.facebook.com/Pharmaguiderx/" target="_blank" rel="noopener" aria-label="Facebook" data-social="facebook" data-astro-cid-jo6i4kqk><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false"><!-- Font Awesome Free 6.7.2 brand icon, CC BY 4.0 (fontawesome.com/license/free) - rescaled onto a 24x24 grid --><g transform="translate(4.5 0) scale(0.0469)"><path d="M80 299.3V512H196V299.3h86.5l18-97.8H196V166.9c0-51.7 20.3-71.5 72.7-71.5c16.3 0 29.4 .4 37 1.2V7.9C291.4 4 256.4 0 236.2 0C129.3 0 80 50.5 80 159.4v42.1H14v97.8H80z"/></g></svg>
1209</a><a href="https://x.com/PharmaGuideRX" target="_blank" rel="noopener" aria-label="X" data-social="x" data-astro-cid-jo6i4kqk><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false"><!-- Font Awesome Free 6.7.2 brand icon, CC BY 4.0 (fontawesome.com/license/free) - rescaled onto a 24x24 grid --><g transform="translate(0 0) scale(0.0469)"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></g></svg>
1210</a><a href="https://www.instagram.com/pharmaguide_inc/?hl=en" target="_blank" rel="noopener" aria-label="Instagram" data-social="instagram" data-astro-cid-jo6i4kqk><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false"><!-- Font Awesome Free 6.7.2 brand icon, CC BY 4.0 (fontawesome.com/license/free) - rescaled onto a 24x24 grid --><g transform="translate(1.5 0) scale(0.0469)"><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></g></svg>
1211</a></div></div><div class="footer-col" data-astro-cid-jo6i4kqk><h3 data-astro-cid-jo6i4kqk>Products</h3><ul data-astro-cid-jo6i4kqk><li data-astro-cid-jo6i4kqk><a href="/pharmacies/" data-astro-cid-jo6i4kqk>Pharmacies</a></li><li data-astro-cid-jo6i4kqk><a href="/enterprise/" data-astro-cid-jo6i4kqk>Enterprise</a></li><li data-astro-cid-jo6i4kqk><a href="/manufacturers/" data-astro-cid-jo6i4kqk>Manufacturers</a></li><li data-astro-cid-jo6i4kqk><a href="/institutions/" data-astro-cid-jo6i4kqk>Institutions</a></li><li data-astro-cid-jo6i4kqk><a href="/services/" data-astro-cid-jo6i4kqk>Services</a></li></ul></div><div class="footer-col" data-astro-cid-jo6i4kqk><h3 data-astro-cid-jo6i4kqk>Resources</h3><ul data-astro-cid-jo6i4kqk><li data-astro-cid-jo6i4kqk><a href="/support/" data-astro-cid-jo6i4kqk>Support</a></li><li data-astro-cid-jo6i4kqk><a href="/blog/" data-astro-cid-jo6i4kqk>Blog</a></li><li data-astro-cid-jo6i4kqk><a href="/terms-of-service/" data-astro-cid-jo6i4kqk>Terms Of Service</a></li><li data-astro-cid-jo6i4kqk><a href="/privacy-policy/" data-astro-cid-jo6i4kqk>Privacy Policy</a></li><li data-astro-cid-jo6i4kqk><a href="/faqs/" data-astro-cid-jo6i4kqk>FAQs</a></li><li data-astro-cid-jo6i4kqk><a href="/security/" data-astro-cid-jo6i4kqk>Security</a></li></ul></div><div class="footer-col footer-contact" data-astro-cid-jo6i4kqk><h3 data-astro-cid-jo6i4kqk>Contact Us</h3><p data-astro-cid-jo6i4kqk>Email: <a href="mailto:[email protected]" data-astro-cid-jo6i4kqk>[email protected]</a></p><p data-astro-cid-jo6i4kqk>Address: 14-44 East Beaver Creek Road, Richmond Hill, ON L4B 1G8</p><p class="fine" data-astro-cid-jo6i4kqk>For general queries, including partnership opportunities, please email [email protected]</p></div><div class="footer-form" data-astro-cid-jo6i4kqk><h3 data-astro-cid-jo6i4kqk>Book Your Demo Today or Get In Touch with Us</h3><form action='/thank-you/' data-astro-cid-vekgkm42 method='POST' name='contact'><input type="hidden" name="form-name" value="contact" data-astro-cid-vekgkm42><p class="hidden-field" aria-hidden="true" data-astro-cid-vekgkm42><label data-astro-cid-vekgkm42>Don't fill this out if you're human: <input name="bot-field" tabindex="-1" autocomplete="off" data-astro-cid-vekgkm42></label></p><div class="row" data-astro-cid-vekgkm42><label data-astro-cid-vekgkm42>First name *<input type="text" name="first-name" required autocomplete="given-name" data-astro-cid-vekgkm42></label><label data-astro-cid-vekgkm42>Last name *<input type="text" name="last-name" required autocomplete="family-name" data-astro-cid-vekgkm42></label></div><div class="row" data-astro-cid-vekgkm42><label data-astro-cid-vekgkm42>Email *<input type="email" name="email" required autocomplete="email" data-astro-cid-vekgkm42></label><label data-astro-cid-vekgkm42>Phone *<input type="tel" name="phone" required autocomplete="tel" data-astro-cid-vekgkm42></label></div><label data-astro-cid-vekgkm42>
1211Company name *<input type="text" name="company" required autocomplete="organization" data-astro-cid-vekgkm42></label><label data-astro-cid-vekgkm42>Message<textarea name="message" rows="4" data-astro-cid-vekgkm42></textarea></label><button type="submit" class="btn btn--primary" data-astro-cid-vekgkm42>Submit</button></form></div></div><div class="footer-bottom" data-astro-cid-jo6i4kqk><p data-astro-cid-jo6i4kqk>© 2026 by PharmaGuide. Powered and secured by PharmaGuide ·<a class="admin-login" href="/.netlify/functions/google-login" data-astro-cid-jo6i4kqk>Admin login</a></p></div></footer><dialog id="book-demo-modal" aria-label="Book a demo" data-astro-cid-semmgw3n><button type="button" class="bdm-close" aria-label="Close" data-astro-cid-semmgw3n>&times;</button><div class="bdm-loading" role="status" data-astro-cid-semmgw3n><span class="bdm-spinner" data-astro-cid-semmgw3n></span><span data-astro-cid-semmgw3n>Loading available times…</span></div><iframe title="Book a demo — pick a time" data-src="https://calendar.google.com/calendar/appointments/schedules/AcZssZ2_hEFlAn7hqCDFW_WPXyzbys4piGcSUuxS_JSGEVAzJCQKTNMTL3te6_S1rSHeA_-yrFJb4GNQ?gv=true" data-astro-cid-semmgw3n></iframe></dialog>
1211<script>
1212  (() => {
1213    const dialog = document.getElementById('book-demo-modal');
1214    if (!dialog || typeof dialog.showModal !== 'function') return;
1215    const iframe = dialog.querySelector('iframe');
1216    const root = document.documentElement;
1217
1218    // Swap the spinner for the calendar the moment the embed paints.
1219    iframe.addEventListener('load', () => dialog.setAttribute('data-loaded', ''));
1220
1221    document.addEventListener('click', (e) => {
1222      const a = e.target instanceof Element ? e.target.closest('a') : null;
1223      if (!a) return;
1224      const href = a.getAttribute('href') || '';
1225      const isBooking =
1226        href === '#book-demo' ||
1227        /calendar\.google\.com\/calendar(\/u\/\d+)?\/appointments/.test(a.href || '');
1228      if (!isBooking) return;
1229      e.preventDefault();
1230      if (!iframe.src) iframe.src = iframe.dataset.src;
1231      dialog.showModal();
1232
1233      // The page still scrolls behind an open <dialog>; freeze it, padding out
1234      // the width the scrollbar leaves behind so the content doesn't jump.
1235      const gutter = window.innerWidth - root.clientWidth;
1236      root.style.overflow = 'hidden';
1237      if (gutter > 0) root.style.paddingRight = `${gutter}px`;
1238    });
1239
1240    dialog.querySelector('.bdm-close').addEventListener('click', () => dialog.close());
1241    dialog.addEventListener('click', (e) => {
1242      // native <dialog>: a click on the backdrop targets the dialog itself
1243      if (e.target === dialog) dialog.close();
1244    });
1245    // fires for the close button, the backdrop, and Esc
1246    dialog.addEventListener('close', () => {
1247      root.style.overflow = '';
1248      root.style.paddingRight = '';
1249    });
1250  })();
1251</script>
1251<script>(function(){const appId = "klc1sn1m";
1252
1253      window.intercomSettings = {
1254        api_base: 'https://api-iam.intercom.io',
1255        app_id: appId,
1256      };
1257
1258      /* Intercom's own loader, unchanged apart from taking the app ID from the settings
1259         object above instead of a hard-coded URL. It defers the script until load so the
1260         messenger never competes with first paint. */
1261      (function () {
1262        var w = window;
1263        var ic = w.Intercom;
1264        if (typeof ic === 'function') {
1265          ic('reattach_activator');
1266          ic('update', w.intercomSettings);
1267        } else {
1268          var d = document;
1269          var i = function () {
1270            i.c(arguments);
1271          };
1272          i.q = [];
1273          i.c = function (args) {
1274            i.q.push(args);
1275          };
1276          w.Intercom = i;
1277          var l = function () {
1278            var s = d.createElement('script');
1279            s.type = 'text/javascript';
1280            s.async = true;
1281            s.src = 'https://widget.intercom.io/widget/' + appId;
1282            var x = d.getElementsByTagName('script')[0];
1283            x.parentNode.insertBefore(s, x);
1284          };
1285          if (document.readyState === 'complete') {
1286            l();
1287          } else if (w.attachEvent) {
1288            w.attachEvent('onload', l);
1289          } else {
1290            w.addEventListener('load', l, false);
1291          }
1292        }
1293      })();
1294    })();</script>
1294<style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
1294<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event("astro:only"));})();</script>
1294<script>(()=>{var g=Object.defineProperty;var w=(a,s,c)=>s in a?g(a,s,{enumerable:!0,configurable:!0,writable:!0,value:c}):a[s]=c;var l=(a,s,c)=>w(a,typeof s!="symbol"?s+"":s,c);var E=new Set(["__proto__","constructor","prototype"]);{let a={0:t=>y(t),1:t=>c(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(c(t)),5:t=>new Set(c(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>Number.POSITIVE_INFINITY*t},s=t=>{let[p,e]=t;return p in a?a[p](e):void 0},c=t=>t.map(s),y=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([p,e])=>[p,s(e)]));class f extends HTMLElement{constructor(){super(...arguments);l(this,"Component");l(this,"hydrator");l(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let r=this.querySelectorAll("astro-slot"),n={},d=this.querySelectorAll("template[data-astro-template]");for(let o of d){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of r){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(n[o.getAttribute("name")||"default"]=o.innerHTML)}let u;try{u=this.hasAttribute("props")?y(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(i+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${i}`,this.getAttribute("props"),o),o}let h;await this.hydrator(this)(this.Component,u,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});l(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),r.disconnect(),this.childrenConnectedCallback()},r=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});r.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}getRetryImportUrl(e){let r=new URL(e,document.baseURI);return r.searchParams.set("astro-retry",Date.now().toString()),r.toString()}async importWithRetry(e){try{return await import(e)}catch(r){return await new Promise(n=>setTimeout(n,1e3)),import(this.getRetryImportUrl(e))}}handleHydrationError(e){let r=this.getAttribute("component-url"),n=new CustomEvent("astro:hydration-error",{cancelable:!0,bubbles:!0,composed:!0,detail:{error:e,componentUrl:r}});this.dispatchEvent(n)&&console.error(`[astro-island] Error hydrating ${r}`,e)}async start(){let e=JSON.parse(this.getAttribute("opts")),r=this.getAttribute("client");if(Astro[r]===void 0){window.addEventListener(`astro:${r}`,()=>this.start(),{once:!0});return}try{await Astro[r](async()=>{let n=this.getAttribute("renderer-url");try{let[d,{default:u}]=await Promise.all([this.importWithRetry(this.getAttribute("component-url")),n?this.importWithRetry(n):Promise.resolve({default:()=>()=>{}})]),h=this.getAttribute("component-export")||"default";if(h.includes(".")){this.Component=d;for(let m of h.split(".")){if(E.has(m)||!this.Component||typeof this.Component!="object"&&typeof this.Component!="function"||!Object.hasOwn(this.Component,m))throw new Error(`Invalid component export path: ${h}`);this.Component=this.Component[m]}}else{if(E.has(h))throw new Error(`Invalid component export path: ${h}`);this.Component=d[h]}return this.hydrator=u,this.hydrate}catch(d){return this.handleHydrationError(d),()=>{}}},e,this)}catch(n){this.handleHydrationError(n)}}attributeChangedCallback(){this.hydrate()}}l(f,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",f)}})();</script>
1294<astro-island uid="Z1Nis0J" component-url="/_astro/FeedbackIsland.BBGB6Kah.js" component-export="default" renderer-url="/_astro/client.DqjIEBWi.js" props="{}" ssr client="only" opts="{&quot;name&quot;:&quot;FeedbackIsland&quot;,&quot;value&quot;:&quot;vue&quot;}"></astro-island><div id="admin-bar" hidden><span id="admin-bar-user"></span><a href="/admin/">Edit content</a><a href="https://app.netlify.com/projects/pg-website-862" target="_blank" rel="noopener">Netlify</a><a href="/.netlify/functions/logout">Log out</a></div>
1294<script type="module">document.cookie.includes(`pg_admin_hint=1`)&&fetch(`/.netlify/functions/me`).then(async e=>{if(!e.ok)return;let t=await e.json(),n=document.getElementById(`admin-bar`),r=document.getElementById(`admin-bar-user`);n&&r&&(r.textContent=`Admin · ${t.email}`,n.hidden=!1)}).catch(()=>{});</script>
1294<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"8a974beadf3b4eb0a3549a0f217e96be","spa":2}' crossorigin="anonymous"></script>
1294
1295</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.