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 & 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 & 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 & 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 & 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'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’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 & 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 & 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>×</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="{"name":"FeedbackIsland","value":"vue"}"></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.