Skip to content

Website expansion: docs IA, examples, blog, legal pages, and UX refresh#36

Merged
nasimstg merged 2 commits intomainfrom
feat/website-docs-expansion
Apr 2, 2026
Merged

Website expansion: docs IA, examples, blog, legal pages, and UX refresh#36
nasimstg merged 2 commits intomainfrom
feat/website-docs-expansion

Conversation

@nasimstg
Copy link
Copy Markdown
Owner

@nasimstg nasimstg commented Apr 2, 2026

Summary

This PR delivers the website/docs update as a dedicated follow-up to the tool release PR.

Commit 1

  • Adds major content and information architecture expansion:
    • docs sections (changelog, CI/CD, FAQ, contributing, integrations, troubleshooting, use-cases)
    • examples section (hub, workflows, command usages)
    • blog section with multiple post types
    • legal/policy pages (privacy, terms, consent, contact, license)
    • donation page and integrations/use-cases hubs
  • Updates navigation/discovery surfaces:
    • header, footer, sidebar, search index
    • dynamic sitemap route and llms.txt route
    • robots updates and sitemap static-file removal
    • consent banner and preference manager integration

Commit 2

  • Refreshes landing-page UX and visual polish:
    • updated home page structure and styles
    • Hero install-tabs component
    • roadmap presentation refresh
    • OpenGraph and Twitter image routes

Validation

  • website/npm run check (typecheck + lint + build)

Notes

Copilot AI review requested due to automatic review settings April 2, 2026 08:32
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 2, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
xenvsync Ready Ready Preview, Comment Apr 2, 2026 8:33am

@nasimstg nasimstg merged commit 20cf49d into main Apr 2, 2026
13 checks passed
@nasimstg nasimstg deleted the feat/website-docs-expansion branch April 2, 2026 08:35
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR expands the Next.js website to support a larger documentation/info architecture (docs, examples, blog, legal pages), plus navigation/search/SEO updates and a landing-page UX refresh.

Changes:

  • Expanded site IA: new docs sections, examples hub, blog posts, and legal/policy pages (privacy/terms/consent/contact/license).
  • Navigation + discovery updates: header/footer/sidebar links, search index expansion, dynamic sitemap, and llms.txt.
  • UX/accessibility improvements: mobile docs drawer focus-trap work, new hero install tabs, and updated styling + OpenGraph/Twitter images.

Reviewed changes

Copilot reviewed 47 out of 47 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
website/src/components/Sidebar.tsx Adds new docs links + mobile drawer focus management
website/src/components/SearchHighlight.tsx Improves highlight cleanup and effect teardown
website/src/components/Search.tsx Expands search index + refines modal open/reset + highlighting
website/src/components/HeroInstallTabs.tsx Adds tabbed install UI for homepage hero
website/src/components/Header.tsx Updates nav links and header styling
website/src/components/Footer.tsx Expands footer IA (legal/docs/examples) + layout tweaks
website/src/components/ConsentPreferencesManager.tsx Adds consent preference manager UI (localStorage-backed)
website/src/components/ConsentBanner.tsx Adds consent banner + persistence
website/src/app/use-cases/page.tsx Adds top-level “Use Cases” hub page
website/src/app/twitter-image.tsx Adds Twitter card image route (re-exports OG image)
website/src/app/terms/page.tsx Adds Terms of Use page
website/src/app/sitemap.ts Adds dynamic sitemap route for expanded site
website/src/app/roadmap/page.tsx Updates roadmap copy and stats
website/src/app/privacy/page.tsx Adds Privacy Policy page
website/src/app/page.tsx Replaces hero one-liner with HeroInstallTabs
website/src/app/opengraph-image.tsx Adds OG image generator route
website/src/app/llms.txt/route.ts Adds llms.txt route for LLM/GEO indexing hints
website/src/app/license/page.tsx Adds license page that reads repo root LICENSE
website/src/app/licence/page.tsx Adds UK spelling alias redirect to /license
website/src/app/layout.tsx Adds structured data, robots metadata, OG/Twitter images, consent banner
website/src/app/integrations/page.tsx Adds Integrations landing page
website/src/app/globals.css Refreshes “glass” styling variables and classes
website/src/app/examples/workflows/page.tsx Adds workflow playbooks page
website/src/app/examples/usages/page.tsx Adds usage cookbook page
website/src/app/examples/page.tsx Adds examples hub page
website/src/app/donate/page.tsx Adds donation/support page
website/src/app/docs/use-cases/page.tsx Adds docs-scoped use-cases page (currently duplicative)
website/src/app/docs/troubleshooting/page.tsx Adds troubleshooting guide page
website/src/app/docs/roadmap/page.tsx Changes docs roadmap route to permanent redirect
website/src/app/docs/integrations/page.tsx Adds docs integrations redirect to top-level integrations
website/src/app/docs/installation/page.tsx Updates installation docs (Go version + changelog link)
website/src/app/docs/getting-started/page.tsx Updates prerequisites + links to installation page
website/src/app/docs/faq/page.tsx Adds FAQ page
website/src/app/docs/contributing/page.tsx Adds contributing guide page
website/src/app/docs/ci-cd/page.tsx Adds CI/CD recipes page
website/src/app/docs/changelog/page.tsx Adds docs changelog page (currently out of date vs repo changelog)
website/src/app/contact/page.tsx Adds contact/support page
website/src/app/consent/page.tsx Adds consent preferences page and embeds manager
website/src/app/blog/use-case-story/page.tsx Adds blog case study post
website/src/app/blog/tool-ranking/page.tsx Adds blog ranking post
website/src/app/blog/tool-comparison/page.tsx Adds blog comparison post
website/src/app/blog/technical-deep-dive/page.tsx Adds blog technical deep dive post
website/src/app/blog/page.tsx Adds blog index page
website/src/app/blog/migration-playbook/page.tsx Adds migration playbook post
website/src/app/blog/developer-workflow/page.tsx Adds developer workflow post
website/public/sitemap.xml Removes static sitemap file in favor of dynamic sitemap route
website/public/robots.txt Keeps sitemap reference and adds llms.txt hint comment

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +64 to +69
const focusable = mobileDrawerRef.current?.querySelectorAll<HTMLElement>(
'a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])'
);
const first = focusable?.[0] ?? closeButtonRef.current;
const last = focusable?.[focusable.length - 1] ?? closeButtonRef.current;
first?.focus();
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

focusable?.[focusable.length - 1] still evaluates focusable.length even when focusable is possibly undefined from the optional chain, which will fail TypeScript type-checking (and can be fragile). Compute last only after confirming focusable is defined (e.g., via a conditional) or derive last inside the if (!focusable || focusable.length === 0) guard.

Copilot uses AI. Check for mistakes.
Comment on lines +49 to +54
const closeMobileMenu = () => {
setMobileOpen(false);
requestAnimationFrame(() => {
openButtonRef.current?.focus();
});
};
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

closeMobileMenu always shifts focus back to the (mobile) open-menu button. Because the same handler is attached to all sidebar links, clicking a desktop sidebar link will also trigger this focus change and can move keyboard focus to a hidden element (lg:hidden), which is an accessibility/UX regression. Consider only restoring focus when the mobile drawer was actually open (e.g., gate on mobileOpen or pass a flag from the mobile-only interactions).

Copilot uses AI. Check for mistakes.
Comment on lines +62 to +65
<h3 className="text-sm font-semibold">Consent Preference</h3>
<p className="text-sm text-[var(--color-text-secondary)] leading-relaxed">
When you interact with the consent banner, your choice is stored in browser <code>localStorage</code> under the key <code>xenvsync-consent-v1</code>. This is a single boolean value that prevents the banner from re-appearing on subsequent visits. It does not identify you or leave your browser.
</p>
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The privacy policy claims the consent preference stored in localStorage is “a single boolean value”, but the implementation stores a JSON object with { choice, updatedAt } (see ConsentBanner/ConsentPreferencesManager). Update this text to accurately describe what is stored so the policy matches actual behavior.

Copilot uses AI. Check for mistakes.
Comment on lines +5 to +23
export const metadata = {
title: "Changelog - xenvsync",
description:
"Full release history for xenvsync — security fixes, new commands, vault format changes, and upgrade guidance from v1.0.0 through v1.12.0.",
openGraph: {
title: "Changelog - xenvsync",
description: "Release history and upgrade guidance for xenvsync.",
url: "https://xenvsync.softexforge.io/docs/changelog",
},
alternates: { canonical: "https://xenvsync.softexforge.io/docs/changelog" },
};

const releases = [
{
version: "v1.12.0",
date: "2026-04-01",
tag: "Latest",
tagColor: "text-emerald-400",
sections: [
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The docs changelog is already behind the repository changelog: it lists v1.12.0 as “Latest” and metadata says “through v1.12.0”, but the repo root CHANGELOG.md has v1.13.0 dated 2026-04-02. This page should either include v1.13.0 (and mark it latest) or be generated/synced from CHANGELOG.md to avoid drifting release info.

Copilot uses AI. Check for mistakes.
Comment on lines +5 to +15
export const metadata = {
title: "Use Cases - xenvsync Docs",
description:
"How xenvsync fits into real workflows: solo developer local setup, startup team secret sharing, enterprise CI/CD pipelines, open-source maintainer credential isolation, and Docker/container workflows.",
openGraph: {
title: "Use Cases - xenvsync",
description: "Real-world xenvsync workflows by team size and delivery model.",
url: "https://xenvsync.softexforge.io/docs/use-cases",
},
alternates: { canonical: "https://xenvsync.softexforge.io/docs/use-cases" },
};
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This page introduces a full /docs/use-cases article while the sidebar/search/sitemap point users to the canonical top-level /use-cases route. Unless you intentionally want two separate pages, this duplication is likely to drift and can create SEO duplicate-content issues. Consider making /docs/use-cases a redirect to /use-cases (similar to /docs/integrations and /docs/roadmap) or otherwise ensure it’s linked and clearly differentiated.

Copilot uses AI. Check for mistakes.
Comment on lines +52 to +70
<div
role="tablist"
aria-label="Install instructions"
className="mb-3 p-1 rounded-xl bg-[color:rgba(12,12,20,0.9)] border border-[var(--color-border-bright)] inline-flex flex-wrap justify-center gap-1"
>
{installTargets.map((target) => {
const isActive = target.id === activeTarget.id;
return (
<button
key={target.id}
id={`install-tab-${target.id}`}
role="tab"
aria-selected={isActive}
aria-controls="install-tab-panel"
onClick={() => {
if (target.id !== activeId) {
setActiveId(target.id);
}
}}
Copy link

Copilot AI Apr 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

HeroInstallTabs applies ARIA tabs roles (tablist/tab/tabpanel) but doesn’t implement the expected keyboard interaction model (arrow-key navigation) or manage tab focus (tabIndex=0/-1 for active/inactive tabs). Either add the missing keyboard handling / roving tabIndex, or consider using simpler semantics (e.g., a segmented button group) to avoid misleading assistive technologies.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants