This page names what the site stores on your device and why. Buttons — not form fields — control consent toggles in the banner.

Essential storage keeps the site readable and remembers that you dismissed the banner. Functional storage covers map-related preferences; on Tale Vault maps display by default because they are classified strictly functional, even when you reject optional categories.

Analytics storage remains off unless you enable it. This build does not load separate analytics scripts even if enabled — the toggle prepares for future compatibility without silent tracking today.

Cookie name: sg_reader_consent. Format: URL-encoded JSON with keys essential, functional, analytics, v, ts. Max-Age roughly one hundred eighty days. Path /. SameSite Lax. Secure on HTTPS.

LocalStorage mirror: reader_consent_v1 with the same JSON shape for redundancy if cookies are blocked.

Reject all sets analytics false while keeping essential true. Functional remains true for map policy consistency. Accept all sets functional true. Customise lets you mix analytics then Save.

Manage cookies links appear in the footer and on this page via buttons carrying data-manage-cookies. Keyboard focus moves to Save when the panel opens.

Third-party cookies may originate from Google Maps iframes per Google policies. I do not control those names or durations. Consult Google privacy documentation for detail.

Clear cookies through browser settings to reset choices. The banner reappears on next visit until you decide again.

No social media pixels load here. No advertising networks load here. Font CDN requests are not cookies but are network calls you should know about.

Updates to this policy appear on this URL with a revised date. Material changes will not shrink your choices silently.

Email [email protected] with subject "cookie question" if something here disagrees with what you see in developer tools — I want discrepancies reported.

Approach (b) summary: maps are strictly functional and always shown; Reject does not hide map iframes. This paragraph exists so auditors find the policy in one place.

Essential toggle stays on and locked in the panel because the banner cannot function without remembering dismissal.

Functional toggle may appear locked on because maps always load; analytics remains the primary optional choice you control.

Session storage: this site does not use sessionStorage for consent in this build — only cookie and localStorage mirror.

Banner animation: the cookie bar slides up using CSS transforms; no tracking pixels fire when it appears.

Save button writes consent immediately without page reload. Maps already visible remain visible.

Customise opens the panel without navigating away. You can return to reading and decide later.

Browser private mode: consent may not persist between sessions if the browser clears storage on exit — expect the banner again.

Multiple devices: each device maintains its own consent record; I cannot sync choices across your phone and laptop.

Corporate proxies: some employers intercept traffic; map embeds may behave differently on office networks.

Do Not Track: this site does not respond to DNT headers separately because no optional trackers load by default.

Consent version field v=1 allows future schema upgrades without breaking old records.

Timestamp field ts records ISO time of last decision for your reference in developer tools.

Children: no age gate exists because no accounts are created; parents should guide minors browsing any website.

Honesty clause: if I discover undocumented storage later, I will patch this page before sleeping that night if possible.

Screen reader note: cookie panel buttons expose aria-pressed for toggle state.

Keyboard users: Tab through Accept, Reject, Customise, toggles, Save in banner order.

Colour contrast: banner uses dark background and light text for readability at bottom of viewport.

No pre-ticked analytics: analytics defaults off on first visit until you opt in via Accept all or Customise.

Map load timing: iframes inject on DOM ready via main.js regardless of consent branch for functional-always policy.

Cross-page consistency: every page includes the same banner markup and main.js behaviour.

Footer manage link: duplicates the cookies page button so you can reopen settings from any page.

Storage inspection: in Chrome Application tab, look for sg_reader_consent under Cookies and reader_consent_v1 under Local Storage.

Deletion: clearing site data removes both stores; maps reload on next visit with banner showing again.

Future analytics: if I add scripts later, this page and the panel will describe them before deployment.

Questions welcome: I prefer fixing unclear copy over arguing about compliance vocabulary.

Functional-always maps: rejecting optional cookies does not remove Bedok map embeds because they are classified strictly functional for neighbourhood context. Analytics remains the meaningful opt-in choice.

Consent refresh: if you clear cookies, the banner returns. Maps reload automatically under approach (b) once main.js runs.

Third-party transparency: Google Maps may set its own cookies when iframes load. I cannot enumerate them here; check Google policies for current names.

Banner text version: stored consent includes v=1 so future banner copy changes can prompt re-consent if needed.

Accessibility of controls: all cookie buttons are keyboard reachable and expose pressed state on toggles.