{"id":1309,"date":"2026-07-22T06:03:44","date_gmt":"2026-07-22T06:03:44","guid":{"rendered":"https:\/\/panosky.com\/?page_id=1309"},"modified":"2026-08-25T08:29:39","modified_gmt":"2026-08-25T08:29:39","slug":"the-value","status":"publish","type":"page","link":"https:\/\/panosky.com\/?page_id=1309","title":{"rendered":"The Value"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1309\" class=\"elementor elementor-1309\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5003c11 e-con e-atomic-element e-flexbox-base e-5003c11-ab834b2 \" data-id=\"5003c11\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"5003c11\" data-e-type=\"e-flexbox\" data-id=\"5003c11\">\n    <div class=\"elementor-element elementor-element-0e359a5 ps-map-hero e-flex e-con-boxed e-con e-parent\" data-id=\"0e359a5\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;background_motion_fx_motion_fx_scrolling&quot;:&quot;yes&quot;,&quot;background_motion_fx_scale_effect&quot;:&quot;yes&quot;,&quot;background_motion_fx_scale_speed&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:3,&quot;sizes&quot;:[]},&quot;background_motion_fx_scale_range&quot;:{&quot;unit&quot;:&quot;%&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:{&quot;start&quot;:53,&quot;end&quot;:100}},&quot;background_motion_fx_scale_direction&quot;:&quot;out-in&quot;,&quot;background_motion_fx_devices&quot;:[&quot;desktop&quot;,&quot;tablet&quot;,&quot;mobile&quot;]}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-33f12f2 e-con-full e-flex e-con e-child\" data-id=\"33f12f2\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-931b9ed elementor-widget elementor-widget-button\" data-id=\"931b9ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">THE VALUE<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a80e9eb elementor-widget elementor-widget-heading\" data-id=\"a80e9eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Turn Spacial<br>Experience into<br>Measuarable <span class=\"animated-global\">Revenue.<\/span><\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a5bbe4b elementor-widget elementor-widget-heading\" data-id=\"a5bbe4b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Shorten sales cycles. Build buyer confidence.<br>Create value across every channel.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e308feb elementor-widget elementor-widget-heading\" data-id=\"e308feb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\"><span class=\"pano-dot\">&bull;<\/span> TRUST <span class=\"pano-dot\">&bull;<\/span> CONFIDENCE<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9819009 e-con-full e-flex e-con e-child\" data-id=\"9819009\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f8dfbec elementor-widget elementor-widget-html\" data-id=\"f8dfbec\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\nPanoSky 360 Value Lens v6 \u2014 Soft Edge Responsive Overflow\r\nPaste this entire file into one Elementor HTML widget.\r\nPanorama requirements:\r\n- Equirectangular 360 image, normally 2:1 (for example 8000 x 4000)\r\n- Host on the same domain where possible, or use a server that permits CORS -->\r\n<div class=\"psv360-widget\" data-psv360-v4-widget>\r\n<div\r\nclass=\"psv360-stage\"\r\nrole=\"application\"\r\naria-label=\"Interactive 360 degree panorama. Drag horizontally to look around.\"\r\n>\r\n<svg class=\"psv360-rings\" viewBox=\"0 0 1000 1000\" aria-hidden=\"true\">\r\n<defs>\r\n<linearGradient\r\ndata-psv360-arc-gradient=\"before\"\r\nx1=\"285\"\r\ny1=\"872.39\"\r\nx2=\"930\"\r\ny2=\"500\"\r\ngradientUnits=\"userSpaceOnUse\"\r\n>\r\n<stop offset=\"0\" stop-color=\"#1768ff\" stop-opacity=\"0\" \/>\r\n<stop offset=\"0.45\" stop-color=\"#1768ff\" stop-opacity=\"0.12\" \/>\r\n<stop offset=\"0.78\" stop-color=\"#2587ff\" stop-opacity=\"0.72\" \/>\r\n<stop offset=\"1\" stop-color=\"#50c8ff\" stop-opacity=\"1\" \/>\r\n<\/linearGradient>\r\n\r\n\r\n\r\n<linearGradient\r\n\r\ndata-psv360-arc-gradient=\"after\"\r\n\r\nx1=\"930\"\r\n\r\ny1=\"500\"\r\n\r\nx2=\"285\"\r\n\r\ny2=\"127.61\"\r\n\r\ngradientUnits=\"userSpaceOnUse\"\r\n\r\n>\r\n\r\n<stop offset=\"0\" stop-color=\"#50c8ff\" stop-opacity=\"1\" \/>\r\n\r\n<stop offset=\"0.22\" stop-color=\"#2587ff\" stop-opacity=\"0.72\" \/>\r\n\r\n<stop offset=\"0.55\" stop-color=\"#1768ff\" stop-opacity=\"0.12\" \/>\r\n\r\n<stop offset=\"1\" stop-color=\"#1768ff\" stop-opacity=\"0\" \/>\r\n\r\n<\/linearGradient>\r\n\r\n\r\n<filter data-psv360-glow-filter x=\"-80%\" y=\"-80%\" width=\"260%\" height=\"260%\">\r\n\r\n<feGaussianBlur stdDeviation=\"11\" result=\"blur\" \/>\r\n\r\n<feMerge>\r\n\r\n<feMergeNode in=\"blur\" \/>\r\n\r\n<feMergeNode in=\"SourceGraphic\" \/>\r\n\r\n<\/feMerge>\r\n\r\n<\/filter>\r\n\r\n<\/defs>\r\n\r\n\r\n<circle class=\"psv360-ring psv360-ring-a\" cx=\"500\" cy=\"500\" r=\"390\" \/>\r\n\r\n<circle class=\"psv360-ring psv360-ring-b\" cx=\"500\" cy=\"500\" r=\"425\" \/>\r\n\r\n<circle class=\"psv360-ring psv360-ring-c\" cx=\"500\" cy=\"500\" r=\"460\" \/>\r\n\r\n\r\n<g data-psv360-compass-rotor>\r\n\r\n<g class=\"psv360-axis-lines\">\r\n\r\n<line x1=\"500\" y1=\"145\" x2=\"500\" y2=\"67\" \/>\r\n\r\n<line x1=\"855\" y1=\"500\" x2=\"933\" y2=\"500\" \/>\r\n\r\n<line x1=\"500\" y1=\"855\" x2=\"500\" y2=\"933\" \/>\r\n\r\n<line x1=\"145\" y1=\"500\" x2=\"67\" y2=\"500\" \/>\r\n\r\n\r\n<circle cx=\"500\" cy=\"145\" r=\"4\" \/>\r\n\r\n<circle cx=\"855\" cy=\"500\" r=\"4\" \/>\r\n\r\n<circle cx=\"500\" cy=\"855\" r=\"4\" \/>\r\n\r\n<circle cx=\"145\" cy=\"500\" r=\"4\" \/>\r\n\r\n<\/g>\r\n\r\n<\/g>\r\n\r\n\r\n<g data-psv360-glow-rotor>\r\n\r\n<path\r\n\r\ndata-psv360-glow-arc=\"before\"\r\n\r\nclass=\"psv360-glow-arc\"\r\n\r\nd=\"M 285 872.39 A 430 430 0 0 0 930 500\"\r\n\r\n\/>\r\n\r\n<path\r\n\r\ndata-psv360-glow-arc=\"after\"\r\n\r\nclass=\"psv360-glow-arc\"\r\n\r\nd=\"M 930 500 A 430 430 0 0 0 285 127.61\"\r\n\r\n\/>\r\n\r\n<circle class=\"psv360-dot-halo\" cx=\"930\" cy=\"500\" r=\"24\" \/>\r\n\r\n<circle class=\"psv360-dot-glow\" cx=\"930\" cy=\"500\" r=\"12\" \/>\r\n\r\n<circle class=\"psv360-dot-core\" cx=\"930\" cy=\"500\" r=\"5\" \/>\r\n\r\n<\/g>\r\n<\/svg>\r\n\r\n<div class=\"psv360-viewer\" data-psv360-viewer tabindex=\"0\">\r\n\r\n<div class=\"psv360-status\" data-psv360-status>Loading 360\u00b0<\/div>\r\n\r\n\r\n<div class=\"psv360-reticle\" aria-hidden=\"true\">\r\n\r\n<span class=\"psv360-crosshair psv360-crosshair-x\"><\/span>\r\n\r\n<span class=\"psv360-crosshair psv360-crosshair-y\"><\/span>\r\n\r\n<span class=\"psv360-target psv360-target-outer\"><\/span>\r\n\r\n<span class=\"psv360-target psv360-target-inner\"><\/span>\r\n\r\n<span class=\"psv360-target-dot\"><\/span>\r\n\r\n<\/div>\r\n<\/div>\r\n\r\n<div class=\"psv360-cardinals\" aria-hidden=\"true\">\r\n\r\n<span class=\"psv360-cardinal\" data-base-angle=\"-90\">N<\/span>\r\n\r\n<span class=\"psv360-cardinal\" data-base-angle=\"0\">E<\/span>\r\n\r\n<span class=\"psv360-cardinal\" data-base-angle=\"90\">S<\/span>\r\n\r\n<span class=\"psv360-cardinal\" data-base-angle=\"180\">W<\/span>\r\n<\/div>\r\n\r\n\r\n<\/div> <\/div>\r\n<style>\r\n\/* =========================================================\r\nPANOSKY 360 VALUE LENS v6 \u2014 SOFT EDGE + RESPONSIVE OVERFLOW\r\nTransparent outside the circular panorama.\r\n========================================================= *\/\r\n.psv360-widget,\r\n.psv360-widget * {\r\nbox-sizing: border-box;\r\n}\r\n.psv360-widget {\r\nposition: relative;\r\n--psv360-viewer-size: 100%;\r\n--psv360-layout-height: auto;\r\n--psv360-ring-color: rgba(151, 187, 233, 0.17);\r\n--psv360-line-color: rgba(237, 247, 255, 0.31);\r\n--psv360-label-color: #f5f9ff;\r\n--psv360-blue: #1672ff;\r\nwidth: 100%;\r\nmax-width: 100%;\r\nheight: var(--psv360-layout-height);\r\nmin-height: var(--psv360-layout-height);\r\noverflow: visible;\r\nisolation: isolate;\r\nbackground: transparent !important;\r\nfont-family: var(\r\n--e-global-typography-primary-font-family,\r\n\"Satoshi\",\r\nInter,\r\nsystem-ui,\r\nsans-serif\r\n);\r\n}\r\n.psv360-stage {\r\nposition: absolute;\r\nwidth: 100%;\r\nheight: auto;\r\naspect-ratio: 1 \/ 1;\r\nleft: 50%;\r\ntop: 50%;\r\nmargin: 0;\r\ntransform: translate(-50%, -50%);\r\nbackground: transparent;\r\nuser-select: none;\r\n-webkit-user-select: none;\r\ncursor: grab;\r\ntouch-action: pan-y pinch-zoom;\r\n-webkit-tap-highlight-color: transparent;\r\n}\r\n.psv360-stage.is-dragging {\r\ncursor: grabbing;\r\n}\r\n.psv360-rings {\r\nposition: absolute;\r\ninset: 0;\r\nz-index: 2;\r\nwidth: 100%;\r\nheight: 100%;\r\noverflow: visible;\r\npointer-events: none;\r\n}\r\n.psv360-ring {\r\nfill: none;\r\nstroke: var(--psv360-ring-color);\r\nstroke-width: 1.25;\r\nvector-effect: non-scaling-stroke;\r\n}\r\n.psv360-ring-b {\r\nopacity: 0.78;\r\n}\r\n.psv360-ring-c {\r\nopacity: 0.54;\r\n}\r\n.psv360-axis-lines line {\r\nstroke: rgba(239, 248, 255, 0.37);\r\nstroke-width: 1;\r\nvector-effect: non-scaling-stroke;\r\n}\r\n.psv360-axis-lines circle {\r\nfill: rgba(255, 255, 255, 0.9);\r\nfilter: drop-shadow(0 0 4px rgba(255, 255, 255, 0.55));\r\n}\r\n.psv360-glow-arc {\r\nfill: none;\r\nstroke-width: 2.2;\r\nstroke-linecap: round;\r\nvector-effect: non-scaling-stroke;\r\nfilter: drop-shadow(0 0 5px rgba(30, 113, 255, 0.9));\r\n}\r\n.psv360-dot-halo {\r\nfill: rgba(23, 113, 255, 0.22);\r\n}\r\n.psv360-dot-glow {\r\nfill: #1474ff;\r\nfilter: drop-shadow(0 0 13px #0e6cff) drop-shadow(0 0 22px #2196ff);\r\n}\r\n.psv360-dot-core {\r\nfill: #f7fdff;\r\n}\r\n.psv360-viewer {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\nz-index: 1;\r\nwidth: var(--psv360-viewer-size);\r\naspect-ratio: 1 \/ 1;\r\ntransform: translate(-50%, -50%);\r\noverflow: hidden;\r\nborder: 1px solid rgba(239, 248, 255, 0.58);\r\nborder-radius: 50%;\r\nbackground: rgba(1, 24, 65, 0.12);\r\nbox-shadow:\r\ninset 0 0 0 1px rgba(1, 12, 31, 0.35),\r\n0 0 0 1px rgba(7, 45, 100, 0.14);\r\ncursor: inherit;\r\ntouch-action: pan-y pinch-zoom;\r\n-webkit-tap-highlight-color: transparent;\r\noutline: none;\r\n}\r\n.psv360-viewer:focus-visible {\r\nbox-shadow:\r\ninset 0 0 0 1px rgba(1, 12, 31, 0.35),\r\n0 0 0 2px rgba(45, 134, 255, 0.75),\r\n0 0 18px rgba(26, 113, 255, 0.4);\r\n}\r\n.psv360-viewer canvas {\r\nposition: absolute;\r\ninset: 0;\r\ndisplay: block;\r\nwidth: 100% !important;\r\nheight: 100% !important;\r\nborder-radius: inherit;\r\n}\r\n.psv360-status {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\nz-index: 6;\r\nmax-width: 76%;\r\ntransform: translate(-50%, -50%);\r\ncolor: rgba(245, 249, 255, 0.82);\r\nfont-size: clamp(10px, 1.5vw, 13px);\r\nfont-weight: 500;\r\nletter-spacing: 0.08em;\r\ntext-align: center;\r\ntext-transform: uppercase;\r\ntransition: opacity 300ms ease;\r\npointer-events: none;\r\n}\r\n.psv360-status.is-hidden {\r\nopacity: 0;\r\n}\r\n.psv360-status.is-error {\r\ncolor: rgba(245, 249, 255, 0.9);\r\nline-height: 1.45;\r\nletter-spacing: 0.02em;\r\ntext-transform: none;\r\n}\r\n.psv360-reticle {\r\nposition: absolute;\r\ninset: 0;\r\nz-index: 5;\r\noverflow: hidden;\r\nborder-radius: inherit;\r\npointer-events: none;\r\n}\r\n.psv360-crosshair {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\ndisplay: block;\r\nbackground: var(--psv360-line-color);\r\ntransform: translate(-50%, -50%);\r\n}\r\n.psv360-crosshair-x {\r\nwidth: 100%;\r\nheight: 0.65px;\r\n-webkit-mask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);\r\nmask-image: linear-gradient(90deg, transparent, #000 15%, #000 85%, transparent);\r\n}\r\n.psv360-crosshair-y {\r\nwidth: 0.65px;\r\nheight: 100%;\r\n-webkit-mask-image: linear-gradient(transparent, #000 15%, #000 85%, transparent);\r\nmask-image: linear-gradient(transparent, #000 15%, #000 85%, transparent);\r\n}\r\n.psv360-target {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\ndisplay: block;\r\naspect-ratio: 1;\r\ntransform: translate(-50%, -50%);\r\nborder: 0.65px solid rgba(245, 250, 255, 0.44);\r\nborder-radius: 50%;\r\n}\r\n.psv360-target-outer {\r\nwidth: 18%;\r\n}\r\n.psv360-target-inner {\r\nwidth: 5.5%;\r\nopacity: 0.72;\r\n}\r\n.psv360-target-dot {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\nwidth: 3px;\r\nheight: 3px;\r\ntransform: translate(-50%, -50%);\r\nborder-radius: 50%;\r\nbackground: rgba(255, 255, 255, 0.92);\r\nbox-shadow: 0 0 7px rgba(255, 255, 255, 0.55);\r\n}\r\n.psv360-cardinals {\r\nposition: absolute;\r\ninset: 0;\r\nz-index: 4;\r\npointer-events: none;\r\n}\r\n.psv360-cardinal {\r\nposition: absolute;\r\nleft: 50%;\r\ntop: 50%;\r\ndisplay: block;\r\ncolor: var(--psv360-label-color);\r\nfont-size: clamp(10px, 1.8vw, 17px);\r\nfont-weight: 700;\r\nline-height: 1;\r\ntext-shadow: 0 0 7px rgba(222, 241, 255, 0.42);\r\nwill-change: transform;\r\n}\r\n@media (max-width: 767px) {\r\n.psv360-widget {\r\n--psv360-viewer-size: 100%;\r\n}\r\n.psv360-ring {\r\nstroke-width: 0.85;\r\n}\r\n.psv360-glow-arc {\r\nstroke-width: 1.7;\r\n}\r\n.psv360-axis-lines line {\r\nstroke-width: 0.75;\r\n}\r\n}\r\n@media (prefers-reduced-motion: reduce) {\r\n.psv360-widget .psv360-status {\r\ntransition: none;\r\n}\r\n} \r\n\r\n  \/* =========================================================\r\n     VISUAL UPDATE \u2014 MINIMAL SOFT-EDGE VIEWER\r\n     Change --psv360-edge-fade-start to control the feather:\r\n     70% = wider\/softer fade, 85% = narrower fade.\r\n     ========================================================= *\/\r\n  .psv360-widget {\r\n    --psv360-edge-fade-start: 76%;\r\n  }\r\n\r\n  \/* Remove all decorative graphics around the panorama. *\/\r\n  .psv360-rings,\r\n  .psv360-cardinals {\r\n    display: none !important;\r\n  }\r\n\r\n  \/* Remove the hard circular boundary and feather the panorama to transparent. *\/\r\n  .psv360-viewer,\r\n  .psv360-viewer:focus-visible {\r\n    border: 0;\r\n    box-shadow: none;\r\n    -webkit-mask-image: radial-gradient(\r\n      circle closest-side at center,\r\n      #000 0%,\r\n      #000 var(--psv360-edge-fade-start),\r\n      rgba(0, 0, 0, 0.94) 82%,\r\n      rgba(0, 0, 0, 0.72) 88%,\r\n      rgba(0, 0, 0, 0.42) 93%,\r\n      rgba(0, 0, 0, 0.16) 97%,\r\n      transparent 100%\r\n    );\r\n    mask-image: radial-gradient(\r\n      circle closest-side at center,\r\n      #000 0%,\r\n      #000 var(--psv360-edge-fade-start),\r\n      rgba(0, 0, 0, 0.94) 82%,\r\n      rgba(0, 0, 0, 0.72) 88%,\r\n      rgba(0, 0, 0, 0.42) 93%,\r\n      rgba(0, 0, 0, 0.16) 97%,\r\n      transparent 100%\r\n    );\r\n    -webkit-mask-repeat: no-repeat;\r\n    mask-repeat: no-repeat;\r\n    -webkit-mask-size: 100% 100%;\r\n    mask-size: 100% 100%;\r\n  }\r\n<\/style>\r\n<script>\r\n(() => {\r\n\"use strict\";\r\n\/* =======================================================\r\nEASY SETTINGS \u2014 change these values only\r\n======================================================= *\/\r\nconst SETTINGS = {\r\n\/\/ Replace this with your own 2:1 equirectangular panorama URL..\r\npanoramaUrl:\r\n\"https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/resized_EXT%20Night%20beach%20corner%20final%20Panorama.jpg\",\r\n\/\/ =======================================================\r\n\/\/ RESPONSIVE WINDOW SIZE CONTROLS\r\n\/\/ 100 = same width as the Elementor HTML widget.\r\n\/\/ Any value above 100 makes the circular window overflow.\r\n\/\/ Example: 120 makes it 20% wider than its container.\r\n\/\/ =======================================================\r\ndesktopWindowSizePercentOfContainer: 115,\r\ntabletWindowSizePercentOfContainer: 120,\r\nmobileWindowSizePercentOfContainer: 120,\r\n\r\n\/\/ Maximum diameter allowed on each device.\r\ndesktopMaximumWindowSizePx: 1200,\r\ntabletMaximumWindowSizePx: 1000,\r\nmobileMaximumWindowSizePx: 700,\r\n\r\n\/\/ Responsive breakpoints.\r\nmobileBreakpointPx: 767,\r\ntabletBreakpointPx: 1024,\r\n\/\/ VERTICAL OVERFLOW \/ RESERVED HEIGHT\r\n\/\/ This controls how much of the visual height Elementor reserves.\r\n\/\/ 100 = no top\/bottom overflow.\r\n\/\/ 80 = roughly 10% of the visual extends above + 10% below.\r\n\/\/ 60 = roughly 20% above + 20% below.\r\ndesktopReservedHeightPercent: 72,\r\ntabletReservedHeightPercent: 78,\r\nmobileReservedHeightPercent: 82,\r\nreserveElementorHeight: true,\r\nallowVisualOverflow: true,\r\n\/\/ Viewer appearance\r\nfieldOfView: 74,\r\ninitialYawDegrees: 0,\r\nnorthOffsetDegrees: 0,\r\ncompassRadiusPercent: 45.5,\r\nrendererPixelRatioLimit: 1.75,\r\nmobileRendererPixelRatioLimit: 1.15,\r\n\/\/ Automatic rotation\r\nautoRotateEnabled: true,\r\nautoRotateDegreesPerSecond: 4,\r\nautoResumeDelayMs: 1500,\r\n\/\/ Horizontal mouse \/ touch drag\r\ndragDegreesPerPixel: 0.16,\r\ngestureAxisThresholdPx: 7,\r\nhorizontalIntentRatio: 1.08,\r\n\/\/ Page vertical scroll -> panorama horizontal rotation.\r\n\/\/ This never counts as viewer interaction and never resets the auto timer.\r\npageScrollRotationEnabled: true,\r\npageScrollDegreesPerPixel: 0.06,\r\npageScrollDirection: 1,\r\npageScrollOnlyWhileVisible: true,\r\n\/\/ Compass and glowing arc follow the panorama orientation.\r\n\/\/ Use -1 for natural compass behaviour. Change to 1 to reverse it.\r\norientationDirection: -1,\r\nglowingArcOffsetDegrees: 0,\r\n\/\/ Keyboard left\/right step\r\nkeyboardStepDegrees: 4,\r\n\/\/ Three.js CDN fallbacks\r\nthreeJsUrls: [\r\n\"https:\/\/cdn.jsdelivr.net\/npm\/three@0.160.0\/build\/three.min.js\",\r\n\"https:\/\/unpkg.com\/three@0.160.0\/build\/three.min.js\"\r\n]\r\n};\r\nconst clamp = (value, min, max) => Math.min(max, Math.max(min, value));\r\nconst normalizeDegrees = (value) => ((value % 360) + 360) % 360;\r\nfunction loadScriptOnce(url) {\r\nreturn new Promise((resolve, reject) => {\r\nconst matching = Array.from(document.scripts).find(\r\n(script) => script.src === url\r\n);\r\nif (matching) {\r\nif (window.THREE) {\r\nresolve();\r\nreturn;\r\n}\r\nmatching.addEventListener(\"load\", resolve, { once: true });\r\nmatching.addEventListener(\"error\", reject, { once: true });\r\nreturn;\r\n}\r\nconst script = document.createElement(\"script\");\r\nscript.src = url;\r\nscript.async = true;\r\nscript.dataset.psv360Three = \"true\";\r\nscript.addEventListener(\"load\", resolve, { once: true });\r\nscript.addEventListener(\"error\", reject, { once: true });\r\ndocument.head.appendChild(script);\r\n});\r\n}\r\nfunction ensureThree() {\r\nif (window.THREE) return Promise.resolve(window.THREE);\r\nif (window.__psv360ThreePromise) return window.__psv360ThreePromise;\r\nwindow.__psv360ThreePromise = (async () => {\r\nlet lastError;\r\nfor (const url of SETTINGS.threeJsUrls) {\r\ntry {\r\nawait loadScriptOnce(url);\r\nif (window.THREE) return window.THREE;\r\n} catch (error) {\r\nlastError = error;\r\n}\r\n}\r\nthrow lastError || new Error(\"Three.js could not be loaded.\");\r\n})();\r\nreturn window.__psv360ThreePromise;\r\n}\r\nfunction initWidget(root, THREE) {\r\nif (root.dataset.psv360V4Ready === \"true\") return;\r\nroot.dataset.psv360V4Ready = \"true\";\r\nconst stage = root.querySelector(\".psv360-stage\");\r\nconst viewer = root.querySelector(\"[data-psv360-viewer]\");\r\nconst status = root.querySelector(\"[data-psv360-status]\");\r\nconst compassRotor = root.querySelector(\"[data-psv360-compass-rotor]\");\r\nconst glowRotor = root.querySelector(\"[data-psv360-glow-rotor]\");\r\nconst arcGradients = Array.from(\r\nroot.querySelectorAll(\"[data-psv360-arc-gradient]\")\r\n);\r\nconst glowFilter = root.querySelector(\"[data-psv360-glow-filter]\");\r\nconst glowArcs = Array.from(\r\nroot.querySelectorAll(\"[data-psv360-glow-arc]\")\r\n);\r\nconst cardinalLabels = Array.from(\r\nroot.querySelectorAll(\".psv360-cardinal\")\r\n);\r\n\/\/ Make SVG definitions safe if more than one widget exists on a page.\r\nconst uniqueId = `psv360-${Math.random().toString(36).slice(2, 9)}`;\r\nconst filterId = `${uniqueId}-glow-filter`;\r\nglowFilter.id = filterId;\r\narcGradients.forEach((gradient, index) => {\r\nconst gradientId = `${uniqueId}-arc-gradient-${index}`;\r\ngradient.id = gradientId;\r\nif (glowArcs[index]) {\r\nglowArcs[index].setAttribute(\"stroke\", `url(#${gradientId})`);\r\n}\r\n});\r\nroot\r\n.querySelector(\".psv360-dot-halo\")\r\n.setAttribute(\"filter\", `url(#${filterId})`);\r\nlet renderer;\r\nlet scene;\r\nlet camera;\r\nlet sphere;\r\nlet texture;\r\nlet animationFrame = 0;\r\nlet yawDegrees = SETTINGS.initialYawDegrees;\r\nlet lastFrameTime = performance.now();\r\nlet resumeAutoAt = 0;\r\nlet isVisible = true;\r\nlet destroyed = false;\r\nlet lastPageScrollY = window.scrollY;\r\nlet pendingPageScrollDegrees = 0;\r\nlet isMobileLayout =\r\nwindow.innerWidth <= SETTINGS.mobileBreakpointPx;\r\nlet compassCenter = 0;\r\nlet compassRadius = 0;\r\nconst reducedMotionQuery = window.matchMedia(\r\n\"(prefers-reduced-motion: reduce)\"\r\n);\r\nconst drag = {\r\nmouseDown: false,\r\ntouchActive: false,\r\naxis: null,\r\nstartX: 0,\r\nstartY: 0,\r\nlastX: 0,\r\nlastY: 0,\r\nlastTouchEndAt: 0\r\n};\r\ntry {\r\nrenderer = new THREE.WebGLRenderer({\r\nantialias: true,\r\nalpha: true,\r\npowerPreference: \"high-performance\"\r\n});\r\n} catch (error) {\r\nstatus.textContent = \"WebGL is unavailable in this browser.\";\r\nstatus.classList.add(\"is-error\");\r\nreturn;\r\n}\r\nrenderer.setClearColor(0x000000, 0);\r\nrenderer.outputColorSpace = THREE.SRGBColorSpace;\r\nrenderer.setPixelRatio(\r\nMath.min(\r\nwindow.devicePixelRatio || 1,\r\nisMobileLayout\r\n? SETTINGS.mobileRendererPixelRatioLimit\r\n: SETTINGS.rendererPixelRatioLimit\r\n)\r\n);\r\nviewer.insertBefore(renderer.domElement, viewer.firstChild);\r\nscene = new THREE.Scene();\r\ncamera = new THREE.PerspectiveCamera(\r\nSETTINGS.fieldOfView,\r\n1,\r\n0.1,\r\n1200\r\n);\r\nconst geometry = new THREE.SphereGeometry(\r\n500,\r\nisMobileLayout ? 56 : 72,\r\nisMobileLayout ? 36 : 48\r\n);\r\ngeometry.scale(-1, 1, 1);\r\nconst material = new THREE.MeshBasicMaterial({ color: 0xffffff });\r\nsphere = new THREE.Mesh(geometry, material);\r\nscene.add(sphere);\r\nconst loader = new THREE.TextureLoader();\r\nloader.setCrossOrigin(\"anonymous\");\r\nloader.load(\r\nSETTINGS.panoramaUrl,\r\n(loadedTexture) => {\r\ntexture = loadedTexture;\r\ntexture.colorSpace = THREE.SRGBColorSpace;\r\ntexture.minFilter = THREE.LinearFilter;\r\ntexture.magFilter = THREE.LinearFilter;\r\nmaterial.map = texture;\r\nmaterial.needsUpdate = true;\r\nstatus.classList.add(\"is-hidden\");\r\n},\r\nundefined,\r\n() => {\r\nstatus.textContent =\r\n\"Panorama could not load. Use a same-domain or CORS-enabled 2:1 image URL.\";\r\nstatus.classList.add(\"is-error\");\r\n}\r\n);\r\nconst elementorWidgetContainer = root.closest(\r\n\".elementor-widget-container\"\r\n);\r\nconst elementorWidget = root.closest(\".elementor-widget-html\");\r\nconst overflowHosts = Array.from(\r\nnew Set(\r\n[\r\nroot,\r\nelementorWidgetContainer,\r\nelementorWidget,\r\nelementorWidget && elementorWidget.closest(\".e-con\"),\r\nelementorWidget && elementorWidget.closest(\".elementor-section\"),\r\nelementorWidget && elementorWidget.closest(\".elementor-column\")\r\n].filter(Boolean)\r\n)\r\n);\r\nfunction applyResponsiveLayout() {\r\nconst viewportWidth =\r\ndocument.documentElement.clientWidth || window.innerWidth;\r\nisMobileLayout = viewportWidth <= SETTINGS.mobileBreakpointPx;\r\nconst isTabletLayout =\r\n!isMobileLayout && viewportWidth <= SETTINGS.tabletBreakpointPx;\r\nconst sizePercent = isMobileLayout\r\n? SETTINGS.mobileWindowSizePercentOfContainer\r\n: isTabletLayout\r\n? SETTINGS.tabletWindowSizePercentOfContainer\r\n: SETTINGS.desktopWindowSizePercentOfContainer;\r\nconst maximumWindowSizePx = isMobileLayout\r\n? SETTINGS.mobileMaximumWindowSizePx\r\n: isTabletLayout\r\n? SETTINGS.tabletMaximumWindowSizePx\r\n: SETTINGS.desktopMaximumWindowSizePx;\r\nconst reservedHeightPercent = isMobileLayout\r\n? SETTINGS.mobileReservedHeightPercent\r\n: isTabletLayout\r\n? SETTINGS.tabletReservedHeightPercent\r\n: SETTINGS.desktopReservedHeightPercent;\r\nconst widthSource = elementorWidgetContainer || root.parentElement || root;\r\nconst containerWidth =\r\nwidthSource.getBoundingClientRect().width ||\r\nroot.getBoundingClientRect().width ||\r\nwindow.innerWidth;\r\nconst targetSize = Math.max(\r\n180,\r\nMath.min(\r\ncontainerWidth * (sizePercent \/ 100),\r\nmaximumWindowSizePx\r\n)\r\n);\r\nconst visualSize = Math.round(targetSize * 100) \/ 100;\r\nconst reservedHeight = Math.max(1, visualSize * (reservedHeightPercent \/ 100));\r\nconst targetHeight = `${Math.round(reservedHeight * 100) \/ 100}px`;\r\nconst visualSizePx = `${visualSize}px`;\r\nroot.style.setProperty(\"--psv360-layout-height\", targetHeight);\r\nroot.style.setProperty(\"--psv360-viewer-size\", \"100%\");\r\nroot.style.height = targetHeight;\r\nroot.style.minHeight = targetHeight;\r\nroot.style.overflow = SETTINGS.allowVisualOverflow ? \"visible\" : \"hidden\";\r\noverflowHosts.forEach((host) => {\r\nhost.style.setProperty(\r\n\"overflow\",\r\nSETTINGS.allowVisualOverflow ? \"visible\" : \"hidden\",\r\n\"important\"\r\n);\r\n});\r\n\/\/ The visual stays at its full size while Elementor reserves only the\r\n\/\/ percentage configured above. Because the stage is centered at 50%\/50%,\r\n\/\/ the unreserved part overflows equally from the top and bottom.\r\nstage.style.width = visualSizePx;\r\nstage.style.height = visualSizePx;\r\ncompassCenter = visualSize \/ 2;\r\ncompassRadius = visualSize * (SETTINGS.compassRadiusPercent \/ 100);\r\n\/\/ Reserve only the configured layout height in Elementor. The stage itself\r\n\/\/ can remain larger and overflow above\/below this reserved box.\r\nif (SETTINGS.reserveElementorHeight && elementorWidgetContainer) {\r\nelementorWidgetContainer.style.setProperty(\r\n\"height\",\r\ntargetHeight,\r\n\"important\"\r\n);\r\nelementorWidgetContainer.style.setProperty(\r\n\"min-height\",\r\ntargetHeight,\r\n\"important\"\r\n);\r\nelementorWidgetContainer.style.setProperty(\r\n\"overflow\",\r\nSETTINGS.allowVisualOverflow ? \"visible\" : \"hidden\",\r\n\"important\"\r\n);\r\n}\r\nif (SETTINGS.reserveElementorHeight && elementorWidget) {\r\nelementorWidget.style.setProperty(\r\n\"min-height\",\r\ntargetHeight,\r\n\"important\"\r\n);\r\nelementorWidget.style.setProperty(\r\n\"overflow\",\r\nSETTINGS.allowVisualOverflow ? \"visible\" : \"hidden\",\r\n\"important\"\r\n);\r\n}\r\n}\r\nfunction resizeRenderer() {\r\nconst rect = viewer.getBoundingClientRect();\r\nconst width = Math.max(2, Math.round(rect.width));\r\nconst height = Math.max(2, Math.round(rect.height));\r\nrenderer.setPixelRatio(\r\nMath.min(\r\nwindow.devicePixelRatio || 1,\r\nisMobileLayout\r\n? SETTINGS.mobileRendererPixelRatioLimit\r\n: SETTINGS.rendererPixelRatioLimit\r\n)\r\n);\r\nrenderer.setSize(width, height, false);\r\ncamera.aspect = width \/ height;\r\ncamera.updateProjectionMatrix();\r\n}\r\nfunction updatePanoramaCamera() {\r\nconst theta = THREE.MathUtils.degToRad(yawDegrees);\r\ncamera.lookAt(Math.sin(theta) * 10, 0, -Math.cos(theta) * 10);\r\n}\r\nfunction updateOrientationUI() {\r\nconst orientationDegrees = normalizeDegrees(\r\nSETTINGS.northOffsetDegrees +\r\nyawDegrees * SETTINGS.orientationDirection\r\n);\r\nconst glowDegrees =\r\norientationDegrees + SETTINGS.glowingArcOffsetDegrees;\r\ncompassRotor.setAttribute(\r\n\"transform\",\r\n`rotate(${orientationDegrees} 500 500)`\r\n);\r\nglowRotor.setAttribute(\"transform\", `rotate(${glowDegrees} 500 500)`);\r\ncardinalLabels.forEach((label) => {\r\nconst baseAngle = Number(label.dataset.baseAngle || 0);\r\nconst angle = THREE.MathUtils.degToRad(baseAngle + orientationDegrees);\r\nconst x = compassCenter + Math.cos(angle) * compassRadius;\r\nconst y = compassCenter + Math.sin(angle) * compassRadius;\r\nlabel.style.transform = `translate(${x - compassCenter}px, ${\r\ny - compassCenter\r\n}px) translate(-50%, -50%)`;\r\n});\r\n}\r\nfunction markInteractionFinished() {\r\nresumeAutoAt = performance.now() + SETTINGS.autoResumeDelayMs;\r\n}\r\nfunction isHorizontalDragging() {\r\nreturn (\r\ndrag.axis === \"x\" && (drag.mouseDown || drag.touchActive)\r\n);\r\n}\r\nfunction beginDrag(x, y, source) {\r\ndrag.mouseDown = source === \"mouse\";\r\ndrag.touchActive = source === \"touch\";\r\ndrag.axis = null;\r\ndrag.startX = drag.lastX = x;\r\ndrag.startY = drag.lastY = y;\r\n}\r\nfunction resolveDragAxis(x, y) {\r\nif (drag.axis) return drag.axis;\r\nconst totalX = x - drag.startX;\r\nconst totalY = y - drag.startY;\r\nif (Math.hypot(totalX, totalY) < SETTINGS.gestureAxisThresholdPx) {\r\nreturn null;\r\n}\r\nconst horizontalIntent =\r\nMath.abs(totalX) >\r\nMath.abs(totalY) * SETTINGS.horizontalIntentRatio;\r\ndrag.axis = horizontalIntent ? \"x\" : \"y\";\r\nif (drag.axis === \"x\") {\r\nresumeAutoAt = Number.POSITIVE_INFINITY;\r\nstage.classList.add(\"is-dragging\");\r\n}\r\nreturn drag.axis;\r\n}\r\nfunction moveHorizontalDrag(x, y) {\r\nconst deltaX = x - drag.lastX;\r\ndrag.lastX = x;\r\ndrag.lastY = y;\r\nyawDegrees -= deltaX * SETTINGS.dragDegreesPerPixel;\r\n}\r\nfunction finishDrag(source) {\r\nconst wasHorizontal = drag.axis === \"x\";\r\nif (source === \"touch\") drag.lastTouchEndAt = performance.now();\r\ndrag.mouseDown = false;\r\ndrag.touchActive = false;\r\ndrag.axis = null;\r\nstage.classList.remove(\"is-dragging\");\r\nif (wasHorizontal) markInteractionFinished();\r\n}\r\nfunction onMouseMove(event) {\r\n\/* This handler exists only while the left button is held. *\/\r\nif (!drag.mouseDown || (event.buttons & 1) !== 1) {\r\nif (drag.mouseDown) finishDrag(\"mouse\");\r\ndetachMouseDragListeners();\r\nreturn;\r\n}\r\nconst axis = resolveDragAxis(event.clientX, event.clientY);\r\nif (axis !== \"x\") return;\r\nmoveHorizontalDrag(event.clientX, event.clientY);\r\nif (event.cancelable) event.preventDefault();\r\n}\r\nfunction onMouseUp() {\r\nif (drag.mouseDown) finishDrag(\"mouse\");\r\ndetachMouseDragListeners();\r\n}\r\nfunction onWindowBlur() {\r\nif (drag.mouseDown) finishDrag(\"mouse\");\r\ndetachMouseDragListeners();\r\n}\r\nfunction attachMouseDragListeners() {\r\nwindow.addEventListener(\"mousemove\", onMouseMove, { passive: false });\r\nwindow.addEventListener(\"mouseup\", onMouseUp, { passive: true });\r\nwindow.addEventListener(\"blur\", onWindowBlur, { passive: true });\r\n}\r\nfunction detachMouseDragListeners() {\r\nwindow.removeEventListener(\"mousemove\", onMouseMove);\r\nwindow.removeEventListener(\"mouseup\", onMouseUp);\r\nwindow.removeEventListener(\"blur\", onWindowBlur);\r\n}\r\nstage.addEventListener(\"mousedown\", (event) => {\r\nif (event.button !== 0) return;\r\nif (performance.now() - drag.lastTouchEndAt < 650) return;\r\nbeginDrag(event.clientX, event.clientY, \"mouse\");\r\nattachMouseDragListeners();\r\n});\r\nstage.addEventListener(\r\n\"touchstart\",\r\n(event) => {\r\nif (event.touches.length !== 1) return;\r\nconst touch = event.touches[0];\r\nbeginDrag(touch.clientX, touch.clientY, \"touch\");\r\n},\r\n{ passive: true }\r\n);\r\nstage.addEventListener(\r\n\"touchmove\",\r\n(event) => {\r\nif (!drag.touchActive || event.touches.length !== 1) return;\r\nconst touch = event.touches[0];\r\nconst axis = resolveDragAxis(touch.clientX, touch.clientY);\r\nif (axis !== \"x\") {\r\n\/\/ Vertical movement remains completely native page scrolling.\r\nreturn;\r\n}\r\nif (event.cancelable) event.preventDefault();\r\nmoveHorizontalDrag(touch.clientX, touch.clientY);\r\n},\r\n{ passive: false }\r\n);\r\nstage.addEventListener(\r\n\"touchend\",\r\n(event) => {\r\nif (drag.touchActive && event.touches.length === 0) {\r\nfinishDrag(\"touch\");\r\n}\r\n},\r\n{ passive: true }\r\n);\r\nstage.addEventListener(\r\n\"touchcancel\",\r\n() => {\r\nif (drag.touchActive) finishDrag(\"touch\");\r\n},\r\n{ passive: true }\r\n);\r\nstage.addEventListener(\"dragstart\", (event) => event.preventDefault());\r\nstage.addEventListener(\"contextmenu\", (event) => event.preventDefault());\r\n\/\/ No wheel handler is installed: desktop wheel\/trackpad always scrolls the page.\r\nviewer.addEventListener(\"keydown\", (event) => {\r\nif (event.key !== \"ArrowLeft\" && event.key !== \"ArrowRight\") return;\r\nevent.preventDefault();\r\nconst direction = event.key === \"ArrowLeft\" ? -1 : 1;\r\nyawDegrees += direction * SETTINGS.keyboardStepDegrees;\r\nmarkInteractionFinished();\r\n});\r\nfunction onPageScroll() {\r\nconst currentY = window.scrollY;\r\nconst deltaY = currentY - lastPageScrollY;\r\nlastPageScrollY = currentY;\r\nif (!SETTINGS.pageScrollRotationEnabled || isHorizontalDragging()) return;\r\nif (SETTINGS.pageScrollOnlyWhileVisible && !isVisible) return;\r\npendingPageScrollDegrees +=\r\ndeltaY *\r\nSETTINGS.pageScrollDegreesPerPixel *\r\nSETTINGS.pageScrollDirection;\r\n\/\/ Intentionally do not change resumeAutoAt here.\r\n}\r\nwindow.addEventListener(\"scroll\", onPageScroll, { passive: true });\r\nfunction onWindowResize() {\r\napplyResponsiveLayout();\r\nresizeRenderer();\r\n}\r\nwindow.addEventListener(\"resize\", onWindowResize, { passive: true });\r\nlet resizeObserver;\r\nlet layoutResizeObserver;\r\nif (\"ResizeObserver\" in window) {\r\nresizeObserver = new ResizeObserver(resizeRenderer);\r\nresizeObserver.observe(viewer);\r\nlayoutResizeObserver = new ResizeObserver(() => {\r\napplyResponsiveLayout();\r\n});\r\nlayoutResizeObserver.observe(\r\nelementorWidgetContainer || root.parentElement || root\r\n);\r\n}\r\nlet intersectionObserver;\r\nif (\"IntersectionObserver\" in window) {\r\nintersectionObserver = new IntersectionObserver(\r\n(entries) => {\r\nisVisible = Boolean(entries[0] && entries[0].isIntersecting);\r\n},\r\n{ rootMargin: \"120px 0px\", threshold: 0 }\r\n);\r\nintersectionObserver.observe(root);\r\n}\r\nfunction animate(now) {\r\nif (destroyed || !document.documentElement.contains(root)) {\r\ndestroyed = true;\r\ncancelAnimationFrame(animationFrame);\r\nwindow.removeEventListener(\"scroll\", onPageScroll);\r\nwindow.removeEventListener(\"resize\", onWindowResize);\r\ndetachMouseDragListeners();\r\nif (resizeObserver) resizeObserver.disconnect();\r\nif (layoutResizeObserver) layoutResizeObserver.disconnect();\r\nif (intersectionObserver) intersectionObserver.disconnect();\r\nif (texture) texture.dispose();\r\nif (sphere) {\r\nsphere.geometry.dispose();\r\nsphere.material.dispose();\r\n}\r\nif (renderer) renderer.dispose();\r\nreturn;\r\n}\r\nconst deltaSeconds = clamp((now - lastFrameTime) \/ 1000, 0, 0.05);\r\nlastFrameTime = now;\r\nif (pendingPageScrollDegrees !== 0) {\r\nyawDegrees += pendingPageScrollDegrees;\r\npendingPageScrollDegrees = 0;\r\n}\r\nif (\r\nisVisible &&\r\nSETTINGS.autoRotateEnabled &&\r\n!reducedMotionQuery.matches &&\r\n!isHorizontalDragging() &&\r\nnow >= resumeAutoAt\r\n) {\r\nyawDegrees += SETTINGS.autoRotateDegreesPerSecond * deltaSeconds;\r\n}\r\nupdatePanoramaCamera();\r\nupdateOrientationUI();\r\nif (isVisible) renderer.render(scene, camera);\r\nanimationFrame = requestAnimationFrame(animate);\r\n}\r\napplyResponsiveLayout();\r\nresizeRenderer();\r\nupdatePanoramaCamera();\r\nupdateOrientationUI();\r\nanimationFrame = requestAnimationFrame(animate);\r\n\/\/ Elementor can finish calculating responsive widths after the widget's\r\n\/\/ script has already run. These second passes prevent a short container.\r\nrequestAnimationFrame(() => {\r\napplyResponsiveLayout();\r\nresizeRenderer();\r\n});\r\nwindow.setTimeout(() => {\r\napplyResponsiveLayout();\r\nresizeRenderer();\r\n}, 300);\r\n}\r\nasync function boot() {\r\nconst roots = Array.from(\r\ndocument.querySelectorAll(\r\n\".psv360-widget[data-psv360-v4-widget]:not([data-psv360-v4-ready='true'])\"\r\n)\r\n);\r\nif (!roots.length) return;\r\ntry {\r\nconst THREE = await ensureThree();\r\nroots.forEach((root) => initWidget(root, THREE));\r\n} catch (error) {\r\nroots.forEach((root) => {\r\nroot.dataset.psv360V4Ready = \"true\";\r\nconst status = root.querySelector(\"[data-psv360-status]\");\r\nif (status) {\r\nstatus.textContent =\r\n\"The 360 viewer library could not load. Check that CDN scripts are permitted.\";\r\nstatus.classList.add(\"is-error\");\r\n}\r\n});\r\n}\r\n}\r\nboot();\r\n})(); <\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-7d76b4d e-con e-atomic-element e-flexbox-base e-7d76b4d-4e14b5c \" data-id=\"7d76b4d\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"7d76b4d\" data-e-type=\"e-flexbox\" data-id=\"7d76b4d\">\n    <div class=\"elementor-element elementor-element-563044d e-flex e-con-boxed e-con e-parent\" data-id=\"563044d\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-419ed9b e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"419ed9b\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b40181f elementor-widget elementor-widget-html\" data-id=\"b40181f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n  PANOSKY \u2014 GLOBAL ROUTE MAP v2 \u2014 SVG ISOLATED\r\n  Paste this entire file into one Elementor HTML widget.\r\n\r\n  QUICK CONTROLS (edit the data-* values on the first div below):\r\n  data-image-url       = direct URL of the world-map image\r\n  data-route-seconds   = seconds for one complete travelling-dot cycle\r\n  data-pause-seconds   = pause at each end of the route\r\n  data-size            = visual width as a percentage of the Elementor container\r\n                         (100 = fits the container, 115 = 15% wider)\r\n  data-max-width       = maximum visual width in pixels\r\n  data-aspect-ratio    = width divided by height (reference design = 2.192)\r\n  data-mobile-height   = height multiplier on tablets and phones (1.5 = 50% taller)\r\n  data-tall-breakpoint = maximum viewport width that uses the taller layout\r\n  data-pulse-seconds   = destination pulse speed\r\n-->\r\n\r\n<div\r\n  class=\"psgr-widget\"\r\n  data-psgr-widget\r\n  data-image-url=\"https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/ChatGPT%20Image%20Aug%2015%2C%202026%2C%2001_14_17%20PM.png\"\r\n  data-route-seconds=\"6.4\"\r\n  data-pause-seconds=\"0.55\"\r\n  data-size=\"100\"\r\n  data-max-width=\"1400\"\r\n  data-aspect-ratio=\"2.192\"\r\n  data-mobile-height=\"1.5\"\r\n  data-tall-breakpoint=\"1024\"\r\n  data-pulse-seconds=\"1.9\"\r\n>\r\n  <figure\r\n    class=\"psgr-frame\"\r\n    data-psgr-frame\r\n    role=\"img\"\r\n    aria-label=\"A luminous route connecting a London client to your space in Singapore\"\r\n  >\r\n    <img class=\"psgr-map\" data-psgr-map alt=\"\" decoding=\"async\" \/>\r\n    <span class=\"psgr-map-treatment\" aria-hidden=\"true\"><\/span>\r\n\r\n    <!-- Keeps route graphics and text proportional inside the taller frame. -->\r\n    <div class=\"psgr-ui-plane\" aria-hidden=\"true\">\r\n      <svg\r\n        class=\"psgr-route-layer\"\r\n        viewBox=\"0 0 1000 456.2\"\r\n        preserveAspectRatio=\"none\"\r\n      >\r\n      <!-- A low-opacity route shadow makes the line read over bright city lights. -->\r\n      <path\r\n        class=\"psgr-route-shadow\"\r\n        d=\"M 210 153 C 334 67 471 75 570 166 C 649 239 675 329 768 356\"\r\n      \/>\r\n      <path\r\n        class=\"psgr-route-glow\"\r\n        d=\"M 210 153 C 334 67 471 75 570 166 C 649 239 675 329 768 356\"\r\n      \/>\r\n      <path\r\n        class=\"psgr-route-line\"\r\n        data-psgr-route\r\n        d=\"M 210 153 C 334 67 471 75 570 166 C 649 239 675 329 768 356\"\r\n      \/>\r\n      <line class=\"psgr-route-shadow\" x1=\"768\" y1=\"356\" x2=\"838\" y2=\"356\" \/>\r\n      <line class=\"psgr-route-glow\" x1=\"768\" y1=\"356\" x2=\"838\" y2=\"356\" \/>\r\n      <line class=\"psgr-route-line\" x1=\"768\" y1=\"356\" x2=\"838\" y2=\"356\" \/>\r\n\r\n      <!-- Tiny departure sparks, as in the reference. -->\r\n      <g class=\"psgr-departure-sparks\">\r\n        <circle cx=\"196\" cy=\"162\" r=\"2.3\" \/>\r\n        <circle cx=\"203\" cy=\"157\" r=\"3.2\" \/>\r\n        <circle cx=\"210\" cy=\"153\" r=\"4.2\" \/>\r\n      <\/g>\r\n\r\n      <!-- Repeating travelling light. JavaScript places this group on the route. -->\r\n      <g class=\"psgr-traveller\" data-psgr-traveller>\r\n        <circle class=\"psgr-traveller-aura\" r=\"17\" \/>\r\n        <circle class=\"psgr-traveller-glow\" r=\"7.2\" \/>\r\n        <circle class=\"psgr-traveller-core\" r=\"2.9\" \/>\r\n      <\/g>\r\n\r\n      <!-- Fixed Singapore destination pulse. -->\r\n      <g class=\"psgr-destination\" transform=\"translate(768 356)\">\r\n        <circle class=\"psgr-destination-wave psgr-destination-wave-a\" r=\"19\" \/>\r\n        <circle class=\"psgr-destination-wave psgr-destination-wave-b\" r=\"19\" \/>\r\n        <circle class=\"psgr-destination-aura\" r=\"22\" \/>\r\n        <circle class=\"psgr-destination-blue\" r=\"13.5\" \/>\r\n        <circle class=\"psgr-destination-core\" r=\"5.5\" \/>\r\n      <\/g>\r\n      <\/svg>\r\n\r\n      <div class=\"psgr-label psgr-label-start\">\r\n        <span>London<\/span>\r\n        <span>Client<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"psgr-label psgr-label-end\">\r\n        <span>Singapore<\/span>\r\n        <span>Your Space<\/span>\r\n      <\/div>\r\n    <\/div>\r\n  <\/figure>\r\n<\/div>\r\n\r\n<style>\r\n  \/* =========================================================\r\n     PANOSKY GLOBAL ROUTE MAP\r\n     The area outside the image card is completely transparent.\r\n     ========================================================= *\/\r\n\r\n  .psgr-widget,\r\n  .psgr-widget * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .psgr-widget {\r\n    --psgr-layout-height: auto;\r\n    --psgr-frame-width: 100%;\r\n    --psgr-frame-height: auto;\r\n    --psgr-blue: #2187ff;\r\n    --psgr-cyan: #79c8ff;\r\n    position: relative;\r\n    display: block;\r\n    width: 100%;\r\n    max-width: 100%;\r\n    aspect-ratio: 2.192 \/ 1;\r\n    height: var(--psgr-layout-height);\r\n    min-height: var(--psgr-layout-height);\r\n    overflow: visible;\r\n    isolation: isolate;\r\n    container-type: inline-size;\r\n    background: transparent !important;\r\n    font-family: var(\r\n      --e-global-typography-primary-font-family,\r\n      \"Satoshi\",\r\n      \"Helvetica Neue\",\r\n      Arial,\r\n      sans-serif\r\n    );\r\n  }\r\n\r\n  .psgr-frame {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 50%;\r\n    width: var(--psgr-frame-width);\r\n    height: var(--psgr-frame-height);\r\n    aspect-ratio: 2.192 \/ 1;\r\n    min-height: 1px;\r\n    margin: 0;\r\n    overflow: hidden;\r\n    transform: translateX(-50%);\r\n    border: 1px solid rgba(150, 179, 216, 0.34);\r\n    border-radius: 20% 2.8% 2.8% 20% \/ 40% 7% 7% 40%;\r\n    background: #031126;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(213, 230, 255, 0.05),\r\n      inset 0 -26px 50px rgba(0, 8, 22, 0.3),\r\n      0 0 0 1px rgba(0, 18, 49, 0.45);\r\n    user-select: none;\r\n    -webkit-user-select: none;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psgr-frame::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    z-index: 8;\r\n    inset: 0;\r\n    border: 1px solid rgba(221, 237, 255, 0.055);\r\n    border-radius: inherit;\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255, 255, 255, 0.045),\r\n      inset 0 0 35px rgba(0, 10, 30, 0.22);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psgr-map,\r\n  .psgr-map-treatment {\r\n    position: absolute;\r\n    inset: 0;\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n  }\r\n\r\n  .psgr-map {\r\n    z-index: 0;\r\n    min-width: 100%;\r\n    min-height: 100%;\r\n    object-fit: cover;\r\n    object-position: 50% 52%;\r\n    filter: brightness(1.5) saturate(1.2) contrast(1);\r\n    transform: scale(1.014);\r\n  }\r\n\r\n  .psgr-map-treatment {\r\n    z-index: 1;\r\n    background:\r\n      radial-gradient(\r\n        76% 95% at 52% 46%,\r\n        rgba(7, 26, 55, 0.01) 14%,\r\n        rgba(1, 12, 30, 0.22) 75%,\r\n        rgba(0, 7, 20, 0.52) 100%\r\n      ),\r\n      linear-gradient(\r\n        180deg,\r\n        rgba(2, 14, 33, 0.24) 0%,\r\n        rgba(1, 13, 31, 0.08) 45%,\r\n        rgba(0, 8, 22, 0.29) 100%\r\n      ),\r\n      linear-gradient(90deg, rgba(2, 13, 31, 0.15), rgba(2, 14, 34, 0.02));\r\n  }\r\n\r\n  .psgr-ui-plane {\r\n    position: absolute;\r\n    z-index: 3;\r\n    top: 50%;\r\n    left: 0;\r\n    width: 100%;\r\n    height: auto;\r\n    aspect-ratio: 1000 \/ 456.2;\r\n    overflow: visible;\r\n    transform: translateY(-50%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psgr-route-layer {\r\n    position: absolute;\r\n    z-index: 1;\r\n    inset: 0;\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: visible;\r\n  }\r\n\r\n  .psgr-route-shadow,\r\n  .psgr-route-glow,\r\n  .psgr-route-line {\r\n    fill: none;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    vector-effect: non-scaling-stroke;\r\n  }\r\n\r\n  .psgr-route-shadow {\r\n    stroke: rgba(0, 16, 50, 0.72);\r\n    stroke-width: 7px;\r\n  }\r\n\r\n  .psgr-route-glow {\r\n    stroke: rgba(19, 111, 255, 0.34);\r\n    stroke-width: 5px;\r\n    filter: blur(3px) drop-shadow(0 0 6px rgba(30, 126, 255, 0.7));\r\n  }\r\n\r\n  .psgr-route-line {\r\n    stroke: rgba(114, 194, 255, 0.94);\r\n    stroke-width: 1.65px;\r\n    filter: drop-shadow(0 0 2px #147cff) drop-shadow(0 0 5px rgba(28, 121, 255, 0.76));\r\n  }\r\n\r\n  .psgr-departure-sparks circle {\r\n    fill: #dff7ff;\r\n    stroke: #208aff;\r\n    stroke-width: 1.1px;\r\n    vector-effect: non-scaling-stroke;\r\n    filter: drop-shadow(0 0 3px #1690ff) drop-shadow(0 0 7px rgba(31, 122, 255, 0.95));\r\n  }\r\n\r\n  .psgr-traveller {\r\n    opacity: 0;\r\n    transform-box: view-box;\r\n    will-change: transform, opacity;\r\n  }\r\n\r\n  .psgr-traveller-aura {\r\n    fill: rgba(23, 121, 255, 0.2);\r\n    filter: blur(3.5px);\r\n  }\r\n\r\n  .psgr-traveller-glow {\r\n    fill: #1684ff;\r\n    filter: drop-shadow(0 0 5px #147dff) drop-shadow(0 0 10px rgba(53, 158, 255, 0.9));\r\n  }\r\n\r\n  .psgr-traveller-core {\r\n    fill: #f7fdff;\r\n    filter: drop-shadow(0 0 2px #fff);\r\n  }\r\n\r\n  .psgr-destination {\r\n    transform-box: view-box;\r\n  }\r\n\r\n  .psgr-destination-wave {\r\n    fill: none;\r\n    stroke: rgba(36, 135, 255, 0.64);\r\n    stroke-width: 1.2px;\r\n    vector-effect: non-scaling-stroke;\r\n    transform-box: fill-box;\r\n    transform-origin: center;\r\n    animation: psgr-destination-wave var(--psgr-pulse-duration, 1.9s) ease-out infinite;\r\n  }\r\n\r\n  .psgr-destination-wave-b {\r\n    animation-delay: calc(var(--psgr-pulse-duration, 1.9s) * -0.5);\r\n  }\r\n\r\n  .psgr-destination-aura {\r\n    fill: rgba(23, 114, 255, 0.21);\r\n    filter: blur(3.5px);\r\n  }\r\n\r\n  .psgr-destination-blue {\r\n    fill: #157cff;\r\n    filter: drop-shadow(0 0 7px #167cff) drop-shadow(0 0 14px rgba(41, 143, 255, 0.92));\r\n  }\r\n\r\n  .psgr-destination-core {\r\n    fill: #f8fdff;\r\n    filter: drop-shadow(0 0 3px #fff);\r\n  }\r\n\r\n  .psgr-label {\r\n    position: absolute;\r\n    z-index: 6;\r\n    display: flex;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    gap: clamp(2px, 0.45cqw, 6px);\r\n    min-width: clamp(79px, 13.7cqw, 184px);\r\n    padding: clamp(8px, 1.5cqw, 20px) clamp(9px, 1.7cqw, 22px);\r\n    border: 1px solid rgba(102, 147, 202, 0.49);\r\n    border-radius: clamp(8px, 1.35cqw, 18px);\r\n    background: rgba(3, 13, 29, 0.8);\r\n    color: #f8fbff;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(2, 27, 63, 0.78),\r\n      0 8px 24px rgba(0, 5, 17, 0.3),\r\n      0 0 12px rgba(10, 67, 137, 0.12);\r\n    -webkit-backdrop-filter: blur(8px);\r\n    backdrop-filter: blur(8px);\r\n    font-size: clamp(9.5px, 1.68cqw, 22px);\r\n    font-weight: 550;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.025em;\r\n    text-shadow: 0 1px 2px rgba(0, 0, 0, 0.72);\r\n    white-space: nowrap;\r\n  }\r\n\r\n  .psgr-label span {\r\n    display: block;\r\n  }\r\n\r\n  .psgr-label-start {\r\n    top: 24.1%;\r\n    left: 8.5%;\r\n  }\r\n\r\n  .psgr-label-end {\r\n    right: 2.8%;\r\n    bottom: 13.6%;\r\n  }\r\n\r\n  @keyframes psgr-destination-wave {\r\n    0% {\r\n      opacity: 0.74;\r\n      transform: scale(0.63);\r\n    }\r\n    72%,\r\n    100% {\r\n      opacity: 0;\r\n      transform: scale(1.62);\r\n    }\r\n  }\r\n\r\n  \/* CSS fallback: tablet and mobile are 1.5\u00d7 taller before JavaScript runs. *\/\r\n  @media (max-width: 1024px) {\r\n    .psgr-widget,\r\n    .psgr-frame {\r\n      aspect-ratio: 1.461333 \/ 1;\r\n    }\r\n\r\n    .psgr-frame {\r\n      \/*\r\n        Width-based circular radii: increasing the frame height no longer\r\n        stretches the left curves vertically on tablet.\r\n      *\/\r\n      --psgr-tablet-left-corner: clamp(80px, 10.8cqw, 112px);\r\n      --psgr-tablet-right-corner: clamp(14px, 2.8cqw, 30px);\r\n      border-radius:\r\n        var(--psgr-tablet-left-corner)\r\n        var(--psgr-tablet-right-corner)\r\n        var(--psgr-tablet-right-corner)\r\n        var(--psgr-tablet-left-corner);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 540px) {\r\n    .psgr-frame {\r\n      \/* Mobile uses the same clean circular radius on all four corners. *\/\r\n      --psgr-mobile-corner: clamp(12px, 3.4cqw, 18px);\r\n      border-radius: var(--psgr-mobile-corner);\r\n    }\r\n\r\n    .psgr-label {\r\n      gap: 2px;\r\n      padding: 7px 8px;\r\n      border-radius: 8px;\r\n      font-size: clamp(9px, 2.75cqw, 11px);\r\n      min-width: 75px;\r\n      border-color: rgba(102, 147, 202, 0.43);\r\n    }\r\n\r\n    .psgr-label-start {\r\n      top: 20.5%;\r\n      left: 6.5%;\r\n    }\r\n\r\n    .psgr-label-end {\r\n      right: 1.8%;\r\n      bottom: 10.5%;\r\n    }\r\n\r\n    .psgr-route-line {\r\n      stroke-width: 1.35px;\r\n    }\r\n\r\n    .psgr-route-glow {\r\n      stroke-width: 3.7px;\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .psgr-destination-wave {\r\n      animation: none;\r\n      opacity: 0.32;\r\n      transform: scale(1.15);\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     SVG PAINT ISOLATION\r\n     Prevents external Elementor\/theme SVG gradient rules from\r\n     hijacking route paths, sparks, traveller, or destination.\r\n     ========================================================= *\/\r\n\r\n  \/* Route paths and line segment *\/\r\n  .psgr-widget .psgr-route-shadow {\r\n    fill: none !important;\r\n    stroke: rgba(0, 16, 50, 0.72) !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-route-glow {\r\n    fill: none !important;\r\n    stroke: rgba(19, 111, 255, 0.34) !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-route-line {\r\n    fill: none !important;\r\n    stroke: rgba(114, 194, 255, 0.94) !important;\r\n  }\r\n\r\n  \/* Departure sparks *\/\r\n  .psgr-widget .psgr-departure-sparks circle {\r\n    fill: #dff7ff !important;\r\n    stroke: #208aff !important;\r\n  }\r\n\r\n  \/* Travelling light *\/\r\n  .psgr-widget .psgr-traveller-aura {\r\n    fill: rgba(23, 121, 255, 0.2) !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-traveller-glow {\r\n    fill: #1684ff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-traveller-core {\r\n    fill: #f7fdff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  \/* Destination pulse *\/\r\n  .psgr-widget .psgr-destination-wave {\r\n    fill: none !important;\r\n    stroke: rgba(36, 135, 255, 0.64) !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-destination-aura {\r\n    fill: rgba(23, 114, 255, 0.21) !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-destination-blue {\r\n    fill: #157cff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psgr-widget .psgr-destination-core {\r\n    fill: #f8fdff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n<\/style>\r\n\r\n<script>\r\n  (() => {\r\n    \"use strict\";\r\n\r\n    const ROOT_SELECTOR = \"[data-psgr-widget]\";\r\n\r\n    const numberFrom = (value, fallback, minimum, maximum) => {\r\n      const parsed = Number.parseFloat(value);\r\n      if (!Number.isFinite(parsed)) return fallback;\r\n      return Math.min(maximum, Math.max(minimum, parsed));\r\n    };\r\n\r\n    const easeInOutSine = (value) =>\r\n      -(Math.cos(Math.PI * Math.min(1, Math.max(0, value))) - 1) \/ 2;\r\n\r\n    const initialise = (root) => {\r\n      if (!root || root.dataset.psgrReady === \"true\") return;\r\n      root.dataset.psgrReady = \"true\";\r\n\r\n      const frame = root.querySelector(\"[data-psgr-frame]\");\r\n      const map = root.querySelector(\"[data-psgr-map]\");\r\n      const route = root.querySelector(\"[data-psgr-route]\");\r\n      const traveller = root.querySelector(\"[data-psgr-traveller]\");\r\n      if (!frame || !map || !route || !traveller) return;\r\n\r\n      const imageUrl = (root.dataset.imageUrl || \"\").trim();\r\n      if (imageUrl) map.src = imageUrl;\r\n\r\n      const aspectRatio = numberFrom(root.dataset.aspectRatio, 2.192, 1.2, 5);\r\n      const sizePercent = numberFrom(root.dataset.size, 100, 40, 180);\r\n      const maxWidth = numberFrom(root.dataset.maxWidth, 1400, 200, 5000);\r\n      const mobileHeight = numberFrom(root.dataset.mobileHeight, 1.5, 1, 3);\r\n      const tallBreakpoint = numberFrom(root.dataset.tallBreakpoint, 1024, 320, 2400);\r\n      const routeSeconds = numberFrom(root.dataset.routeSeconds, 6.4, 1.5, 60);\r\n      const pauseSeconds = numberFrom(root.dataset.pauseSeconds, 0.55, 0, 10);\r\n      const pulseSeconds = numberFrom(root.dataset.pulseSeconds, 1.9, 0.5, 12);\r\n\r\n      root.style.setProperty(\"--psgr-pulse-duration\", `${pulseSeconds}s`);\r\n\r\n      let routeLength = 0;\r\n      let animationFrame = 0;\r\n      let isVisible = true;\r\n      let resizeFrame = 0;\r\n      let lastWidth = 0;\r\n\r\n      const setMeasuredHeight = () => {\r\n        const parent = root.parentElement;\r\n        const parentWidth = parent\r\n          ? parent.getBoundingClientRect().width\r\n          : root.getBoundingClientRect().width;\r\n        const availableWidth = Math.max(\r\n          1,\r\n          parentWidth || root.getBoundingClientRect().width || window.innerWidth\r\n        );\r\n        const visualWidth = Math.min(maxWidth, availableWidth * (sizePercent \/ 100));\r\n        const useTallerLayout = window.innerWidth <= tallBreakpoint;\r\n        const heightMultiplier = useTallerLayout ? mobileHeight : 1;\r\n        const visualHeight = (visualWidth \/ aspectRatio) * heightMultiplier;\r\n        const roundedWidth = Math.round(visualWidth * 100) \/ 100;\r\n        const roundedHeight = Math.round(visualHeight * 100) \/ 100;\r\n\r\n        \/\/ Explicit pixel dimensions solve Elementor's zero\/unknown-height issue on mobile.\r\n        root.style.setProperty(\"--psgr-frame-width\", `${roundedWidth}px`);\r\n        root.style.setProperty(\"--psgr-frame-height\", `${roundedHeight}px`);\r\n        root.style.setProperty(\"--psgr-layout-height\", `${roundedHeight}px`);\r\n        root.style.height = `${roundedHeight}px`;\r\n        root.style.minHeight = `${roundedHeight}px`;\r\n\r\n        frame.style.width = `${roundedWidth}px`;\r\n        frame.style.height = `${roundedHeight}px`;\r\n\r\n        \/\/ Give Elementor's immediate widget container the same measurable floor.\r\n        const elementorContainer = root.closest(\".elementor-widget-container\");\r\n        if (elementorContainer) {\r\n          elementorContainer.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n\r\n        const elementorWidget = root.closest(\".elementor-widget-html\");\r\n        if (elementorWidget) {\r\n          elementorWidget.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n\r\n        if (Math.abs(lastWidth - roundedWidth) > 0.5) {\r\n          lastWidth = roundedWidth;\r\n          routeLength = route.getTotalLength();\r\n        }\r\n      };\r\n\r\n      const queueMeasuredHeight = () => {\r\n        cancelAnimationFrame(resizeFrame);\r\n        resizeFrame = requestAnimationFrame(setMeasuredHeight);\r\n      };\r\n\r\n      const totalCycleMs = (routeSeconds + pauseSeconds * 2) * 1000;\r\n      const startPauseRatio = pauseSeconds \/ (routeSeconds + pauseSeconds * 2);\r\n      const travelRatio = routeSeconds \/ (routeSeconds + pauseSeconds * 2);\r\n      const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n\r\n      \/*\r\n       * SVG paint hard-lock.\r\n       * This defeats global rules such as:\r\n       * svg path { fill: url(#someGradient) !important; }\r\n       * without changing the route or pulse animations.\r\n       *\/\r\n      const lockSvgPaint = () => {\r\n        const setPaint = (selector, fill, stroke) => {\r\n          root.querySelectorAll(selector).forEach((el) => {\r\n            if (fill !== null) {\r\n              el.style.setProperty(\"fill\", fill, \"important\");\r\n            }\r\n            if (stroke !== null) {\r\n              el.style.setProperty(\"stroke\", stroke, \"important\");\r\n            }\r\n          });\r\n        };\r\n\r\n        setPaint(\".psgr-route-shadow\", \"none\", \"rgba(0, 16, 50, 0.72)\");\r\n        setPaint(\".psgr-route-glow\", \"none\", \"rgba(19, 111, 255, 0.34)\");\r\n        setPaint(\".psgr-route-line\", \"none\", \"rgba(114, 194, 255, 0.94)\");\r\n\r\n        setPaint(\".psgr-departure-sparks circle\", \"#dff7ff\", \"#208aff\");\r\n\r\n        setPaint(\".psgr-traveller-aura\", \"rgba(23, 121, 255, 0.2)\", \"none\");\r\n        setPaint(\".psgr-traveller-glow\", \"#1684ff\", \"none\");\r\n        setPaint(\".psgr-traveller-core\", \"#f7fdff\", \"none\");\r\n\r\n        setPaint(\".psgr-destination-wave\", \"none\", \"rgba(36, 135, 255, 0.64)\");\r\n        setPaint(\".psgr-destination-aura\", \"rgba(23, 114, 255, 0.21)\", \"none\");\r\n        setPaint(\".psgr-destination-blue\", \"#157cff\", \"none\");\r\n        setPaint(\".psgr-destination-core\", \"#f8fdff\", \"none\");\r\n      };\r\n\r\n      lockSvgPaint();\r\n\r\n      \/*\r\n       * Re-apply after Elementor\/theme scripts finish styling the page.\r\n       * This is lightweight and does not run continuously.\r\n       *\/\r\n      requestAnimationFrame(lockSvgPaint);\r\n      window.setTimeout(lockSvgPaint, 250);\r\n      window.setTimeout(lockSvgPaint, 900);\r\n\r\n      const clockOrigin = performance.now();\r\n\r\n      const positionTraveller = (routeProgress, opacity, scale) => {\r\n        if (!routeLength) routeLength = route.getTotalLength();\r\n        const point = route.getPointAtLength(routeLength * routeProgress);\r\n        traveller.setAttribute(\r\n          \"transform\",\r\n          `translate(${point.x.toFixed(3)} ${point.y.toFixed(3)}) scale(${scale.toFixed(3)})`\r\n        );\r\n        traveller.style.opacity = opacity.toFixed(3);\r\n      };\r\n\r\n      const animate = (now) => {\r\n        if (reducedMotion.matches) {\r\n          positionTraveller(0.72, 0.9, 1);\r\n          animationFrame = 0;\r\n          return;\r\n        }\r\n\r\n        if (isVisible) {\r\n          const phase = ((now - clockOrigin) % totalCycleMs) \/ totalCycleMs;\r\n\r\n          if (phase < startPauseRatio) {\r\n            const local = startPauseRatio > 0 ? phase \/ startPauseRatio : 1;\r\n            positionTraveller(0, Math.sin(local * Math.PI) * 0.72, 0.72 + local * 0.18);\r\n          } else if (phase < startPauseRatio + travelRatio) {\r\n            const linearTravel = (phase - startPauseRatio) \/ travelRatio;\r\n            const routeProgress = easeInOutSine(linearTravel);\r\n            const rhythmicPulse = 0.94 + Math.sin(linearTravel * Math.PI * 8) * 0.06;\r\n            const fadeAtEnds = Math.min(1, linearTravel * 8, (1 - linearTravel) * 8);\r\n            positionTraveller(\r\n              routeProgress,\r\n              0.46 + fadeAtEnds * 0.54,\r\n              rhythmicPulse\r\n            );\r\n          } else {\r\n            const remaining = 1 - phase;\r\n            const local = startPauseRatio > 0 ? remaining \/ startPauseRatio : 0;\r\n            positionTraveller(1, Math.max(0, local) * 0.7, 0.82 + Math.max(0, local) * 0.18);\r\n          }\r\n        }\r\n\r\n        animationFrame = requestAnimationFrame(animate);\r\n      };\r\n\r\n      setMeasuredHeight();\r\n      requestAnimationFrame(setMeasuredHeight);\r\n      window.setTimeout(setMeasuredHeight, 180);\r\n      window.setTimeout(setMeasuredHeight, 600);\r\n\r\n      if (\"ResizeObserver\" in window) {\r\n        const resizeObserver = new ResizeObserver(queueMeasuredHeight);\r\n        resizeObserver.observe(root.parentElement || root);\r\n        root._psgrResizeObserver = resizeObserver;\r\n      }\r\n\r\n      \/\/ Required even with ResizeObserver because the 1024px height mode is viewport-based.\r\n      window.addEventListener(\"resize\", queueMeasuredHeight, { passive: true });\r\n\r\n      if (\"IntersectionObserver\" in window) {\r\n        const visibilityObserver = new IntersectionObserver(\r\n          (entries) => {\r\n            isVisible = entries[0]?.isIntersecting ?? true;\r\n          },\r\n          { rootMargin: \"120px 0px\" }\r\n        );\r\n        visibilityObserver.observe(root);\r\n        root._psgrVisibilityObserver = visibilityObserver;\r\n      }\r\n\r\n      reducedMotion.addEventListener?.(\"change\", () => {\r\n        if (!animationFrame) animationFrame = requestAnimationFrame(animate);\r\n      });\r\n\r\n      animationFrame = requestAnimationFrame(animate);\r\n    };\r\n\r\n    document.querySelectorAll(ROOT_SELECTOR).forEach(initialise);\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-448c9be e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"448c9be\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7e9c45a elementor-widget elementor-widget-heading\" data-id=\"7e9c45a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">01<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6db41df elementor-widget elementor-widget-heading\" data-id=\"6db41df\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Close Sight-Unseen Booking Faster<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a66873d elementor-widget elementor-widget-text-editor\" data-id=\"a66873d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Immersive spatial tours let clients explore every detail remotely &#8211; reducing uncertainty and accelerating decisions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-9de0c7a e-con e-atomic-element e-flexbox-base e-9de0c7a-788b958 \" data-id=\"9de0c7a\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"9de0c7a\" data-e-type=\"e-flexbox\" data-id=\"9de0c7a\">\n    <div class=\"elementor-element elementor-element-b793eed e-flex e-con-boxed e-con e-parent\" data-id=\"b793eed\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-dcb0832 e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"dcb0832\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2166b62 elementor-widget elementor-widget-heading\" data-id=\"2166b62\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">02<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f1b0e35 elementor-widget elementor-widget-heading\" data-id=\"f1b0e35\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Turn Attention Into Discoverability.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-bbd365b elementor-widget elementor-widget-text-editor\" data-id=\"bbd365b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Capture attention and sustain engagement. Spatial content keeps prospects exploring longer &#8211; and converts more.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-7270981 e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"7270981\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-85c94a8 elementor-widget elementor-widget-html\" data-id=\"85c94a8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n  PANOSKY \u2014 ENGAGEMENT JOURNEY \/ FLIPPED CARD v2 \u2014 SVG ISOLATED\r\n  Paste this entire file into one Elementor HTML widget.\r\n\r\n  QUICK CONTROLS:\r\n  data-image-url       = direct background-image URL\r\n  data-cycle-seconds   = travelling time from the first to the final icon\r\n  data-pause-seconds   = pause at the beginning and end\r\n  data-glow-window     = how long each icon stays illuminated (0.02\u20130.12)\r\n  data-size            = card width as a percentage of the Elementor container\r\n  data-max-width       = maximum card width in pixels\r\n  data-mobile-height   = tablet\/mobile height multiplier\r\n  data-tall-breakpoint = maximum viewport width using the taller layout\r\n\r\n  Edit the five labels directly inside .psj-node-label elements.\r\n-->\r\n\r\n<div\r\n  class=\"psj-widget\"\r\n  data-psj-widget\r\n  data-image-url=\"https:\/\/images.pexels.com\/photos\/13722878\/pexels-photo-13722878.jpeg\"\r\n  data-cycle-seconds=\"7.2\"\r\n  data-pause-seconds=\"0.55\"\r\n  data-glow-window=\"0.055\"\r\n  data-size=\"100\"\r\n  data-max-width=\"1400\"\r\n  data-aspect-ratio=\"2.192\"\r\n  data-mobile-height=\"1.5\"\r\n  data-tall-breakpoint=\"1024\"\r\n>\r\n  <figure\r\n    class=\"psj-frame\"\r\n    data-psj-frame\r\n    role=\"img\"\r\n    aria-label=\"An animated five-step journey from homepage view to inquiry submission\"\r\n  >\r\n    <img class=\"psj-map\" data-psj-map alt=\"\" decoding=\"async\" \/>\r\n    <span class=\"psj-image-treatment\" aria-hidden=\"true\"><\/span>\r\n\r\n    <div class=\"psj-ui-plane\" aria-hidden=\"true\">\r\n      <svg\r\n        class=\"psj-route-layer\"\r\n        viewBox=\"0 0 1000 456.2\"\r\n        preserveAspectRatio=\"none\"\r\n      >\r\n        <path\r\n          class=\"psj-route-glow\"\r\n          d=\"M 150 204 C 205 198 256 226 320 216 C 376 207 418 190 486 200 C 548 209 592 229 655 217 C 720 205 778 193 838 202\"\r\n        \/>\r\n        <path\r\n          class=\"psj-route-dots\"\r\n          data-psj-route\r\n          d=\"M 150 204 C 205 198 256 226 320 216 C 376 207 418 190 486 200 C 548 209 592 229 655 217 C 720 205 778 193 838 202\"\r\n        \/>\r\n      <\/svg>\r\n\r\n      <div class=\"psj-node\" data-psj-node data-x=\"150\" data-y=\"204\" style=\"--psj-x: 15%; --psj-y: 44.72%;\">\r\n        <span class=\"psj-node-orb\">\r\n          <svg class=\"psj-node-icon\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n            <path d=\"M5 24s7-10 19-10 19 10 19 10-7 10-19 10S5 24 5 24Z\" \/>\r\n            <circle cx=\"24\" cy=\"24\" r=\"5.5\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psj-node-label\"><span>Homepage<\/span><span>View<\/span><\/span>\r\n      <\/div>\r\n\r\n      <div class=\"psj-node\" data-psj-node data-x=\"320\" data-y=\"216\" style=\"--psj-x: 32%; --psj-y: 47.35%;\">\r\n        <span class=\"psj-node-orb\">\r\n          <svg class=\"psj-node-icon\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n            <path d=\"m24 6 15 8.6v18.8L24 42 9 33.4V14.6L24 6Z\" \/>\r\n            <path d=\"m16 18.8 8-4.6 8 4.6-8 4.6-8-4.6Z\" \/>\r\n            <path d=\"M16 19v9.3l8 4.6 8-4.6V19M24 23.5v9.4\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psj-node-label\"><span>3D Tour<\/span><span>Start<\/span><\/span>\r\n      <\/div>\r\n\r\n      <div class=\"psj-node\" data-psj-node data-x=\"486\" data-y=\"200\" style=\"--psj-x: 48.6%; --psj-y: 43.84%;\">\r\n        <span class=\"psj-node-orb\">\r\n          <svg class=\"psj-node-icon\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n            <path d=\"m24 7.5 4.8 9.8 10.8 1.5-7.8 7.6 1.9 10.7L24 32l-9.7 5.1 1.9-10.7-7.8-7.6 10.8-1.5L24 7.5Z\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psj-node-label\"><span>Key Space<\/span><span>Viewed<\/span><\/span>\r\n      <\/div>\r\n\r\n      <div class=\"psj-node\" data-psj-node data-x=\"655\" data-y=\"217\" style=\"--psj-x: 65.5%; --psj-y: 47.57%;\">\r\n        <span class=\"psj-node-orb\">\r\n          <svg class=\"psj-node-icon\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n            <path d=\"M14 6.5h15l7 7V41.5H14V6.5Z\" \/>\r\n            <path d=\"M29 6.5v7h7M20 21h10M20 27h10M20 33h8\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psj-node-label\"><span>Spec Sheet<\/span><span>Opened<\/span><\/span>\r\n      <\/div>\r\n\r\n      <div class=\"psj-node\" data-psj-node data-x=\"838\" data-y=\"202\" style=\"--psj-x: 83.8%; --psj-y: 44.28%;\">\r\n        <span class=\"psj-node-orb\">\r\n          <svg class=\"psj-node-icon\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\r\n            <path d=\"M6.5 22.5 41 7 29 41l-6.8-12.2L6.5 22.5Z\" \/>\r\n            <path d=\"M22.2 28.8 41 7\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psj-node-label\"><span>Inquiry<\/span><span>Submitted<\/span><\/span>\r\n      <\/div>\r\n\r\n      <!-- Separate foreground layer keeps the travelling light above the icons. -->\r\n      <svg\r\n        class=\"psj-traveller-layer\"\r\n        viewBox=\"0 0 1000 456.2\"\r\n        preserveAspectRatio=\"none\"\r\n      >\r\n        <g class=\"psj-traveller\" data-psj-traveller>\r\n          <circle class=\"psj-traveller-aura\" r=\"18\" \/>\r\n          <circle class=\"psj-traveller-blue\" r=\"7.4\" \/>\r\n          <circle class=\"psj-traveller-core\" r=\"2.9\" \/>\r\n        <\/g>\r\n      <\/svg>\r\n    <\/div>\r\n  <\/figure>\r\n<\/div>\r\n\r\n<style>\r\n  \/* Isolated names allow this widget to sit beside the original route-map widget. *\/\r\n  .psj-widget,\r\n  .psj-widget * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .psj-widget {\r\n    --psj-layout-height: auto;\r\n    --psj-frame-width: 100%;\r\n    --psj-frame-height: auto;\r\n    --psj-blue: #2589ff;\r\n    --psj-cyan: #82d4ff;\r\n    position: relative;\r\n    display: block;\r\n    width: 100%;\r\n    max-width: 100%;\r\n    aspect-ratio: 2.192 \/ 1;\r\n    height: var(--psj-layout-height);\r\n    min-height: var(--psj-layout-height);\r\n    overflow: visible;\r\n    isolation: isolate;\r\n    container-type: inline-size;\r\n    background: transparent !important;\r\n    font-family: var(\r\n      --e-global-typography-primary-font-family,\r\n      \"Satoshi\",\r\n      \"Helvetica Neue\",\r\n      Arial,\r\n      sans-serif\r\n    );\r\n  }\r\n\r\n  .psj-frame {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 50%;\r\n    width: var(--psj-frame-width);\r\n    height: var(--psj-frame-height);\r\n    aspect-ratio: 2.192 \/ 1;\r\n    min-height: 1px;\r\n    margin: 0;\r\n    overflow: hidden;\r\n    transform: translateX(-50%);\r\n    border: 1px solid rgba(150, 179, 216, 0.34);\r\n    \/* Horizontally flipped: small left corners, signature large right corners. *\/\r\n    border-radius: 2.8% 20% 20% 2.8% \/ 7% 40% 40% 7%;\r\n    background: #031126;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(213, 230, 255, 0.05),\r\n      inset 0 -26px 50px rgba(0, 8, 22, 0.3),\r\n      0 0 0 1px rgba(0, 18, 49, 0.45);\r\n    user-select: none;\r\n    -webkit-user-select: none;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psj-frame::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    z-index: 9;\r\n    inset: 0;\r\n    border: 1px solid rgba(221, 237, 255, 0.055);\r\n    border-radius: inherit;\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255, 255, 255, 0.045),\r\n      inset 0 0 35px rgba(0, 10, 30, 0.22);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psj-map,\r\n  .psj-image-treatment {\r\n    position: absolute;\r\n    inset: 0;\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n  }\r\n\r\n  .psj-map {\r\n    z-index: 0;\r\n    inset: auto;\r\n    top: 50%;\r\n    left: 50%;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    max-width: none !important;\r\n    min-width: 100%;\r\n    min-height: 100%;\r\n    object-fit: cover !important;\r\n    object-position: 50% 50% !important;\r\n    filter: brightness(1.5) saturate(1.2) contrast(1);\r\n    transform: translate(-50%, -50%);\r\n    transform-origin: center center;\r\n  }\r\n\r\n  .psj-image-treatment {\r\n    z-index: 1;\r\n    background:\r\n      radial-gradient(\r\n        76% 95% at 48% 46%,\r\n        rgba(7, 26, 55, 0.02) 12%,\r\n        rgba(1, 12, 30, 0.22) 76%,\r\n        rgba(0, 7, 20, 0.53) 100%\r\n      ),\r\n      linear-gradient(\r\n        180deg,\r\n        rgba(2, 14, 33, 0.22) 0%,\r\n        rgba(1, 13, 31, 0.07) 44%,\r\n        rgba(0, 8, 22, 0.34) 100%\r\n      );\r\n  }\r\n\r\n  .psj-ui-plane {\r\n    position: absolute;\r\n    z-index: 3;\r\n    top: 50%;\r\n    left: 0;\r\n    width: 100%;\r\n    height: auto;\r\n    aspect-ratio: 1000 \/ 456.2;\r\n    overflow: visible;\r\n    transform: translateY(-50%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psj-route-layer,\r\n  .psj-traveller-layer {\r\n    position: absolute;\r\n    inset: 0;\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: visible;\r\n  }\r\n\r\n  .psj-route-layer {\r\n    z-index: 1;\r\n  }\r\n\r\n  .psj-traveller-layer {\r\n    z-index: 5;\r\n  }\r\n\r\n  .psj-route-glow,\r\n  .psj-route-dots {\r\n    fill: none;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    vector-effect: non-scaling-stroke;\r\n  }\r\n\r\n  .psj-route-glow {\r\n    stroke: rgba(31, 130, 255, 0.32);\r\n    stroke-width: 4px;\r\n    stroke-dasharray: 1.5 7;\r\n    filter: blur(2.4px) drop-shadow(0 0 5px rgba(30, 130, 255, 0.7));\r\n  }\r\n\r\n  .psj-route-dots {\r\n    stroke: rgba(96, 181, 255, 0.94);\r\n    stroke-width: 1.6px;\r\n    stroke-dasharray: 1.5 7;\r\n    filter: drop-shadow(0 0 2px rgba(31, 128, 255, 0.9));\r\n  }\r\n\r\n  .psj-node {\r\n    --psj-node-size: clamp(36px, 5.8cqw, 72px);\r\n    --psj-label-gap: clamp(5px, 0.75cqw, 10px);\r\n    position: absolute;\r\n    z-index: 3;\r\n    top: var(--psj-y);\r\n    left: var(--psj-x);\r\n    width: clamp(62px, 12.5cqw, 158px);\r\n    transform: translateX(-50%);\r\n    text-align: center;\r\n    color: rgba(238, 247, 255, 0.89);\r\n  }\r\n\r\n  .psj-node-orb {\r\n    position: relative;\r\n    display: grid;\r\n    place-items: center;\r\n    width: var(--psj-node-size);\r\n    height: var(--psj-node-size);\r\n    margin-inline: auto;\r\n    transform: translateY(-50%);\r\n    border: 1px solid rgba(70, 165, 255, 0.7);\r\n    border-radius: 50%;\r\n    background: rgba(3, 15, 34, 0.8);\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(143, 207, 255, 0.08),\r\n      0 0 0 2px rgba(0, 11, 31, 0.45),\r\n      0 5px 16px rgba(0, 5, 18, 0.42);\r\n    -webkit-backdrop-filter: blur(7px);\r\n    backdrop-filter: blur(7px);\r\n    transition:\r\n      transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),\r\n      border-color 180ms ease,\r\n      background-color 180ms ease,\r\n      box-shadow 180ms ease;\r\n  }\r\n\r\n  .psj-node-icon {\r\n    display: block;\r\n    width: 52%;\r\n    height: 52%;\r\n    overflow: visible;\r\n    fill: none;\r\n    stroke: currentColor;\r\n    stroke-width: 2.35;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    color: rgba(242, 249, 255, 0.94);\r\n    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.7));\r\n    transition:\r\n      color 180ms ease,\r\n      filter 180ms ease,\r\n      transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1);\r\n  }\r\n\r\n  .psj-node-label {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: clamp(1px, 0.2cqw, 3px);\r\n    margin-top: calc(var(--psj-node-size) * -0.5 + var(--psj-label-gap));\r\n    font-family: inherit;\r\n    font-size: clamp(10px, 1.58cqw, 20px);\r\n    font-weight: 500;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.015em;\r\n    color: rgba(246, 250, 255, 0.88);\r\n    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.9);\r\n    transition:\r\n      color 180ms ease,\r\n      text-shadow 180ms ease,\r\n      transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1);\r\n  }\r\n\r\n  .psj-node.is-active .psj-node-orb {\r\n    transform: translateY(-50%) scale(1.09);\r\n    border-color: rgba(143, 221, 255, 1);\r\n    background: rgba(4, 35, 78, 0.92);\r\n    box-shadow:\r\n      inset 0 0 17px rgba(49, 146, 255, 0.4),\r\n      0 0 0 3px rgba(34, 130, 255, 0.16),\r\n      0 0 13px rgba(36, 138, 255, 0.94),\r\n      0 0 27px rgba(36, 138, 255, 0.66);\r\n  }\r\n\r\n  .psj-node.is-active .psj-node-icon {\r\n    color: #ffffff;\r\n    transform: scale(1.06);\r\n    filter:\r\n      drop-shadow(0 0 3px #ffffff)\r\n      drop-shadow(0 0 8px rgba(65, 177, 255, 1));\r\n  }\r\n\r\n  .psj-node.is-active .psj-node-label {\r\n    color: #ffffff;\r\n    transform: translateY(1px);\r\n    text-shadow:\r\n      0 0 5px rgba(255, 255, 255, 0.68),\r\n      0 0 13px rgba(45, 151, 255, 0.95),\r\n      0 1px 3px rgba(0, 0, 0, 0.9);\r\n  }\r\n\r\n  .psj-traveller {\r\n    opacity: 0;\r\n    transform-box: view-box;\r\n    will-change: transform, opacity;\r\n  }\r\n\r\n  .psj-traveller-aura {\r\n    fill: rgba(28, 128, 255, 0.25);\r\n    filter: blur(3.8px);\r\n  }\r\n\r\n  .psj-traveller-blue {\r\n    fill: #1885ff;\r\n    filter:\r\n      drop-shadow(0 0 5px #177cff)\r\n      drop-shadow(0 0 11px rgba(61, 166, 255, 0.96));\r\n  }\r\n\r\n  .psj-traveller-core {\r\n    fill: #ffffff;\r\n    filter: drop-shadow(0 0 3px #ffffff);\r\n  }\r\n\r\n  \/* CSS fallback: tablet\/mobile are 1.5\u00d7 taller before JavaScript measures. *\/\r\n  @media (max-width: 1024px) {\r\n    .psj-widget,\r\n    .psj-frame {\r\n      aspect-ratio: 1.461333 \/ 1;\r\n    }\r\n\r\n    .psj-frame {\r\n      --psj-tablet-small-corner: clamp(14px, 2.8cqw, 30px);\r\n      --psj-tablet-large-corner: clamp(80px, 10.8cqw, 112px);\r\n      border-radius:\r\n        var(--psj-tablet-small-corner)\r\n        var(--psj-tablet-large-corner)\r\n        var(--psj-tablet-large-corner)\r\n        var(--psj-tablet-small-corner);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 540px) {\r\n    .psj-frame {\r\n      --psj-mobile-corner: clamp(12px, 3.4cqw, 18px);\r\n      border-radius: var(--psj-mobile-corner);\r\n    }\r\n\r\n    .psj-node {\r\n      --psj-node-size: clamp(32px, 9.2cqw, 38px);\r\n      --psj-label-gap: 5px;\r\n      width: clamp(57px, 15cqw, 64px);\r\n    }\r\n\r\n    .psj-node-label {\r\n      font-size: clamp(9px, 2.65cqw, 10.5px);\r\n      line-height: 1.05;\r\n    }\r\n\r\n    .psj-route-dots {\r\n      stroke-width: 1.35px;\r\n      stroke-dasharray: 1.3 6;\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .psj-node-orb,\r\n    .psj-node-icon,\r\n    .psj-node-label {\r\n      transition: none;\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     SVG PAINT ISOLATION\r\n     Prevents external Elementor\/theme SVG gradient rules from\r\n     hijacking this widget's icons, route paths, or traveller.\r\n     ========================================================= *\/\r\n\r\n  \/* Journey icons stay outline-only and continue using currentColor. *\/\r\n  .psj-widget .psj-node-icon,\r\n  .psj-widget .psj-node-icon path,\r\n  .psj-widget .psj-node-icon circle,\r\n  .psj-widget .psj-node-icon rect,\r\n  .psj-widget .psj-node-icon line,\r\n  .psj-widget .psj-node-icon polyline,\r\n  .psj-widget .psj-node-icon polygon,\r\n  .psj-widget .psj-node-icon ellipse {\r\n    fill: none !important;\r\n  }\r\n\r\n  .psj-widget .psj-node-icon path,\r\n  .psj-widget .psj-node-icon circle,\r\n  .psj-widget .psj-node-icon rect,\r\n  .psj-widget .psj-node-icon line,\r\n  .psj-widget .psj-node-icon polyline,\r\n  .psj-widget .psj-node-icon polygon,\r\n  .psj-widget .psj-node-icon ellipse {\r\n    stroke: currentColor !important;\r\n  }\r\n\r\n  \/* Route SVG paths keep their original non-filled paint. *\/\r\n  .psj-widget .psj-route-glow {\r\n    fill: none !important;\r\n    stroke: rgba(31, 130, 255, 0.32) !important;\r\n  }\r\n\r\n  .psj-widget .psj-route-dots {\r\n    fill: none !important;\r\n    stroke: rgba(96, 181, 255, 0.94) !important;\r\n  }\r\n\r\n  \/* Travelling light circles keep their intended individual fills. *\/\r\n  .psj-widget .psj-traveller-aura {\r\n    fill: rgba(28, 128, 255, 0.25) !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psj-widget .psj-traveller-blue {\r\n    fill: #1885ff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n  .psj-widget .psj-traveller-core {\r\n    fill: #ffffff !important;\r\n    stroke: none !important;\r\n  }\r\n\r\n<\/style>\r\n\r\n<script>\r\n  (() => {\r\n    \"use strict\";\r\n\r\n    const ROOT_SELECTOR = \"[data-psj-widget]\";\r\n\r\n    const numberFrom = (value, fallback, minimum, maximum) => {\r\n      const parsed = Number.parseFloat(value);\r\n      if (!Number.isFinite(parsed)) return fallback;\r\n      return Math.min(maximum, Math.max(minimum, parsed));\r\n    };\r\n\r\n    const easeInOutSine = (value) =>\r\n      -(Math.cos(Math.PI * Math.min(1, Math.max(0, value))) - 1) \/ 2;\r\n\r\n    const initialise = (root) => {\r\n      if (!root || root.dataset.psjReady === \"true\") return;\r\n      root.dataset.psjReady = \"true\";\r\n\r\n      const frame = root.querySelector(\"[data-psj-frame]\");\r\n      const map = root.querySelector(\"[data-psj-map]\");\r\n      const route = root.querySelector(\"[data-psj-route]\");\r\n      const traveller = root.querySelector(\"[data-psj-traveller]\");\r\n      const nodes = Array.from(root.querySelectorAll(\"[data-psj-node]\"));\r\n      if (!frame || !map || !route || !traveller || !nodes.length) return;\r\n\r\n      const imageUrl = (root.dataset.imageUrl || \"\").trim();\r\n      if (imageUrl) map.src = imageUrl;\r\n\r\n      const aspectRatio = numberFrom(root.dataset.aspectRatio, 2.192, 1.2, 5);\r\n      const sizePercent = numberFrom(root.dataset.size, 100, 40, 180);\r\n      const maxWidth = numberFrom(root.dataset.maxWidth, 1400, 200, 5000);\r\n      const mobileHeight = numberFrom(root.dataset.mobileHeight, 1.5, 1, 3);\r\n      const tallBreakpoint = numberFrom(root.dataset.tallBreakpoint, 1024, 320, 2400);\r\n      const cycleSeconds = numberFrom(root.dataset.cycleSeconds, 7.2, 1.5, 60);\r\n      const pauseSeconds = numberFrom(root.dataset.pauseSeconds, 0.55, 0, 10);\r\n      const glowWindow = numberFrom(root.dataset.glowWindow, 0.055, 0.015, 0.2);\r\n\r\n      let routeLength = 0;\r\n      let animationFrame = 0;\r\n      let resizeFrame = 0;\r\n      let lastWidth = 0;\r\n      let nodeRoutePositions = [];\r\n\r\n      const findNearestRoutePosition = (targetX, targetY) => {\r\n        const samples = 420;\r\n        let nearestProgress = 0;\r\n        let nearestDistance = Number.POSITIVE_INFINITY;\r\n\r\n        for (let index = 0; index <= samples; index += 1) {\r\n          const progress = index \/ samples;\r\n          const point = route.getPointAtLength(routeLength * progress);\r\n          const dx = point.x - targetX;\r\n          const dy = point.y - targetY;\r\n          const distance = dx * dx + dy * dy;\r\n          if (distance < nearestDistance) {\r\n            nearestDistance = distance;\r\n            nearestProgress = progress;\r\n          }\r\n        }\r\n\r\n        return nearestProgress;\r\n      };\r\n\r\n      const measureRoute = () => {\r\n        routeLength = route.getTotalLength();\r\n        nodeRoutePositions = nodes.map((node) =>\r\n          findNearestRoutePosition(\r\n            numberFrom(node.dataset.x, 0, 0, 1000),\r\n            numberFrom(node.dataset.y, 0, 0, 456.2)\r\n          )\r\n        );\r\n      };\r\n\r\n      const setMeasuredHeight = () => {\r\n        const parent = root.parentElement;\r\n        const parentWidth = parent\r\n          ? parent.getBoundingClientRect().width\r\n          : root.getBoundingClientRect().width;\r\n        const availableWidth = Math.max(\r\n          1,\r\n          parentWidth || root.getBoundingClientRect().width || window.innerWidth\r\n        );\r\n        const visualWidth = Math.min(maxWidth, availableWidth * (sizePercent \/ 100));\r\n        const useTallerLayout = window.innerWidth <= tallBreakpoint;\r\n        const heightMultiplier = useTallerLayout ? mobileHeight : 1;\r\n        const visualHeight = (visualWidth \/ aspectRatio) * heightMultiplier;\r\n        const roundedWidth = Math.round(visualWidth * 100) \/ 100;\r\n        const roundedHeight = Math.round(visualHeight * 100) \/ 100;\r\n\r\n        root.style.setProperty(\"--psj-frame-width\", `${roundedWidth}px`);\r\n        root.style.setProperty(\"--psj-frame-height\", `${roundedHeight}px`);\r\n        root.style.setProperty(\"--psj-layout-height\", `${roundedHeight}px`);\r\n        root.style.height = `${roundedHeight}px`;\r\n        root.style.minHeight = `${roundedHeight}px`;\r\n        frame.style.width = `${roundedWidth}px`;\r\n        frame.style.height = `${roundedHeight}px`;\r\n\r\n        const elementorContainer = root.closest(\".elementor-widget-container\");\r\n        if (elementorContainer) {\r\n          elementorContainer.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n\r\n        const elementorWidget = root.closest(\".elementor-widget-html\");\r\n        if (elementorWidget) {\r\n          elementorWidget.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n\r\n        if (Math.abs(lastWidth - roundedWidth) > 0.5 || !routeLength) {\r\n          lastWidth = roundedWidth;\r\n          measureRoute();\r\n        }\r\n      };\r\n\r\n      const queueMeasuredHeight = () => {\r\n        cancelAnimationFrame(resizeFrame);\r\n        resizeFrame = requestAnimationFrame(setMeasuredHeight);\r\n      };\r\n\r\n      const totalCycleMs = (cycleSeconds + pauseSeconds * 2) * 1000;\r\n      const startPauseRatio = pauseSeconds \/ (cycleSeconds + pauseSeconds * 2);\r\n      const travelRatio = cycleSeconds \/ (cycleSeconds + pauseSeconds * 2);\r\n      const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n\r\n      \/*\r\n       * SVG paint hard-lock.\r\n       * Inline !important declarations beat aggressive global rules such as:\r\n       * svg path { fill: url(#someGradient) !important; }\r\n       * while keeping this widget's currentColor-based active icon animation.\r\n       *\/\r\n      const lockSvgPaint = () => {\r\n        const paintShapes = \"path,circle,rect,line,polyline,polygon,ellipse\";\r\n\r\n        \/* Five journey icons *\/\r\n        root.querySelectorAll(\".psj-node-icon\").forEach((svg) => {\r\n          svg.style.setProperty(\"fill\", \"none\", \"important\");\r\n\r\n          svg.querySelectorAll(paintShapes).forEach((shape) => {\r\n            shape.style.setProperty(\"fill\", \"none\", \"important\");\r\n            shape.style.setProperty(\"stroke\", \"currentColor\", \"important\");\r\n          });\r\n        });\r\n\r\n        \/* Dotted\/glowing route *\/\r\n        root.querySelectorAll(\".psj-route-glow\").forEach((path) => {\r\n          path.style.setProperty(\"fill\", \"none\", \"important\");\r\n          path.style.setProperty(\r\n            \"stroke\",\r\n            \"rgba(31, 130, 255, 0.32)\",\r\n            \"important\"\r\n          );\r\n        });\r\n\r\n        root.querySelectorAll(\".psj-route-dots\").forEach((path) => {\r\n          path.style.setProperty(\"fill\", \"none\", \"important\");\r\n          path.style.setProperty(\r\n            \"stroke\",\r\n            \"rgba(96, 181, 255, 0.94)\",\r\n            \"important\"\r\n          );\r\n        });\r\n\r\n        \/* Travelling light *\/\r\n        root.querySelectorAll(\".psj-traveller-aura\").forEach((circle) => {\r\n          circle.style.setProperty(\r\n            \"fill\",\r\n            \"rgba(28, 128, 255, 0.25)\",\r\n            \"important\"\r\n          );\r\n          circle.style.setProperty(\"stroke\", \"none\", \"important\");\r\n        });\r\n\r\n        root.querySelectorAll(\".psj-traveller-blue\").forEach((circle) => {\r\n          circle.style.setProperty(\"fill\", \"#1885ff\", \"important\");\r\n          circle.style.setProperty(\"stroke\", \"none\", \"important\");\r\n        });\r\n\r\n        root.querySelectorAll(\".psj-traveller-core\").forEach((circle) => {\r\n          circle.style.setProperty(\"fill\", \"#ffffff\", \"important\");\r\n          circle.style.setProperty(\"stroke\", \"none\", \"important\");\r\n        });\r\n      };\r\n\r\n      lockSvgPaint();\r\n\r\n      \/*\r\n       * Re-apply after Elementor\/theme scripts finish their own SVG styling.\r\n       * No continuous observer is needed, so this stays lightweight.\r\n       *\/\r\n      requestAnimationFrame(lockSvgPaint);\r\n      window.setTimeout(lockSvgPaint, 250);\r\n      window.setTimeout(lockSvgPaint, 900);\r\n\r\n      let clockOrigin = performance.now();\r\n\r\n      const setActiveNode = (routeProgress, showGlow) => {\r\n        let activeIndex = -1;\r\n        let closestDistance = Number.POSITIVE_INFINITY;\r\n\r\n        nodeRoutePositions.forEach((nodeProgress, index) => {\r\n          const distance = Math.abs(routeProgress - nodeProgress);\r\n          if (distance <= glowWindow && distance < closestDistance) {\r\n            closestDistance = distance;\r\n            activeIndex = index;\r\n          }\r\n        });\r\n\r\n        nodes.forEach((node, index) => {\r\n          node.classList.toggle(\"is-active\", showGlow && index === activeIndex);\r\n        });\r\n      };\r\n\r\n      const positionTraveller = (routeProgress, opacity, scale, showGlow = true) => {\r\n        if (!routeLength) measureRoute();\r\n        const point = route.getPointAtLength(routeLength * routeProgress);\r\n        traveller.setAttribute(\r\n          \"transform\",\r\n          `translate(${point.x.toFixed(3)} ${point.y.toFixed(3)}) scale(${scale.toFixed(3)})`\r\n        );\r\n        traveller.style.opacity = opacity.toFixed(3);\r\n        setActiveNode(routeProgress, showGlow && opacity > 0.2);\r\n      };\r\n\r\n      const animate = (now) => {\r\n        if (reducedMotion.matches) {\r\n          positionTraveller(0.5, 0.92, 1, false);\r\n          animationFrame = 0;\r\n          return;\r\n        }\r\n\r\n        const phase = ((now - clockOrigin) % totalCycleMs) \/ totalCycleMs;\r\n\r\n        if (phase < startPauseRatio) {\r\n          \/\/ One continuous fade-in at the first icon\u2014no fade-out\/reappearance blink.\r\n          const local = startPauseRatio > 0 ? phase \/ startPauseRatio : 1;\r\n          const entrance = easeInOutSine(local);\r\n          positionTraveller(0, entrance, 0.72 + entrance * 0.28);\r\n        } else if (phase < startPauseRatio + travelRatio) {\r\n          const linearTravel = (phase - startPauseRatio) \/ travelRatio;\r\n          const progress = easeInOutSine(linearTravel);\r\n          const pulse = 0.95 + Math.sin(linearTravel * Math.PI * 10) * 0.05;\r\n          positionTraveller(progress, 1, pulse);\r\n        } else {\r\n          \/\/ Fade out only once at the final icon, then restart invisibly.\r\n          const endStart = startPauseRatio + travelRatio;\r\n          const local = startPauseRatio > 0\r\n            ? (phase - endStart) \/ startPauseRatio\r\n            : 1;\r\n          const exit = easeInOutSine(local);\r\n          positionTraveller(1, 1 - exit, 1 - exit * 0.18);\r\n        }\r\n\r\n        animationFrame = requestAnimationFrame(animate);\r\n      };\r\n\r\n      const restartAnimation = () => {\r\n        clockOrigin = performance.now();\r\n        traveller.style.opacity = \"0\";\r\n        nodes.forEach((node) => node.classList.remove(\"is-active\"));\r\n        if (!animationFrame) animationFrame = requestAnimationFrame(animate);\r\n      };\r\n\r\n      setMeasuredHeight();\r\n      requestAnimationFrame(setMeasuredHeight);\r\n      window.setTimeout(setMeasuredHeight, 180);\r\n      window.setTimeout(setMeasuredHeight, 600);\r\n\r\n      if (\"ResizeObserver\" in window) {\r\n        const resizeObserver = new ResizeObserver(queueMeasuredHeight);\r\n        resizeObserver.observe(root.parentElement || root);\r\n        root._psjResizeObserver = resizeObserver;\r\n      }\r\n\r\n      window.addEventListener(\"resize\", queueMeasuredHeight, { passive: true });\r\n\r\n      reducedMotion.addEventListener?.(\"change\", () => {\r\n        restartAnimation();\r\n      });\r\n\r\n      \/\/ Covers normal refresh, browser page restoration, and returning to the tab.\r\n      window.addEventListener(\"pageshow\", restartAnimation, { passive: true });\r\n      document.addEventListener(\"visibilitychange\", () => {\r\n        if (!document.hidden) restartAnimation();\r\n      });\r\n\r\n      restartAnimation();\r\n    };\r\n\r\n    document.querySelectorAll(ROOT_SELECTOR).forEach(initialise);\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-e4c9d76 e-con e-atomic-element e-flexbox-base e-e4c9d76-e35c7e9 \" data-id=\"e4c9d76\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"e4c9d76\" data-e-type=\"e-flexbox\" data-id=\"e4c9d76\">\n    <div class=\"elementor-element elementor-element-bd09c00 e-flex e-con-boxed e-con e-parent\" data-id=\"bd09c00\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-648603c e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"648603c\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-50313b0 elementor-widget elementor-widget-html\" data-id=\"50313b0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n  PANOSKY \u2014 SPACE METRICS + HOTSPOTS v2 \u2014 SVG ISOLATED\r\n  Paste this entire file into one Elementor HTML widget.\r\n\r\n  QUICK CONTROLS:\r\n  data-image-url       = direct background-image URL\r\n  data-count-seconds   = duration of the number animation\r\n  data-pulse-seconds   = duration of the alternating hotspot pulse cycle\r\n  data-size            = card width as a percentage of its Elementor container\r\n  data-max-width       = maximum card width in pixels\r\n  data-mobile-height   = tablet\/mobile height multiplier\r\n  data-tall-breakpoint = viewport width at which the taller layout begins\r\n\r\n  Edit the room name, labels, targets, suffixes, and image URL directly below.\r\n-->\r\n\r\n<div\r\n  class=\"psm-widget\"\r\n  data-psm-widget\r\n  data-image-url=\"https:\/\/images.unsplash.com\/photo-1600607687920-4e2a09cf159d?auto=format&amp;fit=crop&amp;w=2400&amp;q=90\"\r\n  data-count-seconds=\"2.2\"\r\n  data-pulse-seconds=\"2.4\"\r\n  data-size=\"100\"\r\n  data-max-width=\"1400\"\r\n  data-aspect-ratio=\"2.192\"\r\n  data-mobile-height=\"1.5\"\r\n  data-tall-breakpoint=\"1024\"\r\n>\r\n  <figure\r\n    class=\"psm-frame\"\r\n    data-psm-frame\r\n    role=\"img\"\r\n    aria-label=\"An interactive spatial overview showing room dimensions, capacity, ceiling height, and natural light\"\r\n  >\r\n    <img class=\"psm-image\" data-psm-image alt=\"\" decoding=\"async\" \/>\r\n    <span class=\"psm-image-treatment\" aria-hidden=\"true\"><\/span>\r\n\r\n    <div class=\"psm-ui-plane\">\r\n      <!-- Hotspot 1: spatial dimensions \/ precise measurement. -->\r\n      <div class=\"psm-hotspot psm-hotspot-a\" aria-hidden=\"true\">\r\n        <span class=\"psm-hotspot-orb\">\r\n         <svg class=\"psm-hotspot-icon\" viewBox=\"0 0 48 48\">\r\n  <!-- Top-left corner -->\r\n  <path d=\"M10 30V10H30\" \/>\r\n\r\n  <!-- Bottom-right corner -->\r\n  <path d=\"M18 38H38V18\" opacity=\"0.72\" \/>\r\n\r\n  <!-- Center diagonal -->\r\n  <path d=\"M15 33L33 15\" \/>\r\n\r\n  <!-- Top-right arrow corner -->\r\n  <path d=\"M26 15H33V22\" \/>\r\n\r\n  <!-- Bottom-left arrow corner -->\r\n  <path d=\"M22 33H15V26\" \/>\r\n<\/svg>\r\n        <\/span>\r\n        <span class=\"psm-hotspot-dot\"><\/span>\r\n      <\/div>\r\n\r\n      <!-- Hotspot 2: natural-light analysis. -->\r\n      <div class=\"psm-hotspot psm-hotspot-b\" aria-hidden=\"true\">\r\n        <span class=\"psm-hotspot-orb\">\r\n          <svg class=\"psm-hotspot-icon\" viewBox=\"0 0 48 48\">\r\n            <circle cx=\"24\" cy=\"24\" r=\"7\" \/>\r\n            <path d=\"M24 7v5M24 36v5M7 24h5M36 24h5M12 12l3.6 3.6M32.4 32.4 36 36M36 12l-3.6 3.6M15.6 32.4 12 36\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n        <span class=\"psm-hotspot-dot\"><\/span>\r\n      <\/div>\r\n\r\n      <section class=\"psm-metrics-panel\" data-psm-panel aria-label=\"Ballroom A spatial specifications\">\r\n        <div class=\"psm-panel-heading\">\r\n          <span>Ballroom A<\/span>\r\n          <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\r\n            <path d=\"m9 6 6 6-6 6\" \/>\r\n          <\/svg>\r\n        <\/div>\r\n\r\n        <div class=\"psm-panel-divider\"><\/div>\r\n\r\n        <dl class=\"psm-metrics-list\">\r\n          <div class=\"psm-metric-row\">\r\n            <dt>Area<\/dt>\r\n            <dd><span data-psm-count data-target=\"420\" data-decimals=\"0\">0<\/span><span class=\"psm-unit\"> sqm<\/span><\/dd>\r\n          <\/div>\r\n          <div class=\"psm-metric-row\">\r\n            <dt>Capacity<\/dt>\r\n            <dd><span data-psm-count data-target=\"250\" data-decimals=\"0\">0<\/span><span class=\"psm-unit\"> pax<\/span><\/dd>\r\n          <\/div>\r\n          <div class=\"psm-metric-row\">\r\n            <dt>Ceiling Height<\/dt>\r\n            <dd><span data-psm-count data-target=\"5.2\" data-decimals=\"1\">0.0<\/span><span class=\"psm-unit\"> m<\/span><\/dd>\r\n          <\/div>\r\n          <div class=\"psm-metric-row\">\r\n            <dt>Natural Light<\/dt>\r\n            <dd><span data-psm-reveal data-target=\"Yes\">\u2014<\/span><\/dd>\r\n          <\/div>\r\n        <\/dl>\r\n      <\/section>\r\n    <\/div>\r\n  <\/figure>\r\n<\/div>\r\n\r\n<style>\r\n  .psm-widget,\r\n  .psm-widget * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .psm-widget {\r\n    --psm-layout-height: auto;\r\n    --psm-frame-width: 100%;\r\n    --psm-frame-height: auto;\r\n    --psm-blue: #2187ff;\r\n    --psm-cyan: #81d4ff;\r\n    --psm-pulse-duration: 2.4s;\r\n    --psm-pulse-half: -1.2s;\r\n    position: relative;\r\n    display: block;\r\n    width: 100%;\r\n    max-width: 100%;\r\n    aspect-ratio: 2.192 \/ 1;\r\n    height: var(--psm-layout-height);\r\n    min-height: var(--psm-layout-height);\r\n    overflow: visible;\r\n    isolation: isolate;\r\n    container-type: inline-size;\r\n    background: transparent !important;\r\n    font-family: var(\r\n      --e-global-typography-primary-font-family,\r\n      \"Satoshi\",\r\n      \"Helvetica Neue\",\r\n      Arial,\r\n      sans-serif\r\n    );\r\n  }\r\n\r\n  .psm-frame {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 50%;\r\n    width: var(--psm-frame-width);\r\n    height: var(--psm-frame-height);\r\n    aspect-ratio: 2.192 \/ 1;\r\n    min-height: 1px;\r\n    margin: 0;\r\n    overflow: hidden;\r\n    transform: translateX(-50%);\r\n    border: 1px solid rgba(150, 179, 216, 0.34);\r\n    \/* Flipped back from the previous widget: signature corners on the left. *\/\r\n    border-radius: 20% 2.8% 2.8% 20% \/ 40% 7% 7% 40%;\r\n    background: #031126;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(213, 230, 255, 0.05),\r\n      inset 0 -26px 50px rgba(0, 8, 22, 0.3),\r\n      0 0 0 1px rgba(0, 18, 49, 0.45);\r\n    user-select: none;\r\n    -webkit-user-select: none;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psm-frame::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    z-index: 9;\r\n    inset: 0;\r\n    border: 1px solid rgba(221, 237, 255, 0.055);\r\n    border-radius: inherit;\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255, 255, 255, 0.045),\r\n      inset 0 0 35px rgba(0, 10, 30, 0.22);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psm-image,\r\n  .psm-image-treatment {\r\n    position: absolute;\r\n    display: block;\r\n  }\r\n\r\n  .psm-image {\r\n    z-index: 0;\r\n    inset: auto;\r\n    top: 50%;\r\n    left: 50%;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    max-width: none !important;\r\n    min-width: 100%;\r\n    min-height: 100%;\r\n    object-fit: cover !important;\r\n    object-position: 50% 50% !important;\r\n    transform: translate(-50%, -50%);\r\n    transform-origin: center center;\r\n  }\r\n\r\n  .psm-image-treatment {\r\n    z-index: 1;\r\n    inset: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background:\r\n      radial-gradient(\r\n        70% 100% at 48% 48%,\r\n        rgba(4, 18, 40, 0.01) 15%,\r\n        rgba(2, 14, 33, 0.12) 67%,\r\n        rgba(0, 7, 20, 0.38) 100%\r\n      ),\r\n      linear-gradient(180deg, rgba(1, 13, 31, 0.12), rgba(0, 8, 22, 0.3));\r\n  }\r\n\r\n  .psm-ui-plane {\r\n    position: absolute;\r\n    z-index: 3;\r\n    top: 50%;\r\n    left: 0;\r\n    width: 100%;\r\n    height: auto;\r\n    aspect-ratio: 1000 \/ 456.2;\r\n    overflow: visible;\r\n    transform: translateY(-50%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psm-hotspot {\r\n    --psm-hotspot-size: clamp(48px, 7.2cqw, 88px);\r\n    --psm-hotspot-delay: 0s;\r\n    position: absolute;\r\n    z-index: 4;\r\n    width: var(--psm-hotspot-size);\r\n    height: var(--psm-hotspot-size);\r\n    transform: translate(-50%, -50%);\r\n  }\r\n\r\n  .psm-hotspot-a {\r\n    top: 64%;\r\n    left: 15%;\r\n  }\r\n\r\n  .psm-hotspot-b {\r\n    --psm-hotspot-delay: var(--psm-pulse-half);\r\n    top: 40%;\r\n    left: 40%;\r\n  }\r\n\r\n  .psm-hotspot-orb {\r\n    position: absolute;\r\n    inset: 0;\r\n    display: grid;\r\n    place-items: center;\r\n    border: 1px solid rgba(88, 174, 255, 0.65);\r\n    border-radius: 50%;\r\n    background: rgba(5, 19, 41, 0.64);\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(196, 230, 255, 0.08),\r\n      0 0 0 2px rgba(0, 11, 31, 0.32),\r\n      0 8px 20px rgba(0, 5, 18, 0.32);\r\n    -webkit-backdrop-filter: blur(7px);\r\n    backdrop-filter: blur(7px);\r\n    animation: psm-hotspot-orb-pulse var(--psm-pulse-duration) ease-in-out infinite;\r\n    animation-delay: var(--psm-hotspot-delay);\r\n  }\r\n\r\n  .psm-hotspot-icon {\r\n    display: block;\r\n    width: 48%;\r\n    height: 48%;\r\n    overflow: visible;\r\n    fill: none;\r\n    stroke: rgba(250, 253, 255, 0.96);\r\n    stroke-width: 2.45;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.68));\r\n    animation: psm-hotspot-icon-pulse var(--psm-pulse-duration) ease-in-out infinite;\r\n    animation-delay: var(--psm-hotspot-delay);\r\n  }\r\n\r\n  .psm-hotspot-dot {\r\n    position: absolute;\r\n    z-index: 3;\r\n    left: 50%;\r\n    bottom: -6%;\r\n    width: clamp(7px, 1.1cqw, 13px);\r\n    aspect-ratio: 1;\r\n    transform: translateX(-50%);\r\n    border: 2px solid rgba(221, 247, 255, 0.96);\r\n    border-radius: 50%;\r\n    background: #167dff;\r\n    box-shadow:\r\n      0 0 0 5px rgba(24, 126, 255, 0.17),\r\n      0 0 8px #177dff,\r\n      0 0 18px rgba(53, 158, 255, 0.95);\r\n    animation: psm-hotspot-dot-pulse var(--psm-pulse-duration) ease-in-out infinite;\r\n    animation-delay: var(--psm-hotspot-delay);\r\n  }\r\n\r\n  .psm-hotspot::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    z-index: -1;\r\n    left: 50%;\r\n    bottom: -18%;\r\n    width: 118%;\r\n    height: 23%;\r\n    transform: translateX(-50%) scale(0.68);\r\n    border: 1px solid rgba(82, 176, 255, 0.72);\r\n    border-radius: 50%;\r\n    opacity: 0;\r\n    box-shadow: 0 0 10px rgba(35, 135, 255, 0.48);\r\n    animation: psm-floor-ripple var(--psm-pulse-duration) ease-out infinite;\r\n    animation-delay: var(--psm-hotspot-delay);\r\n  }\r\n\r\n  .psm-metrics-panel {\r\n    position: absolute;\r\n    z-index: 5;\r\n    top: 24%;\r\n    right: 4.2%;\r\n    width: clamp(220px, 32.5cqw, 430px);\r\n    min-height: 53%;\r\n    padding: clamp(14px, 2cqw, 27px) clamp(15px, 2.35cqw, 31px);\r\n    overflow: hidden;\r\n    border: 1px solid rgba(151, 179, 214, 0.48);\r\n    border-radius: clamp(11px, 1.55cqw, 20px);\r\n    background: rgba(6, 11, 19, 0.76);\r\n    color: #f7faff;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(5, 35, 72, 0.54),\r\n      0 12px 35px rgba(0, 5, 17, 0.35);\r\n    -webkit-backdrop-filter: blur(10px);\r\n    backdrop-filter: blur(10px);\r\n    font-family: inherit;\r\n  }\r\n\r\n  .psm-panel-heading {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 12px;\r\n    font-family: inherit;\r\n    font-size: clamp(13px, 1.85cqw, 24px);\r\n    font-weight: 600;\r\n    line-height: 1.1;\r\n    letter-spacing: -0.025em;\r\n  }\r\n\r\n  .psm-panel-heading svg {\r\n    width: clamp(13px, 1.55cqw, 20px);\r\n    height: auto;\r\n    fill: none;\r\n    stroke: #4ba5ff;\r\n    stroke-width: 2;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    filter: drop-shadow(0 0 5px rgba(36, 137, 255, 0.75));\r\n  }\r\n\r\n  .psm-panel-divider {\r\n    height: 1px;\r\n    margin: clamp(12px, 1.8cqw, 24px) 0 clamp(11px, 1.55cqw, 21px);\r\n    background: linear-gradient(\r\n      90deg,\r\n      rgba(188, 209, 236, 0.12),\r\n      rgba(188, 209, 236, 0.34),\r\n      rgba(188, 209, 236, 0.08)\r\n    );\r\n  }\r\n\r\n  .psm-metrics-list {\r\n    display: grid;\r\n    gap: clamp(8px, 1.1cqw, 15px);\r\n    margin: 0;\r\n  }\r\n\r\n  .psm-metric-row {\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 1fr) auto;\r\n    align-items: baseline;\r\n    gap: 12px;\r\n    margin: 0;\r\n    font-family: inherit;\r\n    font-size: clamp(10px, 1.52cqw, 20px);\r\n    font-weight: 500;\r\n    line-height: 1.12;\r\n    letter-spacing: -0.018em;\r\n  }\r\n\r\n  .psm-metric-row dt,\r\n  .psm-metric-row dd {\r\n    margin: 0;\r\n  }\r\n\r\n  .psm-metric-row dt {\r\n    color: rgba(239, 246, 255, 0.82);\r\n  }\r\n\r\n  .psm-metric-row dd {\r\n    color: #ffffff;\r\n    text-align: right;\r\n    white-space: nowrap;\r\n    font-variant-numeric: tabular-nums;\r\n    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.8);\r\n  }\r\n\r\n  .psm-metrics-panel.is-counting [data-psm-count] {\r\n    color: #dff4ff;\r\n    text-shadow:\r\n      0 0 5px rgba(255, 255, 255, 0.32),\r\n      0 0 12px rgba(36, 139, 255, 0.58);\r\n  }\r\n\r\n  @keyframes psm-hotspot-orb-pulse {\r\n    0%,\r\n    12%,\r\n    42%,\r\n    100% {\r\n      transform: scale(1);\r\n      border-color: rgba(88, 174, 255, 0.65);\r\n      box-shadow:\r\n        inset 0 0 0 1px rgba(196, 230, 255, 0.08),\r\n        0 0 0 2px rgba(0, 11, 31, 0.32),\r\n        0 8px 20px rgba(0, 5, 18, 0.32);\r\n    }\r\n    25% {\r\n      transform: scale(1.075);\r\n      border-color: rgba(137, 217, 255, 1);\r\n      box-shadow:\r\n        inset 0 0 18px rgba(42, 140, 255, 0.34),\r\n        0 0 0 4px rgba(37, 135, 255, 0.13),\r\n        0 0 17px rgba(36, 139, 255, 0.9),\r\n        0 0 32px rgba(36, 139, 255, 0.48);\r\n    }\r\n  }\r\n\r\n  @keyframes psm-hotspot-icon-pulse {\r\n    0%,\r\n    12%,\r\n    42%,\r\n    100% {\r\n      transform: scale(1);\r\n      filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.68));\r\n    }\r\n    25% {\r\n      transform: scale(1.07);\r\n      filter:\r\n        drop-shadow(0 0 3px rgba(255, 255, 255, 0.95))\r\n        drop-shadow(0 0 9px rgba(67, 178, 255, 1));\r\n    }\r\n  }\r\n\r\n  @keyframes psm-hotspot-dot-pulse {\r\n    0%,\r\n    12%,\r\n    42%,\r\n    100% {\r\n      transform: translateX(-50%) scale(0.88);\r\n      opacity: 0.78;\r\n    }\r\n    25% {\r\n      transform: translateX(-50%) scale(1.2);\r\n      opacity: 1;\r\n    }\r\n  }\r\n\r\n  @keyframes psm-floor-ripple {\r\n    0%,\r\n    12% {\r\n      transform: translateX(-50%) scale(0.58);\r\n      opacity: 0;\r\n    }\r\n    23% {\r\n      opacity: 0.82;\r\n    }\r\n    43%,\r\n    100% {\r\n      transform: translateX(-50%) scale(1.22);\r\n      opacity: 0;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 1024px) {\r\n    .psm-widget,\r\n    .psm-frame {\r\n      aspect-ratio: 1.461333 \/ 1;\r\n    }\r\n\r\n    .psm-frame {\r\n      --psm-tablet-large-corner: clamp(80px, 10.8cqw, 112px);\r\n      --psm-tablet-small-corner: clamp(14px, 2.8cqw, 30px);\r\n      border-radius:\r\n        var(--psm-tablet-large-corner)\r\n        var(--psm-tablet-small-corner)\r\n        var(--psm-tablet-small-corner)\r\n        var(--psm-tablet-large-corner);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 540px) {\r\n    .psm-frame {\r\n      --psm-mobile-corner: clamp(12px, 3.4cqw, 18px);\r\n      border-radius: var(--psm-mobile-corner);\r\n    }\r\n\r\n    .psm-hotspot {\r\n      --psm-hotspot-size: clamp(34px, 10cqw, 42px);\r\n    }\r\n\r\n    .psm-hotspot-a {\r\n      left: 25%;\r\n    }\r\n\r\n    .psm-hotspot-b {\r\n      left: 49%;\r\n    }\r\n\r\n    .psm-metrics-panel {\r\n      top: 23%;\r\n      right: 2.6%;\r\n      width: clamp(154px, 43cqw, 180px);\r\n      min-height: 54%;\r\n      padding: 11px 12px;\r\n      border-radius: 10px;\r\n    }\r\n\r\n    .psm-panel-heading {\r\n      font-size: clamp(10px, 2.9cqw, 12px);\r\n    }\r\n\r\n    .psm-panel-divider {\r\n      margin: 9px 0 8px;\r\n    }\r\n\r\n    .psm-metrics-list {\r\n      gap: 6px;\r\n    }\r\n\r\n    .psm-metric-row {\r\n      gap: 7px;\r\n      font-size: clamp(8.5px, 2.4cqw, 10px);\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .psm-hotspot-orb,\r\n    .psm-hotspot-icon,\r\n    .psm-hotspot-dot,\r\n    .psm-hotspot::after {\r\n      animation: none;\r\n    }\r\n\r\n    .psm-hotspot-orb {\r\n      box-shadow: 0 0 13px rgba(36, 139, 255, 0.5);\r\n    }\r\n  }\r\n\r\n  \/* =========================================================\r\n     SVG PAINT ISOLATION\r\n     Prevents external Elementor\/theme SVG gradient rules from\r\n     hijacking the SVGs inside this widget.\r\n     ========================================================= *\/\r\n\r\n  \/* Hotspot outline icons: always remain outline-only. *\/\r\n  .psm-widget .psm-hotspot-icon,\r\n  .psm-widget .psm-hotspot-icon path,\r\n  .psm-widget .psm-hotspot-icon circle,\r\n  .psm-widget .psm-hotspot-icon rect,\r\n  .psm-widget .psm-hotspot-icon line,\r\n  .psm-widget .psm-hotspot-icon polyline,\r\n  .psm-widget .psm-hotspot-icon polygon,\r\n  .psm-widget .psm-hotspot-icon ellipse {\r\n    fill: none !important;\r\n  }\r\n\r\n  .psm-widget .psm-hotspot-icon path,\r\n  .psm-widget .psm-hotspot-icon circle,\r\n  .psm-widget .psm-hotspot-icon rect,\r\n  .psm-widget .psm-hotspot-icon line,\r\n  .psm-widget .psm-hotspot-icon polyline,\r\n  .psm-widget .psm-hotspot-icon polygon,\r\n  .psm-widget .psm-hotspot-icon ellipse {\r\n    stroke: rgba(250, 253, 255, 0.96) !important;\r\n  }\r\n\r\n  \/* Metrics-panel arrow: preserve its original blue outline. *\/\r\n  .psm-widget .psm-panel-heading svg,\r\n  .psm-widget .psm-panel-heading svg path,\r\n  .psm-widget .psm-panel-heading svg circle,\r\n  .psm-widget .psm-panel-heading svg rect,\r\n  .psm-widget .psm-panel-heading svg line,\r\n  .psm-widget .psm-panel-heading svg polyline,\r\n  .psm-widget .psm-panel-heading svg polygon,\r\n  .psm-widget .psm-panel-heading svg ellipse {\r\n    fill: none !important;\r\n  }\r\n\r\n  .psm-widget .psm-panel-heading svg path,\r\n  .psm-widget .psm-panel-heading svg circle,\r\n  .psm-widget .psm-panel-heading svg rect,\r\n  .psm-widget .psm-panel-heading svg line,\r\n  .psm-widget .psm-panel-heading svg polyline,\r\n  .psm-widget .psm-panel-heading svg polygon,\r\n  .psm-widget .psm-panel-heading svg ellipse {\r\n    stroke: #4ba5ff !important;\r\n  }\r\n\r\n<\/style>\r\n\r\n<script>\r\n  (() => {\r\n    \"use strict\";\r\n\r\n    const ROOT_SELECTOR = \"[data-psm-widget]\";\r\n\r\n    const numberFrom = (value, fallback, minimum, maximum) => {\r\n      const parsed = Number.parseFloat(value);\r\n      if (!Number.isFinite(parsed)) return fallback;\r\n      return Math.min(maximum, Math.max(minimum, parsed));\r\n    };\r\n\r\n    const initialise = (root) => {\r\n      if (!root || root.dataset.psmReady === \"true\") return;\r\n      root.dataset.psmReady = \"true\";\r\n\r\n      const frame = root.querySelector(\"[data-psm-frame]\");\r\n      const image = root.querySelector(\"[data-psm-image]\");\r\n      const panel = root.querySelector(\"[data-psm-panel]\");\r\n      const counters = Array.from(root.querySelectorAll(\"[data-psm-count]\"));\r\n      const reveals = Array.from(root.querySelectorAll(\"[data-psm-reveal]\"));\r\n      if (!frame || !image || !panel || !counters.length) return;\r\n\r\n      const imageUrl = (root.dataset.imageUrl || \"\").trim();\r\n      if (imageUrl) image.src = imageUrl;\r\n\r\n      const aspectRatio = numberFrom(root.dataset.aspectRatio, 2.192, 1.2, 5);\r\n      const sizePercent = numberFrom(root.dataset.size, 100, 40, 180);\r\n      const maxWidth = numberFrom(root.dataset.maxWidth, 1400, 200, 5000);\r\n      const mobileHeight = numberFrom(root.dataset.mobileHeight, 1.5, 1, 3);\r\n      const tallBreakpoint = numberFrom(root.dataset.tallBreakpoint, 1024, 320, 2400);\r\n      const countSeconds = numberFrom(root.dataset.countSeconds, 2.2, 0.25, 12);\r\n      const pulseSeconds = numberFrom(root.dataset.pulseSeconds, 2.4, 0.8, 12);\r\n      const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n\r\n      \/*\r\n       * SVG paint hard-lock:\r\n       * External page rules sometimes use selectors such as\r\n       * svg path { fill: url(#someGradient) !important; }.\r\n       * Inline !important declarations below prevent those rules\r\n       * from recoloring this widget's icons.\r\n       *\/\r\n      const lockSvgPaint = () => {\r\n        const paintShapes = \"path,circle,rect,line,polyline,polygon,ellipse\";\r\n\r\n        root.querySelectorAll(\".psm-hotspot-icon\").forEach((svg) => {\r\n          svg.style.setProperty(\"fill\", \"none\", \"important\");\r\n          svg.querySelectorAll(paintShapes).forEach((shape) => {\r\n            shape.style.setProperty(\"fill\", \"none\", \"important\");\r\n            shape.style.setProperty(\r\n              \"stroke\",\r\n              \"rgba(250, 253, 255, 0.96)\",\r\n              \"important\"\r\n            );\r\n          });\r\n        });\r\n\r\n        root.querySelectorAll(\".psm-panel-heading svg\").forEach((svg) => {\r\n          svg.style.setProperty(\"fill\", \"none\", \"important\");\r\n          svg.querySelectorAll(paintShapes).forEach((shape) => {\r\n            shape.style.setProperty(\"fill\", \"none\", \"important\");\r\n            shape.style.setProperty(\"stroke\", \"#4ba5ff\", \"important\");\r\n          });\r\n        });\r\n      };\r\n\r\n      lockSvgPaint();\r\n\r\n      \/*\r\n       * Re-apply once after Elementor\/theme scripts finish styling the page.\r\n       * This does not animate or continuously mutate anything.\r\n       *\/\r\n      requestAnimationFrame(lockSvgPaint);\r\n      window.setTimeout(lockSvgPaint, 250);\r\n      window.setTimeout(lockSvgPaint, 900);\r\n\r\n\r\n      root.style.setProperty(\"--psm-pulse-duration\", `${pulseSeconds}s`);\r\n      root.style.setProperty(\"--psm-pulse-half\", `${pulseSeconds * -0.5}s`);\r\n\r\n      let resizeFrame = 0;\r\n      let countFrame = 0;\r\n      let isInside = false;\r\n      let lastStartAt = -1000;\r\n\r\n      const formatCounter = (counter, value) => {\r\n        const decimals = Math.round(numberFrom(counter.dataset.decimals, 0, 0, 4));\r\n        return Number(value).toFixed(decimals);\r\n      };\r\n\r\n      const resetCounters = () => {\r\n        cancelAnimationFrame(countFrame);\r\n        countFrame = 0;\r\n        panel.classList.remove(\"is-counting\");\r\n        counters.forEach((counter) => {\r\n          counter.textContent = formatCounter(counter, 0);\r\n        });\r\n        reveals.forEach((reveal) => {\r\n          reveal.textContent = \"\u2014\";\r\n        });\r\n      };\r\n\r\n      const finishCounters = () => {\r\n        counters.forEach((counter) => {\r\n          const target = numberFrom(counter.dataset.target, 0, -1000000, 1000000);\r\n          counter.textContent = formatCounter(counter, target);\r\n        });\r\n        reveals.forEach((reveal) => {\r\n          reveal.textContent = reveal.dataset.target || \"Yes\";\r\n        });\r\n        panel.classList.remove(\"is-counting\");\r\n      };\r\n\r\n      const startCounters = (force = false) => {\r\n        const now = performance.now();\r\n        if (!force && now - lastStartAt < 180) return;\r\n        lastStartAt = now;\r\n        resetCounters();\r\n\r\n        if (reducedMotion.matches) {\r\n          finishCounters();\r\n          return;\r\n        }\r\n\r\n        panel.classList.add(\"is-counting\");\r\n        const startTime = performance.now();\r\n        const duration = countSeconds * 1000;\r\n\r\n        const tick = (time) => {\r\n          const linear = Math.min(1, Math.max(0, (time - startTime) \/ duration));\r\n          const eased = 1 - Math.pow(1 - linear, 4);\r\n\r\n          counters.forEach((counter) => {\r\n            const target = numberFrom(counter.dataset.target, 0, -1000000, 1000000);\r\n            counter.textContent = formatCounter(counter, target * eased);\r\n          });\r\n\r\n          if (linear < 1) {\r\n            countFrame = requestAnimationFrame(tick);\r\n          } else {\r\n            countFrame = 0;\r\n            finishCounters();\r\n          }\r\n        };\r\n\r\n        countFrame = requestAnimationFrame(tick);\r\n      };\r\n\r\n      const isCurrentlyVisible = () => {\r\n        const rect = root.getBoundingClientRect();\r\n        const viewportHeight = window.innerHeight || document.documentElement.clientHeight;\r\n        return rect.bottom > viewportHeight * 0.12 && rect.top < viewportHeight * 0.88;\r\n      };\r\n\r\n      const setMeasuredHeight = () => {\r\n        const parent = root.parentElement;\r\n        const parentWidth = parent\r\n          ? parent.getBoundingClientRect().width\r\n          : root.getBoundingClientRect().width;\r\n        const availableWidth = Math.max(\r\n          1,\r\n          parentWidth || root.getBoundingClientRect().width || window.innerWidth\r\n        );\r\n        const visualWidth = Math.min(maxWidth, availableWidth * (sizePercent \/ 100));\r\n        const heightMultiplier = window.innerWidth <= tallBreakpoint ? mobileHeight : 1;\r\n        const visualHeight = (visualWidth \/ aspectRatio) * heightMultiplier;\r\n        const roundedWidth = Math.round(visualWidth * 100) \/ 100;\r\n        const roundedHeight = Math.round(visualHeight * 100) \/ 100;\r\n\r\n        root.style.setProperty(\"--psm-frame-width\", `${roundedWidth}px`);\r\n        root.style.setProperty(\"--psm-frame-height\", `${roundedHeight}px`);\r\n        root.style.setProperty(\"--psm-layout-height\", `${roundedHeight}px`);\r\n        root.style.height = `${roundedHeight}px`;\r\n        root.style.minHeight = `${roundedHeight}px`;\r\n        frame.style.width = `${roundedWidth}px`;\r\n        frame.style.height = `${roundedHeight}px`;\r\n\r\n        const elementorContainer = root.closest(\".elementor-widget-container\");\r\n        if (elementorContainer) {\r\n          elementorContainer.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n\r\n        const elementorWidget = root.closest(\".elementor-widget-html\");\r\n        if (elementorWidget) {\r\n          elementorWidget.style.setProperty(\r\n            \"min-height\",\r\n            `${roundedHeight}px`,\r\n            \"important\"\r\n          );\r\n        }\r\n      };\r\n\r\n      const queueMeasuredHeight = () => {\r\n        cancelAnimationFrame(resizeFrame);\r\n        resizeFrame = requestAnimationFrame(setMeasuredHeight);\r\n      };\r\n\r\n      resetCounters();\r\n      setMeasuredHeight();\r\n      requestAnimationFrame(setMeasuredHeight);\r\n      window.setTimeout(setMeasuredHeight, 180);\r\n      window.setTimeout(setMeasuredHeight, 600);\r\n\r\n      if (\"ResizeObserver\" in window) {\r\n        const resizeObserver = new ResizeObserver(queueMeasuredHeight);\r\n        resizeObserver.observe(root.parentElement || root);\r\n        root._psmResizeObserver = resizeObserver;\r\n      }\r\n\r\n      window.addEventListener(\"resize\", queueMeasuredHeight, { passive: true });\r\n\r\n      if (\"IntersectionObserver\" in window) {\r\n        const viewObserver = new IntersectionObserver(\r\n          (entries) => {\r\n            const entry = entries[0];\r\n            const entered = entry.isIntersecting && entry.intersectionRatio >= 0.28;\r\n            const fullyLeft = !entry.isIntersecting || entry.intersectionRatio <= 0.06;\r\n\r\n            if (entered && !isInside) {\r\n              isInside = true;\r\n              startCounters();\r\n            } else if (fullyLeft && isInside) {\r\n              isInside = false;\r\n              resetCounters();\r\n            }\r\n          },\r\n          { threshold: [0, 0.06, 0.28, 0.55] }\r\n        );\r\n        viewObserver.observe(root);\r\n        root._psmViewObserver = viewObserver;\r\n      } else if (isCurrentlyVisible()) {\r\n        isInside = true;\r\n        startCounters();\r\n      }\r\n\r\n      window.addEventListener(\"pageshow\", () => {\r\n        isInside = false;\r\n        resetCounters();\r\n        requestAnimationFrame(() => {\r\n          if (isCurrentlyVisible()) {\r\n            isInside = true;\r\n            startCounters(true);\r\n          }\r\n        });\r\n      }, { passive: true });\r\n\r\n      document.addEventListener(\"visibilitychange\", () => {\r\n        if (!document.hidden && isCurrentlyVisible()) {\r\n          isInside = true;\r\n          startCounters(true);\r\n        }\r\n      });\r\n    };\r\n\r\n    document.querySelectorAll(ROOT_SELECTOR).forEach(initialise);\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-aac78c4 e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"aac78c4\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f34ec1f elementor-widget elementor-widget-heading\" data-id=\"f34ec1f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">03<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-61ded59 elementor-widget elementor-widget-heading\" data-id=\"61ded59\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Complete Transparency. Stronger Confidence.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6bfc5db elementor-widget elementor-widget-text-editor\" data-id=\"6bfc5db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Show the true layout, flow and details of your space\u2014so buyers can make decisions with clarity and confidence.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-fe93ca3 e-con e-atomic-element e-flexbox-base e-fe93ca3-5e91eee \" data-id=\"fe93ca3\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"fe93ca3\" data-e-type=\"e-flexbox\" data-id=\"fe93ca3\">\n    <div class=\"elementor-element elementor-element-7c5d9ec e-flex e-con-boxed e-con e-parent\" data-id=\"7c5d9ec\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-e59b1ac e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"e59b1ac\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2c518cb elementor-widget elementor-widget-heading\" data-id=\"2c518cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">04<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-67914c5 elementor-widget elementor-widget-heading\" data-id=\"67914c5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">One Capture. Value Across Every Channel.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0c84141 elementor-widget elementor-widget-text-editor\" data-id=\"0c84141\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>From your website to Google Maps and social platforms\u2014one spatial asset powers every marketing and sales channel.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-9d1b277 e-con-full e-flex elementor-invisible e-con e-child\" data-id=\"9d1b277\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;animation&quot;:&quot;fadeInUp&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fd35397 elementor-widget elementor-widget-html\" data-id=\"fd35397\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!--\r\n  PANOSKY \u2014 OMNICHANNEL HUB v1\r\n  Paste this entire file into one Elementor HTML widget.\r\n\r\n  MAIN CONTROLS:\r\n  data-image-url              = direct background-image URL\r\n  data-icon-website-url       = optional replacement PNG\/SVG URL\r\n  data-icon-sales-url         = optional replacement PNG\/SVG URL\r\n  data-icon-vr-url            = optional replacement PNG\/SVG URL\r\n  data-icon-maps-url          = optional replacement PNG\/SVG URL\r\n  data-icon-center-url        = optional replacement center-icon PNG\/SVG URL\r\n  data-center-launch-seconds  = center-hub launch pulse time\r\n  data-line-travel-seconds    = directional blue-line travel time\r\n  data-outer-pulse-seconds    = four-icon arrival pulse time\r\n  data-gap-seconds            = white-line pause before repeating\r\n  data-desktop-outer-size     = desktop outer-circle size percentage\r\n  data-tablet-outer-size      = tablet outer-circle size percentage\r\n  data-mobile-outer-size      = mobile outer-circle size percentage\r\n  data-outer-icon-scale       = outer SVG\/image scale (1 = default)\r\n  data-center-icon-scale      = center SVG\/image scale (1 = default)\r\n  data-size                   = card width percentage\r\n  data-max-width              = maximum card width in pixels\r\n  data-mobile-height          = tablet\/mobile height multiplier\r\n  data-tall-breakpoint        = viewport width using the taller layout\r\n\r\n  Leave an icon URL empty to use the included professional outline icon.\r\n  Edit the four visible labels directly in the HTML below.\r\n-->\r\n\r\n<div\r\n  class=\"psh-widget\"\r\n  data-psh-widget\r\n  data-image-url=\"https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/ChatGPT%20Image%20Aug%2015%2C%202026%2C%2001_14_17%20PM.png\"\r\n  data-icon-website-url=\"\"\r\n  data-icon-sales-url=\"\"\r\n  data-icon-vr-url=\"\"\r\n  data-icon-maps-url=\"\"\r\n  data-icon-center-url=\"\"\r\n  data-center-launch-seconds=\"0.48\"\r\n  data-line-travel-seconds=\"1.35\"\r\n  data-outer-pulse-seconds=\"0.55\"\r\n  data-gap-seconds=\"0.3\"\r\n  data-desktop-outer-size=\"130\"\r\n  data-tablet-outer-size=\"100\"\r\n  data-mobile-outer-size=\"100\"\r\n  data-outer-icon-scale=\"1\"\r\n  data-center-icon-scale=\"1\"\r\n  data-size=\"100\"\r\n  data-max-width=\"1400\"\r\n  data-aspect-ratio=\"2.192\"\r\n  data-mobile-height=\"1.5\"\r\n  data-tall-breakpoint=\"1024\"\r\n>\r\n  <figure\r\n    class=\"psh-frame\"\r\n    data-psh-frame\r\n    role=\"img\"\r\n    aria-label=\"A central immersive spatial asset distributing value to website, sales, virtual reality, and Google Maps channels\"\r\n  >\r\n    <img class=\"psh-image\" data-psh-image alt=\"\" decoding=\"async\" \/>\r\n    <span class=\"psh-image-treatment\" aria-hidden=\"true\"><\/span>\r\n\r\n    <div class=\"psh-ui-plane\" aria-hidden=\"true\">\r\n      <svg\r\n        class=\"psh-route-layer\"\r\n        viewBox=\"0 0 1000 456.2\"\r\n        preserveAspectRatio=\"none\"\r\n      >\r\n        <defs>\r\n          <!-- Masks are assigned unique IDs by JavaScript for multi-widget safety. -->\r\n          <mask class=\"psh-route-mask\" data-psh-mask maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"1000\" height=\"456.2\">\r\n            <path data-psh-reveal class=\"psh-reveal-path\" pathLength=\"100\" d=\"M 442 210 C 350 164 270 133 155 135\" \/>\r\n          <\/mask>\r\n          <mask class=\"psh-route-mask\" data-psh-mask maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"1000\" height=\"456.2\">\r\n            <path data-psh-reveal class=\"psh-reveal-path\" pathLength=\"100\" d=\"M 558 210 C 650 164 730 133 845 135\" \/>\r\n          <\/mask>\r\n          <mask class=\"psh-route-mask\" data-psh-mask maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"1000\" height=\"456.2\">\r\n            <path data-psh-reveal class=\"psh-reveal-path\" pathLength=\"100\" d=\"M 558 246 C 650 292 730 323 845 321\" \/>\r\n          <\/mask>\r\n          <mask class=\"psh-route-mask\" data-psh-mask maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"1000\" height=\"456.2\">\r\n            <path data-psh-reveal class=\"psh-reveal-path\" pathLength=\"100\" d=\"M 442 246 C 350 292 270 323 155 321\" \/>\r\n          <\/mask>\r\n        <\/defs>\r\n\r\n        <!-- White dotted base routes always remain visible. -->\r\n        <path class=\"psh-route-base\" pathLength=\"100\" d=\"M 442 210 C 350 164 270 133 155 135\" \/>\r\n        <path class=\"psh-route-base\" pathLength=\"100\" d=\"M 558 210 C 650 164 730 133 845 135\" \/>\r\n        <path class=\"psh-route-base\" pathLength=\"100\" d=\"M 558 246 C 650 292 730 323 845 321\" \/>\r\n        <path class=\"psh-route-base\" pathLength=\"100\" d=\"M 442 246 C 350 292 270 323 155 321\" \/>\r\n\r\n        <!-- All four blue routes reveal simultaneously from the hub outward. -->\r\n        <path data-psh-active-line class=\"psh-route-active\" pathLength=\"100\" d=\"M 442 210 C 350 164 270 133 155 135\" \/>\r\n        <path data-psh-active-line class=\"psh-route-active\" pathLength=\"100\" d=\"M 558 210 C 650 164 730 133 845 135\" \/>\r\n        <path data-psh-active-line class=\"psh-route-active\" pathLength=\"100\" d=\"M 558 246 C 650 292 730 323 845 321\" \/>\r\n        <path data-psh-active-line class=\"psh-route-active\" pathLength=\"100\" d=\"M 442 246 C 350 292 270 323 155 321\" \/>\r\n      <\/svg>\r\n\r\n      <!-- 01 \/ Website \u2014 top left -->\r\n      <div class=\"psh-node psh-node-left psh-node-tl\" data-psh-node>\r\n        <span class=\"psh-node-orb\">\r\n          <span class=\"psh-icon-slot\" data-psh-icon-slot=\"website\">\r\n            <svg viewBox=\"0 0 48 48\">\r\n              <circle cx=\"24\" cy=\"24\" r=\"17\" \/>\r\n              <path d=\"M7 24h34M24 7c5 5 7 10.5 7 17s-2 12-7 17M24 7c-5 5-7 10.5-7 17s2 12 7 17M10.5 15.5h27M10.5 32.5h27\" \/>\r\n            <\/svg>\r\n          <\/span>\r\n        <\/span>\r\n        <span class=\"psh-node-label\">Website<\/span>\r\n      <\/div>\r\n\r\n      <!-- 02 \/ Sales \u2014 top right -->\r\n      <div class=\"psh-node psh-node-right psh-node-tr\" data-psh-node>\r\n        <span class=\"psh-node-orb\">\r\n          <span class=\"psh-icon-slot\" data-psh-icon-slot=\"sales\">\r\n            <svg viewBox=\"0 0 48 48\">\r\n              <circle cx=\"18\" cy=\"17\" r=\"6\" \/>\r\n              <circle cx=\"32\" cy=\"19\" r=\"5\" \/>\r\n              <path d=\"M7 37c.8-7 4.7-10.5 11-10.5S28.2 30 29 37H7ZM28 28c1.2-.8 2.7-1.2 4.4-1.2 5.2 0 8.1 3 8.6 8.6H31\" \/>\r\n            <\/svg>\r\n          <\/span>\r\n        <\/span>\r\n        <span class=\"psh-node-label\">Sales<\/span>\r\n      <\/div>\r\n\r\n      <!-- 03 \/ VR Experience \u2014 bottom right -->\r\n      <div class=\"psh-node psh-node-right psh-node-br\" data-psh-node>\r\n        <span class=\"psh-node-orb\">\r\n          <span class=\"psh-icon-slot\" data-psh-icon-slot=\"vr\">\r\n            <svg viewBox=\"0 0 48 48\">\r\n              <path d=\"M7 19.5c.5-4 3.1-6 7.2-6h19.6c4.1 0 6.7 2 7.2 6l1.2 11c.4 4.2-1.7 6.5-5.6 6.5h-3.2c-2.9 0-4.3-1.4-5.3-3.7l-1.2-2.8h-5.8l-1.2 2.8c-1 2.3-2.4 3.7-5.3 3.7h-3.2c-3.9 0-6-2.3-5.6-6.5l1.2-11Z\" \/>\r\n              <path d=\"M10.5 21h11M26.5 21h11\" \/>\r\n            <\/svg>\r\n          <\/span>\r\n        <\/span>\r\n        <span class=\"psh-node-label\">VR Experience<\/span>\r\n      <\/div>\r\n\r\n      <!-- 04 \/ Google Maps \u2014 bottom left -->\r\n      <div class=\"psh-node psh-node-left psh-node-bl\" data-psh-node>\r\n        <span class=\"psh-node-orb\">\r\n          <span class=\"psh-icon-slot\" data-psh-icon-slot=\"maps\">\r\n            <svg viewBox=\"0 0 48 48\">\r\n              <path d=\"M24 43S11 30.5 11 19.4a13 13 0 1 1 26 0C37 30.5 24 43 24 43Z\" \/>\r\n              <circle cx=\"24\" cy=\"19.5\" r=\"5.2\" \/>\r\n            <\/svg>\r\n          <\/span>\r\n        <\/span>\r\n        <span class=\"psh-node-label\">Google Maps<\/span>\r\n      <\/div>\r\n\r\n      <!-- Central master spatial asset -->\r\n      <div class=\"psh-center-hub\" data-psh-center>\r\n        <span class=\"psh-center-ripple\"><\/span>\r\n        <span class=\"psh-center-icon\" data-psh-icon-slot=\"center\">\r\n          <svg viewBox=\"0 0 72 72\">\r\n            <path d=\"m36 8 24 13.5v29L36 64 12 50.5v-29L36 8Z\" \/>\r\n            <path d=\"m20 26 16-9 16 9-16 9-16-9Z\" \/>\r\n            <path d=\"M20 26v18l16 9 16-9V26M36 35v18\" \/>\r\n            <path d=\"m27 21.8 9-5 9 5M27 31.8v10l9 5 9-5v-10\" opacity=\"0.7\" \/>\r\n          <\/svg>\r\n        <\/span>\r\n      <\/div>\r\n    <\/div>\r\n  <\/figure>\r\n<\/div>\r\n\r\n<style>\r\n  .psh-widget,\r\n  .psh-widget * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .psh-widget {\r\n    --psh-layout-height: auto;\r\n    --psh-frame-width: 100%;\r\n    --psh-frame-height: auto;\r\n    --psh-outer-icon-scale: 1;\r\n    --psh-center-icon-scale: 1;\r\n    --psh-desktop-node-min: 72px;\r\n    --psh-desktop-node-fluid: 10.2cqw;\r\n    --psh-desktop-node-max: 129px;\r\n    --psh-tablet-node-min: 48px;\r\n    --psh-tablet-node-fluid: 6.8cqw;\r\n    --psh-tablet-node-max: 86px;\r\n    --psh-mobile-node-min: 40px;\r\n    --psh-mobile-node-fluid: 11cqw;\r\n    --psh-mobile-node-max: 46px;\r\n    --psh-center-pulse-duration: 0.48s;\r\n    position: relative;\r\n    display: block;\r\n    width: 100%;\r\n    max-width: 100%;\r\n    aspect-ratio: 2.192 \/ 1;\r\n    height: var(--psh-layout-height);\r\n    min-height: var(--psh-layout-height);\r\n    overflow: visible;\r\n    isolation: isolate;\r\n    container-type: inline-size;\r\n    background: transparent !important;\r\n    font-family: var(\r\n      --e-global-typography-primary-font-family,\r\n      \"Satoshi\",\r\n      \"Helvetica Neue\",\r\n      Arial,\r\n      sans-serif\r\n    );\r\n  }\r\n\r\n  .psh-frame {\r\n    position: absolute;\r\n    top: 0;\r\n    left: 50%;\r\n    width: var(--psh-frame-width);\r\n    height: var(--psh-frame-height);\r\n    aspect-ratio: 2.192 \/ 1;\r\n    min-height: 1px;\r\n    margin: 0;\r\n    overflow: hidden;\r\n    transform: translateX(-50%);\r\n    border: 1px solid rgba(150, 179, 216, 0.34);\r\n    \/* Signature large corners are on the RIGHT for this component. *\/\r\n    border-radius: 2.8% 20% 20% 2.8% \/ 7% 40% 40% 7%;\r\n    background: #031126;\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(213, 230, 255, 0.05),\r\n      inset 0 -26px 50px rgba(0, 8, 22, 0.3),\r\n      0 0 0 1px rgba(0, 18, 49, 0.45);\r\n    user-select: none;\r\n    -webkit-user-select: none;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psh-frame::after {\r\n    content: \"\";\r\n    position: absolute;\r\n    z-index: 9;\r\n    inset: 0;\r\n    border: 1px solid rgba(221, 237, 255, 0.055);\r\n    border-radius: inherit;\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255, 255, 255, 0.045),\r\n      inset 0 0 35px rgba(0, 10, 30, 0.22);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psh-image,\r\n  .psh-image-treatment {\r\n    position: absolute;\r\n    display: block;\r\n  }\r\n\r\n  .psh-image {\r\n    z-index: 0;\r\n    inset: auto;\r\n    top: 50%;\r\n    left: 50%;\r\n    width: 100% !important;\r\n    height: 100% !important;\r\n    max-width: none !important;\r\n    min-width: 100%;\r\n    min-height: 100%;\r\n    object-fit: cover !important;\r\n    object-position: 50% 50% !important;\r\n    transform: translate(-50%, -50%);\r\n    transform-origin: center center;\r\n  }\r\n\r\n  .psh-image-treatment {\r\n    z-index: 1;\r\n    inset: 0;\r\n    width: 100%;\r\n    height: 100%;\r\n    background:\r\n      radial-gradient(58% 90% at 50% 50%, rgba(4, 28, 65, 0.06), rgba(1, 12, 30, 0.28) 72%, rgba(0, 6, 18, 0.52) 100%),\r\n      linear-gradient(180deg, rgba(0, 12, 31, 0.28), rgba(0, 9, 24, 0.42));\r\n  }\r\n\r\n  .psh-ui-plane {\r\n    position: absolute;\r\n    z-index: 3;\r\n    top: 50%;\r\n    left: 0;\r\n    width: 100%;\r\n    height: auto;\r\n    aspect-ratio: 1000 \/ 456.2;\r\n    overflow: visible;\r\n    transform: translateY(-50%);\r\n    pointer-events: none;\r\n  }\r\n\r\n  .psh-route-layer {\r\n    position: absolute;\r\n    z-index: 1;\r\n    inset: 0;\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    overflow: visible;\r\n  }\r\n\r\n  .psh-route-base,\r\n  .psh-route-active,\r\n  .psh-reveal-path {\r\n    fill: none;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n    vector-effect: non-scaling-stroke;\r\n  }\r\n\r\n  .psh-route-base {\r\n    stroke: rgba(237, 246, 255, 0.75);\r\n    stroke-width: 1.55px;\r\n    stroke-dasharray: 1.35 3.75;\r\n    filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.58));\r\n  }\r\n\r\n  .psh-route-active {\r\n    opacity: 0;\r\n    stroke: #56b6ff;\r\n    stroke-width: 2px;\r\n    stroke-dasharray: 1.35 3.75;\r\n    filter:\r\n      drop-shadow(0 0 3px #2188ff)\r\n      drop-shadow(0 0 8px rgba(42, 148, 255, 0.94));\r\n  }\r\n\r\n  .psh-reveal-path {\r\n    stroke: #ffffff;\r\n    stroke-width: 13px;\r\n    stroke-dasharray: 100 100;\r\n    stroke-dashoffset: 100;\r\n  }\r\n\r\n  .psh-node {\r\n    --psh-node-size: clamp(\r\n      var(--psh-desktop-node-min),\r\n      var(--psh-desktop-node-fluid),\r\n      var(--psh-desktop-node-max)\r\n    );\r\n    --psh-label-gap: clamp(8px, 1.15cqw, 15px);\r\n    position: absolute;\r\n    z-index: 4;\r\n    width: var(--psh-node-size);\r\n    height: var(--psh-node-size);\r\n    transform: translate(-50%, -50%);\r\n  }\r\n\r\n  .psh-node-tl {\r\n    top: 29.6%;\r\n    left: 15.5%;\r\n  }\r\n\r\n  .psh-node-tr {\r\n    top: 29.6%;\r\n    left: 84.5%;\r\n  }\r\n\r\n  .psh-node-br {\r\n    top: 70.4%;\r\n    left: 84.5%;\r\n  }\r\n\r\n  .psh-node-bl {\r\n    top: 70.4%;\r\n    left: 15.5%;\r\n  }\r\n\r\n  .psh-node-orb {\r\n    position: absolute;\r\n    inset: 0;\r\n    display: grid;\r\n    place-items: center;\r\n    border: 1px solid rgba(73, 164, 246, 0.53);\r\n    border-radius: 50%;\r\n    background: rgba(3, 15, 31, 0.84);\r\n    box-shadow:\r\n      inset 0 0 0 1px rgba(164, 219, 255, 0.06),\r\n      0 0 0 2px rgba(0, 8, 26, 0.42),\r\n      0 7px 20px rgba(0, 4, 16, 0.38);\r\n    -webkit-backdrop-filter: blur(8px);\r\n    backdrop-filter: blur(8px);\r\n    transition:\r\n      transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),\r\n      border-color 180ms ease,\r\n      background-color 180ms ease,\r\n      box-shadow 180ms ease;\r\n  }\r\n\r\n  .psh-icon-slot {\r\n    display: grid;\r\n    place-items: center;\r\n    width: 52%;\r\n    height: 52%;\r\n    color: rgba(248, 252, 255, 0.95);\r\n    transform: scale(var(--psh-outer-icon-scale));\r\n    transform-origin: center;\r\n    transition: filter 180ms ease, color 180ms ease;\r\n  }\r\n\r\n  .psh-icon-slot svg,\r\n  .psh-icon-slot img,\r\n  .psh-center-icon svg,\r\n  .psh-center-icon img {\r\n    display: block;\r\n    width: 100%;\r\n    height: 100%;\r\n    max-width: none !important;\r\n    object-fit: contain;\r\n  }\r\n\r\n  .psh-icon-slot svg,\r\n  .psh-center-icon svg {\r\n    overflow: visible;\r\n    fill: none !important;\r\n    stroke: currentColor !important;\r\n    stroke-width: 2.25;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }\r\n\r\n  \/*\r\n    SVG PAINT ISOLATION\r\n    -------------------\r\n    Some Elementor\/page-level SVG rules use fill:url(#gradientId) and can\r\n    accidentally repaint every inline SVG on the page. These selectors are\r\n    intentionally limited to this widget and force its outline icons back to\r\n    their own paint model. They do NOT touch SVGs outside .psh-widget.\r\n  *\/\r\n  .psh-widget[data-psh-widget] .psh-icon-slot svg :is(path, circle, rect, ellipse, line, polyline, polygon, use),\r\n  .psh-widget[data-psh-widget] .psh-center-icon svg :is(path, circle, rect, ellipse, line, polyline, polygon, use) {\r\n    fill: none !important;\r\n    stroke: currentColor !important;\r\n  }\r\n\r\n  \/* Also prevent a global SVG fill rule from painting the route\/mask paths. *\/\r\n  .psh-widget[data-psh-widget] .psh-route-layer path {\r\n    fill: none !important;\r\n  }\r\n\r\n  .psh-node-label {\r\n    position: absolute;\r\n    top: calc(100% + var(--psh-label-gap));\r\n    left: 50%;\r\n    right: auto;\r\n    width: clamp(120px, 21cqw, 270px);\r\n    transform: translateX(-50%);\r\n    font-family: inherit;\r\n    \/* 150% of the previous label size. *\/\r\n    font-size: clamp(15px, 2.325cqw, 30px);\r\n    font-weight: 550;\r\n    line-height: 1.08;\r\n    letter-spacing: -0.022em;\r\n    color: rgba(248, 251, 255, 0.9);\r\n    text-shadow: 0 1px 3px rgba(0, 0, 0, 0.88);\r\n    text-align: center;\r\n    white-space: nowrap;\r\n    transition: color 180ms ease, text-shadow 180ms ease;\r\n  }\r\n\r\n  \/* Upper-row labels sit above their icons; lower-row labels stay below. *\/\r\n  .psh-node-tl .psh-node-label,\r\n  .psh-node-tr .psh-node-label {\r\n    top: auto;\r\n    bottom: calc(100% + var(--psh-label-gap));\r\n  }\r\n\r\n  .psh-node.is-active .psh-node-orb {\r\n    border-color: rgba(133, 218, 255, 1);\r\n    background: rgba(4, 34, 75, 0.94);\r\n    box-shadow:\r\n      inset 0 0 18px rgba(45, 144, 255, 0.4),\r\n      0 0 0 4px rgba(33, 132, 255, 0.14),\r\n      0 0 16px rgba(34, 139, 255, 0.92),\r\n      0 0 31px rgba(34, 139, 255, 0.52);\r\n    animation: psh-node-breathe 900ms ease-in-out infinite;\r\n  }\r\n\r\n  .psh-node.is-active .psh-icon-slot {\r\n    color: #ffffff;\r\n    filter:\r\n      drop-shadow(0 0 3px rgba(255, 255, 255, 0.95))\r\n      drop-shadow(0 0 9px rgba(62, 173, 255, 1));\r\n  }\r\n\r\n  .psh-node.is-active .psh-node-label {\r\n    color: #ffffff;\r\n    text-shadow:\r\n      0 0 5px rgba(255, 255, 255, 0.48),\r\n      0 0 13px rgba(42, 148, 255, 0.88),\r\n      0 1px 3px rgba(0, 0, 0, 0.9);\r\n  }\r\n\r\n  .psh-center-hub {\r\n    \/* 70% of the previous center-hub size. *\/\r\n    --psh-center-size: clamp(76px, 11.9cqw, 154px);\r\n    position: absolute;\r\n    z-index: 5;\r\n    top: 50%;\r\n    left: 50%;\r\n    display: grid;\r\n    place-items: center;\r\n    width: var(--psh-center-size);\r\n    height: var(--psh-center-size);\r\n    transform: translate(-50%, -50%);\r\n    border: 1px solid rgba(112, 200, 255, 0.9);\r\n    border-radius: 50%;\r\n    background:\r\n      radial-gradient(circle at 48% 40%, rgba(21, 83, 173, 0.96), rgba(4, 33, 84, 0.97) 58%, rgba(2, 21, 54, 0.98));\r\n    box-shadow:\r\n      inset 0 0 28px rgba(23, 108, 255, 0.28),\r\n      0 0 0 3px rgba(32, 126, 255, 0.13),\r\n      0 0 18px rgba(31, 132, 255, 0.67),\r\n      0 0 42px rgba(31, 132, 255, 0.27);\r\n    transition:\r\n      transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1),\r\n      border-color 180ms ease,\r\n      box-shadow 180ms ease;\r\n  }\r\n\r\n  .psh-center-icon {\r\n    position: relative;\r\n    z-index: 2;\r\n    display: grid;\r\n    place-items: center;\r\n    width: 48%;\r\n    height: 48%;\r\n    color: rgba(248, 252, 255, 0.95);\r\n    transform: scale(var(--psh-center-icon-scale));\r\n    transform-origin: center;\r\n    transition: filter 180ms ease;\r\n  }\r\n\r\n  .psh-center-ripple {\r\n    position: absolute;\r\n    inset: 3%;\r\n    border: 1px solid rgba(94, 188, 255, 0.44);\r\n    border-radius: 50%;\r\n    opacity: 0;\r\n    transform: scale(0.72);\r\n  }\r\n\r\n  .psh-center-hub.is-hit {\r\n    transform: translate(-50%, -50%) scale(1.055);\r\n    border-color: #b9edff;\r\n    box-shadow:\r\n      inset 0 0 34px rgba(42, 147, 255, 0.44),\r\n      0 0 0 5px rgba(37, 137, 255, 0.14),\r\n      0 0 24px rgba(35, 146, 255, 0.96),\r\n      0 0 54px rgba(35, 146, 255, 0.52);\r\n  }\r\n\r\n  .psh-center-hub.is-hit .psh-center-icon {\r\n    filter:\r\n      drop-shadow(0 0 4px rgba(255, 255, 255, 0.95))\r\n      drop-shadow(0 0 12px rgba(65, 177, 255, 1));\r\n  }\r\n\r\n  .psh-center-hub.is-hit .psh-center-ripple {\r\n    animation: psh-center-arrival var(--psh-center-pulse-duration) ease-out both;\r\n  }\r\n\r\n  @keyframes psh-node-breathe {\r\n    0%,\r\n    100% {\r\n      transform: scale(1.055);\r\n    }\r\n    50% {\r\n      transform: scale(1.11);\r\n    }\r\n  }\r\n\r\n  @keyframes psh-center-arrival {\r\n    0% {\r\n      opacity: 0.9;\r\n      transform: scale(0.72);\r\n    }\r\n    100% {\r\n      opacity: 0;\r\n      transform: scale(1.35);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 1024px) {\r\n    .psh-widget,\r\n    .psh-frame {\r\n      aspect-ratio: 1.461333 \/ 1;\r\n    }\r\n\r\n    .psh-frame {\r\n      --psh-tablet-small-corner: clamp(14px, 2.8cqw, 30px);\r\n      --psh-tablet-large-corner: clamp(80px, 10.8cqw, 112px);\r\n      border-radius:\r\n        var(--psh-tablet-small-corner)\r\n        var(--psh-tablet-large-corner)\r\n        var(--psh-tablet-large-corner)\r\n        var(--psh-tablet-small-corner);\r\n    }\r\n\r\n    .psh-node {\r\n      --psh-node-size: clamp(\r\n        var(--psh-tablet-node-min),\r\n        var(--psh-tablet-node-fluid),\r\n        var(--psh-tablet-node-max)\r\n      );\r\n    }\r\n  }\r\n\r\n  @media (max-width: 540px) {\r\n    .psh-frame {\r\n      --psh-mobile-corner: clamp(12px, 3.4cqw, 18px);\r\n      border-radius: var(--psh-mobile-corner);\r\n    }\r\n\r\n    .psh-node {\r\n      --psh-node-size: clamp(\r\n        var(--psh-mobile-node-min),\r\n        var(--psh-mobile-node-fluid),\r\n        var(--psh-mobile-node-max)\r\n      );\r\n      --psh-label-gap: 7px;\r\n    }\r\n\r\n    .psh-node-label {\r\n      width: clamp(92px, 25cqw, 108px);\r\n      font-size: clamp(12.75px, 3.675cqw, 15px);\r\n    }\r\n\r\n    .psh-center-hub {\r\n      --psh-center-size: clamp(64px, 17.5cqw, 74px);\r\n    }\r\n\r\n    .psh-route-base {\r\n      stroke-width: 1.25px;\r\n    }\r\n\r\n    .psh-route-active {\r\n      stroke-width: 1.65px;\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .psh-node-orb,\r\n    .psh-icon-slot,\r\n    .psh-node-label,\r\n    .psh-center-hub,\r\n    .psh-center-icon {\r\n      transition: none;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n  (() => {\r\n    \"use strict\";\r\n\r\n    const ROOT_SELECTOR = \"[data-psh-widget]\";\r\n\r\n    const numberFrom = (value, fallback, minimum, maximum) => {\r\n      const parsed = Number.parseFloat(value);\r\n      if (!Number.isFinite(parsed)) return fallback;\r\n      return Math.min(maximum, Math.max(minimum, parsed));\r\n    };\r\n\r\n    const easeInOutSine = (value) =>\r\n      -(Math.cos(Math.PI * Math.min(1, Math.max(0, value))) - 1) \/ 2;\r\n\r\n    const initialise = (root) => {\r\n      if (!root || root.dataset.pshReady === \"true\") return;\r\n      root.dataset.pshReady = \"true\";\r\n\r\n      const frame = root.querySelector(\"[data-psh-frame]\");\r\n      const image = root.querySelector(\"[data-psh-image]\");\r\n      const nodes = Array.from(root.querySelectorAll(\"[data-psh-node]\"));\r\n      const masks = Array.from(root.querySelectorAll(\"[data-psh-mask]\"));\r\n      const revealPaths = Array.from(root.querySelectorAll(\"[data-psh-reveal]\"));\r\n      const activeLines = Array.from(root.querySelectorAll(\"[data-psh-active-line]\"));\r\n      const center = root.querySelector(\"[data-psh-center]\");\r\n      if (!frame || !image || nodes.length !== 4 || masks.length !== 4 || !center) return;\r\n\r\n      const imageUrl = (root.dataset.imageUrl || \"\").trim();\r\n      if (imageUrl) image.src = imageUrl;\r\n\r\n      const aspectRatio = numberFrom(root.dataset.aspectRatio, 2.192, 1.2, 5);\r\n      const sizePercent = numberFrom(root.dataset.size, 100, 40, 180);\r\n      const maxWidth = numberFrom(root.dataset.maxWidth, 1400, 200, 5000);\r\n      const mobileHeight = numberFrom(root.dataset.mobileHeight, 1.5, 1, 3);\r\n      const tallBreakpoint = numberFrom(root.dataset.tallBreakpoint, 1024, 320, 2400);\r\n      const centerLaunchSeconds = numberFrom(root.dataset.centerLaunchSeconds, 0.48, 0.05, 10);\r\n      const lineTravelSeconds = numberFrom(root.dataset.lineTravelSeconds, 1.35, 0.2, 20);\r\n      const outerPulseSeconds = numberFrom(root.dataset.outerPulseSeconds, 0.55, 0.08, 10);\r\n      const gapSeconds = numberFrom(root.dataset.gapSeconds, 0.3, 0, 10);\r\n      const desktopOuterSize = numberFrom(root.dataset.desktopOuterSize, 150, 40, 300) \/ 100;\r\n      const tabletOuterSize = numberFrom(root.dataset.tabletOuterSize, 100, 40, 300) \/ 100;\r\n      const mobileOuterSize = numberFrom(root.dataset.mobileOuterSize, 100, 40, 300) \/ 100;\r\n      const outerIconScale = numberFrom(root.dataset.outerIconScale, 1, 0.4, 1.8);\r\n      const centerIconScale = numberFrom(root.dataset.centerIconScale, 1, 0.4, 1.8);\r\n      const reducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\");\r\n\r\n      root.style.setProperty(\"--psh-outer-icon-scale\", outerIconScale);\r\n      root.style.setProperty(\"--psh-center-icon-scale\", centerIconScale);\r\n      root.style.setProperty(\"--psh-center-pulse-duration\", `${centerLaunchSeconds}s`);\r\n\r\n      \/* Responsive outer-circle size controls. Values in HTML are percentages. *\/\r\n      root.style.setProperty(\"--psh-desktop-node-min\", `${48 * desktopOuterSize}px`);\r\n      root.style.setProperty(\"--psh-desktop-node-fluid\", `${6.8 * desktopOuterSize}cqw`);\r\n      root.style.setProperty(\"--psh-desktop-node-max\", `${86 * desktopOuterSize}px`);\r\n      root.style.setProperty(\"--psh-tablet-node-min\", `${48 * tabletOuterSize}px`);\r\n      root.style.setProperty(\"--psh-tablet-node-fluid\", `${6.8 * tabletOuterSize}cqw`);\r\n      root.style.setProperty(\"--psh-tablet-node-max\", `${86 * tabletOuterSize}px`);\r\n      root.style.setProperty(\"--psh-mobile-node-min\", `${40 * mobileOuterSize}px`);\r\n      root.style.setProperty(\"--psh-mobile-node-fluid\", `${11 * mobileOuterSize}cqw`);\r\n      root.style.setProperty(\"--psh-mobile-node-max\", `${46 * mobileOuterSize}px`);\r\n\r\n      const iconUrls = {\r\n        website: (root.dataset.iconWebsiteUrl || \"\").trim(),\r\n        sales: (root.dataset.iconSalesUrl || \"\").trim(),\r\n        vr: (root.dataset.iconVrUrl || \"\").trim(),\r\n        maps: (root.dataset.iconMapsUrl || \"\").trim(),\r\n        center: (root.dataset.iconCenterUrl || \"\").trim()\r\n      };\r\n\r\n      Object.entries(iconUrls).forEach(([name, url]) => {\r\n        if (!url) return;\r\n        const slot = root.querySelector(`[data-psh-icon-slot=\"${name}\"]`);\r\n        if (!slot) return;\r\n        const replacement = document.createElement(\"img\");\r\n        replacement.src = url;\r\n        replacement.alt = \"\";\r\n        replacement.decoding = \"async\";\r\n        slot.replaceChildren(replacement);\r\n      });\r\n\r\n      \/*\r\n        Hard-lock inline SVG paint inside this widget.\r\n        Inline !important styles beat aggressive global Elementor\/theme rules\r\n        such as: svg path { fill: url(#iconGradient) !important; }\r\n      *\/\r\n      const isolateSvgPaint = () => {\r\n        const iconSvgs = root.querySelectorAll(\r\n          \".psh-icon-slot svg, .psh-center-icon svg\"\r\n        );\r\n\r\n        iconSvgs.forEach((svg) => {\r\n          svg.style.setProperty(\"fill\", \"none\", \"important\");\r\n          svg.style.setProperty(\"stroke\", \"currentColor\", \"important\");\r\n\r\n          svg.querySelectorAll(\r\n            \"path, circle, rect, ellipse, line, polyline, polygon, use\"\r\n          ).forEach((shape) => {\r\n            shape.style.setProperty(\"fill\", \"none\", \"important\");\r\n            shape.style.setProperty(\"stroke\", \"currentColor\", \"important\");\r\n          });\r\n        });\r\n\r\n        root.querySelectorAll(\".psh-route-layer path\").forEach((path) => {\r\n          path.style.setProperty(\"fill\", \"none\", \"important\");\r\n        });\r\n      };\r\n\r\n      isolateSvgPaint();\r\n\r\n      const uniqueId = `psh-${Math.random().toString(36).slice(2, 9)}-${Date.now().toString(36)}`;\r\n      masks.forEach((mask, index) => {\r\n        const maskId = `${uniqueId}-mask-${index}`;\r\n        mask.id = maskId;\r\n        activeLines[index]?.setAttribute(\"mask\", `url(#${maskId})`);\r\n      });\r\n\r\n      revealPaths.forEach((path) => {\r\n        path.style.strokeDashoffset = \"100\";\r\n      });\r\n      activeLines.forEach((line) => {\r\n        line.style.opacity = \"0\";\r\n      });\r\n\r\n      let resizeFrame = 0;\r\n      let animationFrame = 0;\r\n      let clockOrigin = performance.now();\r\n\r\n      const setMeasuredHeight = () => {\r\n        const parent = root.parentElement;\r\n        const parentWidth = parent\r\n          ? parent.getBoundingClientRect().width\r\n          : root.getBoundingClientRect().width;\r\n        const availableWidth = Math.max(\r\n          1,\r\n          parentWidth || root.getBoundingClientRect().width || window.innerWidth\r\n        );\r\n        const visualWidth = Math.min(maxWidth, availableWidth * (sizePercent \/ 100));\r\n        const heightMultiplier = window.innerWidth <= tallBreakpoint ? mobileHeight : 1;\r\n        const visualHeight = (visualWidth \/ aspectRatio) * heightMultiplier;\r\n        const roundedWidth = Math.round(visualWidth * 100) \/ 100;\r\n        const roundedHeight = Math.round(visualHeight * 100) \/ 100;\r\n\r\n        root.style.setProperty(\"--psh-frame-width\", `${roundedWidth}px`);\r\n        root.style.setProperty(\"--psh-frame-height\", `${roundedHeight}px`);\r\n        root.style.setProperty(\"--psh-layout-height\", `${roundedHeight}px`);\r\n        root.style.height = `${roundedHeight}px`;\r\n        root.style.minHeight = `${roundedHeight}px`;\r\n        frame.style.width = `${roundedWidth}px`;\r\n        frame.style.height = `${roundedHeight}px`;\r\n\r\n        const elementorContainer = root.closest(\".elementor-widget-container\");\r\n        if (elementorContainer) {\r\n          elementorContainer.style.setProperty(\"min-height\", `${roundedHeight}px`, \"important\");\r\n        }\r\n\r\n        const elementorWidget = root.closest(\".elementor-widget-html\");\r\n        if (elementorWidget) {\r\n          elementorWidget.style.setProperty(\"min-height\", `${roundedHeight}px`, \"important\");\r\n        }\r\n      };\r\n\r\n      const queueMeasuredHeight = () => {\r\n        cancelAnimationFrame(resizeFrame);\r\n        resizeFrame = requestAnimationFrame(setMeasuredHeight);\r\n      };\r\n\r\n      const sequenceSeconds =\r\n        centerLaunchSeconds + lineTravelSeconds + outerPulseSeconds + gapSeconds;\r\n\r\n      const clearSequence = () => {\r\n        nodes.forEach((node) => node.classList.remove(\"is-active\"));\r\n        center.classList.remove(\"is-hit\");\r\n        activeLines.forEach((line) => {\r\n          line.style.opacity = \"0\";\r\n        });\r\n        revealPaths.forEach((path) => {\r\n          path.style.strokeDashoffset = \"100\";\r\n        });\r\n      };\r\n\r\n      const renderSequence = (now) => {\r\n        if (reducedMotion.matches) {\r\n          clearSequence();\r\n          animationFrame = 0;\r\n          return;\r\n        }\r\n\r\n        const localSeconds = ((now - clockOrigin) \/ 1000) % sequenceSeconds;\r\n        const lineStart = centerLaunchSeconds;\r\n        const lineEnd = lineStart + lineTravelSeconds;\r\n        const outerEnd = lineEnd + outerPulseSeconds;\r\n\r\n        \/* The hub launches all four routes together. *\/\r\n        center.classList.toggle(\"is-hit\", localSeconds < centerLaunchSeconds);\r\n\r\n        const showBlueRoutes = localSeconds >= lineStart && localSeconds < outerEnd;\r\n        activeLines.forEach((line) => {\r\n          line.style.opacity = showBlueRoutes ? \"1\" : \"0\";\r\n        });\r\n\r\n        revealPaths.forEach((path) => {\r\n          if (localSeconds < lineStart || localSeconds >= outerEnd) {\r\n            path.style.strokeDashoffset = \"100\";\r\n            return;\r\n          }\r\n\r\n          const linear = Math.min(1, Math.max(0, (localSeconds - lineStart) \/ lineTravelSeconds));\r\n          const progress = easeInOutSine(linear);\r\n          path.style.strokeDashoffset = `${100 - progress * 100}`;\r\n        });\r\n\r\n        \/* All four outer icons glow only after the travelling pulse reaches them. *\/\r\n        const outerHit = localSeconds >= lineEnd && localSeconds < outerEnd;\r\n        nodes.forEach((node) => {\r\n          node.classList.toggle(\"is-active\", outerHit);\r\n        });\r\n\r\n        animationFrame = requestAnimationFrame(renderSequence);\r\n      };\r\n\r\n      const restartSequence = () => {\r\n        clockOrigin = performance.now();\r\n        clearSequence();\r\n        if (!animationFrame) animationFrame = requestAnimationFrame(renderSequence);\r\n      };\r\n\r\n      setMeasuredHeight();\r\n      requestAnimationFrame(setMeasuredHeight);\r\n      window.setTimeout(setMeasuredHeight, 180);\r\n      window.setTimeout(setMeasuredHeight, 600);\r\n\r\n      if (\"ResizeObserver\" in window) {\r\n        const resizeObserver = new ResizeObserver(queueMeasuredHeight);\r\n        resizeObserver.observe(root.parentElement || root);\r\n        root._pshResizeObserver = resizeObserver;\r\n      }\r\n\r\n      window.addEventListener(\"resize\", queueMeasuredHeight, { passive: true });\r\n      window.addEventListener(\"pageshow\", restartSequence, { passive: true });\r\n      document.addEventListener(\"visibilitychange\", () => {\r\n        if (!document.hidden) restartSequence();\r\n      });\r\n      reducedMotion.addEventListener?.(\"change\", restartSequence);\r\n\r\n      restartSequence();\r\n    };\r\n\r\n    document.querySelectorAll(ROOT_SELECTOR).forEach(initialise);\r\n  })();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-f7587ee e-con e-atomic-element e-flexbox-base e-f7587ee-95199a8 \" data-id=\"f7587ee\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"f7587ee\" data-e-type=\"e-flexbox\" data-id=\"f7587ee\">\n    <div class=\"elementor-element elementor-element-b01a4e7 e-flex e-con-boxed e-con e-parent\" data-id=\"b01a4e7\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0fce554 elementor-widget elementor-widget-heading\" data-id=\"0fce554\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">One spatial asset.<br> Value across <span class=\"animated-global\">every team.<\/span><\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-791f579 elementor-widget elementor-widget-html\" data-id=\"791f579\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- =========================================================\r\n     PANOSKY \u2014 VALUE ACROSS EVERY TEAM\r\n     VERSION: PS-VALUE-CARDS-V7\r\n\r\n     ALL DEVICES:\r\n     - Card 01 blur resolves\r\n     - Cards 02\u201306 spread from Card 01\r\n     - Entrance repeats after section leaves viewport\r\n       and enters again\r\n\r\n     DESKTOP + TABLET:\r\n     - Hover = 5% grow\r\n     - Icon glow\r\n\r\n     MOBILE:\r\n     - Card nearest viewport center = 5% grow\r\n     - Icon glow\r\n     ========================================================= -->\r\n\r\n\r\n<div class=\"psvc-v7-wrap\">\r\n\r\n\r\n  <!-- ======================================================\r\n       01 \u2014 MARKETING & BRAND\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-01.jpg');\r\n      --image-x: 65%;\r\n      --image-y: 50%;\r\n      --icon-size: 40px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/megaphone.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Marketing &amp; Brand<\/h3>\r\n\r\n        <p>\r\n          Create immersive stories that captivate,\r\n          resonate, and amplify your brand.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n\r\n  <!-- ======================================================\r\n       02 \u2014 SALES & BOOKINGS\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-03.jpg');\r\n      --image-x: 68%;\r\n      --image-y: 50%;\r\n      --icon-size: 42px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/chart-no-axes-combined.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Sales &amp; Bookings<\/h3>\r\n\r\n        <p>\r\n          Close deals faster with visual experiences\r\n          that build confidence.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n\r\n  <!-- ======================================================\r\n       03 \u2014 OPERATIONS & EVENTS\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-02.jpg');\r\n      --image-x: 68%;\r\n      --image-y: 50%;\r\n      --icon-size: 41px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/calendar-check.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Operations &amp; Events<\/h3>\r\n\r\n        <p>\r\n          Plan, coordinate, and execute events\r\n          with total clarity and control.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n\r\n  <!-- ======================================================\r\n       04 \u2014 CUSTOMER EXPERIENCE\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-04.jpg');\r\n      --image-x: 64%;\r\n      --image-y: 50%;\r\n      --icon-size: 42px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/smile.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Customer Experience<\/h3>\r\n\r\n        <p>\r\n          Delight guests with seamless,\r\n          interactive experiences they'll remember.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n\r\n  <!-- ======================================================\r\n       05 \u2014 FINANCE & PROCUREMENT\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-06.jpg');\r\n      --image-x: 68%;\r\n      --image-y: 50%;\r\n      --icon-size: 43px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/dollar-sign.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Finance &amp; Procurement<\/h3>\r\n\r\n        <p>\r\n          Make smarter decisions with complete\r\n          visibility and measurable impact.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n\r\n  <!-- ======================================================\r\n       06 \u2014 EXECUTIVE LEADERSHIP\r\n       ====================================================== -->\r\n\r\n  <article\r\n    class=\"psvc-v7-card\"\r\n    style=\"\r\n      --card-image: url('https:\/\/panosky-website-media.b-cdn.net\/Web%20Images%20and%20videos\/The%20Value%20page\/Departments-05.jpg');\r\n      --image-x: 70%;\r\n      --image-y: 50%;\r\n      --icon-size: 42px;\r\n    \"\r\n  >\r\n\r\n    <div class=\"psvc-v7-image\"><\/div>\r\n    <div class=\"psvc-v7-overlay\"><\/div>\r\n\r\n    <div class=\"psvc-v7-content\">\r\n\r\n      <div class=\"psvc-v7-iconbox\">\r\n        <img decoding=\"async\"\r\n          class=\"psvc-v7-icon\"\r\n          src=\"https:\/\/api.iconify.design\/lucide\/user-round.svg?color=%23e9f8ff\"\r\n          alt=\"\"\r\n        >\r\n      <\/div>\r\n\r\n      <div class=\"psvc-v7-copy\">\r\n\r\n        <h3>Executive Leadership<\/h3>\r\n\r\n        <p>\r\n          Drive strategic decisions with a single\r\n          source of spatial truth.\r\n        <\/p>\r\n\r\n      <\/div>\r\n\r\n    <\/div>\r\n\r\n  <\/article>\r\n\r\n\r\n<\/div>\r\n\r\n\r\n\r\n<style>\r\n\r\n\/* ==========================================================\r\n   PANOSKY VALUE CARDS V7\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-wrap {\r\n\r\n\r\n  \/* ========================================================\r\n     ENTRANCE ANIMATION CONTROLS\r\n     ======================================================== *\/\r\n\r\n  \/* Card 01 resolve *\/\r\n  --first-duration: 500ms;\r\n\r\n  \/* Pause after Card 01 *\/\r\n  --after-first-pause: 12ms;\r\n\r\n  \/* Travel time of each card *\/\r\n  --spread-duration: 850ms;\r\n\r\n  \/* Delay between each travelling card *\/\r\n  --spread-stagger: 140ms;\r\n\r\n  \/* Blur *\/\r\n  --first-blur: 24px;\r\n  --spread-blur: 13px;\r\n\r\n  \/* Starting scales *\/\r\n  --first-start-scale: .94;\r\n  --spread-start-scale: .90;\r\n\r\n  \/* Entrance curve *\/\r\n  --entrance-ease:\r\n    cubic-bezier(.16, 1, .3, 1);\r\n\r\n\r\n  \/*\r\n  HOW MUCH OF SECTION MUST ENTER VIEW\r\n  BEFORE ANIMATION STARTS\r\n\r\n  0.05 = very early\r\n  0.12 = balanced\r\n  0.30 = later\r\n  *\/\r\n\r\n  --entrance-trigger: .12;\r\n\r\n\r\n\r\n  \/* ========================================================\r\n     INTERACTION CONTROLS\r\n     ======================================================== *\/\r\n\r\n  \/* 1.05 = exactly 5% *\/\r\n  --active-scale: 1.05;\r\n\r\n  \/* Grow \/ return speed *\/\r\n  --focus-grow-speed: 360ms;\r\n\r\n  \/* Icon glow rhythm *\/\r\n  --icon-glow-speed: 1350ms;\r\n\r\n  \/* Mobile center activation zone *\/\r\n  --mobile-focus-range: 27;\r\n\r\n\r\n\r\n  \/* ========================================================\r\n     DESIGN CONTROLS\r\n     ======================================================== *\/\r\n\r\n  --grid-gap: 18px;\r\n\r\n  --card-height: 330px;\r\n  --card-radius: 23px;\r\n\r\n  --padding-x: 24px;\r\n  --padding-y: 25px;\r\n\r\n  --content-gap: 18px;\r\n  --copy-max-width: 250px;\r\n\r\n  --title-size: 24px;\r\n  --body-size: 16px;\r\n\r\n  --icon-box-size: 86px;\r\n\r\n  --blue: #008bff;\r\n  --cyan: #50f5ff;\r\n\r\n\r\n  position: relative;\r\n\r\n  width: 100%;\r\n  max-width: 100%;\r\n\r\n  display: grid;\r\n\r\n  grid-template-columns:\r\n    repeat(3, minmax(0,1fr));\r\n\r\n  gap:\r\n    var(--grid-gap);\r\n\r\n  padding: 0;\r\n  margin: 0;\r\n\r\n  background:\r\n    transparent !important;\r\n\r\n  overflow:\r\n    visible !important;\r\n\r\n  box-sizing:\r\n    border-box;\r\n}\r\n\r\n\r\n\r\n.psvc-v7-wrap *,\r\n.psvc-v7-wrap *::before,\r\n.psvc-v7-wrap *::after {\r\n  box-sizing:\r\n    border-box;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   CARD\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-card {\r\n\r\n  --card-image:\r\n    none;\r\n\r\n  --image-x:\r\n    50%;\r\n\r\n  --image-y:\r\n    50%;\r\n\r\n  --icon-size:\r\n    42px;\r\n\r\n  --spread-x:\r\n    0px;\r\n\r\n  --spread-y:\r\n    0px;\r\n\r\n\r\n  position:\r\n    relative;\r\n\r\n  width:\r\n    100%;\r\n\r\n  height:\r\n    var(--card-height);\r\n\r\n  min-width:\r\n    0;\r\n\r\n  overflow:\r\n    hidden;\r\n\r\n  border-radius:\r\n    var(--card-radius);\r\n\r\n  isolation:\r\n    isolate;\r\n\r\n  background:\r\n    #020c1d;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(148,196,239,.30);\r\n\r\n  box-shadow:\r\n    inset 0 1px 0 rgba(255,255,255,.055),\r\n    inset 0 -1px 0 rgba(0,0,0,.70),\r\n    0 10px 35px rgba(0,0,0,.08);\r\n\r\n\r\n  \/*\r\n  ENTRANCE = transform\r\n\r\n  HOVER \/ MOBILE FOCUS = scale\r\n\r\n  Keeping them separate prevents\r\n  animation conflicts.\r\n  *\/\r\n\r\n  scale:\r\n    1;\r\n\r\n  transform-origin:\r\n    center center;\r\n\r\n\r\n  transition:\r\n    scale\r\n      var(--focus-grow-speed)\r\n      cubic-bezier(.16,1,.3,1),\r\n\r\n    border-color\r\n      var(--focus-grow-speed)\r\n      ease,\r\n\r\n    box-shadow\r\n      var(--focus-grow-speed)\r\n      ease;\r\n\r\n\r\n  will-change:\r\n    transform,\r\n    scale,\r\n    opacity,\r\n    filter;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   INTERNAL BORDER\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-card::before {\r\n\r\n  content:\r\n    \"\";\r\n\r\n  position:\r\n    absolute;\r\n\r\n  inset:\r\n    0;\r\n\r\n  z-index:\r\n    8;\r\n\r\n  pointer-events:\r\n    none;\r\n\r\n  border-radius:\r\n    inherit;\r\n\r\n  padding:\r\n    1px;\r\n\r\n  background:\r\n    linear-gradient(\r\n      135deg,\r\n\r\n      rgba(180,224,255,.22),\r\n\r\n      rgba(85,164,255,.03) 30%,\r\n\r\n      rgba(0,139,255,.02) 70%,\r\n\r\n      rgba(80,245,255,.36)\r\n    );\r\n\r\n  -webkit-mask:\r\n    linear-gradient(#fff 0 0) content-box,\r\n    linear-gradient(#fff 0 0);\r\n\r\n  -webkit-mask-composite:\r\n    xor;\r\n\r\n  mask-composite:\r\n    exclude;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   BLUE LOWER EDGE\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-card::after {\r\n\r\n  content:\r\n    \"\";\r\n\r\n  position:\r\n    absolute;\r\n\r\n  right:\r\n    -3%;\r\n\r\n  bottom:\r\n    0;\r\n\r\n  z-index:\r\n    10;\r\n\r\n  width:\r\n    35%;\r\n\r\n  height:\r\n    2px;\r\n\r\n  pointer-events:\r\n    none;\r\n\r\n  background:\r\n    linear-gradient(\r\n      90deg,\r\n\r\n      transparent,\r\n\r\n      rgba(0,139,255,.25),\r\n\r\n      rgba(0,139,255,.75),\r\n\r\n      rgba(80,245,255,.95),\r\n\r\n      #e7fbff\r\n    );\r\n\r\n  box-shadow:\r\n    0 0 6px rgba(0,157,255,.40),\r\n    0 0 15px rgba(0,139,255,.20);\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   FULL COVER IMAGE\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-image {\r\n\r\n  position:\r\n    absolute;\r\n\r\n  inset:\r\n    0;\r\n\r\n  width:\r\n    100%;\r\n\r\n  height:\r\n    100%;\r\n\r\n  z-index:\r\n    0;\r\n\r\n  background-image:\r\n    var(--card-image);\r\n\r\n  background-size:\r\n    cover;\r\n\r\n  background-position:\r\n    var(--image-x)\r\n    var(--image-y);\r\n\r\n  background-repeat:\r\n    no-repeat;\r\n\r\n  transform:\r\n    translate3d(0,0,0)\r\n    scale(1.002);\r\n\r\n  transition:\r\n    transform\r\n    .8s\r\n    cubic-bezier(.2,.8,.2,1);\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   TOP DARK SHADE\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-overlay {\r\n\r\n  position:\r\n    absolute;\r\n\r\n  inset:\r\n    0;\r\n\r\n  z-index:\r\n    1;\r\n\r\n  pointer-events:\r\n    none;\r\n\r\n  background:\r\n\r\n    radial-gradient(\r\n      circle at 87% 88%,\r\n      rgba(0,99,255,.13),\r\n      transparent 42%\r\n    ),\r\n\r\n    linear-gradient(\r\n      180deg,\r\n\r\n      rgba(1,10,24,.98) 0%,\r\n\r\n      rgba(1,10,24,.94) 16%,\r\n\r\n      rgba(1,10,24,.80) 30%,\r\n\r\n      rgba(1,10,24,.52) 46%,\r\n\r\n      rgba(1,10,24,.20) 62%,\r\n\r\n      rgba(1,10,24,.07) 78%,\r\n\r\n      rgba(1,10,24,.03) 100%\r\n    ),\r\n\r\n    radial-gradient(\r\n      ellipse at center,\r\n      transparent 48%,\r\n      rgba(0,5,16,.13) 100%\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   CONTENT\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-content {\r\n\r\n  position:\r\n    relative;\r\n\r\n  z-index:\r\n    4;\r\n\r\n  width:\r\n    100%;\r\n\r\n  height:\r\n    100%;\r\n\r\n  padding:\r\n    var(--padding-y)\r\n    var(--padding-x);\r\n\r\n  display:\r\n    flex;\r\n\r\n  flex-direction:\r\n    row;\r\n\r\n  align-items:\r\n    flex-start;\r\n\r\n  justify-content:\r\n    flex-start;\r\n\r\n  gap:\r\n    var(--content-gap);\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   ICON CIRCLE\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-iconbox {\r\n\r\n  position:\r\n    relative;\r\n\r\n  width:\r\n    var(--icon-box-size);\r\n\r\n  height:\r\n    var(--icon-box-size);\r\n\r\n  min-width:\r\n    var(--icon-box-size);\r\n\r\n  min-height:\r\n    var(--icon-box-size);\r\n\r\n  flex:\r\n    0 0\r\n    var(--icon-box-size);\r\n\r\n  display:\r\n    flex;\r\n\r\n  align-items:\r\n    center;\r\n\r\n  justify-content:\r\n    center;\r\n\r\n  border-radius:\r\n    999px;\r\n\r\n  overflow:\r\n    hidden;\r\n\r\n  border:\r\n    1px solid\r\n    rgba(50,149,255,.62);\r\n\r\n  background:\r\n    radial-gradient(\r\n      circle at 50% 30%,\r\n\r\n      rgba(84,185,255,.27),\r\n\r\n      rgba(7,49,100,.76) 45%,\r\n\r\n      rgba(2,16,38,.96) 75%\r\n    );\r\n\r\n  box-shadow:\r\n    inset 0 0 24px rgba(0,132,255,.18),\r\n    inset 0 1px 1px rgba(255,255,255,.16),\r\n    0 0 0 1px rgba(24,86,161,.16),\r\n    0 0 20px rgba(0,116,255,.15);\r\n}\r\n\r\n\r\n\r\n.psvc-v7-iconbox::before {\r\n\r\n  content:\r\n    \"\";\r\n\r\n  position:\r\n    absolute;\r\n\r\n  inset:\r\n    2px;\r\n\r\n  border-radius:\r\n    inherit;\r\n\r\n  pointer-events:\r\n    none;\r\n\r\n  background:\r\n    linear-gradient(\r\n      145deg,\r\n\r\n      rgba(255,255,255,.14),\r\n\r\n      rgba(255,255,255,.04) 24%,\r\n\r\n      transparent 45%\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   ICON IMAGE\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-icon {\r\n\r\n  position:\r\n    relative;\r\n\r\n  z-index:\r\n    2;\r\n\r\n  width:\r\n    var(--icon-size);\r\n\r\n  height:\r\n    var(--icon-size);\r\n\r\n  max-width:\r\n    none;\r\n\r\n  display:\r\n    block;\r\n\r\n  object-fit:\r\n    contain;\r\n\r\n  object-position:\r\n    center;\r\n\r\n  filter:\r\n    drop-shadow(\r\n      0 0 4px\r\n      rgba(58,166,255,.60)\r\n    )\r\n\r\n    drop-shadow(\r\n      0 0 10px\r\n      rgba(0,117,255,.22)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   COPY\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-copy {\r\n\r\n  width:\r\n    auto;\r\n\r\n  max-width:\r\n    var(--copy-max-width);\r\n\r\n  min-width:\r\n    0;\r\n\r\n  flex:\r\n    1 1 auto;\r\n\r\n  margin:\r\n    0;\r\n\r\n  padding:\r\n    5px 0 0 0;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   TITLE\r\n   ELEMENTOR GLOBAL PRIMARY FONT\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-copy h3 {\r\n\r\n  margin:\r\n    0 0 10px 0;\r\n\r\n  padding:\r\n    0;\r\n\r\n  color:\r\n    #ffffff;\r\n\r\n  font-family:\r\n    var(\r\n      --e-global-typography-primary-font-family\r\n    ),\r\n    sans-serif;\r\n\r\n  font-weight:\r\n    var(\r\n      --e-global-typography-primary-font-weight,\r\n      600\r\n    );\r\n\r\n  font-size:\r\n    var(--title-size);\r\n\r\n  line-height:\r\n    1.15;\r\n\r\n  letter-spacing:\r\n    -.032em;\r\n\r\n  text-shadow:\r\n    0 2px 12px rgba(0,0,0,.8);\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   BODY\r\n   ELEMENTOR GLOBAL TEXT FONT\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-copy p {\r\n\r\n  margin:\r\n    0;\r\n\r\n  padding:\r\n    0;\r\n\r\n  color:\r\n    rgba(235,244,255,.80);\r\n\r\n  font-family:\r\n    var(\r\n      --e-global-typography-text-font-family\r\n    ),\r\n    sans-serif;\r\n\r\n  font-weight:\r\n    var(\r\n      --e-global-typography-text-font-weight,\r\n      400\r\n    );\r\n\r\n  font-size:\r\n    var(--body-size);\r\n\r\n  line-height:\r\n    1.48;\r\n\r\n  letter-spacing:\r\n    0;\r\n\r\n  text-shadow:\r\n    0 2px 10px rgba(0,0,0,.9);\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   ICON GLOW\r\n   ========================================================== *\/\r\n\r\n@keyframes psvc-v7-iconbox-glow {\r\n\r\n  0% {\r\n\r\n    border-color:\r\n      rgba(61,158,255,.72);\r\n\r\n    box-shadow:\r\n      inset 0 0 24px rgba(0,132,255,.22),\r\n      inset 0 1px 1px rgba(255,255,255,.20),\r\n      0 0 0 1px rgba(38,121,220,.25),\r\n      0 0 18px rgba(0,139,255,.28),\r\n      0 0 30px rgba(0,139,255,.10);\r\n  }\r\n\r\n\r\n  100% {\r\n\r\n    border-color:\r\n      rgba(128,240,255,.98);\r\n\r\n    box-shadow:\r\n      inset 0 0 30px rgba(0,170,255,.40),\r\n      inset 0 1px 2px rgba(255,255,255,.30),\r\n      0 0 0 1px rgba(80,245,255,.42),\r\n      0 0 28px rgba(0,157,255,.62),\r\n      0 0 52px rgba(0,139,255,.30);\r\n  }\r\n}\r\n\r\n\r\n\r\n@keyframes psvc-v7-icon-glow {\r\n\r\n  0% {\r\n\r\n    filter:\r\n      drop-shadow(\r\n        0 0 4px\r\n        rgba(78,181,255,.70)\r\n      )\r\n\r\n      drop-shadow(\r\n        0 0 9px\r\n        rgba(0,139,255,.32)\r\n      );\r\n  }\r\n\r\n\r\n  100% {\r\n\r\n    filter:\r\n      drop-shadow(\r\n        0 0 7px\r\n        rgba(210,250,255,.98)\r\n      )\r\n\r\n      drop-shadow(\r\n        0 0 17px\r\n        rgba(80,245,255,.72)\r\n      )\r\n\r\n      drop-shadow(\r\n        0 0 28px\r\n        rgba(0,139,255,.42)\r\n      );\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   DESKTOP + TABLET HOVER\r\n   ========================================================== *\/\r\n\r\n@media (min-width:768px) {\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card:hover {\r\n\r\n    scale:\r\n      var(--active-scale);\r\n\r\n    z-index:\r\n      50;\r\n\r\n    border-color:\r\n      rgba(127,216,255,.68);\r\n\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255,255,255,.10),\r\n      0 16px 42px rgba(0,76,180,.22),\r\n      0 0 34px rgba(0,139,255,.12);\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card:hover\r\n  .psvc-v7-iconbox {\r\n\r\n    animation:\r\n      psvc-v7-iconbox-glow\r\n      var(--icon-glow-speed)\r\n      ease-in-out\r\n      infinite\r\n      alternate;\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card:hover\r\n  .psvc-v7-icon {\r\n\r\n    animation:\r\n      psvc-v7-icon-glow\r\n      var(--icon-glow-speed)\r\n      ease-in-out\r\n      infinite\r\n      alternate;\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card:hover\r\n  .psvc-v7-image {\r\n\r\n    transform:\r\n      translate3d(0,0,0)\r\n      scale(1.025);\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   ==========================================================\r\n   ENTRANCE INITIAL STATE\r\n   NOW ACTIVE ON ALL DEVICES\r\n   ==========================================================\r\n   ========================================================== *\/\r\n\r\n\r\n\/* CARD 01 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-ready\r\n.psvc-v7-card:first-child {\r\n\r\n  opacity:\r\n    0;\r\n\r\n  filter:\r\n    blur(\r\n      var(--first-blur)\r\n    );\r\n\r\n  transform:\r\n    scale(\r\n      var(--first-start-scale)\r\n    );\r\n\r\n  z-index:\r\n    30;\r\n}\r\n\r\n\r\n\r\n\/* CARDS 02\u201306 STACK ON CARD 01 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-ready\r\n.psvc-v7-card:not(:first-child) {\r\n\r\n  opacity:\r\n    0;\r\n\r\n  filter:\r\n    blur(\r\n      var(--spread-blur)\r\n    );\r\n\r\n  transform:\r\n    translate3d(\r\n      var(--spread-x),\r\n      var(--spread-y),\r\n      0\r\n    )\r\n    scale(\r\n      var(--spread-start-scale)\r\n    );\r\n\r\n  z-index:\r\n    10;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   PLAY CARD 01\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:first-child {\r\n\r\n  animation:\r\n    psvc-v7-first-resolve\r\n    var(--first-duration)\r\n    var(--entrance-ease)\r\n    forwards;\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   PLAY CARDS 02\u201306\r\n   ========================================================== *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:not(:first-child) {\r\n\r\n  animation:\r\n    psvc-v7-spread\r\n    var(--spread-duration)\r\n    var(--entrance-ease)\r\n    forwards;\r\n}\r\n\r\n\r\n\r\n\/* CARD 02 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:nth-child(2) {\r\n\r\n  animation-delay:\r\n    calc(\r\n      var(--first-duration)\r\n      +\r\n      var(--after-first-pause)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* CARD 03 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:nth-child(3) {\r\n\r\n  animation-delay:\r\n    calc(\r\n      var(--first-duration)\r\n      +\r\n      var(--after-first-pause)\r\n      +\r\n      var(--spread-stagger)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* CARD 04 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:nth-child(4) {\r\n\r\n  animation-delay:\r\n    calc(\r\n      var(--first-duration)\r\n      +\r\n      var(--after-first-pause)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* CARD 05 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:nth-child(5) {\r\n\r\n  animation-delay:\r\n    calc(\r\n      var(--first-duration)\r\n      +\r\n      var(--after-first-pause)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* CARD 06 *\/\r\n\r\n.psvc-v7-wrap.psvc-v7-play\r\n.psvc-v7-card:nth-child(6) {\r\n\r\n  animation-delay:\r\n    calc(\r\n      var(--first-duration)\r\n      +\r\n      var(--after-first-pause)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n      +\r\n      var(--spread-stagger)\r\n    );\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   FIRST CARD RESOLVE\r\n   ========================================================== *\/\r\n\r\n@keyframes psvc-v7-first-resolve {\r\n\r\n  0% {\r\n\r\n    opacity:\r\n      0;\r\n\r\n    filter:\r\n      blur(\r\n        var(--first-blur)\r\n      );\r\n\r\n    transform:\r\n      scale(\r\n        var(--first-start-scale)\r\n      );\r\n  }\r\n\r\n\r\n  42% {\r\n\r\n    opacity:\r\n      1;\r\n  }\r\n\r\n\r\n  100% {\r\n\r\n    opacity:\r\n      1;\r\n\r\n    filter:\r\n      blur(0);\r\n\r\n    transform:\r\n      scale(1);\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   SPREAD FROM CARD 01\r\n   ========================================================== *\/\r\n\r\n@keyframes psvc-v7-spread {\r\n\r\n  0% {\r\n\r\n    opacity:\r\n      0;\r\n\r\n    filter:\r\n      blur(\r\n        var(--spread-blur)\r\n      );\r\n\r\n    transform:\r\n      translate3d(\r\n        var(--spread-x),\r\n        var(--spread-y),\r\n        0\r\n      )\r\n      scale(\r\n        var(--spread-start-scale)\r\n      );\r\n  }\r\n\r\n\r\n  12% {\r\n\r\n    opacity:\r\n      .20;\r\n  }\r\n\r\n\r\n  35% {\r\n\r\n    opacity:\r\n      .85;\r\n  }\r\n\r\n\r\n  100% {\r\n\r\n    opacity:\r\n      1;\r\n\r\n    filter:\r\n      blur(0);\r\n\r\n    transform:\r\n      translate3d(0,0,0)\r\n      scale(1);\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   TABLET\r\n   ========================================================== *\/\r\n\r\n@media\r\n(max-width:1024px)\r\nand\r\n(min-width:768px) {\r\n\r\n  .psvc-v7-wrap {\r\n\r\n    grid-template-columns:\r\n      repeat(2, minmax(0,1fr));\r\n\r\n    --grid-gap:\r\n      16px;\r\n\r\n    --card-height:\r\n      320px;\r\n\r\n    --card-radius:\r\n      21px;\r\n\r\n    --title-size:\r\n      22px;\r\n\r\n    --body-size:\r\n      15px;\r\n\r\n    --icon-box-size:\r\n      78px;\r\n\r\n    --padding-x:\r\n      22px;\r\n\r\n    --padding-y:\r\n      22px;\r\n\r\n    --content-gap:\r\n      15px;\r\n\r\n    --copy-max-width:\r\n      230px;\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   MOBILE\r\n   ========================================================== *\/\r\n\r\n@media\r\n(max-width:767px) {\r\n\r\n  \/* MOBILE ONLY: entrance animation disabled.\r\n     Everything else remains unchanged. *\/\r\n  .psvc-v7-wrap.psvc-v7-ready\r\n  .psvc-v7-card,\r\n  .psvc-v7-wrap.psvc-v7-play\r\n  .psvc-v7-card {\r\n\r\n    opacity:\r\n      1 !important;\r\n\r\n    filter:\r\n      none !important;\r\n\r\n    transform:\r\n      none !important;\r\n\r\n    animation:\r\n      none !important;\r\n  }\r\n\r\n  .psvc-v7-wrap {\r\n\r\n    grid-template-columns:\r\n      1fr;\r\n\r\n    --grid-gap:\r\n      14px;\r\n\r\n    --card-height:\r\n      305px;\r\n\r\n    --card-radius:\r\n      20px;\r\n\r\n    --title-size:\r\n      21px;\r\n\r\n    --body-size:\r\n      14px;\r\n\r\n    --icon-box-size:\r\n      72px;\r\n\r\n    --padding-x:\r\n      20px;\r\n\r\n    --padding-y:\r\n      20px;\r\n\r\n    --content-gap:\r\n      14px;\r\n\r\n    --copy-max-width:\r\n      250px;\r\n  }\r\n\r\n\r\n\r\n  \/*\r\n  Narrower so the 5% center-focus growth\r\n  doesn't produce horizontal overflow.\r\n  *\/\r\n\r\n  .psvc-v7-card {\r\n\r\n    width:\r\n      95.25%;\r\n\r\n    margin-left:\r\n      auto;\r\n\r\n    margin-right:\r\n      auto;\r\n  }\r\n\r\n\r\n\r\n  \/*\r\n  MOBILE FOCUS ONLY BECOMES ACTIVE\r\n  AFTER ENTRANCE FINISHES\r\n  *\/\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card.psvc-v7-mobile-focus {\r\n\r\n    scale:\r\n      var(--active-scale);\r\n\r\n    z-index:\r\n      50;\r\n\r\n    border-color:\r\n      rgba(127,216,255,.68);\r\n\r\n    box-shadow:\r\n      inset 0 1px 0 rgba(255,255,255,.10),\r\n      0 15px 38px rgba(0,76,180,.20),\r\n      0 0 28px rgba(0,139,255,.13);\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card.psvc-v7-mobile-focus\r\n  .psvc-v7-iconbox {\r\n\r\n    animation:\r\n      psvc-v7-iconbox-glow\r\n      var(--icon-glow-speed)\r\n      ease-in-out\r\n      infinite\r\n      alternate;\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card.psvc-v7-mobile-focus\r\n  .psvc-v7-icon {\r\n\r\n    animation:\r\n      psvc-v7-icon-glow\r\n      var(--icon-glow-speed)\r\n      ease-in-out\r\n      infinite\r\n      alternate;\r\n  }\r\n\r\n\r\n\r\n  .psvc-v7-wrap.psvc-v7-complete\r\n  .psvc-v7-card.psvc-v7-mobile-focus\r\n  .psvc-v7-image {\r\n\r\n    transform:\r\n      translate3d(0,0,0)\r\n      scale(1.025);\r\n  }\r\n\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   SMALL MOBILE\r\n   ========================================================== *\/\r\n\r\n@media\r\n(max-width:430px) {\r\n\r\n  .psvc-v7-wrap {\r\n\r\n    --card-height:\r\n      290px;\r\n\r\n    --title-size:\r\n      20px;\r\n\r\n    --body-size:\r\n      13.5px;\r\n\r\n    --icon-box-size:\r\n      68px;\r\n\r\n    --padding-x:\r\n      18px;\r\n\r\n    --padding-y:\r\n      18px;\r\n\r\n    --content-gap:\r\n      13px;\r\n\r\n    --copy-max-width:\r\n      220px;\r\n  }\r\n}\r\n\r\n\r\n\r\n\/* ==========================================================\r\n   REDUCED MOTION\r\n   ========================================================== *\/\r\n\r\n@media\r\n(prefers-reduced-motion: reduce) {\r\n\r\n  .psvc-v7-card {\r\n\r\n    opacity:\r\n      1 !important;\r\n\r\n    filter:\r\n      none !important;\r\n\r\n    transform:\r\n      none !important;\r\n\r\n    scale:\r\n      1 !important;\r\n\r\n    animation:\r\n      none !important;\r\n\r\n    transition:\r\n      none !important;\r\n  }\r\n\r\n\r\n  .psvc-v7-iconbox,\r\n  .psvc-v7-icon {\r\n\r\n    animation:\r\n      none !important;\r\n  }\r\n\r\n}\r\n\r\n<\/style>\r\n\r\n\r\n\r\n<script>\r\n\r\n(function () {\r\n\r\n\r\n  const grids =\r\n    document.querySelectorAll(\r\n      '.psvc-v7-wrap'\r\n    );\r\n\r\n\r\n  grids.forEach((grid) => {\r\n\r\n\r\n    const cards =\r\n      Array.from(\r\n        grid.querySelectorAll(\r\n          '.psvc-v7-card'\r\n        )\r\n      );\r\n\r\n\r\n    if (!cards.length) {\r\n      return;\r\n    }\r\n\r\n\r\n\r\n    let entrancePlaying =\r\n      false;\r\n\r\n\r\n    let entranceComplete =\r\n      false;\r\n\r\n\r\n    \/*\r\n    TRUE means the section is ready\r\n    to play next time it enters.\r\n    *\/\r\n\r\n    let entranceArmed =\r\n      true;\r\n\r\n\r\n    let completeTimer =\r\n      null;\r\n\r\n\r\n    let resizeTimer =\r\n      null;\r\n\r\n\r\n    let mobileRaf =\r\n      null;\r\n\r\n\r\n    function entranceEnabledForCurrentViewport() {\r\n\r\n      return window.matchMedia(\r\n        '(min-width: 768px)'\r\n      ).matches;\r\n\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       TRUE GRID POSITIONS\r\n\r\n       offsetLeft \/ offsetTop ignore transforms.\r\n\r\n       Therefore these values remain correct even\r\n       while cards are visually stacked on Card 01.\r\n       ====================================================== *\/\r\n\r\n    function calculateSpread() {\r\n\r\n\r\n      const firstCard =\r\n        cards[0];\r\n\r\n\r\n      const firstX =\r\n        firstCard.offsetLeft;\r\n\r\n\r\n      const firstY =\r\n        firstCard.offsetTop;\r\n\r\n\r\n\r\n      cards.forEach(\r\n        (card, index) => {\r\n\r\n\r\n          if (index === 0) {\r\n            return;\r\n          }\r\n\r\n\r\n          const destinationX =\r\n            card.offsetLeft;\r\n\r\n\r\n          const destinationY =\r\n            card.offsetTop;\r\n\r\n\r\n          const moveX =\r\n            firstX\r\n            -\r\n            destinationX;\r\n\r\n\r\n          const moveY =\r\n            firstY\r\n            -\r\n            destinationY;\r\n\r\n\r\n          card.style.setProperty(\r\n            '--spread-x',\r\n            `${moveX}px`\r\n          );\r\n\r\n\r\n          card.style.setProperty(\r\n            '--spread-y',\r\n            `${moveY}px`\r\n          );\r\n\r\n        }\r\n      );\r\n\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       CSS TIME \u2192 MILLISECONDS\r\n       ====================================================== *\/\r\n\r\n    function timeToMs(value) {\r\n\r\n\r\n      value =\r\n        value.trim();\r\n\r\n\r\n      if (\r\n        value.endsWith('ms')\r\n      ) {\r\n\r\n        return parseFloat(value);\r\n      }\r\n\r\n\r\n      if (\r\n        value.endsWith('s')\r\n      ) {\r\n\r\n        return (\r\n          parseFloat(value)\r\n          *\r\n          1000\r\n        );\r\n      }\r\n\r\n\r\n      return (\r\n        parseFloat(value)\r\n        ||\r\n        0\r\n      );\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       PREPARE \/ RESET ENTRANCE\r\n\r\n       Called initially and whenever the whole\r\n       section leaves the screen.\r\n       ====================================================== *\/\r\n\r\n    function prepareEntrance() {\r\n\r\n\r\n      clearTimeout(\r\n        completeTimer\r\n      );\r\n\r\n\r\n      if (\r\n        !entranceEnabledForCurrentViewport()\r\n      ) {\r\n\r\n        entrancePlaying =\r\n          false;\r\n\r\n        entranceComplete =\r\n          true;\r\n\r\n        entranceArmed =\r\n          false;\r\n\r\n        grid.classList.remove(\r\n          'psvc-v7-play',\r\n          'psvc-v7-ready'\r\n        );\r\n\r\n        grid.classList.add(\r\n          'psvc-v7-complete'\r\n        );\r\n\r\n        cards.forEach((card) => {\r\n\r\n          card.style.removeProperty(\r\n            '--spread-x'\r\n          );\r\n\r\n          card.style.removeProperty(\r\n            '--spread-y'\r\n          );\r\n\r\n        });\r\n\r\n        updateMobileFocus();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      entrancePlaying =\r\n        false;\r\n\r\n\r\n      entranceComplete =\r\n        false;\r\n\r\n\r\n      \/*\r\n      Remove mobile focus while resetting.\r\n      *\/\r\n\r\n      cards.forEach((card) => {\r\n\r\n        card.classList.remove(\r\n          'psvc-v7-mobile-focus'\r\n        );\r\n\r\n      });\r\n\r\n\r\n\r\n      \/*\r\n      Remove old animation state.\r\n      *\/\r\n\r\n      grid.classList.remove(\r\n        'psvc-v7-play',\r\n        'psvc-v7-complete',\r\n        'psvc-v7-ready'\r\n      );\r\n\r\n\r\n\r\n      \/*\r\n      Calculate real travel distances\r\n      before stacking cards.\r\n      *\/\r\n\r\n      calculateSpread();\r\n\r\n\r\n\r\n      \/*\r\n      Force browser to acknowledge removal\r\n      of the previous animation classes.\r\n\r\n      This is important for replaying the exact\r\n      same keyframes on the next entrance.\r\n      *\/\r\n\r\n      void grid.offsetWidth;\r\n\r\n\r\n\r\n      \/*\r\n      Now stack everything on Card 01.\r\n      *\/\r\n\r\n      grid.classList.add(\r\n        'psvc-v7-ready'\r\n      );\r\n\r\n\r\n      entranceArmed =\r\n        true;\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       PLAY ENTRANCE\r\n       ====================================================== *\/\r\n\r\n    function playEntrance() {\r\n\r\n\r\n      if (\r\n        !entranceEnabledForCurrentViewport()\r\n      ) {\r\n\r\n        entrancePlaying =\r\n          false;\r\n\r\n        entranceComplete =\r\n          true;\r\n\r\n        entranceArmed =\r\n          false;\r\n\r\n        grid.classList.remove(\r\n          'psvc-v7-play',\r\n          'psvc-v7-ready'\r\n        );\r\n\r\n        grid.classList.add(\r\n          'psvc-v7-complete'\r\n        );\r\n\r\n        updateMobileFocus();\r\n\r\n        return;\r\n      }\r\n\r\n\r\n      if (\r\n        !entranceArmed\r\n        ||\r\n        entrancePlaying\r\n      ) {\r\n\r\n        return;\r\n      }\r\n\r\n\r\n\r\n      entranceArmed =\r\n        false;\r\n\r\n\r\n      entrancePlaying =\r\n        true;\r\n\r\n\r\n      entranceComplete =\r\n        false;\r\n\r\n\r\n\r\n      \/*\r\n      Final coordinate check immediately\r\n      before movement.\r\n      *\/\r\n\r\n      calculateSpread();\r\n\r\n\r\n\r\n      \/*\r\n      Force a rendered frame with cards\r\n      stacked on Card 01.\r\n      *\/\r\n\r\n      requestAnimationFrame(\r\n        () => {\r\n\r\n\r\n          requestAnimationFrame(\r\n            () => {\r\n\r\n\r\n              grid.classList.add(\r\n                'psvc-v7-play'\r\n              );\r\n\r\n\r\n            }\r\n          );\r\n\r\n\r\n        }\r\n      );\r\n\r\n\r\n\r\n      const styles =\r\n        getComputedStyle(grid);\r\n\r\n\r\n      const firstDuration =\r\n        timeToMs(\r\n          styles.getPropertyValue(\r\n            '--first-duration'\r\n          )\r\n        );\r\n\r\n\r\n      const pause =\r\n        timeToMs(\r\n          styles.getPropertyValue(\r\n            '--after-first-pause'\r\n          )\r\n        );\r\n\r\n\r\n      const spreadDuration =\r\n        timeToMs(\r\n          styles.getPropertyValue(\r\n            '--spread-duration'\r\n          )\r\n        );\r\n\r\n\r\n      const stagger =\r\n        timeToMs(\r\n          styles.getPropertyValue(\r\n            '--spread-stagger'\r\n          )\r\n        );\r\n\r\n\r\n\r\n      const total =\r\n        firstDuration\r\n        +\r\n        pause\r\n        +\r\n        spreadDuration\r\n        +\r\n        (\r\n          stagger\r\n          *\r\n          Math.max(\r\n            cards.length - 2,\r\n            0\r\n          )\r\n        );\r\n\r\n\r\n\r\n      completeTimer =\r\n        window.setTimeout(\r\n          () => {\r\n\r\n\r\n            entrancePlaying =\r\n              false;\r\n\r\n\r\n            entranceComplete =\r\n              true;\r\n\r\n\r\n\r\n            \/*\r\n            Enable hover \/ mobile focus.\r\n            *\/\r\n\r\n            grid.classList.add(\r\n              'psvc-v7-complete'\r\n            );\r\n\r\n\r\n\r\n            \/*\r\n            Release entrance animation\r\n            properties after it has finished.\r\n            *\/\r\n\r\n            grid.classList.remove(\r\n              'psvc-v7-ready',\r\n              'psvc-v7-play'\r\n            );\r\n\r\n\r\n\r\n            \/*\r\n            Natural card locations now take over.\r\n            *\/\r\n\r\n            cards.forEach((card) => {\r\n\r\n              card.style.removeProperty(\r\n                '--spread-x'\r\n              );\r\n\r\n              card.style.removeProperty(\r\n                '--spread-y'\r\n              );\r\n\r\n            });\r\n\r\n\r\n\r\n            \/*\r\n            Immediately evaluate mobile center\r\n            state after entrance completes.\r\n            *\/\r\n\r\n            updateMobileFocus();\r\n\r\n\r\n          },\r\n\r\n          total + 80\r\n        );\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       READ ENTRANCE TRIGGER\r\n       ====================================================== *\/\r\n\r\n    const initialStyles =\r\n      getComputedStyle(grid);\r\n\r\n\r\n    let entranceTrigger =\r\n      parseFloat(\r\n        initialStyles.getPropertyValue(\r\n          '--entrance-trigger'\r\n        )\r\n      );\r\n\r\n\r\n    if (\r\n      !Number.isFinite(\r\n        entranceTrigger\r\n      )\r\n    ) {\r\n\r\n      entranceTrigger =\r\n        .12;\r\n    }\r\n\r\n\r\n    entranceTrigger =\r\n      Math.min(\r\n        Math.max(\r\n          entranceTrigger,\r\n          .01\r\n        ),\r\n        .95\r\n      );\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       REPEATING VIEWPORT OBSERVER\r\n       ====================================================== *\/\r\n\r\n    const entranceObserver =\r\n      new IntersectionObserver(\r\n\r\n        (entries) => {\r\n\r\n\r\n          entries.forEach(\r\n            (entry) => {\r\n\r\n\r\n              \/*\r\n              =================================================\r\n              SECTION COMPLETELY LEFT VIEWPORT\r\n\r\n              Reset it OFFSCREEN so next time the\r\n              user scrolls back, cards are already\r\n              prepared on top of Card 01.\r\n              =================================================\r\n              *\/\r\n\r\n              if (\r\n                !entry.isIntersecting\r\n              ) {\r\n\r\n\r\n                prepareEntrance();\r\n\r\n\r\n                return;\r\n              }\r\n\r\n\r\n\r\n              \/*\r\n              =================================================\r\n              SECTION HAS ENTERED ENOUGH TO PLAY\r\n              =================================================\r\n              *\/\r\n\r\n              if (\r\n                entry.intersectionRatio\r\n                >=\r\n                entranceTrigger\r\n              ) {\r\n\r\n\r\n                playEntrance();\r\n\r\n              }\r\n\r\n\r\n            }\r\n          );\r\n\r\n\r\n        },\r\n\r\n        {\r\n          threshold: [\r\n            0,\r\n            entranceTrigger\r\n          ]\r\n        }\r\n\r\n      );\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       MOBILE CENTER FOCUS\r\n       ====================================================== *\/\r\n\r\n    function updateMobileFocus() {\r\n\r\n\r\n      \/*\r\n      Desktop + tablet don't use\r\n      automatic center focus.\r\n      *\/\r\n\r\n      if (\r\n        !window.matchMedia(\r\n          '(max-width: 767px)'\r\n        ).matches\r\n      ) {\r\n\r\n\r\n        cards.forEach((card) => {\r\n\r\n          card.classList.remove(\r\n            'psvc-v7-mobile-focus'\r\n          );\r\n\r\n        });\r\n\r\n\r\n        return;\r\n      }\r\n\r\n\r\n\r\n      \/*\r\n      Don't activate center focus while\r\n      entrance is playing\/reset.\r\n      *\/\r\n\r\n      if (\r\n        !entranceComplete\r\n      ) {\r\n\r\n\r\n        cards.forEach((card) => {\r\n\r\n          card.classList.remove(\r\n            'psvc-v7-mobile-focus'\r\n          );\r\n\r\n        });\r\n\r\n\r\n        return;\r\n      }\r\n\r\n\r\n\r\n      const viewportCenter =\r\n        window.innerHeight\r\n        \/\r\n        2;\r\n\r\n\r\n      const styles =\r\n        getComputedStyle(grid);\r\n\r\n\r\n      const rangePercentage =\r\n        parseFloat(\r\n          styles.getPropertyValue(\r\n            '--mobile-focus-range'\r\n          )\r\n        )\r\n        ||\r\n        27;\r\n\r\n\r\n      const allowedDistance =\r\n        window.innerHeight\r\n        *\r\n        (\r\n          rangePercentage\r\n          \/\r\n          100\r\n        );\r\n\r\n\r\n      let closestCard =\r\n        null;\r\n\r\n\r\n      let closestDistance =\r\n        Infinity;\r\n\r\n\r\n\r\n      cards.forEach((card) => {\r\n\r\n\r\n        const rect =\r\n          card.getBoundingClientRect();\r\n\r\n\r\n        const cardCenter =\r\n          rect.top\r\n          +\r\n          (\r\n            rect.height\r\n            \/\r\n            2\r\n          );\r\n\r\n\r\n        const distance =\r\n          Math.abs(\r\n            viewportCenter\r\n            -\r\n            cardCenter\r\n          );\r\n\r\n\r\n        if (\r\n          distance\r\n          <\r\n          closestDistance\r\n        ) {\r\n\r\n\r\n          closestDistance =\r\n            distance;\r\n\r\n\r\n          closestCard =\r\n            card;\r\n\r\n        }\r\n\r\n      });\r\n\r\n\r\n\r\n      cards.forEach((card) => {\r\n\r\n\r\n        const shouldFocus =\r\n          card === closestCard\r\n          &&\r\n          closestDistance\r\n          <=\r\n          allowedDistance;\r\n\r\n\r\n        card.classList.toggle(\r\n          'psvc-v7-mobile-focus',\r\n          shouldFocus\r\n        );\r\n\r\n      });\r\n\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       SCROLL RAF\r\n       ====================================================== *\/\r\n\r\n    function requestMobileUpdate() {\r\n\r\n\r\n      if (mobileRaf) {\r\n        return;\r\n      }\r\n\r\n\r\n      mobileRaf =\r\n        requestAnimationFrame(\r\n          () => {\r\n\r\n\r\n            mobileRaf =\r\n              null;\r\n\r\n\r\n            updateMobileFocus();\r\n\r\n\r\n          }\r\n        );\r\n\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       INITIAL PREPARATION\r\n\r\n       Critical:\r\n       Even when section starts far down the page,\r\n       all cards are prepared offscreen before\r\n       user scrolls to them.\r\n       ====================================================== *\/\r\n\r\n    prepareEntrance();\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       START WATCHING\r\n       ====================================================== *\/\r\n\r\n    entranceObserver.observe(\r\n      grid\r\n    );\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       RESIZE OBSERVER\r\n\r\n       Elementor may settle\/recalculate its\r\n       container width after initial page load.\r\n       ====================================================== *\/\r\n\r\n    if (\r\n      'ResizeObserver'\r\n      in\r\n      window\r\n    ) {\r\n\r\n\r\n      const layoutObserver =\r\n        new ResizeObserver(\r\n          () => {\r\n\r\n\r\n            \/*\r\n            Only rebuild spread coordinates if\r\n            we're waiting for the next entrance.\r\n            *\/\r\n\r\n            if (\r\n              entranceArmed\r\n              &&\r\n              !entrancePlaying\r\n            ) {\r\n\r\n\r\n              calculateSpread();\r\n\r\n            }\r\n\r\n\r\n            updateMobileFocus();\r\n\r\n\r\n          }\r\n        );\r\n\r\n\r\n      layoutObserver.observe(\r\n        grid\r\n      );\r\n\r\n    }\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       WINDOW SCROLL\r\n       ====================================================== *\/\r\n\r\n    window.addEventListener(\r\n      'scroll',\r\n      requestMobileUpdate,\r\n      {\r\n        passive:\r\n          true\r\n      }\r\n    );\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       WINDOW RESIZE\r\n       ====================================================== *\/\r\n\r\n    window.addEventListener(\r\n      'resize',\r\n      () => {\r\n\r\n\r\n        clearTimeout(\r\n          resizeTimer\r\n        );\r\n\r\n\r\n        resizeTimer =\r\n          setTimeout(\r\n            () => {\r\n\r\n\r\n              if (\r\n                !entranceEnabledForCurrentViewport()\r\n              ) {\r\n\r\n                prepareEntrance();\r\n\r\n                updateMobileFocus();\r\n\r\n                return;\r\n              }\r\n\r\n\r\n              if (\r\n                entranceArmed\r\n                &&\r\n                !entrancePlaying\r\n              ) {\r\n\r\n\r\n                calculateSpread();\r\n\r\n              }\r\n\r\n\r\n              updateMobileFocus();\r\n\r\n\r\n            },\r\n\r\n            100\r\n          );\r\n\r\n      }\r\n    );\r\n\r\n\r\n\r\n    \/* ======================================================\r\n       PAGE LOAD RECALCULATION\r\n       ====================================================== *\/\r\n\r\n    window.addEventListener(\r\n      'load',\r\n      () => {\r\n\r\n\r\n        if (\r\n          entranceArmed\r\n          &&\r\n          !entrancePlaying\r\n        ) {\r\n\r\n\r\n          calculateSpread();\r\n\r\n        }\r\n\r\n\r\n        updateMobileFocus();\r\n\r\n\r\n      }\r\n    );\r\n\r\n\r\n  });\r\n\r\n\r\n})();\r\n\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-a286ccf e-con e-atomic-element e-flexbox-base e-a286ccf-0050c75 \" data-id=\"a286ccf\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"a286ccf\" data-e-type=\"e-flexbox\" data-id=\"a286ccf\">\n    <div class=\"elementor-element elementor-element-1f61a6f e-flex e-con-boxed e-con e-parent\" data-id=\"1f61a6f\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0098c46 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"0098c46\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Make Your Place<br> <span class=\"animated-guesswork\">Easier To Choose.<\/span><\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6526ae6 elementor-invisible elementor-widget elementor-widget-heading\" data-id=\"6526ae6\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:200}\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Your location deserves to be seen, trusted, and chosen.<br>\nPanoSky, we make spaces come alive.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6613c72 elementor-invisible elementor-widget elementor-widget-html\" data-id=\"6613c72\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:400}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<svg class=\"ps-google-partner-svg\" id=\"Layer_2\" data-name=\"Layer 2\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 961.8 128.35\" preserveAspectRatio=\"xMidYMid meet\" role=\"img\" aria-label=\"Google Maps Content Partner\">\r\n  <defs>\r\n    <style>\r\n      \/* ==========================================================\r\n         SIZE CONTROLS \u2014 change only these three width values.\r\n         The height is calculated automatically from the SVG ratio.\r\n         ========================================================== *\/\r\n      .ps-google-partner-svg {\r\n        --ps-svg-width-desktop: 260px;\r\n        --ps-svg-width-tablet: 250px;\r\n        --ps-svg-width-mobile: 250px;\r\n\r\n        display: block;\r\n        width: var(--ps-svg-width-desktop);\r\n        max-width: 100%;\r\n        height: auto;\r\n        overflow: visible;\r\n      }\r\n\r\n      @media (max-width: 1024px) {\r\n        .ps-google-partner-svg {\r\n          width: var(--ps-svg-width-tablet);\r\n        }\r\n      }\r\n\r\n      @media (max-width: 767px) {\r\n        .ps-google-partner-svg {\r\n          width: var(--ps-svg-width-mobile);\r\n        }\r\n      }\r\n\r\n      .cls-1 {\r\n        fill: none;\r\n      }\r\n\r\n      .cls-2 {\r\n        fill: #4285f4;\r\n      }\r\n\r\n      .cls-3 {\r\n        fill: #757575;\r\n      }\r\n\r\n      .cls-4 {\r\n        fill: #1a73e8;\r\n      }\r\n\r\n      .cls-5 {\r\n        fill: #34a853;\r\n      }\r\n\r\n      .cls-6 {\r\n        fill: #fbbc04;\r\n      }\r\n\r\n      .cls-7 {\r\n        fill: #ea4335;\r\n      }\r\n    <\/style>\r\n  <\/defs>\r\n  <g id=\"Art\">\r\n    <g>\r\n      <path class=\"cls-2\" d=\"M132.45,93.27c-6.99,0-13.01-2.48-18.07-7.43-5.06-4.95-7.58-10.9-7.58-17.85s2.53-12.9,7.58-17.85c5.06-4.95,11.08-7.43,18.07-7.43s12.47,2.32,17.33,6.97l-4.87,4.87c-3.49-3.29-7.65-4.93-12.45-4.93-5.06,0-9.34,1.79-12.85,5.36-3.51,3.58-5.27,7.91-5.27,13.01s1.76,9.43,5.27,13.01c3.51,3.58,7.8,5.36,12.85,5.36s9.39-1.69,12.76-5.06c2.01-2.01,3.27-4.91,3.76-8.69h-16.52v-6.91h23.24c.25,1.23.37,2.67.37,4.32,0,6.78-1.99,12.17-5.98,16.15-4.52,4.73-10.4,7.09-17.63,7.09Z\"\/>\r\n      <path class=\"cls-7\" d=\"M186.46,88.62c-3.17,3.1-7.03,4.66-11.59,4.66s-8.43-1.55-11.59-4.66c-3.17-3.1-4.75-6.98-4.75-11.62s1.58-8.52,4.75-11.62c3.16-3.1,7.03-4.65,11.59-4.65s8.43,1.55,11.59,4.65c3.16,3.1,4.75,6.98,4.75,11.62s-1.58,8.52-4.75,11.62ZM168.39,84.05c1.81,1.87,3.97,2.8,6.47,2.8s4.66-.93,6.47-2.8c1.81-1.87,2.71-4.22,2.71-7.06s-.89-5.24-2.68-7.09c-1.79-1.85-3.96-2.77-6.5-2.77s-4.72.92-6.5,2.77c-1.79,1.85-2.68,4.21-2.68,7.09s.9,5.19,2.71,7.06Z\"\/>\r\n      <path class=\"cls-6\" d=\"M222.1,88.62c-3.17,3.1-7.03,4.66-11.59,4.66s-8.43-1.55-11.59-4.66c-3.17-3.1-4.75-6.98-4.75-11.62s1.58-8.52,4.75-11.62c3.16-3.1,7.03-4.65,11.59-4.65s8.43,1.55,11.59,4.65c3.16,3.1,4.75,6.98,4.75,11.62s-1.58,8.52-4.75,11.62ZM204.03,84.05c1.81,1.87,3.97,2.8,6.47,2.8s4.66-.93,6.47-2.8c1.81-1.87,2.71-4.22,2.71-7.06s-.89-5.24-2.68-7.09c-1.79-1.85-3.96-2.77-6.5-2.77s-4.72.92-6.5,2.77c-1.79,1.85-2.68,4.21-2.68,7.09s.9,5.19,2.71,7.06Z\"\/>\r\n      <path class=\"cls-2\" d=\"M245.52,107.88c-3.62,0-6.66-.97-9.13-2.9-2.47-1.93-4.23-4.17-5.3-6.72l6.23-2.59c.66,1.56,1.69,2.92,3.08,4.07,1.4,1.15,3.1,1.73,5.12,1.73,2.71,0,4.84-.82,6.38-2.47,1.54-1.64,2.31-4.01,2.31-7.09v-2.34h-.25c-2.01,2.47-4.87,3.7-8.57,3.7-4.15,0-7.79-1.58-10.91-4.75-3.12-3.16-4.69-6.99-4.69-11.47s1.56-8.37,4.69-11.56c3.12-3.18,6.76-4.78,10.91-4.78,1.85,0,3.52.35,5.02,1.05,1.5.7,2.68,1.56,3.55,2.59h.25v-2.65h6.78v29.22c0,5.67-1.45,9.92-4.35,12.73-2.9,2.82-6.61,4.22-11.13,4.22ZM246.02,86.86c2.47,0,4.53-.93,6.2-2.8,1.66-1.87,2.5-4.2,2.5-7s-.83-5.2-2.5-7.09c-1.66-1.89-3.73-2.84-6.2-2.84s-4.65.95-6.41,2.84c-1.77,1.89-2.65,4.25-2.65,7.09s.88,5.13,2.65,7c1.77,1.87,3.9,2.8,6.41,2.8Z\"\/>\r\n      <path class=\"cls-5\" d=\"M273.08,44.44v47.84h-7.15v-47.84h7.15Z\"\/>\r\n      <path class=\"cls-7\" d=\"M292.69,93.27c-4.6,0-8.45-1.56-11.53-4.69-3.08-3.12-4.62-6.99-4.62-11.59s1.49-8.67,4.47-11.71c2.98-3.04,6.61-4.56,10.88-4.56,1.97,0,3.8.36,5.49,1.08,1.69.72,3.08,1.64,4.19,2.77,1.11,1.13,1.99,2.23,2.65,3.3.66,1.07,1.19,2.14,1.6,3.21l.74,1.85-21.76,9c1.69,3.29,4.32,4.93,7.89,4.93,3.29,0,5.96-1.5,8.02-4.5l5.55,3.7c-1.23,1.85-2.98,3.51-5.24,4.99-2.26,1.48-5.04,2.22-8.32,2.22ZM283.63,76.5l14.55-6.04c-.41-1.03-1.17-1.86-2.28-2.5-1.11-.64-2.36-.96-3.76-.96-2.1,0-4.06.86-5.89,2.59-1.83,1.73-2.7,4.03-2.62,6.91Z\"\/>\r\n      <g>\r\n        <path class=\"cls-4\" d=\"M62.26,25.47c-2.79-.88-5.75-1.36-8.83-1.36-8.99,0-17.03,4.06-22.39,10.44l13.81,11.62,17.41-20.7Z\"\/>\r\n        <path class=\"cls-7\" d=\"M31.04,34.54c-4.27,5.08-6.85,11.64-6.85,18.8,0,5.5,1.1,9.96,2.89,13.95l17.77-21.12-13.81-11.62Z\"\/>\r\n        <path class=\"cls-2\" d=\"M53.43,42.16c6.18,0,11.18,5.01,11.18,11.18,0,2.75-.99,5.27-2.64,7.22,0,0,8.84-10.51,17.41-20.69-3.54-6.81-9.68-12.05-17.11-14.4l-17.41,20.7c2.05-2.45,5.13-4,8.58-4\"\/>\r\n        <path class=\"cls-6\" d=\"M53.43,64.52c-6.18,0-11.18-5.01-11.18-11.18,0-2.73.98-5.24,2.61-7.18l-17.77,21.12c3.04,6.74,8.09,12.14,13.29,18.95l21.6-25.68c-2.05,2.42-5.12,3.96-8.54,3.96\"\/>\r\n        <path class=\"cls-5\" d=\"M61.54,93.25c9.76-15.25,21.13-22.18,21.13-39.91,0-4.86-1.19-9.44-3.29-13.47l-39.01,46.37c1.65,2.17,3.32,4.47,4.95,7.01,5.93,9.16,4.29,14.66,8.11,14.66s2.18-5.5,8.11-14.66\"\/>\r\n      <\/g>\r\n      <g>\r\n        <path class=\"cls-2\" d=\"M330.11,93.11h-5.52v-44.25h5.52l14.94,26.95h.24l14.94-26.95h5.52v44.25h-5.52v-26.26l.24-7.42h-.24l-13.44,24.29h-3.24l-13.44-24.29h-.24l.24,7.42v26.26Z\"\/>\r\n        <path class=\"cls-7\" d=\"M384.89,61.84c4.08,0,7.3,1.12,9.66,3.37,2.36,2.25,3.54,5.33,3.54,9.24v18.66h-5.28v-4.2h-.24c-2.28,3.46-5.32,5.19-9.12,5.19-3.24,0-5.95-.99-8.13-2.97-2.18-1.98-3.27-4.45-3.27-7.42,0-3.13,1.15-5.62,3.45-7.48,2.3-1.85,5.37-2.78,9.21-2.78,3.28,0,5.98.62,8.1,1.85v-1.3c0-1.98-.76-3.66-2.28-5.04-1.52-1.38-3.3-2.07-5.34-2.07-3.08,0-5.52,1.34-7.32,4.02l-4.86-3.15c2.68-3.96,6.64-5.93,11.88-5.93ZM377.75,83.84c0,1.48.61,2.72,1.83,3.71,1.22.99,2.65,1.48,4.29,1.48,2.32,0,4.39-.88,6.21-2.66,1.82-1.77,2.73-3.85,2.73-6.24-1.72-1.4-4.12-2.1-7.2-2.1-2.24,0-4.11.56-5.61,1.67-1.5,1.11-2.25,2.49-2.25,4.14Z\"\/>\r\n        <path class=\"cls-6\" d=\"M420.83,94.1c-2.16,0-4.13-.47-5.91-1.42-1.78-.95-3.15-2.2-4.11-3.77h-.24l.24,4.2v13.35h-5.52v-43.63h5.28v4.2h.24c.96-1.56,2.33-2.82,4.11-3.77,1.78-.95,3.75-1.42,5.91-1.42,3.88,0,7.16,1.57,9.84,4.7,2.76,3.17,4.14,6.98,4.14,11.43s-1.38,8.3-4.14,11.43c-2.68,3.13-5.96,4.7-9.84,4.7ZM419.93,88.91c2.64,0,4.86-1.03,6.66-3.09,1.8-2.02,2.7-4.64,2.7-7.85s-.9-5.79-2.7-7.85c-1.8-2.06-4.02-3.09-6.66-3.09s-4.92,1.03-6.72,3.09c-1.76,2.06-2.64,4.68-2.64,7.85s.88,5.85,2.64,7.91c1.8,2.02,4.04,3.03,6.72,3.03Z\"\/>\r\n        <path class=\"cls-5\" d=\"M463.25,84.71c0,2.64-1.12,4.86-3.36,6.67-2.24,1.81-5.06,2.72-8.46,2.72-2.96,0-5.56-.79-7.8-2.38-2.24-1.58-3.84-3.68-4.8-6.27l4.92-2.16c.72,1.81,1.77,3.22,3.15,4.23,1.38,1.01,2.89,1.51,4.53,1.51,1.76,0,3.23-.39,4.41-1.17,1.18-.78,1.77-1.71,1.77-2.78,0-1.94-1.44-3.36-4.32-4.26l-5.04-1.3c-5.72-1.48-8.58-4.33-8.58-8.53,0-2.76,1.09-4.98,3.27-6.64,2.18-1.67,4.97-2.5,8.37-2.5,2.6,0,4.95.64,7.05,1.92,2.1,1.28,3.57,2.99,4.41,5.13l-4.92,2.1c-.56-1.28-1.47-2.28-2.73-3-1.26-.72-2.67-1.08-4.23-1.08-1.44,0-2.73.37-3.87,1.11-1.14.74-1.71,1.65-1.71,2.72,0,1.73,1.58,2.97,4.74,3.71l4.44,1.17c5.84,1.48,8.76,4.51,8.76,9.08Z\"\/>\r\n        <path class=\"cls-3\" d=\"M503.63,94.1c-6.36,0-11.68-2.2-15.96-6.61-4.24-4.41-6.36-9.91-6.36-16.5s2.12-12.07,6.36-16.44c4.24-4.45,9.56-6.67,15.96-6.67s11.74,2.41,15.78,7.23l-3.96,3.96c-3.08-3.83-7.02-5.75-11.82-5.75s-8.74,1.65-11.94,4.94c-3.16,3.26-4.74,7.5-4.74,12.73s1.58,9.48,4.74,12.73c3.2,3.3,7.18,4.94,11.94,4.94,5,0,9.34-2.16,13.02-6.49l4.02,4.02c-2.04,2.51-4.54,4.46-7.5,5.84-2.96,1.38-6.14,2.07-9.54,2.07Z\"\/>\r\n        <path class=\"cls-3\" d=\"M524.51,77.97c0-4.66,1.42-8.51,4.26-11.56,2.88-3.05,6.5-4.57,10.86-4.57s7.96,1.52,10.8,4.57c2.88,3.05,4.32,6.9,4.32,11.56s-1.44,8.55-4.32,11.56c-2.84,3.05-6.44,4.57-10.8,4.57s-7.98-1.52-10.86-4.57c-2.84-3.05-4.26-6.9-4.26-11.56ZM530.03,77.97c0,3.25.92,5.89,2.76,7.91,1.84,2.02,4.12,3.03,6.84,3.03s5-1.01,6.84-3.03c1.84-2.02,2.76-4.66,2.76-7.91s-.92-5.83-2.76-7.85c-1.88-2.06-4.16-3.09-6.84-3.09s-4.96,1.03-6.84,3.09c-1.84,2.02-2.76,4.63-2.76,7.85Z\"\/>\r\n        <path class=\"cls-3\" d=\"M560.39,62.83h5.28v4.2h.24c.84-1.48,2.13-2.72,3.87-3.71,1.74-.99,3.55-1.48,5.43-1.48,3.6,0,6.37,1.06,8.31,3.18,1.94,2.12,2.91,5.14,2.91,9.05v19.03h-5.52v-18.66c-.12-4.94-2.54-7.42-7.26-7.42-2.2,0-4.04.92-5.52,2.75-1.48,1.83-2.22,4.03-2.22,6.58v16.75h-5.52v-30.28Z\"\/>\r\n        <path class=\"cls-3\" d=\"M604.25,93.61c-2.4,0-4.39-.76-5.97-2.29-1.58-1.52-2.39-3.65-2.43-6.37v-16.93h-5.16v-5.19h5.16v-9.27h5.52v9.27h7.2v5.19h-7.2v15.08c0,2.02.38,3.39,1.14,4.11.76.72,1.62,1.08,2.58,1.08.44,0,.87-.05,1.29-.15.42-.1.81-.24,1.17-.4l1.74,5.07c-1.44.53-3.12.8-5.04.8Z\"\/>\r\n        <path class=\"cls-3\" d=\"M627.95,94.1c-4.32,0-7.88-1.52-10.68-4.57-2.8-3.05-4.2-6.9-4.2-11.56s1.36-8.46,4.08-11.53c2.72-3.07,6.2-4.6,10.44-4.6s7.83,1.45,10.41,4.36,3.87,6.97,3.87,12.21l-.06.62h-23.1c.08,2.97,1.04,5.36,2.88,7.17,1.84,1.81,4.04,2.72,6.6,2.72,3.52,0,6.28-1.81,8.28-5.44l4.92,2.47c-1.32,2.56-3.15,4.55-5.49,6-2.34,1.44-4.99,2.16-7.95,2.16ZM619.13,74.33h16.86c-.16-2.1-.99-3.84-2.49-5.22-1.5-1.38-3.51-2.07-6.03-2.07-2.08,0-3.87.66-5.37,1.98s-2.49,3.09-2.97,5.31Z\"\/>\r\n        <path class=\"cls-3\" d=\"M648.11,62.83h5.28v4.2h.24c.84-1.48,2.13-2.72,3.87-3.71,1.74-.99,3.55-1.48,5.43-1.48,3.6,0,6.37,1.06,8.31,3.18,1.94,2.12,2.91,5.14,2.91,9.05v19.03h-5.52v-18.66c-.12-4.94-2.54-7.42-7.26-7.42-2.2,0-4.04.92-5.52,2.75-1.48,1.83-2.22,4.03-2.22,6.58v16.75h-5.52v-30.28Z\"\/>\r\n        <path class=\"cls-3\" d=\"M691.97,93.61c-2.4,0-4.39-.76-5.97-2.29-1.58-1.52-2.39-3.65-2.43-6.37v-16.93h-5.16v-5.19h5.16v-9.27h5.52v9.27h7.2v5.19h-7.2v15.08c0,2.02.38,3.39,1.14,4.11.76.72,1.62,1.08,2.58,1.08.44,0,.87-.05,1.29-.15.42-.1.81-.24,1.17-.4l1.74,5.07c-1.44.53-3.12.8-5.04.8Z\"\/>\r\n        <path class=\"cls-3\" d=\"M723.65,75.19v17.92h-5.52v-44.25h14.64c3.72,0,6.88,1.28,9.48,3.83,2.64,2.55,3.96,5.67,3.96,9.33s-1.32,6.88-3.96,9.39c-2.56,2.51-5.72,3.77-9.48,3.77h-9.12ZM723.65,54.3v15.45h9.24c2.2,0,4.02-.76,5.46-2.29,1.48-1.52,2.22-3.34,2.22-5.44s-.74-3.85-2.22-5.38c-1.44-1.57-3.26-2.35-5.46-2.35h-9.24Z\"\/>\r\n        <path class=\"cls-3\" d=\"M762.17,61.84c4.08,0,7.3,1.12,9.66,3.37,2.36,2.25,3.54,5.33,3.54,9.24v18.66h-5.28v-4.2h-.24c-2.28,3.46-5.32,5.19-9.12,5.19-3.24,0-5.95-.99-8.13-2.97-2.18-1.98-3.27-4.45-3.27-7.42,0-3.13,1.15-5.62,3.45-7.48,2.3-1.85,5.37-2.78,9.21-2.78,3.28,0,5.98.62,8.1,1.85v-1.3c0-1.98-.76-3.66-2.28-5.04-1.52-1.38-3.3-2.07-5.34-2.07-3.08,0-5.52,1.34-7.32,4.02l-4.86-3.15c2.68-3.96,6.64-5.93,11.88-5.93ZM755.03,83.84c0,1.48.61,2.72,1.83,3.71,1.22.99,2.65,1.48,4.29,1.48,2.32,0,4.39-.88,6.21-2.66,1.82-1.77,2.73-3.85,2.73-6.24-1.72-1.4-4.12-2.1-7.2-2.1-2.24,0-4.11.56-5.61,1.67-1.5,1.11-2.25,2.49-2.25,4.14Z\"\/>\r\n        <path class=\"cls-3\" d=\"M782.81,62.83h5.28v4.94h.24c1.64-3.87,5.02-5.81,10.14-5.81l1.14.12v5.93l-2.46-.25c-2.56,0-4.67.81-6.33,2.44-1.66,1.63-2.49,3.7-2.49,6.21v16.69h-5.52v-30.28ZM817.25,93.61c-2.4,0-4.39-.76-5.97-2.29-1.58-1.52-2.39-3.65-2.43-6.37v-16.93h-5.16v-5.19h5.16v-9.27h5.52v9.27h7.2v5.19h-7.2v15.08c0,2.02.38,3.39,1.14,4.11.76.72,1.62,1.08,2.58,1.08.44,0,.87-.05,1.29-.15.42-.1.81-.24,1.17-.4l1.74,5.07c-1.44.53-3.12.8-5.04.8Z\"\/>\r\n        <path class=\"cls-3\" d=\"M828.35,62.83h5.28v4.2h.24c.84-1.48,2.13-2.72,3.87-3.71,1.74-.99,3.55-1.48,5.43-1.48,3.6,0,6.37,1.06,8.31,3.18,1.94,2.12,2.91,5.14,2.91,9.05v19.03h-5.52v-18.66c-.12-4.94-2.54-7.42-7.26-7.42-2.2,0-4.04.92-5.52,2.75-1.48,1.83-2.22,4.03-2.22,6.58v16.75h-5.52v-30.28Z\"\/>\r\n        <path class=\"cls-3\" d=\"M875.27,94.1c-4.32,0-7.88-1.52-10.68-4.57-2.8-3.05-4.2-6.9-4.2-11.56s1.36-8.46,4.08-11.53c2.72-3.07,6.2-4.6,10.44-4.6s7.83,1.45,10.41,4.36,3.87,6.97,3.87,12.21l-.06.62h-23.1c.08,2.97,1.04,5.36,2.88,7.17,1.84,1.81,4.04,2.72,6.6,2.72,3.52,0,6.28-1.81,8.28-5.44l4.92,2.47c-1.32,2.56-3.15,4.55-5.49,6-2.34,1.44-4.99,2.16-7.95,2.16ZM866.45,74.33h16.86c-.16-2.1-.99-3.84-2.49-5.22-1.5-1.38-3.51-2.07-6.03-2.07-2.08,0-3.87.66-5.37,1.98s-2.49,3.09-2.97,5.31Z\"\/>\r\n        <path class=\"cls-3\" d=\"M900.94,93.11h-5.52v-30.28h5.28v4.94h.24c.56-1.61,1.71-2.98,3.45-4.11,1.74-1.13,3.45-1.7,5.13-1.7s2.96.25,4.08.74l-1.68,5.5c-.68-.29-1.76-.43-3.24-.43-2.08,0-3.89.87-5.43,2.6-1.54,1.73-2.31,3.75-2.31,6.06v16.69Z\"\/>\r\n        <path class=\"cls-3\" d=\"M939.7,84.71c0,2.64-1.12,4.86-3.36,6.67-2.24,1.81-5.06,2.72-8.46,2.72-2.96,0-5.56-.79-7.8-2.38-2.24-1.58-3.84-3.68-4.8-6.27l4.92-2.16c.72,1.81,1.77,3.22,3.15,4.23,1.38,1.01,2.89,1.51,4.53,1.51,1.76,0,3.23-.39,4.41-1.17,1.18-.78,1.77-1.71,1.77-2.78,0-1.94-1.44-3.36-4.32-4.26l-5.04-1.3c-5.72-1.48-8.58-4.33-8.58-8.53,0-2.76,1.09-4.98,3.27-6.64,2.18-1.67,4.97-2.5,8.37-2.5,2.6,0,4.95.64,7.05,1.92,2.1,1.28,3.57,2.99,4.41,5.13l-4.92,2.1c-.56-1.28-1.47-2.28-2.73-3-1.26-.72-2.67-1.08-4.23-1.08-1.44,0-2.73.37-3.87,1.11-1.14.74-1.71,1.65-1.71,2.72,0,1.73,1.58,2.97,4.74,3.71l4.44,1.17c5.84,1.48,8.76,4.51,8.76,9.08Z\"\/>\r\n      <\/g>\r\n    <\/g>\r\n    <rect class=\"cls-1\" width=\"961.8\" height=\"128.35\"\/>\r\n  <\/g>\r\n<\/svg>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f41cdab elementor-align-center elementor-invisible elementor-widget elementor-widget-button\" data-id=\"f41cdab\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_animation&quot;:&quot;fadeInUp&quot;,&quot;_animation_delay&quot;:600}\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Schedule a Consultation<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-59e1d6b elementor-view-default elementor-position-block-start elementor-mobile-position-block-start elementor-widget elementor-widget-icon-box\" data-id=\"59e1d6b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-box.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-box-wrapper\">\n\n\t\t\t\t\t\t<div class=\"elementor-icon-box-icon\">\n\t\t\t\t<span  class=\"elementor-icon\">\n\t\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" data-name=\"map pin\" viewBox=\"0 0 105.93 122.88\"><defs><linearGradient id=\"iconGradient\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\"><stop offset=\"0%\" stop-color=\"#008BFF\"><\/stop><stop offset=\"100%\" stop-color=\"#50f5FF\"><\/stop><\/linearGradient><\/defs><style type=\"text\/css\">    path, g { fill: url(#iconGradient); fill-rule:evenodd; }  <\/style><path d=\"M56.92,73.14a1.62,1.62,0,0,1-1.86.06A65.25,65.25,0,0,1,38.92,58.8,51.29,51.29,0,0,1,28.06,35.37C26.77,27.38,28,19.7,32,13.45a27,27,0,0,1,6-6.66A29.23,29.23,0,0,1,56.36,0,26,26,0,0,1,73.82,7.12a26,26,0,0,1,4.66,5.68c4.27,7,5.19,16,3.31,25.12A55.29,55.29,0,0,1,56.92,73.14Zm-19,.74V101.7l30.15,13V78.87a65.17,65.17,0,0,0,6.45-5.63v41.18l25-12.59v-56l-9.61,3.7a61.61,61.61,0,0,0,2.38-7.81l9.3-3.59A3.22,3.22,0,0,1,105.7,40a3.18,3.18,0,0,1,.22,1.16v62.7a3.23,3.23,0,0,1-2,3L72.72,122.53a3.23,3.23,0,0,1-2.92,0l-35-15.17L4.68,122.53a3.22,3.22,0,0,1-4.33-1.42A3.28,3.28,0,0,1,0,119.66V53.24a3.23,3.23,0,0,1,2.32-3.1L18.7,43.82a58.63,58.63,0,0,0,2.16,6.07L6.46,55.44v59l25-12.59V67.09a76.28,76.28,0,0,0,6.46,6.79ZM55.15,14.21A13.72,13.72,0,1,1,41.43,27.93,13.72,13.72,0,0,1,55.15,14.21Z\"><\/path><\/svg>\t\t\t\t<\/span>\n\t\t\t<\/div>\n\t\t\t\n\t\t\t\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>THE VALUE Turn SpacialExperience intoMeasuarable Revenue. Shorten sales cycles. Build buyer confidence.Create value across every channel. &bull; TRUST &bull; CONFIDENCE Loading 360\u00b0 N E S W London Client Singapore Your Space 01 Close Sight-Unseen Booking Faster Immersive spatial tours let clients explore every detail remotely &#8211; reducing uncertainty and accelerating decisions. 02 Turn Attention Into [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1309","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>The Value - PanoSky Systems<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/panosky.com\/?page_id=1309\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"The Value - PanoSky Systems\" \/>\n<meta property=\"og:description\" content=\"THE VALUE Turn SpacialExperience intoMeasuarable Revenue. Shorten sales cycles. Build buyer confidence.Create value across every channel. &bull; TRUST &bull; CONFIDENCE Loading 360\u00b0 N E S W London Client Singapore Your Space 01 Close Sight-Unseen Booking Faster Immersive spatial tours let clients explore every detail remotely &#8211; reducing uncertainty and accelerating decisions. 02 Turn Attention Into [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/panosky.com\/?page_id=1309\" \/>\n<meta property=\"og:site_name\" content=\"PanoSky Systems\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-25T08:29:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"51 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/panosky.com\\\/?page_id=1309\",\"url\":\"https:\\\/\\\/panosky.com\\\/?page_id=1309\",\"name\":\"The Value - PanoSky Systems\",\"isPartOf\":{\"@id\":\"http:\\\/\\\/beepano.com\\\/#website\"},\"datePublished\":\"2026-07-22T06:03:44+00:00\",\"dateModified\":\"2026-08-25T08:29:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/panosky.com\\\/?page_id=1309#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/panosky.com\\\/?page_id=1309\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/panosky.com\\\/?page_id=1309#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/panosky.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"The Value\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\\\/\\\/beepano.com\\\/#website\",\"url\":\"http:\\\/\\\/beepano.com\\\/\",\"name\":\"PanoSky Systems\",\"description\":\"\",\"publisher\":{\"@id\":\"http:\\\/\\\/beepano.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\\\/\\\/beepano.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"http:\\\/\\\/beepano.com\\\/#organization\",\"name\":\"PanoSky Systems\",\"url\":\"http:\\\/\\\/beepano.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/beepano.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/panosky.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/PanoSky-Logo-for-website-temp-01-1.png\",\"contentUrl\":\"https:\\\/\\\/panosky.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/PanoSky-Logo-for-website-temp-01-1.png\",\"width\":1024,\"height\":221,\"caption\":\"PanoSky Systems\"},\"image\":{\"@id\":\"http:\\\/\\\/beepano.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"The Value - PanoSky Systems","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/panosky.com\/?page_id=1309","og_locale":"en_US","og_type":"article","og_title":"The Value - PanoSky Systems","og_description":"THE VALUE Turn SpacialExperience intoMeasuarable Revenue. Shorten sales cycles. Build buyer confidence.Create value across every channel. &bull; TRUST &bull; CONFIDENCE Loading 360\u00b0 N E S W London Client Singapore Your Space 01 Close Sight-Unseen Booking Faster Immersive spatial tours let clients explore every detail remotely &#8211; reducing uncertainty and accelerating decisions. 02 Turn Attention Into [&hellip;]","og_url":"https:\/\/panosky.com\/?page_id=1309","og_site_name":"PanoSky Systems","article_modified_time":"2026-08-25T08:29:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"51 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/panosky.com\/?page_id=1309","url":"https:\/\/panosky.com\/?page_id=1309","name":"The Value - PanoSky Systems","isPartOf":{"@id":"http:\/\/beepano.com\/#website"},"datePublished":"2026-07-22T06:03:44+00:00","dateModified":"2026-08-25T08:29:39+00:00","breadcrumb":{"@id":"https:\/\/panosky.com\/?page_id=1309#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/panosky.com\/?page_id=1309"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/panosky.com\/?page_id=1309#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/panosky.com\/"},{"@type":"ListItem","position":2,"name":"The Value"}]},{"@type":"WebSite","@id":"http:\/\/beepano.com\/#website","url":"http:\/\/beepano.com\/","name":"PanoSky Systems","description":"","publisher":{"@id":"http:\/\/beepano.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/beepano.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"http:\/\/beepano.com\/#organization","name":"PanoSky Systems","url":"http:\/\/beepano.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/beepano.com\/#\/schema\/logo\/image\/","url":"https:\/\/panosky.com\/wp-content\/uploads\/2026\/07\/PanoSky-Logo-for-website-temp-01-1.png","contentUrl":"https:\/\/panosky.com\/wp-content\/uploads\/2026\/07\/PanoSky-Logo-for-website-temp-01-1.png","width":1024,"height":221,"caption":"PanoSky Systems"},"image":{"@id":"http:\/\/beepano.com\/#\/schema\/logo\/image\/"}}]}},"brizy_media":[],"_links":{"self":[{"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/pages\/1309","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/panosky.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1309"}],"version-history":[{"count":5,"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/pages\/1309\/revisions"}],"predecessor-version":[{"id":2931,"href":"https:\/\/panosky.com\/index.php?rest_route=\/wp\/v2\/pages\/1309\/revisions\/2931"}],"wp:attachment":[{"href":"https:\/\/panosky.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}