From 350a094eb094d1fae26b9dcdec57dd5306a68809 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 29 May 2026 06:31:06 +0000 Subject: [PATCH 1/2] perf/ux: performance, accessibility, and animation improvements - Conditional Calendly CSS/JS load: only included on homepage, eliminating ~80KB of external assets on /blog, /privacy, etc. - Add preconnect hint for assets.calendly.com (homepage only) - Enable shimmer viewport pause: set data-shimmer-viewport-pause after initial IntersectionObserver fires so off-screen iridescent tiles pause their GPU animation - Add skip-to-main-content link for keyboard/screen-reader users with Phosphor-styled CSS in global.css - Services tabs: add ARIA-compliant keyboard navigation (ArrowLeft, ArrowRight, Home, End) per WAI-ARIA tabs pattern - RssFeed: skeleton loader now renders maxItems cards instead of a hardcoded 3, matching the real loaded count - Portfolio marquee: pause animation for prefers-reduced-motion users - Hero scroll indicator: suppress animate-bounce for reduced motion - Contact form: connect field error messages via aria-describedby for improved screen reader announcement --- src/components/sections/Contact.svelte | 9 ++++--- src/components/sections/Portfolio.svelte | 4 ++++ src/components/sections/RssFeed.svelte | 2 +- src/components/sections/Services.svelte | 24 ++++++++++++++++++- src/layouts/BaseLayout.astro | 14 +++++++++-- src/styles/global.css | 30 ++++++++++++++++++++++++ 6 files changed, 76 insertions(+), 7 deletions(-) diff --git a/src/components/sections/Contact.svelte b/src/components/sections/Contact.svelte index 1045853..49416f4 100644 --- a/src/components/sections/Contact.svelte +++ b/src/components/sections/Contact.svelte @@ -359,12 +359,13 @@ required autocomplete="name" aria-invalid={fieldErrors.name ? 'true' : 'false'} + aria-describedby={fieldErrors.name ? 'contact-name-error' : undefined} placeholder="Jane Smith" class="terminal-input" /> {#if fieldErrors.name} -
{fieldErrors.name}
+{fieldErrors.name}
{/if} @@ -402,12 +403,13 @@ autocomplete="email" inputmode="email" aria-invalid={fieldErrors.email ? 'true' : 'false'} + aria-describedby={fieldErrors.email ? 'contact-email-error' : undefined} placeholder="jane@company.com" class="terminal-input" /> {#if fieldErrors.email} -{fieldErrors.email}
+{fieldErrors.email}
{/if} @@ -425,12 +427,13 @@ required rows={5} aria-invalid={fieldErrors.message ? 'true' : 'false'} + aria-describedby={fieldErrors.message ? 'contact-message-error' : undefined} placeholder="Tell me about your consulting or architecture design needs, timeline, and budget..." class="terminal-input terminal-input-textarea" > {#if fieldErrors.message} -{fieldErrors.message}
+{fieldErrors.message}
{/if} diff --git a/src/components/sections/Portfolio.svelte b/src/components/sections/Portfolio.svelte index eed3d6f..a36dbaf 100644 --- a/src/components/sections/Portfolio.svelte +++ b/src/components/sections/Portfolio.svelte @@ -242,6 +242,10 @@ animation: none; opacity: 0; } + + .clients-track { + animation: none; + } } /* Phosphor — clients marquee crawl */ diff --git a/src/components/sections/RssFeed.svelte b/src/components/sections/RssFeed.svelte index f224f7d..810fee7 100644 --- a/src/components/sections/RssFeed.svelte +++ b/src/components/sections/RssFeed.svelte @@ -111,7 +111,7 @@ {#if loading}