| 1 | import { ArrowRight, Bot, GitBranch, GitMerge, MessagesSquare, Rocket, ShieldCheck } from "lucide-react"; |
| 2 | import { Link } from "react-router"; |
| 3 | import type { Route } from "./+types/features"; |
| 4 | import { TrustPage } from "../components/trust-page"; |
| 5 | import { Card } from "../components/ui/card"; |
| 6 | import { ButtonLink } from "../components/ui"; |
| 7 | import { FEATURES } from "../lib/features"; |
| 8 | import { page } from "../lib/meta"; |
| 9 | |
| 10 | export function meta(args: Route.MetaArgs) { |
| 11 | return page(args, { |
| 12 | title: "g1t features · Code, agents, chat and deployments", |
| 13 | canonical: true, |
| 14 | description: "Explore g1t features: git repositories, pull requests, coding agents over MCP and REST, workflows, merge queues, deployments, team chat and security.", |
| 15 | }); |
| 16 | } |
| 17 | |
| 18 | const ICONS = [GitBranch, Bot, GitMerge, Rocket, MessagesSquare, ShieldCheck]; |
| 19 | |
| 20 | export default function Features() { |
| 21 | return ( |
| 22 | <TrustPage eyebrow="g1t features" title="From the first conversation to shipped code." lede="One workspace for your team's code and the coding agents you already use. Plan the work, review the changes and follow them into production."> |
| 23 | <div className="grid gap-4 sm:grid-cols-2"> |
| 24 | {FEATURES.map((feature, index) => { |
| 25 | const Icon = ICONS[index]!; |
| 26 | return ( |
| 27 | <Card asChild key={feature.id} className="flex flex-col p-6"> |
| 28 | <section aria-labelledby={feature.id}> |
| 29 | <Icon size={22} className="mb-5 text-accent" aria-hidden /> |
| 30 | <h2 id={feature.id} className="text-xl font-semibold tracking-tight">{feature.title}</h2> |
| 31 | <p className="mt-3 grow text-sm leading-relaxed text-muted">{feature.description}</p> |
| 32 | <div className="mt-5 flex flex-wrap gap-x-5 gap-y-3"> |
| 33 | {feature.links.map((link) => <Link key={link.href} to={link.href} className="inline-flex items-center gap-1.5 text-sm font-medium hover:text-accent">{link.label}<ArrowRight size={14} aria-hidden /></Link>)} |
| 34 | </div> |
| 35 | </section> |
| 36 | </Card> |
| 37 | ); |
| 38 | })} |
| 39 | </div> |
| 40 | <section className="mt-10 border-t border-line pt-8"> |
| 41 | <h2 className="text-2xl font-semibold tracking-tight">Start with the free forge.</h2> |
| 42 | <p className="mt-3 max-w-2xl text-muted">Create an account and a scoped access token yourself. Public repository reads need no token. Compute has separate usage costs; the pricing page explains what is included.</p> |
| 43 | <div className="mt-5 flex flex-wrap items-center gap-4"> |
| 44 | <ButtonLink to="/register">Get started</ButtonLink> |
| 45 | <Link to="/pricing" className="text-sm font-medium hover:text-accent">See pricing</Link> |
| 46 | <Link to="https://docs.g1t.sh/about/limitations/" className="text-sm text-muted hover:text-fg">Current limitations</Link> |
| 47 | </div> |
| 48 | </section> |
| 49 | </TrustPage> |
| 50 | ); |
| 51 | } |