@hintoric/email 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/render.ts","../src/tokens.ts","../src/safeUrl.ts","../src/styles.ts","../src/components/Link.tsx","../src/components/Typography.tsx","../src/components/Layout.tsx","../src/components/Button.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Avatar.tsx","../src/components/Chip.tsx","../src/components/HintoricLogo.tsx","../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx","../src/templates/SecurityActivityAlert/messages.tsx","../src/templates/WaitlistWelcome/WaitlistWelcomeEmail.tsx","../src/templates/WaitlistWelcome/messages.ts"],"sourcesContent":["import type * as React from 'react';\nimport { render } from '@react-email/render';\n\nexport interface RenderedEmailBody {\n html: string;\n /** The plain-text part. Multipart mails without one score worse with spam filters. */\n text: string;\n}\n\n/** Renders an email element — normally a `<Layout>` — to HTML and plain text. */\nexport async function renderEmail(element: React.ReactElement): Promise<RenderedEmailBody> {\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { html, text };\n}\n","/*\n * The email module's copy of theme.css, resolved to literal values.\n *\n * Email clients cannot use the component library's styling: Gmail, Outlook\n * and Apple Mail resolve neither CSS custom properties nor Tailwind classes,\n * and Gmail drops <style> blocks in some contexts. So every email component\n * paints with inline `style` values taken from here, and the dark scheme is a\n * progressive enhancement layered on top (see styles.ts).\n *\n * The raw stops are theme.css's; the per-variant mapping below is the same\n * formula theme.css spells out token by token (Joy's createLight/DarkMode\n * VariantVariables, with neutral's -700 plain/outlined override in light).\n * The parity tests in src/visual/email/*.visual.test.tsx compare every email\n * component against its web counterpart in both schemes, so a drift between\n * the two shows up as a failing computed-style assertion.\n */\n\nexport type EmailColor = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\nexport type EmailVariant = 'solid' | 'soft' | 'outlined' | 'plain';\nexport type EmailScheme = 'light' | 'dark';\n\ntype Stop = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport const emailPalette: Record<EmailColor, Record<Stop, string>> = {\n neutral: { 50: '#FBFCFE', 100: '#F0F4F8', 200: '#DDE7EE', 300: '#CDD7E1', 400: '#9FA6AD', 500: '#636B74', 600: '#555E68', 700: '#32383E', 800: '#171A1C', 900: '#0B0D0E' },\n primary: { 50: '#EDF5FD', 100: '#E3EFFB', 200: '#C7DFF7', 300: '#97C3F0', 400: '#4393E4', 500: '#0B6BCB', 600: '#185EA5', 700: '#12467B', 800: '#0A2744', 900: '#051423' },\n warning: { 50: '#FEFAF6', 100: '#FDF0E1', 200: '#FCE1C2', 300: '#F3C896', 400: '#EA9A3E', 500: '#9A5B13', 600: '#72430D', 700: '#492B08', 800: '#2E1B05', 900: '#1D1002' },\n danger: { 50: '#FEF6F6', 100: '#FCE4E4', 200: '#F7C5C5', 300: '#F09898', 400: '#E47474', 500: '#C41C1C', 600: '#A51818', 700: '#7D1212', 800: '#430A0A', 900: '#240505' },\n success: { 50: '#F6FEF6', 100: '#E3FBE3', 200: '#C7F7C7', 300: '#A1E8A1', 400: '#51BC51', 500: '#1F7A1F', 600: '#136C13', 700: '#0A470A', 800: '#042F04', 900: '#021D02' },\n};\n\nexport const EMAIL_COLORS: EmailColor[] = ['primary', 'neutral', 'danger', 'success', 'warning'];\nexport const EMAIL_VARIANTS: EmailVariant[] = ['solid', 'soft', 'outlined', 'plain'];\n\n/** What one variant × colour paints. `undefined` means \"leaves it to the surroundings\". */\nexport interface EmailVariantTokens {\n color: string;\n backgroundColor?: string;\n borderColor?: string;\n}\n\nexport function variantTokens(scheme: EmailScheme, variant: EmailVariant, color: EmailColor): EmailVariantTokens {\n const c = emailPalette[color];\n const dark = scheme === 'dark';\n switch (variant) {\n case 'solid':\n return { color: '#FFFFFF', backgroundColor: c[500] };\n case 'soft':\n return dark ? { color: c[200], backgroundColor: c[800] } : { color: c[700], backgroundColor: c[100] };\n case 'outlined':\n return dark\n ? { color: c[200], borderColor: c[700] }\n : { color: color === 'neutral' ? c[700] : c[500], borderColor: c[300] };\n case 'plain':\n return { color: dark ? c[300] : color === 'neutral' ? c[700] : c[500] };\n }\n}\n\n/** `--color-*-main`: step 500 in light, 400 in dark. What Link renders. */\nexport function mainColor(scheme: EmailScheme, color: EmailColor): string {\n return emailPalette[color][scheme === 'dark' ? 400 : 500];\n}\n\nexport interface EmailSchemeTokens {\n inkPrimary: string;\n inkSecondary: string;\n inkTertiary: string;\n /** `--color-ink-icon`: the faintest ink. */\n inkIcon: string;\n /** `--color-surface`: what a Sheet / Card paints under outlined and plain. */\n surface: string;\n /** `--color-surface-1`. */\n surface1: string;\n /**\n * `--color-divider`. Kept as the rgba() theme.css uses so it composites the\n * same way over any surface; Outlook's Word engine drops rgba(), which is\n * why Divider also sets a solid `dividerFallback`.\n */\n divider: string;\n /** `divider` flattened onto `surface`. */\n dividerFallback: string;\n}\n\nexport const emailSchemes: Record<EmailScheme, EmailSchemeTokens> = {\n light: {\n inkPrimary: emailPalette.neutral[800],\n inkSecondary: emailPalette.neutral[700],\n inkTertiary: emailPalette.neutral[600],\n inkIcon: emailPalette.neutral[500],\n surface: emailPalette.neutral[50],\n surface1: emailPalette.neutral[100],\n divider: 'rgba(99, 107, 116, 0.2)',\n dividerFallback: '#DCDFE2',\n },\n dark: {\n inkPrimary: emailPalette.neutral[100],\n inkSecondary: emailPalette.neutral[300],\n inkTertiary: emailPalette.neutral[400],\n inkIcon: emailPalette.neutral[400],\n surface: emailPalette.neutral[900],\n surface1: emailPalette.neutral[800],\n divider: 'rgba(159, 166, 173, 0.16)',\n dividerFallback: '#232628',\n },\n};\n\nexport const emailFonts = {\n // `--font-body`.\n body: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n // core's `--font-heading`. Only clients with the font installed or web-font\n // support (Apple Mail) show Montserrat; the rest fall back to the body stack.\n heading: \"Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n};\n\n/** theme.css's radius scale. */\nexport const emailRadius = { xs: '2px', sm: '6px', md: '8px', lg: '12px', xl: '16px' };\n","/*\n * Every link in an email is a link someone may click without a second look —\n * a security alert's \"review this activity\" button most of all. React escapes\n * text but not the scheme of an href, so a `javascript:` or `data:` URL that\n * reached a template through data would survive rendering intact. Only these\n * schemes are let through; anything else renders as plain, unlinked text.\n */\nconst LINK_PROTOCOLS = new Set(['https:', 'http:', 'mailto:']);\n\nexport function safeHref(href: string | undefined | null): string | undefined {\n if (!href) return undefined;\n try {\n const url = new URL(href);\n return LINK_PROTOCOLS.has(url.protocol) ? url.href : undefined;\n } catch {\n // Relative URLs are meaningless in an email: there is no base to resolve\n // them against once the message leaves the server.\n return undefined;\n }\n}\n\n/** Images additionally have to be https: mail clients block or warn on http. */\nexport function safeImageSrc(src: string | undefined | null): string | undefined {\n if (!src) return undefined;\n try {\n const url = new URL(src);\n return url.protocol === 'https:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import {\n EMAIL_COLORS,\n EMAIL_VARIANTS,\n emailSchemes,\n mainColor,\n variantTokens,\n type EmailColor,\n type EmailVariant,\n} from './tokens';\n\n/*\n * Inline styles carry the light scheme, so an email always renders correctly\n * even where <style> is stripped. Dark mode is a progressive enhancement: each\n * painted element also carries a class from here, and the stylesheet below\n * overrides it — `!important` because it has to beat the inline value.\n *\n * Two triggers, deliberately:\n * - `prefers-color-scheme: dark`, which Apple Mail, iOS Mail, Outlook for\n * Mac and Thunderbird honour. Guarded by `:not([data-color-scheme=\"light\"])`\n * so a preview forced to light stays light on a dark OS.\n * - `[data-color-scheme=\"dark\"]` on any ancestor — the same switch the\n * component library uses, so an email component rendered inside the docs\n * or a visual test follows the page's scheme.\n *\n * Gmail and Outlook.com ignore both and apply their own colour inversion,\n * which is out of any template's control.\n */\nexport const emailClass = {\n variant: (variant: EmailVariant, color: EmailColor) => `hx-${variant}-${color}`,\n main: (color: EmailColor) => `hx-main-${color}`,\n inkPrimary: 'hx-ink-1',\n inkSecondary: 'hx-ink-2',\n inkTertiary: 'hx-ink-3',\n inkIcon: 'hx-ink-icon',\n surface: 'hx-surface',\n divider: 'hx-divider',\n // Layout's AuthScreen shell: page and card swap surfaces in dark.\n layoutCanvas: 'hx-layout-canvas',\n layoutCard: 'hx-layout-card',\n // The card's inner area, which carries its padding. A div of our own rather\n // than react-email's cell: Container moves its `padding` onto an inner <td>,\n // so a rule on the card itself added to it instead of replacing it.\n layoutCardBody: 'hx-layout-card-body',\n // A logo pair: the light one shows by default, the dark one only once the\n // dark rules apply — clients without <style> support keep the light logo.\n logoLight: 'hx-logo-light',\n logoDark: 'hx-logo-dark',\n} as const;\n\nfunction darkRules(scope: string): string {\n const t = emailSchemes.dark;\n const rule = (selector: string, body: string) => `${scope} .${selector}{${body}}`;\n const rules = [\n rule(emailClass.inkPrimary, `color:${t.inkPrimary}!important;`),\n rule(emailClass.inkSecondary, `color:${t.inkSecondary}!important;`),\n rule(emailClass.inkTertiary, `color:${t.inkTertiary}!important;`),\n rule(emailClass.inkIcon, `color:${t.inkIcon}!important;`),\n rule(emailClass.surface, `background-color:${t.surface}!important;`),\n rule(emailClass.divider, `background-color:${t.divider}!important;`),\n rule(emailClass.layoutCanvas, `background-color:${t.surface}!important;`),\n // react-email's Body repeats its inline style on an inner wrapper cell\n // that carries no class, so the canvas colour has to reach it too.\n rule(`${emailClass.layoutCanvas}>table>tbody>tr>td`, `background-color:${t.surface}!important;`),\n rule(emailClass.logoLight, 'display:none!important;'),\n rule(emailClass.logoDark, 'display:inline-block!important;'),\n rule(emailClass.layoutCard,`background-color:${t.surface1}!important;border-color:${variantTokens('dark', 'outlined', 'neutral').borderColor}!important;`),\n ];\n for (const color of EMAIL_COLORS) {\n rules.push(rule(emailClass.main(color), `color:${mainColor('dark', color)}!important;`));\n for (const variant of EMAIL_VARIANTS) {\n const v = variantTokens('dark', variant, color);\n rules.push(\n rule(\n emailClass.variant(variant, color),\n [\n `color:${v.color}!important;`,\n v.backgroundColor && `background-color:${v.backgroundColor}!important;`,\n v.borderColor && `border-color:${v.borderColor}!important;`,\n ]\n .filter(Boolean)\n .join(''),\n ),\n );\n }\n }\n return rules.join('');\n}\n\n/*\n * AuthScreen's phone layout: the card stops being a card. It fills the width,\n * loses border and radius, insets its content by 24px, and the page around it\n * takes the card's colour — surface in light, surface-1 in dark. Last in the\n * sheet so it wins over the dark rules at equal specificity.\n */\nfunction phoneRules(): string {\n const canvas = (scope: string) => `${scope}.${emailClass.layoutCanvas},${scope}.${emailClass.layoutCanvas}>table>tbody>tr>td`;\n const dark = (scope: string) => `${canvas(scope)}{background-color:${emailSchemes.dark.surface1}!important;}`;\n return [\n `@media only screen and (max-width:600px){`,\n `.${emailClass.layoutCard}{max-width:100%!important;border:0!important;border-radius:0!important;}`,\n `.${emailClass.layoutCardBody}{padding:32px 24px!important;}`,\n `${canvas('')}{padding:0!important;background-color:${emailSchemes.light.surface}!important;}`,\n dark('[data-color-scheme=\"dark\"] '),\n `}`,\n `@media only screen and (max-width:600px) and (prefers-color-scheme:dark){${dark(':root:not([data-color-scheme=\"light\"]) ')}}`,\n ].join('');\n}\n\nexport const emailStylesheet = [\n // iOS turns dates and addresses into blue links that ignore the text colour.\n 'a[x-apple-data-detectors]{color:inherit!important;text-decoration:none!important;}',\n `@media (prefers-color-scheme:dark){${darkRules(':root:not([data-color-scheme=\"light\"])')}}`,\n darkRules('[data-color-scheme=\"dark\"]'),\n phoneRules(),\n].join('\\n');\n","import * as React from 'react';\nimport { Link as ReactEmailLink } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, mainColor, type EmailColor } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\nexport interface LinkProps {\n /** Rendered only for http(s) and mailto URLs; anything else becomes plain text. */\n href: string;\n color?: EmailColor;\n /**\n * The web Link defaults to `hover`, but there is no reliable hover in email,\n * so the default here is `always`: an inbox reader needs to see a link is\n * one without touching it.\n */\n underline?: 'none' | 'always';\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Link for email: the web Link's `--color-*-main` colour, which steps from 500 to 400 in dark. */\nexport function Link({ href, color = 'primary', underline = 'always', style, children }: LinkProps) {\n const safe = safeHref(href);\n if (!safe) return <>{children}</>;\n return (\n <ReactEmailLink\n href={safe}\n className={emailClass.main(color)}\n style={{ fontFamily: emailFonts.body, color: mainColor('light', color), textDecoration: underline === 'always' ? 'underline' : 'none', wordBreak: 'break-word', ...style }}\n >\n {children}\n </ReactEmailLink>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes } from '../tokens';\n\nexport type TypographyLevel =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body-lg'\n | 'body-md'\n | 'body-sm'\n | 'body-xs';\n\ntype Ink = 'inkPrimary' | 'inkSecondary' | 'inkTertiary' | 'inkIcon';\n\n/*\n * Typography's typographyVariants.ts, resolved: Tailwind's text-4xl…text-xs\n * in px, its font-bold/semibold/medium as numbers, `tracking-tight` as\n * -0.025em, and the same unitless line-heights (1.33334, 1.5, 1.42858), so the\n * computed line box matches the web component to the sub-pixel.\n */\nconst LEVELS: Record<TypographyLevel, { fontSize: string; fontWeight: number; lineHeight: number; letterSpacing?: string; ink: Ink }> = {\n h1: { fontSize: '36px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h2: { fontSize: '30px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h3: { fontSize: '24px', fontWeight: 600, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h4: { fontSize: '20px', fontWeight: 600, lineHeight: 1.5, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n 'title-lg': { fontSize: '18px', fontWeight: 600, lineHeight: 1.33334, ink: 'inkPrimary' },\n 'title-md': { fontSize: '16px', fontWeight: 500, lineHeight: 1.5, ink: 'inkPrimary' },\n 'title-sm': { fontSize: '14px', fontWeight: 500, lineHeight: 1.42858, ink: 'inkPrimary' },\n 'body-lg': { fontSize: '18px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-md': { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-sm': { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, ink: 'inkTertiary' },\n 'body-xs': { fontSize: '12px', fontWeight: 500, lineHeight: 1.5, ink: 'inkTertiary' },\n};\n\nconst DEFAULT_TAG: Record<TypographyLevel, 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span'> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'title-lg': 'p',\n 'title-md': 'p',\n 'title-sm': 'p',\n 'body-lg': 'p',\n 'body-md': 'p',\n 'body-sm': 'p',\n 'body-xs': 'span',\n};\n\nexport interface TypographyProps {\n level?: TypographyLevel;\n /** The element to render. Defaults to the same tag the web Typography picks for the level. */\n component?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';\n textAlign?: 'left' | 'center' | 'right';\n /**\n * Overrides the level's ink, like Joy's `textColor=\"text.tertiary\"`.\n * `icon` is the theme's faintest ink — for fine print that should recede.\n */\n textColor?: 'primary' | 'secondary' | 'tertiary' | 'icon';\n /** Margin, spacing and the like — there is no Stack in email, so spacing lives on the text. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst TEXT_COLOR: Record<NonNullable<TypographyProps['textColor']>, Ink> = {\n primary: 'inkPrimary',\n secondary: 'inkSecondary',\n tertiary: 'inkTertiary',\n icon: 'inkIcon',\n};\n\n/** Typography for email: the same levels, sizes and ink colours, as inline styles. */\nexport function Typography({ level = 'body-md', component, textAlign, textColor, style, children }: TypographyProps) {\n const spec = LEVELS[level];\n const ink = textColor ? TEXT_COLOR[textColor] : spec.ink;\n const Tag = component ?? DEFAULT_TAG[level];\n return (\n <Tag\n className={emailClass[ink]}\n style={{\n margin: 0,\n fontFamily: emailFonts.body,\n fontSize: spec.fontSize,\n fontWeight: spec.fontWeight,\n lineHeight: spec.lineHeight,\n letterSpacing: spec.letterSpacing,\n color: emailSchemes.light[ink],\n textAlign,\n ...style,\n }}\n >\n {children}\n </Tag>\n );\n}\n","import * as React from 'react';\nimport { Body, Container, Head, Html, Preview } from 'react-email';\nimport { emailClass, emailStylesheet } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens } from '../tokens';\nimport { safeHref } from '../safeUrl';\nimport { Link } from './Link';\nimport { Typography } from './Typography';\n\nexport interface LayoutProps {\n /** The `lang` of the message — screen readers pick their voice from it. */\n lang: string;\n /**\n * The line inbox lists show after the subject. Without one, clients take the\n * first text they find, which is usually the brand name.\n */\n preview: string;\n /** Rendered under the card: why the reader got this, the sender's legal line. */\n footer?: React.ReactNode;\n /**\n * An unsubscribe link, rendered as the last line of the footer. Only for\n * mails a reader can opt out of — marketing and updates, not security alerts.\n * Without a safe http(s)/mailto `href` nothing is rendered.\n */\n unsubscribe?: { href: string; label: string };\n /** Forces a scheme for previews. Left out, the email follows the reader's OS where the client supports that. */\n colorScheme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * The whole document, laid out like core's AuthScreen: a 440px outlined card\n * with a 20px radius and 48px padding on a `surface-1` page, the fine print\n * centred under it. In dark the page and card swap surfaces, as AuthScreen's do.\n */\nexport function Layout({ lang, preview, footer, unsubscribe, colorScheme, children }: LayoutProps) {\n const t = emailSchemes.light;\n return (\n <Html lang={lang} data-color-scheme={colorScheme}>\n <Head>\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <ColorSchemeStyles />\n </Head>\n <Preview>{preview}</Preview>\n <Body className={emailClass.layoutCanvas} style={{ margin: 0, padding: '40px 0', backgroundColor: t.surface1, fontFamily: emailFonts.body }}>\n <Container\n className={emailClass.layoutCard}\n style={{\n width: '100%',\n maxWidth: '440px',\n boxSizing: 'border-box',\n backgroundColor: t.surface,\n border: `1px solid ${variantTokens('light', 'outlined', 'neutral').borderColor}`,\n borderRadius: '20px',\n }}\n >\n <div className={emailClass.layoutCardBody} style={{ padding: '48px' }}>\n {children}\n </div>\n </Container>\n {(footer || unsubscribe) && (\n <Container style={{ maxWidth: '440px', padding: '24px 24px 0', textAlign: 'center' }}>\n {footer}\n {unsubscribe && safeHref(unsubscribe.href) && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: footer ? '12px 0 0' : 0, fontWeight: 400 }}>\n <Link href={unsubscribe.href} color=\"neutral\">\n {unsubscribe.label}\n </Link>\n </Typography>\n )}\n </Container>\n )}\n </Body>\n </Html>\n );\n}\n\n/**\n * The dark-mode stylesheet on its own. Layout includes it; render it\n * once yourself when email components are shown inside a normal page — a\n * preview, the docs — so they follow that page's `data-color-scheme`.\n */\nexport function ColorSchemeStyles() {\n return <style dangerouslySetInnerHTML={{ __html: emailStylesheet }} />;\n}\n","import * as React from 'react';\nimport { Button as ReactEmailButton } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\n/*\n * buttonVariants.ts, resolved. The web Button gets its height from\n * `min-h-8/9/11` and centres the label with flexbox; email has neither, so the\n * same box is built from line-height plus vertical padding:\n * (min-height − line-height) / 2, less the 1px border for outlined.\n */\nconst SIZES = {\n sm: { minHeight: 32, paddingInline: 12, fontSize: 14, lineHeight: 21 },\n md: { minHeight: 36, paddingInline: 16, fontSize: 14, lineHeight: 21 },\n lg: { minHeight: 44, paddingInline: 24, fontSize: 16, lineHeight: 24 },\n} as const;\n\nexport interface ButtonProps {\n /** Rendered only for http(s) URLs; anything else renders nothing — a button nobody can follow is worse than none. */\n href: string;\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** `rounded-full`, as on the web Button. */\n pill?: boolean;\n /** Stretches to the container — the usual call-to-action layout in a narrow email. */\n fullWidth?: boolean;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Button for email: a link styled as the web Button, built on react-email's Outlook-safe Button. */\nexport function Button({ href, variant = 'solid', color = 'primary', size = 'md', pill = false, fullWidth = false, style, children }: ButtonProps) {\n const safe = safeHref(href);\n if (!safe || safe.startsWith('mailto:')) return null;\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const border = variant === 'outlined' ? 1 : 0;\n const paddingBlock = (s.minHeight - s.lineHeight) / 2 - border;\n return (\n <ReactEmailButton\n href={safe}\n className={emailClass.variant(variant, color)}\n style={{\n display: fullWidth ? 'block' : 'inline-block',\n boxSizing: 'border-box',\n width: fullWidth ? '100%' : undefined,\n textAlign: 'center',\n paddingTop: `${paddingBlock}px`,\n paddingBottom: `${paddingBlock}px`,\n paddingLeft: `${s.paddingInline}px`,\n paddingRight: `${s.paddingInline}px`,\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 600,\n lineHeight: `${s.lineHeight}px`,\n textDecoration: 'none',\n borderRadius: pill ? '9999px' : emailRadius.sm,\n color: v.color,\n backgroundColor: v.backgroundColor ?? 'transparent',\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {/* react-email wraps the label in its own inline-block span at\n line-height 120%. In the modes mail is actually shown in — the\n limited-quirks mode its XHTML doctype yields, or full quirks where a\n webmail drops the doctype — the link's own line-height no longer\n props the line up, so the button shrank to 120% of the font plus\n padding: 4–5px short at every size. This span carries the full\n line-height itself, so the box no longer depends on the mode. */}\n <span style={{ display: 'inline-block', lineHeight: `${s.lineHeight}px` }}>{children}</span>\n </ReactEmailButton>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailSchemes } from '../tokens';\n\nexport interface DividerProps {\n /** Spacing around the line — the web Divider has none of its own either. */\n style?: React.CSSProperties;\n}\n\n/**\n * Divider for email: a 1px line in `--color-divider`. A div rather than an\n * <hr>, whose borders Outlook and Gmail each draw differently. `background`\n * carries a solid fallback that Outlook's Word engine — which drops rgba() —\n * keeps; every other client takes the rgba `background-color` after it.\n */\nexport function Divider({ style }: DividerProps) {\n const t = emailSchemes.light;\n return (\n <div\n role=\"separator\"\n className={emailClass.divider}\n style={{ height: '1px', lineHeight: '1px', fontSize: '1px', background: t.dividerFallback, backgroundColor: t.divider, border: 'none', margin: 0, ...style }}\n >\n &nbsp;\n </div>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\nexport interface CardProps {\n variant?: EmailVariant;\n color?: EmailColor;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/**\n * Card for email: Sheet's variant colours plus Card's own `rounded-md p-4`,\n * defaulting to outlined / neutral like the web Card. Outlined and plain fill\n * with `surface`, as Joy's Sheet does. A one-cell table, because that is the\n * only box Outlook pads reliably; Card's `gap-2` has no email equivalent, so\n * spacing between children is theirs to set.\n */\nexport function Card({ variant = 'outlined', color = 'neutral', style, children }: CardProps) {\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n return (\n <table\n role=\"presentation\"\n width=\"100%\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n borderCollapse: 'separate',\n borderRadius: emailRadius.md,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n ...style,\n }}\n >\n <tbody>\n <tr>\n <td style={{ padding: '16px' }}>{children}</td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { Img } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeImageSrc } from '../safeUrl';\n\n/** avatarVariants.ts: 32/40/48px boxes, text-sm/base/lg, medium/medium/semibold. */\nconst SIZES = {\n sm: { box: 32, fontSize: '14px', fontWeight: 500 },\n md: { box: 40, fontSize: '16px', fontWeight: 500 },\n lg: { box: 48, fontSize: '18px', fontWeight: 600 },\n} as const;\n\nexport interface AvatarProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** An https image. Without one, `children` (usually initials) is shown. */\n src?: string;\n alt?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Avatar for email, defaulting to soft / neutral like the web Avatar. Unlike\n * Card, outlined and plain stay transparent — Joy's Avatar has no surface\n * fallback. The initials are centred by a table cell, since email has no flexbox.\n */\nexport function Avatar({ variant = 'soft', color = 'neutral', size = 'md', src, alt = '', children }: AvatarProps) {\n const s = SIZES[size];\n const safe = safeImageSrc(src);\n if (safe) {\n return <Img src={safe} width={s.box} height={s.box} alt={alt} style={{ display: 'inline-block', borderRadius: '50%', objectFit: 'cover' }} />;\n }\n const v = variantTokens('light', variant, color);\n return (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={emailClass.variant(variant, color)}\n style={{\n display: 'inline-table',\n boxSizing: 'border-box',\n width: `${s.box}px`,\n height: `${s.box}px`,\n borderCollapse: 'separate',\n borderRadius: '50%',\n backgroundColor: v.backgroundColor ?? 'transparent',\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n lineHeight: 1,\n verticalAlign: 'middle',\n }}\n >\n <tbody>\n <tr>\n <td align=\"center\" style={{ padding: 0, verticalAlign: 'middle', textAlign: 'center' }}>\n {children}\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\n/**\n * chipVariants.ts: `min-h-5/6/7`, `px-1.5/2/3`, `text-xs/sm/base` at a 1.5\n * line-height. As with Button, the min-height becomes vertical padding.\n */\nconst SIZES = {\n sm: { minHeight: 20, paddingInline: 6, fontSize: 12 },\n md: { minHeight: 24, paddingInline: 8, fontSize: 14 },\n lg: { minHeight: 28, paddingInline: 12, fontSize: 16 },\n} as const;\n\nexport interface ChipProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Chip for email, defaulting to soft / neutral like the web Chip; outlined and plain fill with `surface`. */\nexport function Chip({ variant = 'soft', color = 'neutral', size = 'md', style, children }: ChipProps) {\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n const border = v.borderColor ? 1 : 0;\n const lineHeight = s.fontSize * 1.5;\n const paddingBlock = (s.minHeight - lineHeight) / 2 - border;\n return (\n <span\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n display: 'inline-block',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n padding: `${paddingBlock}px ${s.paddingInline}px`,\n borderRadius: '1.5rem',\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 500,\n lineHeight: 1.5,\n color: v.color,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {children}\n </span>\n );\n}\n","import { Img } from 'react-email';\nimport { emailClass } from '../styles';\n\n/*\n * The hintoric wordmark as hosted PNGs (1336 × 410 artwork, shown at 104 × 32\n * so it stays sharp on HiDPI screens). PNG rather than SVG, which Gmail and\n * desktop Outlook don't display; linked rather than attached, so messages stay\n * small. A client that blocks remote images until asked shows the alt text.\n */\nconst LOGO = {\n light: 'https://cdn.hintoric.com/assets/logo/black.png',\n dark: 'https://cdn.hintoric.com/assets/logo/white.png',\n width: 104,\n height: 32,\n};\n\n/**\n * The email counterpart of the web HintoricLogo: the black wordmark, swapped\n * for the white one where the client applies the dark stylesheet.\n */\nexport function HintoricLogo() {\n return (\n <>\n <Img\n src={LOGO.light}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoLight}\n style={{ display: 'inline-block', margin: '0 auto' }}\n />\n <Img\n src={LOGO.dark}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoDark}\n style={{ display: 'none', margin: '0 auto' }}\n />\n </>\n );\n}\n","import { Avatar } from '../../components/Avatar';\nimport { Button } from '../../components/Button';\nimport { Divider } from '../../components/Divider';\nimport { Layout } from '../../components/Layout';\nimport { Link } from '../../components/Link';\nimport { Typography } from '../../components/Typography';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { SecurityActivityAlertContext, SecurityActivityAlertProps } from './types';\n\nfunction contextOf(props: SecurityActivityAlertProps): SecurityActivityAlertContext {\n return {\n activity: props.activity,\n target: props.target,\n targetName: targetNameOf(props),\n occurredAt: props.messages.formatDateTime(props.activity.occurredAt, props.timeZone),\n };\n}\n\nfunction targetNameOf({ target }: SecurityActivityAlertProps): string {\n return target.type === 'workspace' ? target.workspaceName : target.email;\n}\n\n/**\n * The first letter of the first two words that have one: \"Müller & Söhne\"\n * is MS, not M&, and a quote or dash in front of a word does not count.\n */\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .map((word) => word.match(/\\p{L}/u)?.[0])\n .filter((letter): letter is string => letter !== undefined)\n .slice(0, 2)\n .map((letter) => letter.toUpperCase())\n .join('');\n}\n\n/**\n * For security-relevant activity: a change in a workspace (sent to its\n * admins) or to an account (sent to its owner) — see `SecurityActivityTarget`.\n * Deliberately short: what happened as the heading, what it concerns, one\n * sentence, one button, one link.\n */\nexport function SecurityActivityAlertEmail(props: SecurityActivityAlertProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <SecurityActivityAlertContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function SecurityActivityAlertContent(props: SecurityActivityAlertProps) {\n const { messages, activityLogUrl } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {props.activity.title}\n </Typography>\n {/* primary, not the default neutral: in dark the layout card is surface-1,\n exactly the soft-neutral avatar fill, which would make it vanish. */}\n <Avatar size=\"sm\" color=\"primary\">\n {initials(ctx.targetName)}\n </Avatar>\n <Typography level=\"title-sm\" component=\"span\" style={{ marginLeft: '8px', verticalAlign: 'middle' }}>\n {ctx.targetName}\n </Typography>\n </div>\n <Divider style={{ margin: '32px 0' }} />\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {props.activity.description?.trim() || messages.summary(ctx)} {messages.guidance(ctx)}\n </Typography>\n <Button href={props.reviewUrl} size=\"lg\" fullWidth>\n {messages.reviewButton}\n </Button>\n {activityLogUrl && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" style={{ marginTop: '24px', fontWeight: 400 }}>\n {messages.activityLogHint((label) => (\n <Link href={activityLogUrl} underline=\"none\">\n {label}\n </Link>\n ))}\n </Typography>\n )}\n </>\n );\n}\n\nexport interface RenderedEmail {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderSecurityActivityAlert(props: SecurityActivityAlertProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<SecurityActivityAlertEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { SecurityActivityAlertMessages } from './types';\n\nfunction dateTimeFormatter(locale: string) {\n return (date: Date, timeZone: string) =>\n new Intl.DateTimeFormat(locale, { dateStyle: 'long', timeStyle: 'short', timeZone }).format(date);\n}\n\nexport const securityActivityAlertMessagesDe: SecurityActivityAlertMessages = {\n lang: 'de',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} hat am ${occurredAt} eine sicherheitsrelevante Änderung vorgenommen.`,\n guidance: () => 'Wenn du diese Änderung nicht erwartet hast, prüfe die Aktivität jetzt.',\n reviewButton: 'Aktivität prüfen',\n activityLogHint: (link) => <>Alle sicherheitsrelevanten Aktivitäten findest du im {link('Aktivitätsprotokoll')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'Wir haben dir diese E-Mail gesendet, um dich als Administrator über wichtige Änderungen in deinem Workspace zu informieren.'\n : 'Wir haben dir diese E-Mail gesendet, um dich über wichtige Änderungen an deinem hintoric-Konto zu informieren.',\n formatDateTime: dateTimeFormatter('de-DE'),\n};\n\nexport const securityActivityAlertMessagesEn: SecurityActivityAlertMessages = {\n lang: 'en',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} made a security-relevant change on ${occurredAt}.`,\n guidance: () => \"If you didn't expect this change, review the activity now.\",\n reviewButton: 'Review activity',\n activityLogHint: (link) => <>You can see all security-relevant activity in the {link('activity log')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'We sent you this email to let you know, as an admin, about important changes in your workspace.'\n : 'We sent you this email to let you know about important changes to your hintoric account.',\n formatDateTime: dateTimeFormatter('en-GB'),\n};\n","import { Button } from '../../components/Button';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { Layout } from '../../components/Layout';\nimport { Typography } from '../../components/Typography';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { WaitlistWelcomeProps } from './types';\n\n/**\n * Sent right after someone joins the waitlist: a thank-you, what happens\n * next, one button to the website. Centred, like the other single-purpose\n * mails — logo, heading, two short paragraphs, button, sign-off.\n */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeEmail(props: WaitlistWelcomeProps) {\n const { messages } = props;\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview}\n colorScheme={props.colorScheme}\n unsubscribe={props.unsubscribeUrl && messages.unsubscribe ? { href: props.unsubscribeUrl, label: messages.unsubscribe } : undefined}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <WaitlistWelcomeContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeContent({ messages, websiteUrl }: WaitlistWelcomeProps) {\n return (\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 8px', fontWeight: 400 }}>\n {messages.eyebrow}\n </Typography>\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '0 0 16px', fontFamily: emailFonts.heading }}>\n {messages.heading}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '12px' }}>\n {messages.body1}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {messages.body2}\n </Typography>\n <Button href={websiteUrl} size=\"lg\" fullWidth>\n {messages.cta}\n </Button>\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 0', fontWeight: 400 }}>\n {messages.signoff}\n </Typography>\n </div>\n );\n}\n\nexport interface RenderedWaitlistWelcome {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what SES, Resend and the like take. */\n/** @deprecated New consumers should not use this template. */\nexport async function renderWaitlistWelcome(props: WaitlistWelcomeProps): Promise<RenderedWaitlistWelcome> {\n const { html, text } = await renderEmail(<WaitlistWelcomeEmail {...props} />);\n return { subject: props.messages.subject, html, text };\n}\n","import type { WaitlistWelcomeMessages } from './types';\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesDe: WaitlistWelcomeMessages = {\n lang: 'de',\n subject: 'Du bist auf der Hintoric-Warteliste',\n preview: 'Willkommen an Bord — Hintoric',\n eyebrow: 'Danke, dass du dabei bist',\n heading: 'Willkommen bei Hintoric',\n body1: 'Alles erledigt. Sobald dein Platz frei wird, melden wir uns sofort — du bist einer der Ersten, die Hintoric ausprobieren dürfen.',\n body2: 'Bis dahin halten wir dich auf dem Laufenden. Wenn jemand aus deinem Umfeld auch dazugehören sollte, leite diese Mail gerne weiter.',\n cta: 'Zu hintoric.com',\n signoff: '— Dein Hintoric-Team',\n footer: 'Wir haben dir diese E-Mail gesendet, weil du dich für die Hintoric-Warteliste eingetragen hast.',\n unsubscribe: 'Abmelden',\n};\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesEn: WaitlistWelcomeMessages = {\n lang: 'en',\n subject: \"You're on the Hintoric waitlist\",\n preview: 'Welcome aboard — Hintoric',\n eyebrow: 'Thanks for joining',\n heading: 'Welcome to Hintoric',\n body1: \"You're all set. As soon as your spot opens up we'll let you know — you'll be one of the first to try Hintoric.\",\n body2: \"Until then we'll keep you posted. If someone you know should be on the list too, feel free to forward this email.\",\n cta: 'Go to hintoric.com',\n signoff: '— Your Hintoric team',\n footer: 'We sent you this email because you signed up for the Hintoric waitlist.',\n unsubscribe: 'Unsubscribe',\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/render.ts","../src/tokens.ts","../src/safeUrl.ts","../src/styles.ts","../src/components/Link.tsx","../src/components/Typography.tsx","../src/components/Layout.tsx","../src/components/Button.tsx","../src/components/Divider.tsx","../src/components/Card.tsx","../src/components/Avatar.tsx","../src/alertIcons.ts","../src/components/Alert.tsx","../src/components/Chip.tsx","../src/components/HintoricLogo.tsx","../src/templates/AuthCode/AuthCodeEmail.tsx","../src/templates/AuthCode/messages.ts","../src/templates/AuthNoAccount/AuthNoAccountEmail.tsx","../src/templates/AuthNoAccount/messages.ts","../src/templates/SecurityActivityAlert/SecurityActivityAlertEmail.tsx","../src/templates/SecurityActivityAlert/messages.tsx","../src/templates/WaitlistWelcome/WaitlistWelcomeEmail.tsx","../src/templates/WaitlistWelcome/messages.ts"],"sourcesContent":["import type * as React from 'react';\nimport { render } from '@react-email/render';\n\nexport interface RenderedEmailBody {\n html: string;\n /** The plain-text part. Multipart mails without one score worse with spam filters. */\n text: string;\n}\n\n/** Renders an email element — normally a `<Layout>` — to HTML and plain text. */\nexport async function renderEmail(element: React.ReactElement): Promise<RenderedEmailBody> {\n const [html, text] = await Promise.all([render(element), render(element, { plainText: true })]);\n return { html, text };\n}\n","/*\n * The email module's copy of theme.css, resolved to literal values.\n *\n * Email clients cannot use the component library's styling: Gmail, Outlook\n * and Apple Mail resolve neither CSS custom properties nor Tailwind classes,\n * and Gmail drops <style> blocks in some contexts. So every email component\n * paints with inline `style` values taken from here, and the dark scheme is a\n * progressive enhancement layered on top (see styles.ts).\n *\n * The raw stops are theme.css's; the per-variant mapping below is the same\n * formula theme.css spells out token by token (Joy's createLight/DarkMode\n * VariantVariables, with neutral's -700 plain/outlined override in light).\n * The parity tests in src/visual/email/*.visual.test.tsx compare every email\n * component against its web counterpart in both schemes, so a drift between\n * the two shows up as a failing computed-style assertion.\n */\n\nexport type EmailColor = 'primary' | 'neutral' | 'danger' | 'success' | 'warning';\nexport type EmailVariant = 'solid' | 'soft' | 'outlined' | 'plain';\nexport type EmailScheme = 'light' | 'dark';\n\ntype Stop = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport const emailPalette: Record<EmailColor, Record<Stop, string>> = {\n neutral: { 50: '#FBFCFE', 100: '#F0F4F8', 200: '#DDE7EE', 300: '#CDD7E1', 400: '#9FA6AD', 500: '#636B74', 600: '#555E68', 700: '#32383E', 800: '#171A1C', 900: '#0B0D0E' },\n primary: { 50: '#EDF5FD', 100: '#E3EFFB', 200: '#C7DFF7', 300: '#97C3F0', 400: '#4393E4', 500: '#0B6BCB', 600: '#185EA5', 700: '#12467B', 800: '#0A2744', 900: '#051423' },\n warning: { 50: '#FEFAF6', 100: '#FDF0E1', 200: '#FCE1C2', 300: '#F3C896', 400: '#EA9A3E', 500: '#9A5B13', 600: '#72430D', 700: '#492B08', 800: '#2E1B05', 900: '#1D1002' },\n danger: { 50: '#FEF6F6', 100: '#FCE4E4', 200: '#F7C5C5', 300: '#F09898', 400: '#E47474', 500: '#C41C1C', 600: '#A51818', 700: '#7D1212', 800: '#430A0A', 900: '#240505' },\n success: { 50: '#F6FEF6', 100: '#E3FBE3', 200: '#C7F7C7', 300: '#A1E8A1', 400: '#51BC51', 500: '#1F7A1F', 600: '#136C13', 700: '#0A470A', 800: '#042F04', 900: '#021D02' },\n};\n\nexport const EMAIL_COLORS: EmailColor[] = ['primary', 'neutral', 'danger', 'success', 'warning'];\nexport const EMAIL_VARIANTS: EmailVariant[] = ['solid', 'soft', 'outlined', 'plain'];\n\n/** What one variant × colour paints. `undefined` means \"leaves it to the surroundings\". */\nexport interface EmailVariantTokens {\n color: string;\n backgroundColor?: string;\n borderColor?: string;\n}\n\nexport function variantTokens(scheme: EmailScheme, variant: EmailVariant, color: EmailColor): EmailVariantTokens {\n const c = emailPalette[color];\n const dark = scheme === 'dark';\n switch (variant) {\n case 'solid':\n return { color: '#FFFFFF', backgroundColor: c[500] };\n case 'soft':\n return dark ? { color: c[200], backgroundColor: c[800] } : { color: c[700], backgroundColor: c[100] };\n case 'outlined':\n return dark\n ? { color: c[200], borderColor: c[700] }\n : { color: color === 'neutral' ? c[700] : c[500], borderColor: c[300] };\n case 'plain':\n return { color: dark ? c[300] : color === 'neutral' ? c[700] : c[500] };\n }\n}\n\n/** `--color-*-main`: step 500 in light, 400 in dark. What Link renders. */\nexport function mainColor(scheme: EmailScheme, color: EmailColor): string {\n return emailPalette[color][scheme === 'dark' ? 400 : 500];\n}\n\nexport interface EmailSchemeTokens {\n inkPrimary: string;\n inkSecondary: string;\n inkTertiary: string;\n /** `--color-ink-icon`: the faintest ink. */\n inkIcon: string;\n /** `--color-surface`: what a Sheet / Card paints under outlined and plain. */\n surface: string;\n /** `--color-surface-1`. */\n surface1: string;\n /**\n * `--color-divider`. Kept as the rgba() theme.css uses so it composites the\n * same way over any surface; Outlook's Word engine drops rgba(), which is\n * why Divider also sets a solid `dividerFallback`.\n */\n divider: string;\n /** `divider` flattened onto `surface`. */\n dividerFallback: string;\n}\n\nexport const emailSchemes: Record<EmailScheme, EmailSchemeTokens> = {\n light: {\n inkPrimary: emailPalette.neutral[800],\n inkSecondary: emailPalette.neutral[700],\n inkTertiary: emailPalette.neutral[600],\n inkIcon: emailPalette.neutral[500],\n surface: emailPalette.neutral[50],\n surface1: emailPalette.neutral[100],\n divider: 'rgba(99, 107, 116, 0.2)',\n dividerFallback: '#DCDFE2',\n },\n dark: {\n inkPrimary: emailPalette.neutral[100],\n inkSecondary: emailPalette.neutral[300],\n inkTertiary: emailPalette.neutral[400],\n inkIcon: emailPalette.neutral[400],\n surface: emailPalette.neutral[900],\n surface1: emailPalette.neutral[800],\n divider: 'rgba(159, 166, 173, 0.16)',\n dividerFallback: '#232628',\n },\n};\n\nexport const emailFonts = {\n // `--font-body`.\n body: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n // core's `--font-heading`. Only clients with the font installed or web-font\n // support (Apple Mail) show Montserrat; the rest fall back to the body stack.\n heading: \"Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif\",\n // Joy's `fontFamily.code` without its web font: one-time codes, where a 0\n // and an O must not look alike.\n code: \"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace\",\n};\n\n/** theme.css's radius scale. */\nexport const emailRadius = { xs: '2px', sm: '6px', md: '8px', lg: '12px', xl: '16px' };\n","/*\n * Every link in an email is a link someone may click without a second look —\n * a security alert's \"review this activity\" button most of all. React escapes\n * text but not the scheme of an href, so a `javascript:` or `data:` URL that\n * reached a template through data would survive rendering intact. Only these\n * schemes are let through; anything else renders as plain, unlinked text.\n */\nconst LINK_PROTOCOLS = new Set(['https:', 'http:', 'mailto:']);\n\nexport function safeHref(href: string | undefined | null): string | undefined {\n if (!href) return undefined;\n try {\n const url = new URL(href);\n return LINK_PROTOCOLS.has(url.protocol) ? url.href : undefined;\n } catch {\n // Relative URLs are meaningless in an email: there is no base to resolve\n // them against once the message leaves the server.\n return undefined;\n }\n}\n\n/** Images additionally have to be https: mail clients block or warn on http. */\nexport function safeImageSrc(src: string | undefined | null): string | undefined {\n if (!src) return undefined;\n try {\n const url = new URL(src);\n return url.protocol === 'https:' ? url.href : undefined;\n } catch {\n return undefined;\n }\n}\n","import {\n EMAIL_COLORS,\n EMAIL_VARIANTS,\n emailSchemes,\n mainColor,\n variantTokens,\n type EmailColor,\n type EmailVariant,\n} from './tokens';\n\n/*\n * Inline styles carry the light scheme, so an email always renders correctly\n * even where <style> is stripped. Dark mode is a progressive enhancement: each\n * painted element also carries a class from here, and the stylesheet below\n * overrides it — `!important` because it has to beat the inline value.\n *\n * Two triggers, deliberately:\n * - `prefers-color-scheme: dark`, which Apple Mail, iOS Mail, Outlook for\n * Mac and Thunderbird honour. Guarded by `:not([data-color-scheme=\"light\"])`\n * so a preview forced to light stays light on a dark OS.\n * - `[data-color-scheme=\"dark\"]` on any ancestor — the same switch the\n * component library uses, so an email component rendered inside the docs\n * or a visual test follows the page's scheme.\n *\n * Gmail and Outlook.com ignore both and apply their own colour inversion,\n * which is out of any template's control.\n */\nexport const emailClass = {\n variant: (variant: EmailVariant, color: EmailColor) => `hx-${variant}-${color}`,\n main: (color: EmailColor) => `hx-main-${color}`,\n inkPrimary: 'hx-ink-1',\n inkSecondary: 'hx-ink-2',\n inkTertiary: 'hx-ink-3',\n inkIcon: 'hx-ink-icon',\n surface: 'hx-surface',\n divider: 'hx-divider',\n // Layout's AuthScreen shell: page and card swap surfaces in dark.\n layoutCanvas: 'hx-layout-canvas',\n layoutCard: 'hx-layout-card',\n // The card's inner area, which carries its padding. A div of our own rather\n // than react-email's cell: Container moves its `padding` onto an inner <td>,\n // so a rule on the card itself added to it instead of replacing it.\n layoutCardBody: 'hx-layout-card-body',\n // A logo pair: the light one shows by default, the dark one only once the\n // dark rules apply — clients without <style> support keep the light logo.\n logoLight: 'hx-logo-light',\n logoDark: 'hx-logo-dark',\n // The same swap for a pair of block images, such as an Alert's icon.\n lightOnly: 'hx-light-only',\n darkOnly: 'hx-dark-only',\n} as const;\n\nfunction darkRules(scope: string): string {\n const t = emailSchemes.dark;\n const rule = (selector: string, body: string) => `${scope} .${selector}{${body}}`;\n const rules = [\n rule(emailClass.inkPrimary, `color:${t.inkPrimary}!important;`),\n rule(emailClass.inkSecondary, `color:${t.inkSecondary}!important;`),\n rule(emailClass.inkTertiary, `color:${t.inkTertiary}!important;`),\n rule(emailClass.inkIcon, `color:${t.inkIcon}!important;`),\n rule(emailClass.surface, `background-color:${t.surface}!important;`),\n rule(emailClass.divider, `background-color:${t.divider}!important;`),\n rule(emailClass.layoutCanvas, `background-color:${t.surface}!important;`),\n // react-email's Body repeats its inline style on an inner wrapper cell\n // that carries no class, so the canvas colour has to reach it too.\n rule(`${emailClass.layoutCanvas}>table>tbody>tr>td`, `background-color:${t.surface}!important;`),\n rule(emailClass.logoLight, 'display:none!important;'),\n rule(emailClass.logoDark, 'display:inline-block!important;'),\n rule(emailClass.lightOnly, 'display:none!important;'),\n rule(emailClass.darkOnly, 'display:block!important;'),\n rule(emailClass.layoutCard,`background-color:${t.surface1}!important;border-color:${variantTokens('dark', 'outlined', 'neutral').borderColor}!important;`),\n ];\n for (const color of EMAIL_COLORS) {\n rules.push(rule(emailClass.main(color), `color:${mainColor('dark', color)}!important;`));\n for (const variant of EMAIL_VARIANTS) {\n const v = variantTokens('dark', variant, color);\n rules.push(\n rule(\n emailClass.variant(variant, color),\n [\n `color:${v.color}!important;`,\n v.backgroundColor && `background-color:${v.backgroundColor}!important;`,\n v.borderColor && `border-color:${v.borderColor}!important;`,\n ]\n .filter(Boolean)\n .join(''),\n ),\n );\n }\n }\n return rules.join('');\n}\n\n/*\n * AuthScreen's phone layout: the card stops being a card. It fills the width,\n * loses border and radius, insets its content by 24px, and the page around it\n * takes the card's colour — surface in light, surface-1 in dark. Last in the\n * sheet so it wins over the dark rules at equal specificity.\n */\nfunction phoneRules(): string {\n const canvas = (scope: string) => `${scope}.${emailClass.layoutCanvas},${scope}.${emailClass.layoutCanvas}>table>tbody>tr>td`;\n const dark = (scope: string) => `${canvas(scope)}{background-color:${emailSchemes.dark.surface1}!important;}`;\n return [\n `@media only screen and (max-width:600px){`,\n `.${emailClass.layoutCard}{max-width:100%!important;border:0!important;border-radius:0!important;}`,\n `.${emailClass.layoutCardBody}{padding:32px 24px!important;}`,\n `${canvas('')}{padding:0!important;background-color:${emailSchemes.light.surface}!important;}`,\n dark('[data-color-scheme=\"dark\"] '),\n `}`,\n `@media only screen and (max-width:600px) and (prefers-color-scheme:dark){${dark(':root:not([data-color-scheme=\"light\"]) ')}}`,\n ].join('');\n}\n\nexport const emailStylesheet = [\n // iOS turns dates and addresses into blue links that ignore the text colour.\n 'a[x-apple-data-detectors]{color:inherit!important;text-decoration:none!important;}',\n `@media (prefers-color-scheme:dark){${darkRules(':root:not([data-color-scheme=\"light\"])')}}`,\n darkRules('[data-color-scheme=\"dark\"]'),\n phoneRules(),\n].join('\\n');\n","import * as React from 'react';\nimport { Link as ReactEmailLink } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, mainColor, type EmailColor } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\nexport interface LinkProps {\n /** Rendered only for http(s) and mailto URLs; anything else becomes plain text. */\n href: string;\n color?: EmailColor;\n /**\n * The web Link defaults to `hover`, but there is no reliable hover in email,\n * so the default here is `always`: an inbox reader needs to see a link is\n * one without touching it.\n */\n underline?: 'none' | 'always';\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Link for email: the web Link's `--color-*-main` colour, which steps from 500 to 400 in dark. */\nexport function Link({ href, color = 'primary', underline = 'always', style, children }: LinkProps) {\n const safe = safeHref(href);\n if (!safe) return <>{children}</>;\n return (\n <ReactEmailLink\n href={safe}\n className={emailClass.main(color)}\n style={{ fontFamily: emailFonts.body, color: mainColor('light', color), textDecoration: underline === 'always' ? 'underline' : 'none', wordBreak: 'break-word', ...style }}\n >\n {children}\n </ReactEmailLink>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes } from '../tokens';\n\nexport type TypographyLevel =\n | 'h1'\n | 'h2'\n | 'h3'\n | 'h4'\n | 'title-lg'\n | 'title-md'\n | 'title-sm'\n | 'body-lg'\n | 'body-md'\n | 'body-sm'\n | 'body-xs';\n\ntype Ink = 'inkPrimary' | 'inkSecondary' | 'inkTertiary' | 'inkIcon';\n\n/*\n * Typography's typographyVariants.ts, resolved: Tailwind's text-4xl…text-xs\n * in px, its font-bold/semibold/medium as numbers, `tracking-tight` as\n * -0.025em, and the same unitless line-heights (1.33334, 1.5, 1.42858), so the\n * computed line box matches the web component to the sub-pixel.\n */\nconst LEVELS: Record<TypographyLevel, { fontSize: string; fontWeight: number; lineHeight: number; letterSpacing?: string; ink: Ink }> = {\n h1: { fontSize: '36px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h2: { fontSize: '30px', fontWeight: 700, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h3: { fontSize: '24px', fontWeight: 600, lineHeight: 1.33334, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n h4: { fontSize: '20px', fontWeight: 600, lineHeight: 1.5, letterSpacing: '-0.025em', ink: 'inkPrimary' },\n 'title-lg': { fontSize: '18px', fontWeight: 600, lineHeight: 1.33334, ink: 'inkPrimary' },\n 'title-md': { fontSize: '16px', fontWeight: 500, lineHeight: 1.5, ink: 'inkPrimary' },\n 'title-sm': { fontSize: '14px', fontWeight: 500, lineHeight: 1.42858, ink: 'inkPrimary' },\n 'body-lg': { fontSize: '18px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-md': { fontSize: '16px', fontWeight: 400, lineHeight: 1.5, ink: 'inkSecondary' },\n 'body-sm': { fontSize: '14px', fontWeight: 400, lineHeight: 1.5, ink: 'inkTertiary' },\n 'body-xs': { fontSize: '12px', fontWeight: 500, lineHeight: 1.5, ink: 'inkTertiary' },\n};\n\nconst DEFAULT_TAG: Record<TypographyLevel, 'h1' | 'h2' | 'h3' | 'h4' | 'p' | 'span'> = {\n h1: 'h1',\n h2: 'h2',\n h3: 'h3',\n h4: 'h4',\n 'title-lg': 'p',\n 'title-md': 'p',\n 'title-sm': 'p',\n 'body-lg': 'p',\n 'body-md': 'p',\n 'body-sm': 'p',\n 'body-xs': 'span',\n};\n\nexport interface TypographyProps {\n level?: TypographyLevel;\n /** The element to render. Defaults to the same tag the web Typography picks for the level. */\n component?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div';\n textAlign?: 'left' | 'center' | 'right';\n /**\n * Overrides the level's ink, like Joy's `textColor=\"text.tertiary\"`.\n * `icon` is the theme's faintest ink — for fine print that should recede.\n */\n textColor?: 'primary' | 'secondary' | 'tertiary' | 'icon';\n /** Margin, spacing and the like — there is no Stack in email, so spacing lives on the text. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\nconst TEXT_COLOR: Record<NonNullable<TypographyProps['textColor']>, Ink> = {\n primary: 'inkPrimary',\n secondary: 'inkSecondary',\n tertiary: 'inkTertiary',\n icon: 'inkIcon',\n};\n\n/** Typography for email: the same levels, sizes and ink colours, as inline styles. */\nexport function Typography({ level = 'body-md', component, textAlign, textColor, style, children }: TypographyProps) {\n const spec = LEVELS[level];\n const ink = textColor ? TEXT_COLOR[textColor] : spec.ink;\n const Tag = component ?? DEFAULT_TAG[level];\n return (\n <Tag\n className={emailClass[ink]}\n style={{\n margin: 0,\n fontFamily: emailFonts.body,\n fontSize: spec.fontSize,\n fontWeight: spec.fontWeight,\n lineHeight: spec.lineHeight,\n letterSpacing: spec.letterSpacing,\n color: emailSchemes.light[ink],\n textAlign,\n ...style,\n }}\n >\n {children}\n </Tag>\n );\n}\n","import * as React from 'react';\nimport { Body, Container, Head, Html, Preview } from 'react-email';\nimport { emailClass, emailStylesheet } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens } from '../tokens';\nimport { safeHref } from '../safeUrl';\nimport { Link } from './Link';\nimport { Typography } from './Typography';\n\nexport interface LayoutProps {\n /** The `lang` of the message — screen readers pick their voice from it. */\n lang: string;\n /**\n * The line inbox lists show after the subject. Without one, clients take the\n * first text they find, which is usually the brand name.\n */\n preview: string;\n /** Rendered under the card: why the reader got this, the sender's legal line. */\n footer?: React.ReactNode;\n /**\n * An unsubscribe link, rendered as the last line of the footer. Only for\n * mails a reader can opt out of — marketing and updates, not security alerts.\n * Without a safe http(s)/mailto `href` nothing is rendered.\n */\n unsubscribe?: { href: string; label: string };\n /** Forces a scheme for previews. Left out, the email follows the reader's OS where the client supports that. */\n colorScheme?: 'light' | 'dark';\n children: React.ReactNode;\n}\n\n/**\n * The whole document, laid out like core's AuthScreen: a 440px outlined card\n * with a 20px radius and 48px padding on a `surface-1` page, the fine print\n * centred under it. In dark the page and card swap surfaces, as AuthScreen's do.\n */\nexport function Layout({ lang, preview, footer, unsubscribe, colorScheme, children }: LayoutProps) {\n const t = emailSchemes.light;\n return (\n <Html lang={lang} data-color-scheme={colorScheme}>\n <Head>\n <meta name=\"color-scheme\" content=\"light dark\" />\n <meta name=\"supported-color-schemes\" content=\"light dark\" />\n <ColorSchemeStyles />\n </Head>\n <Preview>{preview}</Preview>\n <Body className={emailClass.layoutCanvas} style={{ margin: 0, padding: '40px 0', backgroundColor: t.surface1, fontFamily: emailFonts.body }}>\n <Container\n className={emailClass.layoutCard}\n style={{\n width: '100%',\n maxWidth: '440px',\n boxSizing: 'border-box',\n backgroundColor: t.surface,\n border: `1px solid ${variantTokens('light', 'outlined', 'neutral').borderColor}`,\n borderRadius: '20px',\n }}\n >\n <div className={emailClass.layoutCardBody} style={{ padding: '48px' }}>\n {children}\n </div>\n </Container>\n {(footer || unsubscribe) && (\n <Container style={{ maxWidth: '440px', padding: '24px 24px 0', textAlign: 'center' }}>\n {footer}\n {unsubscribe && safeHref(unsubscribe.href) && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: footer ? '12px 0 0' : 0, fontWeight: 400 }}>\n <Link href={unsubscribe.href} color=\"neutral\">\n {unsubscribe.label}\n </Link>\n </Typography>\n )}\n </Container>\n )}\n </Body>\n </Html>\n );\n}\n\n/**\n * The dark-mode stylesheet on its own. Layout includes it; render it\n * once yourself when email components are shown inside a normal page — a\n * preview, the docs — so they follow that page's `data-color-scheme`.\n */\nexport function ColorSchemeStyles() {\n return <style dangerouslySetInnerHTML={{ __html: emailStylesheet }} />;\n}\n","import * as React from 'react';\nimport { Button as ReactEmailButton } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeHref } from '../safeUrl';\n\n/*\n * buttonVariants.ts, resolved. The web Button gets its height from\n * `min-h-8/9/11` and centres the label with flexbox; email has neither, so the\n * same box is built from line-height plus vertical padding:\n * (min-height − line-height) / 2, less the 1px border for outlined.\n */\nconst SIZES = {\n sm: { minHeight: 32, paddingInline: 12, fontSize: 14, lineHeight: 21 },\n md: { minHeight: 36, paddingInline: 16, fontSize: 14, lineHeight: 21 },\n lg: { minHeight: 44, paddingInline: 24, fontSize: 16, lineHeight: 24 },\n} as const;\n\nexport interface ButtonProps {\n /** Rendered only for http(s) URLs; anything else renders nothing — a button nobody can follow is worse than none. */\n href: string;\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** `rounded-full`, as on the web Button. */\n pill?: boolean;\n /** Stretches to the container — the usual call-to-action layout in a narrow email. */\n fullWidth?: boolean;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Button for email: a link styled as the web Button, built on react-email's Outlook-safe Button. */\nexport function Button({ href, variant = 'solid', color = 'primary', size = 'md', pill = false, fullWidth = false, style, children }: ButtonProps) {\n const safe = safeHref(href);\n if (!safe || safe.startsWith('mailto:')) return null;\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const border = variant === 'outlined' ? 1 : 0;\n const paddingBlock = (s.minHeight - s.lineHeight) / 2 - border;\n return (\n <ReactEmailButton\n href={safe}\n className={emailClass.variant(variant, color)}\n style={{\n display: fullWidth ? 'block' : 'inline-block',\n boxSizing: 'border-box',\n width: fullWidth ? '100%' : undefined,\n textAlign: 'center',\n paddingTop: `${paddingBlock}px`,\n paddingBottom: `${paddingBlock}px`,\n paddingLeft: `${s.paddingInline}px`,\n paddingRight: `${s.paddingInline}px`,\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 600,\n lineHeight: `${s.lineHeight}px`,\n textDecoration: 'none',\n borderRadius: pill ? '9999px' : emailRadius.sm,\n color: v.color,\n backgroundColor: v.backgroundColor ?? 'transparent',\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {/* react-email wraps the label in its own inline-block span at\n line-height 120%. In the modes mail is actually shown in — the\n limited-quirks mode its XHTML doctype yields, or full quirks where a\n webmail drops the doctype — the link's own line-height no longer\n props the line up, so the button shrank to 120% of the font plus\n padding: 4–5px short at every size. This span carries the full\n line-height itself, so the box no longer depends on the mode. */}\n <span style={{ display: 'inline-block', lineHeight: `${s.lineHeight}px` }}>{children}</span>\n </ReactEmailButton>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailSchemes } from '../tokens';\n\nexport interface DividerProps {\n /** Spacing around the line — the web Divider has none of its own either. */\n style?: React.CSSProperties;\n}\n\n/**\n * Divider for email: a 1px line in `--color-divider`. A div rather than an\n * <hr>, whose borders Outlook and Gmail each draw differently. `background`\n * carries a solid fallback that Outlook's Word engine — which drops rgba() —\n * keeps; every other client takes the rgba `background-color` after it.\n */\nexport function Divider({ style }: DividerProps) {\n const t = emailSchemes.light;\n return (\n <div\n role=\"separator\"\n className={emailClass.divider}\n style={{ height: '1px', lineHeight: '1px', fontSize: '1px', background: t.dividerFallback, backgroundColor: t.divider, border: 'none', margin: 0, ...style }}\n >\n &nbsp;\n </div>\n );\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\nexport interface CardProps {\n variant?: EmailVariant;\n color?: EmailColor;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/**\n * Card for email: Sheet's variant colours plus Card's own `rounded-md p-4`,\n * defaulting to outlined / neutral like the web Card. Outlined and plain fill\n * with `surface`, as Joy's Sheet does. A one-cell table, because that is the\n * only box Outlook pads reliably; Card's `gap-2` has no email equivalent, so\n * spacing between children is theirs to set.\n */\nexport function Card({ variant = 'outlined', color = 'neutral', style, children }: CardProps) {\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n return (\n <table\n role=\"presentation\"\n width=\"100%\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n borderCollapse: 'separate',\n borderRadius: emailRadius.md,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n ...style,\n }}\n >\n <tbody>\n <tr>\n <td style={{ padding: '16px' }}>{children}</td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import * as React from 'react';\nimport { Img } from 'react-email';\nimport { emailClass } from '../styles';\nimport { emailFonts, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\nimport { safeImageSrc } from '../safeUrl';\n\n/** avatarVariants.ts: 32/40/48px boxes, text-sm/base/lg, medium/medium/semibold. */\nconst SIZES = {\n sm: { box: 32, fontSize: '14px', fontWeight: 500 },\n md: { box: 40, fontSize: '16px', fontWeight: 500 },\n lg: { box: 48, fontSize: '18px', fontWeight: 600 },\n} as const;\n\nexport interface AvatarProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /** An https image. Without one, `children` (usually initials) is shown. */\n src?: string;\n alt?: string;\n children?: React.ReactNode;\n}\n\n/**\n * Avatar for email, defaulting to soft / neutral like the web Avatar. Unlike\n * Card, outlined and plain stay transparent — Joy's Avatar has no surface\n * fallback. The initials are centred by a table cell, since email has no flexbox.\n */\nexport function Avatar({ variant = 'soft', color = 'neutral', size = 'md', src, alt = '', children }: AvatarProps) {\n const s = SIZES[size];\n const safe = safeImageSrc(src);\n if (safe) {\n return <Img src={safe} width={s.box} height={s.box} alt={alt} style={{ display: 'inline-block', borderRadius: '50%', objectFit: 'cover' }} />;\n }\n const v = variantTokens('light', variant, color);\n return (\n <table\n role=\"presentation\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={emailClass.variant(variant, color)}\n style={{\n display: 'inline-table',\n boxSizing: 'border-box',\n width: `${s.box}px`,\n height: `${s.box}px`,\n borderCollapse: 'separate',\n borderRadius: '50%',\n backgroundColor: v.backgroundColor ?? 'transparent',\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n fontFamily: emailFonts.body,\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n lineHeight: 1,\n verticalAlign: 'middle',\n }}\n >\n <tbody>\n <tr>\n <td align=\"center\" style={{ padding: 0, verticalAlign: 'middle', textAlign: 'center' }}>\n {children}\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n","import { EMAIL_COLORS, EMAIL_VARIANTS, variantTokens, type EmailColor, type EmailScheme, type EmailVariant } from './tokens';\n\n/**\n * The icon an Alert shows for its colour — the same as @hintoric/ui's\n * `ALERT_ICON_FOR_COLOR`, which the parity tests compare it with.\n */\nexport const EMAIL_ALERT_ICON_FOR_COLOR = {\n primary: 'info',\n neutral: 'info',\n danger: 'report',\n success: 'check-circle',\n warning: 'warning',\n} as const satisfies Record<EmailColor, string>;\n\nexport type EmailAlertIconName = (typeof EMAIL_ALERT_ICON_FOR_COLOR)[EmailColor];\n\n/*\n * Mail clients can't colour an image, so every icon exists once per text\n * colour it is drawn in: a PNG at twice the largest size it is shown at\n * (24px), hosted on the CDN. The files come from scripts/alert-icons.mjs.\n */\nexport const EMAIL_ALERT_ICON_BASE = 'https://cdn.hintoric.com/assets/email/alert';\n\nexport function emailAlertIconUrl(name: EmailAlertIconName, ink: string): string {\n return `${EMAIL_ALERT_ICON_BASE}/${name}-${ink.replace('#', '').toLowerCase()}.png`;\n}\n\n/** The icon for an alert of this variant and colour, in the scheme's ink. */\nexport function emailAlertIcon(scheme: EmailScheme, variant: EmailVariant, color: EmailColor): { name: EmailAlertIconName; ink: string; url: string } {\n const name = EMAIL_ALERT_ICON_FOR_COLOR[color];\n const ink = variantTokens(scheme, variant, color).color!;\n return { name, ink, url: emailAlertIconUrl(name, ink) };\n}\n\n/** Every icon file an Alert can ask for — what has to be on the CDN. */\nexport function emailAlertIconFiles(): { name: EmailAlertIconName; ink: string; file: string; url: string }[] {\n const files = new Map<string, { name: EmailAlertIconName; ink: string; file: string; url: string }>();\n for (const scheme of ['light', 'dark'] as const) {\n for (const variant of EMAIL_VARIANTS) {\n for (const color of EMAIL_COLORS) {\n const { name, ink, url } = emailAlertIcon(scheme, variant, color);\n files.set(url, { name, ink, url, file: url.slice(EMAIL_ALERT_ICON_BASE.length + 1) });\n }\n }\n }\n return [...files.values()];\n}\n","import * as React from 'react';\nimport { Img } from 'react-email';\nimport { emailAlertIcon } from '../alertIcons';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailRadius, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\n/**\n * alertVariants.ts: `gap-2/2.5/3.5`, `p-2/3/4`, `text-xs/sm/base` at a 1.5\n * line-height; the icon is AlertIcon's 20px up to md and 24px at lg.\n */\nconst SIZES = {\n sm: { gap: 8, padding: 8, fontSize: 12, icon: 20 },\n md: { gap: 10, padding: 12, fontSize: 14, icon: 20 },\n lg: { gap: 14, padding: 16, fontSize: 16, icon: 24 },\n} as const;\n\nexport interface AlertProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n /**\n * A box — normally an image icon — on the first line, before the text.\n * Left out, the alert shows the icon for its colour, as the web Alert\n * does; `null` shows none.\n */\n startDecorator?: React.ReactNode;\n /** A box on the first line, after the text. */\n endDecorator?: React.ReactNode;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/**\n * Alert for email, defaulting to soft / neutral like the web Alert; outlined\n * and plain fill with `surface`. A table like Card, since that is the only box\n * Outlook pads reliably. Every cell sets the type itself: tables in quirks\n * mode — a webmail that drops the doctype — don't inherit font size, weight\n * or line height.\n *\n * Decorators get a cell each, as wide as they are, and sit centred in a cell\n * one line high, so an icon lines up with the first line of the text as the\n * web Alert's `min-h-[1lh] items-center` does. That cell has no line height\n * of its own — a decorator is a box; text in it needs its own font-size.\n */\nexport function Alert({ variant = 'soft', color = 'neutral', size = 'md', startDecorator, endDecorator, style, children }: AlertProps) {\n const s = SIZES[size];\n const start = startDecorator === undefined ? <AlertIcon variant={variant} color={color} size={s.icon} /> : startDecorator;\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n const lineHeight = s.fontSize * 1.5;\n const type: React.CSSProperties = { fontFamily: emailFonts.body, fontSize: `${s.fontSize}px`, fontWeight: 500, lineHeight: 1.5 };\n const decorator = (node: React.ReactNode, side: 'start' | 'end') => (\n <td width=\"1\" style={{ verticalAlign: 'top', [side === 'start' ? 'paddingRight' : 'paddingLeft']: `${s.gap}px` }}>\n <table role=\"presentation\" cellPadding={0} cellSpacing={0} border={0}>\n <tbody>\n <tr>\n <td data-alert-decorator=\"\" height={lineHeight} style={{ height: `${lineHeight}px`, verticalAlign: 'middle', fontSize: 0, lineHeight: 0 }}>\n {node}\n </td>\n </tr>\n </tbody>\n </table>\n </td>\n );\n return (\n <table\n role=\"presentation\"\n width=\"100%\"\n cellPadding={0}\n cellSpacing={0}\n border={0}\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n borderCollapse: 'separate',\n borderRadius: emailRadius.sm,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n color: v.color,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...type,\n ...style,\n }}\n >\n <tbody>\n <tr>\n <td style={{ padding: `${s.padding}px`, ...type }}>\n {start || endDecorator ? (\n <table role=\"presentation\" width=\"100%\" cellPadding={0} cellSpacing={0} border={0}>\n <tbody>\n <tr>\n {start && decorator(start, 'start')}\n <td data-alert-content=\"\" style={{ verticalAlign: 'top', ...type }}>\n {children}\n </td>\n {endDecorator && decorator(endDecorator, 'end')}\n </tr>\n </tbody>\n </table>\n ) : (\n children\n )}\n </td>\n </tr>\n </tbody>\n </table>\n );\n}\n\n/**\n * The colour's icon as a light / dark pair of hosted PNGs, like HintoricLogo:\n * a mail client can't recolour an image, so each scheme's ink is its own file.\n * Clients without the dark stylesheet keep the light one.\n */\nfunction AlertIcon({ variant, color, size }: { variant: EmailVariant; color: EmailColor; size: number }) {\n const light = emailAlertIcon('light', variant, color);\n const dark = emailAlertIcon('dark', variant, color);\n const img = (url: string, className: string, display: 'block' | 'none') => (\n // min-width and max-width: none against a host's `img { max-width: 100% }`\n // (Tailwind's preflight, some webmail), which in a cell sized to its\n // content resolves to 0 and hides the icon.\n <Img\n src={url}\n width={size}\n height={size}\n alt=\"\"\n className={className}\n style={{ display, width: `${size}px`, height: `${size}px`, minWidth: `${size}px`, maxWidth: 'none', border: 0 }}\n />\n );\n return (\n <>\n {img(light.url, emailClass.lightOnly, 'block')}\n {img(dark.url, emailClass.darkOnly, 'none')}\n </>\n );\n}\n\nexport interface AlertTitleProps {\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/**\n * AlertTitle.tsx: `text-base/6 font-semibold`, in the alert's colour. Body\n * text under it keeps the alert's own size; give it `fontWeight: 400` for a\n * regular weight, since the alert is medium.\n */\nexport function AlertTitle({ style, children }: AlertTitleProps) {\n return <div style={{ fontFamily: emailFonts.body, fontSize: '16px', lineHeight: '24px', fontWeight: 600, ...style }}>{children}</div>;\n}\n","import * as React from 'react';\nimport { emailClass } from '../styles';\nimport { emailFonts, emailSchemes, variantTokens, type EmailColor, type EmailVariant } from '../tokens';\n\n/**\n * chipVariants.ts: `min-h-5/6/7`, `px-1.5/2/3`, `text-xs/sm/base` at a 1.5\n * line-height. As with Button, the min-height becomes vertical padding.\n */\nconst SIZES = {\n sm: { minHeight: 20, paddingInline: 6, fontSize: 12 },\n md: { minHeight: 24, paddingInline: 8, fontSize: 14 },\n lg: { minHeight: 28, paddingInline: 12, fontSize: 16 },\n} as const;\n\nexport interface ChipProps {\n variant?: EmailVariant;\n color?: EmailColor;\n size?: keyof typeof SIZES;\n style?: React.CSSProperties;\n children: React.ReactNode;\n}\n\n/** Chip for email, defaulting to soft / neutral like the web Chip; outlined and plain fill with `surface`. */\nexport function Chip({ variant = 'soft', color = 'neutral', size = 'md', style, children }: ChipProps) {\n const s = SIZES[size];\n const v = variantTokens('light', variant, color);\n const filled = v.backgroundColor !== undefined;\n const border = v.borderColor ? 1 : 0;\n const lineHeight = s.fontSize * 1.5;\n const paddingBlock = (s.minHeight - lineHeight) / 2 - border;\n return (\n <span\n className={[emailClass.variant(variant, color), filled ? '' : emailClass.surface].filter(Boolean).join(' ')}\n style={{\n display: 'inline-block',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n verticalAlign: 'middle',\n padding: `${paddingBlock}px ${s.paddingInline}px`,\n borderRadius: '1.5rem',\n fontFamily: emailFonts.body,\n fontSize: `${s.fontSize}px`,\n fontWeight: 500,\n lineHeight: 1.5,\n color: v.color,\n backgroundColor: v.backgroundColor ?? emailSchemes.light.surface,\n border: v.borderColor ? `1px solid ${v.borderColor}` : undefined,\n ...style,\n }}\n >\n {children}\n </span>\n );\n}\n","import { Img } from 'react-email';\nimport { emailClass } from '../styles';\n\n/*\n * The hintoric wordmark as hosted PNGs (1336 × 410 artwork, shown at 104 × 32\n * so it stays sharp on HiDPI screens). PNG rather than SVG, which Gmail and\n * desktop Outlook don't display; linked rather than attached, so messages stay\n * small. A client that blocks remote images until asked shows the alt text.\n */\nconst LOGO = {\n light: 'https://cdn.hintoric.com/assets/logo/black.png',\n dark: 'https://cdn.hintoric.com/assets/logo/white.png',\n width: 104,\n height: 32,\n};\n\n/**\n * The email counterpart of the web HintoricLogo: the black wordmark, swapped\n * for the white one where the client applies the dark stylesheet.\n */\nexport function HintoricLogo() {\n return (\n <>\n <Img\n src={LOGO.light}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoLight}\n style={{ display: 'inline-block', margin: '0 auto' }}\n />\n <Img\n src={LOGO.dark}\n width={LOGO.width}\n height={LOGO.height}\n alt=\"hintoric\"\n className={emailClass.logoDark}\n style={{ display: 'none', margin: '0 auto' }}\n />\n </>\n );\n}\n","import { Button } from '../../components/Button';\nimport { Card } from '../../components/Card';\nimport { Divider } from '../../components/Divider';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { Layout } from '../../components/Layout';\nimport { Typography } from '../../components/Typography';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { RenderedEmail } from '../SecurityActivityAlert';\nimport type { AuthCodeContext, AuthCodeProps } from './types';\n\nfunction contextOf({ purpose, code, email }: AuthCodeProps): AuthCodeContext {\n return { purpose, code, email };\n}\n\n/**\n * A one-time code from a sign-in flow: verifying an address, registering,\n * signing in, recovering an account. Heading, one sentence, the code large\n * enough to type from a phone, and — when the flow has one — a button that\n * does the same as the code.\n */\nexport function AuthCodeEmail(props: AuthCodeProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <AuthCodeContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function AuthCodeContent(props: AuthCodeProps) {\n const { messages, code, url, expiresInMinutes } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {messages.heading(ctx)}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {messages.intro(ctx)}\n </Typography>\n </div>\n {/* Outlined, not soft: in dark the layout card is surface-1, exactly the\n soft-neutral fill, which would make the box vanish. */}\n <Card>\n {/* One text node, no spaces between the digits: a double-click selects\n the whole code and copies it as it is to be typed. The letter\n spacing trails the last digit too, so the indent re-centres it. */}\n <Typography\n level=\"h2\"\n component=\"p\"\n textAlign=\"center\"\n style={{ margin: 0, fontFamily: emailFonts.code, letterSpacing: '0.25em', textIndent: '0.25em', fontWeight: 700 }}\n >\n <span data-auth-code=\"\">{code}</span>\n </Typography>\n </Card>\n {expiresInMinutes !== undefined && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '12px 0 0', fontWeight: 400 }}>\n {messages.expiry(expiresInMinutes)}\n </Typography>\n )}\n {url && (\n <div style={{ marginTop: '24px' }}>\n <Button href={url} size=\"lg\" fullWidth>\n {messages.button(ctx)}\n </Button>\n </div>\n )}\n <Divider style={{ margin: '32px 0 24px' }} />\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" style={{ margin: 0, fontWeight: 400 }}>\n {messages.ignore(ctx)}\n </Typography>\n </>\n );\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderAuthCode(props: AuthCodeProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<AuthCodeEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { AuthCodeMessages, AuthCodePurpose } from './types';\n\n// The code names core's sign-in screens use (web/app/i18n), so the mail and\n// the field the code goes into say the same thing.\nconst codeNameDe: Record<AuthCodePurpose, string> = {\n verification: 'Bestätigungscode',\n registration: 'Registrierungscode',\n login: 'Anmeldecode',\n recovery: 'Wiederherstellungscode',\n};\n\nconst headingDe: Record<AuthCodePurpose, string> = {\n verification: 'Adresse bestätigen',\n registration: 'Konto anlegen',\n login: 'Anmelden',\n recovery: 'Konto wiederherstellen',\n};\n\n// Login and recovery codes open the account itself, so their mail says not\n// to pass them on; the other two only confirm an address.\nconst grantsAccess = (purpose: AuthCodePurpose) => purpose === 'login' || purpose === 'recovery';\n\nexport const authCodeMessagesDe: AuthCodeMessages = {\n lang: 'de',\n subject: ({ purpose }) => `Dein ${codeNameDe[purpose]} für hintoric`,\n preview: ({ code }) => `Dein Code: ${code}`,\n heading: ({ purpose }) => headingDe[purpose],\n intro: ({ purpose, email }) => {\n switch (purpose) {\n case 'verification':\n return `Gib diesen Code ein, um ${email ?? 'deine E-Mail-Adresse'} zu bestätigen.`;\n case 'registration':\n return `Gib diesen Code ein, um dein Konto bei hintoric${email ? ` für ${email}` : ''} anzulegen.`;\n case 'login':\n return `Gib diesen Code ein, um dich${email ? ` als ${email}` : ''} bei hintoric anzumelden.`;\n case 'recovery':\n return `Gib diesen Code ein, um wieder auf dein Konto bei hintoric${email ? ` (${email})` : ''} zuzugreifen.`;\n }\n },\n button: ({ purpose }) => headingDe[purpose],\n expiry: (minutes) => `Der Code ist ${minutes} Minuten gültig.`,\n ignore: ({ purpose }) =>\n grantsAccess(purpose)\n ? 'Wenn du das nicht angefordert hast, kannst du diese E-Mail ignorieren. Gib den Code an niemanden weiter – hintoric fragt dich nie danach.'\n : 'Wenn du das nicht angefordert hast, kannst du diese E-Mail ignorieren.',\n footer: () => 'Du erhältst diese E-Mail, weil mit deiner Adresse ein Code bei hintoric angefordert wurde.',\n};\n\nconst codeNameEn: Record<AuthCodePurpose, string> = {\n verification: 'verification code',\n registration: 'registration code',\n login: 'sign-in code',\n recovery: 'recovery code',\n};\n\nconst headingEn: Record<AuthCodePurpose, string> = {\n verification: 'Confirm your address',\n registration: 'Create your account',\n login: 'Sign in',\n recovery: 'Recover your account',\n};\n\nexport const authCodeMessagesEn: AuthCodeMessages = {\n lang: 'en',\n subject: ({ purpose }) => `Your hintoric ${codeNameEn[purpose]}`,\n preview: ({ code }) => `Your code: ${code}`,\n heading: ({ purpose }) => headingEn[purpose],\n intro: ({ purpose, email }) => {\n switch (purpose) {\n case 'verification':\n return `Enter this code to confirm ${email ?? 'your email address'} for your hintoric account.`;\n case 'registration':\n return `Enter this code to create your hintoric account${email ? ` for ${email}` : ''}.`;\n case 'login':\n return `Enter this code to sign in to hintoric${email ? ` as ${email}` : ''}.`;\n case 'recovery':\n return `Enter this code to get back into your hintoric account${email ? ` (${email})` : ''}.`;\n }\n },\n button: ({ purpose }) => headingEn[purpose],\n expiry: (minutes) => `The code is valid for ${minutes} minutes.`,\n ignore: ({ purpose }) =>\n grantsAccess(purpose)\n ? \"If you didn't request this, you can ignore this email. Don't share the code with anyone – hintoric will never ask you for it.\"\n : \"If you didn't request this, you can ignore this email.\",\n footer: () => 'We sent you this email because someone requested a code for your address at hintoric.',\n};\n","import { Alert } from '../../components/Alert';\nimport { Button } from '../../components/Button';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { Layout } from '../../components/Layout';\nimport { Typography } from '../../components/Typography';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { RenderedEmail } from '../SecurityActivityAlert';\nimport type { AuthNoAccountContext, AuthNoAccountProps } from './types';\n\nfunction contextOf({ purpose, email }: AuthNoAccountProps): AuthNoAccountContext {\n return { purpose, email };\n}\n\n/**\n * The answer to a code request for an address without an account: no code,\n * only what was attempted, the fact itself in a warning alert, the likely\n * mix-up, and — when given — a way to create the account.\n */\nexport function AuthNoAccountEmail(props: AuthNoAccountProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <AuthNoAccountContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function AuthNoAccountContent(props: AuthNoAccountProps) {\n const { messages, registrationUrl } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {messages.heading(ctx)}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {messages.body(ctx)}\n </Typography>\n </div>\n <Alert color=\"warning\">{messages.alert(ctx)}</Alert>\n <div style={{ textAlign: 'center' }}>\n <Typography level=\"body-sm\" style={{ margin: registrationUrl ? '24px 0' : '24px 0 0' }}>\n {messages.hint(ctx)}\n </Typography>\n {registrationUrl && (\n <Button href={registrationUrl} variant=\"outlined\" color=\"neutral\" size=\"lg\" fullWidth>\n {messages.registerButton}\n </Button>\n )}\n </div>\n </>\n );\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderAuthNoAccount(props: AuthNoAccountProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<AuthNoAccountEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { AuthNoAccountMessages } from './types';\n\nexport const authNoAccountMessagesDe: AuthNoAccountMessages = {\n lang: 'de',\n subject: () => 'Zu dieser Adresse gibt es kein Konto bei hintoric',\n preview: () => 'Vielleicht hast du dich mit einer anderen Adresse registriert.',\n heading: () => 'Kein Konto gefunden',\n body: ({ purpose, email }) => `Für ${email} wurde ein ${purpose === 'recovery' ? 'Wiederherstellungscode' : 'Bestätigungscode'} angefordert.`,\n alert: () => 'Zu dieser Adresse gibt es kein Konto bei hintoric.',\n hint: () => 'Vielleicht hast du dich mit einer anderen Adresse registriert. Wenn du den Code nicht angefordert hast, kannst du diese E-Mail ignorieren.',\n registerButton: 'Konto anlegen',\n footer: () => 'Du erhältst diese E-Mail, weil deine Adresse bei hintoric angegeben wurde.',\n};\n\nexport const authNoAccountMessagesEn: AuthNoAccountMessages = {\n lang: 'en',\n subject: () => 'No hintoric account with this address',\n preview: () => 'Maybe you signed up with a different address.',\n heading: () => 'No account found',\n body: ({ purpose, email }) => `A ${purpose === 'recovery' ? 'recovery' : 'verification'} code was requested for ${email}.`,\n alert: () => 'There is no hintoric account with this address.',\n hint: () => \"Maybe you signed up with a different address. If you didn't request the code, you can ignore this email.\",\n registerButton: 'Create an account',\n footer: () => 'We sent you this email because someone entered your address at hintoric.',\n};\n","import { Avatar } from '../../components/Avatar';\nimport { Button } from '../../components/Button';\nimport { Divider } from '../../components/Divider';\nimport { Layout } from '../../components/Layout';\nimport { Link } from '../../components/Link';\nimport { Typography } from '../../components/Typography';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { SecurityActivityAlertContext, SecurityActivityAlertProps } from './types';\n\nfunction contextOf(props: SecurityActivityAlertProps): SecurityActivityAlertContext {\n return {\n activity: props.activity,\n target: props.target,\n targetName: targetNameOf(props),\n occurredAt: props.messages.formatDateTime(props.activity.occurredAt, props.timeZone),\n };\n}\n\nfunction targetNameOf({ target }: SecurityActivityAlertProps): string {\n return target.type === 'workspace' ? target.workspaceName : target.email;\n}\n\n/**\n * The first letter of the first two words that have one: \"Müller & Söhne\"\n * is MS, not M&, and a quote or dash in front of a word does not count.\n */\nfunction initials(name: string): string {\n return name\n .split(/\\s+/)\n .map((word) => word.match(/\\p{L}/u)?.[0])\n .filter((letter): letter is string => letter !== undefined)\n .slice(0, 2)\n .map((letter) => letter.toUpperCase())\n .join('');\n}\n\n/**\n * For security-relevant activity: a change in a workspace (sent to its\n * admins) or to an account (sent to its owner) — see `SecurityActivityTarget`.\n * Deliberately short: what happened as the heading, what it concerns, one\n * sentence, one button, one link.\n */\nexport function SecurityActivityAlertEmail(props: SecurityActivityAlertProps) {\n const { messages } = props;\n const ctx = contextOf(props);\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview(ctx)}\n colorScheme={props.colorScheme}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer(ctx)}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <SecurityActivityAlertContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\nexport function SecurityActivityAlertContent(props: SecurityActivityAlertProps) {\n const { messages, activityLogUrl } = props;\n const ctx = contextOf(props);\n return (\n <>\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '16px 0 12px', fontFamily: emailFonts.heading }}>\n {props.activity.title}\n </Typography>\n {/* primary, not the default neutral: in dark the layout card is surface-1,\n exactly the soft-neutral avatar fill, which would make it vanish. */}\n <Avatar size=\"sm\" color=\"primary\">\n {initials(ctx.targetName)}\n </Avatar>\n <Typography level=\"title-sm\" component=\"span\" style={{ marginLeft: '8px', verticalAlign: 'middle' }}>\n {ctx.targetName}\n </Typography>\n </div>\n <Divider style={{ margin: '32px 0' }} />\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {props.activity.description?.trim() || messages.summary(ctx)} {messages.guidance(ctx)}\n </Typography>\n <Button href={props.reviewUrl} size=\"lg\" fullWidth>\n {messages.reviewButton}\n </Button>\n {activityLogUrl && (\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" style={{ marginTop: '24px', fontWeight: 400 }}>\n {messages.activityLogHint((label) => (\n <Link href={activityLogUrl} underline=\"none\">\n {label}\n </Link>\n ))}\n </Typography>\n )}\n </>\n );\n}\n\nexport interface RenderedEmail {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */\nexport async function renderSecurityActivityAlert(props: SecurityActivityAlertProps): Promise<RenderedEmail> {\n const { html, text } = await renderEmail(<SecurityActivityAlertEmail {...props} />);\n return { subject: props.messages.subject(contextOf(props)), html, text };\n}\n","import type { SecurityActivityAlertMessages } from './types';\n\nfunction dateTimeFormatter(locale: string, suffix = '') {\n return (date: Date, timeZone: string) =>\n new Intl.DateTimeFormat(locale, { dateStyle: 'long', timeStyle: 'short', timeZone }).format(date) + suffix;\n}\n\nexport const securityActivityAlertMessagesDe: SecurityActivityAlertMessages = {\n lang: 'de',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} hat am ${occurredAt} etwas geändert, das die Sicherheit betrifft.`,\n guidance: () => 'Wenn du diese Änderung nicht erwartet hast, prüfe die Aktivität jetzt.',\n reviewButton: 'Aktivität prüfen',\n activityLogHint: (link) => <>Alle sicherheitsrelevanten Aktivitäten findest du im {link('Aktivitätsprotokoll')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'Du erhältst diese E-Mail, weil du diesen Workspace verwaltest.'\n : 'Du erhältst diese E-Mail, weil sie dein Konto bei hintoric betrifft.',\n // DIN 5008: the time takes \"Uhr\" — \"28. September 2026 um 19:31 Uhr\".\n formatDateTime: dateTimeFormatter('de-DE', ' Uhr'),\n};\n\nexport const securityActivityAlertMessagesEn: SecurityActivityAlertMessages = {\n lang: 'en',\n subject: ({ activity, targetName }) => `${activity.title} – ${targetName}`,\n preview: ({ activity, occurredAt }) => `${activity.actorName} · ${occurredAt}`,\n summary: ({ activity, occurredAt }) => `${activity.actorName} made a security-relevant change on ${occurredAt}.`,\n guidance: () => \"If you didn't expect this change, review the activity now.\",\n reviewButton: 'Review activity',\n activityLogHint: (link) => <>You can see all security-relevant activity in the {link('activity log')}.</>,\n footer: ({ target }) =>\n target.type === 'workspace'\n ? 'We sent you this email to let you know, as an admin, about important changes in your workspace.'\n : 'We sent you this email to let you know about important changes to your hintoric account.',\n formatDateTime: dateTimeFormatter('en-GB'),\n};\n","import { Button } from '../../components/Button';\nimport { HintoricLogo } from '../../components/HintoricLogo';\nimport { Layout } from '../../components/Layout';\nimport { Typography } from '../../components/Typography';\nimport { renderEmail } from '../../render';\nimport { emailFonts } from '../../tokens';\nimport type { WaitlistWelcomeProps } from './types';\n\n/**\n * Sent right after someone joins the waitlist: a thank-you, what happens\n * next, one button to the website. Centred, like the other single-purpose\n * mails — logo, heading, two short paragraphs, button, sign-off.\n */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeEmail(props: WaitlistWelcomeProps) {\n const { messages } = props;\n return (\n <Layout\n lang={messages.lang}\n preview={messages.preview}\n colorScheme={props.colorScheme}\n unsubscribe={props.unsubscribeUrl && messages.unsubscribe ? { href: props.unsubscribeUrl, label: messages.unsubscribe } : undefined}\n footer={\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ fontWeight: 400 }}>\n {messages.footer}\n {props.legalNotice && (\n <>\n <br />\n {props.legalNotice}\n </>\n )}\n </Typography>\n }\n >\n <WaitlistWelcomeContent {...props} />\n </Layout>\n );\n}\n\n/** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */\n/** @deprecated New consumers should not use this template. */\nexport function WaitlistWelcomeContent({ messages, websiteUrl }: WaitlistWelcomeProps) {\n return (\n <div style={{ textAlign: 'center' }}>\n <HintoricLogo />\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 8px', fontWeight: 400 }}>\n {messages.eyebrow}\n </Typography>\n <Typography level=\"h3\" component=\"h1\" style={{ margin: '0 0 16px', fontFamily: emailFonts.heading }}>\n {messages.heading}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '12px' }}>\n {messages.body1}\n </Typography>\n <Typography level=\"body-sm\" style={{ marginBottom: '24px' }}>\n {messages.body2}\n </Typography>\n <Button href={websiteUrl} size=\"lg\" fullWidth>\n {messages.cta}\n </Button>\n <Typography level=\"body-xs\" component=\"p\" textAlign=\"center\" textColor=\"icon\" style={{ margin: '24px 0 0', fontWeight: 400 }}>\n {messages.signoff}\n </Typography>\n </div>\n );\n}\n\nexport interface RenderedWaitlistWelcome {\n subject: string;\n html: string;\n text: string;\n}\n\n/** Subject, HTML and plain-text body in one call — what SES, Resend and the like take. */\n/** @deprecated New consumers should not use this template. */\nexport async function renderWaitlistWelcome(props: WaitlistWelcomeProps): Promise<RenderedWaitlistWelcome> {\n const { html, text } = await renderEmail(<WaitlistWelcomeEmail {...props} />);\n return { subject: props.messages.subject, html, text };\n}\n","import type { WaitlistWelcomeMessages } from './types';\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesDe: WaitlistWelcomeMessages = {\n lang: 'de',\n subject: 'Du stehst auf der Warteliste von hintoric',\n preview: 'Sobald dein Platz frei wird, bekommst du eine E-Mail.',\n eyebrow: 'Danke, dass du dabei bist',\n heading: 'Willkommen bei hintoric',\n body1: 'Du stehst auf der Warteliste. Sobald dein Platz frei wird, bekommst du eine E-Mail – und gehörst zu den Ersten, die hintoric ausprobieren.',\n body2: 'Passt hintoric auch zu jemandem aus deinem Umfeld? Dann leite diese E-Mail gern weiter.',\n cta: 'Zu hintoric.com',\n signoff: '— Dein hintoric-Team',\n footer: 'Du erhältst diese E-Mail, weil du dich auf der Warteliste von hintoric eingetragen hast.',\n unsubscribe: 'E-Mails abbestellen',\n};\n\n/** @deprecated New consumers should not use this template. */\nexport const waitlistWelcomeMessagesEn: WaitlistWelcomeMessages = {\n lang: 'en',\n subject: \"You're on the hintoric waitlist\",\n preview: 'Welcome aboard — hintoric',\n eyebrow: 'Thanks for joining',\n heading: 'Welcome to hintoric',\n body1: \"You're all set. As soon as your spot opens up we'll let you know — you'll be one of the first to try hintoric.\",\n body2: \"Until then we'll keep you posted. If someone you know should be on the list too, feel free to forward this email.\",\n cta: 'Go to hintoric.com',\n signoff: '— Your hintoric team',\n footer: 'We sent you this email because you signed up for the hintoric waitlist.',\n unsubscribe: 'Unsubscribe',\n};\n"],"mappings":"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"}
package/dist/styles.d.ts CHANGED
@@ -13,6 +13,8 @@ export declare const emailClass: {
13
13
  readonly layoutCardBody: "hx-layout-card-body";
14
14
  readonly logoLight: "hx-logo-light";
15
15
  readonly logoDark: "hx-logo-dark";
16
+ readonly lightOnly: "hx-light-only";
17
+ readonly darkOnly: "hx-dark-only";
16
18
  };
17
19
  export declare const emailStylesheet: string;
18
20
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAmBlB,eAAO,MAAM,UAAU;gCACF,YAAY,SAAS,UAAU;2BACpC,UAAU;;;;;;;;;;;;CAkBhB,CAAC;AA6DX,eAAO,MAAM,eAAe,QAMhB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAmBlB,eAAO,MAAM,UAAU;gCACF,YAAY,SAAS,UAAU;2BACpC,UAAU;;;;;;;;;;;;;;CAqBhB,CAAC;AA+DX,eAAO,MAAM,eAAe,QAMhB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { RenderedEmail } from '../SecurityActivityAlert';
2
+ import { AuthCodeProps } from './types';
3
+ /**
4
+ * A one-time code from a sign-in flow: verifying an address, registering,
5
+ * signing in, recovering an account. Heading, one sentence, the code large
6
+ * enough to type from a phone, and — when the flow has one — a button that
7
+ * does the same as the code.
8
+ */
9
+ export declare function AuthCodeEmail(props: AuthCodeProps): import("react").JSX.Element;
10
+ /** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */
11
+ export declare function AuthCodeContent(props: AuthCodeProps): import("react").JSX.Element;
12
+ /** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */
13
+ export declare function renderAuthCode(props: AuthCodeProps): Promise<RenderedEmail>;
14
+ //# sourceMappingURL=AuthCodeEmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthCodeEmail.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthCode/AuthCodeEmail.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,SAAS,CAAC;AAM9D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,aAAa,+BAuBjD;AAED,qHAAqH;AACrH,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,+BA+CnD;AAED,sFAAsF;AACtF,wBAAsB,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAGjF"}
@@ -0,0 +1,4 @@
1
+ export { AuthCodeEmail, AuthCodeContent, renderAuthCode } from './AuthCodeEmail';
2
+ export { authCodeMessagesDe, authCodeMessagesEn } from './messages';
3
+ export type { AuthCodeContext, AuthCodeMessages, AuthCodeProps, AuthCodePurpose } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthCode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { AuthCodeMessages } from './types';
2
+ export declare const authCodeMessagesDe: AuthCodeMessages;
3
+ export declare const authCodeMessagesEn: AuthCodeMessages;
4
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthCode/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAmB,MAAM,SAAS,CAAC;AAsBjE,eAAO,MAAM,kBAAkB,EAAE,gBAwBhC,CAAC;AAgBF,eAAO,MAAM,kBAAkB,EAAE,gBAwBhC,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Which flow asked for the code — Kratos' `verification_code`,
3
+ * `recovery_code`, `login_code` and `registration_code` templates. It picks
4
+ * the heading, the subject and how firmly the mail warns.
5
+ */
6
+ export type AuthCodePurpose = 'verification' | 'recovery' | 'login' | 'registration';
7
+ /** What every message function receives. */
8
+ export interface AuthCodeContext {
9
+ purpose: AuthCodePurpose;
10
+ code: string;
11
+ /** The address the code was sent to, when the sender knows it. */
12
+ email?: string;
13
+ }
14
+ /**
15
+ * Every string the template shows. There are no built-in defaults — like the
16
+ * library's other blocks, the template doesn't decide what language its
17
+ * consumers speak. Pass `authCodeMessagesDe` / `authCodeMessagesEn`, or
18
+ * spread one and override what differs.
19
+ */
20
+ export interface AuthCodeMessages {
21
+ /** BCP 47 tag for `<html lang>`. */
22
+ lang: string;
23
+ subject: (ctx: AuthCodeContext) => string;
24
+ /** The line inbox lists show after the subject. */
25
+ preview: (ctx: AuthCodeContext) => string;
26
+ heading: (ctx: AuthCodeContext) => string;
27
+ /** The sentence above the code: what it is for. */
28
+ intro: (ctx: AuthCodeContext) => string;
29
+ /** Label of the button. Shown only when `url` is set. */
30
+ button: (ctx: AuthCodeContext) => string;
31
+ /** The line under the code. Shown only when `expiresInMinutes` is set. */
32
+ expiry: (minutes: number) => string;
33
+ /** What to do if the reader didn't ask for the code. */
34
+ ignore: (ctx: AuthCodeContext) => string;
35
+ /** Under the card: why the reader got this mail. */
36
+ footer: (ctx: AuthCodeContext) => string;
37
+ }
38
+ export interface AuthCodeProps {
39
+ purpose: AuthCodePurpose;
40
+ /** The one-time code, shown as it is: Kratos sends six digits. */
41
+ code: string;
42
+ /** The address the code was sent to. Named in the intro when given. */
43
+ email?: string;
44
+ /**
45
+ * A link that does what entering the code does — Kratos' verification URL,
46
+ * which carries the code. Adds a button under the code; unsafe schemes are
47
+ * dropped.
48
+ */
49
+ url?: string;
50
+ /** How long the code is valid. Kratos' courier doesn't pass it; it is the flow's configured lifespan. */
51
+ expiresInMinutes?: number;
52
+ messages: AuthCodeMessages;
53
+ /** The sender's legal line under the footer — company, address. */
54
+ legalNotice?: string;
55
+ /** Previews only — see `Layout`. */
56
+ colorScheme?: 'light' | 'dark';
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthCode/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,cAAc,GAAG,UAAU,GAAG,OAAO,GAAG,cAAc,CAAC;AAErF,4CAA4C;AAC5C,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IAC1C,mDAAmD;IACnD,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IAC1C,mDAAmD;IACnD,KAAK,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IACxC,yDAAyD;IACzD,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IACzC,0EAA0E;IAC1E,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,wDAAwD;IACxD,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;IACzC,oDAAoD;IACpD,MAAM,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC"}
@@ -0,0 +1,13 @@
1
+ import { RenderedEmail } from '../SecurityActivityAlert';
2
+ import { AuthNoAccountProps } from './types';
3
+ /**
4
+ * The answer to a code request for an address without an account: no code,
5
+ * only what was attempted, the fact itself in a warning alert, the likely
6
+ * mix-up, and — when given — a way to create the account.
7
+ */
8
+ export declare function AuthNoAccountEmail(props: AuthNoAccountProps): import("react").JSX.Element;
9
+ /** What goes inside the card, without the document — for in-app previews (render `ColorSchemeStyles` next to it). */
10
+ export declare function AuthNoAccountContent(props: AuthNoAccountProps): import("react").JSX.Element;
11
+ /** Subject, HTML and plain-text body in one call — what a mail API's send() takes. */
12
+ export declare function renderAuthNoAccount(props: AuthNoAccountProps): Promise<RenderedEmail>;
13
+ //# sourceMappingURL=AuthNoAccountEmail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthNoAccountEmail.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthNoAccount/AuthNoAccountEmail.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAwB,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAMxE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,+BAuB3D;AAED,qHAAqH;AACrH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,+BA2B7D;AAED,sFAAsF;AACtF,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAG3F"}
@@ -0,0 +1,4 @@
1
+ export { AuthNoAccountEmail, AuthNoAccountContent, renderAuthNoAccount } from './AuthNoAccountEmail';
2
+ export { authNoAccountMessagesDe, authNoAccountMessagesEn } from './messages';
3
+ export type { AuthNoAccountContext, AuthNoAccountMessages, AuthNoAccountProps, AuthNoAccountPurpose } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthNoAccount/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AACrG,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { AuthNoAccountMessages } from './types';
2
+ export declare const authNoAccountMessagesDe: AuthNoAccountMessages;
3
+ export declare const authNoAccountMessagesEn: AuthNoAccountMessages;
4
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthNoAccount/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAErD,eAAO,MAAM,uBAAuB,EAAE,qBAUrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,qBAUrC,CAAC"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The flows that answer an unknown address with a mail of their own instead
3
+ * of an error — Kratos' `verification_code.invalid` and
4
+ * `recovery_code.invalid`. Saying "no such account" on screen would tell
5
+ * anyone which addresses have one; the mail tells only the address's owner.
6
+ */
7
+ export type AuthNoAccountPurpose = 'verification' | 'recovery';
8
+ /** What every message function receives. */
9
+ export interface AuthNoAccountContext {
10
+ purpose: AuthNoAccountPurpose;
11
+ email: string;
12
+ }
13
+ /**
14
+ * Every string the template shows. Pass `authNoAccountMessagesDe` /
15
+ * `authNoAccountMessagesEn`, or spread one and override what differs.
16
+ */
17
+ export interface AuthNoAccountMessages {
18
+ /** BCP 47 tag for `<html lang>`. */
19
+ lang: string;
20
+ subject: (ctx: AuthNoAccountContext) => string;
21
+ /** The line inbox lists show after the subject. */
22
+ preview: (ctx: AuthNoAccountContext) => string;
23
+ heading: (ctx: AuthNoAccountContext) => string;
24
+ /** What was attempted. */
25
+ body: (ctx: AuthNoAccountContext) => string;
26
+ /** That the address has no account — the warning alert under the body. */
27
+ alert: (ctx: AuthNoAccountContext) => string;
28
+ /** The likely explanation, and what to do if it wasn't the reader. */
29
+ hint: (ctx: AuthNoAccountContext) => string;
30
+ /** Label of the button. Shown only when `registrationUrl` is set. */
31
+ registerButton: string;
32
+ /** Under the card: why the reader got this mail. */
33
+ footer: (ctx: AuthNoAccountContext) => string;
34
+ }
35
+ export interface AuthNoAccountProps {
36
+ purpose: AuthNoAccountPurpose;
37
+ /** The address that was entered — the one this mail goes to. */
38
+ email: string;
39
+ /** Where to create an account. Adds a button; unsafe schemes are dropped. */
40
+ registrationUrl?: string;
41
+ messages: AuthNoAccountMessages;
42
+ /** The sender's legal line under the footer — company, address. */
43
+ legalNotice?: string;
44
+ /** Previews only — see `Layout`. */
45
+ colorScheme?: 'light' | 'dark';
46
+ }
47
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/templates/AuthNoAccount/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,UAAU,CAAC;AAE/D,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC/C,mDAAmD;IACnD,OAAO,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC/C,OAAO,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC/C,0BAA0B;IAC1B,IAAI,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC5C,0EAA0E;IAC1E,KAAK,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC7C,sEAAsE;IACtE,IAAI,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;IAC5C,qEAAqE;IACrE,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,MAAM,EAAE,CAAC,GAAG,EAAE,oBAAoB,KAAK,MAAM,CAAC;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,oBAAoB,CAAC;IAC9B,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAChC"}