+ {/* Header */}
+
+
Team
+
+
+
+ {/* Inline invite form */}
+ {showInvite && (
+
+
+
+ )}
+
+ {/* Team table */}
+ {team.length === 0 ? (
+
}
+ title="No team members yet"
+ description="Invite colleagues to collaborate on this tenant."
+ action={
+
+ }
+ />
+ ) : (
+
+ )}
+
+ {/* Remove confirmation dialog */}
+
setRemoveTarget(null)}
+ onConfirm={handleRemove}
+ title="Remove Team Member"
+ description={`Are you sure you want to remove "${removeTarget?.name ?? ''}" from the team? They will lose access immediately.`}
+ confirmLabel="Remove"
+ cancelLabel="Cancel"
+ variant="danger"
+ loading={removeMember.isPending}
+ />
+
+ );
+}
diff --git a/ui/src/pages/tenant/TenantDashboardPage.tsx b/ui/src/pages/tenant/TenantDashboardPage.tsx
index 07a28ae..fde710a 100644
--- a/ui/src/pages/tenant/TenantDashboardPage.tsx
+++ b/ui/src/pages/tenant/TenantDashboardPage.tsx
@@ -1 +1,135 @@
-export function TenantDashboardPage() { return
+ {/* Header */}
+
+
License
+
+
+
+
+ {/* Validity card */}
+
+
+
+ Issued
+ {new Date(data.issuedAt).toLocaleDateString()}
+
+
+ Expires
+ {new Date(data.expiresAt).toLocaleDateString()}
+
+
+ Days remaining
+
+
+
+
+
+ {/* Features card */}
+
+
+ {Object.entries(data.features).map(([key, enabled]) => (
+
+ {key}
+
+
+ ))}
+ {Object.keys(data.features).length === 0 && (
+
No feature flags configured.
+ )}
+
+
+
+ {/* Limits & Usage card */}
+
+
+
+
+ {retentionDays >= 0 && (
+
+ Data retention
+ {retentionDays}d
+
+ )}
+
+
+
+
+ {/* License token card — full width */}
+
+
+
+ This token is embedded in your Cameleer server configuration. Keep it secret.
+
+
+
+ {showToken ? data.token : '••••••••••••••••••••••••••••••••'}
+
+
+
+
+
+
+
+
+
+ );
+}