site-footer.tsx 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import Link from "next/link";
  2. import { BrandLogo } from "@/components/brand/brand-logo";
  3. import {
  4. MARKETING_FOOTER_COMPANY,
  5. MARKETING_FOOTER_LEGAL,
  6. MARKETING_FOOTER_PRODUCT,
  7. } from "@/lib/marketing-nav";
  8. /** Official mark aspect ~231.6 / 236 — keep copy column = logo width */
  9. const FOOTER_LOGO_HEIGHT = 176;
  10. const FOOTER_LOGO_WIDTH = Math.round(FOOTER_LOGO_HEIGHT * (231.602 / 236));
  11. function FooterColumn({
  12. title,
  13. items,
  14. titleClassName,
  15. }: {
  16. title: string;
  17. items: { label: string; href: string }[];
  18. /** Logo-derived color for the column heading */
  19. titleClassName: string;
  20. }) {
  21. return (
  22. <div>
  23. <p
  24. className={`text-xs font-medium uppercase tracking-[0.14em] ${titleClassName}`}
  25. >
  26. {title}
  27. </p>
  28. <ul className="mt-4 flex flex-col gap-2.5">
  29. {items.map((item) => (
  30. <li key={item.href}>
  31. <Link
  32. href={item.href}
  33. className="text-xs text-muted-foreground transition-colors hover:text-foreground"
  34. >
  35. {item.label}
  36. </Link>
  37. </li>
  38. ))}
  39. </ul>
  40. </div>
  41. );
  42. }
  43. export function SiteFooter() {
  44. return (
  45. <footer className="bg-card/40">
  46. <div className="mx-auto flex max-w-6xl flex-col gap-14 px-5 py-16 lg:flex-row lg:items-start lg:justify-between lg:gap-24 lg:px-8">
  47. {/* Brand block — left */}
  48. <div
  49. className="flex shrink-0 flex-col gap-5"
  50. style={{ width: FOOTER_LOGO_WIDTH }}
  51. >
  52. <Link href="/" aria-label="krypco home" className="inline-block">
  53. <BrandLogo height={FOOTER_LOGO_HEIGHT} />
  54. </Link>
  55. <p className="text-sm leading-snug text-muted-foreground">
  56. Private speed. Public proof.
  57. </p>
  58. </div>
  59. {/* Three link columns — pushed right with breathing room */}
  60. <div className="grid grid-cols-2 gap-x-12 gap-y-10 sm:grid-cols-3 sm:gap-x-16 lg:ml-auto lg:shrink-0 lg:gap-x-20">
  61. {/* Colors from official mark: magenta · blue · green */}
  62. <FooterColumn
  63. title="Product"
  64. items={MARKETING_FOOTER_PRODUCT}
  65. titleClassName="text-accent-hover"
  66. />
  67. <FooterColumn
  68. title="Company"
  69. items={MARKETING_FOOTER_COMPANY}
  70. titleClassName="text-depth"
  71. />
  72. <FooterColumn
  73. title="Legal"
  74. items={MARKETING_FOOTER_LEGAL}
  75. titleClassName="text-proof"
  76. />
  77. </div>
  78. </div>
  79. <div className="mx-auto flex max-w-6xl flex-col gap-2 px-5 pb-8 pt-4 text-xs text-muted-foreground sm:flex-row sm:items-center sm:justify-between lg:px-8">
  80. <p>© {new Date().getFullYear()} krypco. All rights reserved.</p>
  81. <p className="tabular-nums">hybrid network · skeleton preview</p>
  82. </div>
  83. </footer>
  84. );
  85. }