1<!DOCTYPE html> 2<html lang="en-GB"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' /> 7 8 <!-- This site is optimized with the Yoast SEO plugin v28.5 - https://yoast.com/product/yoast-seo-wordpress/ --> 9 <title>PaxFlow | TravelTech Tools to Streamline Tour Operations</title> 10 <meta name="description" content="Streamline your tour operations with PaxFlowâs TravelTech tools for automation, AI, & self-service. Save time, reduce manual tasks, grow faster. Learn more" /> 11 <link rel="canonical" href="https://paxflow.io/" /> 12 <meta property="og:locale" content="en_GB" /> 13 <meta property="og:type" content="website" /> 14 <meta property="og:title" content="PaxFlow | TravelTech Tools to Streamline Tour Operations" /> 15 <meta property="og:description" content="Streamline your tour operations with PaxFlowâs TravelTech tools for automation, AI, & self-service. Save time, reduce manual tasks, grow faster. Learn more" /> 16 <meta property="og:url" content="https://paxflow.io/" /> 17 <meta property="og:site_name" content="PaxFlow" /> 18 <meta property="article:modified_time" content="2026-06-19T17:07:13+00:00" /> 19 <meta name="twitter:card" content="summary_large_image" /> 20
20<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/paxflow.io\/","url":"https:\/\/paxflow.io\/","name":"PaxFlow | TravelTech Tools to Streamline Tour Operations","isPartOf":{"@id":"https:\/\/paxflow.io\/#website"},"about":{"@id":"https:\/\/paxflow.io\/#organization"},"datePublished":"2026-06-01T13:51:18+00:00","dateModified":"2026-06-19T17:07:13+00:00","description":"Streamline your tour operations with PaxFlowâs TravelTech tools for automation, AI, & self-service. Save time, reduce manual tasks, grow faster. Learn more","breadcrumb":{"@id":"https:\/\/paxflow.io\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/paxflow.io\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/paxflow.io\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home"}]},{"@type":"WebSite","@id":"https:\/\/paxflow.io\/#website","url":"https:\/\/paxflow.io\/","name":"PaxFlow","description":"Streamline Tour Operations with Ease","publisher":{"@id":"https:\/\/paxflow.io\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/paxflow.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/paxflow.io\/#organization","name":"PaxFlow","url":"https:\/\/paxflow.io\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/paxflow.io\/#\/schema\/logo\/image\/","url":"https:\/\/paxflow.io\/wp-content\/uploads\/2026\/06\/cropped-PaxFlow-logo-original-landscape.png","contentUrl":"https:\/\/paxflow.io\/wp-content\/uploads\/2026\/06\/cropped-PaxFlow-logo-original-landscape.png","width":280,"height":80,"caption":"PaxFlow"},"image":{"@id":"https:\/\/paxflow.io\/#\/schema\/logo\/image\/"}}]}</script>
20 21 <!-- / Yoast SEO plugin. --> 22 23 24<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://paxflow.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fpaxflow.io%2F" /> 25<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://paxflow.io/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fpaxflow.io%2F&format=xml" /> 26<style id="wp-img-auto-sizes-contain-inline-css"> 27img:is([sizes=auto i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px} 28/*# sourceURL=wp-img-auto-sizes-contain-inline-css */ 29</style> 30<style id="wp-emoji-styles-inline-css"> 31 32 img.wp-smiley, img.emoji { 33 display: inline !important; 34 border: none !important; 35 box-shadow: none !important; 36 height: 1em !important; 37 width: 1em !important; 38 margin: 0 0.07em !important; 39 vertical-align: -0.1em !important; 40 background: none !important; 41 padding: 0 !important; 42 } 43/*# sourceURL=wp-emoji-styles-inline-css */ 44</style> 45<style id="wp-block-library-inline-css"> 46:root{--wp-block-synced-color:#7a00df;--wp-block-synced-color--rgb:122,0,223;--wp-bound-block-color:var(--wp-block-synced-color);--wp-editor-canvas-background:#ddd;--wp-admin-theme-color:#007cba;--wp-admin-theme-color--rgb:0,124,186;--wp-admin-theme-color-darker-10:#006ba1;--wp-admin-theme-color-darker-10--rgb:0,107,160.5;--wp-admin-theme-color-darker-20:#005a87;--wp-admin-theme-color-darker-20--rgb:0,90,135;--wp-admin-border-width-focus:2px}@media (min-resolution:192dpi){:root{--wp-admin-border-width-focus:1.5px}}.wp-element-button{cursor:pointer}:root .has-very-light-gray-background-color{background-color:#eee}:root .has-very-dark-gray-background-color{background-color:#313131}:root .has-very-light-gray-color{color:#eee}:root .has-very-dark-gray-color{color:#313131}:root .has-vivid-green-cyan-to-vivid-cyan-blue-gradient-background{background:linear-gradient(135deg,#00d084,#0693e3)}:root .has-purple-crush-gradient-background{background:linear-gradient(135deg,#34e2e4,#4721fb 50%,#ab1dfe)}:root .has-hazy-dawn-gradient-background{background:linear-gradient(135deg,#faaca8,#dad0ec)}:root .has-subdued-olive-gradient-background{background:linear-gradient(135deg,#fafae1,#67a671)}:root .has-atomic-cream-gradient-background{background:linear-gradient(135deg,#fdd79a,#004a59)}:root .has-nightshade-gradient-background{background:linear-gradient(135deg,#330968,#31cdcf)}:root .has-midnight-gradient-background{background:linear-gradient(135deg,#020381,#2874fc)}:root{--wp--preset--font-size--normal:16px;
46--wp--preset--font-size--huge:42px}.has-regular-font-size{font-size:1em}.has-larger-font-size{font-size:2.625em}.has-normal-font-size{font-size:var(--wp--preset--font-size--normal)}.has-huge-font-size{font-size:var(--wp--preset--font-size--huge)}:root .has-text-align-center{text-align:center}:root .has-text-align-left{text-align:left}:root .has-text-align-right{text-align:right}.has-fit-text{white-space:nowrap!important}#end-resizable-editor-section{display:none}.aligncenter{clear:both}.items-justified-left{justify-content:flex-start}.items-justified-center{justify-content:center}.items-justified-right{justify-content:flex-end}.items-justified-space-between{justify-content:space-between}.screen-reader-text{word-wrap:normal!important;border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-break:normal!important}.screen-reader-text:focus{background-color:#ddd;clip-path:none;color:#444;display:block;font-size:1em;height:auto;left:5px;line-height:normal;padding:15px 23px 14px;text-decoration:none;top:5px;width:auto;z-index:100000}html :where(.has-border-color){border-style:solid}html :where([style^=border-color],[style*=";border-color"],[style*="; border-color"]){border-style:solid}html :where([style^=border-top-color],[style*=";border-top-color"],[style*="; border-top-color"]){border-top-style:solid}html :where([style^=border-right-color],[style*=";border-right-color"],[style*="; border-right-color"]){border-right-style:solid}html :where([style^=border-bottom-color],[style*=";border-bottom-color"],[style*="; border-bottom-color"]){border-bottom-style:solid}html :where([style^=border-left-color],[style*=";border-left-color"],[style*="; border-left-color"]){border-left-style:solid}html :where([style^=border-width],[style*=";border-width"],[style*="; border-width"]){border-style:solid}html :where([style^=border-top-width],[style*=";border-top-width"],[style*="; border-top-width"]){border-top-style:solid}html :where([style^=border-right-width],[style*=";border-right-width"],[style*="; border-right-width"]){border-right-style:solid}html :where([style^=border-bottom-width],[style*=";border-bottom-width"],[style*="; border-bottom-width"]){border-bottom-style:solid}html :where([style^=border-left-width],[style*=";border-left-width"],[style*="; border-left-width"]){border-left-style:solid}html :where(img[class*=wp-image-]){height:auto;max-width:100%}:where(figure){margin:0 0 1em}html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:var(--wp-admin--admin-bar--height,0px)}@media screen and (max-width:600px){html :where(.is-position-sticky){--wp-admin--admin-bar--position-offset:0px}} 47 48/*# sourceURL=/wp-includes/css/dist/block-library/common.min.css */ 49</style> 50<style id="classic-theme-styles-inline-css"> 51/*! This file is auto-generated */ 52.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none} 53/*# sourceURL=/wp-includes/css/classic-themes.min.css */ 54</style> 55 56<style id="global-styles-inline-css"> 57:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgb(6,147,227) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgb(252,185,
570) 0%,rgb(255,105,0) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgb(255,105,0) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgb(255, 255, 255), 6px 6px rgb(0, 0, 0);--wp--preset--shadow--crisp: 6px 6px 0px rgb(0, 0, 0);}.wp-block-button{--wp--preset--dimension--25: 25%;--wp--preset--dimension--50: 50%;--wp--preset--dimension--75: 75%;--wp--preset--dimension--100: 100%;}:where(body) { margin: 0; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;font-style: inherit;font-weight: inherit;letter-spacing: inherit;line-height: inherit;padding-top: calc(0.667em + 2px);padding-right: calc(1.333em + 2px);padding-bottom: calc(0.667em + 2px);padding-left: calc(1.333em + 2px);text-decoration: none;text-transform: inherit;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}
57.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;} 58/*# sourceURL=global-styles-inline-css */ 59</style> 60 61<link rel='stylesheet' id='paxflow-page-blocks-css' href='https://paxflow.io/wp-content/plugins/paxflow-page-blocks/assets/paxflow-page-blocks.css?ver=1.1.0' media='all' /> 62<link rel='stylesheet' id='paxflow-figma-index-DI-05Qc7.css-css' href='https://paxflow.io/wp-content/themes/paxflow-chris-theme-mobile-fixed/dist/assets/index-DI-05Qc7.css?ver=1781892046' media='all' /> 63<style id="kadence-blocks-global-variables-inline-css"> 64:root {--global-kb-font-size-sm:clamp(0.8rem, 0.73rem + 0.217vw, 0.9rem);--global-kb-font-size-md:clamp(1.1rem, 0.995rem + 0.326vw, 1.25rem);--global-kb-font-size-lg:clamp(1.75rem, 1.576rem + 0.543vw, 2rem);--global-kb-font-size-xl:clamp(2.25rem, 1.728rem + 1.63vw, 3rem);--global-kb-font-size-xxl:clamp(2.5rem, 1.456rem + 3.26vw, 4rem);--global-kb-font-size-xxxl:clamp(2.75rem, 0.489rem + 7.065vw, 6rem);}:root {--global-palette1: #3182CE;--global-palette2: #2B6CB0;--global-palette3: #1A202C;--global-palette4: #2D3748;--global-palette5: #4A5568;--global-palette6: #718096;--global-palette7: #EDF2F7;--global-palette8: #F7FAFC;--global-palette9: #ffffff;} 65/*# sourceURL=kadence-blocks-global-variables-inline-css */ 66</style> 67<style id="paxflow-vce-v5-style-inline-css"> 68#paxflow-vce-toolbar { 69 position: fixed; 70 right: 18px; 71 bottom: 18px; 72 z-index: 99999999; 73 display: flex; 74 gap: 8px; 75 align-items: center; 76 font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 77} 78#paxflow-vce-toolbar button { 79 border: 0; 80 border-radius: 12px; 81 padding: 12px 14px; 82 font-weight: 800; 83 cursor: pointer; 84 box-shadow: 0 12px 30px rgba(15,23,42,.18); 85} 86#paxflow-vce-edit-toggle { background: #8b16ff; color: #fff; } 87#paxflow-vce-apply { background: #111827; color: #fff; } 88#paxflow-vce-clear { background: #fff; color: #111827; border: 1px solid #e5e7eb !important; } 89.paxflow-vce-active [data-paxflow-vce-editable="1"] { cursor: pointer !important; } 90.paxflow-vce-active [data-paxflow-vce-editable="1"]:hover { outline: 3px solid #9b20ff !important; outline-offset: 3px !important; } 91.paxflow-vce-selected { outline: 4px solid #9b20ff !important; outline-offset: 4px !important; } 92#paxflow-vce-modal-backdrop { 93 position: fixed; 94 inset: 0; 95 z-index: 99999998; 96 display: none; 97 align-items: center; 98 justify-content: center; 99 background: rgba(17, 24, 39, .62); 100 padding: 20px; 101 font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 102} 103#paxflow-vce-modal-backdrop.is-open { display: flex; } 104#paxflow-vce-modal { 105 width: min(620px, 100%); 106 background: #fff; 107 border-radius: 18px; 108 box-shadow: 0 30px 80px rgba(0,0,0,.24); 109 padding: 22px; 110 color: #111827; 111} 112#paxflow-vce-modal h3 { margin: 0 0 16px; font-size: 20px; } 113#paxflow-vce-modal label { display: block; margin: 12px 0 6px; font-size: 13px; font-weight: 800; color: #374151; } 114#paxflow-vce-modal input, #paxflow-vce-modal textarea, #paxflow-vce-modal select { 115 width: 100%; 116 box-sizing: border-box; 117 border: 1px solid #d1d5db; 118 border-radius: 10px; 119 padding: 11px 12px; 120 font: inherit; 121} 122#paxflow-vce-modal textarea { min-height: 110px; resize: vertical; } 123#paxflow-vce-selector { font-size: 12px !important; color: #6b7280; } 124.paxflow-vce-help { font-size: 12px; color: #6b7280; margin-top: 6px; line-height: 1.4; } 125.paxflow-vce-row { display: grid; grid-template-columns: 1fr; gap: 10px; } 126.paxflow-vce-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; } 127.paxflow-vce-actions button { border: 0; border-radius: 10px; padding: 11px 14px; font-weight: 800; cursor: pointer; } 128#paxflow-vce-cancel { background: #f3f4f6; color: #111827; } 129#paxflow-vce-save { background: #8b16ff; color: #fff; }
130/*# sourceURL=paxflow-vce-v5-style-inline-css */ 131</style> 132<link rel="https://api.w.org/" href="https://paxflow.io/wp-json/" /><link rel="alternate" title="JSON" type="application/json" href="https://paxflow.io/wp-json/wp/v2/pages/27" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://paxflow.io/xmlrpc.php?rsd" /> 133<link rel='shortlink' href='https://paxflow.io/' /> 134<!-- Google Tag Manager -->
135<script>
vendor: 331 bytes, lines 135-139
135(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 136new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 137j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 138'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 139})(window,document,'script','dataLayer','
139GTM-5LKB4KP
vendor: 3 bytes, line 139
139');
139</script>
139 140<!-- End Google Tag Manager --><style class="wpcode-css-snippet">.whitespace-nowrap { 141 white-space: nowrap !important; 142} 143 144.inline-block { 145 display: inline-block !important; 146}</style> <style id="paxflow-site-ext-shared-footer-css"> 147 .pf-react-footer { 148 border-top: 1px solid #e5e7eb; 149 padding: 80px 48px; 150 background: #ffffff; 151 } 152 .pf-react-footer-inner { max-width: 1440px; margin: 0 auto; } 153 .pf-react-footer-main { 154 display: grid; 155 grid-template-columns: repeat(5, minmax(0, 1fr)); 156 gap: 48px; 157 margin-bottom: 80px; 158 } 159 .pf-react-footer-brand { grid-column: span 2; } 160 .pf-react-footer-logo { 161 display: inline-flex; 162 align-items: center; 163 margin-bottom: 24px; 164 text-decoration: none; 165 } 166 .pf-react-footer-logo img { 167 display: block; 168 height: 40px; 169 width: auto; 170 max-width: 180px; 171 object-fit: contain; 172 } 173 .pf-react-footer-logo span { 174 color: #111827; 175 font-size: 28px; 176 font-weight: 800; 177 letter-spacing: -0.04em; 178 } 179 .pf-react-footer-brand p { 180 max-width: 320px; 181 margin: 0; 182 color: #4b5563; 183 font-size: 15px; 184 line-height: 1.65; 185 } 186 .pf-react-footer-socials { 187 display: flex; 188 align-items: center; 189 gap: 16px; 190 margin-top: 24px; 191 } 192 .pf-react-footer-socials a { 193 width: 40px; 194 height: 40px; 195 border-radius: 10px; 196 background: #f3f4f6; 197 display: flex; 198 align-items: center; 199 justify-content: center; 200 color: #374151; 201 transition: background 0.2s ease; 202 } 203 .pf-react-footer-socials a:hover { background: #e5e7eb; } 204 .pf-react-footer-socials svg { width: 20px; height: 20px; fill: currentColor; } 205 .pf-react-footer-links { 206 grid-column: span 3; 207 display: grid; 208 grid-template-columns: repeat(4, minmax(0, 1fr)); 209 gap: 32px; 210 } 211 .pf-react-footer-links a { 212 display: block; 213 color: #4b5563; 214 font-size: 15px; 215 line-height: 1.4; 216 text-decoration: none; 217 margin-bottom: 16px; 218 } 219 .pf-react-footer-links a:hover { color: #111827; } 220 .pf-react-footer-bottom { 221 padding-top: 40px; 222 border-top: 1px solid #e5e7eb; 223 color: #4b5563; 224 font-size: 14px; 225 } 226 .pf-react-footer-bottom p { margin: 0; } 227 @media (max-width: 768px) { 228 .pf-react-footer { padding: 56px 20px; } 229 .pf-react-footer-main { 230 grid-template-columns: 1fr; 231 gap: 40px; 232 margin-bottom: 56px; 233 } 234 .pf-react-footer-brand, 235 .pf-react-footer-links { grid-column: auto; } 236 .pf-react-footer-links { 237 grid-template-columns: repeat(2, minmax(0, 1fr)); 238 gap: 20px 28px; 239 } 240 } 241 </style> 242 <link rel="icon" href="https://paxflow.io/wp-content/uploads/2026/08/cropped-PaxFlow-Favicon-1-32x32.png" sizes="32x32" /> 243<link rel="icon" href="https://paxflow.io/wp-content/uploads/2026/08/cropped-PaxFlow-Favicon-1-192x192.png" sizes="192x192" /> 244<link rel="apple-touch-icon" href="https://paxflow.io/wp-content/uploads/2026/08/cropped-PaxFlow-Favicon-1-180x180.png" /> 245<meta name="msapplication-TileImage" content="https://paxflow.io/wp-content/uploads/2026/08/cropped-PaxFlow-Favicon-1-270x270.png" /> 246<style id="wp-custom-css"> 247@media (max-width: 768px) { 248 #root section[class*="pt-40"] { 249 padding-top: 0px !important; 250 } 251 252 #root section[class*="px-12"] { 253 padding-left: 20px !important; 254 padding-right: 20px !important; 255 } 256 257 #root section[class*="pb-32"] { 258 padding-bottom: 48px !important; 259 } 260 261 #root [class*="col-span-12"], 262 #root [class*="lg:col-span-6"], 263 #root [class*="space-y-10"], 264 #root [class*="space-y-6"] { 265 width: 100% !important; 266 max-width: 100% !important; 267 margin-left: 0 !important; 268 margin-right: 0 !important; 269 box-sizing: border-box !important; 270 } 271} 272 273</style> 274 <style> 275 @media (max-width: 768px) { 276 /* 277 * Fix Figma/Tailwind hero section mobile spacing. 278 * pt-40 = huge top gap, px-12 = excessive side padding. 279 */ 280 #root section[class*="pt-40"], 281 #root section[class*="px-12"], 282 #root section[class*="overflow-hidden"] { 283 padding-top: 24px !important; 284 padding-left: 24px !important; 285 padding-right: 24px !important; 286 overflow-x: hidden !important; 287 box-sizing: border-box !important; 288 } 289 290 /* 291 * Fix inner hero/grid columns being wider than viewport. 292 */ 293 #root [class*="col-span-12"], 294 #root [class*="lg:col-span-6"], 295 #root [class*="space-y-10"], 296 #root [class*="space-y-6"] { 297 width: 100% !important; 298 max-width: 100% !important; 299 margin-left: 0 !important; 300 margin-right: 0 !important; 301 box-sizing: border-box !important; 302 } 303 304 /* 305 * Keep headings readable and wrapped on mobile. 306 */ 307 #root h1, 308 #root h1 span, 309 #root h2, 310 #root h2 span { 311 max-width: 100% !important; 312 white-space: normal !important; 313 overflow-wrap: break-word !important; 314 word-break: normal !important; 315 } 316 317 #root h1 { 318 font-size: clamp(38px, 10vw, 48px) !important; 319 line-height: 1.08 !important; 320 } 321 322 /* 323 * Make hero media/cards fit inside mobile viewport. 324 */ 325 #root img, 326 #root video, 327 #root iframe, 328 #root picture, 329 #root canvas, 330 #root svg { 331 max-width: 100% !important; 332 height: auto !important; 333 object-fit: contain !important; 334 } 335 } 336 </style> 337 <style> 338 /* 339 * Desktop/tablet: restore normal React/Figma pricing table behaviour. 340 */ 341 @media (min-width: 769px) { 342 #root table { 343 width: 100% !important; 344 min-width: 0 !important; 345 max-width: 100% !important; 346 table-layout: auto !important; 347 } 348 349 #root table th, 350 #root table td { 351 width: auto !important; 352 min-width: 0 !important; 353 max-width: none !important; 354 position: static !important; 355 transform: none !important; 356 } 357 358 #root div:has(> table) { 359 overflow-x: visible !important; 360 width: 100% !important; 361 max-width: 100% !important; 362 } 363 364 .paxflow-pricing-table-scroll-wrap { 365 display: contents !important; 366 } 367 } 368 369 /* 370 * Mobile only: allow the full pricing table to swipe horizontally. 371 */ 372 @media (max-width: 768px) { 373 #root section:has(table) { 374 overflow-x: visible !important; 375 } 376 377 #root div:has(> table) { 378 width: 100% !important; 379 max-width: 100% !important; 380 overflow-x: auto !important; 381 overflow-y: visible !important; 382 -webkit-overflow-scrolling: touch !important; 383 touch-action: pan-x pan-y !important; 384 } 385 386 #root div:has(> table) table { 387 width: 1040px !important; 388 min-width: 1040px !important; 389 max-width: none !important; 390 table-layout: fixed !important; 391 } 392 393 #root div:has(> table) th, 394 #root div:has(> table) td { 395 position: static !important; 396 left: auto !important; 397 right: auto !important; 398 transform: none !important; 399 overflow: visible !important; 400 white-space: normal !important; 401 box-sizing: border-box !important; 402 } 403 404 #root div:has(> table) th:first-child, 405 #root div:has(> table) td:first-child { 406 width: 360px !important; 407 min-width: 360px !important; 408 max-width: 360px !important; 409 } 410 411 #root div:has(> table) th:not(:first-child), 412 #root div:has(> table) td:not(:first-child) { 413 width: 170px !important; 414 min-width: 170px !important; 415 max-width: 170px !important; 416 text-align: center !important; 417 } 418 419 .paxflow-pricing-table-scroll-wrap { 420 display: contents !important; 421 } 422 } 423 </style> 424 <style> 425 .paxflow-home-video-modal-header, 426 .paxflow-home-video-modal-header h4, 427 #paxflow-home-video-modal h4, 428 #paxflow-home-video-modal .paxflow-home-video-modal-title { 429 display: none !important; 430 visibility: hidden !important; 431 height: 0 !important; 432 margin: 0 !important; 433 padding: 0 !important; 434 border: 0 !important; 435 } 436 437 #paxflow-home-video-modal .paxflow-home-video-modal-panel { 438 background: transparent !important; 439 box-shadow: none !important; 440 overflow: visible !important; 441 } 442 443 #paxflow-home-video-modal .paxflow-home-video-modal-body { 444 padding: 0 !important; 445 margin: 0 !important; 446 } 447 448 #paxflow-home-video-modal .paxflow-home-video-frame { 449 margin: 0 !important; 450 } 451 </style> 452 </head> 453 454<body class="home wp-singular page-template-default page page-id-27 wp-custom-logo wp-theme-paxflow-chris-theme-mobile-fixed"> 455<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 455-456
455 456<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
456GTM-5LKB4KP
vendor: 85 bytes, lines 456-457
456" 457height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
458<!-- End Google Tag Manager (noscript) --> 459 460<div id="root"></div> 461 462 <header id="paxflow-wp-desktop-header"> 463 <div class="paxflow-wp-desktop-inner"> 464 <a class="paxflow-wp-desktop-logo" href="https://paxflow.io/" aria-label="PaxFlow"> 465 <img src="https://paxflow.io/wp-content/uploads/2026/06/cropped-PaxFlow-logo-original-landscape.png" alt="PaxFlow"> </a> 466 467 <nav class="paxflow-wp-desktop-nav" aria-label="Main navigation"> 468 <ul id="menu-dekstop-menu" class="paxflow-wp-desktop-menu"><li id="menu-item-41" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-41"><a href="https://paxflow.io/platform/">Platform</a></li> 469<li id="menu-item-42" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-42"><a href="https://paxflow.io/insights/">Insights</a></li> 470<li id="menu-item-10243" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-10243"><a href="https://paxflow.io/partner-with-paxflow/">Partners</a></li> 471<li id="menu-item-40" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-40"><a href="https://paxflow.io/pricing/">Pricing</a></li> 472</ul> </nav> 473 474 <div class="paxflow-wp-desktop-actions"> 475 <a class="paxflow-wp-desktop-signin" href="/sign-in"> 476 Sign in 477 </a> 478 479 <a class="paxflow-wp-desktop-demo" href="/contact"> 480 Book Demo 481 </a> 482 </div> 483 </div> 484 </header> 485 <div id="paxflow-wp-mobile-header"> 486 <div class="paxflow-wp-mobile-inner"> 487 <a class="paxflow-wp-mobile-logo" href="https://paxflow.io/" aria-label="PaxFlow"> 488 <img src="https://paxflow.io/wp-content/uploads/2026/06/cropped-PaxFlow-logo-original-landscape.png" alt="PaxFlow"> </a> 489 490 <button id="paxflow-wp-mobile-toggle" type="button" aria-label="Open menu" aria-expanded="false"> 491 <span></span> 492 <span></span> 493 <span></span> 494 </button> 495 496 <a class="paxflow-wp-mobile-cta" href="/contact"> 497 Book Demo 498 </a> 499 </div> 500 501 <div id="paxflow-wp-mobile-panel"> 502 <ul id="menu-mobile-menu" class="paxflow-wp-mobile-menu"><li id="menu-item-37" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-37"><a href="https://paxflow.io/platform/">Platform</a></li> 503<li id="menu-item-34" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-34"><a href="https://paxflow.io/insights/">Insights</a></li> 504<li id="menu-item-38" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-38"><a href="https://paxflow.io/pricing/">Pricing</a></li> 505</ul> </div> 506 </div> 507
507<script type="speculationrules"> 508{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/paxflow-chris-theme-mobile-fixed/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} 509</script>
vendor: 1 bytes, line 509
509
510<script> 511 function hideIntercomLauncher() { 512 if (typeof window.Intercom === 'function') { 513 window.Intercom('update', { hide_default_launcher: true }); 514 } else { 515 setTimeout(hideIntercomLauncher, 200); 516 } 517 } 518 519 const intercomHidePaths = [ 520 '/upgrade', 521 '/paxflow-home-screen' 522 ]; 523 524 const currentPath = window.location.pathname; 525 526 if (intercomHidePaths.some(prefix => currentPath.startsWith(prefix))) { 527 console.log('Hiding intercom bubble.'); 528 hideIntercomLauncher(); 529 } 530</script>
530<script data-cfasync="false"> 531 document.onreadystatechange = function () { 532 if (document.readyState == "complete") { 533 var logout_link = document.querySelectorAll('a[href*="wp-login.php?action=logout"]'); 534 if (logout_link) { 535 for(var i=0; i < logout_link.length; i++) { 536 logout_link[i].addEventListener( "click", function() { 537 Intercom('shutdown'); 538 }); 539 } 540 } 541 } 542 }; 543</script>
vendor: 2 bytes, line 543
543
544<script data-cfasync="false"> 545 window.intercomSettings = {"app_id":"xpm774xv","language_override":"en","installation_type":"wordpress","installation_version":"3.0.2"}; 546</script>
vendor: 2 bytes, line 546
546
547<script data-cfasync="false">(function(){var w=window;var ic=w.Intercom;if(typeof ic==="function"){ic('reattach_activator');ic('update',w.intercomSettings);}else{var d=document;var i=function(){i.c(arguments);};i.q=[];i.c=function(args){i.q.push(args);};w.Intercom=i;var l=function(){var s=d.createElement('script');s.type='text/javascript';s.async=true;s.src='https://widget.intercom.io/widget/xpm774xv';var x=d.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);};if(document.readyState==='complete'){l();}else if(w.attachEvent){w.attachEvent('onload',l);}else{w.addEventListener('load',l,false);}}})()</script>
547<script type="module" src="https://paxflow.io/wp-content/themes/paxflow-chris-theme-mobile-fixed/dist/assets/index-DF8F96qp.js?ver=1787221794"></script>
547<script id="paxflow-vce-v5-js-before"> 548window.PaxFlowVCEv5Data = {"canEdit":false,"ajaxUrl":"https:\/\/paxflow.io\/wp-admin\/admin-ajax.php","nonce":"e0bc714704","liveEdits":[{"id":"pfvce_1781194694226_77ddbc5a4a93b8","page":"\/contact","selector":"#root > div > div > section:nth-of-type(2) > div > div:nth-of-type(2) > div:nth-of-type(1) > h3","type":"text","text":"15-minute call","href":"","media":"","alt":"","updated":1781194698},{"id":"pfvce_1781543276714_20b0e5babc2df8","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(1) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/customer-messaging\/","media":"","alt":"","updated":1781543286},{"id":"pfvce_1781544000617_a39808fda50d5","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(2) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/paxportal\/","media":"","alt":"","updated":1781544005},{"id":"pfvce_1781544254397_e90da110cb4c08","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(3) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/departure-management\/","media":"","alt":"","updated":1781544259},{"id":"pfvce_1781544699064_8eff56bfb87318","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(4) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/booking-forms\/","media":"","alt":"","updated":1781544702},{"id":"pfvce_1781545006765_2d13fffe9cc17","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(5) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/resource-management\/","media":"","alt":"","updated":1781545011},{"id":"pfvce_1781545330812_728f23b30ddd4","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(6) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/shift-scheduling\/","media":"","alt":"","updated":1781545334},{"id":"pfvce_1781545511706_2d0b562ea29f8","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(7) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/enroute-application\/","media":"","alt":"","updated":1781545526},{"id":"pfvce_1781545529869_e5b230f07cd57","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(7) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/enroute-application\/","media":"","alt":"","updated":1781545532},{"id":"pfvce_1781545672886_9ed2cd63ae2f08","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(8) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/ticket-scanning\/","media":"","alt":"","updated":1781545676},{"id":"pfvce_1781545860309_254b3a987a8448","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(9) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/ai-chatbot\/","media":"","alt":"","updated":1781545864},{"id":"pfvce_1781609221863_f95abd9426abc8","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(1) > h3","type":"text","text":"Operations management","href":"","media":"","alt":"","updated":1781609240},{"id":"pfvce_1781609242353_2d5e57cfac0cd8","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(1) > h3","type":"text","text":"Operations Management","href":"","media":"","alt":"","updated":1781609247},{"id":"pfvce_1781609249821_e2b2c95b9f9e68","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(1) > p","type":"text","text":"Intelligent scheduling and resource allocation across your entire operation covering resource management, departure management, and shift scheduling","href":"","media":"","alt":"","updated":1781609283},{"id":"pfvce_1781609348673_6450046204f75","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(2) >
548 p","type":"text","text":"Automated messaging infrastructure across all customer touchpoints, covering WhatsApp, SMS, Email, and an AI chatbot","href":"","media":"","alt":"","updated":1781609377},{"id":"pfvce_1781609439543_c4ab4b0a23615","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(4) > div:nth-of-type(2) > div:nth-of-type(2) > span","type":"text","text":"Ticket scanning","href":"","media":"","alt":"","updated":1781609448},{"id":"pfvce_1781609455263_9cfc7c77bc61b8","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(4) > div:nth-of-type(2) > div:nth-of-type(2) > span","type":"text","text":"Shift assignments","href":"","media":"","alt":"","updated":1781609468},{"id":"pfvce_1781609469768_424c7133f5477","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(4) > div:nth-of-type(2) > div:nth-of-type(3) > span","type":"text","text":"Group communications","href":"","media":"","alt":"","updated":1781609477},{"id":"pfvce_1781609491685_825ca54d984698","page":"\/","selector":"#root > div > section:nth-of-type(6) > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > div:nth-of-type(2) > span","type":"text","text":"Capacity optimisation","href":"","media":"","alt":"","updated":1781609495},{"id":"pfvce_1781609560802_11584866707788","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(1) > p","type":"text","text":"PaxFlow has provided a solution that allows us to collect necessary passenger details from customers, via booking forms on PaxPortal, to comply with EU laws for boat tours.\u201d","href":"","media":"","alt":"","updated":1781609573},{"id":"pfvce_1781609575626_7838c5f28a303","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(1) > p","type":"text","text":"PaxFlow has provided a solution that allows us to collect necessary passenger details from customers, via booking forms on PaxPortal, to comply with EU laws for boat tours.\u201d","href":"","media":"","alt":"","updated":1781609581},{"id":"pfvce_1781609583768_242b3c8626fae","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > div:nth-of-type(1)","type":"text","text":"Mick Lomers","href":"","media":"","alt":"","updated":1781609621},{"id":"pfvce_1781609622754_f6e92c99cdc048","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > div:nth-of-type(2)","type":"text","text":"Sales Manager","href":"","media":"","alt":"","updated":1781609629},{"id":"pfvce_1781609630957_7b9b749238ba3","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(2) > div:nth-of-type(3)","type":"text","text":"Brim Explorer","href":"","media":"","alt":"","updated":1781609638},{"id":"pfvce_1781609646213_5966d02790536","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(2) > p","type":"text","text":"PaxFlow greatly simplifies our operational side and connects all the systems we use for communications and bookings, whether with tourists or staff.\u201d","href":"","media":"","alt":"","updated":1781609650},{"id":"pfvce_1781609671323_81c1db9c1bba48","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(1)","type":"text","text":"Kristj\u00e1n Bj\u00f6rnsson","href":"","media":"","alt":"","updated":1781609683},{"id":"pfvce_1781609685334_2ec3a64ebae62","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(2)","type":"text","text":"Chief Commercial Officer","href":"","media":"","alt":"","updated":1781609697},{"id":"pfvce_1781609698906_bff73e261aac9","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(2) > div:nth-of-type(3)","type":"text","text":"BusTravel Iceland","href":"","media":"","alt":"","updated":1781609712},{"id":"pfvce_1781609732163_e94a25504d7bc","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(3) > p","type":"text","text":"We were able to get rid of all the spread sheets we used to have to plan our vehicles for tours and staff on shifts. PaxFlow is a critical tool in our operations today.\u201d","href":"","media":"","alt":"","updated":1781609735},{"id":"pfvce_1781609736859_ecc9c8895a8838","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(3) > div:nth-of-type(2) > div:nth-of-type(1)","type":"text","text":"Javier Fabregat","href":"","media":"","alt":"","updated":1781609754},{"id":"pfvce_1781609825527_e6e26db741c56","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(3) > div:nth-of-type(2) > div:nth-of-type(1)","type":"text","text":"Javier Zapata","href":"","media":"","alt":"","updated":1781609841},{"id":"pfvce_1781609842727_f4b51de748d5","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(3) > div:nth-of-type(2) > div:nth-of-type(2)","type":"text","text":"IT Manager","href":"","media":"","alt":"","updated":1781609847},{"id":"pfvce_1781609848067_e466968f285cb","page":"\/","selector":"#root > div > section:nth-of-type(7) > div > div:nth-of-type(2) > div:nth-of-type(3) > div:nth-of-type(2) > div:nth-of-type(3)","type":"text","text":"TA Scotland","href":"","media":"","alt":"","updated":1781609858},{"id":"pfvce_1781610402104_1473bcc8dbf8b8","page":"\/","selector":"#root > div > section:nth-of-type(9) > div > div > div:nth-of-type(2) > div > p","type":"text","text":"Schedule a personalised demo with our team to understand how PaxFlow can transform your operational infrastru
548cture.","href":"","media":"","alt":"","updated":1781610408},{"id":"pfvce_1781610421412_96a0c2ec4898b8","page":"\/insights","selector":"#root > div > div > section:nth-of-type(1) > div > h1","type":"text","text":"Learn how to optimise your tour operations","href":"","media":"","alt":"","updated":1781610427},{"id":"pfvce_1781610442679_f0aead25ee7828","page":"\/insights","selector":"#root > div > div > section:nth-of-type(1) > div > p:nth-of-type(2)","type":"text","text":"Expert guides, industry insights, and best practice tips from the PaxFlow team","href":"","media":"","alt":"","updated":1781610450},{"id":"pfvce_1781610487950_f3cc0fa8d7021","page":"\/insights","selector":"#root > div > div > section:nth-of-type(6) > div > a","type":"link","text":"Book a Demo","href":"\/contact\/","media":"","alt":"","updated":1781610495},{"id":"pfvce_1781610612828_d95289203d734","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(1)","type":"link","text":"Getting Started with PaxFlowComplete guide to setting up your account and onboarding your first tour.Read guide","href":"https:\/\/help.paxflow.io\/en\/articles\/11831730-how-to-get-started-with-paxflow","media":"","alt":"","updated":1781610622},{"id":"pfvce_1781627713162_f9d89d9947324","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(1)","type":"link","text":"Getting Started with PaxFlowComplete guide to setting up your account and onboarding your first tour.Read guide","href":"https:\/\/help.paxflow.io\/en\/articles\/11831730-how-to-get-started-with-paxflow","media":"","alt":"","updated":1781627791},{"id":"pfvce_1781628011502_dca6e514a974f","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(1) > span:nth-of-type(2)","type":"text","text":"PaxPlanner - Departures & scheduling","href":"","media":"","alt":"","updated":1781628024},{"id":"pfvce_1781628026361_e5b969ca0273d8","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(1) > span:nth-of-type(2)","type":"html","text":"<p>PaxPlanner - Departures & scheduling<\/p>","href":"","media":"","alt":"","updated":1781628047},{"id":"pfvce_1781628049161_190c6ddf2c49e8","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(2) > span:nth-of-type(2)","type":"text","text":"PaxCRM - 2,000 messages\/month","href":"","media":"","alt":"","updated":1781628063},{"id":"pfvce_1781628065921_c7fb8ad670f34","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(3) > span:nth-of-type(2)","type":"text","text":"PaxForms - 1,000 responses\/month","href":"","media":"","alt":"","updated":1781628077},{"id":"pfvce_1781628083424_a8a4abec8ad33","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(4) > span:nth-of-type(2)","type":"text","text":"PaxPortal - Customer self-service","href":"","media":"","alt":"","updated":1781628100},{"id":"pfvce_1781628132612_8f4b848fefa06","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(5) > span:nth-of-type(2)","type":"text","text":"PaxPortal - Customer self-service","href":"","media":"","alt":"","updated":1781628136},{"id":"pfvce_1781628141099_41dabc5dc0eb78","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(4) > span:nth-of-type(2)","type":"text","text":"PaxForms - 1,000 responses\/month","href":"","media":"","alt":"","updated":1781628144},{"id":"pfvce_1781628148380_0cad801bf4ab38","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(3) > span:nth-of-type(2)","type":"text","text":"PaxCRM - 2,000 messages\/month","href":"","media":"","alt":"","updated":1781628151},{"id":"pfvce_1781628204220_41e3f5b00a21a","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(3) > span:nth-of-type(2)","type":"text","text":"PaxForms - 1,000 responses\/month","href":"","media":"","alt":"","updated":1781628210},{"id":"pfvce_1781628211699_6584f3a5551c98","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(5) > span:nth-of-type(2)","type":"text","text":"PaxPortal - Customer self-service","href":"","media":"","alt":"","updated":1781628214},{"id":"pfvce_1781628216432_56ebc4075295b","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(4) > span:nth-of-type(2)","type":"text","text":"PaxPortal - Customer self-service","href":"","media":"","alt":"","updated":1781628220},{"id":"pfvce_1781628223001_86e6c090fff308","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(5) > span:nth-of-type(2)","type":"html","text":"<p>PaxEnroute - Guide & driver app<\/p>","href":"","media":"","alt":"","updated":1781628249}
548,{"id":"pfvce_1781628282977_e171d5c26f5168","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(2) > span:nth-of-type(2)","type":"text","text":"PaxCRM - 5,000 messages\/month","href":"","media":"","alt":"","updated":1781628290},{"id":"pfvce_1781628293233_eeba8ccf0f4228","page":"\/pricing","selector":"div > section:nth-of-type(1) > div > div:nth-of-type(2) > div:nth-of-type(2) > ul > li:nth-of-type(3) > span:nth-of-type(2)","type":"text","text":"PaxForms - 2,500 responses\/month","href":"","media":"","alt":"","updated":1781628299},{"id":"pfvce_1781782293941_628b411f1b6f9","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(2)","type":"link","text":"Optimisation Best PracticesAdvanced strategies for maximizing efficiency and reducing operational overhead.Read guide","href":"#","media":"","alt":"","updated":1781782298},{"id":"pfvce_1781782389852_873d47aaff59f8","page":"\/insights","selector":"#root > div > div > section:nth-of-type(6) > div > a","type":"link","text":"Book a Demo","href":"\/contact\/","media":"","alt":"","updated":1781782396},{"id":"pfvce_1781876526924_e2f477fb873f4","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(2)","type":"link","text":"PaxFlow OperationsTransform your tour operations with PaxFlow's Operational Intelligence Layer.Read guide","href":"https:\/\/help.paxflow.io\/en\/collections\/19126585-paxflow-operations","media":"","alt":"","updated":1781876529},{"id":"pfvce_1781876579608_2aa50fdd2ae2c8","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(3)","type":"link","text":"Messaging AutomationMaximise the value of every customer with cross-channel automated messaging mastery.Read guide","href":"https:\/\/help.paxflow.io\/en\/collections\/7643242-paxflow-messages","media":"","alt":"","updated":1781876583},{"id":"pfvce_1781876588096_3492861ed39918","page":"\/insights","selector":"#root > div > div > section:nth-of-type(5) > div > div:nth-of-type(2) > a:nth-of-type(4)","type":"link","text":"Customer Self-ServiceLearn how to allow your customer to self-serve and alleviate the pressures from your team.Read guide","href":"https:\/\/help.paxflow.io\/en\/collections\/2461353-paxportal-customer-portal","media":"","alt":"","updated":1781876591},{"id":"pfvce_1781877331524_e1b299007c588","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(1) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/departure-management\/","media":"","alt":"","updated":1781877344},{"id":"pfvce_1781877346745_bdce903aa2487","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(2) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/resource-management\/","media":"","alt":"","updated":1781877353},{"id":"pfvce_1781877355577_51c1baeb4c973","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(3) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/shift-scheduling\/","media":"","alt":"","updated":1781877365},{"id":"pfvce_1781877381642_d1a4c54ba4164","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(4) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/enroute-application\/","media":"","alt":"","updated":1781877391},{"id":"pfvce_1781877393282_b3c1115fbb71c8","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(5) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/ticket-scanning\/","media":"","alt":"","updated":1781877402},{"id":"pfvce_1781877414585_6216d300070bc8","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(6) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/ai-chatbot\/","media":"","alt":"","updated":1781877423},{"id":"pfvce_1781877425951_cc28863bf5c0e8","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(7) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/customer-messaging\/","media":"","alt":"","updated":1781877434},{"id":"pfvce_1781877437141_299dbd7f375ed","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(8) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/paxportal\/","media":"","alt":"","updated":1781877468},{"id":"pfvce_1781877470484_b6e8e6951943b","page":"\/platform","selector":"#root > div > div > section:nth-of-type(2) > div > div > div:nth-of-type(9) > div:nth-of-type(1) > a","type":"link","text":"Learn more","href":"\/platform\/booking-forms\/","media":"","alt":"","updated":1781877477},{"id":"pfvce_1781879583578_c2038e538bb61","page":"\/","selector":"#pricing > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(3) > div:nth-of-type(5) > span","type":"text","text":"Dedicated account manager","href":"","media":"","alt":"","updated":1781879592},{"id":"pfvce_1781879593268_51a216440e67c","page":"\/","selector":"#pricing > div > div:nth-of-type(2) > div:nth-of-type(1) > div:nth-of-type(3) > div:nth-of-type(1) > span","type":"text","text":"Up to 60,000 passengers\/year","href":"","media":"","alt":"","updated":1781879599},{"id":"pfvce_1781879640790_c3ceb37b6df01","page":"\/","selector":"#wp-admin-bar-site-name > a","type":"link","text":"Chris's PaxFlow Version","href":"https:\/\/paxflow.io\/wp-admin\/","media":"","alt":"","updated":1781879643},{"id":"pfvce_1782155996375_97e11a0316be5","page":"\/","selector":"#root > div > section:nth-of-type(2) > div > div:nth-of-type(1) > div > div:nth-of-type(5)","type":"text","text":"TA Scotland","href":"","media":"","alt":"","updated":1782156003}
548,{"id":"pfvce_1782156011353_11688076c4f8a","page":"\/","selector":"#root > div > section:nth-of-type(2) > div > div:nth-of-type(1) > div > div:nth-of-type(5)","type":"text","text":"TA SCOTLAND","href":"","media":"","alt":"","updated":1782156016},{"id":"pfvce_1789730659179_bac3f21107fe48","page":"\/","selector":"article > section > section:nth-of-type(1) > div:nth-of-type(2) > div > div:nth-of-type(1) > div:nth-of-type(1) > p:nth-of-type(1)","type":"text","text":"Use this page as a reusable campaign template. Edit the headline, offer, use case and supporting sections for each promotion without rebuilding the layout. This is a test","href":"","media":"","alt":"","updated":1789730665},{"id":"pfvce_1789730680898_af202723af2928","page":"\/","selector":"article > section > section:nth-of-type(1) > div:nth-of-type(2) > div > div:nth-of-type(1) > div:nth-of-type(1) > p:nth-of-type(1)","type":"text","text":"Use this page as a reusable campaign template. Edit the headline, offer, use case and supporting sections for each promotion without rebuilding the layout.","href":"","media":"","alt":"","updated":1789730686},{"id":"pfvce_1789730694065_cb673b3c550a7","page":"\/","selector":"article > section > section:nth-of-type(1) > div:nth-of-type(2) > div > div:nth-of-type(1) > div:nth-of-type(2) > a:nth-of-type(1)","type":"link","text":"Book demo","href":"#book-demo","media":"","alt":"","updated":1789730702},{"id":"pfvce_1789730726932_c4d4dd4f6ee258","page":"\/","selector":"main > article > section > section:nth-of-type(4) > div > div:nth-of-type(2) > div:nth-of-type(2) > a","type":"link","text":"Book demo","href":"#book-demo","media":"","alt":"","updated":1789730735},{"id":"pfvce_1789730741255_401d7f4738778","page":"\/","selector":"section > section:nth-of-type(8) > div > div > div:nth-of-type(2) > div > div > a:nth-of-type(1)","type":"link","text":"Book demo","href":"#book-demo","media":"","alt":"","updated":1789730744},{"id":"pfvce_1789731452421_b51677f4e8227","page":"\/","selector":"article > section > section:nth-of-type(1) > div:nth-of-type(2) > div > div:nth-of-type(1) > div:nth-of-type(1) > p:nth-of-type(1)","type":"text","text":"Use this page as a reusable campaign template. Edit the headline, offer, use case and supporting sections for each promotion without rebuilding the layout. Chris did this.","href":"","media":"","alt":"","updated":1789731459}],"draftEdits":[],"currentPath":""}; 549//# sourceURL=paxflow-vce-v5-js-before 550</script>
vendor: 1 bytes, line 550
550
551<script id="paxflow-vce-v5-js-after"> 552(function(){ 553 const data = window.PaxFlowVCEv5Data || {}; 554 const canEdit = !!data.canEdit; 555 let liveEdits = Array.isArray(data.liveEdits) ? data.liveEdits : []; 556 let draftEdits = Array.isArray(data.draftEdits) ? data.draftEdits : []; 557 let editMode = false; 558 let selectedElement = null; 559 let selectedInfo = null; 560 let applying = false; 561 562 function currentPath(){ 563 let p = window.location.pathname.replace(/\/$/, ''); 564 return p === '' ? '/' : p; 565 } 566 567 function pageMatches(edit){ 568 const page = (edit.page || '').replace(/\/$/, '') || 'all'; 569 const path = currentPath(); 570 return page === 'all' || page === '*' || page === path || (page === '/' && path === '/'); 571 } 572 573 function normalizeHtml(value){ 574 let v = String(value || ''); 575 if (v.indexOf('<') !== -1) return v; 576 const parts = v.split(/\n\s*\n/g).map(s => s.trim()).filter(Boolean); 577 if (parts.length > 1) { 578 return parts.map(s => '<span style="display:block;margin-bottom:18px;">' + escapeHtml(s).replace(/\n/g, '<br>') + '</span>').join(''); 579 } 580 return escapeHtml(v).replace(/\n/g, '<br>'); 581 } 582 583 function escapeHtml(s){ 584 return String(s).replace(/[&<>"]/g, function(c){ 585 return {'&':'&','<':'<','>':'>','"':'"'}[c]; 586 }); 587 } 588 589 function findBestLink(el){ 590 if (!el) return null; 591 if (el.matches && el.matches('a[href]')) return el; 592 const closest = el.closest ? el.closest('a[href]') : null; 593 if (closest) return closest; 594 return el.querySelector ? el.querySelector('a[href]') : null; 595 } 596 597 function applySingleEdit(edit){ 598 if (!pageMatches(edit) || !edit.selector) return; 599 let el = null; 600 try { el = document.querySelector(edit.selector); } catch(e) { return; } 601 if (!el) return; 602 603 if (edit.type === 'link') { 604 const link = findBestLink(el); 605 if (link && edit.href) { 606 link.setAttribute('href', edit.href); 607 if (edit.href.indexOf('http') === 0 && !edit.href.includes(window.location.hostname)) { 608 link.setAttribute('target', '_blank'); 609 link.setAttribute('rel', 'noopener noreferrer'); 610 } else { 611 link.removeAttribute('target'); 612 link.removeAttribute('rel'); 613 } 614 } 615 return; // Critical: link edits NEVER overwrite card/text HTML. 616 } 617 618 if (edit.type === 'image') { 619 const img = (el.matches && el.matches('img')) ? el : (el.querySelector ? el.querySelector('img') : null); 620 if (img && edit.media) img.setAttribute('src', edit.media); 621 if (img && edit.alt) img.setAttribute('alt', edit.alt); 622 return; 623 } 624 625 if (edit.type === 'video') { 626 const media = (el.matches && el.matches('iframe,video,source')) ? el : (el.querySelector ? el.querySelector('iframe,video,source') : null); 627 if (media && edit.media) media.setAttribute('src', edit.media); 628 return; 629 } 630 631 if (edit.type === 'html') { 632 el.innerHTML = normalizeHtml(edit.text || ''); 633 return; 634 } 635 636 if (edit.type === 'text') { 637 el.textContent = edit.text || ''; 638 } 639 } 640 641 function applyEdits(){ 642 if (applying) return; 643 applying = true; 644 try {
645 liveEdits.forEach(applySingleEdit); 646 if (canEdit) draftEdits.forEach(applySingleEdit); 647 } finally { 648 applying = false; 649 } 650 } 651 652 function selectorFor(el){ 653 if (!el || !el.tagName) return ''; 654 if (el.id) return '#' + CSS.escape(el.id); 655 const parts = []; 656 let node = el; 657 let safety = 0; 658 while (node && node.nodeType === 1 && node !== document.body && safety < 8) { 659 let tag = node.tagName.toLowerCase(); 660 if (node.id) { 661 parts.unshift('#' + CSS.escape(node.id)); 662 break; 663 } 664 let parent = node.parentElement; 665 if (!parent) break; 666 let siblings = Array.from(parent.children).filter(c => c.tagName === node.tagName); 667 if (siblings.length > 1) { 668 tag += ':nth-of-type(' + (siblings.indexOf(node) + 1) + ')'; 669 } 670 parts.unshift(tag); 671 node = parent; 672 safety++; 673 if (node && node.id === 'root') { 674 parts.unshift('#root'); 675 break; 676 } 677 } 678 return parts.join(' > '); 679 } 680 681 function isTextOnly(el){ 682 if (!el) return false; 683 const tag = el.tagName ? el.tagName.toLowerCase() : ''; 684 const allowed = ['p','span','h1','h2','h3','h4','h5','h6','li','strong','em','small','div']; 685 if (!allowed.includes(tag)) return false; 686 if (['script','style','noscript'].includes(tag)) return false; 687 const text = (el.textContent || '').trim(); 688 if (!text || text.length > 1200) return false; 689 const complex = el.querySelector && el.querySelector('img,svg,video,iframe,form,input,select,textarea,button,section,article'); 690 if (complex) return false; 691 const childBlocks = el.querySelectorAll ? el.querySelectorAll('div,p,h1,h2,h3,h4,h5,h6,ul,ol').length : 0; 692 return childBlocks <= 2; 693 } 694 695 function editableTargetFromClick(target){ 696 if (!target || target.closest('#paxflow-vce-toolbar,#paxflow-vce-modal-backdrop')) return null; 697 if (target.matches && target.matches('img,iframe,video')) return target; 698 const link = target.closest ? target.closest('a[href]') : null; 699 if (link) return link; 700 let node = target; 701 let steps = 0; 702 while (node && node !== document.body && steps < 5) { 703 if (isTextOnly(node)) return node; 704 node = node.parentElement; 705 steps++; 706 } 707 return null; 708 } 709 710 function markEditables(){ 711 if (!canEdit) return; 712 document.querySelectorAll('[data-paxflow-vce-editable]').forEach(el => el.removeAttribute('data-paxflow-vce-editable')); 713 const selectors = 'a[href],button,img,iframe,video,p,span,h1,h2,h3,h4,h5,h6,li,div'; 714 document.querySelectorAll(selectors).forEach(el => { 715 if (editableTargetFromClick(el) === el) el.setAttribute('data-paxflow-vce-editable', '1'); 716 }); 717 } 718 719 function makeToolbar(){ 720 if (!canEdit || document.getElementById('paxflow-vce-toolbar')) return; 721 const bar = document.createElement('div'); 722 bar.id = 'paxflow-vce-toolbar'; 723 bar.innerHTML = '<button id="paxflow-vce-edit-toggle" type="button">Edit PaxFlow Page</button><button id="paxflow-vce-apply" type="button">Apply Changes</button><button id="paxflow-vce-clear" type="button">Clear Draft</button>'; 724 document.body.appendChild(bar); 725 document.getElementById('paxflow-vce-edit-toggle').addEventListener('click', function(){ 726 editMode = !editMode; 727 document.documentElement.classList.toggle('paxflow-vce-active', editMode); 728 this.textContent = editMode ? 'Stop Editing' : 'Edit PaxFlow Page'; 729 markEditables(); 730 }); 731 document.getElementById('paxflow-vce-apply').addEventListener('click', applyDraftsAjax); 732 document.getElementById('paxflow-vce-clear').addEventListener('click', clearDraftsAjax); 733 } 734 735 function makeModal(){ 736 if (!canEdit || document.getElementById('paxflow-vce-modal-backdrop')) return; 737 const wrap = document.createElement('div'); 738 wrap.id = 'paxflow-vce-modal-backdrop'; 739 wrap.innerHTML = ` 740 <div id="paxflow-vce-modal" role="dialog" aria-modal="true"> 741 <h3 id="paxflow-vce-title">Edit content</h3> 742 <label>Detected selector</label> 743 <input id="paxflow-vce-selector" type="text" readonly> 744 <label>Edit type</label> 745 <select id="paxflow-vce-type"> 746 <option value="text">Text</option> 747 <option value="html">HTML</option> 748 <option value="link">Link/button URL only</option> 749 <option value="image">Image</option> 750 <option value="video">Video/iframe</option> 751 </select> 752 <label>Text / HTML value</label> 753 <textarea id="paxflow-vce-text"></textarea> 754 <div class="paxflow-vce-help">For links, this field is ignored so cards are not accidentally overwritten. Select the title/body text separately if you want to edit copy.</div> 755 <label>Link URL</label> 756 <input id="paxflow-vce-href" type="url" placeholder="https://... or /page/"> 757 <label>Image/video URL</label> 758 <input id="paxflow-vce-media" type="url" placeholder="https://..."> 759 <label>Image alt text</label> 760 <input id="paxflow-vce-alt" type="text"> 761 <div class="paxflow-vce-actions"> 762 <button id="paxflow-vce-cancel" type="button">Cancel</button> 763 <button id="paxflow-vce-save" type="button">Save change</button> 764 </div> 765 </div>`; 766 document.body.appendChild(wrap); 767 document.getElementById('paxflow-vce-cancel').addEventListener('click', closeModal); 768 document.getElementById('paxflow-vce-save').addEventListener('click', saveCurrentEditAjax); 769 wrap.addEventListener('click', function(e){ if (e.target === wrap) closeModal(); }); 770 } 771 772 function openModal(el){ 773 selectedElement = el; 774 const selector = selectorFor(el); 775 const tag = el.tagName.toLowerCase(); 776 let type = 'text'; 777 let href = ''; 778 let media = ''; 779 let alt = ''; 780 if (tag === 'a' || tag === 'button') { type = 'link'; } 781 if (tag === 'img') { type = 'image'; media = el.getAttribute('src') || ''; alt = el.getAttribute('alt') || ''; } 782 if (tag === 'iframe' || tag === 'video') { type = 'video'; media = el.getAttribute('src') || ''; } 783 if (tag === 'a') href = el.getAttribute('href') || ''; 784 if (tag === 'button') href = ''; 785 selectedInfo = { id: 'pfvce_' + Date.now() + '_' + Math.random().toString(16).slice(2), selector, type }; 786 document.getElementById('paxflow-vce-title').textContent = 'Edit ' + (type === 'link' ? 'link' : type); 787 document.getElementById('paxflow-vce-selector').value = selector; 788 document.getElementById('paxflow-vce-type').value = type; 789 document.getElementById('paxflow-vce-text').value = (type === 'html') ? el.innerHTML : (el.textContent || '').trim(); 790 document.getElementById('paxflow-vce-href').value = href; 791 document.getElementById('paxflow-vce-media').value = media; 792 document.getElementById('paxflow-vce-alt').value = alt; 793 document.getElementById('paxflow-vce-modal-backdrop').classList.add('is-open'); 794 } 795 796 function closeModal(){ 797 const m = document.getElementById('paxflow-vce-modal-backdrop'); 798 if (m) m.classList.remove('is-open'); 799 if (selectedElement) selectedElement.classList.remove('paxflow-vce-selected'); 800 selectedElement = null; 801 selectedInfo = null; 802 } 803 804 function ajax(action, payload){ 805 const fd = new FormData(); 806 fd.append('action', action); 807 fd.append('nonce', data.nonce || '');
808 if (payload) Object.keys(payload).forEach(k => fd.append(k, payload[k])); 809 return fetch(data.ajaxUrl, { method: 'POST', credentials: 'same-origin', body: fd }).then(r => r.json()); 810 } 811 812 function saveCurrentEditAjax(){ 813 if (!selectedInfo) return; 814 const edit = { 815 id: selectedInfo.id, 816 page: currentPath(), 817 selector: document.getElementById('paxflow-vce-selector').value, 818 type: document.getElementById('paxflow-vce-type').value, 819 text: document.getElementById('paxflow-vce-text').value, 820 href: document.getElementById('paxflow-vce-href').value, 821 media: document.getElementById('paxflow-vce-media').value, 822 alt: document.getElementById('paxflow-vce-alt').value 823 }; 824 ajax('paxflow_vce_v5_save_draft', { edit: JSON.stringify(edit) }).then(res => { 825 if (!res || !res.success) { alert((res && res.data && res.data.message) || 'Could not save change'); return; } 826 draftEdits = res.data.edits || []; 827 applySingleEdit(edit); 828 markEditables(); 829 closeModal(); 830 }); 831 } 832 833 function applyDraftsAjax(){ 834 ajax('paxflow_vce_v5_apply').then(res => { 835 if (!res || !res.success) { alert((res && res.data && res.data.message) || 'Could not apply changes'); return; } 836 liveEdits = res.data.edits || []; 837 alert('Changes applied. Clear cache before public testing.'); 838 }); 839 } 840 841 function clearDraftsAjax(){ 842 if (!confirm('Clear all draft edits for this editor? Live applied edits will remain until you apply an empty draft.')) return; 843 ajax('paxflow_vce_v5_clear_draft').then(res => { 844 if (!res || !res.success) { alert('Could not clear drafts'); return; } 845 draftEdits = []; 846 alert('Drafts cleared.'); 847 }); 848 } 849 850 function initEditor(){ 851 if (!canEdit) return; 852 makeToolbar(); 853 makeModal(); 854 markEditables(); 855 document.addEventListener('click', function(e){ 856 if (!editMode) return; 857 const target = editableTargetFromClick(e.target); 858 if (!target) return; 859 e.preventDefault(); 860 e.stopPropagation(); 861 if (selectedElement) selectedElement.classList.remove('paxflow-vce-selected'); 862 selectedElement = target; 863 selectedElement.classList.add('paxflow-vce-selected'); 864 openModal(target); 865 }, true); 866 } 867 868 function schedule(){ 869 applyEdits(); 870 if (canEdit) markEditables(); 871 } 872 873 document.addEventListener('DOMContentLoaded', function(){ applyEdits(); initEditor(); }); 874 window.addEventListener('load', function(){ applyEdits(); if (canEdit) markEditables(); }); 875 setTimeout(schedule, 300); 876 setTimeout(schedule, 1000); 877 setTimeout(schedule, 2000); 878 879 const obs = new MutationObserver(function(){ 880 if (applying) return; 881 clearTimeout(window.__paxflowVce5Timer); 882 window.__paxflowVce5Timer = setTimeout(schedule, 120); 883 }); 884 obs.observe(document.documentElement, { childList: true, subtree: true }); 885})(); 886//# sourceURL=paxflow-vce-v5-js-after 887</script>
vendor: 1 bytes, line 887
887
888<script id="wp-emoji-settings" type="application/json"> 889{"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://paxflow.io/wp-includes/js/wp-emoji-release.min.js?ver=7.1.2"}} 890</script>
vendor: 1 bytes, line 890
890
891<script type="module"> 892/*! This file is auto-generated */ 893var e="script#wp-emoji-settings",t=document.querySelector(e);if(!(t instanceof HTMLScriptElement))throw new Error("Element missing: "+e);const r=JSON.parse(t.text),s=(window._wpemojiSettings=r,"wpEmojiSettingsSupports"),o=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(s,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const r=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===r[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,r){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!r(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,r){let a;const s=(a="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),o=(s.textBaseline="top",s.font="600 32px Arial",{});return e.forEach(e=>{o[e]=t(s,e,n,r)}),o}function a(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}r.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(s));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(o),u.toString(),c.toString(),p.toString()].join(",")+"));",r=new Blob([e],{type:"text/javascript"});const a=new Worker(URL.createObjectURL(r),{name:"wpTestEmojiSupports"});return void(a.onmessage=e=>{i(n=e.data),a.terminate(),t(n)})}catch(e){}i(n=f(o,u,c,p))}t(n)}).then(e=>{for(const n in e)r.supports[n]=e[n],r.supports.everything=r.supports.everything&&r.supports[n],"flag"!==n&&(r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&r.supports[n]);var t;r.supports.everythingExceptFlag=r.supports.everythingExceptFlag&&!r.supports.flag,r.supports.everything||((t=r.source||{}).concatemoji?a(t.concatemoji):t.wpemoji&&t.twemoji&&(a(t.twemoji),a(t.wpemoji)))}); 894//# sourceURL=https://paxflow.io/wp-includes/js/wp-emoji-loader.min.js 895</script>
895 896
896<script> 897 (function () { 898 var lastPath = window.location.pathname; 899 900 function scrollToTopIfPathChanged() { 901 if (window.location.pathname !== lastPath) { 902 lastPath = window.location.pathname; 903 window.scrollTo({ 904 top: 0, 905 left: 0, 906 behavior: 'auto' 907 }); 908 } 909 } 910 911 var originalPushState = history.pushState; 912 var originalReplaceState = history.replaceState; 913 914 history.pushState = function () { 915 originalPushState.apply(history, arguments); 916 setTimeout(scrollToTopIfPathChanged, 0); 917 }; 918 919 history.replaceState = function () { 920 originalReplaceState.apply(history, arguments); 921 setTimeout(scrollToTopIfPathChanged, 0); 922 }; 923 924 window.addEventListener('popstate', function () { 925 setTimeout(scrollToTopIfPathChanged, 0); 926 }); 927 928 document.addEventListener('click', function () { 929 setTimeout(scrollToTopIfPathChanged, 50); 930 }); 931 })(); 932 </script>
932 933 <style> 934 html, 935 body, 936 #root { 937 background: #FBFCFD !important; 938 } 939 940 #paxflow-wp-mobile-header, 941 #paxflow-wp-desktop-header { 942 background: #FBFCFD !important; 943 } 944 945 /* Hide both WordPress headers by default, then reveal by breakpoint */ 946 #paxflow-wp-mobile-header, 947 #paxflow-wp-desktop-header { 948 display: none; 949 } 950 951 /* Hide exported React/Figma header/nav because WordPress controls navigation now */ 952 #root header, 953 #root nav { 954 display: none !important; 955 } 956 957 @media (min-width: 769px) { 958 body { 959 padding-top: 80px !important; 960 background: #FBFCFD !important; 961 } 962 963 body.admin-bar { 964 padding-top: 112px !important; 965 } 966 967 #paxflow-wp-desktop-header { 968 display: block !important; 969 position: fixed !important; 970 top: 0 !important; 971 left: 0 !important; 972 right: 0 !important; 973 width: 100% !important; 974 z-index: 9999999 !important; 975 background: #FBFCFD !important; 976 border-bottom: 0 !important; 977 box-shadow: none !important; 978 } 979 980 body.admin-bar #paxflow-wp-desktop-header { 981 top: 32px !important; 982 } 983 984 .paxflow-wp-desktop-inner { 985 display: grid !important; 986 grid-template-columns: auto 1fr auto !important; 987 align-items: center !important; 988 gap: 32px !important; 989 width: 100% !important; 990 max-width: 1280px !important; 991 margin: 0 auto !important; 992 padding: 16px 32px !important; 993 box-sizing: border-box !important; 994 background: #FBFCFD !important; 995 } 996 997 .paxflow-wp-desktop-logo, 998 .paxflow-wp-desktop-logo:visited { 999 display: inline-flex !important; 1000 align-items: center !important; 1001 justify-content: flex-start !important; 1002 text-decoration: none !important; 1003 min-width: 0 !important; 1004 } 1005 1006 .paxflow-wp-desktop-logo img { 1007 display: block !important; 1008 width: auto !important; 1009 max-width: 170px !important; 1010 max-height: 48px !important; 1011 height: auto !important; 1012 object-fit: contain !important; 1013 } 1014 1015 .paxflow-wp-desktop-logo span { 1016 color: #0f172a !important; 1017 font-weight: 800 !important; 1018 font-size: 24px !important; 1019 letter-spacing: -0.03em !important; 1020 } 1021 1022 .paxflow-wp-desktop-nav { 1023 display: flex !important; 1024 align-items: center !important; 1025 justify-content: center !important; 1026 min-width: 0 !important; 1027 } 1028 1029 .paxflow-wp-desktop-menu { 1030 display: flex !important; 1031 align-items: center !important; 1032 justify-content: center !important; 1033 gap: 28px !important; 1034 list-style: none !important; 1035 margin: 0 !important; 1036 padding: 0 !important; 1037 } 1038 1039 .paxflow-wp-desktop-menu li { 1040 margin: 0 !important; 1041 padding: 0 !important; 1042 } 1043 1044 .paxflow-wp-desktop-menu a { 1045 color: #334155 !important; 1046 text-decoration: none !important; 1047 font-weight: 600 !important; 1048 font-size: 15px !important; 1049 line-height: 1 !important; 1050 white-space: nowrap !important; 1051 } 1052 1053 .paxflow-wp-desktop-menu a:hover { 1054 color: #0f172a !important; 1055 } 1056 1057 .paxflow-wp-desktop-actions { 1058 display: flex !important; 1059 align-items: center !important; 1060 justify-content: flex-end !important; 1061 gap: 14px !important; 1062 white-space: nowrap !important; 1063 } 1064 1065 .paxflow-wp-desktop-signin { 1066 display: inline-flex !important; 1067 align-items: center !important; 1068 justify-content: center !important; 1069 color: #334155 !important; 1070 text-decoration: none !important; 1071 font-weight: 650 !important; 1072 font-size: 15px !important; 1073 line-height: 1 !important; 1074 padding: 14px 8px !important; 1075 } 1076 1077 .paxflow-wp-desktop-signin:hover { 1078 color: #0f172a !important; 1079 } 1080 1081 .paxflow-wp-desktop-demo { 1082 display: inline-flex !important; 1083 align-items: center !important; 1084 justify-content: center !important; 1085 white-space: nowrap !important; 1086 padding: 14px 22px !important; 1087 border-radius: 16px !important; 1088 background: linear-gradient(135deg, #8b1cf6 0%, #ec008c 100%) !important; 1089 color: #ffffff !important; 1090 font-weight: 750 !important; 1091 font-size: 15px !important; 1092 line-height: 1 !important; 1093 text-decoration: none !important;
1094 box-shadow: 0 14px 35px rgba(236, 0, 140, 0.22) !important; 1095 } 1096 1097 #root { 1098 margin-top: 0 !important; 1099 padding-top: 0 !important; 1100 background: #FBFCFD !important; 1101 } 1102 1103 #root main, 1104 #root main section:first-child { 1105 margin-top: 0 !important; 1106 padding-top: 0 !important; 1107 background: #FBFCFD !important; 1108 } 1109 } 1110 1111 @media (max-width: 768px) { 1112 html, 1113 body, 1114 #root { 1115 width: 100% !important; 1116 max-width: 100vw !important; 1117 overflow-x: hidden !important; 1118 background: #FBFCFD !important; 1119 } 1120 1121 body { 1122 padding-top: 76px !important; 1123 background: #FBFCFD !important; 1124 } 1125 1126 body.admin-bar { 1127 padding-top: 122px !important; 1128 } 1129 1130 #paxflow-wp-mobile-header { 1131 display: block !important; 1132 position: fixed !important; 1133 top: 0 !important; 1134 left: 0 !important; 1135 right: 0 !important; 1136 width: 100% !important; 1137 max-width: 100vw !important; 1138 z-index: 9999999 !important; 1139 transform: none !important; 1140 margin: 0 !important; 1141 background: #FBFCFD !important; 1142 border-bottom: 0 !important; 1143 box-shadow: none !important; 1144 } 1145 1146 body.admin-bar #paxflow-wp-mobile-header { 1147 top: 46px !important; 1148 } 1149 1150 .paxflow-wp-mobile-inner { 1151 display: grid !important; 1152 grid-template-columns: minmax(0, 1fr) auto auto !important; 1153 align-items: center !important; 1154 gap: 12px !important; 1155 width: 100% !important; 1156 max-width: 100vw !important; 1157 padding: 12px 16px !important; 1158 box-sizing: border-box !important; 1159 background: #FBFCFD !important; 1160 } 1161 1162 .paxflow-wp-mobile-logo { 1163 display: inline-flex !important; 1164 align-items: center !important; 1165 justify-content: flex-start !important; 1166 min-width: 0 !important; 1167 padding-left: 0 !important; 1168 margin-left: 0 !important; 1169 text-decoration: none !important; 1170 } 1171 1172 .paxflow-wp-mobile-logo img { 1173 display: block !important; 1174 width: auto !important; 1175 max-width: 145px !important; 1176 max-height: 42px !important; 1177 height: auto !important; 1178 object-fit: contain !important; 1179 } 1180 1181 .paxflow-wp-mobile-logo span { 1182 color: #0f172a !important; 1183 font-weight: 800 !important; 1184 font-size: 22px !important; 1185 letter-spacing: -0.03em !important; 1186 } 1187 1188 #paxflow-wp-mobile-toggle { 1189 display: inline-flex !important; 1190 flex-direction: column !important; 1191 align-items: center !important; 1192 justify-content: center !important; 1193 gap: 5px !important; 1194 width: 44px !important; 1195 height: 44px !important; 1196 padding: 0 !important; 1197 border: 1px solid rgba(15, 23, 42, 0.12) !important; 1198 border-radius: 12px !important; 1199 background: #ffffff !important; 1200 cursor: pointer !important; 1201 flex-shrink: 0 !important; 1202 } 1203 1204 #paxflow-wp-mobile-toggle span { 1205 display: block !important;
1206 width: 20px !important; 1207 height: 2px !important; 1208 background: #0f172a !important; 1209 border-radius: 99px !important; 1210 } 1211 1212 .paxflow-wp-mobile-cta { 1213 display: inline-flex !important; 1214 align-items: center !important; 1215 justify-content: center !important; 1216 white-space: nowrap !important; 1217 min-width: max-content !important; 1218 padding: 12px 16px !important; 1219 border-radius: 14px !important; 1220 background: linear-gradient(135deg, #8b1cf6 0%, #ec008c 100%) !important; 1221 color: #ffffff !important; 1222 font-weight: 700 !important; 1223 font-size: 14px !important; 1224 line-height: 1 !important; 1225 text-decoration: none !important; 1226 } 1227 1228 #paxflow-wp-mobile-panel { 1229 display: none !important; 1230 padding: 0 16px 16px !important; 1231 background: #FBFCFD !important; 1232 } 1233 1234 #paxflow-wp-mobile-panel.is-open { 1235 display: block !important; 1236 } 1237 1238 .paxflow-wp-mobile-menu { 1239 list-style: none !important; 1240 margin: 0 !important; 1241 padding: 10px !important; 1242 border: 1px solid rgba(15, 23, 42, 0.10) !important; 1243 border-radius: 18px !important; 1244 box-shadow: 0 24px 70px rgba(15, 23, 42, 0.14) !important; 1245 background: #ffffff !important; 1246 } 1247 1248 .paxflow-wp-mobile-menu li { 1249 margin: 0 !important; 1250 padding: 0 !important; 1251 } 1252 1253 .paxflow-wp-mobile-menu a { 1254 display: block !important; 1255 padding: 14px 12px !important; 1256 color: #0f172a !important; 1257 font-weight: 650 !important; 1258 text-decoration: none !important; 1259 border-bottom: 1px solid rgba(15, 23, 42, 0.08) !important; 1260 } 1261 1262 .paxflow-wp-mobile-menu li:last-child a { 1263 border-bottom: 0 !important; 1264 } 1265 1266 #root { 1267 margin-top: 0 !important; 1268 padding-top: 0 !important; 1269 background: #FBFCFD !important; 1270 } 1271 1272 #wpadminbar, 1273 #wpadminbar * { 1274 max-width: none !important; 1275 } 1276 } 1277 </style> 1278 1279
1279<script> 1280 (function () { 1281 function setupPaxFlowMobileMenu() { 1282 var toggle = document.getElementById('paxflow-wp-mobile-toggle'); 1283 var panel = document.getElementById('paxflow-wp-mobile-panel'); 1284 1285 if (!toggle || !panel || toggle.dataset.ready === '1') { 1286 return; 1287 } 1288 1289 toggle.dataset.ready = '1'; 1290 1291 toggle.addEventListener('click', function () { 1292 var isOpen = panel.classList.toggle('is-open'); 1293 toggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); 1294 }); 1295 1296 panel.addEventListener('click', function (event) { 1297 if (event.target && event.target.tagName === 'A') { 1298 panel.classList.remove('is-open'); 1299 toggle.setAttribute('aria-expanded', 'false'); 1300 } 1301 }); 1302 } 1303 1304 document.addEventListener('DOMContentLoaded', setupPaxFlowMobileMenu); 1305 window.addEventListener('load', setupPaxFlowMobileMenu); 1306 })(); 1307 </script>
1307 1308
1308<script> 1309 (function () { 1310 var themeAssetsUrl = "https:\/\/paxflow.io\/wp-content\/themes\/paxflow-chris-theme-mobile-fixed\/dist\/assets\/"; 1311 1312 function fixAssetUrl(url) { 1313 if (!url) return url; 1314 1315 if (url.indexOf('/assets/') === 0) { 1316 return themeAssetsUrl + url.replace('/assets/', ''); 1317 } 1318 1319 return url; 1320 } 1321 1322 function fixImagesAndMedia() { 1323 document.querySelectorAll('img').forEach(function (img) { 1324 var src = img.getAttribute('src'); 1325 var fixedSrc = fixAssetUrl(src); 1326 1327 if (fixedSrc !== src) { 1328 img.setAttribute('src', fixedSrc); 1329 } 1330 1331 var srcset = img.getAttribute('srcset'); 1332 if (srcset && srcset.indexOf('/assets/') !== -1) { 1333 img.setAttribute( 1334 'srcset', 1335 srcset.replaceAll('/assets/', themeAssetsUrl) 1336 ); 1337 } 1338 }); 1339 1340 document.querySelectorAll('source').forEach(function (source) { 1341 var src = source.getAttribute('src'); 1342 var fixedSrc = fixAssetUrl(src); 1343 1344 if (fixedSrc !== src) { 1345 source.setAttribute('src', fixedSrc); 1346 } 1347 1348 var srcset = source.getAttribute('srcset'); 1349 if (srcset && srcset.indexOf('/assets/') !== -1) { 1350 source.setAttribute( 1351 'srcset', 1352 srcset.replaceAll('/assets/', themeAssetsUrl) 1353 ); 1354 } 1355 }); 1356 1357 document.querySelectorAll('video').forEach(function (video) { 1358 var src = video.getAttribute('src'); 1359 var fixedSrc = fixAssetUrl(src); 1360 1361 if (fixedSrc !== src) { 1362 video.setAttribute('src', fixedSrc); 1363 } 1364 }); 1365 } 1366 1367 document.addEventListener('DOMContentLoaded', fixImagesAndMedia); 1368 window.addEventListener('load', fixImagesAndMedia); 1369 1370 setTimeout(fixImagesAndMedia, 250); 1371 setTimeout(fixImagesAndMedia, 750); 1372 setTimeout(fixImagesAndMedia, 1500); 1373 setTimeout(fixImagesAndMedia, 3000); 1374 })(); 1375 </script>
1375 1376
1376<script> 1377 (function () { 1378 var themeAssetsUrl = "https:\/\/paxflow.io\/wp-content\/themes\/paxflow-chris-theme-mobile-fixed\/dist\/assets\/"; 1379 1380 function fixPlaceholderImages() { 1381 document.querySelectorAll('img[data-original-url]').forEach(function (img) { 1382 var originalUrl = img.getAttribute('data-original-url'); 1383 1384 if (!originalUrl) { 1385 return; 1386 } 1387 1388 var fixedUrl = originalUrl; 1389 1390 if (originalUrl.indexOf('/assets/') === 0) { 1391 fixedUrl = themeAssetsUrl + originalUrl.replace('/assets/', ''); 1392 } 1393 1394 if (img.getAttribute('src') !== fixedUrl) { 1395 img.setAttribute('src', fixedUrl); 1396 } 1397 1398 img.removeAttribute('loading'); 1399 img.removeAttribute('decoding'); 1400 img.style.objectFit = 'contain'; 1401 }); 1402 } 1403 1404 document.addEventListener('DOMContentLoaded', fixPlaceholderImages); 1405 window.addEventListener('load', fixPlaceholderImages); 1406 1407 setTimeout(fixPlaceholderImages, 250); 1408 setTimeout(fixPlaceholderImages, 750); 1409 setTimeout(fixPlaceholderImages, 1500); 1410 setTimeout(fixPlaceholderImages, 3000); 1411 })(); 1412 </script>
1412 1413 <style> 1414 @media (max-width: 768px) { 1415 #paxflow-onboarding-root .pf-mobile-pax-input-wrap { 1416 display: block !important; 1417 margin: 18px 0 24px !important; 1418 } 1419 1420 #paxflow-onboarding-root .pf-mobile-pax-input-wrap label { 1421 display: block !important; 1422 font-size: 0.95rem !important; 1423 font-weight: 600 !important; 1424 color: #111111 !important; 1425 margin-bottom: 8px !important; 1426 text-align: left !important; 1427 } 1428 1429 #paxflow-onboarding-root .pf-mobile-pax-input-wrap input { 1430 width: 100% !important; 1431 min-height: 56px !important; 1432 border-radius: 12px !important; 1433 border: 1px solid rgba(17, 17, 17, 0.14) !important; 1434 background: #f7f7f9 !important; 1435 padding: 14px 16px !important; 1436 font-size: 1rem !important; 1437 color: #111111 !important; 1438 } 1439 1440 #paxflow-onboarding-root .pf-mobile-pax-help { 1441 margin-top: 8px !important; 1442 font-size: 0.85rem !important; 1443 color: #6b7280 !important; 1444 line-height: 1.4 !important; 1445 text-align: left !important; 1446 } 1447 1448 /* 1449 * Hide the original range slider and unreadable labels on mobile only. 1450 */ 1451 #paxflow-onboarding-root #pf-pax-slider { 1452 display: none !important; 1453 } 1454 1455 #paxflow-onboarding-root #pf-pax-slider-wrapper, 1456 #paxflow-onboarding-root #pf-pax-slider-labels { 1457 display: none !important; 1458 } 1459 } 1460 1461 @media (min-width: 769px) { 1462 #paxflow-onboarding-root .pf-mobile-pax-input-wrap { 1463 display: none !important; 1464 } 1465 } 1466 </style> 1467 1468
1468<script> 1469 (function () { 1470 function paxToSliderValue(pax) { 1471 pax = parseInt(pax || '0', 10); 1472 1473 if (!pax || pax < 10000) return 0; 1474 if (pax <= 30000) return 1; 1475 if (pax <= 50000) return 2; 1476 if (pax <= 100000) return 3; 1477 if (pax <= 200000) return 4; 1478 if (pax <= 300000) return 5; 1479 return 6; 1480 } 1481 1482 function setupMobilePaxInput() { 1483 var root = document.getElementById('paxflow-onboarding-root'); 1484 if (!root) return; 1485 1486 var slider = root.querySelector('#pf-pax-slider'); 1487 if (!slider) return; 1488 1489 if (root.querySelector('#pf-mobile-pax-input')) return; 1490 1491 var sliderWrapper = slider.parentElement; 1492 if (!sliderWrapper) return; 1493 1494 sliderWrapper.id = 'pf-pax-slider-wrapper'; 1495 1496 var labelsRow = sliderWrapper.nextElementSibling; 1497 if (labelsRow) { 1498 labelsRow.id = 'pf-pax-slider-labels'; 1499 } 1500 1501 var wrap = document.createElement('div'); 1502 wrap.className = 'pf-mobile-pax-input-wrap'; 1503 wrap.innerHTML = ` 1504 <label for="pf-mobile-pax-input">Approximate passengers per year</label> 1505 <input 1506 id="pf-mobile-pax-input" 1507 type="number" 1508 min="0" 1509 step="1000" 1510 inputmode="numeric" 1511 placeholder="e.g. 25000" 1512 > 1513 <div class="pf-mobile-pax-help"> 1514 Enter an estimate. Weâll use this to suggest the right PaxFlow tier. 1515 </div> 1516 `; 1517 1518 sliderWrapper.parentNode.insertBefore(wrap, sliderWrapper); 1519 1520 var input = wrap.querySelector('#pf-mobile-pax-input'); 1521 1522 input.addEventListener('input', function () { 1523 var sliderValue = paxToSliderValue(input.value); 1524 1525 slider.value = sliderValue; 1526 slider.dispatchEvent(new Event('input', { bubbles: true })); 1527 slider.dispatchEvent(new Event('change', { bubbles: true })); 1528 }); 1529 } 1530 1531 document.addEventListener('DOMContentLoaded', setupMobilePaxInput); 1532 window.addEventListener('load', setupMobilePaxInput); 1533 1534 setTimeout(setupMobilePaxInput, 250); 1535 setTimeout(setupMobilePaxInput, 750); 1536 setTimeout(setupMobilePaxInput, 1500); 1537 1538 document.addEventListener('click', function () { 1539 setTimeout(setupMobilePaxInput, 250); 1540 }); 1541 })(); 1542 </script>
1542 1543
1543<script> 1544 (function () { 1545 function normaliseInsightsLinks() { 1546 if (!window.location.pathname.replace(/\/$/, '').endsWith('/insights')) { 1547 return; 1548 } 1549 1550 var currentOrigin = window.location.origin; 1551 1552 document.querySelectorAll('a[href]').forEach(function (link) { 1553 link.removeAttribute('target'); 1554 link.removeAttribute('rel'); 1555 1556 var href = link.getAttribute('href'); 1557 if (!href) return; 1558 1559 var parsed; 1560 1561 try { 1562 parsed = new URL(href, currentOrigin); 1563 } catch (e) { 1564 return; 1565 } 1566 1567 /* 1568 * Rewrite old/main PaxFlow blog links to this WordPress build. 1569 * Keeps the exact slug, changes only the domain. 1570 */ 1571 if ( 1572 parsed.hostname.includes('paxflow.io') || 1573 parsed.hostname.includes('paxflownewtdev.wpenginepowered.com') 1574 ) { 1575 var path = parsed.pathname; 1576 1577 /* 1578 * If the old link already contains /insights/slug 1579 */ 1580 if (path.includes('/insights/')) { 1581 var parts = path.split('/').filter(Boolean); 1582 var insightsIndex = parts.indexOf('insights'); 1583 1584 if (insightsIndex !== -1 && parts[insightsIndex + 1]) { 1585 var slug = parts[insightsIndex + 1]; 1586 link.setAttribute('href', currentOrigin + '/insights/' + slug + '/'); 1587 } 1588 } 1589 1590 /* 1591 * If the old link is just /slug/ 1592 */ 1593 else { 1594 var slugOnly = path.split('/').filter(Boolean).pop(); 1595 1596 if (slugOnly) { 1597 link.setAttribute('href', currentOrigin + '/insights/' + slugOnly + '/'); 1598 } 1599 } 1600 } 1601 }); 1602 } 1603 1604 document.addEventListener('DOMContentLoaded', normaliseInsightsLinks); 1605 window.addEventListener('load', normaliseInsightsLinks); 1606 1607 setTimeout(normaliseInsightsLinks, 300); 1608 setTimeout(normaliseInsightsLinks, 1000); 1609 setTimeout(normaliseInsightsLinks, 2000); 1610 1611 document.addEventListener('click', function () { 1612 setTimeout(normaliseInsightsLinks, 300); 1613 }); 1614 })(); 1615 </script>
1615 1616 <style> 1617 .paxflow-pricing-modal-backdrop { 1618 position: fixed; 1619 inset: 0; 1620 background: rgba(17, 24, 39, 0.55); 1621 display: none; 1622 align-items: center; 1623 justify-content: center; 1624 padding: 18px; 1625 z-index: 9999999; 1626 } 1627 1628 .paxflow-pricing-modal-backdrop.is-open { 1629 display: flex; 1630 } 1631 1632 .paxflow-pricing-modal { 1633 width: 100%; 1634 max-width: 520px; 1635 background: #ffffff; 1636 border-radius: 18px; 1637 border: 1px solid #E6E8EE; 1638 box-shadow: 0 26px 70px rgba(0, 0, 0, 0.22); 1639 padding: 22px 22px 18px; 1640 position: relative; 1641 font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; 1642 color: #111827; 1643 } 1644 1645 .paxflow-pricing-modal-close { 1646 position: absolute; 1647 top: 12px; 1648 right: 12px; 1649 width: 38px; 1650 height: 38px; 1651 border-radius: 12px; 1652 border: 1px solid #E6E8EE; 1653 background: #ffffff; 1654 cursor: pointer; 1655 font-size: 18px; 1656 line-height: 1; 1657 display: flex; 1658 align-items: center; 1659 justify-content: center; 1660 color: #000000; 1661 } 1662 1663 .paxflow-pricing-modal-close:hover { 1664 border-color: #C215D3; 1665 transform: translateY(-1px); 1666 } 1667 1668 .paxflow-pricing-modal-title { 1669 margin: 2px 44px 6px 0; 1670 font-size: 20px; 1671 font-weight: 900; 1672 color: #111827; 1673 } 1674 1675 .paxflow-pricing-modal-subtitle { 1676 margin: 0 44px 16px 0; 1677 font-size: 14px; 1678 color: #6B7280; 1679 line-height: 1.45; 1680 } 1681 1682 .paxflow-pricing-modal-actions { 1683 display: flex; 1684 flex-direction: column; 1685 gap: 10px; 1686 margin-top: 8px; 1687 } 1688 1689 .paxflow-pricing-modal-btn { 1690 width: 100%; 1691 border-radius: 12px; 1692 padding: 14px 14px; 1693 font-weight: 800; 1694 font-size: 15px; 1695 border: 1px solid transparent; 1696 cursor: pointer; 1697 transition: all 0.2s ease; 1698 text-decoration: none; 1699 display: inline-flex; 1700 align-items: center; 1701 justify-content: center; 1702 box-sizing: border-box; 1703 } 1704 1705 .paxflow-pricing-modal-btn.primary { 1706 background: #5A0091; 1707 color: #ffffff; 1708 box-shadow: 0 12px 26px rgba(90, 0, 145, 0.22); 1709 } 1710 1711 .paxflow-pricing-modal-btn.primary:hover { 1712 background: #C215D3; 1713 box-shadow: 0 14px 30px rgba(194, 21, 211, 0.22); 1714 transform: translateY(-1px); 1715 } 1716 1717 .paxflow-pricing-modal-btn.outline { 1718 background: #F4F0F2; 1719 color: #111827; 1720 border-color: #5A0091; 1721 } 1722 1723 .paxflow-pricing-modal-btn.outline:hover { 1724 border-color: #C215D3; 1725 } 1726 1727 .paxflow-pricing-modal-note { 1728 margin: 6px 0 0; 1729 font-size: 13px; 1730 color: #6B7280; 1731 line-height: 1.45; 1732 } 1733 </style> 1734 1735
1735<script> 1736 (function () { 1737 function isPricingPage() { 1738 return window.location.pathname.replace(/\/$/, '') === '/pricing'; 1739 } 1740 1741 function createPricingModal() { 1742 if (document.getElementById('paxflow-pricing-modal')) return; 1743 1744 var modal = document.createElement('div'); 1745 modal.className = 'paxflow-pricing-modal-backdrop'; 1746 modal.id = 'paxflow-pricing-modal'; 1747 modal.setAttribute('aria-hidden', 'true'); 1748 modal.setAttribute('role', 'dialog'); 1749 modal.setAttribute('aria-modal', 'true'); 1750 1751 modal.innerHTML = ` 1752 <div class="paxflow-pricing-modal" role="document"> 1753 <button type="button" class="paxflow-pricing-modal-close" aria-label="Close modal">Ã</button> 1754 1755 <div class="paxflow-pricing-modal-title">Choose your booking platform</div> 1756 <div class="paxflow-pricing-modal-subtitle"> 1757 Customers with Bókun can install PaxFlow on the Bókun Appstore. 1758 </div> 1759 1760 <div class="paxflow-pricing-modal-actions"> 1761 <a class="paxflow-pricing-modal-btn primary" 1762 href="https://extranet.bokun.io/v2/appstore/app/119" 1763 target="_blank" 1764 rel="noopener"> 1765 Install on Bókun Appstore 1766 </a> 1767 1768 <div class="paxflow-pricing-modal-note"> 1769 Customers with iTicket from VisitGroup or other booking platforms, please talk to sales. 1770 </div> 1771 1772 <a class="paxflow-pricing-modal-btn outline" 1773 href="/contact/"> 1774 Talk to sales 1775</a> 1776 </div> 1777 </div> 1778 `; 1779 1780 document.body.appendChild(modal); 1781 1782 var closeBtn = modal.querySelector('.paxflow-pricing-modal-close'); 1783 1784 function closeModal() { 1785 modal.classList.remove('is-open'); 1786 modal.setAttribute('aria-hidden', 'true'); 1787 document.body.style.overflow = ''; 1788 } 1789 1790 closeBtn.addEventListener('click', closeModal); 1791 1792 modal.addEventListener('click', function (e) { 1793 if (e.target === modal) closeModal(); 1794 }); 1795 1796 document.addEventListener('keydown', function (e) { 1797 if (e.key === 'Escape' && modal.classList.contains('is-open')) { 1798 closeModal(); 1799 } 1800 }); 1801 } 1802 1803 function openPricingModal() { 1804 createPricingModal(); 1805 1806 var modal = document.getElementById('paxflow-pricing-modal'); 1807 if (!modal) return; 1808 1809 modal.classList.add('is-open'); 1810 modal.setAttribute('aria-hidden', 'false'); 1811 document.body.style.overflow = 'hidden'; 1812 1813 var closeBtn = modal.querySelector('.paxflow-pricing-modal-close'); 1814 if (closeBtn) closeBtn.focus(); 1815 } 1816 1817 function bindTryForFreeButtons() { 1818 if (!isPricingPage()) return; 1819 1820 createPricingModal(); 1821 1822 document.querySelectorAll('a, button').forEach(function (el) { 1823 var text = (el.textContent || '').trim().toLowerCase(); 1824 1825 if (text === 'try for free') { 1826 if (el.dataset.paxflowModalBound === 'true') return; 1827 1828 el.dataset.paxflowModalBound = 'true'; 1829 1830 el.addEventListener('click', function (e) { 1831 e.preventDefault(); 1832 e.stopPropagation(); 1833 openPricingModal(); 1834 }, true); 1835 } 1836 }); 1837 } 1838 1839 document.addEventListener('DOMContentLoaded', bindTryForFreeButtons); 1840 window.addEventListener('load', bindTryForFreeButtons); 1841 1842 setTimeout(bindTryForFreeButtons, 300); 1843 setTimeout(bindTryForFreeButtons, 1000); 1844 setTimeout(bindTryForFreeButtons, 2000); 1845 1846 document.addEventListener('click', function () { 1847 setTimeout(bindTryForFreeButtons, 300); 1848 }); 1849 })(); 1850 </script>
1850 1851
1851<script> 1852 (function () { 1853 function isHomepage() { 1854 var path = window.location.pathname.replace(/\/$/, ''); 1855 return path === '' || path === '/'; 1856 } 1857 1858 function findDemoSection() { 1859 return ( 1860 document.querySelector('#paxflow-onboarding-root') || 1861 document.querySelector('[id*="demo"]') || 1862 document.querySelector('[class*="demo"]') || 1863 document.querySelector('[id*="contact"]') || 1864 document.querySelector('[class*="contact"]') 1865 ); 1866 } 1867 1868 function scrollToDemo() { 1869 var demoSection = findDemoSection(); 1870 1871 if (demoSection) { 1872 var offset = 100; 1873 var top = demoSection.getBoundingClientRect().top + window.pageYOffset - offset; 1874 1875 window.scrollTo({ 1876 top: top, 1877 behavior: 'smooth' 1878 }); 1879 } else { 1880 window.location.href = '/contact/'; 1881 } 1882 } 1883 1884 function fixContactSalesButtons() { 1885 if (!isHomepage()) return; 1886 1887 document.querySelectorAll('a, button').forEach(function (el) { 1888 var text = (el.textContent || '').trim().toLowerCase(); 1889 1890 if (text === 'contact sales') { 1891 el.removeAttribute('target'); 1892 el.removeAttribute('rel'); 1893 1894 if (el.tagName.toLowerCase() === 'a') { 1895 el.setAttribute('href', '#demo'); 1896 } 1897 1898 if (el.dataset.paxflowContactSalesBound === 'true') return; 1899 el.dataset.paxflowContactSalesBound = 'true'; 1900 1901 el.addEventListener('click', function (e) { 1902 e.preventDefault(); 1903 e.stopPropagation(); 1904 scrollToDemo(); 1905 }, true); 1906 } 1907 }); 1908 } 1909 1910 document.addEventListener('DOMContentLoaded', fixContactSalesButtons); 1911 window.addEventListener('load', fixContactSalesButtons); 1912 1913 setTimeout(fixContactSalesButtons, 300); 1914 setTimeout(fixContactSalesButtons, 1000); 1915 setTimeout(fixContactSalesButtons, 2000); 1916 })(); 1917 </script>
1917 1918 <style> 1919 .paxflow-home-video-modal-backdrop { 1920 position: fixed; 1921 inset: 0; 1922 z-index: 9999999; 1923 display: none; 1924 align-items: center; 1925 justify-content: center; 1926 padding: 20px; 1927 background: rgba(17, 24, 39, 0.72); 1928 } 1929 1930 .paxflow-home-video-modal-backdrop.is-open { 1931 display: flex; 1932 } 1933 1934 .paxflow-home-video-modal-panel { 1935 width: min(960px, 100%); 1936 background: transparent; 1937 border-radius: 18px; 1938 overflow: visible; 1939 box-shadow: none; 1940 position: relative; 1941} 1942 1943.paxflow-home-video-modal-close { 1944 position: absolute; 1945 top: -46px; 1946 right: 0; 1947 width: 38px; 1948 height: 38px; 1949 border: none; 1950 border-radius: 999px; 1951 background: rgba(255, 255, 255, 0.92); 1952 font-size: 28px; 1953 line-height: 1; 1954 cursor: pointer; 1955 color: #111827; 1956 padding: 0; 1957 z-index: 2; 1958 display: flex; 1959 align-items: center; 1960 justify-content: center; 1961} 1962 1963.paxflow-home-video-modal-body { 1964 padding: 0; 1965} 1966 1967 .paxflow-home-video-frame { 1968 position: relative; 1969 width: 100%; 1970 padding-bottom: 56.25%; 1971 height: 0; 1972 overflow: hidden; 1973 border-radius: 12px; 1974 background: #000000; 1975 } 1976 1977 .paxflow-home-video-frame iframe { 1978 position: absolute; 1979 inset: 0; 1980 width: 100%; 1981 height: 100%; 1982 border: 0; 1983 } 1984 1985 @media (max-width: 768px) { 1986 .paxflow-home-video-modal-backdrop { 1987 padding: 12px; 1988 } 1989 1990 .paxflow-home-video-modal-body { 1991 padding: 14px; 1992 } 1993 } 1994 </style> 1995 1996
1996<script> 1997 (function () { 1998 function isHomepage() { 1999 var path = window.location.pathname.replace(/\/$/, ''); 2000 return path === '' || path === '/'; 2001 } 2002 2003 function createVideoModal() { 2004 if (document.getElementById('paxflow-home-video-modal')) return; 2005 2006 /* 2007 * Change this ID if the Platform page demo uses a different YouTube video. 2008 */ 2009 var demoVideoId = 'YPRZc6Xus6U'; 2010 2011 var modal = document.createElement('div'); 2012 modal.id = 'paxflow-home-video-modal'; 2013 modal.className = 'paxflow-home-video-modal-backdrop'; 2014 modal.setAttribute('aria-hidden', 'true'); 2015 modal.setAttribute('role', 'dialog'); 2016 modal.setAttribute('aria-modal', 'true'); 2017 2018 modal.innerHTML = ` 2019 <div class="paxflow-home-video-modal-panel" role="document"> 2020 <div class="paxflow-home-video-modal-header"> 2021 <h4>Watch a 7-minute demo</h4> 2022 <button type="button" class="paxflow-home-video-modal-close" aria-label="Close">Ã</button> 2023 </div> 2024 2025 <div class="paxflow-home-video-modal-body"> 2026 <div class="paxflow-home-video-frame"> 2027 <iframe 2028 data-src="https://www.youtube.com/embed/${demoVideoId}?autoplay=1&mute=1&rel=0&modestbranding=1&playsinline=1" 2029 allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" 2030 allowfullscreen 2031 ></iframe> 2032 </div> 2033 </div> 2034 </div> 2035 `; 2036 2037 document.body.appendChild(modal); 2038 2039 var closeBtn = modal.querySelector('.paxflow-home-video-modal-close'); 2040 var iframe = modal.querySelector('iframe'); 2041 2042 function closeModal() { 2043 modal.classList.remove('is-open'); 2044 modal.setAttribute('aria-hidden', 'true'); 2045 document.body.style.overflow = ''; 2046 2047 if (iframe) { 2048 iframe.setAttribute('src', ''); 2049 } 2050 } 2051 2052 closeBtn.addEventListener('click', closeModal); 2053 2054 modal.addEventListener('click', function (e) { 2055 if (e.target === modal) { 2056 closeModal(); 2057 } 2058 }); 2059 2060 document.addEventListener('keydown', function (e) { 2061 if (e.key === 'Escape' && modal.classList.contains('is-open')) { 2062 closeModal(); 2063 } 2064 }); 2065 } 2066 2067 function openVideoModal() { 2068 createVideoModal(); 2069 2070 var modal = document.getElementById('paxflow-home-video-modal'); 2071 if (!modal) return; 2072 2073 var iframe = modal.querySelector('iframe'); 2074 if (iframe) { 2075 iframe.setAttribute('src', iframe.getAttribute('data-src')); 2076 } 2077 2078 modal.classList.add('is-open'); 2079 modal.setAttribute('aria-hidden', 'false'); 2080 document.body.style.overflow = 'hidden'; 2081 2082 var closeBtn = modal.querySelector('.paxflow-home-video-modal-close'); 2083 if (closeBtn) closeBtn.focus(); 2084 } 2085 2086 function bindViewPlatformButton() { 2087 if (!isHomepage()) return; 2088 2089 createVideoModal(); 2090 2091 document.querySelectorAll('a, button').forEach(function (el) { 2092 var text = (el.textContent || '').trim().toLowerCase(); 2093 2094 if (text === 'view platform') { 2095 if (el.dataset.paxflowVideoModalBound === 'true') return; 2096 2097 el.dataset.paxflowVideoModalBound = 'true'; 2098 2099 if (el.tagName.toLowerCase() === 'a') { 2100 el.setAttribute('href', '#watch-demo'); 2101 el.removeAttribute('target'); 2102 el.removeAttribute('rel'); 2103 } 2104 2105 el.addEventListener('click', function (e) { 2106 e.preventDefault(); 2107 e.stopPropagation(); 2108 openVideoModal(); 2109 }, true); 2110 } 2111 }); 2112 } 2113 2114 document.addEventListener('DOMContentLoaded', bindViewPlatformButton); 2115 window.addEventListener('load', bindViewPlatformButton); 2116 2117 setTimeout(bindViewPlatformButton, 300); 2118 setTimeout(bindViewPlatformButton, 1000); 2119 setTimeout(bindViewPlatformButton, 2000); 2120 2121 document.addEventListener('click', function () { 2122 setTimeout(bindViewPlatformButton, 300); 2123 }); 2124 })(); 2125 </script>
2125 2126
2126<script> 2127 (function () { 2128 function updateSignInLinks() { 2129 var signInUrl = 'https://admin.paxflow.io/'; 2130 2131 document.querySelectorAll('a, button').forEach(function (el) { 2132 var text = (el.textContent || '').trim().toLowerCase(); 2133 2134 if (text === 'sign in' || text === 'signin') { 2135 if (el.tagName.toLowerCase() === 'a') { 2136 el.setAttribute('href', signInUrl); 2137 el.setAttribute('target', '_blank'); 2138 el.setAttribute('rel', 'noopener noreferrer'); 2139 } else { 2140 el.onclick = function (e) { 2141 e.preventDefault(); 2142 window.open(signInUrl, '_blank', 'noopener,noreferrer'); 2143 }; 2144 } 2145 } 2146 }); 2147 } 2148 2149 document.addEventListener('DOMContentLoaded', updateSignInLinks); 2150 window.addEventListener('load', updateSignInLinks); 2151 2152 setTimeout(updateSignInLinks, 300); 2153 setTimeout(updateSignInLinks, 1000); 2154 setTimeout(updateSignInLinks, 2000); 2155 2156 document.addEventListener('click', function () { 2157 setTimeout(updateSignInLinks, 300); 2158 }); 2159 })(); 2160 </script>
2160 2161 <style id="paxflow-site-ext-about-css"> 2162 .paxflow-investment-section, 2163 .paxflow-leadership-section { 2164 background: #FFFFFF; 2165 padding: 96px 48px; 2166 border-top: 0 !important; 2167 } 2168 .paxflow-investment-section { padding-bottom: 64px; } 2169 .paxflow-leadership-section { padding-top: 40px; } 2170 .paxflow-investment-inner, 2171 .paxflow-leadership-inner { 2172 max-width: 808px; 2173 margin: 0 auto; 2174 text-align: left; 2175 } 2176 .paxflow-investment-header, 2177 .paxflow-leadership-header { 2178 max-width: 100%; 2179 margin: 0 0 48px; 2180 text-align: left; 2181 } 2182 .paxflow-investment-title, 2183 .paxflow-leadership-title { 2184 margin: 0 0 24px; 2185 color: #111827; 2186 font-size: 34px; 2187 line-height: 1.18; 2188 letter-spacing: -0.035em; 2189 font-weight: 700; 2190 } 2191 .paxflow-investment-copy, 2192 .paxflow-leadership-copy { 2193 max-width: 100%; 2194 margin: 0; 2195 color: #111827; 2196 font-size: 17px; 2197 line-height: 1.55; 2198 } 2199 .paxflow-investment-logos { 2200 display: flex; 2201 align-items: center; 2202 justify-content: flex-start; 2203 gap: 24px; 2204 flex-wrap: wrap; 2205 } 2206 .paxflow-investment-logo-card { 2207 display: flex; 2208 align-items: center; 2209 justify-content: center; 2210 min-width: 300px; 2211 min-height: 130px; 2212 padding: 32px 42px; 2213 border: 1px solid #e5e7eb; 2214 border-radius: 22px; 2215 background: #ffffff; 2216 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.06); 2217 } 2218 .paxflow-investment-logo-card img { 2219 display: block; 2220 width: auto; 2221 height: auto; 2222 object-fit: contain; 2223 } 2224 .paxflow-investment-logo-card img.paxflow-logo-primary { max-width: 360px; max-height: 120px; } 2225 .paxflow-investment-logo-card img.paxflow-logo-brunnur { max-width: 260px; max-height: 80px; } 2226 .paxflow-leadership-grid { display: grid; grid-template-columns: 1fr; gap: 28px; } 2227 .paxflow-leader-card { 2228 display: grid; 2229 grid-template-columns: 160px 1fr; 2230 gap: 28px; 2231 align-items: start; 2232 padding: 32px; 2233 border: 1px solid #e5e7eb; 2234 border-radius: 24px; 2235 background: #ffffff; 2236 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.06); 2237 } 2238 .paxflow-leader-image { 2239 width: 160px; 2240 height: 160px; 2241 border-radius: 20px; 2242 overflow: hidden; 2243 background: #f3f4f6; 2244 } 2245 .paxflow-leader-image img { 2246 display: block; 2247 width: 100%; 2248 height: 100%; 2249 object-fit: cover; 2250 } 2251 .paxflow-leader-name { 2252 margin: 0 0 6px; 2253 color: #111827; 2254 font-size: 24px; 2255 line-height: 1.2; 2256 letter-spacing: -0.025em; 2257 font-weight: 700; 2258 } 2259 .paxflow-leader-role { 2260 margin: 0 0 18px; 2261 color: #9333ea; 2262 font-size: 15px; 2263 line-height: 1.4; 2264 font-weight: 700; 2265 } 2266 .paxflow-leader-bio { 2267 margin: 0 0 20px; 2268 color: #374151; 2269 font-size: 16px; 2270 line-height: 1.65; 2271 } 2272 .paxflow-leader-link { 2273 display: inline-flex; 2274 align-items: center; 2275 color: #9333ea; 2276 font-size: 15px; 2277 font-weight: 700; 2278 text-decoration: none; 2279 } 2280 .paxflow-leader-link:hover { color: #c215d3; text-decoration: underline; } 2281 @media (max-width: 768px) { 2282 .paxflow-investment-section, 2283 .paxflow-leadership-section { padding: 72px 20px; } 2284 .paxflow-investment-section { padding-bottom: 48px; } 2285 .paxflow-leadership-section { padding-top: 28px; } 2286 .paxflow-investment-inner, 2287 .paxflow-leadership-inner { max-width: 100%; text-align: left; } 2288 .paxflow-investment-header, 2289 .paxflow-leadership-header { margin-bottom: 36px; text-align: left; } 2290 .paxflow-investment-title, 2291 .paxflow-leadership-title { font-size: 32px; line-height: 1.15; } 2292 .paxflow-investment-copy, 2293 .paxflow-leadership-copy { font-size: 16px; line-height: 1.6; } 2294 .paxflow-investment-logos { justify-content: flex-start; gap: 20px; } 2295 .paxflow-investment-logo-card { width: 100%; min-width: 0; min-height: 120px; padding: 24px; } 2296 .paxflow-investment-logo-card img.paxflow-logo-primary { max-width: 300px; max-height: 105px; } 2297 .paxflow-investment-logo-card img.paxflow-logo-brunnur { max-width: 230px; max-height: 70px; } 2298 .paxflow-leader-card { grid-template-columns: 1fr; gap: 22px; padding: 24px; } 2299 .paxflow-leader-image { width: 140px; height: 140px; } 2300 .paxflow-leader-name { font-size: 22px; } 2301 } 2302 </style> 2303 2304
2304<script id="paxflow-site-ext-about-js"> 2305 (function () { 2306 function isAboutPage() { 2307 var path = window.location.pathname.replace(/\/$/, ''); 2308 return path === '/about' || path === '/about-us'; 2309 } 2310 2311 function findSectionByHeading(headingText) { 2312 var wanted = headingText.toLowerCase(); 2313 var candidates = document.querySelectorAll('#root h1, #root h2, #root h3, #root h4, h1, h2, h3, h4'); 2314 2315 for (var i = 0; i < candidates.length; i++) { 2316 var text = (candidates[i].textContent || '').trim().toLowerCase(); 2317 2318 if (text.includes(wanted)) { 2319 var section = candidates[i].closest('section'); 2320 if (section && section.id !== 'root') return section; 2321 2322 var parent = candidates[i].parentElement; 2323 var steps = 0; 2324 while (parent && steps < 5) { 2325 var tag = parent.tagName ? parent.tagName.toLowerCase() : ''; 2326 if (tag === 'section') return parent; 2327 parent = parent.parentElement; 2328 steps++; 2329 } 2330 } 2331 } 2332 return null; 2333 } 2334 2335 function createInvestmentSection() { 2336 var section = document.createElement('section'); 2337 section.className = 'paxflow-investment-section'; 2338 section.innerHTML = ` 2339 <div class="paxflow-investment-inner"> 2340 <div class="paxflow-investment-header"> 2341 <h2 class="paxflow-investment-title">Backed by investors and innovation support</h2> 2342 <p class="paxflow-investment-copy">PaxFlow is supported by experienced investors and Icelandic innovation partners as we build the operations intelligence layer for modern tour businesses.</p> 2343 </div> 2344 <div class="paxflow-investment-logos"> 2345 <div class="paxflow-investment-logo-card"> 2346 <img class="paxflow-logo-primary" src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/image-6.png" alt="PaxFlow investment and support partner"> 2347 </div> 2348 <div class="paxflow-investment-logo-card"> 2349 <img class="paxflow-logo-brunnur" src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/Brunnur_Logo_Large-300x44-1.webp" alt="Brunnur Ventures"> 2350 </div> 2351 </div> 2352 </div>`; 2353 return section; 2354 } 2355 2356 function createLeadershipSection() { 2357 var section = document.createElement('section'); 2358 section.className = 'paxflow-leadership-section'; 2359 section.innerHTML = ` 2360 <div class="paxflow-leadership-inner"> 2361 <div class="paxflow-leadership-header"> 2362 <h2 class="paxflow-leadership-title">PaxFlow Leadership</h2> 2363 <p class="paxflow-leadership-copy">Meet the people helping shape PaxFlow's product, strategy and long-term vision.</p> 2364 </div> 2365 <div class="paxflow-leadership-grid"> 2366 <article class="paxflow-leader-card"> 2367 <div class="paxflow-leader-image"><img src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/soffia-th-300x291-1.png" alt="Soffia Thordardottir"></div> 2368 <div> 2369 <h3 class="paxflow-leader-name">Soffia Thordardottir</h3> 2370 <p class="paxflow-leader-role">Founder & CEO, PaxFlow</p> 2371 <p class="paxflow-leader-bio">Soffia is a seasoned leader with over 12 years of experience in the travel tech space. She is the former Director of Travel Solutions at TM Software & Origo and Product Portfolio Manager of Product Labs at Origo Iceland. Soffia has a background in Computer Science and Business Administration and is certified in Product Management from UC Berkeley Haas School of Business. She is a skilled problem solver and strategic leader, committed to creating innovative digital products that combine her passion for travel, tech and gear.</p> 2372 <a class="paxflow-leader-link" href="https://www.linkedin.com/in/soffiath/" target="_blank" rel="noopener noreferrer">View LinkedIn â</a> 2373 </div> 2374 </article> 2375 <article class="paxflow-leader-card"> 2376 <div class="paxflow-leader-image">
2376<img src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/andri2-150x150-1.jpeg" alt="Andri Heiðar Kristinsson"></div> 2377 <div> 2378 <h3 class="paxflow-leader-name">Andri Heiðar Kristinsson</h3> 2379 <p class="paxflow-leader-role">Chairman of the Board</p> 2380 <p class="paxflow-leader-bio">Andri Heiðar is a Stanford MBA graduate and a true entrepreneur and leader, with previous experience building consumer products at LinkedIn and scaling the SlideShare mobile app from the ground up to millions of users. Andri previously founded Travelade, a tech startup aimed at making travel more personal. He is also the former CEO of Digital Iceland, an organisation leading the digital transformation of the Icelandic government.</p> 2381 <a class="paxflow-leader-link" href="https://www.linkedin.com/in/andriheidar/" target="_blank" rel="noopener noreferrer">View LinkedIn â</a> 2382 </div> 2383 </article> 2384 </div> 2385 </div>`; 2386 return section; 2387 } 2388 2389 function addAboutSections() { 2390 if (!isAboutPage()) return false; 2391 if (document.querySelector('.paxflow-investment-section') || document.querySelector('.paxflow-leadership-section')) return true; 2392 2393 var investmentSection = createInvestmentSection(); 2394 var leadershipSection = createLeadershipSection(); 2395 var backedByExperienceSection = findSectionByHeading('Backed by experience'); 2396 2397 if (backedByExperienceSection && backedByExperienceSection.parentNode) { 2398 backedByExperienceSection.parentNode.insertBefore(investmentSection, backedByExperienceSection); 2399 investmentSection.parentNode.insertBefore(leadershipSection, investmentSection.nextSibling); 2400 backedByExperienceSection.remove(); 2401 return true; 2402 } 2403 2404 var readySection = findSectionByHeading('Ready to transform your tour operations'); 2405 if (readySection && readySection.parentNode) { 2406 readySection.parentNode.insertBefore(investmentSection, readySection); 2407 investmentSection.parentNode.insertBefore(leadershipSection, investmentSection.nextSibling); 2408 return true; 2409 } 2410 2411 var root = document.querySelector('#root main') || document.querySelector('#root') || document.body; 2412 root.appendChild(investmentSection); 2413 root.appendChild(leadershipSection); 2414 return true; 2415 } 2416 2417 document.addEventListener('DOMContentLoaded', addAboutSections); 2418 window.addEventListener('load', addAboutSections); 2419 setTimeout(addAboutSections, 300); 2420 setTimeout(addAboutSections, 1000); 2421 setTimeout(addAboutSections, 2000); 2422 setTimeout(addAboutSections, 3500); 2423 2424 if (window.MutationObserver) { 2425 var observer = new MutationObserver(function () { 2426 if (isAboutPage()) addAboutSections(); 2427 }); 2428 observer.observe(document.documentElement, { childList: true, subtree: true }); 2429 } 2430 })(); 2431 </script>
2431 2432 <style> 2433 .paxflow-investment-section, 2434 .paxflow-leadership-section { 2435 background: #FFFFFF; 2436 padding: 96px 48px; 2437 border-top: 0 !important; 2438 } 2439 2440 .paxflow-investment-section { 2441 padding-bottom: 64px; 2442 } 2443 2444 .paxflow-leadership-section { 2445 padding-top: 40px; 2446 } 2447 2448 .paxflow-investment-inner, 2449 .paxflow-leadership-inner { 2450 max-width: 808px; 2451 margin: 0 auto; 2452 text-align: left; 2453 } 2454 2455 .paxflow-investment-header, 2456 .paxflow-leadership-header { 2457 max-width: 100%; 2458 margin: 0 0 48px; 2459 text-align: left; 2460 } 2461 2462 .paxflow-investment-title, 2463 .paxflow-leadership-title { 2464 margin: 0 0 24px; 2465 color: #111827; 2466 font-size: 34px; 2467 line-height: 1.18; 2468 letter-spacing: -0.035em; 2469 font-weight: 700; 2470 } 2471 2472 .paxflow-investment-copy, 2473 .paxflow-leadership-copy { 2474 max-width: 100%; 2475 margin: 0; 2476 color: #111827; 2477 font-size: 17px; 2478 line-height: 1.55; 2479 } 2480 2481 .paxflow-investment-logos { 2482 display: flex; 2483 align-items: center; 2484 justify-content: flex-start; 2485 gap: 24px; 2486 flex-wrap: wrap; 2487 } 2488 2489 .paxflow-investment-logo-card { 2490 display: flex; 2491 align-items: center; 2492 justify-content: center; 2493 min-width: 300px; 2494 min-height: 130px; 2495 padding: 32px 42px; 2496 border: 1px solid #e5e7eb; 2497 border-radius: 22px; 2498 background: #ffffff; 2499 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.06); 2500 } 2501 2502 .paxflow-investment-logo-card img { 2503 display: block; 2504 width: auto; 2505 height: auto; 2506 object-fit: contain; 2507 } 2508 2509 .paxflow-investment-logo-card img.paxflow-logo-primary { 2510 max-width: 360px; 2511 max-height: 120px; 2512 } 2513 2514 .paxflow-investment-logo-card img.paxflow-logo-brunnur { 2515 max-width: 260px; 2516 max-height: 80px; 2517 } 2518 2519 .paxflow-leadership-grid { 2520 display: grid; 2521 grid-template-columns: 1fr; 2522 gap: 28px; 2523 } 2524 2525 .paxflow-leader-card { 2526 display: grid; 2527 grid-template-columns: 160px 1fr; 2528 gap: 28px; 2529 align-items: start; 2530 padding: 32px; 2531 border: 1px solid #e5e7eb; 2532 border-radius: 24px; 2533 background: #ffffff; 2534 box-shadow: 0 18px 50px rgba(15, 23, 42, 0.06); 2535 } 2536 2537 .paxflow-leader-image { 2538 width: 160px; 2539 height: 160px; 2540 border-radius: 20px; 2541 overflow: hidden; 2542 background: #f3f4f6; 2543 } 2544 2545 .paxflow-leader-image img { 2546 display: block; 2547 width: 100%; 2548 height: 100%; 2549 object-fit: cover; 2550 } 2551 2552 .paxflow-leader-name { 2553 margin: 0 0 6px; 2554 color: #111827; 2555 font-size: 24px; 2556 line-height: 1.2; 2557 letter-spacing: -0.025em; 2558 font-weight: 700; 2559 } 2560 2561 .paxflow-leader-role { 2562 margin: 0 0 18px; 2563 color: #9333ea; 2564 font-size: 15px; 2565 line-height: 1.4; 2566 font-weight: 700; 2567 } 2568 2569 .paxflow-leader-bio { 2570 margin: 0 0 20px; 2571 color: #374151; 2572 font-size: 16px; 2573 line-height: 1.65; 2574 } 2575 2576 .paxflow-leader-link { 2577 display: inline-flex; 2578 align-items: center; 2579 color: #9333ea; 2580 font-size: 15px; 2581 font-weight: 700; 2582 text-decoration: none; 2583 } 2584 2585 .paxflow-leader-link:hover { 2586 color: #c215d3; 2587 text-decoration: underline; 2588 } 2589 2590 @media (max-width: 768px) { 2591 .paxflow-investment-section, 2592 .paxflow-leadership-section { 2593 padding: 72px 20px; 2594 } 2595 2596 .paxflow-investment-section { 2597 padding-bottom: 48px; 2598 } 2599 2600 .paxflow-leadership-section { 2601 padding-top: 28px; 2602 } 2603 2604 .paxflow-investment-inner, 2605 .paxflow-leadership-inner { 2606 max-width: 100%; 2607 text-align: left; 2608 } 2609 2610 .paxflow-investment-header, 2611 .paxflow-leadership-header { 2612 margin-bottom: 36px; 2613 text-align: left; 2614 } 2615 2616 .paxflow-investment-title, 2617 .paxflow-leadership-title { 2618 font-size: 32px; 2619 line-height: 1.15; 2620 } 2621 2622 .paxflow-investment-copy, 2623 .paxflow-leadership-copy { 2624 font-size: 16px; 2625 line-height: 1.6; 2626 } 2627 2628 .paxflow-investment-logos { 2629 justify-content: flex-start; 2630 gap: 20px; 2631 } 2632 2633 .paxflow-investment-logo-card { 2634 width: 100%; 2635 min-width: 0; 2636 min-height: 120px; 2637 padding: 24px; 2638 } 2639 2640 .paxflow-investment-logo-card img.paxflow-logo-primary { 2641 max-width: 300px; 2642 max-height: 105px; 2643 } 2644 2645 .paxflow-investment-logo-card img.paxflow-logo-brunnur { 2646 max-width: 230px; 2647 max-height: 70px; 2648 } 2649 2650 .paxflow-leader-card { 2651 grid-template-columns: 1fr; 2652 gap: 22px; 2653 padding: 24px; 2654 } 2655 2656 .paxflow-leader-image { 2657 width: 140px; 2658 height: 140px; 2659 } 2660 2661 .paxflow-leader-name { 2662 font-size: 22px; 2663 } 2664 } 2665 </style> 2666 2667
2667<script> 2668 (function () { 2669 function isAboutPage() { 2670 var path = window.location.pathname.replace(/\/$/, ''); 2671 return path === '/about' || path === '/about-us'; 2672 } 2673 2674 function findSectionByHeading(headingText) { 2675 var wanted = headingText.toLowerCase(); 2676 var candidates = document.querySelectorAll('#root h1, #root h2, #root h3, #root h4, h1, h2, h3, h4'); 2677 2678 for (var i = 0; i < candidates.length; i++) { 2679 var text = (candidates[i].textContent || '').trim().toLowerCase(); 2680 2681 if (text.includes(wanted)) { 2682 var section = candidates[i].closest('section'); 2683 2684 if (section) { 2685 return section; 2686 } 2687 2688 var parent = candidates[i].parentElement; 2689 var steps = 0; 2690 2691 while (parent && steps < 4) { 2692 if (parent.tagName && parent.tagName.toLowerCase() === 'section') { 2693 return parent; 2694 } 2695 2696 parent = parent.parentElement; 2697 steps++; 2698 } 2699 } 2700 } 2701 2702 return null; 2703 } 2704 2705 function createInvestmentSection() { 2706 var section = document.createElement('section'); 2707 section.className = 'paxflow-investment-section'; 2708 2709 section.innerHTML = ` 2710 <div class="paxflow-investment-inner"> 2711 <div class="paxflow-investment-header"> 2712 <h2 class="paxflow-investment-title"> 2713 Backed by investors and innovation support 2714 </h2> 2715 2716 <p class="paxflow-investment-copy"> 2717 PaxFlow is supported by experienced investors and Icelandic innovation partners as we build the operations intelligence layer for modern tour businesses. 2718 </p> 2719 </div> 2720 2721 <div class="paxflow-investment-logos"> 2722 <div class="paxflow-investment-logo-card"> 2723 <img class="paxflow-logo-primary" src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/image-6.png" alt="PaxFlow investment and support partner"> 2724 </div> 2725 2726 <div class="paxflow-investment-logo-card"> 2727 <img class="paxflow-logo-brunnur" src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/Brunnur_Logo_Large-300x44-1.webp" alt="Brunnur Ventures"> 2728 </div> 2729 </div> 2730 </div> 2731 `; 2732 2733 return section; 2734 } 2735 2736 function createLeadershipSection() { 2737 var section = document.createElement('section'); 2738 section.className = 'paxflow-leadership-section'; 2739 2740 section.innerHTML = ` 2741 <div class="paxflow-leadership-inner"> 2742 <div class="paxflow-leadership-header"> 2743 <h2 class="paxflow-leadership-title">PaxFlow Leadership</h2> 2744 <p class="paxflow-leadership-copy"> 2745 Meet the people helping shape PaxFlowâs product, strategy and long-term vision. 2746 </p> 2747 </div> 2748 2749 <div class="paxflow-leadership-grid"> 2750 <article class="paxflow-leader-card"> 2751 <div class="paxflow-leader-image"> 2752 <img src="https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/soffia-th-300x291-1.png" alt="Soffia Thordardottir"> 2753 </div> 2754 2755 <div> 2756 <h3 class="paxflow-leader-name">Soffia Thordardottir</h3> 2757 <p class="paxflow-leader-role">Founder & CEO, PaxFlow</p> 2758 <p class="paxflow-leader-bio"> 2759 Soffia is a seasoned leader with over 12 years of experience in the travel tech space. She is the former Director of Travel Solutions at TM Software & Origo and Product Portfolio Manager of Product Labs at Origo Iceland. Soffia has a background in Computer Science and Business Administration and is certified in Product Management from UC Berkeley Haas School of Business. She is a skilled problem solver and strategic leader, committed to creating innovative digital products that combine her passion for travel, tech and gear. 2760 </p> 2761 <a class="paxflow-leader-link" href="https://www.linkedin.com/in/soffiath/" target="_blank" rel="noopener noreferrer">View LinkedIn â</a> 2762 </div> 2763 </article> 2764 2765 <article class="paxflow-leader-card"> 2766 <div class="paxflow-leader-image"> 2767 <img src="https://paxflownewtdev.wpenginepowered.com/w
2767p-content/uploads/2026/06/andri2-150x150-1.jpeg" alt="Andri Heiðar Kristinsson"> 2768 </div> 2769 2770 <div> 2771 <h3 class="paxflow-leader-name">Andri Heiðar Kristinsson</h3> 2772 <p class="paxflow-leader-role">Chairman of the Board</p> 2773 <p class="paxflow-leader-bio"> 2774 Andri Heiðar is a Stanford MBA graduate and a true entrepreneur and leader, with previous experience building consumer products at LinkedIn and scaling the SlideShare mobile app from the ground up to millions of users. Andri previously founded Travelade, a tech startup aimed at making travel more personal. He is also the former CEO of Digital Iceland, an organisation leading the digital transformation of the Icelandic government. 2775 </p> 2776 <a class="paxflow-leader-link" href="https://www.linkedin.com/in/andriheidar/" target="_blank" rel="noopener noreferrer">View LinkedIn â</a> 2777 </div> 2778 </article> 2779 </div> 2780 </div> 2781 `; 2782 2783 return section; 2784 } 2785 2786 function addAboutSections() { 2787 if (!isAboutPage()) return; 2788 2789 if ( 2790 document.querySelector('.paxflow-investment-section') || 2791 document.querySelector('.paxflow-leadership-section') 2792 ) { 2793 return; 2794 } 2795 2796 var investmentSection = createInvestmentSection(); 2797 var leadershipSection = createLeadershipSection(); 2798 2799 var backedByExperienceSection = findSectionByHeading('Backed by experience'); 2800 2801 if (backedByExperienceSection && backedByExperienceSection.parentNode) { 2802 backedByExperienceSection.parentNode.insertBefore(investmentSection, backedByExperienceSection); 2803 investmentSection.parentNode.insertBefore(leadershipSection, investmentSection.nextSibling); 2804 backedByExperienceSection.remove(); 2805 return; 2806 } 2807 2808 var readySection = findSectionByHeading('Ready to transform your tour operations'); 2809 2810 if (readySection && readySection.parentNode) { 2811 readySection.parentNode.insertBefore(investmentSection, readySection); 2812 investmentSection.parentNode.insertBefore(leadershipSection, investmentSection.nextSibling); 2813 return; 2814 } 2815 2816 var root = document.querySelector('#root main') || document.querySelector('#root') || document.body; 2817 2818 root.appendChild(investmentSection); 2819 root.appendChild(leadershipSection); 2820 } 2821 2822 document.addEventListener('DOMContentLoaded', addAboutSections); 2823 window.addEventListener('load', addAboutSections); 2824 2825 setTimeout(addAboutSections, 300); 2826 setTimeout(addAboutSections, 1000); 2827 setTimeout(addAboutSections, 2000); 2828 })(); 2829 </script>
2829 2830 <style> 2831 body.paxflow-pricing-cleaned .paxflow-hide-pricing-element { 2832 display: none !important; 2833 } 2834 2835 body.paxflow-pricing-cleaned .paxflow-three-plan-grid { 2836 grid-template-columns: repeat(3, minmax(0, 1fr)) !important; 2837 max-width: 1100px !important; 2838 } 2839 2840 body.paxflow-pricing-cleaned table.paxflow-no-starter-column th:nth-child(2), 2841 body.paxflow-pricing-cleaned table.paxflow-no-starter-column td:nth-child(2) { 2842 display: none !important; 2843 } 2844 2845 body.paxflow-pricing-cleaned table.paxflow-no-starter-column { 2846 width: 100% !important; 2847 min-width: 0 !important; 2848 max-width: 100% !important; 2849 table-layout: fixed !important; 2850 } 2851 2852 @media (max-width: 1024px) { 2853 body.paxflow-pricing-cleaned .paxflow-three-plan-grid { 2854 grid-template-columns: repeat(2, minmax(0, 1fr)) !important; 2855 max-width: 760px !important; 2856 } 2857 } 2858 2859 @media (max-width: 768px) { 2860 body.paxflow-pricing-cleaned .paxflow-three-plan-grid { 2861 grid-template-columns: 1fr !important; 2862 max-width: 100% !important; 2863 } 2864 2865 body.paxflow-pricing-cleaned table.paxflow-no-starter-column { 2866 width: 870px !important; 2867 min-width: 870px !important; 2868 max-width: none !important; 2869 } 2870 2871 body.paxflow-pricing-cleaned table.paxflow-no-starter-column th:first-child, 2872 body.paxflow-pricing-cleaned table.paxflow-no-starter-column td:first-child { 2873 width: 360px !important; 2874 min-width: 360px !important; 2875 max-width: 360px !important; 2876 } 2877 2878 body.paxflow-pricing-cleaned table.paxflow-no-starter-column th:not(:first-child), 2879 body.paxflow-pricing-cleaned table.paxflow-no-starter-column td:not(:first-child) { 2880 width: 170px !important; 2881 min-width: 170px !important; 2882 max-width: 170px !important; 2883 } 2884 } 2885 </style> 2886 2887
2887<script> 2888 (function () { 2889 function isPricingPage() { 2890 var path = window.location.pathname.replace(/\/$/, ''); 2891 return path === '/pricing'; 2892 } 2893 2894 function normalise(text) { 2895 return (text || '').replace(/\s+/g, ' ').trim().toLowerCase(); 2896 } 2897 2898 function hideMonthlyAnnualToggle() { 2899 var candidates = document.querySelectorAll('#root div, #root section'); 2900 2901 candidates.forEach(function (el) { 2902 var text = normalise(el.textContent); 2903 2904 if ( 2905 text.includes('monthly') && 2906 text.includes('annual') && 2907 text.length < 120 2908 ) { 2909 el.classList.add('paxflow-hide-pricing-element'); 2910 } 2911 }); 2912 } 2913 2914 function hideStarterPricingCard() { 2915 var candidates = document.querySelectorAll('#root h1, #root h2, #root h3, #root div, #root span'); 2916 2917 candidates.forEach(function (el) { 2918 var text = normalise(el.textContent); 2919 2920 if (text !== 'starter') return; 2921 2922 var parent = el; 2923 var steps = 0; 2924 2925 while (parent && steps < 8) { 2926 var parentText = normalise(parent.textContent); 2927 2928 if ( 2929 parentText.includes('starter') && 2930 ( 2931 parentText.includes('â¬159') || 2932 parentText.includes('up to 1,000 monthly pax') || 2933 parentText.includes('paxplanner') 2934 ) && 2935 parentText.includes('try for free') 2936 ) { 2937 parent.classList.add('paxflow-hide-pricing-element'); 2938 2939 var grid = parent.parentElement; 2940 if (grid) { 2941 grid.classList.add('paxflow-three-plan-grid'); 2942 } 2943 2944 return; 2945 } 2946 2947 parent = parent.parentElement; 2948 steps++; 2949 } 2950 }); 2951 } 2952 2953 function removeStarterFeatureColumn() { 2954 document.querySelectorAll('#root table').forEach(function (table) { 2955 var text = normalise(table.textContent); 2956 2957 if ( 2958 !text.includes('features') || 2959 !text.includes('starter') || 2960 !text.includes('grow') || 2961 !text.includes('pro') || 2962 !text.includes('enterprise') 2963 ) { 2964 return; 2965 } 2966 2967 table.classList.add('paxflow-no-starter-column'); 2968 2969 table.querySelectorAll('tr').forEach(function (row) { 2970 var cells = row.children; 2971 2972 /* 2973 * Standard feature rows: 2974 * Features | Starter | Grow | Pro | Enterprise 2975 */ 2976 if (cells.length >= 5 && cells[1]) { 2977 cells[1].style.setProperty('display', 'none', 'important'); 2978 } 2979 2980 /* 2981 * Section divider rows with colspan. 2982 */ 2983 Array.prototype.forEach.call(cells, function (cell) { 2984 var colspan = parseInt(cell.getAttribute('colspan') || '0', 10); 2985 2986 if (colspan >= 5) { 2987 cell.setAttribute('colspan', '4'); 2988 } 2989 }); 2990 }); 2991 }); 2992 } 2993 2994 function applyPricingChanges() { 2995 if (!isPricingPage()) return; 2996 2997 document.body.classList.add('paxflow-pricing-cleaned'); 2998 2999 hideMonthlyAnnualToggle(); 3000 hideStarterPricingCard(); 3001 removeStarterFeatureColumn(); 3002 } 3003 3004 document.addEventListener('DOMContentLoaded', applyPricingChanges); 3005 window.addEventListener('load', applyPricingChanges); 3006 3007 setTimeout(applyPricingChanges, 300); 3008 setTimeout(applyPricingChanges, 1000); 3009 setTimeout(applyPricingChanges, 2000); 3010 3011 var observer = new MutationObserver(function () { 3012 applyPricingChanges(); 3013 }); 3014 3015 document.addEventListener('DOMContentLoaded', function () { 3016 var root = document.querySelector('#root') || document.body; 3017 3018 if (root) { 3019 observer.observe(root, { 3020 childList: true, 3021 subtree: true 3022 }); 3023 } 3024 }); 3025 })(); 3026 </script>
3026 3027 <style> 3028 body.paxflow-pricing-pro-popular .paxflow-old-price-no-strike { 3029 text-decoration: none !important; 3030 text-decoration-line: none !important; 3031 } 3032 3033 body.paxflow-pricing-pro-popular .paxflow-old-popular-badge { 3034 display: none !important; 3035 } 3036 3037 body.paxflow-pricing-pro-popular .paxflow-grow-unfeatured { 3038 border-color: #e5e7eb !important; 3039 box-shadow: 0 18px 40px rgba(15, 23, 42, 0.08) !important; 3040 background: #ffffff !important; 3041 } 3042 3043 body.paxflow-pricing-pro-popular .paxflow-pro-featured { 3044 position: relative !important; 3045 border: 2px solid #9333ea !important; 3046 box-shadow: 0 24px 60px rgba(147, 51, 234, 0.16) !important; 3047 background: #ffffff !important; 3048 overflow: visible !important; 3049 padding-top: 38px !important; 3050 } 3051 3052 body.paxflow-pricing-pro-popular .paxflow-pro-featured::before { 3053 content: "Most Popular"; 3054 position: absolute; 3055 top: -14px; 3056 left: 50%; 3057 transform: translateX(-50%); 3058 z-index: 5; 3059 display: inline-flex; 3060 align-items: center; 3061 justify-content: center; 3062 padding: 7px 18px; 3063 border-radius: 999px; 3064 background: linear-gradient(135deg, #9333ea 0%, #c215d3 100%); 3065 color: #ffffff; 3066 font-size: 14px; 3067 line-height: 1; 3068 font-weight: 800; 3069 white-space: nowrap; 3070 box-shadow: 0 12px 28px rgba(147, 51, 234, 0.28); 3071 } 3072 3073 body.paxflow-pricing-pro-popular .paxflow-grow-neutral-cta { 3074 background: #f3f4f6 !important; 3075 color: #111827 !important; 3076 box-shadow: none !important; 3077 border-color: transparent !important; 3078 } 3079 3080 body.paxflow-pricing-pro-popular .paxflow-pro-gradient-cta { 3081 background: linear-gradient(135deg, #9333ea 0%, #db2777 100%) !important; 3082 color: #ffffff !important; 3083 box-shadow: 0 12px 28px rgba(147, 51, 234, 0.24) !important; 3084 border-color: transparent !important; 3085 } 3086 3087 @media (max-width: 768px) { 3088 body.paxflow-pricing-pro-popular .paxflow-pro-featured { 3089 margin-top: 18px !important; 3090 } 3091 } 3092 </style> 3093 3094
3094<script> 3095 (function () { 3096 function isPricingPage() { 3097 var path = window.location.pathname.replace(/\/$/, ''); 3098 return path === '/pricing'; 3099 } 3100 3101 function normalise(text) { 3102 return (text || '').replace(/\s+/g, ' ').trim().toLowerCase(); 3103 } 3104 3105 function findPricingCard(planName, priceText) { 3106 var wantedPlan = planName.toLowerCase(); 3107 var wantedPrice = priceText.toLowerCase(); 3108 3109 var candidates = document.querySelectorAll('#root h1, #root h2, #root h3, #root div, #root span'); 3110 3111 for (var i = 0; i < candidates.length; i++) { 3112 var text = normalise(candidates[i].textContent); 3113 3114 if (text !== wantedPlan) continue; 3115 3116 var parent = candidates[i]; 3117 var steps = 0; 3118 3119 while (parent && steps < 8) { 3120 var parentText = normalise(parent.textContent); 3121 3122 if ( 3123 parentText.includes(wantedPlan) && 3124 parentText.includes(wantedPrice) && 3125 ( 3126 parentText.includes('try for free') || 3127 parentText.includes('talk to sales') 3128 ) 3129 ) { 3130 return parent; 3131 } 3132 3133 parent = parent.parentElement; 3134 steps++; 3135 } 3136 } 3137 3138 return null; 3139 } 3140 3141 function removeOnlyStrikethroughFromOldPrice(card) { 3142 if (!card) return; 3143 3144 card.querySelectorAll('*').forEach(function (el) { 3145 var text = normalise(el.textContent); 3146 var style = window.getComputedStyle(el); 3147 var decoration = style.textDecorationLine || style.textDecoration || ''; 3148 3149 var looksLikeOldPrice = 3150 text.match(/^â¬\s?\d+\s?\/\s?monthly$/) || 3151 text.includes('/monthly'); 3152 3153 var hasLineThrough = 3154 decoration.indexOf('line-through') !== -1 || 3155 ( 3156 typeof el.className === 'string' && 3157 el.className.toLowerCase().includes('line-through') 3158 ); 3159 3160 if (looksLikeOldPrice && hasLineThrough) { 3161 el.classList.add('paxflow-old-price-no-strike'); 3162 3163 el.style.setProperty('text-decoration', 'none', 'important'); 3164 el.style.setProperty('text-decoration-line', 'none', 'important'); 3165 3166 if (typeof el.className === 'string') { 3167 el.className = el.className 3168 .replace(/\bline-through\b/g, '') 3169 .replace(/\s+/g, ' ') 3170 .trim(); 3171 } 3172 } 3173 }); 3174 } 3175 3176 function neutraliseGrowCard(growCard) { 3177 if (!growCard) return; 3178 3179 growCard.classList.add('paxflow-grow-unfeatured'); 3180 3181 growCard.querySelectorAll('*').forEach(function (el) { 3182 var text = normalise(el.textContent); 3183 3184 if (text === 'most popular') { 3185 el.classList.add('paxflow-old-popular-badge'); 3186 } 3187 }); 3188 3189 growCard.querySelectorAll('a, button').forEach(function (btn) { 3190 var text = normalise(btn.textContent); 3191 3192 if (text === 'try for free') { 3193 btn.classList.add('paxflow-grow-neutral-cta'); 3194 } 3195 }); 3196 } 3197 3198 function featureProCard(proCard) { 3199 if (!proCard) return; 3200 3201 proCard.classList.add('paxflow-pro-featured'); 3202 3203 proCard.querySelectorAll('a, button').forEach(function (btn) { 3204 var text = normalise(btn.textContent); 3205 3206 if (text === 'try for free') { 3207 btn.classList.add('paxflow-pro-gradient-cta'); 3208 } 3209 }); 3210 } 3211 3212 function applyPricingChanges() { 3213 if (!isPricingPage()) return; 3214 3215 document.body.classList.add('paxflow-pricing-pro-popular'); 3216 3217 var growCard = findPricingCard('Grow', 'â¬366'); 3218 var proCard = findPricingCard('Pro', 'â¬650'); 3219 var enterpriseCard = findPricingCard('Enterprise', 'Custom'); 3220 3221 neutraliseGrowCard(growCard); 3222 featureProCard(proCard); 3223 3224 removeOnlyStrikethroughFromOldPrice(growCard); 3225 removeOnlyStrikethroughFromOldPrice(proCard); 3226 removeOnlyStrikethroughFromOldPrice(enterpriseCard); 3227 3228 document.querySelectorAll('#root *').forEach(function (el) { 3229 var text = normalise(el.textContent); 3230 var style = window.getComputedStyle(el); 3231 var decoration = style.textDecorationLine || style.textDecoration || ''; 3232 3233 if ( 3234 ( 3235 text.match(/^â¬\s?\d+\s?\/\s?monthly$/) || 3236 text.includes('/monthly') 3237 ) && 3238 decoration.indexOf('line-through') !== -1 3239 ) { 3240 el.classList.add('paxflow-old-price-no-strike'); 3241 el.style.setProperty('text-decoration', 'none', 'important'); 3242 el.style.setProperty('text-decoration-line', 'none', 'important'); 3243 } 3244 }); 3245 } 3246 3247 document.addEventListener('DOMContentLoaded', applyPricingChanges); 3248 window.addEventListener('load', applyPricingChanges); 3249 3250 setTimeout(applyPricingChanges, 300); 3251 setTimeout(applyPricingChanges, 1000); 3252 setTimeout(applyPricingChanges, 2000); 3253 3254 var observer = new MutationObserver(function () { 3255 applyPricingChanges(); 3256 }); 3257 3258 document.addEventListener('DOMContentLoaded', function () { 3259 var root = document.querySelector('#root') || document.body; 3260 3261 if (root) { 3262 observer.observe(root, { 3263 childList: true, 3264 subtree: true 3265 }); 3266 } 3267 }); 3268 })(); 3269 </script>
3269 3270 <style> 3271 .pf-react-footer-links.paxflow-footer-menu-managed { 3272 grid-column: span 3; 3273 display: grid; 3274 grid-template-columns: repeat(4, minmax(0, 1fr)); 3275 gap: 32px; 3276 } 3277 3278 .pf-react-footer-links.paxflow-footer-menu-managed a { 3279 display: block; 3280 color: #4b5563; 3281 font-size: 15px; 3282 line-height: 1.4; 3283 text-decoration: none; 3284 margin-bottom: 16px; 3285 } 3286 3287 .pf-react-footer-links.paxflow-footer-menu-managed a:hover { 3288 color: #111827; 3289 } 3290 3291 @media (max-width: 768px) { 3292 .pf-react-footer-links.paxflow-footer-menu-managed { 3293 grid-column: auto; 3294 grid-template-columns: repeat(2, minmax(0, 1fr)); 3295 gap: 20px 28px; 3296 } 3297 } 3298 </style> 3299 3300
3300<script> 3301 (function () { 3302 var items = [{"title":"About","url":"https:\/\/paxflow.io\/about\/","target":"","rel":""},{"title":"Privacy Policy","url":"https:\/\/paxflow.io\/privacy-policy\/","target":"","rel":""},{"title":"Customer Agreement","url":"https:\/\/paxflow.io\/customer-agreement\/","target":"","rel":""},{"title":"Insights","url":"https:\/\/paxflow.io\/insights\/","target":"","rel":""}]; 3303 var knownFooterTexts = ['about us', 'customer agreement', 'privacy policy', 'contact us', 'insights', 'bókun', 'bokun', 'iticket', 'other booking systems']; 3304 3305 function chunk(arr, size) { 3306 var out = []; 3307 for (var i = 0; i < arr.length; i += size) { 3308 out.push(arr.slice(i, i + size)); 3309 } 3310 return out; 3311 } 3312 3313 function buildMenu() { 3314 var wrapper = document.createElement('div'); 3315 wrapper.className = 'pf-react-footer-links paxflow-footer-menu-managed'; 3316 3317 chunk(items, 2).forEach(function (group) { 3318 var col = document.createElement('div'); 3319 3320 group.forEach(function (item) { 3321 var a = document.createElement('a'); 3322 a.textContent = item.title || ''; 3323 a.href = item.url || '#'; 3324 3325 if (item.target) { 3326 a.target = item.target; 3327 } 3328 3329 if (item.rel) { 3330 a.rel = item.rel; 3331 } else if (item.target === '_blank') { 3332 a.rel = 'noopener noreferrer'; 3333 } 3334 3335 col.appendChild(a); 3336 }); 3337 3338 wrapper.appendChild(col); 3339 }); 3340 3341 return wrapper; 3342 } 3343 3344 function replaceContainer(container) { 3345 if (!container || container.dataset.paxflowFooterManaged === 'true') return; 3346 3347 var fresh = buildMenu(); 3348 fresh.dataset.paxflowFooterManaged = 'true'; 3349 3350 container.replaceWith(fresh); 3351 } 3352 3353 function commonAncestor(elements) { 3354 if (!elements.length) return null; 3355 3356 var firstAncestors = []; 3357 var node = elements[0]; 3358 3359 while (node) { 3360 firstAncestors.push(node); 3361 node = node.parentElement; 3362 } 3363 3364 for (var i = 0; i < firstAncestors.length; i++) { 3365 var candidate = firstAncestors[i]; 3366 var ok = elements.every(function (el) { 3367 return candidate.contains(el); 3368 }); 3369 3370 if (ok) return candidate; 3371 } 3372 3373 return null; 3374 } 3375 3376 function applyFooterMenu() { 3377 if (!items || !items.length) return; 3378 3379 document.querySelectorAll('.pf-react-footer-links').forEach(function (container) { 3380 replaceContainer(container); 3381 }); 3382 3383 document.querySelectorAll('footer').forEach(function (footer) { 3384 if (footer.querySelector('.paxflow-footer-menu-managed')) return; 3385 3386 var footerLinks = Array.prototype.slice.call(footer.querySelectorAll('a')).filter(function (a) { 3387 var text = (a.textContent || '').trim().toLowerCase(); 3388 return knownFooterTexts.indexOf(text) !== -1; 3389 }); 3390 3391 if (footerLinks.length >= 2) { 3392 var container = commonAncestor(footerLinks); 3393 3394 if (container && container !== footer && container.parentNode) { 3395 replaceContainer(container); 3396 return; 3397 } 3398 } 3399 }); 3400 } 3401 3402 document.addEventListener('DOMContentLoaded', applyFooterMenu); 3403 window.addEventListener('load', applyFooterMenu); 3404 setTimeout(applyFooterMenu, 300); 3405 setTimeout(applyFooterMenu, 1000); 3406 setTimeout(applyFooterMenu, 2000); 3407 3408 var observer = new MutationObserver(function () { 3409 applyFooterMenu(); 3410 }); 3411 3412 document.addEventListener('DOMContentLoaded', function () { 3413 if (document.body) { 3414 observer.observe(document.body, { childList: true, subtree: true }); 3415 } 3416 }); 3417 })(); 3418 </script>
3418 3419 <style> 3420 footer, 3421 .pf-react-footer, 3422 .site-footer { 3423 position: relative !important; 3424 } 3425 3426 .paxflow-footer-extra-image { 3427 position: absolute !important; 3428 right: 48px !important; 3429 bottom: 48px !important; 3430 width: 150px !important; 3431 max-width: 20vw !important; 3432 height: auto !important; 3433 z-index: 5 !important; 3434 display: block !important; 3435 pointer-events: none !important; 3436 } 3437 3438 @media (max-width: 768px) { 3439 .paxflow-footer-extra-image { 3440 position: static !important; 3441 width: 120px !important; 3442 max-width: 160px !important; 3443 margin: 28px auto 0 !important; 3444 } 3445 } 3446 </style> 3447 3448
3448<script> 3449 (function () { 3450 var CONTACT_URL = '/contact/'; 3451 var FOOTER_IMAGE_URL = 'https://paxflownewtdev.wpenginepowered.com/wp-content/uploads/2026/06/image-7.png'; 3452 3453 function cleanText(value) { 3454 return String(value || '').replace(/\s+/g, ' ').trim(); 3455 } 3456 3457 function normalisedText(value) { 3458 return cleanText(value).toLowerCase(); 3459 } 3460 3461 function currentPath() { 3462 return (window.location.pathname || '/').replace(/\/+$/, '') || '/'; 3463 } 3464 3465 function isPlatformPage() { 3466 return currentPath() === '/platform'; 3467 } 3468 3469 function isInsideHeader(el) { 3470 return !!( 3471 el.closest('#paxflow-wp-desktop-header') || 3472 el.closest('#paxflow-wp-mobile-header') || 3473 el.closest('header') || 3474 el.closest('nav') 3475 ); 3476 } 3477 3478 function forceElementToContact(el) { 3479 if (!el) return; 3480 3481 var anchor = el.tagName && el.tagName.toLowerCase() === 'a' 3482 ? el 3483 : el.closest('a'); 3484 3485 if (anchor) { 3486 anchor.setAttribute('href', CONTACT_URL); 3487 anchor.removeAttribute('target'); 3488 anchor.removeAttribute('rel'); 3489 return; 3490 } 3491 3492 if (el.dataset.paxflowContactForced === '1') return; 3493 3494 el.dataset.paxflowContactForced = '1'; 3495 el.setAttribute('role', 'link'); 3496 el.setAttribute('tabindex', '0'); 3497 el.style.cursor = 'pointer'; 3498 3499 el.addEventListener('click', function (event) { 3500 event.preventDefault(); 3501 event.stopPropagation(); 3502 window.location.href = CONTACT_URL; 3503 }, true); 3504 3505 el.addEventListener('keydown', function (event) { 3506 if (event.key === 'Enter' || event.key === ' ') { 3507 event.preventDefault(); 3508 window.location.href = CONTACT_URL; 3509 } 3510 }); 3511 } 3512 3513 function fixOnPageBookDemoButtons() { 3514 document.querySelectorAll('#root a, #root button, main a, main button, [role="button"]').forEach(function (el) { 3515 if (isInsideHeader(el)) return; 3516 3517 var text = normalisedText(el.textContent); 3518 3519 if (text === 'book demo' || text === 'book a demo') { 3520 forceElementToContact(el); 3521 } 3522 }); 3523 } 3524 3525 function addFooterImage() { 3526 if (document.querySelector('.paxflow-footer-extra-image')) return; 3527 3528 var footer = 3529 document.querySelector('.pf-react-footer') || 3530 document.querySelector('#root footer') || 3531 document.querySelector('footer') || 3532 document.querySelector('.site-footer'); 3533 3534 if (!footer) return; 3535 3536 var img = document.createElement('img'); 3537 img.className = 'paxflow-footer-extra-image'; 3538 img.src = FOOTER_IMAGE_URL; 3539 img.alt = ''; 3540 img.loading = 'lazy'; 3541 3542 footer.appendChild(img); 3543 } 3544 3545 function findExactTextElement(label) { 3546 var wanted = label.toLowerCase(); 3547 3548 var candidates = document.querySelectorAll( 3549 '#root h1, #root h2, #root h3, #root h4, #root h5, #root p, #root span, #root a, #root div' 3550 ); 3551 3552 for (var i = 0; i < candidates.length; i++) { 3553 var el = candidates[i]; 3554 3555 if (el.children.length > 4) continue; 3556 3557 if (normalisedText(el.textContent) === wanted) { 3558 return el; 3559 } 3560 } 3561 3562 return null; 3563 } 3564 3565 function getMoveableBlock(el) { 3566 if (!el) return null; 3567 3568 var current = el; 3569 3570 for (var i = 0; i < 8 && current; i++) { 3571 var parent = current.parentElement; 3572 var className = typeof current.className === 'string' ? current.className : ''; 3573 var textLength = cleanText(current.textContent).length; 3574 var tagName = current.tagName ? current.tagName.toLowerCase() : ''; 3575 3576 if ( 3577 parent && 3578 parent.children.length >= 3 && 3579 textLength > 20 && 3580 textLength < 2500 && 3581 ( 3582 className.indexOf('rounded') !== -1 || 3583 className.indexOf('shadow') !== -1 || 3584 className.indexOf('border') !== -1 || 3585 className.indexOf('card') !== -1 || 3586 tagName === 'article' || 3587 tagName === 'section' 3588 ) 3589 ) { 3590 return current; 3591 } 3592 3593 current = parent; 3594 } 3595 3596 return null; 3597 } 3598 3599 function reorderPlatformSections() { 3600 if (!isPlatformPage()) return; 3601 3602 var labels = [ 3603 'Customer messaging', 3604 'Customer self-service', 3605 'Booking forms' 3606 ]; 3607 3608 function textMatches(el, label) { 3609 return normalisedText(el.textContent) === label.toLowerCase(); 3610 } 3611 3612 function findLabelElement(label) { 3613 var candidates = document.querySelectorAll( 3614 '#root h1, #root h2, #root h3, #root h4, #root h5, #root p, #root span, #root a, #root div' 3615 ); 3616 3617 for (var i = 0; i < candidates.length; i++) { 3618 var el = candidates[i]; 3619 3620 if (el.children.length > 6) continue; 3621 3622 if (textMatches(el, label)) { 3623 return el; 3624 } 3625 } 3626 3627 return null; 3628 } 3629 3630 function nearestUsefulSection(el) { 3631 if (!el) return null; 3632 3633 var current = el; 3634 3635 while (current && current !== document.body) { 3636 if ( 3637 current.tagName && 3638 current.tagName.toLowerCase() === 'section' && 3639 current.parentElement && 3640 current.parentElement.children.length > 2 3641 ) { 3642 return current; 3643 } 3644 3645 current = current.parentElement; 3646 } 3647 3648 return null; 3649 } 3650 3651 function nearestUsefulCard(el) { 3652 if (!el) return null; 3653 3654 var current = el; 3655 3656 for (var i = 0; i < 10 && current && current !== document.body; i++) { 3657 var parent = current.parentElement; 3658 var className = typeof current.className === 'string' ? current.className : ''; 3659 var textLength = cleanText(current.textContent).length; 3660 var tagName = current.tagName ? current.tagName.toLowerCase() : ''; 3661 3662 if ( 3663 parent && 3664 parent.children.length > 2 && 3665 textLength > 20 && 3666 textLength < 3000 && 3667 ( 3668 tagName === 'article' || 3669 tagName === 'li' || 3670 className.indexOf('rounded') !== -1 || 3671 className.indexOf('shadow') !== -1 || 3672 className.indexOf('border') !== -1 || 3673 className.indexOf('card') !== -1 || 3674 className.indexOf('grid') !== -1 3675 ) 3676 ) { 3677 return current; 3678 } 3679 3680 current = parent; 3681 } 3682 3683 return null; 3684 } 3685 3686 var found = labels.map(function (label) { 3687 var labelEl = findLabelElement(label); 3688 3689 return { 3690 label: label, 3691 labelEl: labelEl, 3692 section: nearestUsefulSection(labelEl), 3693 card: nearestUsefulCard(labelEl) 3694 }; 3695 }); 3696 3697 if (found.some(function (item) { return !item.labelEl; })) { 3698 return; 3699 } 3700 3701 /* 3702 * First try to move whole page sections. 3703 * This is the preferred path if each feature is its own Platform section. 3704 */ 3705 var sectionBlocks = found.map(function (item) { 3706 return item.section; 3707 }
3707).filter(Boolean); 3708 3709 if (sectionBlocks.length === labels.length) { 3710 var sectionParent = sectionBlocks[0].parentElement; 3711 3712 var sameSectionParent = sectionBlocks.every(function (section) { 3713 return section.parentElement === sectionParent; 3714 }); 3715 3716 var uniqueSections = Array.from(new Set(sectionBlocks)); 3717 3718 if (sameSectionParent && uniqueSections.length === labels.length) { 3719 sectionBlocks.forEach(function (section) { 3720 sectionParent.appendChild(section); 3721 }); 3722 3723 return; 3724 } 3725 } 3726 3727 /* 3728 * Fallback: move feature cards/blocks if the items are inside a shared grid. 3729 */ 3730 var cardBlocks = found.map(function (item) { 3731 return item.card; 3732 }).filter(Boolean); 3733 3734 if (cardBlocks.length !== labels.length) { 3735 return; 3736 } 3737 3738 var cardParent = cardBlocks[0].parentElement; 3739 3740 if (!cardParent) { 3741 return; 3742 } 3743 3744 var sameCardParent = cardBlocks.every(function (card) { 3745 return card.parentElement === cardParent; 3746 }); 3747 3748 var uniqueCards = Array.from(new Set(cardBlocks)); 3749 3750 if (!sameCardParent || uniqueCards.length !== labels.length) { 3751 return; 3752 } 3753 3754 cardBlocks.forEach(function (card) { 3755 cardParent.appendChild(card); 3756 }); 3757} 3758 3759 function applyFixes() { 3760 fixOnPageBookDemoButtons(); 3761 addFooterImage(); 3762 reorderPlatformSections(); 3763 } 3764 3765 function startFixes() { 3766 applyFixes(); 3767 3768 var attempts = 0; 3769 var timer = window.setInterval(function () { 3770 attempts += 1; 3771 applyFixes(); 3772 3773 if (attempts >= 20) { 3774 window.clearInterval(timer); 3775 } 3776 }, 250); 3777 } 3778 3779 if (document.readyState === 'loading') { 3780 document.addEventListener('DOMContentLoaded', startFixes); 3781 } else { 3782 startFixes(); 3783 } 3784 3785 window.addEventListener('load', startFixes); 3786 })(); 3787 </script>
3787 3788
3788<script> 3789 (function () { 3790 function isPricingPage() { 3791 return window.location.pathname.replace(/\/$/, '') === '/pricing'; 3792 } 3793 3794 function cleanText(text) { 3795 return (text || '').replace(/\s+/g, ' ').trim().toLowerCase(); 3796 } 3797 3798 /* 3799 * EDIT THIS LIST ONLY. 3800 * This becomes the full Grow bullet list. 3801 */ 3802 var growBullets = [ 3803 'PaxPlanner', 3804 'PaxCRM', 3805 'PaxForms', 3806 'Advanced operational reporting', 3807 'Everything in Starter, plus:', 3808 '5,000 emails/month', 3809 '2,500 form responses/month', 3810 '1-hour free onboarding session' 3811 ]; 3812 3813 function findGrowCard() { 3814 var headings = Array.from(document.querySelectorAll('#root h1, #root h2, #root h3, #root h4, #root div, #root span')); 3815 3816 for (var i = 0; i < headings.length; i++) { 3817 if (cleanText(headings[i].textContent) !== 'grow') continue; 3818 3819 var el = headings[i]; 3820 3821 for (var step = 0; step < 10; step++) { 3822 if (!el) break; 3823 3824 var text = cleanText(el.textContent); 3825 3826 if ( 3827 text.includes('grow') && 3828 text.includes('â¬450') && 3829 text.includes('/month') && 3830 text.includes('try for free') && 3831 text.includes('2,500 monthly pax') && 3832 !text.includes('pro') && 3833 !text.includes('enterprise') && 3834 el.querySelector('ul') 3835 ) { 3836 return el; 3837 } 3838 3839 el = el.parentElement; 3840 } 3841 } 3842 3843 return null; 3844 } 3845 3846 function createGrowBullet(text) { 3847 var li = document.createElement('li'); 3848 li.setAttribute('data-paxflow-grow-clean-bullet', 'true'); 3849 li.style.cssText = 'display:flex;align-items:flex-start;gap:12px;color:#374151;font-size:15px;line-height:1.45;text-align:left;'; 3850 3851 var icon = document.createElement('span'); 3852 icon.style.cssText = 'width:20px;height:20px;min-width:20px;border-radius:999px;background:#dcfce7;color:#16a34a;display:flex;align-items:center;justify-content:center;margin-top:1px;'; 3853 3854 icon.innerHTML = 3855 '<svg style="width:12px;height:12px;" fill="none" stroke="currentColor" viewBox="0 0 24 24">' + 3856 '<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path>' + 3857 '</svg>'; 3858 3859 var label = document.createElement('span'); 3860 label.textContent = text; 3861 3862 li.appendChild(icon); 3863 li.appendChild(label); 3864 3865 return li; 3866 } 3867 3868 function rebuildGrowBullets() { 3869 if (!isPricingPage()) return false; 3870 3871 var growCard = findGrowCard(); 3872 if (!growCard) return false; 3873 3874 var list = growCard.querySelector('ul'); 3875 if (!list) return false; 3876 3877 list.innerHTML = ''; 3878 3879 growBullets.forEach(function (bulletText) { 3880 list.appendChild(createGrowBullet(bulletText)); 3881 }); 3882 3883 return true; 3884 } 3885 3886 function runLimited() { 3887 var attempts = 0; 3888 var maxAttempts = 20; 3889 3890 var timer = setInterval(function () { 3891 attempts++; 3892 3893 var success = rebuildGrowBullets(); 3894 3895 if (success || attempts >= maxAttempts) { 3896 clearInterval(timer); 3897 } 3898 }, 250); 3899 } 3900 3901 document.addEventListener('DOMContentLoaded', runLimited); 3902 window.addEventListener('load', function () { 3903 rebuildGrowBullets(); 3904 setTimeout(rebuildGrowBullets, 750); 3905 setTimeout(rebuildGrowBullets, 1500); 3906 }); 3907 })(); 3908 </script>
3908 3909
3909<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a46e1a1e79bef157',t:'MTc5MTM4ODY1MQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
3909</body> 3910</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.