"use client"
/**
* Catalog Apps grid — shelf marketing cards for every app.
*
* Each card uses the product's own brand hue (mixed toward transparent, not
* `--card`). Standard shelf UI mock on top. No brand hue bands.
*/
import * as React from "react"
import { Link } from "react-router"
import { Button } from "@/components/ui/button"
import { StatusBadge } from "@/components/ui/status-badge"
import type { ProductHomeCard } from "@/lib/product-home"
import { AdminAppPicker } from "./admin-app-picker"
import { BetaAccessAction } from "./product-beta-access"
import { CampusDoorFooter, useCampusDoor } from "./campus-home"
import { productBrandFieldStyle } from "./product-brand-cover"
import { ProductMarkTile } from "./product-mark-tile"
import { ShelfCardIllustration } from "./product-shelves"
export type CatalogAppState = "active" | "off-campus" | "not-included"
function catalogEntitlementTag(state: CatalogAppState, card: ProductHomeCard) {
if (state === "active") {
return
}
if (state === "off-campus") {
return
}
if (card.stage === "beta") return
if (card.stage === "new") return
return
}
const SHELF_CARD =
"group relative flex h-full flex-col overflow-hidden rounded-xl border border-transparent p-4 font-sans shadow-xs transition-shadow focus-within:shadow-md hover:shadow-md bg-white dark:bg-background sm:p-5"
function CatalogIllustrationBlock({
card,
state,
}: {
card: ProductHomeCard
state: CatalogAppState
}) {
return (
{catalogEntitlementTag(state, card)}
)
}
function CatalogActiveFooter({
card,
onOpen,
}: {
card: ProductHomeCard
onOpen: (card: ProductHomeCard) => void
}) {
const door = useCampusDoor(card, onOpen)
return (
{door.appScope ?
: null}
{door.forked ? (
<>
>
) : (
)}
)
}
function CatalogUpsellFooter({ card }: { card: ProductHomeCard }) {
const action =
card.stage === "beta" ? (
) : (
)
return (
)
}
function CatalogShelfMarketingCard({
card,
state,
onOpen,
}: {
card: ProductHomeCard
state: CatalogAppState
onOpen?: (card: ProductHomeCard) => void
}) {
const isActive = state === "active"
return (
{isActive ? (
card.label
) : (
{card.label}
)}
{!isActive && card.tagline ? (
{card.tagline}
) : null}
{isActive && onOpen ? (
) : (
)}
)
}
export function CatalogAppCard({
card,
state,
onOpen,
}: {
card: ProductHomeCard
state: CatalogAppState
onOpen: (card: ProductHomeCard) => void
}) {
return (
)
}