Move the base Organization + LocalBusiness and WebSite structured data out of
BaseLayout's inline scripts into SEO.astro behind a new `base` prop, rendered
once from BaseLayout's <head> so every route (incl. pages without a
page-specific <SEO>) carries the canonical company schema exactly once.
- Organization/LocalBusiness now includes aggregateRating + Review nodes built
from the three real homepage testimonials (Ajay Pruthi, Dhirendra Singh,
Dilip Raj — all 5-star, reviewCount 3, rating 5.0).
- foundingDate 2022, telephone +91-9561417403, email admin@workroot.in,
areaServed Bihar (AdministrativeArea) + India (Country).
- Description keeps the canonical proof numbers identical to the site:
20+ projects, 11 districts, 50,000+ records, 99.9% uptime.
- Reusable Service node now links provider via @id to #organization and
serves Bihar/India; page-specific schema (Service/FAQ/WebPage/...) stays
opt-in and is gated off the base instance to prevent duplication.
- Homepage still emits a single FAQPage (from HomepageFaq) — no duplicate.
- Add jsdom devDependency required by scripts/validate-schema.js.
Verified: build succeeds; scripts/validate-schema.js passes (24 schemas, 0
issues, 0 warnings); rendered ld+json inspected on homepage, services, and
schema-less pages (privacy/terms/cookies/404).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Surface the existing, already-published Government IT credibility signals
on the homepage service card — 11+ districts live, 99.9% uptime, and GeM
empanelment (all already stated on /services and in the homepage FAQ) —
so the card matches the depth of the per-service quote CTA beside it.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rework the homepage InlineLeadForm from a single combined "email or phone"
contact field to an explicit 5-field layout — name, email (type=email),
phone (type=tel), project type and an optional message — so each field gets
the correct mobile keyboard and leads carry a real email + phone separately.
- Required fields kept to name + email + project type for a low-friction
mobile flow; phone and message are optional.
- Email uses type=email + inputmode=email; phone uses type=tel + inputmode=tel
for the numeric keypad. Message is an optional textarea; when blank the
client synthesizes a >=10 char summary so the /api/contact validator passes.
- Still posts to the same /api/contact endpoint tagged source=homepage-inline,
delivering leads exactly the same way the /contact page does (no page nav).
- Update inline-lead-form.spec.ts to the new field set and keyboards.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reorder the shared navLinks array so 'WRNexus' renders as the second
item (right after Home) in both the desktop menubar and the mobile menu
panel. The mobile menu panel already includes a top-right cross close
icon (#mobile-menu-close, aria-label="Close menu") wired to closeMenu().
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Restructure the homepage hero from a single centered block into a
responsive two-column grid: left column holds the left-aligned
headline, subtext, CTAs, click-to-call and trust line; right column
holds the framed product dashboard preview.
- Replace `max-w-5xl mx-auto text-center` with
`grid grid-cols-1 lg:grid-cols-2 gap-12 lg:gap-16 items-center`.
- Scale headline down from text-5xl/8xl to a responsive
text-4xl md:text-5xl lg:text-6xl so it no longer overflows.
- Left-align CTAs/links on desktop (justify-start, lg:text-left)
while keeping centered stacking on mobile (grid-cols-1).
- Swap section min-h-screen for lg:min-h-[85vh] and py-24 lg:py-32
so the hero fits the viewport instead of dominating it.
- Preserve existing background gradient and decorative blur elements,
consistent with the about/portfolio heroes.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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>
- Generate crisp icon set from WorkRoot SVG: favicon.ico (16/32/48),
favicon-32x32.png, apple-touch-icon.png (180), logo.png (512),
and PWA icon-192.png / icon-512.png
- Add favicon.ico link with recommended <head> tag order in BaseLayout
- Reference icon-192/icon-512 in manifest.json for PWA installs
- JSON-LD Organization logo now resolves to the real 512x512 mark
- Header/Footer already render the new mark via /favicon.svg; dark-mode
wordmark contrast (BUG-5) preserved and verified
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Add WorkRoot Icon as public/favicon.svg, regenerate logo.png (512x512)
and apple-touch-icon.png (180x180) from the brand vector; add
favicon-32x32.png raster
- Register 32x32 PNG favicon link in BaseLayout <head> alongside the
SVG and apple-touch-icon
- Replace placeholder "W" logo boxes with the WorkRoot mark in the
header, mobile menu, and footer (preserving "WorkRoot" text spans
required by the dark-mode contrast tests and the home link wrapper)
JSON-LD/SEO logo (/logo.png) and PWA manifest icons now resolve to the
real brand assets. Build passes; BUG-5 dark-mode and navigation tests
green.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Addresses contact-page audit points 22–27:
- Confirmed no '200+ companies' credibility claim; canonical stat set retained
- Service dropdown now matches real services, led by ERP/Enterprise + Government IT;
removed Cloud Services and AI & ML, added UI/UX Design
- Backend allowlist + labels updated to accept 'ui-ux' and reflect real service names
- H1 paired with value prop: free 1-page proposal in 24 hours
- '< 24h response' promise badge moved above the form
- Clarified contradictory hours to 'We reply within 24 business hours, Mon–Fri'
- Reduced message textarea height (rows 5→4) and max length (5000→2000)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Apply portfolio CRO audit points 17-21:
- Add a one-line outcome headline above each project card description
(grid + featured cards), styled with the primary accent per the
design system (e.g. "Cut crematorium slot booking from hours to
minutes across 10+ facilities.").
- Remove the "AI & ML" category filter chip — no project genuinely
fits it (Pophealth is health/mobile) — and correct the ItemList
structured-data description to drop the inaccurate AI/ML claim.
- Stats bar already surfaces the canonical proof set (11 Districts
Deployed, 50,000+ Records Managed) shared with the homepage/services
via ProofNumbers; the weak "4 Specializations" stat is gone.
- "View Case Study" CTAs open the inline case-study modal with full
problem -> solution -> outcome (Challenge / Solution / Key Results),
verified working via headless browser.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Replace generic H1 with outcome-led headline ("Custom software for
enterprises and governments — shipped in weeks, not quarters.")
- Rewrite each service description to lead with the outcome and end
with the tech stack
- Reorder service cards so Government IT and ERP/Enterprise lead,
before Web/Mobile
- Add "What's included" label above each pricing tier's bullet list
(Most Popular badge on Professional retained)
- Unify CTAs to one primary ("Get my free proposal") + one secondary
("See our work" → /portfolio)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Rename WhatsApp label from "WhatsApp" (8 chars) to "Chat" (4) so every
visible label fits the ≤7-char action-verb policy and never triggers
the new text-overflow:ellipsis safety net even at 320px (iPhone SE).
- Bump inline SVG icons to 24×24 (was 22), set min-height 64px and
min-width 44px per Apple HIG / WCAG 2.5.5 tap-target requirements.
- Add white-space:nowrap + text-overflow:ellipsis as defensive safety
net, plus a 320-359px breakpoint that nudges label to 11px / padding
to 4px-horizontal so glyph-width drift can't cause overflow.
- Rewrite aria-labels to be action-led + descriptive even when visible
text is terse: "Call us", "Chat with us on WhatsApp", "Get a free
quote" (WCAG 2.5.3 name-in-name).
- Bump BaseLayout bottom-spacer from 64px → 72px so the new
PricingTimelineBand and GuaranteeBand always have an 8px visual
buffer above the fixed sticky bar (no overlap).
Verified: build green, all 6 tests in tests/sticky-cta.spec.ts pass
against the restarted frontend service. Probed live at 320 / 375 /
414 px — every button is 64px tall, ≥103px wide, icons 24×24, labels
never truncate. Footer fully clears the bar at scroll-bottom.
- TrustStrip.astro: single-row, grayscale-on-default / colour-on-hover
client logo strip under the hero. 6 logos via <img> with explicit
width/height + loading=lazy (CLS-safe), wraps to 3+3 on mobile.
Includes sr-only "Trusted by" heading and dark-mode invert filter
vetted against THEME_ACCESSIBILITY_AUDIT.md. Replaces the older
ClientLogos placement on the homepage.
- GuaranteeBand.astro: 3-up risk-reversal band wedged between
PricingTimelineBand and InlineLeadForm. Three claims (30-day
satisfaction guarantee, no long-term contracts, fixed-price quotes)
with icon + headline + supporting body. Stacks vertically on mobile.
- public/images/logos/: 6 placeholder SVG wordmarks (plnr, rentec,
iit-patna, moc-soft, gov-bihar, pscl). Replace at same path with
real client-supplied artwork when handed off.
- index.astro: wires the two new components, repoints the hero
scroll indicator to #trust-strip, preserves legacy #client-logos
anchor for any external deep-links.