"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 ? ( <>
) : (