PageSourceSearch

https://spindepth.com/_next/static/chunks/app/(public)/layout-d9fefd0f5172da8a.js

js spindepth.com collected 2026-10-04 05:17:39 UTC 83,929 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1816,5808],{9998:(e,n,t)=>{"use strict";t.d(n,{default:()=>Q});var a=t(95155),s=t(20063),i=t(12115),o=t(52619),r=t.n(o),l=t(69740),d=t(47605),c=t(25038),p=t(22144),h=t(44980);let m=[{to:"/services",label:"Services",panel:!0},{to:"/news",label:"News",panel:!1},{to:"/careers",label:"Careers",panel:!1},{to:"/contact",label:"Contact",panel:!1}],u="cubic-bezier(0.22, 1, 0.36, 1)",f=new Set(["/services/celebrities"]),g="#0B7F66";function b(){let e=(0,s.usePathname)()||"/",[n,t]=(0,i.useState)(!1),[o,b]=(0,i.useState)(!1),[x,y]=(0,i.useState)(!0),w=(0,i.useRef)(null),v=(0,i.useRef)(null),k=(0,i.useRef)(null),j=(0,i.useRef)(null);(0,i.useEffect)(()=>{t(!1),b(!1)},[e]),(0,i.useEffect)(()=>{y(window.scrollY<70)},[]),(0,i.useEffect)(()=>{let e=!1,n=!0,t=()=>{e||(e=!0,requestAnimationFrame(()=>{let t=window.scrollY,a=n?t<46:t<18;a!==n&&(n=a,y(a)),e=!1}))};return window.addEventListener("scroll",t,{passive:!0}),t(),()=>window.removeEventListener("scroll",t)},[]),(0,i.useEffect)(()=>{let e=w.current;e&&(n?(e.style.display="flex",d.os.fromTo(e,{opacity:0},{opacity:1,duration:.38,ease:"power2.out"}),d.os.fromTo(e.querySelectorAll("[data-menu-item]"),{opacity:0,y:22},{opacity:1,y:0,duration:.6,stagger:.045,delay:.08,ease:"power3.out"}),document.body.style.overflow="hidden"):(d.os.to(e,{opacity:0,duration:.28,ease:"power2.in",onComplete:()=>{e&&(e.style.display="none")}}),document.body.style.overflow=""))},[n]),(0,i.useEffect)(()=>()=>{document.body.style.overflow=""},[]),(0,i.useEffect)(()=>{let e=e=>{"Escape"===e.key&&(o?b(!1):n&&t(!1))},a=e=>{var n,t;!(!o||(null==(n=k.current)?void 0:n.contains(e.target)))&&(null!=(t=v.current)&&t.contains(e.target)||b(!1))};return document.addEventListener("keydown",e),document.addEventListener("mousedown",a),()=>{document.removeEventListener("keydown",e),document.removeEventListener("mousedown",a)}},[o,n]);let N=(0,i.useCallback)(()=>{j.current&&clearTimeout(j.current)},[]),C=(0,i.useCallback)(()=>{j.current&&clearTimeout(j.current),j.current=setTimeout(()=>b(!1),180)},[]),S=!x||o,T=f.has(e)&&!S&&!n;return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:'\n        /* The bar\'s own height, published so the services panel, the overlay\n           and any page that needs to clear it all read one number. */\n        :root { --sd-header: 64px; }\n        @media (max-width: 767px) { :root { --sd-header: 58px; } }\n\n        /* min-width matters as much as min-height here: the desktop row starts\n           at 768px, which is a touch width, and "News" is only 34px of type.\n           No underline and no dot: at four items the hierarchy is carried by\n           weight and colour, and a rule sweeping under a link every time the\n           pointer crosses it is decoration pretending to be feedback. */\n        .sd-nav-link { position: relative; display: inline-flex; align-items: center; justify-content: center;\n                       min-height: 44px; min-width: 44px;\n                       font-family: Inter, sans-serif; font-size: 13px; font-weight: 400; letter-spacing: -0.005em;\n                       color: rgba(255,255,255,0.62); text-decoration: none; transition: color .28s ease; }\n        .sd-nav-link:hover { color: #fff; }\n        .sd-nav-link[data-active="1"] { color: #fff; font-weight: 500; }\n        .sd-nav-link:focus-visible { outline: 2px solid #1FD9B2; outline-offset: 4px; border-radius: 2px; }\n\n        /* The background is its own layer. The blur is mounted for the life of\n           the page and only the opacity moves, so the compositing layer is\n           never rebuilt mid-scroll and cannot leave a seam behind. There is no\n           border: a hairline under a dark bar sitting on a white section is\n           exactly the black line it was mistaken for. */\n        .sd-bar-bg { position: absolute; inset: 0; pointer-events: none; z-index: -1;\n                     background: rgba(6,8,11,0.74);\n                     -webkit-backdrop-filter: blur(20px) saturate(1.35);\n                     backdrop-filter: blur(20px) saturate(1.35);\n                     opacity: 0; transition: opacity .35s ease; }\n        header[data-solid="1"] .sd-bar-bg { opacity: 1; }\n        /* On a page that opens light, the ground behind the bar is light too. */\n        header[data-tone="light"] .sd-bar-bg { background: rgba(255,255,255,0.8); }\n\n        .sd-menu-btn { background: none; border: none; cursor: pointer; display: inline-flex; align-items: center; gap: 10px;\n                       min-height: 44px; min-width: 44px; padding: 0 2px; font-family: Inter, sans-serif;\n                       font-size: 11px; font-weight: 600; letter-spacing: .14em; text-transform: uppercase;\n                       color: rgba(255,255,255,0.66); transition: color .3s ease; }\n        .sd-menu-btn:hover { color: #fff; }
1\n\n        /* Logo colours live here rather than inline, so the light-surface rules\n           below can win. An inline style would outrank them. */\n        .sd-logo-a { color: #fff; }\n        .sd-logo-b { color: #1FD9B2; }\n\n        /* Light-surface header. Only applies at the top of a page that opens\n           on light ground; once the glass background arrives it reverts. */\n        header[data-tone="light"] .sd-nav-link { color: rgba(13,17,23,0.62); }\n        header[data-tone="light"] .sd-nav-link:hover,\n        header[data-tone="light"] .sd-nav-link[data-active="1"] { color: #0D1117; }\n        header[data-tone="light"] .sd-nav-link:focus-visible { outline-color: '.concat(g,'; }\n        header[data-tone="light"] .sd-menu-btn { color: rgba(13,17,23,0.66); }\n        header[data-tone="light"] .sd-menu-btn:hover { color: #0D1117; }\n        header[data-tone="light"] .sd-logo-a { color: #0D1117; }\n        header[data-tone="light"] .sd-logo-b { color: ').concat(g,"; }\n        .sd-menu-bars { display: inline-flex; flex-direction: column; gap: 5px; }\n        .sd-menu-bars span { display: block; width: 20px; height: 1.4px; background: currentColor;\n                             transition: transform .4s ").concat(u,", width .4s ").concat(u,"; }\n        .sd-menu-btn:hover .sd-menu-bars span:last-child { width: 13px; }\n\n        /* Services panel */\n        .sd-panel { position: fixed; left: 0; right: 0; top: var(--sd-header); z-index: 199;\n                    background: rgba(9,12,16,0.94); backdrop-filter: blur(22px) saturate(1.3);\n                    -webkit-backdrop-filter: blur(22px) saturate(1.3);\n                    border-bottom: 1px solid rgba(255,255,255,0.07);\n                    overflow: hidden; max-height: 0; transition: max-height .5s ").concat(u,"; }\n        .sd-panel[data-on=\"1\"] { max-height: 420px; }\n        .sd-panel-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 2px;\n                         max-width: 1440px; margin: 0 auto; padding: 0 clamp(20px, 5vw, 76px) 28px; }\n        .sd-panel-item { display: block; text-decoration: none; padding: 26px 20px 22px 0; position: relative; min-height: 44px; }\n        .sd-panel-item::before { content: ''; position: absolute; left: 0; right: 20px; top: 0; height: 1px;\n                                 background: rgba(255,255,255,0.12); transform-origin: left;\n                                 transition: background .35s ease; }\n        .sd-panel-item:hover::before { background: #1FD9B2; }\n        .sd-panel-name { font-family: Inter, sans-serif; font-size: 21px; font-weight: 300; letter-spacing: -0.03em;\n                         color: #fff; display: block; transition: transform .45s ").concat(u,'; }\n        .sd-panel-item:hover .sd-panel-name { transform: translateX(5px); }\n        @media (max-width: 1080px) { .sd-panel { display: none; } }\n\n        /* ── The overlay menu ───────────────────────────────────────── */\n        /* The four worlds are the reason the menu exists, so they are set at\n           display size and everything under them is deliberately quieter. The\n           two groups below used to be flex-wrapped runs, which orphaned\n           "Contact" onto a line of its own and left the sectors reading like\n           text that had fallen out of a paragraph. */\n        .sd-ov-k { font-family: Inter, sans-serif; font-size: 11px; font-weight: 600; letter-spacing: .18em;\n                   text-transform: uppercase; color: #1FD9B2; margin: 26px 0 4px 0; }\n        .sd-ov-k.dim { color: rgba(255,255,255,0.34); margin-top: 30px; }\n\n        .sd-ov-cap { display: grid; grid-template-columns: 1fr auto; align-items: center; gap: 16px;\n                     border-top: 1px solid rgba(255,255,255,0.08); padding: 18px 0; text-decoration: none; }\n        .sd-ov-nm { display: block; font-family: Inter, sans-serif; font-size: clamp(30px, 8.4vw, 46px);\n                    font-weight: 250; color: #fff; letter-spacing: -0.038em; line-height: 1.06; }\n        .sd-ov-cap svg { color: #1FD9B2; flex-shrink: 0;\n                         transition: transform .45s cubic-bezier(0.22,1,0.36,1); }\n        .sd-ov-cap:active svg { transform: translate(4px, -4px); }\n\n        .sd-ov-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0 20px;\n                      border-top: 1px solid rgba(255,255,255,0.08); margin-top: 8px; }\n        .sd-ov-item { font-family: Inter, sans-serif; font-size: 15.5px; font-weight: 400;\n                      color: rgba(255,255,255,0.82); text-decoration: none;\n                      display: inline-flex; align-items: center; min-height: 48px; }\n        .sd-ov-item[data-accent="1"] { color: #fff; font-weight: 500; }\n\n        /* Sectors are navigation, so they are set like navigation. Pills gave\n           a secondary list more visual weight than the primary one above it. */\n        .sd-ov-chips { display: grid; grid-template-columns: 1fr 1fr; gap: 0 20px; margin-top: 2px; }\n        .sd-ov-chip { font-family: Inter, sans-serif; font-size: 14px; font-weight: 300;\n                      color: rgba(255,255,255,0.6); text-decoration: none;\n                      min-height: 46px; display: inline-flex; align-items: center; }\n        .sd-ov-chip:active { color: #fff; }\n\n        .sd-ov-foot { border-top: 1px solid rgba(255,255,255,0.08); margin-top: 26px; padding-top: 6px;\n                      display: flex; flex-wrap: wrap; gap: 4px 26px; align-items: center; }\n        .sd-ov-mail { font-family: Inter, sans-serif; font-size: 13.5px; color: rgba(255,255,255,0.55);\n                      text-decoration: none; min-height: 44px; display: inline-flex; align-items: center; }\n        .sd-ov-legal { font-family: Inter, sans-serif; font-size: 11px; color: rgba(255,255,255,0.3);\n                       text-decoration: none; min-height: 44px; display: inline-flex; align-items: center; }\n\n        @media (prefers-reduced-motion: reduce) {\n          .sd-nav-link::after, .sd-menu-bars span, .sd-panel, .sd-panel-name, .
1sd-ov-cap svg { transition: none !important; }\n        }\n      ')}),(0,a.jsxs)("header",{ref:v,"data-tone":T?"light":"dark","data-solid":S?"1":"0",style:{position:"fixed",top:0,left:0,right:0,zIndex:200,height:"var(--sd-header)",isolation:"isolate",display:"flex",alignItems:"center",gap:"clamp(16px, 3vw, 40px)",padding:"0 clamp(20px, 5vw, 76px)"},children:[(0,a.jsx)("span",{className:"sd-bar-bg","aria-hidden":!0}),(0,a.jsxs)(r(),{href:"/","aria-label":"SpinDepth home",onClick:()=>(0,h.lT)("Logo","/","header"),style:{fontFamily:"Inter, sans-serif",fontWeight:700,fontSize:"16px",letterSpacing:"-0.025em",textDecoration:"none",flexShrink:0,display:"inline-flex",alignItems:"center",minHeight:"44px"},children:[(0,a.jsx)("span",{className:"sd-logo-a",children:"Spin"}),(0,a.jsx)("span",{className:"sd-logo-b",children:"Depth"})]}),(0,a.jsx)("nav",{className:"hidden md:flex",style:{marginLeft:"auto",alignItems:"center",gap:"clamp(20px, 2.4vw, 34px)"},children:m.map(n=>{let t=e===n.to||"/"!==n.to&&e.startsWith(n.to+"/");return(0,a.jsx)("div",{onMouseEnter:n.panel?()=>{N(),b(!0)}:void 0,onMouseLeave:n.panel?C:void 0,style:{display:"inline-flex"},children:(0,a.jsx)(r(),{href:n.to,className:"sd-nav-link","data-active":t?"1":"0","aria-current":t?"page":void 0,"aria-expanded":n.panel?o:void 0,onFocus:n.panel?()=>b(!0):void 0,onClick:()=>{(0,h.lT)(n.label,n.to,"header"),b(!1)},children:n.label})},n.to)})}),(0,a.jsxs)("button",{className:"sd-menu-btn",onClick:()=>{n||(0,h.Ro)(),t(!n),b(!1)},"aria-label":n?"Close menu":"Open menu","aria-expanded":n,style:{marginLeft:"auto"},children:[(0,a.jsx)("span",{className:"hidden sm:inline",children:n?"Close":"Menu"}),(0,a.jsxs)("span",{className:"sd-menu-bars","aria-hidden":!0,children:[(0,a.jsx)("span",{style:n?{transform:"translateY(3.2px) rotate(45deg)"}:void 0}),(0,a.jsx)("span",{style:n?{transform:"translateY(-3.2px) rotate(-45deg)",width:"20px"}:void 0})]})]})]}),(0,a.jsx)("div",{ref:k,className:"sd-panel","data-on":o?"1":"0",onMouseEnter:N,onMouseLeave:C,"aria-hidden":!o,children:(0,a.jsx)("div",{className:"sd-panel-grid",children:c.$8.map((e,n)=>(0,a.jsx)(l.default,{href:e.href,className:"sd-panel-item",tabIndex:o?0:-1,onClick:()=>{(0,h.lT)(e.name,e.href,"header_panel"),b(!1)},children:(0,a.jsx)("span",{className:"sd-panel-name",children:e.name})},e.slug))})}),(0,a.jsxs)("div",{ref:w,style:{display:"none",position:"fixed",inset:0,background:"#07090c",zIndex:210,flexDirection:"column",overflowY:"auto",padding:"0 clamp(20px, 5vw, 76px)"},children:[(0,a.jsx)("div",{"aria-hidden":!0,style:{position:"absolute",inset:0,pointerEvents:"none",overflow:"hidden"},children:(0,a.jsx)("div",{style:{position:"absolute",bottom:"-25%",right:"-10%",width:"65%",height:"70%",background:"radial-gradient(circle at 60% 70%, rgba(31,217,178,0.07) 0%, transparent 66%)",filter:"blur(70px)"}})}),(0,a.jsxs)("div",{style:{height:"var(--sd-header)",display:"flex",alignItems:"center",justifyContent:"space-between",flexShrink:0,position:"relative",zIndex:1},children:[(0,a.jsxs)(r(),{href:"/",style:{fontFamily:"Inter, sans-serif",fontWeight:700,fontSize:"17px",letterSpacing:"-0.025em",textDecoration:"none"},children:[(0,a.jsx)("span",{style:{color:"#fff"},children:"Spin"}),(0,a.jsx)("span",{style:{color:"#1FD9B2"},children:"Depth"})]}),(0,a.jsxs)("button",{onClick:()=>t(!1),"aria-label":"Close menu",className:"sd-menu-btn",children:[(0,a.jsx)("span",{className:"hidden sm:inline",children:"Close"}),(0,a.jsxs)("span",{className:"sd-menu-bars","aria-hidden":!0,children:[(0,a.jsx)("span",{style:{transform:"translateY(3.2px) rotate(45deg)"}}),(0,a.jsx)("span",{style:{transform:"translateY(-3.2px) rotate(-45deg)"}})]})]})]}),(0,a.jsxs)("nav",{style:{flex:1,paddingBottom:"48px",position:"relative",zIndex:1,maxWidth:"1440px",width:"100%",margin:"30px auto 0"},children:[c.$8.map((e,n)=>(0,a.jsxs)(l.default,{href:e.href,"data-menu-item":!0,className:"sd-ov-cap",onClick:()=>(0,h.mp)(e.name,e.href),children:[(0,a.jsx)("span",{className:"sd-ov-nm",children:e.name}),(0,a.jsx)("svg",{width:"16",height:"16",viewBox:"0 0 15 15",fill:"none","aria-hidden":!0,
1children:(0,a.jsx)("path",{d:"M2 7.5h11M8.5 3l4.5 4.5L8.5 12",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})})]},e.slug)),(0,a.jsx)("div",{className:"sd-ov-grid","data-menu-item":!0,children:[{label:"Home",to:"/"},{label:"All services",to:"/services"},{label:"News",to:"/news"},{label:"Careers",to:"/careers"},{label:"Contact",to:"/contact"},{label:"LinkedIn",to:"https://www.linkedin.com/company/spindepth"},{label:"YouTube",to:"https://www.youtube.com/@SpinDepth"},{label:"Instagram",to:"https://www.instagram.com/spindepth/"}].map(e=>e.to.startsWith("http")?(0,a.jsx)("a",{href:e.to,target:"_blank",rel:"noopener noreferrer",className:"sd-ov-item",onClick:()=>(0,h.mp)(e.label,e.to),children:e.label},e.to):(0,a.jsx)(l.default,{href:e.to,className:"sd-ov-item","data-accent":"/contact"===e.to?"1":"0",onClick:()=>(0,h.mp)(e.label,e.to),children:e.label},e.to))}),(0,a.jsx)("p",{className:"sd-ov-k dim","data-menu-item":!0,children:"Sectors"}),(0,a.jsx)("div",{className:"sd-ov-chips","data-menu-item":!0,children:p.Bg.map(e=>(0,a.jsx)(l.default,{href:"/services#".concat(e.slug),className:"sd-ov-chip",onClick:()=>(0,h.mp)(e.short,"/services#".concat(e.slug)),children:e.short},e.slug))}),(0,a.jsxs)("div",{className:"sd-ov-foot","data-menu-item":!0,children:[(0,a.jsx)("a",{href:"mailto:[email protected]",className:"sd-ov-mail",children:"[email protected]"}),[["/privacy","Privacy Notice"],["/terms","Terms & Conditions"],["/cookies","Cookie Notice"]].map(e=>{let[n,t]=e;return(0,a.jsx)(l.default,{href:n,className:"sd-ov-legal",children:t},n)})]})]})]})]})}var x=t(75662),y=t(35808);let w="Inter, sans-serif",v="#1FD9B2",k=()=>{let{t:e}=(0,x.Bd)(),[n,t]=(0,i.useState)(""),[s,o]=(0,i.useState)("idle"),[r,l]=(0,i.useState)(!1),d=(0,i.useRef)(null),c=(0,i.useRef)(!1),p=/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(n.trim()),m=async e=>{e.preventDefault();let t=n.trim();if(!p){var a;l(!0),null==(a=d.current)||a.focus(),(0,h.eG)("newsletter","invalid_email","email");return}l(!1),o("loading");let{error:s}=await y.supabase.from("subscribers").insert({email:t,source_page:"footer"});if(s){let e="23505"===s.code;o(e?"duplicate":"error"),(0,h.eG)("newsletter",e?"already_subscribed":"server_error","email")}else o("success"),(0,h.u4)("newsletter_subscribe",{form_name:"newsletter",cta_location:"footer"})},u=(0,a.jsx)("style",{children:"\n      /* The field takes the width of the block it is placed in, up to a\n         ceiling. Past about this width a single-line email field stops\n         reading as a field and the submit under it becomes a slab. */\n      .sd-sub { display: flex; flex-direction: column; gap: 10px; max-width: 460px; }\n      .sd-sub-l { font-family: ".concat(w,"; font-size: 11px; font-weight: 600; letter-spacing: .14em;\n                  text-transform: uppercase; color: rgba(255,255,255,0.56); margin: 0; }\n\n      /* One column. The field gets the whole width of the block, the button\n         the whole width under it. Nothing competes for the same line. */\n      .sd-sub-row { display: flex; flex-direction: column; gap: 10px; align-items: stretch; }\n\n      .sd-sub-in {\n        display: block; width: 100%; min-width: 0; height: 54px; padding: 0 16px;\n        font-family: ").concat(w,"; font-size: 16px; font-weight: 300; letter-spacing: -0.005em;\n        color: #fff; caret-color: ").concat(v,";\n        background: rgba(255,255,255,0.06);\n        border: 1px solid rgba(255,255,255,0.22); border-radius: 4px;\n        transition: border-color .22s ease, background .22s ease, box-shadow .22s ease;\n        -webkit-appearance: none; appearance: none;\n      }\n      .sd-sub-in::placeholder { color: rgba(255,255,255,0.42); }\n      .sd-sub-in:hover { border-color: rgba(255,255,255,0.34); }\n      .sd-sub-in:focus {\n        outline: none; border-color: ").concat(v,';\n        background: rgba(255,255,255,0.09);\n        box-shadow: 0 0 0 3px rgba(31,217,178,0.2);\n      }\n      .sd-sub-in[aria-invalid="true"] { border-color: #FFB4A2; }\n      /* Chrome paints its own colours over an autofilled field, which on a\n         dark surface means dark text on a pale yellow box. */\n      .sd-sub-in:-webkit-autofill,\n      .sd-sub-in:-webkit-autofill:hover,\n      .sd-sub-in:-webkit-autofill:focus {\n        -webkit-text-fill-color: #fff;\n        caret-color: ').concat(v,";\n        box-shadow: 0 0 0 1000px #10151b inset;\n        border-color: rgba(255,255,255,0.28);\n      }\n\n      .sd-sub-btn {\n        display: block; width: 100%; height: 50px; padding: 0 20px; cursor: pointer;\n        font-family: ").concat(w,"; font-size: 12px; font-weight: 700; letter-spacing: .1em;\n        text-transform: uppercase; white-space: nowrap;\n        color: #04201B; background: ").concat(v,";\n        border: 1px solid ").concat(v,"; border-radius: 4px;\n        transition: background .22s ease, border-color .22s ease, transform .22s ease, opacity .22s ease;\n      }\n      .sd-sub-btn:hover:not(:disabled) { background: #3BE9C6; border-color: #3BE9C6; }\n      .sd-sub-btn:active:not(:disabled) { transform: translateY(1px); }\n      .sd-sub-btn:focus-visible { outline: 2px solid #fff; outline-offset: 2px; }\n      .sd-sub-btn:disabled { cursor: progress; opacity: .7; }\n      .sd-sub-hint { font-family: ").concat(w,"; font-size: 12.5px; font-weight: 300; color: #FFB4A2; margin: 0; }\n\n      .sd-sub-msg { font-family: ").concat(w,'; font-size: 13.5px; font-weight: 300; margin: 0;\n                    display: inline-flex; align-items: center; gap: 8px; min-height: 54px; }\n      .sd-sub-msg[data-ok="1"] { color: ').concat(v,'; }\n      .sd-sub-msg[data-ok="0"] { color: rgba(255,255,255,0.66); }\n\n      /* Inside the phone newsroom card the module is the reason the card is\n         there, so both controls take the whole card. */\n      @media (max-width: 780px) {\n        .sd-sub-in { height: 56px; }\n        .sd-sub-btn { height: 52px; }\n      }\n      @media (prefers-reduced-motion: reduce) {\n        .sd-sub-in, .sd-sub-btn { transition: none !important; }\n        .sd-sub-btn:active:not(:disabled) { transform: none; }\n      }\n    ')});return"success"===s||"duplicate"===s||"error"===s?(0,a.jsxs)("div",{className:"sd-sub",children:[u,(0,a.jsxs)("p",{className:"sd-sub-msg","data-ok":"success"===s?"1":"0",role:"status",children:["success"===s&&(0,a.jsx)("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none","aria-hidden":!0,
1children:(0,a.jsx)("path",{d:"M2.5 8l3.5 3.5L12.5 4",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round",strokeLinejoin:"round"})}),e("footer.subscribe_".concat(s))]})]}):(0,a.jsxs)("form",{onSubmit:m,className:"sd-sub",noValidate:!0,children:[u,(0,a.jsx)("label",{className:"sd-sub-l",htmlFor:"footer-subscribe-email",children:e("footer.subscribe_label")}),(0,a.jsxs)("div",{className:"sd-sub-row",children:[(0,a.jsx)("input",{className:"sd-sub-in",type:"email",inputMode:"email",id:"footer-subscribe-email",name:"email",autoComplete:"email",spellCheck:!1,"aria-label":e("footer.subscribe_label"),ref:d,value:n,onChange:e=>{c.current||(c.current=!0,(0,h.M4)("newsletter")),t(e.target.value),r&&l(!1)},"aria-invalid":r||void 0,placeholder:e("footer.subscribe_placeholder")}),(0,a.jsx)("button",{type:"submit",className:"sd-sub-btn",disabled:"loading"===s,children:"loading"===s?"…":e("footer.subscribe_button")})]}),r&&(0,a.jsx)("p",{className:"sd-sub-hint",role:"alert",children:"Enter a valid email address."})]})};var j=t(67333),N=t(20064),C=t(67161);let S="Inter, sans-serif",T="#1FD9B2",I=[...c.$8.map(e=>({label:e.name,href:e.href})),{label:"All services",href:"/services"}],E=[{label:"Newsroom",href:"/news"},{label:"Careers",href:"/careers"},{label:"Contact",href:"/contact"}],A=[{label:"LinkedIn",href:"https://www.linkedin.com/company/spindepth",Icon:j.A},{label:"YouTube",href:"https://www.youtube.com/@SpinDepth",Icon:N.A},{label:"Instagram",href:"https://www.instagram.com/spindepth/",Icon:C.A}],B=[{label:"New projects",href:"mailto:[email protected]"},{label:"Press and media",href:"mailto:[email protected]"},{label:"Partnerships",href:"mailto:[email protected]"},{label:"Careers enquiries",href:"mailto:[email protected]"}],D=[{label:"Privacy Notice",to:"/privacy"},{label:"Terms and Conditions",to:"/terms"},{label:"Cookie Notice",to:"/cookies"}];function L(e){let{label:n,href:t,external:s}=e;return s||t.startsWith("mailto:")?(0,a.jsx)("a",{className:"ft-link",href:t,...t.startsWith("http")?{target:"_blank",rel:"noopener noreferrer"}:{},onClick:()=>(0,h.lT)(n,t,"footer"),children:n}):(0,a.jsx)(l.default,{className:"ft-link",href:t,onClick:()=>(0,h.lT)(n,t,"footer"),children:n})}function z(){let{t:e}=(0,x.Bd)();return(0,a.jsxs)("footer",{style:{background:"#000",color:"#fff",position:"relative",overflow:"hidden"},role:"contentinfo",children:[(0,a.jsx)("style",{children:"\n        .ft-pad { position: relative; padding: clamp(64px, 9vw, 110px) clamp(20px, 5vw, 76px) clamp(32px, 4vw, 48px); }\n        .ft-in { max-width: 1440px; margin: 0 auto; }\n\n        .ft-word { font-family: ".concat(S,"; font-size: clamp(54px, 9vw, 132px); font-weight: 250;\n                   line-height: 0.95; margin: 0; letter-spacing: -0.045em; }\n        .ft-say { display: none; }\n\n        /* min-height 44px keeps every footer link a real touch target. At\n           13.5px type the natural line box is only ~28px tall. */\n        .ft-link {\n          font-family: ").concat(S,'; font-size: 13.5px; font-weight: 300;\n          color: rgba(255,255,255,0.58); text-decoration: none;\n          transition: color .22s ease;\n          /* min-width as well as min-height: short labels like "Media" and\n             "Crypto" were only 39px wide, so the target failed on one axis. */\n          display: inline-flex; align-items: center; min-height: 44px; min-width: 44px;\n        }\n        .ft-link:hover { color: ').concat(T,"; }\n        .ft-head {\n          font-family: ").concat(S,"; font-size: 11px; font-weight: 600; letter-spacing: .14em;\n          text-transform: uppercase; color: rgba(255,255,255,0.4); margin: 0 0 16px 0;\n        }\n        .ft-social { display: flex; gap: 6px; margin-top: 10px; }\n        .ft-icon {\n          display: inline-flex; align-items: center; justify-content: center;\n          width: 44px; height: 44px; border-radius: 50%;\n          border: 1px solid rgba(255,255,255,0.14); color: rgba(255,255,255,0.7);\n          transition: color .22s ease, border-color .22s ease;\n        }\n        .ft-icon:hover, .ft-icon:focus-visible { color: ").concat(T,"; border-color: ").concat(T,"; }\n        .ft-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }\n\n        /* Four navigation columns, and the newsroom. The column gap is tighter\n           than the row gap so the newsroom can be given real width without\n           wrapping the longest link label in the columns beside it: it holds a\n           form, and an email address needs somewhere to be read. */\n        .ft-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));\n                   gap: clamp(32px, 4vw, 56px) clamp(28px, 3vw, 46px);\n                   margin: clamp(48px, 7vw, 88px) 0 clamp(44px, 6vw, 72px); }\n        .ft-open    { order: 1; }\n        .ft-sectors { order: 2; }\n        .ft-company { order: 3; }\n        .ft-direct  { order: 4; }\n        /* Below the fifth-column width it takes its own row rather than\n           becoming a 130px orphan track. */\n        .ft-news    { order: 5; min-width: 0; grid-column: 1 / -1; max-width: 420px; }\n\n        @media (min-width: 1100px) {\n          .ft-grid { grid-template-columns: repeat(4, minmax(0, 1fr)) minmax(300px, 1.55fr); }\n          .ft-news { grid-column: auto; max-width: none; }\n        }\n\n        /* The newsroom line and the way into it. */\n        .ft-news-l { font-family: ").concat(S,"; font-size: 13.5px; font-weight: 300;\n                     color: rgba(255,255,255,0.58); line-height: 1.7; margin: 0 0 14px 0; }\n        .ft-news-go { display: inline-flex; align-items: center; gap: 10px; text-decoration: none;\n                      font-family: ").concat(S,"; font-size: 14px; font-weight: 450; color: #fff;\n                      min-height: 44px; margin-bottom: 14px; }\n        .ft-news-go span { position: relative; padding-bottom: 3px; }\n        .ft-news-go span::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;\n                                  background: ").concat(T,"; transform: scaleX(0); transform-origin: right;\n                                  transition: transform .55s cubic-bezier(.22,1,.36,1); }\n        .ft-news-go:hover span::after, .ft-news-go:focus-visible span::after { transform: scaleX(1); transform-origin: left; }\n        .ft-news-go svg { color: ").concat(T,"; transition: transform .45s cubic-bezier(.22,1,.36,1); }\n        .ft-news-go:hover svg { transform: translateX(6px); }\n\n        .ft-legal {\n          font-family: ").concat(S,"; font-size: 11.5px; font-weight: 300;\n          color: rgba(255,255,255,0.5); text-decoration: none; transition: color .2s ease;\n          display: inline-flex; align-items: center; min-height: 44px;\n        }\n        .ft-legal:hover { color: rgba(255,255,255,0.85); }\n        .ft-bar { display: flex; align-items: center; justify-content: space-between;\n                  flex-wrap: wrap; gap: 14px; padding-top: clamp(24px, 3vw, 34px); }\n        .ft-copy { font-family: ").concat(S,"; font-size: 11.5px; font-weight: 300; color: rgba(255,255,255,0.5); margin: 0; }\n        .ft-copy-block { display: flex; flex-direction: column; gap: 4px; }
1\n        .ft-addr { font-family: ").concat(S,"; font-size: 11.5px; font-weight: 300; font-style: normal;\n                   color: rgba(255,255,255,0.38); margin: 0; }\n        .ft-legal-set { display: flex; gap: 22px; flex-wrap: wrap; align-items: center; }\n\n        /* ── The phone footer ───────────────────────────────────────── */\n        @media (max-width: 780px) {\n          .ft-pad { padding: 62px 20px 26px; }\n          .ft-word { font-size: 56px; letter-spacing: -0.05em; }\n          .ft-say { display: block; font-family: ").concat(S,"; font-size: 14px; font-weight: 300; line-height: 1.62;\n                    color: rgba(255,255,255,0.52); margin: 18px 0 0 0; max-width: 34ch; }\n\n          /* Two navigational columns side by side, everything else full\n             width. The wide layout's ordering is dropped so the reading order\n             is the DOM order. */\n          .ft-grid { grid-template-columns: 1fr 1fr; gap: 34px 20px; margin: 40px 0 34px; }\n          .ft-open, .ft-sectors, .ft-company, .ft-direct, .ft-news { order: 0; }\n          .ft-news, .ft-sectors, .ft-direct { grid-column: 1 / -1; }\n\n          /* The newsroom gets its own surface and sits at the top, because it\n             is the one thing in the footer that is asking for something. */\n          .ft-news { background: #0B0E12; border: 1px solid rgba(255,255,255,0.08);\n                     border-radius: 8px; padding: 22px 20px 20px; max-width: none; }\n          .ft-news .ft-head { color: ").concat(T,"; margin-bottom: 10px; }\n          .ft-news-l { margin-bottom: 4px; }\n\n          /* Sectors read as navigation, because that is what they are. They\n             were pills, which gave a secondary list more weight than the\n             primary columns above it and made the footer look assembled from\n             components rather than composed. */\n          .ft-chips { display: grid; grid-template-columns: 1fr 1fr; gap: 0 20px; }\n          .ft-chips .ft-link { min-width: 0; }\n\n          .ft-direct .ft-list { display: grid; grid-template-columns: 1fr 1fr; gap: 0 20px; }\n\n          .ft-bar { flex-direction: column; align-items: flex-start; gap: 0;\n                    border-top: 1px solid rgba(255,255,255,0.09); padding-top: 8px; }\n          .ft-legal-set { gap: 6px 20px; order: 1; }\n          .ft-copy { order: 2; padding-top: 10px; }\n        }\n        @media (max-width: 360px) {\n          .ft-word { font-size: 50px; }\n          .ft-direct .ft-list { grid-template-columns: 1fr; }\n        }\n        @media (prefers-reduced-motion: reduce) {\n          .ft-link, .ft-icon, .ft-legal, .ft-news-go span::after, .ft-news-go svg { transition: none !important; }\n        }\n      ")}),(0,a.jsx)("div",{className:"ft-pad",children:(0,a.jsxs)("div",{className:"ft-in",children:[(0,a.jsxs)("p",{className:"ft-word",children:[(0,a.jsx)("span",{style:{color:T},children:"Think"})," ",(0,a.jsx)("span",{style:{color:"#fff"},children:"deep."})]}),(0,a.jsx)("p",{className:"ft-say",children:"Football, culture, media and market access across Asia, Europe and the Middle East."}),(0,a.jsxs)("div",{className:"ft-grid",children:[(0,a.jsxs)("div",{className:"ft-news",children:[(0,a.jsx)("p",{className:"ft-head",children:"The newsroom"}),(0,a.jsx)("p",{className:"ft-news-l",children:"Stories, insight and the people shaping markets and culture."}),(0,a.jsxs)(l.default,{href:"/news",className:"ft-news-go",onClick:()=>(0,h.lT)("Enter the newsroom","/news","footer"),children:[(0,a.jsx)("span",{children:"Enter the newsroom"}),(0,a.jsx)("svg",{width:"15",height:"15",viewBox:"0 0 15 15",fill:"none","aria-hidden":!0,children:(0,a.jsx)("path",{d:"M2 7.5h11M8.5 3l4.5 4.5L8.5 12",stroke:"currentColor",strokeWidth:"1.4",strokeLinecap:"round",strokeLinejoin:"round"})})]}),(0,a.jsx)(k,{})]}),(0,a.jsxs)("nav",{className:"ft-open","aria-label":"What we open",children:[(0,a.jsx)("p",{className:"ft-head",children:"What we open"}),(0,a.jsx)("ul",{className:"ft-list",children:I.map(e=>(0,a.jsx)("li",{children:(0,a.jsx)(L,{...e})},e.label))})]}),(0,a.jsxs)("nav",{className:"ft-company","aria-label":"Company",children:[(0,a.jsx)("p",{className:"ft-head",children:"Company"}),(0,a.jsx)("ul",{className:"ft-list",children:E.map(e=>(0,a.jsx)("li",{children:(0,a.jsx)(L,{...e})},e.label))}),(0,a.jsx)("div",{className:"ft-social",children:A.map(e=>{let{label:n,href:t,Icon:s}=e;return(0,a.jsx)("a",{className:"ft-icon",href:t,target:"_blank",rel:"noopener noreferrer","aria-label":"SpinDepth on ".concat(n),title:n,onClick:()=>(0,h.lT)(n,t,"footer"),children:(0,a.jsx)(s,{size:18,strokeWidth:1.6,"aria-hidden":!0})},n)})})]}),(0,a.jsxs)("nav",{className:"ft-sectors","aria-label":"Sectors",children:[(0,a.jsx)("p",{className:"ft-head",children:"Sectors"}),(0,a.jsx)("ul",{className:"ft-list ft-chips",children:p.Bg.map(e=>(0,a.jsx)("li",{children:(0,a.jsx)(L,{label:e.short,href:"/services#".concat(e.slug)})},e.slug))})]}),(0,a.jsxs)("nav",{className:"ft-direct","aria-label":"Direct",children:[(0,a.jsx)("p",{className:"ft-head",children:"Direct"}),(0,a.jsx)("ul",{className:"ft-list",children:B.map(e=>(0,a.jsx)("li",{children:(0,a.jsx)(L,{...e})},e.label))})]})]}),(0,a.jsxs)("div",{className:"ft-bar",children:[(0,a.jsxs)("div",{className:"ft-copy-block",children:[(0,a.jsxs)("p",{className:"ft-copy",children:[new Date().getFullYear()," SpinDepth. ",e("footer.copyright")]}),(0,a.jsx)("address",{className:"ft-addr",children:"SpinDepth Limited, Level 43, Champion Tower, 3 Garden Road, Central, Hong Kong"})]}),(0,a.jsx)("div",{className:"ft-legal-set",children:D.map(e=>(0,a.jsx)(l.default,{href:e.to,className:"ft-legal",children:e.label},e.to))})]})]})})]})}let F="spindepth_cookie_consent";function _(){let[e,n]=(0,i.useState)(!1),[t,s]=(0,i.useState)(!1);function o(e){try{localStorage.setItem(F,e?"accepted":"declined")}catch(e){}(0,h.T1)(e),s(!0),window.setTimeout(()=>n(!1),260)}return((0,i.useEffect)(()=>{try{localStorage.getItem(F)||n(!0)}catch(e){}},[]),e)?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:'\n        .sd-cc {\n          position: fixed; left: 0; right: 0; bottom: 0; z-index: 500;\n          background: rgba(8, 10, 12, 0.96);\n          backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px);\n          border-top: 1px solid rgba(255, 255, 255, 0.12);\n          transform: translateY(0); opacity: 1;\n          transition: transform .26s ease, opacity .26s ease;\n          padding-bottom: env(safe-area-inset-bottom, 0px);\n        }\n        .sd-cc[data-leaving="true"] { transform: translateY(100%); opacity: 0; }\n        @media (prefers-reduced-motion: reduce) { .sd-cc { transition: none; } }\n\n        .sd-cc-in {\n          max-width: 1200px; margin: 0 auto; padding: 16px 24px;\n          display: flex; align-items: center; justify-content: space-between;\n          gap: 20px;\n        }\n        .sd-cc-copy {\n          font-family: Inter, system-ui, sans-serif; font-size: 13px; line-height: 1.55;\n          color: rgba(255, 255, 255, 0.72); margin: 0; max-width: 70ch;\n        }\n        .sd-cc-copy a { color: #1FD9B2; text-decoration: none; }\n        .sd-cc-copy a:hover { text-decoration: underline; }\n\n        .sd-cc-actions { display: flex; gap: 10px; flex-shrink: 0; }\n        .sd-cc-btn {\n          font-family: Inter, system-ui, sans-serif; font-size: 13px; font-weight: 600;\n          min-height: 44px; padding: 0 22px; border-radius: 999px;\n          cursor: pointer; white-space: nowrap;\n          transition: background-color .2s ease, color .2s ease, border-color .2s ease;\n        }\n        .sd-cc-accept { background: #1FD9B2; color: #04201B; border: 1px solid #1FD9B2; }\n        .sd-cc-accept:hover { background: #17c4a0; border-color: #17c4a0; }\n        .sd-cc-decline {\n          background: transparent; color: rgba(255, 255, 255, 0.78);\n          border: 1px solid rgba(255, 255, 255, 0.28);\n        }\n        .sd-cc-decline:hover { color: #fff; border-color: rgba(255, 255, 255, 0.55); }\n\n        @media (max-width: 720px) {\n          .sd-cc-in { flex-direction: column; align-items: stretch; gap: 14px; padding: 16px; }\n          .sd-cc-actions { width: 100%; }\n          .sd-cc-btn { flex: 1; padding: 0 12px; }\n        }\n      '}),(0,a.jsx)("div",{className:"sd-cc","data-leaving":t,role:"dialog","aria-live":"polite","aria-label":"Cookie notice",children:(0,a.jsxs)("div",{className:"sd-cc-in",children:[(0,a.jsxs)("p",{className:"sd-cc-copy",children:["We use essential cookies to run this site, and analytics cookies to understand which stories readers find useful. Nothing is used for advertising or profiling. You can decline analytics, and in Europe nothing is stored until you accept. Read our"," ",(0,a.jsx)(l.default,{href:"/cookies",children:"Cookie Notice"}),"."]}),(0,a.jsxs)("div",{className:"sd-cc-actions",children:[(0,a.jsx)("button",{type:"button",className:"sd-cc-btn sd-cc-decline",onClick:()=>o(!1),children:"Decline"}),(0,a.jsx)("button",{type:"button",className:"sd-cc-btn sd-cc-accept",onClick:()=>o(!0),children:"Accept"})]})]})})]}):null}let P=/^[^\s@]+@[^\s@]+\.[a-z]{2,}$/i,W=new Set(["test","tests","testing","tester","example","sample","demo","fake","asdf","asd","qwerty","qwe","abc","abcd","aaa","aa","a","x","xx","xxx","noreply","no-reply","donotreply","nobody","none","null","na","admin","user","email","mail","yourname","firstname","lastname"]),M=new Set(["test.com","test.co","test.test","example.com","example.org","example.net","domain.com","email.com","mail.com","fake.com","abc.com","xyz.com","mailinator.com","yopmail.com","trashmail.com","guerrillamail.com","sharklasers.com","dispostable.com","10minutemail.com","tempmail.com","temp-mail.org","throwawaymail.com","getnada.com","maildrop.cc"]),R=["fuck","fucking","fuk","shit","bitch","cunt","asshole","dick","pussy","bastard","wanker","slut","whore","nigger","faggot","retard","motherfucker"],Y=["The Qur’an asks people to say that which is best, because the wrong word is what sets everything else off (17:53). Anyway. Your actual name?","Marcus Aurelius reckoned the best revenge is to not be like the person who wronged y
1ou. Nobody has wronged either of us yet, so let us start again. Your name?","Confucius held that the beginning of wisdom is calling things by their right name. Yours, ideally.","The Prophet, peace be upon him, is reported to have said that a good word is charity. Cheapest thing either of us will give today. Your name?"],O=["What does SpinDepth do?","We are a broker expanding into Thailand","Do you work with WikiFX?","I want to speak to someone"],U="sd_labros_state",q=["I can answer anything about SpinDepth. Ask me.","Tell me what you are working on.","Looking for something? I know where it is.","Ask me what SpinDepth actually does."],K="sd_labros_session";function J(){try{let e=sessionStorage.getItem(K);if(e)return e;let n=crypto.randomUUID();return sessionStorage.setItem(K,n),n}catch(e){return"anonymous"}}function H(e){let n,{text:t}=e,s=[],i=/\[([^\]]+)\]\((\/[^)\s]*)\)/g,o=0,r=0;for(;n=i.exec(t);)n.index>o&&s.push(t.slice(o,n.index)),s.push((0,a.jsx)("a",{href:n[2],className:"sa-link",target:"_blank",rel:"noopener noreferrer nofollow",children:n[1]},"l".concat(r++))),o=n.index+n[0].length;return o<t.length&&s.push(t.slice(o)),(0,a.jsx)(a.Fragment,{children:s})}function X(){let[e,n]=(0,i.useState)(!1),[t,s]=(0,i.useState)(!1),[o,r]=(0,i.useState)(!1),[l]=(0,i.useState)(()=>q[Math.floor(Math.random()*q.length)]),[d,c]=(0,i.useState)([]),[p,m]=(0,i.useState)(""),[u,f]=(0,i.useState)(!1),[g,b]=(0,i.useState)(!1),[x,y]=(0,i.useState)(null),[w,v]=(0,i.useState)({name:"",email:""}),[k,j]=(0,i.useState)("idle"),N=(0,i.useRef)(null),C=(0,i.useRef)(null),S=(0,i.useRef)(null),T=null!==x&&"done"!==x,I=e=>c(n=>[...n,{id:crypto.randomUUID(),role:"assistant",content:e}]);async function E(e){f(!0),b(!1);try{let n=await fetch("/api/chat",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:J(),pagePath:window.location.pathname,referrer:document.referrer||null,messages:e.map(e=>({role:e.role,content:e.content}))})});if(!n.ok)return void b(!0);let t=await n.text(),a="",s=!1;for(let e of t.split("\n"))if(e.startsWith("0:"))try{a+=JSON.parse(e.slice(2))}catch(e){}else if(e.startsWith("2:"))try{JSON.parse(e.slice(2)).some(e=>null==e?void 0:e.capture)&&(s=!0)}catch(e){}if(!a.trim())return void b(!0);I(a.trim()),s&&!x&&(y("email"),I("What is the best email for you?"))}catch(e){b(!0)}finally{f(!1)}}async function A(e){if("email"===x){let n=function(e){let n=e.trim().toLowerCase();if(!P.test(n))return{ok:!1,reason:"That address does not look complete. Could you check it?"};
1let[t,a]=n.split("@");return W.has(t)||M.has(a)?{ok:!1,reason:"That one looks like a placeholder. I need an address a reply can actually reach."}:/(^|\.)(test|example|fake|invalid|localhost)(\.|$)/.test(a)?{ok:!1,reason:"That domain will not receive anything. What is the real one?"}:/^(.)\1+$/.test(t)?{ok:!1,reason:"That one looks like a placeholder. I need an address a reply can actually reach."}:{ok:!0}}(e);return n.ok?(v(n=>({...n,email:e})),y("name"),void I("Got it. And your full name?")):void I(n.reason)}if("name"===x){let n=function(e){let n=e.trim();return n.length<2?{ok:!1,reason:"I did not catch that. What should I call you?"}:n.length>80?{ok:!1,reason:"That is a lot of name. The short version is fine."}:n.toLowerCase().replace(/[^a-z\s]/g," ").split(/\s+/).some(e=>R.includes(e))?{ok:!1,reason:Y[Math.floor(Math.random()*Y.length)]}:/[a-z]/i.test(n)?{ok:!0}:{ok:!1,reason:"That does not look like a name. What should I call you?"}}(e);return n.ok?(v(n=>({...n,name:e})),y("company"),void I("Last one. Which company are you with? Say skip if you would rather not.")):void I(n.reason)}if("company"===x){let n=/^(skip|no|none|n\/a|-)$/i.test(e)?"":e;if(n){let e=function(e){let n=e.trim();return n?n.length>120?{ok:!1,reason:"Shorter version of the company name?"}:n.toLowerCase().replace(/[^a-z\s]/g," ").split(/\s+/).some(e=>R.includes(e))?{ok:!1,reason:Y[Math.floor(Math.random()*Y.length)]}:{ok:!0}:{ok:!0}}(n);if(!e.ok)return void I(e.reason)}f(!0);try{let e=await fetch("/api/chat/lead",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:w.name,email:w.email,company:n,sessionId:J(),summary:d.filter(e=>"user"===e.role).map(e=>e.content).join(" | ").slice(0,400)})}),t=await e.json().catch(()=>({}));e.ok&&t.ok?(y("done"),I("Done, ".concat(t.name||"there",". That is with the team and someone will email you. Anything else while you are here?")),(0,h.u4)("generate_lead",{form_name:"labros"})):I(t.error||"That did not go through. Try [email protected] and I will stop getting in the way.")}catch(e){I("That did not go through. Try [email protected] and I will stop getting in the way.")}finally{f(!1)}}}function B(e){let n=e.trim();if(!n||u)return;let t=[...d,{id:crypto.randomUUID(),role:"user",content:n}];c(t),m(""),(0,h.u4)("assistant_message",{form_name:"labros"}),T?A(n):E(t)}return(0,i.useEffect)(()=>{try{let s=sessionStorage.getItem(U);if(!s)return;let i=JSON.parse(s);if(!i.at||Date.now()-i.at>3e5)return void sessionStorage.removeItem(U);if(Array.isArray(i.turns)&&i.turns.length){var e,t,a;c(i.turns),y(null!=(e=i.step)?e:null),v(null!=(t=i.lead)?t:{name:"",email:""}),j(null!=(a=i.loc)?a:"idle"),n(!0)}}catch(e){}},[]),(0,i.useEffect)(()=>{try{if(!d.length)return void sessionStorage.removeItem(U);sessionStorage.setItem(U,JSON.stringify({at:Date.now(),turns:d,step:x,lead:w,loc:k}))}catch(e){}},[d,x,w,k]),(0,i.useEffect)(()=>{let e=!0;return fetch("/api/chat").then(e=>e.json()).then(n=>{e&&s(!!(null==n?void 0:n.configured))}).catch(()=>{}),()=>{e=!1}},[]),(0,i.useEffect)(()=>{try{r(!localStorage.getItem("spindepth_cookie_consent"))}catch(e){}let e=()=>r(!1);return window.addEventListener("sd:consent",e),()=>window.removeEventListener("sd:consent",e)},[]),(0,i.useEffect)(()=>{if(!e)return;let n=C.current;n&&(n.scrollTop=n.scrollHeight)},[d,u,e,x]),(0,i.useEffect)(()=>{if(!e)return;let t=e=>{"Escape"===e.key&&n(!1)};document.addEventListener("keydown",t);let a=setTimeout(()=>{var e;return null==(e=S.current)?void 0:e.focus()},120);return()=>{document.removeEventListener("keydown",t),clearTimeout(a)}},[e]),(0,i.useEffect)(()=>{if(!e||!t)return;let n=e=>{fetch("/api/chat/presence",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:J(),typing:e,pagePath:window.location.pathname}),keepalive:!0}).catch(()=>{})};n(!1);let a=setInterval(()=>{var e;return n(!!(null==(e=S.current)?void 0:e.value))},15e3),s=()=>{var e,n;let t=new Blob([JSON.stringify({sessionId:J(),gone:!0})],{type:"application/json"});null==(e=(n=navigator).sendBeacon)||e.call(n,"/api/chat/presence",t)};return window.addEventListener("pagehide",s),()=>{clearInterval(a),window.removeEventListener("pagehide",s),s()}},[e,t]),t?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:'\n        .sa-panel {\n          position: fixed; right: 20px; z-index: 481;\n          bottom: calc(20px + env(safe-area-inset-bottom, 0px));\n          width: min(400px, calc(100vw - 40px)); height: min(560px, calc(100vh - 120px));\n          display: flex; flex-direction: column; overflow: hidden;\n          background: #0B0E10; border: 1px solid rgba(255,255,255,.14);\n          border-radius: 18px; box-shadow: 0 24px 64px rgba(0,0,0,.6);\n          font-family: Inter, system-ui, sans-serif;\n        }\n        .sa-panel[data-raised="true"] { bottom: calc(128px + env(safe-area-inset-bottom, 0px)); }\n\n        .sa-top {\n          display: flex; align-items: center; justify-content: space-between;\n          padding: 14px 16px; border-bottom: 1px solid rgba(255,255,255,.1); flex-shrink: 0;\n        }\n        .sa-title { font-size: 13px; font-weight: 600; color: #fff; margin: 0; }\n        .sa-acts { display: flex; align-items: center; gap: 2px; margin: -8px -8px -8px 0; }\n\n        /* These rules went missing in an earlier edit and took the close button\n           with them: it kept rendering, at the 17px of its own icon, which is\n           why there was nothing to hit on de
1sktop. */\n        .sa-icon {\n          width: 40px; height: 40px; flex-shrink: 0;\n          display: inline-flex; align-items: center; justify-content: center;\n          background: none; border: none; border-radius: 10px; cursor: pointer;\n          color: rgba(255,255,255,.55);\n          transition: color .2s ease, background-color .2s ease;\n        }\n        .sa-icon:hover { color: #fff; background: rgba(255,255,255,.09); }\n        .sa-icon svg { width: 17px; height: 17px; }\n\n        /* Lead form */\n        .sa-lead { padding: 0 16px 14px; flex-shrink: 0; }\n        .sa-lead-in { display: flex; flex-direction: column; gap: 8px; }\n        .sa-lead-f {\n          height: 42px; padding: 0 13px; border-radius: 10px; width: 100%;\n          background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.16);\n          color: #fff; font-family: inherit; font-size: 16px;\n        }\n        .sa-lead-f::placeholder { color: rgba(255,255,255,.34); }\n        .sa-lead-f:focus { outline: 2px solid #6C5CE7; outline-offset: 1px; border-color: transparent; }\n        .sa-lead-f[aria-invalid="true"] { border-color: #E06B6B; }\n        .sa-lead-go {\n          min-height: 44px; border-radius: 999px; border: none; cursor: pointer;\n          background: #6C5CE7; color: #fff; font-family: inherit;\n          font-size: 13px; font-weight: 600;\n          transition: background-color .2s ease;\n        }\n        .sa-lead-go:hover:not(:disabled) { background: #5B4BD6; }\n        .sa-lead-go:disabled { opacity: .45; cursor: not-allowed; }\n        .sa-lead-skip {\n          background: none; border: none; cursor: pointer; padding: 4px;\n          color: rgba(255,255,255,.4); font-family: inherit; font-size: 12px;\n          text-decoration: underline; text-underline-offset: 2px;\n        }\n        .sa-lead-skip:hover { color: rgba(255,255,255,.75); }\n        .sa-lead-err { font-size: 12px; color: #FFAEAE; margin: 0; line-height: 1.5; }\n\n        /* The launcher is the whole invitation: a line of type, not an icon.\n           A generic round "Ask" bubble is what every site has, and it says\n           nothing. This says what Labros is for before anyone clicks.\n\n           Deliberately off-brand in colour. #1FD9B2 is SpinDepth\'s own voice;\n           an assistant wearing it reads as the firm talking. Bone and violet\n           keep it clearly a separate thing on a black page. */\n        .sa-launch {\n          position: fixed; right: 20px; z-index: 480;\n          bottom: calc(20px + env(safe-area-inset-bottom, 0px));\n          max-width: min(330px, calc(100vw - 40px));\n          display: inline-flex; align-items: center; gap: 10px;\n          padding: 13px 18px 13px 15px; min-height: 48px;\n          border-radius: 14px; border-bottom-right-radius: 5px;\n          background: #F2F0EB; color: #111418;\n          border: 1px solid rgba(0,0,0,.08);\n          text-align: left; cursor: pointer;\n          font-family: Inter, system-ui, sans-serif; font-size: 13.5px; line-height: 1.4;\n          box-shadow: 0 12px 34px rgba(0,0,0,.5);\n          transition: transform .2s ease, box-shadow .2s ease;\n          animation: sa-rise .5s cubic-bezier(.22,1,.36,1);\n        }\n        .sa-launch[data-raised="true"] { bottom: calc(128px + env(safe-area-inset-bottom, 0px)); }\n        .sa-launch:hover { transform: translateY(-2px); box-shadow: 0 16px 40px rgba(0,0,0,.6); }\n        .sa-launch-text { min-width: 0; }\n        .sa-launch b { color: #5B4BD6; font-weight: 650; }\n        .sa-launch-dot {\n          width: 8px; height: 8px; flex-shrink: 0; border-radius: 50%;\n          background: #6C5CE7; box-shadow: 0 0 0 4px rgba(108,92,231,.18);\n          animation: sa-pulse 2.6s ease-in-out infinite;\n        }\n        @keyframes sa-pulse {\n          0%,100% { box-shadow: 0 0 0 4px rgba(108,92,231,.18); }\n          50%     { box-shadow: 0 0 0 7px rgba(108,92,231,.06); }\n        }\n        @keyframes sa-rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }\n        @media (prefers-reduced-motion: reduce) {\n          .sa-launch, .sa-launch-dot { animation: none; transition: none; }\n        }\n        @media (max-width: 520px) {\n          .sa-launch { right: 12px; left: 12px; max-width: none; }\n        }\n\n        .sa-body { flex: 1; overflow-y: auto; overscroll-behavior: contain; padding: 16px; }\n        .sa-row { display: flex; margin-bottom: 12px; }\n        .sa-row[data-me="true"] { justify-content: flex-end; }\n        .sa-bubble {\n          max-width: 84%; padding: 10px 13px; border-radius: 14px;\n          font-size: 13.5px; line-height: 1.6; white-space: pre-wrap; word-break: break-word;\n        }\n        .sa-row[data-me="true"] .sa-bubble { background: #6C5CE7; color: #fff; border-bottom-right-radius: 5px; }\n        .sa-row[data-me="false"] .sa-bubble {\n          background: rgba(255,255,255,.06); color: rgba(255,255,255,.88);\n          border: 1px solid rgba(255,255,255,.08); border-bottom-left-radius: 5px;\n        }\n        .sa-link { color: #A99BFF; text-decoration: underline; text-underline-offset: 2px; }\n\n        .sa-dots { display: inline-flex; gap: 4px; padding: 4px 2px; }\n        .sa-dots i {\n          width: 6px; height: 6px; border-radius: 50%; background: rgba(255,255,255,.5);\n          animation: sa-b 1.2s infinite ease-in-out;\n        }\n        .sa-dots i:nth-child(2) { animation-delay: .15s; }\n        .sa-dots i:nth-child(3) { animation-delay: .3s; }\n        @keyframes sa-b { 0%,80%,100% { opacity:.25; transform: translateY(0); } 40% { opacity:1; transform: translateY(-3px); } }\n\n        .sa-chips { display: flex; flex-wrap: wrap; gap: 7px; padding: 0 16px 12px; flex-shrink: 0; }\n        .sa-chip {\n          font-size: 12px; padding: 8px 12px; min-height: 34px; border-radius: 999px; cursor: pointer;\n          background: rgba(255,255,255,.05); color: rgba(255,255,255,.72);\n          border: 1px solid rgba(255,255,255,.14);\n          transition: color .2s ease, border-color .2s ease;\n        }\n        .sa-chip:hover { color: #fff; border-color: rgba(255,255,255,.4); }\n\n        .sa-err { padding: 0 16px 10px; font-size: 12px; color: #ff9b9b; }\n\n        .sa-foot { display: flex; gap: 8px; padding: 12px 16px 16px; border-top: 1px solid rgba(255,255,255,.1); flex-shrink: 0; }\n        .sa-in {\n          flex: 1; min-width: 0; height: 44px; padding: 0 14px; border-radius: 999px;\n          background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.16);\n          color: #fff; font-family: inherit; font-size: 16px;\n        }\n        .sa-in::placeholder { color: rgba(255,255,255,.36); }
1\n        .sa-in:focus { outline: 2px solid #6C5CE7; outline-offset: 1px; border-color: transparent; }\n        .sa-send {\n          width: 44px; height: 44px; flex-shrink: 0; border-radius: 50%; cursor: pointer;\n          display: grid; place-items: center; border: none;\n          background: #6C5CE7; color: #fff; transition: background-color .2s ease;\n        }\n        .sa-send:hover:not(:disabled) { background: #5B4BD6; }\n        .sa-send:disabled { opacity: .4; cursor: not-allowed; }\n\n        @media (max-width: 520px) {\n          .sa-panel { right: 12px; left: 12px; width: auto; height: min(72vh, calc(100vh - 96px)); }\n        }\n        @media (prefers-reduced-motion: reduce) {\n          .sa-panel, .sa-chip, .sa-send, .sa-x { transition: none; }\n          .sa-dots i { animation: none; }\n        }\n      '}),!e&&(0,a.jsxs)("button",{type:"button",className:"sa-launch","data-raised":o,onClick:()=>{n(!0),(0,h.u4)("assistant_open",{form_name:"labros"})},"aria-label":"".concat(l," Open Labros."),children:[(0,a.jsx)("span",{className:"sa-launch-dot","aria-hidden":"true"}),(0,a.jsxs)("span",{className:"sa-launch-text",children:[(0,a.jsx)("b",{children:"Labros"})," ",l]})]}),e&&(0,a.jsxs)("div",{className:"sa-panel","data-raised":o,role:"dialog","aria-label":"Labros, the SpinDepth assistant",children:[(0,a.jsxs)("div",{className:"sa-top",children:[(0,a.jsx)("p",{className:"sa-title",children:"Labros"}),(0,a.jsxs)("div",{className:"sa-acts",children:[(0,a.jsx)("button",{type:"button",className:"sa-icon",onClick:function(){c([]),y(null),v({name:"",email:""}),j("idle"),m(""),b(!1),f(!1);try{sessionStorage.removeItem(K),sessionStorage.removeItem(U)}catch(e){}(0,h.u4)("assistant_reset",{form_name:"labros"})},"aria-label":"Start a new conversation",title:"Start again",children:(0,a.jsxs)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:[(0,a.jsx)("path",{d:"M3 12a9 9 0 1 0 3-6.7L3 8"}),(0,a.jsx)("path",{d:"M3 3v5h5"})]})}),(0,a.jsx)("button",{type:"button",className:"sa-icon",onClick:()=>n(!1),"aria-label":"Close Labros",title:"Close",children:(0,a.jsx)("svg",{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round","aria-hidden":"true",children:(0,a.jsx)("path",{d:"M18 6 6 18M6 6l12 12"})})})]})]}),(0,a.jsxs)("div",{className:"sa-body",ref:C,children:[(0,a.jsx)("div",{className:"sa-row","data-me":!1,children:(0,a.jsx)("div",{className:"sa-bubble",children:(0,a.jsx)(H,{text:"I am Labros. Tell me what you are working on and I will point you at the right part of SpinDepth, or put you in front of someone who can."})})}),d.map(e=>(0,a.jsx)("div",{className:"sa-row","data-me":"user"===e.role,children:(0,a.jsx)("div",{className:"sa-bubble",children:(0,a.jsx)(H,{text:e.content})})},e.id)),u&&(0,a.jsx)("div",{className:"sa-row","data-me":!1,children:(0,a.jsx)("div",{className:"sa-bubble",children:(0,a.jsxs)("span",{className:"sa-dots",role:"status","aria-label":"Thinking",children:[(0,a.jsx)("i",{}),(0,a.jsx)("i",{}),(0,a.jsx)("i",{})]})})}),(0,a.jsx)("div",{ref:N})]}),g&&(0,a.jsx)("p",{className:"sa-err",role:"alert",children:"Labros could not answer that one. Please try again."}),!d.length&&!u&&(0,a.jsx)("div",{className:"sa-chips",children:O.map(e=>(0,a.jsx)("button",{type:"button",className:"sa-chip",onClick:()=>B(e),children:e},e))}),"done"===x&&"shared"!==k&&(0,a.jsx)("div",{className:"sa-chips",children:(0,a.jsx)("button",{type:"button",className:"sa-chip",onClick:function(){if(!("geolocation"in navigator))return void j("refused");j("asking"),navigator.geolocation.getCurrentPosition(async e=>{try{await fetch("/api/chat/location",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({sessionId:J(),latitude:e.coords.latitude,longitude:e.coords.longitude,accuracy:e.coords.accuracy})}),j("shared"),I("Thank you. That goes to the team with your ticket."),(0,h.u4)("location_shared",{form_name:"labros"})}catch(e){j("refused")}},()=>{j("refused"),I("No problem at all. Which market are you in, and I will note it by hand?")},{enableHighAccuracy:!0,timeout:12e3,maximumAge:0})},disabled:"asking"===k,children:"asking"===k?"Waiting for your browser…":"refused"===k?"Try sharing location again":"Share my location so the right regional team picks this up"})}),(0,a.jsxs)("form",{className:"sa-foot",onSubmit:e=>{e.preventDefault(),B(p)},children:[(0,a.jsx)("input",{ref:S,className:"sa-in",value:p,onChange:e=>
1m(e.target.value),placeholder:"email"===x?"[email protected]":"name"===x?"Your full name":"company"===x?"Company, or skip":"Ask a question","aria-label":T?"Your answer":"Your question",maxLength:1500,disabled:u}),(0,a.jsx)("button",{type:"submit",className:"sa-send",disabled:u||!p.trim(),"aria-label":"Send",children:(0,a.jsx)("svg",{width:"17",height:"17",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:(0,a.jsx)("path",{d:"M5 12h14M12 5l7 7-7 7"})})})]})]})]}):null}function G(e){let{onComplete:n}=e,[t,s]=(0,i.useState)("logo"),[o,r]=(0,i.useState)(!1),l=(0,i.useRef)(n);(0,i.useEffect)(()=>{l.current=n}),(0,i.useEffect)(()=>{let e=setTimeout(()=>s("logoExit"),1400),n=setTimeout(()=>s("text"),1850),t=setTimeout(()=>s("exit"),3900),a=setTimeout(()=>l.current(),4600);return()=>{clearTimeout(e),clearTimeout(n),clearTimeout(t),clearTimeout(a)}},[]);let d="logo"===t,c="text"===t,p=e=>({fontFamily:"Inter, sans-serif",fontSize:"clamp(17px, 2.3vw, 30px)",fontWeight:300,letterSpacing:"0.025em",lineHeight:1.65,color:"rgba(255,255,255,0.76)",textAlign:"center",margin:0,opacity:+!!c,transform:c?"translateY(0)":"translateY(10px)",transition:c?"opacity 0.6s ease ".concat(e,"ms, transform 0.6s ease ").concat(e,"ms"):"none"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("style",{children:"\n@keyframes sd-logo-enter {\n  from { opacity: 0; transform: scale(0.97); }\n  to   { opacity: 1; transform: scale(1);    }\n}\n@keyframes sd-drift-a {\n  0%,100% { transform: scale(1)    translate(0, 0);     }\n  50%     { transform: scale(1.09) translate(2%, 1.5%); }\n}\n@keyframes sd-drift-b {\n  0%,100% { transform: scale(1)    translate(0, 0);      }\n  50%     { transform: scale(1.06) translate(-1.5%, -2%);}\n}\n"}),(0,a.jsxs)("div",{role:"presentation","aria-hidden":"true",style:{position:"fixed",inset:0,zIndex:9999,overflow:"hidden",opacity:+("exit"!==t),transition:"exit"===t?"opacity 0.8s cubic-bezier(0.4, 0, 0.2, 1)":"none",background:"#06090d",pointerEvents:"exit"===t?"none":"all"},children:[(0,a.jsx)("div",{style:{position:"absolute",inset:0,background:"linear-gradient(168deg, #08111c 0%, #060d16 40%, #050b10 70%, #06090d 100%)"}}),(0,a.jsxs)("div",{"aria-hidden":"true",style:{position:"absolute",inset:0,overflow:"hidden"},children:[(0,a.jsx)("div",{style:{position:"absolute",bottom:"-35%",left:"-10%",width:"120%",height:"75%",background:"radial-gradient(ellipse 70% 55% at 50% 100%, rgba(31,217,178,0.10) 0%, transparent 72%)",filter:"blur(64px)",animation:"sd-drift-a 22s ease-in-out infinite",willChange:"transform"}}),(0,a.jsx)("div",{style:{position:"absolute",top:"-25%",right:"-10%",width:"75%",height:"75%",background:"radial-gradient(ellipse at 60% 40%, rgba(38,68,210,0.08) 0%, transparent 68%)",filter:"blur(90px)",animation:"sd-drift-b 28s ease-in-out infinite",willChange:"transform"}}),(0,a.jsx)("div",{style:{position:"absolute",inset:0,background:"radial-gradient(ellipse 75% 65% at 50% 50%, transparent 28%, rgba(0,0,0,0.65) 100%)"}})]}),(0,a.jsxs)("div",{style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",zIndex:1},children:[(0,a.jsxs)("div",{onAnimationEnd:()=>r(!0),style:{position:"absolute",fontFamily:"Inter, sans-serif",fontWeight:700,fontSize:"clamp(30px, 5vw, 56px)",letterSpacing:"-0.03em",lineHeight:1,userSelect:"none",...o?{opacity:+!!d,transform:d?"translateY(0)":"translateY(-8px)",transition:"opacity 0.4s ease, transform 0.4s ease"}:{opacity:0,animation:"sd-logo-enter 0.85s cubic-bezier(0.22, 1, 0.36, 1) 0.15s forwards"}},children:[(0,a.jsx)("span",{style:{color:"#fff"},children:"Spin"}),(0,a.jsx)("span",{style:{color:"#1FD9B2"},children:"Depth"})]}),(0,a.jsxs)("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",padding:"0 clamp(32px, 8vw, 120px)",gap:"0",width:"100%",maxWidth:"680px"},children:[(0,a.jsx)("p",{style:p(0),children:"Global Leadership in Sports,"}),(0,a.jsx)("p",{style:p(150),children:"Entertainment, and Culture."})]})]})]})]})}let V=new Set(["/","/contact","/careers","/news","/services","/privacy","/terms","/cookies"]),$="sd_intro_seen_at";function Q(e){let{children:n}=e,t=(0,s.usePathname)()||"/",o="/"===t,r=t.startsWith("/news/"),l=t.startsWith("/services/"),d=V.has(t)||r||l,[c,p]=(0,i.useState)(!o);return(0,i.useEffect)(()=>
1{if(!o)return void p(!0);(function(){try{let e=Number(localStorage.getItem($));return Number.isFinite(e)&&e>0&&Date.now()-e<864e5}catch(e){return!1}})()&&p(!0)},[o]),(0,a.jsxs)("div",{className:"min-h-screen flex flex-col relative",style:{background:o?"#000":"#050505"},children:[(0,a.jsx)("a",{href:"#main",className:"sd-skip",children:"Skip to main content"}),(0,a.jsx)("style",{children:"\n        /* The document itself is dark.\n           The design tokens describe a light product surface, so the shared\n           stylesheet paints the body warm cream. Every section of this site\n           paints its own dark ground on top, which hid that everywhere except\n           the one place nothing was painted: the strip of padding that holds\n           editorial pages clear of the fixed header. A reader landing on a\n           legal page saw a cream band across the top with the header's white\n           type invisible on it. It also showed as a cream flash when a scroll\n           was over-thrown at either end of the page. */\n        html, body { background-color: #050505; }\n\n        .sd-skip {\n          position: absolute; left: 16px; top: -60px; z-index: 300;\n          font-family: Inter, sans-serif; font-size: 13px; font-weight: 500;\n          background: #1FD9B2; color: #04201B; padding: 12px 20px; border-radius: 999px;\n          text-decoration: none; transition: top .2s ease;\n        }\n        .sd-skip:focus { top: 16px; }\n        /* One visible focus treatment for everything interactive. */\n        a:focus-visible, button:focus-visible, input:focus-visible,\n        textarea:focus-visible, select:focus-visible, [tabindex]:focus-visible {\n          outline: 2px solid #1FD9B2;\n          outline-offset: 3px;\n          border-radius: 6px;\n        }\n      "}),(0,a.jsx)(b,{}),(0,a.jsx)("main",{id:"main",className:"flex-1 relative z-10",style:d?void 0:{paddingTop:"var(--sd-header, 64px)"},children:n}),(0,a.jsx)(z,{}),c&&(0,a.jsx)(_,{}),c&&(0,a.jsx)(X,{}),o&&!c&&(0,a.jsx)(G,{onComplete:function(){try{localStorage.setItem($,String(Date.now()))}catch(e){}p(!0)}})]})}},22144:(e,n,t)=>{"use strict";t.d(n,{Bg:()=>a,Uq:()=>s});let a=[{slug:"cfd-forex-brokers",name:"CFD and Forex Brokers",short:"CFD and Forex",promise:"Regulated growth in markets where trust decides the trade.",problem:"Brokers entering Southeast Asia compete on spreads and platforms, but win or lose on credibility. Regulatory scrutiny is rising, paid acquisition is saturated, and traders increasingly choose the name they have seen treated seriously by the financial press.",approach:"We build the credibility layer first: editorial placement in the outlets traders actually read, analyst-grade commentary that stands up to compliance review, and sponsorship properties that put the brand in front of a mass audience without a single performance claim.",deliverables:["Editorial placement across regional financial media","Compliance-aware brand and market commentary","Sports and event sponsorship activation","Creator programs built for regulated categories"],newsQuery:"forex"},{slug:"payment-service-providers",aliases:["payment-providers"],name:"Payment Service Providers",short:"Payments",promise:"Category authority in the region rewriting how money moves.",problem:"Payments in Southeast Asia is a land grab. Wallets, acquirers and cross-border rails are fighting for the same merchants, and most messaging collapses into identical claims about speed and coverage.",approach:"We move the conversation from features to infrastructure. Data-led editorial, merchant and corridor storytelling, and executive positioning that makes the brand the reference point journalists call when the market shifts.",deliverables:["Corridor and merchant case storytelling","Executive positioning and media training support","Data-led editorial and market commentary","Partner and ecosystem announcement strategy"],newsQuery:"payments"},{slug:"crypto",aliases:["crypto-and-digital-assets"],name:"Crypto and Digital Assets",short:"Crypto",promise:"Serious coverage for a category tired of being dismissed.",problem:"Digital asset businesses carry the reputational weight of the last cycle. Mainstream finance desks are sceptical, regulators are active, and hype marketing now actively damages enterprise credibility.",approach:"We treat digital assets as a financial story, not a hype story. Regulatory literacy, exch
1ange and stablecoin reporting, and campaign work that reaches culture through sport and entertainment rather than speculative promises.",deliverables:["Regulatory and policy narrative development","Tier-one financial media relations","Culture-led brand activation through sport","Research and market intelligence publishing"],newsQuery:"crypto"},{slug:"neobanks",name:"Neobanks and Digital Banks",short:"Neobanks",promise:"Mass reach without losing the trust a bank has to earn.",problem:"A digital bank has to feel exciting enough to switch to and safe enough to hold a salary. Most campaigns pick one and sacrifice the other, and acquisition costs climb as the category crowds.",approach:"We split the work: culture and sport carry the reach and the excitement, editorial and analyst-facing communications carry the trust. Both run on one campaign logic so the brand reads consistently in a stadium and in the business pages.",deliverables:["Sports and entertainment sponsorship activation","Creator campaigns across core APAC markets","Financial press and analyst relations","Launch and market entry campaign design"],newsQuery:"neobank"},{slug:"regtech",aliases:["regtech-and-saas"],name:"RegTech and Financial SaaS",short:"RegTech",promise:"Demand generation for products with a long, technical sale.",problem:"Compliance and infrastructure software sells to committees, not individuals. The buying group is small, sceptical and hard to reach through conventional media buying.",approach:"We build authority assets the buying committee circulates internally: original research, regulatory explainers, and executive commentary placed where risk and compliance leaders already read.",deliverables:["Original research and industry benchmarking","Regulatory explainer and thought leadership programs","Conference, panel and speaking placement","Account-focused editorial distribution"],newsQuery:"regulation"},{slug:"financial-education",name:"Financial Education",short:"Education",promise:"Programs that teach first and convert because of it.",problem:"Financial education is the most effective acquisition channel in emerging markets and the most badly executed. Most of it is thinly disguised sales material, and audiences recognise it instantly.",approach:"We build genuine curriculum and workshop programs, then distribute them through creators, campus networks and regional media so the education itself becomes the marketing.",deliverables:["Workshop and seminar program design","Curriculum and educational content production","Creator-led distribution across APAC","Campus and community partnership building"],newsQuery:"education"}];function s(e){let n=(e||"").replace(/^#/,"").trim().toLowerCase();return n?a.findIndex(e=>e.slug===n||(e.aliases||[]).some(e=>e.toLowerCase()===n)):-1}},25038:(e,n,t)=>{"use strict";t.d(n,{$8:()=>a,AC:()=>i,AM:()=>r,JW:()=>s,R:()=>o});let a=[{slug:"reputation",name:"Media and reputation",kicker:"PR. Editorial. Search. Trust.",line:"What the region publishes about a brand, and what a market finds when it checks. The two are the same job.",items:["TrustFinance, WikiFX and FastBull","Regional press distribution","Local-language writing","Search and ongoing monitoring"],image:"/access/press-newspapers.jpg",alt:"A stack of business newspapers",focus:"52% 46%",href:"/services/reputation",title:"Media and Reputation | SpinDepth",metaDescription:"Press distribution and reputation across nine Asian markets: TrustFinance, WikiFX and FastBull, 700+ outlets from BBC Thai to the Philippine Daily Inquirer, written locally in each market rather than translated.",headline:"Reputation is what the market finds without you.",intro:"Before a partner signs, a regulator reviews or a customer converts, someone searches the name. What they find is the review platforms the category checks and whatever the region’s own desks have published. Both are media problems, so they are run as one job rather than two.",stats:[],blocks:[],next:[{label:"Culture and talent",href:"/services/celebrities",meta:"Give the story a face"},{label:"Experiences",href:"/services/events",meta:"Meet the market in person"}]},{slug:"football",name:"Football",kicker:"Players. Clubs. Leagues. Stadiums.",line:"Legend rosters, club and league inventory, the shirt itself and the perimeter around the pitch.",items:["Player and legend access","Club and league inventory","Kit, sleeve and LED","Hospital
1ity and appearances"],image:"/access/football-hero.jpg",alt:"Footballer photographed during a match",focus:"50% 32%",href:"/services/football",title:"Football | SpinDepth",metaDescription:"Football sponsorship access: legend rosters, Premier League and La Liga inventory, Saudi club access, kit and sleeve placement, stadium LED, and the campaign built around it.",headline:"Football is more than placement.",intro:"A rights broker sells you the board. We attach the player, produce the content, place the story and push it into the region that matters to you.",stats:[{value:"180+",label:"Premier League broadcast territories"},{value:"11",label:"Legends on the roster"},{value:"90 min",label:"Continuous in-frame LED exposure"}],blocks:[{n:"01",title:"Sponsorship",line:"Perimeter, kit or stadium placement secured."},{n:"02",title:"Talent",line:"Players and legends attached to the campaign."},{n:"03",title:"Content",line:"Film and stills produced around the asset."},{n:"04",title:"Media",line:"Regional press distribution across nine markets."},{n:"05",title:"Audience",line:"Creator amplification into Southeast Asia."}],next:[{label:"Culture and talent",href:"/services/celebrities",meta:"Korean entertainment, ambassadors and production"},{label:"Experiences",href:"/services/events",meta:"Hospitality, activation and live programmes"}]},{slug:"celebrities",name:"Culture",kicker:"Korean talent. Campaigns. Appearances.",line:"Direct relationships with Korea’s leading entertainment companies, and the production to build a campaign around them.",items:["Idol and actor ambassadorship","Korean TVC production","Name and likeness licensing","Fan events and appearances"],image:"/access/kculture-stage.jpg",alt:"A K-pop group performing on stage under stage lighting",focus:"50% 46%",href:"/services/celebrities",title:"Culture and Talent | SpinDepth",metaDescription:"Korean entertainment access for brands: idol and actor ambassadorship, full TVC production in Korea, name and likeness licensing, fan events and appearances.",headline:"Access to the culture Asia already follows.",intro:"Direct relationships with Korea’s leading entertainment companies and production houses, so a campaign is cast, shot and delivered inside one line of accountability.",stats:[{value:"6 to 12",label:"Months of typical ambassador licensing"},{value:"9",label:"Markets the campaign is deployed across"},{value:"1",label:"Point of contact from brief to report"}],blocks:[{n:"01",title:"Ambassadorship",line:"Idol or actor licensing, six to twelve months.",img:"/access/kculture-talent.jpg",alt:"An actor photographed at a drama press call"},{n:"02",title:"TVC production",line:"Full Korean commercial shoot, concept to cutdowns.",img:"/access/kculture-shoot.jpg",alt:"A commercial shoot in progress on a lit soundstage"},{n:"03",title:"IP and likeness",line:"Name, face and likeness for product and packaging.",img:"/access/kculture-presscall.jpg",alt:"A drama cast lined up at a press conference"}
1,{n:"04",title:"Appearances",line:"Fan events, press conferences and virtual formats.",img:"/access/kculture-appearance.jpg",alt:"An actor on stage at a public appearance"}],next:[{label:"Media and reputation",href:"/services/reputation",meta:"Carry the campaign into regional editorial"},{label:"Football",href:"/services/football",meta:"The other half of the culture equation"}]},{slug:"events",name:"Experiences",kicker:"Events. Activation. Hospitality.",line:"Business programmes, live activation and hospitality that put a brand in front of the market it is entering.",items:["Business programmes","Roadshows and panels","Brand activation","Client hospitality"],image:"/access/events-workshop.jpg",alt:"Business audience at a SpinDepth market programme session",focus:"50% 42%",href:"/services/events",title:"Experiences and Events | SpinDepth",metaDescription:"Live business programmes and brand activation across Southeast Asia: working sessions, roadshows and assemblies from 50 to 250 attendees, reaching 2,000+ per rollout.",headline:"Reach an audience before it is a market.",intro:"The same programme adapts from a full assembly to a small working session, so a brand can meet a market at whatever scale that market is currently worth.",stats:[{value:"50 to 250",label:"Attendees in a single session"},{value:"2,000+",label:"Reachable across one coordinated rollout"},{value:"5",label:"Markets in a standard programme"}],blocks:[{n:"01",title:"Working session",line:"Small group, hands on, built for depth."},{n:"02",title:"Panel",line:"Moderated format with local industry voices."},{n:"03",title:"Roadshow",line:"Public stand and press across several cities."},{n:"04",title:"Hospitality",line:"Client entertainment and VIP hosting around the asset."}],next:[{label:"Football",href:"/services/football",meta:"Hospitality inside the football calendar"},{label:"Media and reputation",href:"/services/reputation",meta:"Carry the room into the region"}]}];function s(e){return a.find(n=>n.slug===e)}let i=[{name:"Thailand",role:"Home market"},{name:"Singapore",role:"Institutional"},{name:"Vietnam",role:"Fastest growing"},{name:"Indonesia",role:"Largest population"},{name:"Malaysia",role:"Islamic finance"},{name:"Philippines",role:"English speaking"},{name:"South Korea",role:"Entertainment"},{name:"Japan",role:"Tech forward"},{name:"Taiwan",role:"Greater China"}],o=[{market:"Singapore",names:"CNA, Straits Times"},{market:"Thailand",names:"BBC Thai, The Standard"},{market:"Japan",names:"NHK World, Nikkei"},{market:"South Korea",names:"Chosun, JoongAng"},{market:"Indonesia",names:"Kompas, Liputan6"},{market:"Malaysia",names:"The Star, NST"},{market:"Vietnam",names:"VNExpress, Tuoi Tre"},{market:"Philippines",names:"Rappler, Inquirer"},{market:"Taiwan",names:"Taiwan News, DigiTimes"}],r=[{n:"01",title:"Access",line:"The rooms, rosters and inventory that are not on a rate card.",detail:"Legend rosters, club and league inventory, Korean entertainment relationships and a nine-market media network, held directly rather than brokered through a chain of local vendors."},{n:"02",title:"Strategy",line:"What the brand is actually trying to win, and where.",detail:"A single discovery and strategy pass sets the market, the claim the brand can defend and the mix of asset, talent and media that gets there."},{n:"03",title:"Placement",line:"The asset secured, in the competition or the calendar.",detail:"Perimeter, kit, stadium, ambassador licensing or event slot, contracted and scheduled against the campaign window rather than sold as a standalone line item."},{n:"04",title:"Activation",line:"The film, the shoot, the room, the appearance.",detail:"Content built around the asset while it is live: campaign film and stills, Korean TVC production, appearances, hospitality and the live programme around it."},{n:"05",title:"Amplification",line:"Regional press and the creator bench carry it out.",detail:"The story written locally for each market and placed across the network, then pushed by creators into the six Southeast Asian markets on the bench, reported as one campaign."}]},35808:(e,n,t)=>{"use strict";t.d(n,{supabase:()=>u});var a=t(35497),s=t(95704);let i="supabase"!==((void 0!==s&&s.env?s.env.DATA_BACKEND||"mysql":void 0)||"mysql"),o=s.env.NEXT_PUBLIC_SUPABASE_URL||"https://dhcgpwsnjyevgxagexdt.supabase.co",r=s.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||"eyJhbG...TUPI";async function l(){let{createClient:e}=await Promise.resolve().then(t.bind(t,35497));return e(o,r,{auth:{persistSession:!0,autoRefreshToken:!0}})}function d(){try{let e=window.localStorage.getItem("sd_session_token");return e?{Authorization:"Bearer ".concat(e)}:{}}catch(e){return{}}}var c=t(95704);
1let p="supabase"!==(c.env.DATA_BACKEND||"mysql"),h=c.env.NEXT_PUBLIC_SUPABASE_URL||"https://dhcgpwsnjyevgxagexdt.supabase.co",m=c.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY||"eyJhbG...TUPI",u=p?{from:e=>(function(e){let n={table:e,op:"select",columns:"*",where:[],orderBy:[],limitN:void 0,offsetN:void 0,data:void 0,returning:void 0,single:!1,count:!1,head:!1,onConflict:void 0},t=async()=>{if(i){let e={table:n.table,op:n.op,columns:n.columns,where:n.where,orderBy:n.orderBy,limitN:n.limitN,offsetN:n.offsetN,data:n.data,returning:n.returning,count:n.count,onConflict:n.onConflict},t=(()=>{try{return window.localStorage.getItem("sd_session_token")}catch(e){return null}})(),a=await fetch("/api/db",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",...t?{Authorization:"Bearer ".concat(t)}:{}},body:JSON.stringify(e)});return await a.json()}let e=await l(),t=e.from(n.table);for(let e of("select"===n.op&&(t=t.select(n.columns||"*")),n.where))t=t.filter(e.col,e.op,e.val);for(let e of n.orderBy)t=t.order(e.col,{ascending:"desc"!==e.dir});return null!=n.limitN&&(t=t.limit(n.limitN)),null!=n.offsetN&&(t=t.range(n.offsetN,n.offsetN+(n.limitN||10)-1)),"insert"===n.op&&(t=e.from(n.table).insert(n.data)),"upsert"===n.op&&(t=e.from(n.table).upsert(n.data,n.onConflict?{onConflict:n.onConflict}:void 0)),"update"===n.op&&(t=e.from(n.table).update(n.data)),"delete"===n.op&&(t=e.from(n.table).delete()),t},a={select:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"*",t=arguments.length>1?arguments[1]:void 0;return"insert"===n.op?n.returning=e:(n.op="select",n.columns="string"==typeof e?e:"*",t&&"exact"===t.count&&(n.count=!0,n.head=!0===t.head)),a},insert:e=>(n.op="insert",n.data=e,a),upsert:(e,t)=>(n.op="upsert",n.data=e,n.onConflict=null==t?void 0:t.onConflict,a),update:e=>(n.op="update",n.data=e,a),delete:()=>(n.op="delete",a),eq:(e,t)=>(n.where.push({col:e,op:"=",val:t}),a),neq:(e,t)=>(n.where.push({col:e,op:"!=",val:t}),a),gt:(e,t)=>(n.where.push({col:e,op:">",val:t}),a),gte:(e,t)=>(n.where.push({col:e,op:">=",val:t}),a),lt:(e,t)=>(n.where.push({col:e,op:"<",val:t}),a),lte:(e,t)=>(n.where.push({col:e,op:"<=",val:t}),a),in:(e,t)=>(n.where.push({col:e,op:"in",val:t}),a),match:e=>{for(let[t,a]of Object.entries(e))n.where.push({col:t,op:"=",val:a});return a},not:(e,t,s)=>(n.where.push({col:e,op:"is"===t&&null===s?"isnot":"eq"===t?"!=":t,val:s}),a),ilike:(e,t)=>(n.where.push({col:e,op:"ilike",val:t}),a),like:(e,t)=>(n.where.push({col:e,op:"like",val:t}),a),is:(e,t)=>(n.where.push({col:e,op:null===t?"is":"=",val:t}),a),or:e=>(n.where.push({col:"",op:"or",val:e}),a),order:(e,t)=>(n.orderBy.push({col:e,dir:t&&!1===t.ascending?"desc":"asc"}),a),limit:e=>(n.limitN=e,a),range:(e,t)=>(n.offsetN=e,n.limitN=t-e+1,a),single:()=>(n.single=!0,a),maybeSingle:()=>(n.single=!0,a),then:(e,a)=>t().then(t=>{var a,s,i,o,r;if(n.count&&t&&(void 0!==t.count||void 0!==t.error))return e({count:null!=(a=t.count)?a:0,error:null!=(s=t.error)?s:null});let l=t&&(void 0!==t.data||void 0!==t.error)?t:{data:null!=(i=null==t?void 0:t.data)?i:t,error:null!=(o=null==t?void 0:t.error)?o:null};return n.single&&Array.isArray(l.data)&&(l={...l,data:null!=(r=l.data[0])?r:null}),e(l)},a)};return a})(e),rpc:async function(e){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(i){let{rpc:a}=await Promise.all([t.e(9268),t.e(485),t.e(5183)]).then(t.bind(t,65183));return a(e,n)}return(await l()).rpc(e,n)},storage:{from:e=>({upload:async(n,t)=>{let a=new FormData;return a.append("bucket",e),a.append("path",n),a.append("file",t),(await fetch("/api/storage",{method:"POST",body:a,headers:d()})).json()},getPublicUrl:n=>({data:{publicUrl:"/uploads/".concat(e,"/").concat(n)}}),remove:async n=>(await fetch("/api/storage",{method:"DELETE",headers:{"Content-Type":"application/json",...d()},body:JSON.stringify({bucket:e,paths:n})}),{data:{},error:null})})}}:(0,a.createClient)(h,m,{auth:{storage:window.localStorage,persistSession:!0,autoRefreshToken:!0}})},69740:(e,n,t)=>{"use strict";t.r(n),t.d(n,{default:()=>r});var a=t(95155),s=t(52619),i=t.n(s),o=t(12115);let r=(0,o.forwardRef)(function(e,n){let{prefetch:t,onMouseEnter:s,onTouchStart:r,onFocus:l,...d}=e,[c,p]=(0,o.useState)(!1);return(0,a.jsx)(i(),{ref:n,...d,prefetch:!1!==t&&!!c&&(null!=t?t:null),onMouseEnter:e=>{c||p(!0),null==s||s(e)},onTouchStart:e=>{c||p(!0),null==r||r(e)},onFocus:e=>{c||p(!0),null==l||l(e)}})})},74662:(e,n,t)=>{Promise.resolve().then(t.bind(t,9998))}},e=>{e.O(0,[5592,2619,5497,5662,9929,4980,8441,1255,7358],()=>e(e.s=74662)),_N_E=e.O()}]);

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