feat(marketing): add ZeroTier Network Governance page and content

Add comprehensive marketing content for ZeroTier Network Governance feature
including a dedicated landing page, navigation updates, and feature highlights
across the homepage and features page.

- Add new ZeroTierPage with feature documentation and use cases
- Add ZeroTier to navigation in MarketingLayout header and footer
- Update HomePage hero headline and add ZeroTier feature section
- Add ZeroTier features section to FeaturesPage
- Add ScrollToTop component for better navigation UX
- Move ApiDevTools to AuthenticatedLayout (dev mode only)
- Add SSR tests for marketing pages
- Update SSHCertificatesPage comparison table for clarity
- Add documentation link to MarketingLayout footer
This commit is contained in:
2026-04-06 20:57:30 +09:30
parent 3e0a7f9de4
commit 11f56c187f
8 changed files with 1215 additions and 522 deletions
+14 -4
View File
@@ -2,7 +2,8 @@ import { Toaster } from "@/components/ui/toaster";
import { Toaster as Sonner } from "@/components/ui/sonner";
import { TooltipProvider } from "@/components/ui/tooltip";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import { BrowserRouter, Routes, Route, useLocation } from "react-router-dom";
import { useEffect } from "react";
// Layouts
import PublicLayout from "@/components/layouts/PublicLayout";
@@ -15,6 +16,7 @@ import FeaturesPage from "@/pages/marketing/FeaturesPage";
import PricingPage from "@/pages/marketing/PricingPage";
import SecurityPage from "@/pages/marketing/SecurityPage";
import SSHCertificatesPage from "@/pages/marketing/SSHCertificatesPage";
import ZeroTierPage from "@/pages/marketing/ZeroTierPage";
import DemoPage from "@/pages/marketing/DemoPage";
// Public pages
@@ -59,7 +61,6 @@ import OAuthProvidersPage from "@/pages/admin/OAuthProvidersPage";
import OrgSetupPage from "@/pages/auth/OrgSetupPage";
import NotFound from "@/pages/NotFound";
import ApiDevTools from "@/components/dev/ApiDevTools";
const queryClient = new QueryClient({
defaultOptions: {
@@ -82,12 +83,22 @@ const App = () => (
<Toaster />
<Sonner />
<BrowserRouter>
<ScrollToTop />
<AppRoutes />
</BrowserRouter>
</TooltipProvider>
</QueryClientProvider>
);
// Scroll to top on navigation
function ScrollToTop() {
const location = useLocation();
useEffect(() => {
window.scrollTo({ top: 0, left: 0, behavior: 'instant' });
}, [location.pathname]);
return null;
}
// Separate component so AuthProvider can use useNavigate
import { AuthProvider, useAuth } from "@/contexts/AuthContext";
import { OrgProvider } from "@/contexts/OrgContext";
@@ -148,6 +159,7 @@ function AppRoutes() {
<Route path="/pricing" element={<PricingPage />} />
<Route path="/security" element={<SecurityPage />} />
<Route path="/ssh-certificates" element={<SSHCertificatesPage />} />
<Route path="/zerotier" element={<ZeroTierPage />} />
<Route path="/demo" element={<DemoPage />} />
</Route>
@@ -208,8 +220,6 @@ function AppRoutes() {
<Route path="*" element={<NotFound />} />
</Routes>
{/* Dev tools - only shown in development */}
<ApiDevTools />
</OrgProvider>
</AuthProvider>
);