mirror of
https://github.com/RooVetGit/Roo-Code.git
synced 2026-08-28 05:27:24 +00:00
Some checks failed
Code QA Roo Code / check-translations (push) Has been cancelled
Code QA Roo Code / knip (push) Has been cancelled
Code QA Roo Code / compile (push) Has been cancelled
Code QA Roo Code / platform-unit-test (ubuntu-latest) (push) Has been cancelled
Code QA Roo Code / platform-unit-test (windows-latest) (push) Has been cancelled
CodeQL Advanced / Analyze (javascript-typescript) (push) Has been cancelled
Deploy docs to GitHub Pages / build (push) Has been cancelled
Nightly Publish / publish-nightly (push) Has been cancelled
Deploy roocode.com / check-secrets (push) Has been cancelled
Deploy docs to GitHub Pages / deploy (push) Has been cancelled
Deploy roocode.com / deploy (push) Has been cancelled
* Remove contributor and community references * shutdown notice * Allow empty web app test suite
213 lines
7.5 KiB
TypeScript
213 lines
7.5 KiB
TypeScript
"use client"
|
|
|
|
import { useState, useRef, useEffect } from "react"
|
|
import Link from "next/link"
|
|
import Image from "next/image"
|
|
import { ChevronDown } from "lucide-react"
|
|
|
|
import { EXTERNAL_LINKS, INTERNAL_LINKS } from "@/lib/constants"
|
|
import { useLogoSrc } from "@/lib/hooks/use-logo-src"
|
|
import { ScrollButton } from "@/components/ui"
|
|
|
|
export function Footer() {
|
|
const [privacyDropdownOpen, setPrivacyDropdownOpen] = useState(false)
|
|
const dropdownRef = useRef<HTMLDivElement>(null)
|
|
const logoSrc = useLogoSrc()
|
|
|
|
// Close dropdown when clicking outside
|
|
useEffect(() => {
|
|
function handleClickOutside(event: MouseEvent) {
|
|
const target = event.target as Node
|
|
if (dropdownRef.current && !dropdownRef.current.contains(target)) {
|
|
setPrivacyDropdownOpen(false)
|
|
}
|
|
}
|
|
|
|
document.addEventListener("mousedown", handleClickOutside)
|
|
return () => {
|
|
document.removeEventListener("mousedown", handleClickOutside)
|
|
}
|
|
}, [])
|
|
return (
|
|
<footer className="border-t border-border bg-background">
|
|
<div className="mx-auto max-w-7xl px-6 pb-6 pt-12 md:pb-8 md:pt-16 lg:px-8">
|
|
<div className="xl:grid xl:grid-cols-3 xl:gap-8">
|
|
<div className="space-y-8">
|
|
<div className="flex items-center">
|
|
<Image src={logoSrc} alt="Roo Code Logo" width={120} height={40} className="h-6 w-auto" />
|
|
</div>
|
|
<p className="max-w-md text-sm leading-6 text-muted-foreground md:pr-16 lg:pr-32">
|
|
Empowering developers to build better software faster with AI-powered tools and insights.
|
|
</p>
|
|
</div>
|
|
|
|
<div className="mt-16 grid grid-cols-2 gap-8 xl:col-span-2 xl:mt-0">
|
|
<div className="md:grid md:grid-cols-2 md:gap-8">
|
|
<div>
|
|
<h3 className="text-sm font-semibold uppercase leading-6 text-foreground">Product</h3>
|
|
<ul className="mt-6 space-y-4">
|
|
<li>
|
|
<ScrollButton
|
|
targetId="product"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Features
|
|
</ScrollButton>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.DOCUMENTATION}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Docs
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.CHANGELOG}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Changelog
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div className="mt-10 md:mt-0">
|
|
<h3 className="text-sm font-semibold uppercase leading-6 text-foreground">Resources</h3>
|
|
<ul className="mt-6 space-y-4">
|
|
<li>
|
|
<Link
|
|
href="/blog"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Blog
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.TUTORIALS}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Tutorials
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.ISSUES}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Issues
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
<div className="md:grid md:grid-cols-2 md:gap-8">
|
|
<div>
|
|
<h3 className="text-sm font-semibold uppercase leading-6 text-foreground">Company</h3>
|
|
<ul className="mt-6 space-y-4">
|
|
<li>
|
|
<a
|
|
href="mailto:support@roocode.com"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Contact
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/terms"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Terms of Service
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<div className="relative z-10" ref={dropdownRef}>
|
|
<button
|
|
onClick={() => setPrivacyDropdownOpen(!privacyDropdownOpen)}
|
|
className="flex items-center text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground"
|
|
aria-expanded={privacyDropdownOpen}
|
|
aria-haspopup="true">
|
|
<span>
|
|
Privacy <span className="max-[320px]:hidden">Policy</span>
|
|
</span>
|
|
<ChevronDown
|
|
className={`ml-1 h-4 w-4 transition-transform ${privacyDropdownOpen ? "rotate-180" : ""}`}
|
|
/>
|
|
</button>
|
|
|
|
{privacyDropdownOpen && (
|
|
<div className="absolute z-50 mt-2 w-44 origin-top-left scale-95 rounded-md border border-border bg-background shadow-lg ring-1 ring-black ring-opacity-5 transition-all duration-100 ease-out data-[state=open]:scale-100 max-xs:right-0 max-xs:origin-top-right xs:left-0">
|
|
<div className="flex flex-col gap-1 p-2 text-sm text-muted-foreground">
|
|
<a
|
|
href={EXTERNAL_LINKS.PRIVACY_POLICY_EXTENSION}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
onClick={() => setPrivacyDropdownOpen(false)}
|
|
className="rounded-md px-3 py-2 transition-colors hover:bg-accent/50 hover:text-foreground">
|
|
Extension
|
|
</a>
|
|
<Link
|
|
href={INTERNAL_LINKS.PRIVACY_POLICY_WEBSITE}
|
|
onClick={() => setPrivacyDropdownOpen(false)}
|
|
className="rounded-md px-3 py-2 transition-colors hover:bg-accent/50 hover:text-foreground">
|
|
Roo Code Cloud
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
)}
|
|
</div>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/legal/cookies"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Cookie Policy
|
|
</Link>
|
|
</li>
|
|
<li>
|
|
<Link
|
|
href="/legal/subprocessors"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
Subprocessors
|
|
</Link>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
<div className="mt-10 md:mt-0">
|
|
<h3 className="text-sm font-semibold uppercase leading-6 text-foreground">Connect</h3>
|
|
<ul className="mt-6 space-y-4">
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.GITHUB}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
GitHub
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a
|
|
href={EXTERNAL_LINKS.X}
|
|
target="_blank"
|
|
rel="noopener noreferrer"
|
|
className="text-sm leading-6 text-muted-foreground transition-colors hover:text-foreground">
|
|
X / Twitter
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="mt-16 flex border-t border-border pt-8 sm:mt-20 lg:mt-24">
|
|
<p className="mx-auto text-sm leading-5 text-muted-foreground">
|
|
© {new Date().getFullYear()} Roo Code. All rights reserved.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
)
|
|
}
|