|
1 | 1 | "use client"; |
2 | 2 |
|
3 | | -import { motion } from "framer-motion"; |
4 | | - |
5 | | -const footer = { |
6 | | - products: [ |
7 | | - { name: "Actors", href: "https://rivet.dev/docs/actors" }, |
8 | | - { name: "Secure Exec", href: "/docs" }, |
9 | | - ], |
10 | | - developers: [ |
11 | | - { name: "Documentation", href: "/docs" }, |
12 | | - { name: "Changelog", href: "https://github.com/rivet-dev/secure-exec/releases" }, |
13 | | - { name: "Blog", href: "https://www.rivet.dev/blog/" }, |
14 | | - ], |
15 | | - legal: [ |
16 | | - { name: "Terms", href: "https://rivet.dev/terms" }, |
17 | | - { name: "Privacy Policy", href: "https://rivet.dev/privacy" }, |
18 | | - { name: "Acceptable Use", href: "https://rivet.dev/acceptable-use" }, |
19 | | - ], |
20 | | - social: [ |
21 | | - { |
22 | | - name: "Discord", |
23 | | - href: "https://rivet.dev/discord", |
24 | | - icon: ( |
25 | | - <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> |
26 | | - <path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" /> |
27 | | - </svg> |
28 | | - ), |
29 | | - }, |
30 | | - { |
31 | | - name: "GitHub", |
32 | | - href: "https://github.com/rivet-dev/secure-exec", |
33 | | - icon: ( |
34 | | - <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> |
35 | | - <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" /> |
36 | | - </svg> |
37 | | - ), |
38 | | - }, |
39 | | - { |
40 | | - name: "Twitter", |
41 | | - href: "https://x.com/rivet_dev", |
42 | | - icon: ( |
43 | | - <svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> |
44 | | - <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" /> |
45 | | - </svg> |
46 | | - ), |
47 | | - }, |
48 | | - ], |
49 | | -}; |
| 3 | +// Basic Secure Exec footer (dark chrome). Replaces the previously rivet-branded |
| 4 | +// footer — uses Secure Exec's own logo, tagline, and links. |
| 5 | +const links = [ |
| 6 | + { name: "Documentation", href: "/docs" }, |
| 7 | + { name: "Changelog", href: "https://github.com/rivet-dev/secure-exec/releases" }, |
| 8 | + { name: "GitHub", href: "https://github.com/rivet-dev/secure-exec" }, |
| 9 | + { name: "Discord", href: "https://rivet.dev/discord" }, |
| 10 | +]; |
50 | 11 |
|
51 | 12 | export function Footer() { |
52 | 13 | return ( |
53 | 14 | <footer className="border-t border-white/10 bg-[#09090b]"> |
54 | | - <div className="mx-auto max-w-6xl px-6 py-16 lg:py-20"> |
55 | | - <div className="xl:grid xl:grid-cols-12 xl:gap-16"> |
56 | | - <motion.div |
57 | | - initial={{ opacity: 0, y: 20 }} |
58 | | - whileInView={{ opacity: 1, y: 0 }} |
59 | | - viewport={{ once: true }} |
60 | | - transition={{ duration: 0.5 }} |
61 | | - className="space-y-6 xl:col-span-4" |
62 | | - > |
63 | | - <a href="https://rivet.dev" className="inline-block"> |
64 | | - <img src="/rivet-logo-text-white.svg" alt="Rivet" className="h-6 w-auto opacity-90 hover:opacity-100 transition-opacity" /> |
65 | | - </a> |
66 | | - <p className="text-sm leading-6 text-zinc-500">The primitive for stateful workloads</p> |
67 | | - <div className="flex space-x-4"> |
68 | | - {footer.social.map((item) => ( |
69 | | - <a key={item.name} href={item.href} className="text-zinc-500 hover:text-white transition-colors" target="_blank" rel="noopener noreferrer"> |
70 | | - <span className="sr-only">{item.name}</span> |
71 | | - {item.icon} |
72 | | - </a> |
73 | | - ))} |
74 | | - </div> |
75 | | - </motion.div> |
76 | | - |
77 | | - <div className="mt-12 grid grid-cols-2 gap-8 md:grid-cols-3 xl:col-span-8 xl:mt-0"> |
78 | | - <motion.div initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 0.1 }}> |
79 | | - <h3 className="text-sm font-semibold leading-6 text-white">Products</h3> |
80 | | - <ul role="list" className="mt-4 space-y-3"> |
81 | | - {footer.products.map((item) => ( |
82 | | - <li key={item.name}> |
83 | | - <a href={item.href} className="text-sm leading-6 text-zinc-500 hover:text-white transition-colors"> |
84 | | - {item.name} |
85 | | - </a> |
86 | | - </li> |
87 | | - ))} |
88 | | - </ul> |
89 | | - </motion.div> |
| 15 | + <div className="mx-auto flex max-w-6xl flex-col gap-8 px-6 py-12 sm:flex-row sm:items-center sm:justify-between"> |
| 16 | + <div className="space-y-3"> |
| 17 | + <a href="/" className="inline-block"> |
| 18 | + <img |
| 19 | + src="/secure-exec-logo-long.svg" |
| 20 | + alt="Secure Exec" |
| 21 | + className="h-6 w-auto opacity-90 transition-opacity hover:opacity-100" |
| 22 | + /> |
| 23 | + </a> |
| 24 | + <p className="text-sm text-zinc-500"> |
| 25 | + Secure Node.js execution — no containers, no VMs. |
| 26 | + </p> |
| 27 | + </div> |
90 | 28 |
|
91 | | - <motion.div |
92 | | - initial={{ opacity: 0, y: 20 }} |
93 | | - whileInView={{ opacity: 1, y: 0 }} |
94 | | - viewport={{ once: true }} |
95 | | - transition={{ duration: 0.5, delay: 0.15 }} |
96 | | - > |
97 | | - <h3 className="text-sm font-semibold leading-6 text-white">Developers</h3> |
98 | | - <ul role="list" className="mt-4 space-y-3"> |
99 | | - {footer.developers.map((item) => ( |
100 | | - <li key={item.name}> |
101 | | - <a href={item.href} className="text-sm leading-6 text-zinc-500 hover:text-white transition-colors"> |
102 | | - {item.name} |
103 | | - </a> |
104 | | - </li> |
105 | | - ))} |
106 | | - </ul> |
107 | | - </motion.div> |
| 29 | + <nav className="flex flex-wrap gap-x-6 gap-y-2"> |
| 30 | + {links.map((item) => { |
| 31 | + const external = item.href.startsWith("http"); |
| 32 | + return ( |
| 33 | + <a |
| 34 | + key={item.name} |
| 35 | + href={item.href} |
| 36 | + target={external ? "_blank" : undefined} |
| 37 | + rel={external ? "noopener noreferrer" : undefined} |
| 38 | + className="text-sm text-zinc-400 transition-colors hover:text-white" |
| 39 | + > |
| 40 | + {item.name} |
| 41 | + </a> |
| 42 | + ); |
| 43 | + })} |
| 44 | + </nav> |
| 45 | + </div> |
108 | 46 |
|
109 | | - <motion.div initial={{ opacity: 0, y: 20 }} whileInView={{ opacity: 1, y: 0 }} viewport={{ once: true }} transition={{ duration: 0.5, delay: 0.2 }}> |
110 | | - <h3 className="text-sm font-semibold leading-6 text-white">Legal</h3> |
111 | | - <ul role="list" className="mt-4 space-y-3"> |
112 | | - {footer.legal.map((item) => ( |
113 | | - <li key={item.name}> |
114 | | - <a href={item.href} className="text-sm leading-6 text-zinc-500 hover:text-white transition-colors"> |
115 | | - {item.name} |
116 | | - </a> |
117 | | - </li> |
118 | | - ))} |
119 | | - </ul> |
120 | | - </motion.div> |
121 | | - </div> |
| 47 | + <div className="border-t border-white/10"> |
| 48 | + <div className="mx-auto max-w-6xl px-6 py-6"> |
| 49 | + <p className="text-center text-xs text-zinc-600 sm:text-left"> |
| 50 | + © {new Date().getFullYear()} Rivet Gaming, Inc. Secure Exec is Apache 2.0 licensed. |
| 51 | + </p> |
122 | 52 | </div> |
123 | | - |
124 | | - <motion.div |
125 | | - initial={{ opacity: 0 }} |
126 | | - whileInView={{ opacity: 1 }} |
127 | | - viewport={{ once: true }} |
128 | | - transition={{ duration: 0.5, delay: 0.3 }} |
129 | | - className="mt-12 border-t border-white/10 pt-8" |
130 | | - > |
131 | | - <p className="text-xs text-zinc-600 text-center">© {new Date().getFullYear()} Rivet Gaming, Inc. All rights reserved.</p> |
132 | | - </motion.div> |
133 | 53 | </div> |
134 | 54 | </footer> |
135 | 55 | ); |
|
0 commit comments