diff --git a/apps/broker/src/emails/mesh-invitation.tsx b/apps/broker/src/emails/mesh-invitation.tsx index 23fddc9..ac540f2 100644 --- a/apps/broker/src/emails/mesh-invitation.tsx +++ b/apps/broker/src/emails/mesh-invitation.tsx @@ -9,7 +9,6 @@ import { Link, Preview, Section, - Tailwind, Text, } from "@react-email/components"; import * as React from "react"; @@ -17,84 +16,295 @@ import * as React from "react"; interface MeshInvitationProps { meshName: string; inviteUrl: string; + token: string; expiresAt: string; appBaseUrl: string; } +// Brand tokens — mirror of apps/web/src/assets/styles/globals.css (--cm-*). +// Inlined here because email clients don't resolve CSS vars. +const brand = { + bg: "#141413", + bgElevated: "#1f1e1d", + bgCode: "#0f0e0d", + fg: "#faf9f5", + fgSecondary: "#c2c0b6", + fgTertiary: "#87867f", + clay: "#d97757", + clayBorder: "rgba(217, 119, 87, 0.35)", + border: "rgba(217, 119, 87, 0.2)", + serif: 'Georgia, "Times New Roman", serif', + mono: '"JetBrains Mono", "SF Mono", Menlo, Consolas, monospace', + sans: + '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif', +} as const; + export const MeshInvitation = ({ meshName, inviteUrl, + token, expiresAt, appBaseUrl, }: MeshInvitationProps) => { const expiresLabel = new Date(expiresAt).toUTCString(); + const launchCmd = `claudemesh launch --join ${inviteUrl}`; + const oneLiner = `npm i -g claudemesh-cli && ${launchCmd}`; return ( -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-