(props: AdminPageShellProps)
| 35 | 'from-sky-400/16 via-cyan-400/8 to-transparent dark:from-sky-400/18 dark:via-cyan-400/8' |
| 36 | |
| 37 | export function AdminPageShell(props: AdminPageShellProps) { |
| 38 | const hasAside = !!props.aside |
| 39 | |
| 40 | return ( |
| 41 | <div className={cn('flex flex-col gap-6', props.className)}> |
| 42 | <Card |
| 43 | shadow="none" |
| 44 | className="border-divider/70 overflow-hidden rounded-[28px] border bg-white/58 backdrop-blur-xl dark:bg-content1/62" |
| 45 | > |
| 46 | <CardBody className="relative overflow-hidden p-0"> |
| 47 | <div className="absolute inset-0 bg-[radial-gradient(circle_at_top_right,rgba(56,189,248,0.18),transparent_26%),radial-gradient(circle_at_bottom_left,rgba(251,191,36,0.14),transparent_28%)] dark:bg-[radial-gradient(circle_at_top_right,rgba(34,211,238,0.18),transparent_24%),radial-gradient(circle_at_bottom_left,rgba(251,146,60,0.12),transparent_30%)]" /> |
| 48 | <div className="absolute inset-0 bg-[linear-gradient(rgba(15,23,42,0.055)_1px,transparent_1px),linear-gradient(90deg,rgba(15,23,42,0.055)_1px,transparent_1px)] [background-size:26px_26px] opacity-80 dark:bg-[linear-gradient(rgba(255,255,255,0.06)_1px,transparent_1px),linear-gradient(90deg,rgba(255,255,255,0.06)_1px,transparent_1px)] dark:opacity-20" /> |
| 49 | |
| 50 | <div |
| 51 | className={cn( |
| 52 | 'relative grid gap-6 px-5 py-6 sm:px-7 sm:py-7', |
| 53 | hasAside && 'xl:grid-cols-[minmax(0,1.7fr)_320px]' |
| 54 | )} |
| 55 | > |
| 56 | <div className="space-y-5"> |
| 57 | {props.eyebrow ? ( |
| 58 | <div className="flex flex-wrap items-center gap-3"> |
| 59 | <Chip |
| 60 | size="sm" |
| 61 | variant="flat" |
| 62 | className="border border-white/10 bg-black/70 px-2 text-white dark:bg-white/10" |
| 63 | > |
| 64 | {props.eyebrow} |
| 65 | </Chip> |
| 66 | </div> |
| 67 | ) : null} |
| 68 | |
| 69 | <div className="max-w-3xl space-y-3"> |
| 70 | <div> |
| 71 | <h1 className="text-3xl font-semibold tracking-tight sm:text-4xl"> |
| 72 | {props.title} |
| 73 | </h1> |
| 74 | {props.description ? ( |
| 75 | <p className="text-default-600 mt-2 max-w-2xl text-sm leading-6 sm:text-base"> |
| 76 | {props.description} |
| 77 | </p> |
| 78 | ) : null} |
| 79 | </div> |
| 80 | |
| 81 | {props.stats?.length ? ( |
| 82 | <div className="grid gap-3 sm:grid-cols-2 xl:grid-cols-3"> |
| 83 | {props.stats.map((stat, idx) => ( |
| 84 | <div |
| 85 | key={idx} |
| 86 | className={cn( |
| 87 | 'border-divider/60 bg-background/60 relative overflow-hidden rounded-2xl border px-4 py-3 backdrop-blur dark:border-white/10', |
| 88 | stat.accent && 'text-white' |
| 89 | )} |
| 90 | > |
| 91 | <div |
| 92 | className={cn( |
| 93 | 'absolute inset-0 bg-linear-to-br opacity-100', |
| 94 | stat.accent || DEFAULT_ACCENT |
nothing calls this directly
no outgoing calls
no test coverage detected