v1.1.12
Security
- Content-Security-Policy header on all responses:
public/_headersnow sets a baseline CSP under/*so every HTML response carries it. Policy is restrictive-by-default (default-src 'self',frame-ancestors 'none',object-src 'none',base-uri 'self',form-action 'self',block-all-mixed-content,upgrade-insecure-requests) with the minimum allowances Astro and the analytics bundle need:'unsafe-inline'onscript-src/style-src(Astro emits inline hydration shims and scoped style blocks),https:onscript-src/connect-src/img-srcfor the third-party analytics endpoint, anddata:onimg-src/font-src. Adds a defense-in-depth layer behind the existing input-sanitization fixes from v1.1.9 / v1.1.11 — if any future XSS vector slipped through, the CSP would block eval, mixed content, framing, and external object loads.
Performance
- Cached focus-trap NodeList in
Header.astro: the mobile-nav focus trap was callingpanel.querySelectorAll(focusableSelector)inside thekeydownhandler on everyTabpress, repeating the same DOM query and risking layout thrashing during rapid keyboard navigation. The query now runs once when the nav opens and is stored in a closure-scopedcachedFocusable; thekeydownbranch reads the cachedNodeListinstead. Same focus-trap semantics, near-zero per-keystroke DOM cost.
UX
- Tactile click feedback on landing-page CTAs and comparison cards:
src/pages/index.astroandsrc/components/CompareCTA.astronow applytransform: scale(0.96)on:activefor.cta-primary,.cta-secondary, and.compare-card, withtransformadded to each element'stransitionlist so the scale eases in / out atvar(--duration-fast)rather than snapping. The:activerule is wrapped in@media (prefers-reduced-motion: no-preference)to honour the reduced-motion contract. Extends the same tactile affordance shipped on the 404 page in v1.1.11 to the primary conversion surfaces on the landing page.
Full changelog: https://github.com/voyvodka/LumaSync-Site/blob/v1.1.12/CHANGELOG.md