Compare commits

...
7 Commits
Author SHA1 Message Date
platform-mcpandClaude Opus 4.8 4b2e96c681 feat(header): add WRNexus external nav link
Deploy to Production / Build & Verify (push) Has been cancelled
Deploy to Production / Pre-Deploy Tests (push) Has been cancelled
Deploy to Production / Deploy to Railway (push) Has been cancelled
Deploy to Production / Deploy to Render (push) Has been cancelled
Deploy to Production / Deploy to VPS (PM2) (push) Has been cancelled
Deploy to Production / Deploy to Fly.io (push) Has been cancelled
Deploy to Production / Post-Deploy Verification (push) Has been cancelled
Deploy to Production / Notify on Failure (push) Has been cancelled
E2E Test Suite / Critical User Journeys (push) Has been cancelled
E2E Test Suite / API Integration Tests (push) Has been cancelled
E2E Test Suite / Form Interaction Tests (push) Has been cancelled
E2E Test Suite / Destructive & Chaos Tests (push) Has been cancelled
E2E Test Suite / Cross-Browser Regression (chromium) (push) Has been cancelled
E2E Test Suite / Cross-Browser Regression (firefox) (push) Has been cancelled
E2E Test Suite / Cross-Browser Regression (webkit) (push) Has been cancelled
E2E Test Suite / Mobile Device Tests (push) Has been cancelled
E2E Test Suite / Security Header Tests (push) Has been cancelled
E2E Test Suite / Test Report Summary (push) Has been cancelled
E2E Test Suite / Smoke Tests (P0) (push) Has been cancelled
Ping Search Engines / Notify Search Engines (push) Failing after 11m2s
Add a top-level "WRNexus" navigation item linking to https://wrnexus.com/
that opens in a new tab. Implemented via the data-driven navLinks array
with an `external` flag; desktop and mobile renderers apply
target="_blank" and rel="noopener noreferrer" and skip prefetch/active-state
for external links.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 20:20:01 +05:30
platform-mcp 1b922ddda3 pre-agent: Convert home hero to left-right layout 2026-06-17 20:19:15 +05:30
platform-mcp bc10d5fe4b pre-agent: Fix mobile menu full-screen overlay 2026-06-17 20:18:23 +05:30
platform-mcp a5c6e32734 pre-agent: Add WRNexus external link to navbar 2026-06-17 20:17:39 +05:30
platform-mcp 35feade8e7 pre-agent: 🔧 Auto-fix: frontend 2026-06-17 20:16:23 +05:30
platform-mcp c86fce6125 pre-agent: Fix and replace header logo with correct asset 2026-06-17 20:16:23 +05:30
platform-mcp 7f3d94178d agent: Fix repeated 404 requests to malformed '/)' path 2026-06-17 20:15:35 +05:30
6 changed files with 52 additions and 11 deletions
+20 -8
View File
@@ -17,6 +17,7 @@ const navLinks = [
{ name: 'Portfolio', href: '/portfolio' },
{ name: 'Blog', href: '/blog' },
{ name: 'Contact', href: '/contact' },
{ name: 'WRNexus', href: 'https://wrnexus.com/', external: true },
];
const currentPath = Astro.url.pathname;
@@ -49,14 +50,16 @@ const currentPath = Astro.url.pathname;
<!-- Desktop Navigation -->
<ul class="hidden lg:flex items-center gap-1" role="menubar">
{navLinks.map((link) => {
const isActive = currentPath === link.href ||
(link.href !== '/' && currentPath.startsWith(link.href));
const isActive = !link.external && (currentPath === link.href ||
(link.href !== '/' && currentPath.startsWith(link.href)));
return (
<li role="none">
<a
href={link.href}
role="menuitem"
data-astro-prefetch="hover"
data-astro-prefetch={link.external ? undefined : 'hover'}
target={link.external ? '_blank' : undefined}
rel={link.external ? 'noopener noreferrer' : undefined}
class:list={[
'relative px-4 py-2 text-sm font-medium transition-colors rounded-lg',
isActive
@@ -127,16 +130,23 @@ const currentPath = Astro.url.pathname;
</div>
<!-- Mobile Menu Overlay -->
<!-- Explicit viewport sizing: the header's `backdrop-blur` makes it the
containing block for fixed descendants, so `inset-0` alone would only
cover the header. w-screen + h-[100dvh] force true full-viewport cover. -->
<div
id="mobile-menu-overlay"
class="fixed inset-0 bg-secondary-900/50 backdrop-blur-sm opacity-0 pointer-events-none transition-opacity duration-300 lg:hidden"
class="fixed top-0 left-0 w-screen h-[100dvh] bg-secondary-900/50 backdrop-blur-sm opacity-0 pointer-events-none transition-opacity duration-300 lg:hidden"
aria-hidden="true"
></div>
<!-- Mobile Menu Panel -->
<!-- Full-screen overlay panel. Uses explicit viewport units (w-screen /
h-[100dvh]) rather than h-full because the header's backdrop-filter is
the containing block for this fixed element, so `h-full` would collapse
to the header's ~64px height (the original "small box" bug). -->
<div
id="mobile-menu"
class="fixed top-0 right-0 h-full w-80 max-w-[85vw] bg-white dark:bg-secondary-900 shadow-2xl transform translate-x-full transition-transform duration-300 ease-out lg:hidden"
class="fixed top-0 left-0 w-screen h-[100dvh] min-h-screen bg-white dark:bg-secondary-900 shadow-2xl transform translate-x-full transition-transform duration-300 ease-out lg:hidden"
role="dialog"
aria-modal="true"
aria-label="Mobile navigation menu"
@@ -164,14 +174,16 @@ const currentPath = Astro.url.pathname;
<nav class="flex-1 overflow-y-auto py-4">
<ul class="space-y-1 px-3" role="menu">
{navLinks.map((link, index) => {
const isActive = currentPath === link.href ||
(link.href !== '/' && currentPath.startsWith(link.href));
const isActive = !link.external && (currentPath === link.href ||
(link.href !== '/' && currentPath.startsWith(link.href)));
return (
<li role="none" style={`--delay: ${index * 50}ms`}>
<a
href={link.href}
role="menuitem"
data-astro-prefetch="hover"
data-astro-prefetch={link.external ? undefined : 'hover'}
target={link.external ? '_blank' : undefined}
rel={link.external ? 'noopener noreferrer' : undefined}
class:list={[
'mobile-nav-link flex items-center gap-3 px-4 py-3 rounded-lg text-base font-medium transition-all duration-200',
isActive
+12
View File
@@ -61,6 +61,18 @@ export const onRequest = defineMiddleware(async (context, next) => {
const method = context.request.method;
const path = context.url.pathname;
// Normalize paths corrupted by a trailing stray ")" before routing.
// These come from monitors/links that captured a URL together with a
// closing parenthesis — e.g. "https://workroot.in/)" copied out of the
// markdown/shell form "(https://workroot.in/)". Without this, every such
// probe hits a non-existent route and 404s on a loop (recurring "GET /)").
// Stripping the trailing paren(s) lets the request resolve to the intended
// route (e.g. "/)" -> "/"), so the monitor gets a 301 -> 200 instead.
const normalizedPath = path.replace(/\)+$/, '');
if (normalizedPath !== path && normalizedPath.length > 0) {
return context.redirect(`${normalizedPath}${context.url.search}`, 301);
}
// CSRF origin validation for API mutations
if (!validateCsrfOrigin(context.request, context.url)) {
logger.warn('middleware', 'CSRF origin check failed', {
+1 -1
View File
@@ -299,7 +299,7 @@ const lastUpdated = 'March 20, 2026';
<div class="bg-secondary-900/50 border border-secondary-800 rounded-xl p-6">
<p class="text-secondary-300"><strong class="text-white">WorkRoot IT Solutions LLP</strong></p>
<p class="text-secondary-300">Email: admin@workroot.in</p>
<p class="text-secondary-300">Phone: +91 9561417403</p>
<p class="text-secondary-300">Phone: <a href="tel:+919561417403" class="text-primary-400 hover:underline">+91 9561417403</a></p>
<p class="text-secondary-300">Address: At Post Rajapur Shantinagar, Taluka Khatav, Dist Satara, MH 415503</p>
</div>
<p class="text-secondary-300 mt-4">
+17
View File
@@ -236,6 +236,23 @@ const techStack = [
</a>
</div>
<!-- Tertiary click-to-call — one-tap dial for visitors who'd rather
talk now. Min 48px tap target per WCAG 2.5.5 / Apple HIG. -->
<p class="mt-6 text-base sm:text-lg text-secondary-200 opacity-0 animate-slide-up flex flex-wrap items-center justify-center gap-x-2 gap-y-1" style="animation-delay: 0.85s;">
<span>Prefer to talk now?</span>
<a
href="tel:+919561417403"
data-cta="hero-call"
aria-label="Call WorkRoot at +91 95614 17403"
class="inline-flex min-h-[48px] items-center gap-2 rounded-lg px-2 font-semibold text-white underline decoration-primary-400/60 underline-offset-4 transition-colors hover:text-primary-200 hover:decoration-primary-300 focus:outline-none focus:ring-2 focus:ring-primary-400 focus:ring-offset-2 focus:ring-offset-secondary-900"
>
<svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" aria-hidden="true">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z" />
</svg>
+91 95614 17403
</a>
</p>
<!-- Micro-trust line under CTAs -->
<p class="mt-6 text-sm sm:text-base text-secondary-300 opacity-0 animate-slide-up flex flex-wrap items-center justify-center gap-x-3 gap-y-2" style="animation-delay: 0.9s;" aria-label="Trust signals">
<span class="inline-flex items-center gap-2">
+1 -1
View File
@@ -211,7 +211,7 @@ const lastUpdated = 'March 20, 2026';
<div class="bg-secondary-900/50 border border-secondary-800 rounded-xl p-6">
<p class="text-secondary-300"><strong class="text-white">WorkRoot IT Solutions</strong></p>
<p class="text-secondary-300">Email: admin@workroot.in</p>
<p class="text-secondary-300">Phone: +91 9561417403</p>
<p class="text-secondary-300">Phone: <a href="tel:+919561417403" class="text-primary-400 hover:underline">+91 9561417403</a></p>
<p class="text-secondary-300">Address: At Post Rajapur Shantinagar, Taluka Khatav, Dist Satara, MH 415503</p>
</div>
</div>
+1 -1
View File
@@ -297,7 +297,7 @@ const lastUpdated = 'March 20, 2026';
<div class="bg-secondary-900/50 border border-secondary-800 rounded-xl p-6">
<p class="text-secondary-300"><strong class="text-white">WorkRoot IT Solutions</strong></p>
<p class="text-secondary-300">Email: admin@workroot.in</p>
<p class="text-secondary-300">Phone: +91 9561417403</p>
<p class="text-secondary-300">Phone: <a href="tel:+919561417403" class="text-primary-400 hover:underline">+91 9561417403</a></p>
<p class="text-secondary-300">Address: At Post Rajapur Shantinagar, Taluka Khatav, Dist Satara, MH 415503</p>
</div>
</div>