1!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"1.0.0"};var o=(new e.Error).stack;o&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[o]="856602f6-8043-4945-907e-c5dcf2b4eaeb",e._sentryDebugIdIdentifier="sentry-dbid-856602f6-8043-4945-907e-c5dcf2b4eaeb")}catch(s){}}();import{j as e}from"./index-CJ0eVksD.js";import{P as o,a as s,b as t}from"./PolicyPageLayout-BtTAuFJz.js";import{L as n}from"./vendor-react-Cg5IBgwO.js";const a=[{id:"intro",label:"What are cookies?"},{id:"categories",label:"Categories of cookies we use"},{id:"list",label:"Cookies and similar technologies in use"},{id:"control",label:"How to control cookies"},{id:"updates",label:"Updates to this policy"},{id:"contact",label:"Contact us"}];function r(){return e.jsxs(o,{title:"Cookie Policy",lastUpdated:"22 September 2026",tableOfContents:a,metaPath:"/policies/cookies",metaDescription:"How ResoFlow uses cookies and tracking technologies, and how you can control them.",children:[e.jsxs(s,{id:"intro",heading:"1. What are cookies?",children:[e.jsx(t,{children:"Cookies are small text files stored in your browser. We also use similar technologies such as localStorage and session storage. This policy covers all of them. localStorage and session storage are just other small stores your browser keeps on your own device â like cookies, but they are not sent to other websites."}),e.jsx("p",{children:"We use cookies and similar storage technologies to keep you signed in, remember your preferences, understand how the Services are used, and protect against fraud. Some are set by us directly; others are set by trusted third-party providers we embed to run the Services (such as Stripe and Cloudflare)."})]}),e.jsxs(s,{id:"categories",heading:"2. Categories of cookies we use",children:[e.jsxs("p",{children:["We group cookies and similar storage by what they are ",e.jsx("em",{children:"for"}),". A cookie in any category may be set by ResoFlow directly or by a third-party provider we embed."]}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Essential"})," â required for the Services to function: keeping you signed in, processing payments, protecting against fraud and automated abuse, and remembering the preferences that make the dashboard work the way you left it (such as timeline zoom level, view filters, or which collapsible sections are open). You cannot opt out of these and the Services will not work without them. They include the storage used by our cookie-consent tool itself."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Analytics"})," â help us understand which pages and features are used so we can improve the platform. These are ",e.jsx("strong",{children:"non-essential"}),": we do not set them until you accept analytics cookies through the consent banner."]})]}),e.jsxs("p",{children:["Our consent banner therefore offers ",e.jsx("strong",{children:"two controls"}),": essential cookies (always on, because the Services cannot run without them) and analytics cookies (off until you accept). For clarity, the list in the next section still breaks the always-on essential cookies into ",e.jsx("em",{children:"Essential"})," and",e.jsx("em",{children:"Functional"})," sub-groups by what each one does â but both are part of the single always-on essential category and neither can be switched off separately. (Your consent banner labels this always-on category âNecessaryâ â the same thing this policy calls âEssentialâ.)"]}),e.jsxs("p",{children:[e.jsx("strong",{children:"We do not use advertising or cross-site tracking cookies."})," We do not run advertising campaigns, build advertising profiles, or sell your data."]})]}),e.jsxs(s,{id:"list",heading:"3. Cookies and similar technologies in use",children:[e.jsxs("p",{children:["Rather than list every internal storage key, we group what we use by what it is",e.jsx("em",{children:" for"}),". Names may change as we develop the platform and as third parties update their products."]}),e.jsx("h3",{children:"Essential"}),e.jsx("p",{children:"These are required for the Services to work, so they cannot be switched off. We use them to:"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Keep you signed in"})," â your dashboard, staff portal and customer âMy accountâ sessions (set by us and by Google Firebase Authentication; mostly stored in your browser's localStorage rather than as cookies)."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Process payments and prevent fraud"})," â cookies set by"," ",e.jsx("strong",{children:"Stripe"})," on the pages that take a payment (the booking page, event-ticket checkout, gift card purchase, at-table Order & Pay, payment-request links and billing screens)."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Protect against bots and automated abuse"})," â cookies and short-lived challenge tokens set by ",e.jsx("strong",{children:"Cloudflare"})," (including its Turnstile widget) and Firebase App Check."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember your cookie choices"})," â a first-party cookie named"," ",e.jsx("code",{children:"cc_cookie"})," (set by our own self-hosted cookie-consent tool and kept for about 6 months) so we donât ask again. Your choice is stored only in your browser and is not sent to any third party."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember a paired staff-portal device"})," â a first-party cookie named ",e.jsx("code",{children:"resoflow_portal_device"})," (limited to the"," ",e.jsx("code",{children:"/portal"})," path and kept for about a year) so a staff device that has been set up doesnât need re-setup on each visit. This is a security measure and is not shared with anyone."]}),e.jsxs("li",{children:["The same paired-device proof is also kept in that deviceâs localStorage as ",e.jsx("code",{children:"resoflow.staffPortalDeviceToken"})," (a copy of the cookie above, so a version of the staff portal installed to the deviceâs home screen can see it too). It is a security measure, is never used to track anyone, and is removed when the venue revokes the device."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Deliver alerts to a device that has turned them on"})," â when a member of staff (or an owner) turns on push alerts on a device, the browser installs a small ResoFlow âservice workerâ whose only job is to show those alerts (it never caches pages or intercepts requests), and Firebase Cloud Messaging keeps that deviceâs push token in the browserâs own storage (an IndexedDB database named ",e.jsx("code",{children:"firebase-messaging-database"}
1),"). The device also keeps a small record named ",e.jsx("code",{children:"resoflow.pushDevice"})," in localStorage (which venue, and a one-way fingerprint of its token) so it knows alerts are on. All of it is removed when alerts are turned off or the person signs out; a device that has not been used for 60 days is removed automatically."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Return to an alert after signing in"})," â if you open a push notification and need to sign in first, ",e.jsx("code",{children:"resoflow.pendingPushClick"})," ","in that tabâs session storage remembers its app destination, venue and recipient matching details. It contains no sign-in or device token. You choose when to open it, and we check your current access first. The reminder can be dismissed, stops working after 15 minutes, and is cleared when opened or rejected, when you leave the signed-in app or change account or venue, and when it is next checked after expiry. Closing the tab also ends this session storage."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember that a device said ânot nowâ to the app"})," ","â ",e.jsx("code",{children:"resoflow.pwaSetup"})," in the deviceâs localStorage remembers that the one-time âResoFlow on this deviceâ card on Home was snoozed (30 days) or dismissed for good on that device. It is a fact about the device, not a person, and can be reset from Settings â Devices and push."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember which venueâs staff portal this device uses"})," ","â ",e.jsx("code",{children:"resoflow.lastPortalToken"})," in the deviceâs localStorage remembers the last staff-portal link used on that device, so a member of staff who signs out lands back on the right PIN screen rather than a generic sign-in page. It identifies the venueâs portal, not a person, and stays on that device only."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keep a member of staff signed in to the staff portal"})," â after a successful PIN sign-in, the session (who signed in, their role and which venue) is held in that browser tabâs session storage under"," ",e.jsx("code",{children:"staffSession"}),". It belongs to that one tab and is gone the moment the tab is closed or the member of staff signs out."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember you on a venueâs customer pages"})," â when you tick âKeep me signed in on this device for 30 daysâ in a venueâs customer âMy accountâ portal, a sign-in token is stored in your browserâs localStorage under a per-venue key named"," ",e.jsx("code",{children:"resoflow_cprt_<venue>"})," for up to 30 days, so you donât need a fresh sign-in code each time. The same token lets that venueâs booking and table-ordering pages recognise you. It is a sign-in credential: our servers hold only a one-way hash of it, it is separate for each venue, and it is removed when you sign out or it expires."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keep a support conversation on screen after a refresh"})," â when you use the support inbox while signed in to ResoFlow, the conversation being viewed and short-lived links to its attachments are cached in that tabâs session storage under"," ",e.jsx("code",{children:"resoflow.supportThread.<venue>.<conversation>"})," and"," ",e.jsx("code",{children:"resoflow.supportAttachmentUrls.<venue>.<conversation>"}),", so the chat reappears instantly after a page refresh while the live copy loads. Both belong to that one tab, are cleared when you sign out and are gone when the tab closes; the attachment links themselves expire within the hour."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Remember an approved display screen (TV)"})," â when a venue sets up a wall-mounted display (for example a bookings board or a waiting-list screen), two values are stored in that deviceâs localStorage: ",e.jsx("code",{children:"resoflow.tvDisplayDeviceToken"})," (proof that the venue approved this exact screen â a security measure, like the staff-portal device entry above) and ",e.jsx("code",{children:"resoflow.tvScreenMode"})," ","(which board that screen shows). Both stay on the display device only, are never used to track anyone, and are removed when the venue revokes the screen."]}),e.jsxs("li",{children:["Where a venue splits its Orders screen into kitchen and bar screens, the deviceâs chosen screen is stored in that deviceâs localStorage as"," ",e.jsx("code",{children:"resoflow.ordersStationRole"})," â which half of the orders a physical pass screen shows. It stays on that device only, is never used to track anyone, and clearing it simply shows everything again."]}),e.jsxs("li",{children:["When a member of staff taps ",e.jsx("strong",{children:"Assign tables"})," on a booking from a page other than the floor plan, that booking is carried to the floor plan in the tabâs session storage under"," ",e.jsx("code",{children:"resoflow.pendingMultiTableSelect"})," so the table picker opens on it straight away. It is taken the moment the floor plan opens and is gone when the tab closes; it is never used to track anyone."]}),e.jsxs("li",{children:["Each device showing a venueâs Orders screen remembers which layout it shows â Counter, Pass or Wall â as"," ",e.jsx("code",{children:"resoflow.ordersLayout"}),", and a device in the Wall layout remembers its dark-or-light choice as ",e.jsx("code",{children:"resoflow.ordersWallAppearance"}),". Both are facts about that physical screen rather than about a person, stay on that device only, are never used to track anyone, and clearing them simply returns the screen to the Counter layout in the venueâs default colours."]}),e.jsxs("li",{children:["If a venue puts its Orders screen into full screen, that choice is stored on the device as ",e.jsx("code",{children:"resoflow.ordersB
1oardFullscreen"})," â whether the screen at the pass hides the navigation and shows only orders. Like the setting above it is a fact about that screen rather than about a person, stays on that device only, is never used to track anyone, and clearing it simply brings the navigation back."]}),e.jsxs("li",{children:["A venueâs order screens each remember their own sound choices in that deviceâs localStorage: ",e.jsx("code",{children:"resoflow.ordersBoard.sound"})," (how the Orders screen rings for new orders on that screen),"," ",e.jsx("code",{children:"resoflow.ordersBoard.readySound"})," (whether that screen plays ready-order alerts) and ",e.jsx("code",{children:"resoflow.wallPassSound"})," (whether the Orders screenâs Wall layout chimes on that screen). Each is a fact about that physical screen rather than about a person, stays on that device only, and is never used to track anyone."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Protect booking, ordering and sign-in against abuse"})," â a random value named ",e.jsx("code",{children:"resoflow.orderDeviceId"})," is stored in your deviceâs localStorage the first time you use a venueâs online booking, ordering, event, gift-card or customer pages, so our systems can rate-limit unusually high numbers of requests from one device without treating everyone on a shared connection (a venueâs Wi-Fi, a hotel, a mobile network) as one person. It contains no personal information, is never used to track you across sites, and only ever leaves your device as a one-way fingerprint sent with those requests."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keep your table order as you build it"})," â where a venue offers Order & Pay at your table, the dishes you add are saved on your device under a per-venue localStorage key named"," ",e.jsx("code",{children:"resoflow.orderBasket.<venue>"}),", so your order isnât lost if the page reloads. It holds your dish selections only (no personal information), expires three hours after your last change, and is removed when you place your order. Ordering for collection or delivery keeps its own separate basket the same way (",e.jsx("code",{children:"resoflow.orderBasket.<venue>.remote"}),"), under the same three-hour expiry. When a venue offers more than one way to order, the way you chose (to your table, for collection or for delivery) is kept in that browser tabâs session storage under"," ",e.jsx("code",{children:"resoflow.orderChannel.<venue>"})," so the Order tab takes you straight back to it during your visit â it holds only that one word, and it is gone the moment you close the tab."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Spot a sign-in carried onto a different computer"})," â for signed-in venue staff and owners, a small technical description of the deviceâs hardware (for example its processor core count) is stored in localStorage under ",e.jsx("code",{children:"resoflow.deviceHardwareStamp"}),". If a saved sign-in later turns up on clearly different hardware (for example after copying everything to a new computer), we sign it out as a security measure. It contains no personal information, never leaves your device, and is never used to track you."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Recognise a device youâve signed in from before"})," â for signed-in venue staff and owners, a random identifier is stored in localStorage under",e.jsx("code",{children:"resoflow.accountDeviceId"})," so we can tell a device you have used before from a genuinely new one, and only email you about the latter. It is not linked to your hardware, contains no personal information, and is never used to track you."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keep a demonstration venue unlocked on your device"})," â if we have personally given you access to a private demonstration venue, a random access value named ",e.jsx("code",{children:"resoflow.demoAccess.<venue>"})," is stored in your deviceâs localStorage so the demonstration stays unlocked for you on that device. It works like a door key: it contains
1no personal information, is never used to track you, and only ever leaves your device to prove to our systems that this device was given access."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Carry on with your account setup"})," â if we set your venue up with you and you use a setup code, the code is kept on your device under a localStorage key named ",e.jsx("code",{children:"resoflow.setupCodeResume"})," ","while the setup is being applied, so a reload or a new tab can pick it back up. It holds the code only (no personal information), expires after two hours, and is removed as soon as the setup finishes. Three session-storage siblings carry the same setup through the current tab only:"," ",e.jsx("code",{children:"resoflow.setupCode"})," (the code you entered),"," ",e.jsx("code",{children:"resoflow.setupCodeJob"})," (which setup run it started, so a reload reconnects to it) and ",e.jsx("code",{children:"resoflow.setupCodeHint"})," (that a setup is waiting for your venue, and the venueâs name, so the page can introduce itself). Each is gone when the tab closes or once the code has been used."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Show a venueâs pages instantly when you move between them"})," ","â while you use a venueâs public pages (its venue page, booking page, menu, whatâs on and so on), the venueâs public details (its name, opening hours, which pages it offers) are kept in that tabâs session storage under"," ",e.jsx("code",{children:"resoflow.guestBoot.<page>.<venue>"}),", so the next page paints at once while the live copy loads. It holds the venueâs public facts only â never anything about you â and is gone when the tab closes."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Skip a loading screen you have already seen"})," â the first venue page you open in a tab shows a brief loading screen; a yes/no marker in that tabâs session storage (",e.jsx("code",{children:"resoflow.guestSplashSeen"}),") means later pages in the same tab skip it. Gone when the tab closes."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Carry a promo code through sign-up"})," â if you arrive at ResoFlowâs own marketing or sign-up pages by a link that carries a promo code, the code is held in that tabâs session storage under"," ",e.jsx("code",{children:"resoflow.pendingPromoCode"})," until sign-up applies it. It holds the code only, and is gone when the tab closes."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keep your support conversation open"})," â when you start a chat with us on our contact page, your browser tab remembers which conversation is yours and how much of it you have already read. This uses session storage, so it belongs to that one tab and is gone the moment you close it â the next person to use a shared computer never inherits your conversation. The keys are"," ",e.jsx("code",{children:"resoflow.publicSupport.v2"})," (the conversationâs reference, the email address you gave us if you gave one, and a random access value that lets that tab â and only that tab â open the conversation again; a stale entry expires after 90 days),"," ",e.jsx("code",{children:"resoflow.publicSupport.pendingAnonToken"})," (that same random access value, saved a moment BEFORE the conversation is created, so that if the connection drops and you try again you carry on in the same conversation instead of starting a second one nobody can reply to),"," ",e.jsx("code",{children:"resoflow.publicSupport.seen"})," (how many messages you have already read, so the little unread badge on the chat bubble is accurate), and"," ",e.jsx("code",{children:"resoflow.publicSupport.focusedMode"})," (a yes/no marker that you arrived by clicking the link in one of our emails, so the page opens straight into your conversation rather than the marketing page). One further key uses localStorage rather than session storage: if your conversation is passed to a human member of our team before you have given us an email address, its reference and random access value are kept on your device under ",e.jsx("code",{children:"resoflow.publicSupport.thread"})," for up to 7 days â without an email address, that chat is our only way of reaching you, so closing the tab must not lose your only way back to our reply. It is removed as soon as you give us your email address, decline to, or the conversation is closed."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Light or dark mode"})," â the appearance you pick for the dashboard, staff portal or admin panel is stored in that deviceâs localStorage as ",e.jsx("code",{children:"theme"})," so it opens the same way next time. It is a display preference for that device only and is never used to track anyone."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Which homepage to show"})," â the public site remembers whether ResoFlow is in normal or maintenance mode as"," ",e.jsx("code",{children:"homepageMode"})," in localStorage, so a returning visitor does not see the wrong page flash while the live answer loads. It holds one word and nothing about you."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Keeping every open tab signed in together"})," â while you use the dashboard, staff portal or admin panel, your last activity time is written to localStorage as ",e.jsx("code",{children:"resoflow.idleLastActivity.<area>"})," ","so that a click in one tab keeps your other tabs from signing you out for inactivity. It is a timestamp only, shared between your own tabs on that device, and is cleared when you sign out."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Customer portal: âadd your birthdayâ prompt dism
1issed"})," ","â if a venueâs loyalty scheme offers a birthday gift and you close the prompt asking for your birthday, that choice is remembered on your device as ",e.jsx("code",{children:"resoflow_cpbday_<venue>"})," so you are not asked again. It stores a yes/no marker only."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Customer portal: signing out of every tab at once"})," â when you sign out of a venueâs customer portal, a short-lived marker named ",e.jsx("code",{children:"resoflow_cpsobeacon_<venue>"})," is written to localStorage so any other tab you have open for that venue signs out too. It carries no personal data and is overwritten on each sign-out."]})]}),e.jsx("h3",{children:"Functional"}),e.jsxs("p",{children:["These remember small interface choices so the Services behave the way you left them â for example whether sidebars are collapsed, your light/dark appearance, your timeline, floor-plan and list view settings, the date and time window you were viewing, which sections you've expanded, and in-app notices you've dismissed. Preference keys are suffixed with an identifier for the signed-in user (for example ",e.jsx("code",{children:"__user_<id>"}),"), so two people sharing a device keep separate preferences. (The âKeep me signed in on this device for 30 daysâ sign-in token for a venueâs customer pages is a credential, so it is listed under Essential above.)"]}),e.jsx("p",{children:"While you complete a booking on a venue's public booking page, we also temporarily keep the details you've typed into the form (such as your name, contact details and any allergy notes) and, once you've verified it, your email address and the time it was verified, in your browser tab so an accidental refresh doesn't lose them. This stays on your device only, is never shared, and is deleted when you close the tab or complete the booking."}),e.jsx("p",{children:"These are all set by ResoFlow in your browser's localStorage or session storage. The exact names may change as we develop the platform; none are cookies, none are analytics, and none are shared with anyone."}),e.jsx("h3",{children:"Analytics"}),e.jsxs("table",{children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"Name"}),e.jsx("th",{children:"Provider"}),e.jsx("th",{children:"Purpose"}),e.jsx("th",{children:"Expiry"})]})}),e.jsx("tbody",{children:e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("code",{children:"_ga"}),", ",e.jsx("code",{children:"_ga_*"})]}),e.jsx("td",{children:"Google Analytics 4"}),e.jsxs("td",{children:["Aggregate analytics on which pages and features are used."," ",e.jsx("strong",{children:"Not set until you accept analytics cookies"})," through the consent banner â never before, and not at all if you decline."]}),e.jsx("td",{children:"Up to 2 years"})]})})]}),e.jsxs("p",{children:["We also use two ",e.jsx("strong",{children:"cookieless"})," monitoring tools that require no consent because they store nothing on your device:"]}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Sentry"})," â error tracking and, on the signed-in dashboard and staff portal only, session replay. It sets no cookies. On signed-in screens, when an error occurs Sentry may also save a short replay of the moments around it to help us reproduce the fault. All text, form inputs and media are masked in the replay, so we do not see what you typed. Replay never starts on our public marketing, policy or booking pages; if you move from a signed-in screen to one of those pages in the same browser tab, a replay that is already running may carry on recording there, with the same masking. This is used only to diagnose faults, not for analytics or advertising."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Cloudflare Web Analytics"})," â page-view counts and page-load timings on our marketing and public pages, added by Cloudflare (the network in front of our site). It sets no cookies, stores n
1othing on your device and does not track you across other sites; Cloudflare receives the page address, a coarse country and the browser type, and shows us totals only."]})]}),e.jsx("h3",{children:"Cookies set by third parties on their own domains"}),e.jsxs("p",{children:["We embed third-party services â Stripe (payments, on the booking page, event-ticket checkout, gift card purchase, at-table Order & Pay, payment-request links and billing screens) and Cloudflare Turnstile (bot protection on the booking page, and app-wide as the attestation provider for Firebase App Check). As well as the entries listed above, these providers may set their own cookies on their own domains (for example ",e.jsx("code",{children:"js.stripe.com"})," or"," ",e.jsx("code",{children:"challenges.cloudflare.com"}),"). Those cookies are controlled by the respective provider under its own cookie and privacy policy. See our"," ",e.jsx(n,{to:"/policies/subprocessors",className:"text-pink-700 underline hover:text-pink-900",children:"Subprocessors page"})," ","for links to each provider."]}),e.jsx("h3",{children:"Tracking pixels in emails"}),e.jsx("p",{children:"Marketing emails sent through the platform contain a small, invisible image (a âtracking pixelâ) and tagged links. These are not browser cookies, but they are a similar technology: when the email is opened or a link is clicked, they let the sender see that the email was opened and which links were clicked, so it can measure how the email performed. To avoid this, you can set your email program to stop loading remote images, or use the unsubscribe link in any marketing email to stop receiving them. This does not apply to essential service emails (such as booking confirmations or password resets), which we need to send you."})]}),e.jsxs(s,{id:"control",heading:"4. How to control cookies",children:[e.jsx(t,{children:"Analytics cookies are not set until you accept them. You can change your choices at any time through the consent manager, or adjust your browser settings."}),e.jsxs("p",{children:["When you first visit our public site, our cookie-consent banner asks whether you accept analytics cookies. ",e.jsx("strong",{children:"We do not place any analytics cookies (such as Google Analytics) until you accept"})," â if you ignore the banner or decline, no analytics cookies are set. Essential and functional storage is still used, because the Services cannot work without it."]}),e.jsxs("p",{children:["To change your mind later, click the ",e.jsx("strong",{children:"Cookie Preferences"})," link in our footer. Accepting starts analytics on your next page view; declining stops new analytics data immediately (a page refresh fully clears the analytics tool)."]}),e.jsx("p",{children:"You can also manage cookies in your browser:"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Chrome: Settings â Privacy and security â Cookies and other site data."}),e.jsx("li",{children:"Firefox: Settings â Privacy & Security â Cookies and Site Data."}),e.jsx("li",{children:"Safari: Settings â Privacy â Manage Website Data."}),e.jsx("li",{children:"Edge: Settings â Cookies and site permissions â Cookies and site data."})]}),e.jsx("p",{children:"Disabling essential cookies will prevent the Services from working correctly."})]}),e.jsx(s,{id:"updates",heading:"5. Updates to this policy",children:e.jsx("p",{children:'We will update this policy when we add, remove, or change cookies. The "Last updated" date at the top of this page reflects the most recent revision.'})}),e.jsx(s,{id:"contact",heading:"6. Contact us",children:e.jsxs("p",{children:["For questions about cookies, email"," ",e.jsx("a",{href:"mailto:[email protected]",className:"text-pink-700 underline hover:text-pink-900",children:"[email protected]"}),". For the full privacy picture see our"," ",e.jsx(n,{to:"/policies/privacy",className:"text-pink-700 underline hover:text-pink-900",children:"Privacy Policy"}),"."]})})]})}export{r as CookiePolicyPage}; 2//# sourceMappingURL=CookiePolicyPage-N4wUmzt1.js.map
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.