Four real surfaces wired to tenant-registry (settings, settings/api-keys CRUD, audit pagination, products live entitlements), five forward-looking empty states with CTAs. 56 vitest tests + 10 Playwright canaries. lib/format.ts consolidates date helpers. Refs: M10.1
64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
// Empty state for surfaces whose real backend hasn't shipped yet.
|
|
// `milestone` names the milestone that unblocks the surface; `cta` is an
|
|
// optional in-portal action (link or button) the user can take in the
|
|
// meantime (e.g., "Browse the catalog" while real billing waits on M8.3).
|
|
|
|
import type { ReactNode } from "react";
|
|
|
|
export function ShellEmpty({
|
|
title,
|
|
description,
|
|
milestone,
|
|
details,
|
|
cta,
|
|
}: {
|
|
title: string;
|
|
description: string;
|
|
milestone: string;
|
|
details?: string;
|
|
cta?: ReactNode;
|
|
}) {
|
|
return (
|
|
<section style={{ maxWidth: 720 }}>
|
|
<h1 style={{ fontSize: 28, marginBottom: 8 }}>{title}</h1>
|
|
<p style={{ color: "#444", marginBottom: 24 }}>{description}</p>
|
|
<div
|
|
style={{
|
|
padding: 16,
|
|
border: "1px dashed #ddd",
|
|
borderRadius: 8,
|
|
background: "#fafafa",
|
|
color: "#666",
|
|
fontSize: 14,
|
|
}}
|
|
>
|
|
<div style={{ marginBottom: details ? 8 : 0 }}>
|
|
Lands in <code>{milestone}</code>. See{" "}
|
|
<a
|
|
href="https://gitea.meghsakha.com/platform/docs/src/branch/main/PLATFORM_ARCHITECTURE.md"
|
|
style={{ color: "#0070f3" }}
|
|
>
|
|
PLATFORM_ARCHITECTURE.md §5a
|
|
</a>
|
|
.
|
|
</div>
|
|
{details && <p style={{ marginTop: 8, marginBottom: 0 }}>{details}</p>}
|
|
{cta && <div style={{ marginTop: 12 }}>{cta}</div>}
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|
|
|
|
export function NotAuthorized() {
|
|
return (
|
|
<section style={{ maxWidth: 720 }}>
|
|
<h1 style={{ fontSize: 28, marginBottom: 8 }}>403 — Not authorized</h1>
|
|
<p style={{ color: "#444" }}>
|
|
This surface requires a role your account doesn't have. If you think
|
|
that's a mistake, ask an IT_ADMIN on your tenant to invite you with
|
|
the right role.
|
|
</p>
|
|
</section>
|
|
);
|
|
}
|