{ "$schema": "https://create-turbo-stack.dev/schema/package-registry.json", "name": "email-templates", "type": "registry:package", "description": "React Email transactional templates for auth, account, and billing flows.", "dependencies": [ "@react-email/components", "react" ], "devDependencies": [ "react-email" ], "registryDependencies": [], "envVars": {}, "exports": [ "." ], "lib": [ "ES2022", "DOM" ], "environment": "node", "build": "none", "categories": [ "email" ], "docs": "React Email transactional templates (auth, account/KVKK, billing) with shared Tailwind design tokens, transport-agnostic render(), and PreviewProps on every template — brand config in one file, domain-specific templates not included.", "files": [ { "path": "src/tailwind.config.ts", "type": "registry:source", "content": "import { pixelBasedPreset, type TailwindConfig } from \"react-email\";\n\n// Central brand configuration. Update colors here — templates pick them up automatically.\nconst tailwindConfig = {\n presets: [pixelBasedPreset],\n theme: {\n extend: {\n colors: {\n brand: {\n // Primary CTA color (buttons, key accents)\n primary: \"#18181b\",\n // Foreground on primary (button text)\n primaryFg: \"#ffffff\",\n // Muted links, secondary labels\n muted: \"#71717a\",\n // Body text\n body: \"#3f3f46\",\n // Heading text\n heading: \"#09090b\",\n // Dividers and borders\n border: \"#e4e4e7\",\n // Email body background\n bg: \"#f4f4f5\",\n // Card / container background\n surface: \"#ffffff\",\n // Warning box background (security notices, expiry)\n warnBg: \"#fffbeb\",\n // Warning box text\n warnText: \"#92400e\",\n // Info box background (login details, metadata)\n infoBg: \"#eff6ff\",\n // Info box text\n infoText: \"#1e40af\",\n },\n },\n },\n },\n} satisfies TailwindConfig;\n\nexport default tailwindConfig;\n\n// Brand assets — update src to your production CDN URL.\nexport const brand = {\n name: \"Your Company\",\n // Logo: 160×40px PNG hosted on a CDN. Leave empty to show text name instead.\n logoSrc: \"\",\n logoAlt: \"Your Company\",\n logoWidth: 120,\n logoHeight: 32,\n // CAN-SPAM / KVKK required: physical mailing address.\n address: \"Your Company · 123 Main Street · City, Country\",\n // Base URL for generating links in PreviewProps\n baseUrl: \"https://yourcompany.com\",\n};\n" }, { "path": "src/emails/components/layout.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport {\n Body,\n Container,\n Head,\n Hr,\n Html,\n Img,\n Link,\n Preview,\n Section,\n Tailwind,\n Text,\n} from \"react-email\";\nimport tailwindConfig, { brand } from \"../tailwind.config\";\n\nexport interface EmailLayoutProps {\n preview: string;\n children: React.ReactNode;\n companyName?: string;\n /** Absolute URL to your logo PNG. Falls back to text name. */\n logoSrc?: string;\n logoAlt?: string;\n /** Physical address for CAN-SPAM / KVKK footer. */\n companyAddress?: string;\n unsubscribeUrl?: string;\n}\n\nexport function EmailLayout({\n preview,\n children,\n companyName = brand.name,\n logoSrc = brand.logoSrc,\n logoAlt = brand.logoAlt,\n companyAddress = brand.address,\n unsubscribeUrl,\n}: EmailLayoutProps) {\n const year = new Date().getFullYear();\n\n return (\n \n \n \n \n {preview}\n\n \n {/* Header — logo or company name */}\n
\n {logoSrc ? (\n \n ) : (\n \n {companyName}\n \n )}\n
\n\n
\n\n {/* Content slot */}\n
{children}
\n\n {/* Footer */}\n
\n
\n \n {companyAddress}\n \n \n {`© ${year} ${companyName}`}\n \n {unsubscribeUrl ? (\n \n \n Unsubscribe\n \n \n ) : null}\n
\n
\n \n
\n \n );\n}\n\nexport default EmailLayout;\n" }, { "path": "src/emails/auth/verify-email.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface VerifyEmailProps {\n verificationUrl: string;\n userEmail: string;\n expiresInMinutes?: number;\n companyName?: string;\n}\n\nexport function VerifyEmail({\n verificationUrl,\n userEmail,\n expiresInMinutes = 60,\n companyName = brand.name,\n}: VerifyEmailProps) {\n return (\n \n \n Verify your email\n \n \n We received a request to verify {userEmail} on your{\" \"}\n {companyName} account. Click the button below to confirm.\n \n
\n \n Verify email address\n \n
\n \n This link expires in {expiresInMinutes} minutes. If you did not create a{\" \"}\n {companyName} account, you can safely ignore this email.\n \n
\n );\n}\n\nVerifyEmail.PreviewProps = {\n verificationUrl: `${brand.baseUrl}/verify?token=preview-token`,\n userEmail: \"user@example.com\",\n expiresInMinutes: 60,\n companyName: brand.name,\n} satisfies VerifyEmailProps;\n\nexport default VerifyEmail;\n" }, { "path": "src/emails/auth/reset-password.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface ResetPasswordEmailProps {\n resetUrl: string;\n userEmail: string;\n expiresInMinutes?: number;\n companyName?: string;\n}\n\nexport function ResetPasswordEmail({\n resetUrl,\n userEmail,\n expiresInMinutes = 30,\n companyName = brand.name,\n}: ResetPasswordEmailProps) {\n return (\n \n \n Reset your password\n \n \n We received a request to reset the password for{\" \"}\n {userEmail}. Click the button below to choose a new\n password.\n \n
\n \n Reset password\n \n
\n
\n \n This link expires in {expiresInMinutes} minutes. If you did not\n request a password reset, your account is safe — you can ignore this\n email.\n \n
\n
\n );\n}\n\nResetPasswordEmail.PreviewProps = {\n resetUrl: `${brand.baseUrl}/reset-password?token=preview-token`,\n userEmail: \"user@example.com\",\n expiresInMinutes: 30,\n companyName: brand.name,\n} satisfies ResetPasswordEmailProps;\n\nexport default ResetPasswordEmail;\n" }, { "path": "src/emails/auth/magic-link.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface MagicLinkEmailProps {\n magicUrl: string;\n userEmail: string;\n expiresInMinutes?: number;\n companyName?: string;\n}\n\nexport function MagicLinkEmail({\n magicUrl,\n userEmail,\n expiresInMinutes = 15,\n companyName = brand.name,\n}: MagicLinkEmailProps) {\n return (\n \n \n Sign in to {companyName}\n \n \n Click the button below to sign in as {userEmail}. This\n link is single-use and expires in {expiresInMinutes} minutes.\n \n
\n \n Sign in\n \n
\n \n If you did not request this link, you can safely ignore this email. Your\n account has not been affected.\n \n \n );\n}\n\nMagicLinkEmail.PreviewProps = {\n magicUrl: `${brand.baseUrl}/auth/magic?token=preview-token`,\n userEmail: \"user@example.com\",\n expiresInMinutes: 15,\n companyName: brand.name,\n} satisfies MagicLinkEmailProps;\n\nexport default MagicLinkEmail;\n" }, { "path": "src/emails/auth/welcome.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface WelcomeEmailProps {\n userName: string;\n loginUrl: string;\n companyName?: string;\n}\n\nexport function WelcomeEmail({\n userName,\n loginUrl,\n companyName = brand.name,\n}: WelcomeEmailProps) {\n return (\n \n \n Welcome, {userName}!\n \n \n Your account is ready. Click below to sign in and get started.\n \n
\n \n Go to {companyName}\n \n
\n \n If you have any questions, reply to this email — we are happy to help.\n \n \n );\n}\n\nWelcomeEmail.PreviewProps = {\n userName: \"Alex Johnson\",\n loginUrl: `${brand.baseUrl}/dashboard`,\n companyName: brand.name,\n} satisfies WelcomeEmailProps;\n\nexport default WelcomeEmail;\n" }, { "path": "src/emails/auth/new-login.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface NewLoginEmailProps {\n userEmail: string;\n /** Formatted datetime string, e.g. \"June 5, 2025 at 14:32 UTC\". */\n loginTime: string;\n ipAddress?: string;\n location?: string;\n deviceInfo?: string;\n secureAccountUrl: string;\n companyName?: string;\n}\n\nexport function NewLoginEmail({\n userEmail,\n loginTime,\n ipAddress,\n location,\n deviceInfo,\n secureAccountUrl,\n companyName = brand.name,\n}: NewLoginEmailProps) {\n return (\n \n \n New sign-in detected\n \n \n Your {companyName} account ({userEmail}) was just signed in to.\n \n
\n \n Time: {loginTime}\n \n {deviceInfo ? (\n \n Device: {deviceInfo}\n \n ) : null}\n {location ? (\n \n Location: {location}\n \n ) : null}\n {ipAddress ? (\n \n IP address: {ipAddress}\n \n ) : null}\n
\n \n If this was you, no action is needed. If you do not recognise this\n sign-in, secure your account immediately.\n \n
\n \n Secure my account\n \n
\n \n );\n}\n\nNewLoginEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n loginTime: \"June 5, 2025 at 14:32 UTC\",\n ipAddress: \"203.0.113.42\",\n location: \"Istanbul, Turkey\",\n deviceInfo: \"Chrome on macOS\",\n secureAccountUrl: `${brand.baseUrl}/account/security`,\n companyName: brand.name,\n} satisfies NewLoginEmailProps;\n\nexport default NewLoginEmail;\n" }, { "path": "src/emails/auth/password-changed.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Heading, Link, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface PasswordChangedEmailProps {\n userEmail: string;\n changedAt: string;\n supportUrl: string;\n companyName?: string;\n}\n\nexport function PasswordChangedEmail({\n userEmail,\n changedAt,\n supportUrl,\n companyName = brand.name,\n}: PasswordChangedEmailProps) {\n return (\n \n \n Password changed\n \n \n The password for your {companyName} account ({userEmail}) was changed on{\" \"}\n {changedAt}.\n \n
\n \n If you did not make this change, contact support immediately at{\" \"}\n \n {supportUrl}\n \n .\n \n
\n \n If this was you, no action is needed. Your account is secure.\n \n \n );\n}\n\nPasswordChangedEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n changedAt: \"June 5, 2025 at 14:32 UTC\",\n supportUrl: `${brand.baseUrl}/support`,\n companyName: brand.name,\n} satisfies PasswordChangedEmailProps;\n\nexport default PasswordChangedEmail;\n" }, { "path": "src/emails/auth/email-changed.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Heading, Link, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface EmailChangedEmailProps {\n oldEmail: string;\n newEmail: string;\n changedAt: string;\n supportUrl: string;\n companyName?: string;\n}\n\nexport function EmailChangedEmail({\n oldEmail,\n newEmail,\n changedAt,\n supportUrl,\n companyName = brand.name,\n}: EmailChangedEmailProps) {\n return (\n \n \n Email address updated\n \n \n Your {companyName} account email address was changed on {changedAt}.\n \n
\n \n Previous: {oldEmail}\n \n \n New: {newEmail}\n \n
\n
\n \n If you did not make this change, contact support immediately at{\" \"}\n \n {supportUrl}\n \n .\n \n
\n \n );\n}\n\nEmailChangedEmail.PreviewProps = {\n oldEmail: \"old@example.com\",\n newEmail: \"new@example.com\",\n changedAt: \"June 5, 2025 at 14:32 UTC\",\n supportUrl: `${brand.baseUrl}/support`,\n companyName: brand.name,\n} satisfies EmailChangedEmailProps;\n\nexport default EmailChangedEmail;\n" }, { "path": "src/emails/auth/mfa-changed.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Heading, Link, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport type MfaAction = \"enabled\" | \"disabled\";\n\nexport interface MfaChangedEmailProps {\n userEmail: string;\n action: MfaAction;\n changedAt: string;\n supportUrl: string;\n companyName?: string;\n}\n\nexport function MfaChangedEmail({\n userEmail,\n action,\n changedAt,\n supportUrl,\n companyName = brand.name,\n}: MfaChangedEmailProps) {\n const isEnabled = action === \"enabled\";\n return (\n \n \n Two-factor authentication {isEnabled ? \"enabled\" : \"disabled\"}\n \n \n Two-factor authentication was {action} on your{\" \"}\n {companyName} account ({userEmail}) on {changedAt}.\n \n {isEnabled ? (\n \n Your account is now more secure. If you did not make this change,\n contact support at{\" \"}\n \n {supportUrl}\n \n .\n \n ) : (\n
\n \n Your account is now less protected. If you did not make this change,\n contact support immediately at{\" \"}\n \n {supportUrl}\n \n .\n \n
\n )}\n \n );\n}\n\nMfaChangedEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n action: \"enabled\" as MfaAction,\n changedAt: \"June 5, 2025 at 14:32 UTC\",\n supportUrl: `${brand.baseUrl}/support`,\n companyName: brand.name,\n} satisfies MfaChangedEmailProps;\n\nexport default MfaChangedEmail;\n" }, { "path": "src/emails/auth/team-invitation.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface TeamInvitationEmailProps {\n inviterName: string;\n teamName: string;\n invitationUrl: string;\n expiresInDays?: number;\n companyName?: string;\n}\n\nexport function TeamInvitationEmail({\n inviterName,\n teamName,\n invitationUrl,\n expiresInDays = 7,\n companyName = brand.name,\n}: TeamInvitationEmailProps) {\n return (\n \n \n You have been invited\n \n \n {inviterName} has invited you to join the{\" \"}\n {teamName} workspace on {companyName}.\n \n
\n \n Accept invitation\n \n
\n \n This invitation expires in {expiresInDays} days. If you were not\n expecting an invitation, you can safely ignore this email.\n \n \n );\n}\n\nTeamInvitationEmail.PreviewProps = {\n inviterName: \"Alex Johnson\",\n teamName: \"Acme Engineering\",\n invitationUrl: `${brand.baseUrl}/invite?token=preview-token`,\n expiresInDays: 7,\n companyName: brand.name,\n} satisfies TeamInvitationEmailProps;\n\nexport default TeamInvitationEmail;\n" }, { "path": "src/emails/account/data-export-ready.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface DataExportReadyEmailProps {\n userEmail: string;\n downloadUrl: string;\n /** Hours until the download link expires. */\n expiresInHours?: number;\n companyName?: string;\n}\n\nexport function DataExportReadyEmail({\n userEmail,\n downloadUrl,\n expiresInHours = 48,\n companyName = brand.name,\n}: DataExportReadyEmailProps) {\n return (\n \n \n Your data export is ready\n \n \n The data export you requested for {userEmail} is ready.\n Click the button below to download your data.\n \n
\n \n Download my data\n \n
\n \n This download link expires in {expiresInHours} hours. After that, you\n will need to request a new export from your account settings.\n \n \n );\n}\n\nDataExportReadyEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n downloadUrl: `${brand.baseUrl}/exports/download?token=preview-token`,\n expiresInHours: 48,\n companyName: brand.name,\n} satisfies DataExportReadyEmailProps;\n\nexport default DataExportReadyEmail;\n" }, { "path": "src/emails/account/deletion-requested.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface DeletionRequestedEmailProps {\n userEmail: string;\n /** Days until permanent deletion. */\n gracePeriodDays: number;\n /** Formatted date when deletion will occur. */\n scheduledAt: string;\n /** URL to cancel the deletion request. */\n cancellationUrl: string;\n companyName?: string;\n}\n\nexport function DeletionRequestedEmail({\n userEmail,\n gracePeriodDays,\n scheduledAt,\n cancellationUrl,\n companyName = brand.name,\n}: DeletionRequestedEmailProps) {\n return (\n \n \n Account deletion requested\n \n \n We received a request to permanently delete the {companyName} account\n associated with {userEmail}.\n \n
\n \n Your account and all associated data will be permanently deleted on{\" \"}\n {scheduledAt}. This action cannot be undone.\n \n
\n \n If you change your mind, you have{\" \"}\n {gracePeriodDays} days to cancel this request.\n \n
\n \n Cancel deletion\n \n
\n \n If you did not request this deletion, contact support immediately.\n \n \n );\n}\n\nDeletionRequestedEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n gracePeriodDays: 30,\n scheduledAt: \"July 5, 2025\",\n cancellationUrl: `${brand.baseUrl}/account/cancel-deletion?token=preview-token`,\n companyName: brand.name,\n} satisfies DeletionRequestedEmailProps;\n\nexport default DeletionRequestedEmail;\n" }, { "path": "src/emails/account/deletion-completed.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Heading, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface DeletionCompletedEmailProps {\n userEmail: string;\n deletedAt: string;\n companyName?: string;\n}\n\nexport function DeletionCompletedEmail({\n userEmail,\n deletedAt,\n companyName = brand.name,\n}: DeletionCompletedEmailProps) {\n return (\n \n \n Account deleted\n \n \n The {companyName} account associated with {userEmail}{\" \"}\n was permanently deleted on {deletedAt}.\n \n \n All your data has been removed from our systems in accordance with our\n data retention policy.\n \n \n If you did not request this deletion or believe this is an error,\n contact support as soon as possible.\n \n \n );\n}\n\nDeletionCompletedEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n deletedAt: \"June 5, 2025\",\n companyName: brand.name,\n} satisfies DeletionCompletedEmailProps;\n\nexport default DeletionCompletedEmail;\n" }, { "path": "src/emails/billing/payment-receipt.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Heading, Hr, Link, Row, Column, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport interface PaymentReceiptEmailProps {\n userEmail: string;\n /** Pre-formatted amount string, e.g. \"$49.00\" or \"₺1.499,00\". */\n amount: string;\n paymentDate: string;\n receiptNumber: string;\n planName: string;\n receiptUrl?: string;\n companyName?: string;\n}\n\nexport function PaymentReceiptEmail({\n userEmail,\n amount,\n paymentDate,\n receiptNumber,\n planName,\n receiptUrl,\n companyName = brand.name,\n}: PaymentReceiptEmailProps) {\n return (\n \n \n Payment receipt\n \n \n Thank you for your payment. Here is a summary for your records.\n \n\n {/* Receipt details table */}\n
\n \n \n \n Amount\n \n \n \n \n {amount}\n \n \n \n
\n \n \n \n Plan\n \n \n \n \n {planName}\n \n \n \n \n \n \n Date\n \n \n \n \n {paymentDate}\n \n \n \n \n \n \n Receipt\n \n \n \n \n {receiptNumber}\n \n \n \n \n \n \n Billed to\n \n \n \n \n {userEmail}\n \n \n \n
\n\n {receiptUrl ? (\n \n \n View full receipt\n \n \n ) : null}\n \n );\n}\n\nPaymentReceiptEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n amount: \"$49.00\",\n paymentDate: \"June 5, 2025\",\n receiptNumber: \"RCP-2025-00142\",\n planName: \"Pro Plan — Monthly\",\n receiptUrl: `${brand.baseUrl}/billing/receipts/preview`,\n companyName: brand.name,\n} satisfies PaymentReceiptEmailProps;\n\nexport default PaymentReceiptEmail;\n" }, { "path": "src/emails/billing/subscription-event.tsx", "type": "registry:source", "content": "import * as React from \"react\";\nimport { Button, Heading, Section, Text } from \"react-email\";\nimport { EmailLayout } from \"../components/layout\";\nimport { brand } from \"../tailwind.config\";\n\nexport type SubscriptionEventType =\n | \"started\"\n | \"renewed\"\n | \"canceled\"\n | \"paused\"\n | \"reactivated\";\n\nconst EVENT_COPY: Record<\n SubscriptionEventType,\n { subject: string; heading: string; body: string }\n> = {\n started: {\n subject: \"Your subscription has started\",\n heading: \"Subscription started\",\n body: \"Your subscription is now active. You have full access to all features included in your plan.\",\n },\n renewed: {\n subject: \"Your subscription has been renewed\",\n heading: \"Subscription renewed\",\n body: \"Your subscription has been renewed for another period. Your access continues uninterrupted.\",\n },\n canceled: {\n subject: \"Your subscription has been canceled\",\n heading: \"Subscription canceled\",\n body: \"Your subscription has been canceled. You will retain access until the end of your current billing period.\",\n },\n paused: {\n subject: \"Your subscription has been paused\",\n heading: \"Subscription paused\",\n body: \"Your subscription is paused. You will not be charged during this period. Resume anytime from your account settings.\",\n },\n reactivated: {\n subject: \"Your subscription has been reactivated\",\n heading: \"Subscription reactivated\",\n body: \"Your subscription is active again. You have full access to all features included in your plan.\",\n },\n};\n\nexport interface SubscriptionEventEmailProps {\n userEmail: string;\n event: SubscriptionEventType;\n planName: string;\n effectiveDate: string;\n managePlanUrl: string;\n companyName?: string;\n}\n\nexport function SubscriptionEventEmail({\n userEmail,\n event,\n planName,\n effectiveDate,\n managePlanUrl,\n companyName = brand.name,\n}: SubscriptionEventEmailProps) {\n const copy = EVENT_COPY[event];\n return (\n \n \n {copy.heading}\n \n \n {copy.body}\n \n
\n \n Account: {userEmail}\n \n \n Plan: {planName}\n \n \n Effective: {effectiveDate}\n \n
\n
\n \n Manage plan\n \n
\n
\n );\n}\n\nSubscriptionEventEmail.PreviewProps = {\n userEmail: \"user@example.com\",\n event: \"renewed\" as SubscriptionEventType,\n planName: \"Pro Plan — Monthly\",\n effectiveDate: \"June 5, 2025\",\n managePlanUrl: `${brand.baseUrl}/billing`,\n companyName: brand.name,\n} satisfies SubscriptionEventEmailProps;\n\nexport default SubscriptionEventEmail;\n" }, { "path": "src/index.ts", "type": "registry:source", "content": "// Auth\nexport { VerifyEmail } from \"./auth/verify-email\";\nexport { ResetPasswordEmail } from \"./auth/reset-password\";\nexport { MagicLinkEmail } from \"./auth/magic-link\";\nexport { WelcomeEmail } from \"./auth/welcome\";\nexport { NewLoginEmail } from \"./auth/new-login\";\nexport { PasswordChangedEmail } from \"./auth/password-changed\";\nexport { EmailChangedEmail } from \"./auth/email-changed\";\nexport { MfaChangedEmail } from \"./auth/mfa-changed\";\nexport { TeamInvitationEmail } from \"./auth/team-invitation\";\n\n// Account (KVKK / GDPR)\nexport { DataExportReadyEmail } from \"./account/data-export-ready\";\nexport { DeletionRequestedEmail } from \"./account/deletion-requested\";\nexport { DeletionCompletedEmail } from \"./account/deletion-completed\";\n\n// Billing\nexport { PaymentReceiptEmail } from \"./billing/payment-receipt\";\nexport { SubscriptionEventEmail } from \"./billing/subscription-event\";\n\n// Props types\nexport type { VerifyEmailProps } from \"./auth/verify-email\";\nexport type { ResetPasswordEmailProps } from \"./auth/reset-password\";\nexport type { MagicLinkEmailProps } from \"./auth/magic-link\";\nexport type { WelcomeEmailProps } from \"./auth/welcome\";\nexport type { NewLoginEmailProps } from \"./auth/new-login\";\nexport type { PasswordChangedEmailProps } from \"./auth/password-changed\";\nexport type { EmailChangedEmailProps } from \"./auth/email-changed\";\nexport type { MfaChangedEmailProps, MfaAction } from \"./auth/mfa-changed\";\nexport type { TeamInvitationEmailProps } from \"./auth/team-invitation\";\nexport type { DataExportReadyEmailProps } from \"./account/data-export-ready\";\nexport type { DeletionRequestedEmailProps } from \"./account/deletion-requested\";\nexport type { DeletionCompletedEmailProps } from \"./account/deletion-completed\";\nexport type { PaymentReceiptEmailProps } from \"./billing/payment-receipt\";\nexport type {\n SubscriptionEventEmailProps,\n SubscriptionEventType,\n} from \"./billing/subscription-event\";\n\n// Render utilities — re-export so callers don't need a separate import\nexport { render } from \"react-email\"; // Plain text: render(el, { plainText: true })\n\n// Brand config — export for callers who need to override defaults\nexport { default as tailwindConfig, brand } from \"./tailwind.config\";\n" } ], "checksum": "sha256-4df44e1391f087e79d86a931bf22f08c68d7c024975ccede6efa7e77f8015ff7" }