diff --git a/apps/web/package.json b/apps/web/package.json index f462d54..87ded92 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -21,6 +21,7 @@ "@opennextjs/cloudflare": "^1.6.3", "@orama/orama": "^3.1.11", "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-hover-card": "^1.1.14", "babel-plugin-react-compiler": "^19.1.0-rc.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/apps/web/src/app/docs/layout.tsx b/apps/web/src/app/docs/layout.tsx index 6f9c84c..72266ae 100644 --- a/apps/web/src/app/docs/layout.tsx +++ b/apps/web/src/app/docs/layout.tsx @@ -7,7 +7,7 @@ import { source } from "@/lib/source"; const docsOptions: DocsLayoutProps = { ...baseOptions, tree: source.pageTree, - links: [], + // links: [], sidebar: { banner: , }, diff --git a/apps/web/src/app/global.css b/apps/web/src/app/global.css index 2ffa297..6241f9e 100644 --- a/apps/web/src/app/global.css +++ b/apps/web/src/app/global.css @@ -162,6 +162,8 @@ } :root { + --color-fd-primary: #8839ef; + --color-fd-primary-foreground: #ffffff; --background: oklch(1 0 0); --foreground: oklch(0.44 0.04 279.33); --card: oklch(1 0 0); @@ -227,6 +229,8 @@ } .dark { + --color-fd-primary: #cba6f7; + --color-fd-primary-foreground: #11111b; --background: #11111b; --foreground: #cdd6f4; --card: #11111b; diff --git a/apps/web/src/app/layout.config.tsx b/apps/web/src/app/layout.config.tsx index bde5f7d..1ef14ae 100644 --- a/apps/web/src/app/layout.config.tsx +++ b/apps/web/src/app/layout.config.tsx @@ -20,7 +20,7 @@ export const links: LinkItemType[] = [ { text: "Docs", url: "/docs", - active: "nested-url" as const, + active: "nested-url", }, { text: "Builder", diff --git a/apps/web/src/components/special-sponsor-banner.tsx b/apps/web/src/components/special-sponsor-banner.tsx index c029b21..1459cc1 100644 --- a/apps/web/src/components/special-sponsor-banner.tsx +++ b/apps/web/src/components/special-sponsor-banner.tsx @@ -1,9 +1,17 @@ "use client"; +import { Github, Globe, Star } from "lucide-react"; import Image from "next/image"; import { useEffect, useState } from "react"; +import { + HoverCard, + HoverCardContent, + HoverCardTrigger, +} from "@/components/ui/hover-card"; import { filterCurrentSponsors, filterSpecialSponsors, + formatSponsorUrl, + getSponsorUrl, sortSpecialSponsors, } from "@/lib/sponsor-utils"; import type { Sponsor } from "@/lib/types"; @@ -34,12 +42,14 @@ export function SpecialSponsorBanner() { if (loading) { return ( -
-
-
-
-
-
+
+
+ {["s1", "s2", "s3", "s4"].map((key) => ( +
+ ))}
); @@ -50,31 +60,107 @@ export function SpecialSponsorBanner() { } return ( -
-
- {specialSponsors.map((sponsor) => ( - - {sponsor.sponsor.name -
-

- {sponsor.sponsor.name || sponsor.sponsor.login} -

-
-
- ))} +
+
+ {specialSponsors.map((entry) => { + const displayName = entry.sponsor.name || entry.sponsor.login; + const imgSrc = entry.sponsor.customLogoUrl || entry.sponsor.avatarUrl; + const since = new Date(entry.createdAt).toLocaleDateString( + undefined, + { + year: "numeric", + month: "short", + }, + ); + const sponsorUrl = getSponsorUrl(entry); + + return ( + + + + {displayName} + + + +
+
+ +
+ SPECIAL + + SINCE {since.toUpperCase()} +
+
+
+ {displayName} +
+
+

+ {displayName} +

+ {entry.tierName ? ( +

+ {entry.tierName} +

+ ) : null} +
+
+ + + + {entry.sponsor.login} + + + {entry.sponsor.websiteUrl || entry.sponsor.linkUrl ? ( + + + + {formatSponsorUrl(sponsorUrl)} + + + ) : null} +
+
+
+
+
+
+ ); + })}
); diff --git a/apps/web/src/components/ui/hover-card.tsx b/apps/web/src/components/ui/hover-card.tsx new file mode 100644 index 0000000..8951788 --- /dev/null +++ b/apps/web/src/components/ui/hover-card.tsx @@ -0,0 +1,44 @@ +"use client"; + +import * as HoverCardPrimitive from "@radix-ui/react-hover-card"; +import type * as React from "react"; + +import { cn } from "@/lib/utils"; + +function HoverCard({ + ...props +}: React.ComponentProps) { + return ; +} + +function HoverCardTrigger({ + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function HoverCardContent({ + className, + align = "center", + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +export { HoverCard, HoverCardTrigger, HoverCardContent }; diff --git a/bun.lock b/bun.lock index d4278b0..9e0cd4e 100644 --- a/bun.lock +++ b/bun.lock @@ -14,7 +14,7 @@ }, "apps/cli": { "name": "create-better-t-stack", - "version": "2.29.3", + "version": "2.30.0", "bin": { "create-better-t-stack": "dist/index.js", }, @@ -49,6 +49,7 @@ "@opennextjs/cloudflare": "^1.6.3", "@orama/orama": "^3.1.11", "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-hover-card": "^1.1.14", "babel-plugin-react-compiler": "^19.1.0-rc.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1",