@emailens/engine 0.9.3 → 0.9.5
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/compile/index.d.cts +2 -2
- package/dist/compile/index.d.ts +2 -2
- package/dist/index.cjs +19 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +19 -4
- package/dist/index.js.map +1 -1
- package/dist/{react-email-BENS7LIn.d.ts → react-email-CkBByvBK.d.ts} +1 -1
- package/dist/{react-email-BFwlVmzZ.d.cts → react-email-WFdbEleP.d.cts} +1 -1
- package/dist/server.d.cts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/{types-Duj14jTL.d.cts → types-p9e1n-G_.d.cts} +2 -0
- package/dist/{types-Duj14jTL.d.ts → types-p9e1n-G_.d.ts} +2 -0
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clients.ts","../src/transform.ts","../src/rules/css-support.ts","../src/fix-snippets/html-fixes.ts","../src/fix-snippets/jsx-fixes.ts","../src/fix-snippets/mjml-fixes.ts","../src/fix-snippets/maizzle-fixes.ts","../src/fix-snippets/html-suggestions.ts","../src/fix-snippets/jsx-suggestions.ts","../src/fix-snippets/mjml-suggestions.ts","../src/fix-snippets/maizzle-suggestions.ts","../src/fix-snippets/index.ts","../src/style-utils.ts","../src/downlevel.ts","../src/color-utils.ts","../src/constants.ts","../src/analyze.ts","../src/dark-mode.ts","../src/diff.ts","../src/export-prompt.ts","../src/token-utils.ts","../src/ai-fix.ts","../src/spam-scorer.ts","../src/link-validator.ts","../src/accessibility-checker.ts","../src/image-analyzer.ts","../src/inbox-preview.ts","../src/size-checker.ts","../src/template-checker.ts","../src/audit.ts","../src/plain-text.ts","../src/session.ts"],"sourcesContent":["import type { EmailClient } from \"./types\";\r\n\r\nexport const EMAIL_CLIENTS: EmailClient[] = [\r\n {\r\n id: \"gmail-web\",\r\n name: \"Gmail\",\r\n category: \"webmail\",\r\n engine: \"Gmail Web\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"gmail-android\",\r\n name: \"Gmail Android\",\r\n category: \"mobile\",\r\n engine: \"Gmail Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"gmail-ios\",\r\n name: \"Gmail iOS\",\r\n category: \"mobile\",\r\n engine: \"Gmail Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"outlook-web\",\r\n name: \"Outlook 365\",\r\n category: \"webmail\",\r\n engine: \"Outlook Web\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"outlook-windows\",\r\n name: \"Outlook (New)\",\r\n category: \"desktop\",\r\n engine: \"Outlook Web\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"outlook-windows-legacy\",\r\n name: \"Outlook Classic\",\r\n category: \"desktop\",\r\n engine: \"Microsoft Word\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n deprecated: \"2026-10\",\r\n },\r\n {\r\n id: \"outlook-ios\",\r\n name: \"Outlook iOS\",\r\n category: \"mobile\",\r\n engine: \"Outlook Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"outlook-android\",\r\n name: \"Outlook Android\",\r\n category: \"mobile\",\r\n engine: \"Outlook Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"apple-mail-macos\",\r\n name: \"Apple Mail\",\r\n category: \"desktop\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"apple-mail-ios\",\r\n name: \"Apple Mail iOS\",\r\n category: \"mobile\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"yahoo-mail\",\r\n name: \"Yahoo Mail\",\r\n category: \"webmail\",\r\n engine: \"Yahoo\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"samsung-mail\",\r\n name: \"Samsung Mail\",\r\n category: \"mobile\",\r\n engine: \"Samsung\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"thunderbird\",\r\n name: \"Thunderbird\",\r\n category: \"desktop\",\r\n engine: \"Gecko\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"hey-mail\",\r\n name: \"HEY Mail\",\r\n category: \"webmail\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"superhuman\",\r\n name: \"Superhuman\",\r\n category: \"desktop\",\r\n engine: \"Blink\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n];\r\n\r\nexport function getClient(id: string): EmailClient | undefined {\r\n return EMAIL_CLIENTS.find((c) => c.id === id);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport type { CSSWarning, Framework, TransformResult } from \"./types\";\r\nimport {\r\n CSS_SUPPORT,\r\n GMAIL_STRIPPED_PROPERTIES,\r\n OUTLOOK_WORD_UNSUPPORTED,\r\n STRUCTURAL_FIX_PROPERTIES,\r\n} from \"./rules/css-support\";\r\nimport { getCodeFix, getSuggestion, isCodeFixGenericFallback } from \"./fix-snippets\";\r\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\r\nimport { downlevelCSS } from \"./downlevel\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\n\r\n// =============================================================================\r\n// Shared helpers\r\n// =============================================================================\r\n\r\n/** Check if a selector contains pseudo-classes or pseudo-elements. */\r\nfunction hasPseudoSelector(selector: string): boolean {\r\n // Match :pseudo or ::pseudo — but not bare : in attribute selectors like [attr:value]\r\n // This catches :hover, :focus, :nth-of-type, :not(), ::before, ::after, etc.\r\n return /(?<![[\\w])::?[a-z][\\w-]*(?:\\(|(?=[^(]))/i.test(selector);\r\n}\r\n\r\n/** Add !important to all declarations in an at-rule AST node. */\r\nfunction addImportantToDeclarations(node: csstree.CssNode): void {\r\n csstree.walk(node, {\r\n visit: \"Declaration\",\r\n enter(decl: csstree.CssNode) {\r\n if (decl.type !== \"Declaration\") return;\r\n if (decl.important) return;\r\n decl.important = true;\r\n },\r\n });\r\n}\r\n\r\n/** Inline <style> blocks into elements using css-tree. Returns non-inlinable CSS. */\r\nfunction inlineStyles($: cheerio.CheerioAPI): string {\r\n const styleBlocks: string[] = [];\r\n $(\"style\").each((_, el) => {\r\n styleBlocks.push($(el).text());\r\n });\r\n\r\n if (styleBlocks.length === 0) return \"\";\r\n\r\n const preserved: string[] = [];\r\n\r\n for (const block of styleBlocks) {\r\n let ast: csstree.CssNode;\r\n try {\r\n ast = csstree.parse(block, { parseCustomProperty: true });\r\n } catch {\r\n continue;\r\n }\r\n\r\n // Collect non-inlinable at-rules (@media, @supports, @keyframes)\r\n csstree.walk(ast, {\r\n visit: \"Atrule\",\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Atrule\") return;\r\n const name = node.name.toLowerCase();\r\n if (name === \"media\" || name === \"supports\" || name === \"keyframes\" || name === \"-webkit-keyframes\" || name === \"font-face\") {\r\n // Add !important to declarations inside @media/@supports so they override inline styles\r\n if (name === \"media\" || name === \"supports\") {\r\n addImportantToDeclarations(node);\r\n }\r\n preserved.push(csstree.generate(node));\r\n return this.skip;\r\n }\r\n },\r\n });\r\n\r\n // Inline regular rules and collect pseudo-selector rules\r\n csstree.walk(ast, {\r\n visit: \"Rule\",\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Rule\" || node.prelude.type !== \"SelectorList\") return;\r\n\r\n const declarations = csstree.generate(node.block);\r\n const declText = declarations.slice(1, -1).trim();\r\n if (!declText) return;\r\n\r\n const selectorText = csstree.generate(node.prelude);\r\n\r\n if (hasPseudoSelector(selectorText)) {\r\n preserved.push(csstree.generate(node));\r\n return;\r\n }\r\n\r\n try {\r\n $(selectorText).each((_, el) => {\r\n const existing = $(el).attr(\"style\") || \"\";\r\n $(el).attr(\"style\", existing ? `${existing}; ${declText}` : declText);\r\n });\r\n } catch {\r\n // Invalid selector for cheerio, skip\r\n }\r\n },\r\n });\r\n }\r\n\r\n return preserved.join(\"\\n\");\r\n}\r\n\r\n/** Build a CSSWarning with framework-aware suggestion + fix + fallback flag. */\r\nfunction makeWarning(\r\n base: Omit<CSSWarning, \"suggestion\" | \"fix\" | \"fixIsGenericFallback\" | \"fixType\">,\r\n prop: string,\r\n clientId: string,\r\n framework?: Framework,\r\n): CSSWarning {\r\n const sug = getSuggestion(prop, clientId, framework);\r\n const fix = getCodeFix(prop, clientId, framework);\r\n const isFallback = framework && (\r\n (sug?.isGenericFallback) ||\r\n (fix && isCodeFixGenericFallback(prop, clientId, framework))\r\n );\r\n return {\r\n ...base,\r\n ...(sug ? { suggestion: sug.text } : {}),\r\n ...(fix ? { fix } : {}),\r\n ...(isFallback ? { fixIsGenericFallback: true } : {}),\r\n fixType: STRUCTURAL_FIX_PROPERTIES.has(prop) ? \"structural\" : \"css\",\r\n };\r\n}\r\n\r\n/** Detect animation/transition usage in inline styles and <style> blocks. */\r\nfunction detectAnimations($: cheerio.CheerioAPI): boolean {\r\n let found = false;\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n props.forEach((_, prop) => {\r\n if (\r\n prop === \"animation\" || prop === \"transition\" ||\r\n prop.startsWith(\"animation-\") || prop.startsWith(\"transition-\")\r\n ) {\r\n found = true;\r\n }\r\n });\r\n });\r\n\r\n if (!found) {\r\n $(\"style\").each((_, el) => {\r\n try {\r\n const ast = csstree.parse($(el).text());\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Declaration\") {\r\n const prop = node.property.toLowerCase();\r\n if (prop === \"animation\" || prop === \"transition\" ||\r\n prop.startsWith(\"animation-\") || prop.startsWith(\"transition-\")) {\r\n found = true;\r\n }\r\n }\r\n },\r\n });\r\n } catch { /* skip unparseable CSS */ }\r\n });\r\n }\r\n\r\n return found;\r\n}\r\n\r\n// =============================================================================\r\n// Data-driven client config\r\n// =============================================================================\r\n\r\ninterface ClientTransformConfig {\r\n id: string;\r\n /** CSS properties stripped from inline styles */\r\n strippedProperties: Set<string>;\r\n /** How stripped properties are treated: \"strip\" removes them, \"info\" just warns */\r\n stripMode: \"strip\" | \"info\";\r\n /** Custom value-level checks (e.g., display:grid but not display:flex) */\r\n valueStrips?: Array<{ prop: string; pattern: RegExp }>;\r\n /** Whether to inline <style> blocks and remove them */\r\n inlineAndStripStyles: boolean;\r\n /** Whether to strip <link rel=\"stylesheet\"> */\r\n stripExternalStylesheets: boolean;\r\n /** Whether to strip <form> elements */\r\n stripForms: boolean;\r\n /** Whether to strip <svg> elements */\r\n stripSvg: boolean;\r\n /** Additional checks to run (animation detection, dark mode hints, etc.) */\r\n additionalChecks?: (\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n framework?: Framework,\r\n ) => CSSWarning[];\r\n}\r\n\r\n// -- Shared additional check functions --\r\n\r\nfunction gmailAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Check for @font-face (must happen before style removal — called pre-strip)\r\n let hasAtFontFace = false;\r\n $(\"style\").each((_, el) => {\r\n try {\r\n const ast = csstree.parse($(el).text());\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Atrule\" && node.name === \"font-face\") {\r\n hasAtFontFace = true;\r\n }\r\n },\r\n });\r\n } catch { /* skip unparseable CSS */ }\r\n });\r\n if (hasAtFontFace) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"@font-face\",\r\n message: \"Gmail does not support custom web fonts.\",\r\n }, \"@font-face\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction gmailPostChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Remove MSO conditional comments\r\n $(\"*\")\r\n .contents()\r\n .filter(function () {\r\n return this.type === \"comment\";\r\n })\r\n .each(function () {\r\n const commentText = (this as unknown as { data: string }).data || \"\";\r\n if (commentText.includes(\"<style\") || commentText.includes(\"[if mso]\") || commentText.includes(\"[if gte mso\")) {\r\n $(this).remove();\r\n }\r\n });\r\n\r\n const styleSug = getSuggestion(\"<style>:partial\", clientId, framework);\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"<style>\",\r\n message: \"Gmail partially supports <style> blocks (head only, 16KB limit). Inlining recommended for safety.\",\r\n suggestion: styleSug.text,\r\n });\r\n\r\n return warnings;\r\n}\r\n\r\nfunction outlookWindowsAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if ($(\"[style*='border-radius']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"border-radius\",\r\n message: \"Outlook Classic ignores border-radius. Buttons and containers will have sharp corners.\",\r\n }, \"border-radius\", clientId, framework));\r\n }\r\n\r\n if ($(\"[style*='max-width']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"max-width\",\r\n message: \"Outlook Classic ignores max-width.\",\r\n }, \"max-width\", clientId, framework));\r\n }\r\n\r\n const hasDivLayout =\r\n $(\"div[style*='display']\").length > 0 ||\r\n $(\"div[style*='flex']\").length > 0 ||\r\n $(\"div[style*='grid']\").length > 0;\r\n\r\n if (hasDivLayout) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"display:flex\",\r\n message: \"Outlook Classic uses Microsoft Word for rendering. Flexbox and Grid layouts will break.\",\r\n }, \"display:flex\", clientId, framework));\r\n }\r\n\r\n if (\r\n $(\"[style*='background-image']\").length > 0 ||\r\n $(\"[style*='background:']\").filter((_, el) =>\r\n ($(el).attr(\"style\") || \"\").includes(\"url(\")\r\n ).length > 0\r\n ) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"background-image\",\r\n message: \"Outlook Classic requires VML for background images.\",\r\n }, \"background-image\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction appleMailAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n const imgsWithTransparentBg = $(\"img\").filter((_, el) => {\r\n const src = $(el).attr(\"src\") || \"\";\r\n return src.endsWith(\".png\") || src.endsWith(\".svg\");\r\n });\r\n\r\n if (imgsWithTransparentBg.length > 0) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"PNG/SVG images with transparent backgrounds may become invisible in Apple Mail dark mode.\",\r\n suggestion: \"Add a white background or padding around images, or use dark-mode-friendly image variants.\",\r\n });\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction yahooAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"class\",\r\n message: \"Yahoo Mail rewrites CSS class names with a prefix. Class-based selectors in <style> blocks will still work but the names change.\",\r\n });\r\n\r\n if (\r\n $(\"[style*='background']\").filter((_, el) =>\r\n ($(el).attr(\"style\") || \"\").includes(\"url(\")\r\n ).length > 0\r\n ) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"background-image\",\r\n message: \"Yahoo Mail has inconsistent support for CSS background images.\",\r\n }, \"background-image\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction thunderbirdAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n): CSSWarning[] {\r\n if (detectAnimations($)) {\r\n return [{\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"animation\",\r\n message: \"Thunderbird does not support CSS animations or transitions.\",\r\n }];\r\n }\r\n return [];\r\n}\r\n\r\nfunction heyAdditionalChecks(\r\n _$: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"HEY Mail supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion: \"Add a @media (prefers-color-scheme: dark) block to optimize for HEY's audience.\",\r\n });\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction superhumanAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if (detectAnimations($)) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"animation\",\r\n message: \"Superhuman may honor OS-level 'reduce motion' preferences, disabling animations.\",\r\n suggestion: \"Use @media (prefers-reduced-motion: reduce) to provide static fallbacks.\",\r\n });\r\n }\r\n\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"<style>\",\r\n message: \"Superhuman uses Chromium rendering with excellent CSS support. Flexbox, Grid, CSS variables, and modern properties all work.\",\r\n });\r\n\r\n return warnings;\r\n}\r\n\r\n// =============================================================================\r\n// Per-client configurations (declarative data)\r\n// =============================================================================\r\n\r\nconst EMPTY_SET: Set<string> = new Set();\r\nconst OUTLOOK_WEB_STRIPPED = new Set([\"position\", \"transform\", \"animation\", \"transition\"]);\r\n\r\nconst CLIENT_CONFIGS: Record<string, ClientTransformConfig> = {\r\n \"gmail-web\": {\r\n id: \"gmail-web\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"gmail-android\": {\r\n id: \"gmail-android\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"gmail-ios\": {\r\n id: \"gmail-ios\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"outlook-windows\": {\r\n id: \"outlook-windows\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-windows-legacy\": {\r\n id: \"outlook-windows-legacy\",\r\n strippedProperties: OUTLOOK_WORD_UNSUPPORTED,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n { prop: \"background-image\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: outlookWindowsAdditionalChecks,\r\n },\r\n \"outlook-web\": {\r\n id: \"outlook-web\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-ios\": {\r\n id: \"outlook-ios\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-android\": {\r\n id: \"outlook-android\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"apple-mail-macos\": {\r\n id: \"apple-mail-macos\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: appleMailAdditionalChecks,\r\n },\r\n \"apple-mail-ios\": {\r\n id: \"apple-mail-ios\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: appleMailAdditionalChecks,\r\n },\r\n \"yahoo-mail\": {\r\n id: \"yahoo-mail\",\r\n strippedProperties: new Set([\"position\", \"box-shadow\", \"transform\", \"animation\", \"transition\", \"opacity\"]),\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: yahooAdditionalChecks,\r\n },\r\n \"samsung-mail\": {\r\n id: \"samsung-mail\",\r\n strippedProperties: new Set([\"box-shadow\", \"transform\", \"animation\", \"transition\", \"opacity\"]),\r\n stripMode: \"info\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"thunderbird\": {\r\n id: \"thunderbird\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: thunderbirdAdditionalChecks,\r\n },\r\n \"hey-mail\": {\r\n id: \"hey-mail\",\r\n strippedProperties: new Set([\"transform\", \"animation\", \"transition\"]),\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"position\", pattern: /fixed|sticky/ },\r\n ],\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: false,\r\n additionalChecks: heyAdditionalChecks,\r\n },\r\n \"superhuman\": {\r\n id: \"superhuman\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: false,\r\n additionalChecks: superhumanAdditionalChecks,\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// Shared transform engine\r\n// =============================================================================\r\n\r\nfunction applyTransform(\r\n html: string,\r\n config: ClientTransformConfig,\r\n framework?: Framework,\r\n): TransformResult {\r\n const $ = cheerio.load(html);\r\n const warnings: CSSWarning[] = [];\r\n const clientId = config.id;\r\n\r\n // 1a. Pre-strip additional checks (e.g., Gmail @font-face detection)\r\n if (config.additionalChecks && config.inlineAndStripStyles) {\r\n warnings.push(...config.additionalChecks($, clientId, html, framework));\r\n }\r\n\r\n // 1b. Inline + strip <style> if needed\r\n if (config.inlineAndStripStyles) {\r\n const preserved = inlineStyles($);\r\n $(\"style\").remove();\r\n if (preserved.trim()) {\r\n const head = $(\"head\");\r\n if (head.length > 0) {\r\n head.append(`<style>${preserved}</style>`);\r\n } else {\r\n // If no <head>, prepend to body\r\n $(\"body\").prepend(`<style>${preserved}</style>`);\r\n }\r\n }\r\n }\r\n\r\n // 2. Strip external stylesheets\r\n if (config.stripExternalStylesheets) {\r\n if ($(\"link[rel='stylesheet']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<link>\",\r\n message: `${clientId} does not load external stylesheets.`,\r\n }, \"<link>\", clientId, framework));\r\n $(\"link[rel='stylesheet']\").remove();\r\n }\r\n }\r\n\r\n // 3. Strip forms\r\n if (config.stripForms && $(\"form\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<form>\",\r\n message: `${clientId} removes form elements.`,\r\n }, \"<form>\", clientId, framework));\r\n $(\"form\").each((_, el) => {\r\n $(el).replaceWith($(el).html() || \"\");\r\n });\r\n }\r\n\r\n // 4. Strip SVG\r\n if (config.stripSvg && $(\"svg\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<svg>\",\r\n message: `${clientId} does not support inline SVG elements.`,\r\n }, \"<svg>\", clientId, framework));\r\n $(\"svg\").each((_, el) => {\r\n $(el).replaceWith('<img alt=\"[SVG not supported]\" />');\r\n });\r\n }\r\n\r\n // 5. Strip/warn about unsupported CSS properties (shared loop)\r\n if (config.strippedProperties.size > 0 || (config.valueStrips && config.valueStrips.length > 0)) {\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n const removed: string[] = [];\r\n\r\n props.forEach((value, prop) => {\r\n // Check stripped properties\r\n if (config.strippedProperties.has(prop)) {\r\n if (config.stripMode === \"strip\") {\r\n removed.push(prop);\r\n props.delete(prop);\r\n } else {\r\n warnings.push(makeWarning({\r\n severity: \"info\",\r\n client: clientId,\r\n property: prop,\r\n message: `${clientId} has limited support for \"${prop}\".`,\r\n }, prop, clientId, framework));\r\n }\r\n return;\r\n }\r\n\r\n // Check value-level strips\r\n for (const vs of config.valueStrips ?? []) {\r\n if (prop === vs.prop && vs.pattern.test(value)) {\r\n removed.push(prop);\r\n props.delete(prop);\r\n return;\r\n }\r\n }\r\n });\r\n\r\n if (removed.length > 0) {\r\n $(el).attr(\"style\", serializeStyle(props));\r\n for (const prop of removed) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: prop,\r\n message: `${clientId} strips \"${prop}\" from styles.`,\r\n }, prop, clientId, framework));\r\n }\r\n }\r\n });\r\n }\r\n\r\n // 6. Gmail-specific post-strip checks (MSO comments, partial style info)\r\n if (config.inlineAndStripStyles) {\r\n warnings.push(...gmailPostChecks($, clientId, html, framework));\r\n }\r\n\r\n // 7. Run additional checks (non-Gmail, or non-pre-strip)\r\n if (config.additionalChecks && !config.inlineAndStripStyles) {\r\n warnings.push(...config.additionalChecks($, clientId, html, framework));\r\n }\r\n\r\n return { clientId, html: $.html(), warnings };\r\n}\r\n\r\n// =============================================================================\r\n// Public API\r\n// =============================================================================\r\n\r\nexport function transformForClient(\r\n html: string,\r\n clientId: string,\r\n framework?: Framework,\r\n): TransformResult {\r\n if (!html || !html.trim()) {\r\n return { clientId, html: html || \"\", warnings: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const config = CLIENT_CONFIGS[clientId];\r\n if (!config) {\r\n return {\r\n clientId,\r\n html,\r\n warnings: [\r\n {\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"unknown\",\r\n message: `No transformation rules available for client \"${clientId}\".`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // Downlevel once per transformForClient call\r\n const downleveled = downlevelCSS(html);\r\n return applyTransform(downleveled, config, framework);\r\n}\r\n\r\nexport function transformForAllClients(html: string, framework?: Framework): TransformResult[] {\r\n if (!html || !html.trim()) {\r\n return Object.keys(CLIENT_CONFIGS).map((clientId) => ({\r\n clientId, html: html || \"\", warnings: [],\r\n }));\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n // Downlevel once, reuse for all clients\r\n const downleveled = downlevelCSS(html);\r\n return Object.keys(CLIENT_CONFIGS).map((clientId) =>\r\n applyTransform(downleveled, CLIENT_CONFIGS[clientId], framework)\r\n );\r\n}\r\n","import type { SupportLevel } from \"../types\";\n\n/**\n * CSS/HTML feature support matrix — auto-generated from caniemail.com.\n * Last synced: 2026-03-23\n * caniemail last updated: 2026-02-16 15:39:06 +0000\n *\n * 251 features across 15 email clients.\n *\n * Support levels:\n * - \"supported\": fully supported\n * - \"partial\": partially supported (with caveats)\n * - \"unsupported\": not supported at all\n * - \"unknown\": no data available\n *\n * Data sources:\n * - Most clients: caniemail.com API (verified data)\n * - hey-mail: caniemail.com (WebKit-based)\n * - superhuman: Manual overrides (Chromium/Blink-based, best-effort estimates)\n *\n * DO NOT EDIT — regenerate with: bun run sync:caniemail\n */\nexport const CSS_SUPPORT: Record<\n string,\n Record<string, SupportLevel>\n> = {\n \"<abbr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<acronym>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<address>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<audio>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<base>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<bdi>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<blockquote>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<body>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<code>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<del>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<dfn>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<dialog>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<div>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<form>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<h1>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<hr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<img>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<link>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<marquee>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<meter>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<object>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<p>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<picture>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"supported\",\n },\n \"<pre>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<progress>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<rp>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<rt>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<ruby>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<select>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<small>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<span>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<strike>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<strong>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<style>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"<svg>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"supported\",\n },\n \"<table>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<textarea>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<ul>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<video>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<wbr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"@font-face\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"@import\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unsupported\",\n },\n \"@keyframes\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"@media\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"@supports\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"!important\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"accent-color\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"align-items\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"animation\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"aspect-ratio\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"backdrop-filter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"background\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-blend-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"background-clip\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-image\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-origin\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-repeat\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-size\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"bimi\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"border\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"border-collapse\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"border-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline-individual\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline-longhand\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-radius\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"border-radius-logical\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"bottom\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"box-shadow\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"box-sizing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"calc\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"caption-side\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"clamp\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"clear\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"clip-path\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"color-scheme\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"column-count\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"columns\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"conic-gradient\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"css-comments\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"cursor\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unknown\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"unknown\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"custom-properties\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"direction\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"empty-cells\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"filter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"fit-content\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"flex-direction\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"flex-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"float\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"font\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"font-family\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"font-kerning\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"font-size\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"font-stretch\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"font-weight\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"gap\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"grid-template-columns\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"hyphenate-character\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"hyphenate-limit-chars\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"hyphens\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"inset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"justify-content\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"left\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"letter-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"light-dark\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unknown\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"line-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"linear-gradient\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"list-style\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"list-style-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"list-style-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"list-style-type\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"margin\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"margin-block-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"margin-inline-block\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"margin-inline-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"mask-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"max-block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"max-inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max-width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"min\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"min-block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"min-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"min-inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"min-width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"mix-blend-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"modern-color\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"nesting\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"object-fit\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"object-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"opacity\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"orphans\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"outline\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"outline-offset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"overflow\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"overflow-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"padding\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"padding-block-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"padding-inline-block\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"padding-inline-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"position\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"partial\",\n },\n \"pseudo-class-active\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"pseudo-class-default\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unknown\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"pseudo-class-nth-last-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"radial-gradient\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"resize\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unsupported\",\n },\n \"rgb\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"rgba\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"right\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"scroll-snap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"shape-margin\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"shape-outside\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"system-ui\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"tab-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"table-layout\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"text-align\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-align-last\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-decoration-color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-line\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-skip-ink\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-style\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-thickness\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-emphasis\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-emphasis-position\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-indent\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-justify\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-orientation\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-overflow\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-shadow\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-transform\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-underline-offset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-underline-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"top\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"transform\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"transition\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"partial\",\n },\n \"unit-ch\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-cm\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-em\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-ex\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-in\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-initial\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-mm\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-pc\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-percent\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-pt\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-px\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-rem\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vh\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vmax\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vmin\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vw\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"user-select\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"vertical-align\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"visibility\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"white-space\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"white-space-collapse\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"widows\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"word-break\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"supported\",\n },\n \"word-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"writing-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"z-index\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"::after\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::before\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::first-letter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::first-line\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::marker\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::placeholder\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":adjacent-sibling\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":attribute-selector\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":chaining\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":checked\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":child-combinator\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":class-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":descendant-combinator\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":first-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":first-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":focus\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":general-sibling\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":grouping\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":has\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":hover\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":id-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":lang\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \":last-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":last-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":link\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":not\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-last-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":only-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":only-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":target\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":type-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":universal-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":visited\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"display:flex\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display:grid\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display:none\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n};\n\n/**\n * CSS properties that Gmail strips from inline styles.\n * Updated per caniemail.com data — Gmail keeps float and display (basic values).\n */\nexport const GMAIL_STRIPPED_PROPERTIES = new Set([\n \"position\",\n \"visibility\",\n \"box-shadow\",\n \"text-shadow\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"gap\",\n \"filter\",\n \"clip-path\",\n \"backdrop-filter\",\n]);\n\n/** CSS properties that Outlook Word engine ignores */\nexport const OUTLOOK_WORD_UNSUPPORTED = new Set([\n \"border-radius\",\n \"box-shadow\",\n \"text-shadow\",\n \"max-width\",\n \"max-height\",\n \"min-width\",\n \"min-height\",\n \"float\",\n \"position\",\n \"display\",\n \"overflow\",\n \"opacity\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"background-size\",\n \"background-position\",\n \"box-sizing\",\n \"object-fit\",\n \"gap\",\n \"word-break\",\n \"overflow-wrap\",\n \"text-overflow\",\n \"border-spacing\",\n \"filter\",\n \"clip-path\",\n \"backdrop-filter\",\n \"visibility\",\n]);\n\n/**\n * Properties that require HTML structural changes (not just CSS swaps)\n * to fix. These cannot be solved by replacing one CSS value with another.\n */\nexport const STRUCTURAL_FIX_PROPERTIES = new Set([\n \"display:flex\",\n \"display:grid\",\n \"word-break\",\n \"overflow-wrap\",\n \"text-overflow\",\n \"position\",\n \"float\",\n \"gap\",\n \"max-width\",\n \"border-radius\",\n \"background-image\",\n \"background-size\",\n \"background-position\",\n \"<svg>\",\n \"<video>\",\n \"<form>\",\n \"object-fit\",\n]);\n\n/** HTML element features in the support matrix (for data-driven detection). */\nexport const HTML_ELEMENT_FEATURES = [\n \"<abbr>\",\n \"<acronym>\",\n \"<address>\",\n \"<audio>\",\n \"<base>\",\n \"<bdi>\",\n \"<blockquote>\",\n \"<body>\",\n \"<code>\",\n \"<del>\",\n \"<dfn>\",\n \"<dialog>\",\n \"<div>\",\n \"<form>\",\n \"<h1>\",\n \"<hr>\",\n \"<img>\",\n \"<link>\",\n \"<marquee>\",\n \"<meter>\",\n \"<object>\",\n \"<p>\",\n \"<picture>\",\n \"<pre>\",\n \"<progress>\",\n \"<rp>\",\n \"<rt>\",\n \"<ruby>\",\n \"<select>\",\n \"<small>\",\n \"<span>\",\n \"<strike>\",\n \"<strong>\",\n \"<style>\",\n \"<svg>\",\n \"<table>\",\n \"<textarea>\",\n \"<ul>\",\n \"<video>\",\n \"<wbr>\",\n] as const;\n\n/** CSS at-rule features in the support matrix. */\nexport const AT_RULE_FEATURES = [\n \"@font-face\",\n \"@import\",\n \"@keyframes\",\n \"@media\",\n \"@supports\",\n] as const;\n\n/** Compound CSS value features (e.g., \"display:flex\"). */\nexport const COMPOUND_VALUE_FEATURES = [\n \"::after\",\n \"::before\",\n \"::first-letter\",\n \"::first-line\",\n \"::marker\",\n \"::placeholder\",\n \":adjacent-sibling\",\n \":attribute-selector\",\n \":chaining\",\n \":checked\",\n \":child-combinator\",\n \":class-selector\",\n \":descendant-combinator\",\n \":first-child\",\n \":first-of-type\",\n \":focus\",\n \":general-sibling\",\n \":grouping\",\n \":has\",\n \":hover\",\n \":id-selector\",\n \":lang\",\n \":last-child\",\n \":last-of-type\",\n \":link\",\n \":not\",\n \":nth-child\",\n \":nth-last-child\",\n \":nth-of-type\",\n \":only-child\",\n \":only-of-type\",\n \":target\",\n \":type-selector\",\n \":universal-selector\",\n \":visited\",\n \"display:flex\",\n \"display:grid\",\n \"display:none\",\n] as const;\n\n/** CSS function features (e.g., \"linear-gradient\"). */\nexport const CSS_FUNCTION_FEATURES = [\n \"calc\",\n \"clamp\",\n \"conic-gradient\",\n \"fit-content\",\n \"linear-gradient\",\n \"max\",\n \"min\",\n \"radial-gradient\",\n] as const;\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * HTML/generic code fix snippets — entries that do NOT have a\r\n * ::jsx, ::mjml, or ::maizzle suffix in their key.\r\n */\r\nexport const HTML_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── border-radius (Outlook VML fallback) ──────────────────────────────\r\n \"border-radius::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML to render rounded buttons in Outlook\",\r\n before: `<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; border-radius: 6px;\r\n text-decoration: none; display: inline-block;\">\r\n Click Here\r\n</a>`,\r\n after: `<!--[if mso]>\r\n<v:roundrect xmlns:v=\"urn:schemas-microsoft-com:vml\"\r\n href=\"https://example.com\"\r\n style=\"height:44px; v-text-anchor:middle; width:200px;\"\r\n arcsize=\"14%\" strokecolor=\"#6d28d9\" fillcolor=\"#6d28d9\">\r\n <w:anchorlock/>\r\n <center style=\"color:#fff; font-family:Arial,sans-serif;\r\n font-size:14px; font-weight:bold;\">Click Here</center>\r\n</v:roundrect>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; border-radius: 6px;\r\n text-decoration: none; display: inline-block;\">\r\n Click Here\r\n</a>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── background-image (Outlook VML) ────────────────────────────────────\r\n \"background-image::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML for background images in Outlook\",\r\n before: `<td style=\"background-image: url('hero.jpg');\r\n background-size: cover; padding: 40px;\">\r\n <h1 style=\"color: #fff;\">Hello World</h1>\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px; height:300px;\">\r\n <v:fill type=\"frame\" src=\"hero.jpg\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background-image: url('hero.jpg');\r\n background-size: cover; padding: 40px;\">\r\n <h1 style=\"color: #fff;\">Hello World</h1>\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── display:flex → table layout ───────────────────────────────────────\r\n \"display:flex::outlook\": {\r\n language: \"html\",\r\n description: \"Use table layout as fallback for flexbox in Outlook\",\r\n before: `<div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\"><tr>\r\n <td width=\"50%\" valign=\"top\">Column 1</td>\r\n <td width=\"50%\" valign=\"top\">Column 2</td>\r\n</tr></table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n</div>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── display:grid → table layout ───────────────────────────────────────\r\n \"display:grid\": {\r\n language: \"html\",\r\n description: \"Replace CSS Grid with table layout for email compatibility\",\r\n before: `<div style=\"display: grid;\r\n grid-template-columns: 1fr 1fr; gap: 16px;\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n</div>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td width=\"50%\" style=\"padding: 8px;\" valign=\"top\">\r\n Item 1\r\n </td>\r\n <td width=\"50%\" style=\"padding: 8px;\" valign=\"top\">\r\n Item 2\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── linear-gradient fallback ──────────────────────────────────────────\r\n \"linear-gradient\": {\r\n language: \"html\",\r\n description: \"Add solid color fallback for gradient backgrounds\",\r\n before: `<td style=\"background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n after: `<!-- Always declare a solid background-color before the gradient.\r\n Clients that strip gradients will show the fallback color. -->\r\n<td style=\"background-color: #667eea;\r\n background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n },\r\n\r\n \"linear-gradient::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML to render gradients in Outlook\",\r\n before: `<td style=\"background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px;\">\r\n <v:fill type=\"gradient\" color=\"#667eea\" color2=\"#764ba2\"\r\n angle=\"135\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background-color: #667eea;\r\n background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── <style> stripped by Gmail ──────────────────────────────────────────\r\n \"<style>::gmail\": {\r\n language: \"html\",\r\n description: \"Inline CSS for Gmail compatibility\",\r\n before: `<style>\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n .title { color: #fff; font-size: 24px; }\r\n</style>\r\n<div class=\"header\">\r\n <h1 class=\"title\">Hello</h1>\r\n</div>`,\r\n after: `<div style=\"background-color: #6d28d9; padding: 32px;\">\r\n <h1 style=\"color: #fff; font-size: 24px;\r\n font-family: Arial, sans-serif; margin: 0;\">\r\n Hello\r\n </h1>\r\n</div>`,\r\n },\r\n\r\n // ── <svg> replaced with image ─────────────────────────────────────────\r\n \"<svg>\": {\r\n language: \"html\",\r\n description: \"Convert inline SVG to an image for email compatibility\",\r\n before: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" fill=\"#6d28d9\"/>\r\n</svg>`,\r\n after: `<img src=\"https://example.com/icon.png\"\r\n width=\"24\" height=\"24\" alt=\"Icon\"\r\n style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── <form> → link to web form ─────────────────────────────────────────\r\n \"<form>\": {\r\n language: \"html\",\r\n description: \"Replace embedded form with a link to a hosted form\",\r\n before: `<form action=\"/subscribe\" method=\"POST\">\r\n <input type=\"email\" placeholder=\"Email\" />\r\n <button type=\"submit\">Subscribe</button>\r\n</form>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\">\r\n <tr>\r\n <td style=\"background-color: #6d28d9; border-radius: 6px;\r\n padding: 12px 32px;\">\r\n <a href=\"https://example.com/subscribe\"\r\n style=\"color: #fff; text-decoration: none;\r\n font-family: Arial, sans-serif;\r\n font-weight: bold;\">\r\n Subscribe Now\r\n </a>\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── <video> → GIF + play button ───────────────────────────────────────\r\n \"<video>\": {\r\n language: \"html\",\r\n description: \"Replace video with animated GIF or linked thumbnail\",\r\n before: `<video width=\"600\" autoplay muted>\r\n <source src=\"demo.mp4\" type=\"video/mp4\">\r\n</video>`,\r\n after: `<a href=\"https://example.com/watch\" target=\"_blank\">\r\n <img src=\"https://example.com/video-thumb.gif\"\r\n width=\"600\" alt=\"Watch the video\"\r\n style=\"display: block; border: 0; max-width: 100%;\" />\r\n</a>`,\r\n },\r\n\r\n // ── @font-face → web-safe stack ───────────────────────────────────────\r\n \"@font-face\": {\r\n language: \"css\",\r\n description: \"Add web-safe font fallback stack\",\r\n before: `@font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n}\r\nh1 { font-family: 'CustomFont'; }`,\r\n after: `/* Keep @font-face for clients that support it */\r\n@font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n}\r\nh1 {\r\n font-family: 'CustomFont', Arial, Helvetica, sans-serif;\r\n}`,\r\n },\r\n\r\n // ── @media → mobile-first layout ──────────────────────────────────────\r\n \"@media\": {\r\n language: \"html\",\r\n description: \"Design mobile-first for clients without media query support\",\r\n before: `<table width=\"800\">\r\n <tr>\r\n <td width=\"400\">Left Column</td>\r\n <td width=\"400\">Right Column</td>\r\n </tr>\r\n</table>\r\n<style>\r\n @media (max-width: 600px) {\r\n table { width: 100% !important; }\r\n td { display: block !important; width: 100% !important; }\r\n }\r\n</style>`,\r\n after: `<!-- Single-column layout that works without @media -->\r\n<table role=\"presentation\" width=\"100%\"\r\n style=\"max-width: 600px;\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"padding: 16px;\">Left Column</td>\r\n </tr>\r\n <tr>\r\n <td style=\"padding: 16px;\">Right Column</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── box-shadow → border alternative ───────────────────────────────────\r\n \"box-shadow\": {\r\n language: \"css\",\r\n description: \"Use border as a fallback for box-shadow\",\r\n before: `.card {\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n}`,\r\n after: `.card {\r\n border: 1px solid #e0e0e0;\r\n /* box-shadow as progressive enhancement */\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n}`,\r\n },\r\n\r\n // ── max-width (Outlook) → fixed width table ───────────────────────────\r\n \"max-width::outlook\": {\r\n language: \"html\",\r\n description: \"Use a fixed-width table wrapper for Outlook\",\r\n before: `<div style=\"max-width: 600px; margin: 0 auto;\">\r\n Content here\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"600\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td>\r\n<![endif]-->\r\n<div style=\"max-width: 600px; margin: 0 auto;\">\r\n Content here\r\n</div>\r\n<!--[if mso]>\r\n</td></tr></table>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── float (Outlook) → table align ─────────────────────────────────────\r\n \"float::outlook\": {\r\n language: \"html\",\r\n description: \"Use table align attribute instead of CSS float\",\r\n before: `<img src=\"photo.jpg\" style=\"float: left;\r\n margin-right: 16px;\" width=\"200\" />\r\n<p>Text wraps around the image.</p>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td width=\"200\" valign=\"top\" style=\"padding-right: 16px;\">\r\n <img src=\"photo.jpg\" width=\"200\"\r\n style=\"display: block; border: 0;\" />\r\n </td>\r\n <td valign=\"top\">\r\n <p>Text next to the image.</p>\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── gap → padding on children ─────────────────────────────────────────\r\n \"gap\": {\r\n language: \"html\",\r\n description: \"Use padding or margin on child elements instead of gap\",\r\n before: `<div style=\"display: flex; gap: 16px;\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n <div>Item 3</div>\r\n</div>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"padding-right: 16px;\">Item 1</td>\r\n <td style=\"padding-right: 16px;\">Item 2</td>\r\n <td>Item 3</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── opacity → solid colors ────────────────────────────────────────────\r\n \"opacity\": {\r\n language: \"css\",\r\n description: \"Replace opacity with solid color equivalents\",\r\n before: `.overlay {\r\n background-color: #000;\r\n opacity: 0.5;\r\n}`,\r\n after: `.overlay {\r\n /* Use a semi-transparent color instead of opacity */\r\n background-color: #808080;\r\n /* Or for modern clients: rgba(0, 0, 0, 0.5) */\r\n}`,\r\n },\r\n\r\n // ── position → table layout ───────────────────────────────────────────\r\n \"position\": {\r\n language: \"html\",\r\n description: \"Use table-based positioning instead of CSS position\",\r\n before: `<div style=\"position: relative;\">\r\n <div style=\"position: absolute; top: 0; right: 0;\">\r\n Badge\r\n </div>\r\n <p>Content</p>\r\n</div>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td valign=\"top\">Content</td>\r\n <td width=\"80\" valign=\"top\" align=\"right\">Badge</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── box-sizing → nested padding ───────────────────────────────────────\r\n \"box-sizing\": {\r\n language: \"html\",\r\n description: \"Account for padding in width manually (no box-sizing)\",\r\n before: `<div style=\"width: 300px; padding: 20px;\r\n box-sizing: border-box;\">\r\n Content — total width stays 300px\r\n</div>`,\r\n after: `<!-- Set width to content-width (300 - 40 = 260px) -->\r\n<div style=\"width: 300px;\">\r\n <div style=\"padding: 20px;\">\r\n Content — padding on inner element\r\n </div>\r\n</div>`,\r\n },\r\n\r\n // ── <link> → inline styles ────────────────────────────────────────────\r\n \"<link>\": {\r\n language: \"html\",\r\n description: \"Inline all CSS instead of using external stylesheets\",\r\n before: `<head>\r\n <link rel=\"stylesheet\" href=\"styles.css\" />\r\n</head>`,\r\n after: `<head>\r\n <style>\r\n /* Paste your CSS here, or use a build tool like\r\n juice/inline-css to inline automatically */\r\n .container { max-width: 600px; margin: 0 auto; }\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n </style>\r\n</head>`,\r\n },\r\n\r\n // ── dark-mode (Apple Mail) ────────────────────────────────────────────\r\n \"dark-mode::apple\": {\r\n language: \"css\",\r\n description: \"Add prefers-color-scheme dark mode styles for Apple Mail\",\r\n before: `<style>\r\n .header { background-color: #6d28d9; }\r\n .content { background-color: #ffffff; color: #333; }\r\n</style>`,\r\n after: `<style>\r\n .header { background-color: #6d28d9; }\r\n .content { background-color: #ffffff; color: #333; }\r\n\r\n @media (prefers-color-scheme: dark) {\r\n .content {\r\n background-color: #1a1a2e !important;\r\n color: #e0e0e0 !important;\r\n }\r\n /* Force images to stay visible */\r\n img { opacity: 1 !important; }\r\n }\r\n</style>`,\r\n },\r\n\r\n // ── object-fit → width/height attributes ──────────────────────────────\r\n \"object-fit\": {\r\n language: \"html\",\r\n description: \"Use width/height attributes instead of object-fit\",\r\n before: `<img src=\"photo.jpg\" style=\"width: 300px; height: 200px;\r\n object-fit: cover;\" />`,\r\n after: `<!-- Crop/resize image server-side to exact dimensions -->\r\n<img src=\"photo-300x200.jpg\" width=\"300\" height=\"200\"\r\n alt=\"Photo\" style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── transform (not supported) ─────────────────────────────────────────\r\n \"transform\": {\r\n language: \"html\",\r\n description: \"Pre-render transformed states as images or use table layout\",\r\n before: `<div style=\"transform: rotate(45deg);\">\r\n Rotated content\r\n</div>`,\r\n after: `<!-- Pre-render rotated content as an image -->\r\n<img src=\"rotated-content.png\" width=\"200\" height=\"200\"\r\n alt=\"Rotated content\"\r\n style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── animation → animated GIF ──────────────────────────────────────────\r\n \"animation\": {\r\n language: \"html\",\r\n description: \"Replace CSS animation with an animated GIF\",\r\n before: `<style>\r\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\r\n .badge { animation: pulse 2s infinite; }\r\n</style>\r\n<span class=\"badge\">New!</span>`,\r\n after: `<!-- Use an animated GIF for the effect -->\r\n<img src=\"https://example.com/badge-animated.gif\"\r\n width=\"60\" height=\"24\" alt=\"New!\"\r\n style=\"display: inline-block; border: 0;\" />`,\r\n },\r\n\r\n // ── transition (not supported) ────────────────────────────────────────\r\n \"transition\": {\r\n language: \"css\",\r\n description: \"Transitions don't work in email — style the default state well\",\r\n before: `.button {\r\n background-color: #6d28d9;\r\n transition: background-color 0.2s;\r\n}\r\n.button:hover {\r\n background-color: #5b21b6;\r\n}`,\r\n after: `.button {\r\n /* Use the most visually appealing state as default.\r\n :hover is only supported in a few clients. */\r\n background-color: #6d28d9;\r\n color: #ffffff;\r\n text-decoration: none;\r\n font-weight: bold;\r\n}`,\r\n },\r\n\r\n // ── background-size (Outlook) → VML ───────────────────────────────────\r\n \"background-size\": {\r\n language: \"html\",\r\n description: \"Outlook ignores background-size — use VML or sized images\",\r\n before: `<td style=\"background: url('bg.jpg') center/cover no-repeat;\">\r\n Content\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px; height:400px;\">\r\n <v:fill type=\"frame\" src=\"bg.jpg\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background: url('bg.jpg') center/cover no-repeat;\r\n background-color: #333;\">\r\n Content\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── overflow (Gmail strips it) ────────────────────────────────────────\r\n \"overflow\": {\r\n language: \"html\",\r\n description: \"Content will always be visible — design for full content display\",\r\n before: `<div style=\"max-height: 200px; overflow: hidden;\">\r\n Long content that gets clipped...\r\n</div>`,\r\n after: `<!-- Show full content, or truncate server-side -->\r\n<div style=\"max-height: 200px;\">\r\n Shortened content that fits...\r\n <a href=\"https://example.com/full\">Read more</a>\r\n</div>`,\r\n },\r\n\r\n // ── visibility (Gmail strips it) ──────────────────────────────────────\r\n \"visibility\": {\r\n language: \"html\",\r\n description: \"Use conditional comments or remove hidden content\",\r\n before: `<div style=\"visibility: hidden;\">\r\n Hidden content for screen readers\r\n</div>`,\r\n after: `<!-- For screen readers, use font-size: 0 trick -->\r\n<div style=\"font-size: 0; max-height: 0; overflow: hidden;\r\n mso-hide: all;\" aria-hidden=\"true\">\r\n Preheader text\r\n</div>`,\r\n },\r\n\r\n // ── word-break → table cell wrapping ──────────────────────────────────\r\n \"word-break\": {\r\n language: \"html\",\r\n description: \"Wrap long text in a table cell to force line breaks without word-break\",\r\n before: `<span style=\"word-break: break-all;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n</span>`,\r\n after: `<!-- Table cells force text wrapping in all clients including Outlook -->\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"word-break: break-all; overflow-wrap: break-word;\r\n word-wrap: break-word;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── overflow-wrap → table cell wrapping ───────────────────────────────\r\n \"overflow-wrap\": {\r\n language: \"html\",\r\n description: \"Use a table cell to force word wrapping without overflow-wrap\",\r\n before: `<p style=\"overflow-wrap: break-word;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n</p>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"overflow-wrap: break-word; word-wrap: break-word;\r\n word-break: break-all;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── text-shadow → border/font-weight alternative ──────────────────────\r\n \"text-shadow\": {\r\n language: \"css\",\r\n description: \"Use font-weight or border-bottom as alternatives to text-shadow\",\r\n before: `.glow {\r\n text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);\r\n}`,\r\n after: `.glow {\r\n /* text-shadow is not supported in Gmail, Outlook, Yahoo.\r\n Use font-weight or letter-spacing for emphasis instead. */\r\n font-weight: bold;\r\n letter-spacing: 0.5px;\r\n}`,\r\n },\r\n\r\n // ── border-spacing → cellspacing attribute ────────────────────────────\r\n \"border-spacing\": {\r\n language: \"html\",\r\n description: \"Use the cellspacing HTML attribute instead of border-spacing CSS\",\r\n before: `<table style=\"border-spacing: 8px; border-collapse: separate;\">\r\n <tr><td>Cell</td></tr>\r\n</table>`,\r\n after: `<table cellspacing=\"8\" style=\"border-collapse: separate;\">\r\n <tr><td>Cell</td></tr>\r\n</table>`,\r\n },\r\n\r\n // ── min-width → fixed width ──────────────────────────────────────────\r\n \"min-width\": {\r\n language: \"html\",\r\n description: \"Use a fixed width instead of min-width for Outlook compatibility\",\r\n before: `<td style=\"min-width: 200px;\">Content</td>`,\r\n after: `<!-- Outlook ignores min-width. Use a fixed width or a spacer. -->\r\n<td width=\"200\" style=\"width: 200px;\">Content</td>`,\r\n },\r\n\r\n // ── min-height → fixed height ────────────────────────────────────────\r\n \"min-height\": {\r\n language: \"html\",\r\n description: \"Use a fixed height or spacer instead of min-height\",\r\n before: `<td style=\"min-height: 100px;\">Content</td>`,\r\n after: `<!-- Outlook ignores min-height. Use height or a spacer image. -->\r\n<td height=\"100\" style=\"height: 100px;\">Content</td>`,\r\n },\r\n\r\n // ── max-height → fixed height ────────────────────────────────────────\r\n \"max-height\": {\r\n language: \"html\",\r\n description: \"Outlook ignores max-height — truncate content server-side\",\r\n before: `<div style=\"max-height: 200px; overflow: hidden;\">\r\n Long content...\r\n</div>`,\r\n after: `<!-- Outlook ignores max-height. Truncate content server-side. -->\r\n<div style=\"height: 200px;\">\r\n Shortened content...\r\n <a href=\"https://example.com/full\">Read more</a>\r\n</div>`,\r\n },\r\n\r\n // ── padding (Outlook MSO font-width trick) ─────────────────────────────\r\n \"padding::outlook\": {\r\n language: \"html\",\r\n description: \"Use MSO font-width trick for reliable button padding in Outlook\",\r\n before: `<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; display: inline-block;\r\n text-decoration: none;\">\r\n Click Here\r\n</a>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"\r\n style=\"border-collapse: collapse;\">\r\n <tr>\r\n <td style=\"background-color: #6d28d9; padding: 0;\r\n mso-padding-alt: 12px 32px;\">\r\n <!--[if mso]>\r\n <i style=\"letter-spacing: 32px; mso-font-width: -100%;\r\n mso-text-raise: 18pt;\" hidden> </i>\r\n <![endif]-->\r\n <a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n mso-text-raise: 9pt; text-decoration: none;\r\n font-family: Arial, sans-serif; font-size: 14px;\r\n font-weight: bold;\">Click Here</a>\r\n <!--[if mso]>\r\n <i style=\"letter-spacing: 32px; mso-font-width: -100%;\"\r\n hidden> </i>\r\n <![endif]-->\r\n </td>\r\n </tr>\r\n</table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; display: inline-block;\r\n text-decoration: none;\">\r\n Click Here\r\n</a>\r\n<!--<![endif]-->`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * JSX (React Email) framework-specific code fix snippets.\r\n * All keys have a ::jsx suffix in the original FIX_DATABASE.\r\n */\r\nexport const JSX_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── word-break (JSX) ─────────────────────────────────────────────────\r\n \"word-break::jsx\": {\r\n language: \"jsx\",\r\n description: \"Wrap long text in a table cell for Outlook-safe word breaking\",\r\n before: `<span style={{ wordBreak: \"break-all\" }}>{url}</span>`,\r\n after: `{/* Table cells force text wrapping in Outlook and Yahoo */}\r\n<table width=\"100%\" cellPadding={0} cellSpacing={0}\r\n role=\"presentation\" style={{ borderCollapse: \"collapse\" }}>\r\n <tr>\r\n <td style={{\r\n wordBreak: \"break-all\" as const,\r\n overflowWrap: \"break-word\" as const,\r\n wordWrap: \"break-word\" as const,\r\n }}>\r\n {url}\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── overflow-wrap (JSX) ──────────────────────────────────────────────\r\n \"overflow-wrap::jsx\": {\r\n language: \"jsx\",\r\n description: \"Wrap text in a table cell for Outlook-safe overflow wrapping\",\r\n before: `<p style={{ overflowWrap: \"break-word\" }}>{longText}</p>`,\r\n after: `<table width=\"100%\" cellPadding={0} cellSpacing={0}\r\n role=\"presentation\" style={{ borderCollapse: \"collapse\" }}>\r\n <tr>\r\n <td style={{\r\n overflowWrap: \"break-word\" as const,\r\n wordWrap: \"break-word\" as const,\r\n wordBreak: \"break-all\" as const,\r\n }}>\r\n {longText}\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── display:flex (Outlook JSX) ───────────────────────────────────────\r\n \"display:flex::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row + Column components instead of flexbox (Outlook-safe)\",\r\n before: `<div style={{ display: \"flex\", gap: \"16px\" }}>\r\n <div style={{ flex: 1 }}>Column 1</div>\r\n <div style={{ flex: 1 }}>Column 2</div>\r\n</div>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"50%\", verticalAlign: \"top\" }}>\r\n Column 1\r\n </Column>\r\n <Column style={{ width: \"50%\", verticalAlign: \"top\" }}>\r\n Column 2\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── display:grid (JSX) ──────────────────────────────────────────────\r\n \"display:grid::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace CSS Grid with React Email Row + Column components\",\r\n before: `<div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"16px\" }}>\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n</div>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"50%\", padding: \"8px\", verticalAlign: \"top\" }}>\r\n Item 1\r\n </Column>\r\n <Column style={{ width: \"50%\", padding: \"8px\", verticalAlign: \"top\" }}>\r\n Item 2\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── max-width (Outlook JSX) ─────────────────────────────────────────\r\n \"max-width::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Container component for Outlook-safe max-width centering\",\r\n before: `<div style={{ maxWidth: \"600px\", margin: \"0 auto\" }}>\r\n Content here\r\n</div>`,\r\n after: `import { Container } from \"@react-email/components\";\r\n\r\n<Container style={{ maxWidth: \"600px\" }}>\r\n Content here\r\n</Container>`,\r\n },\r\n\r\n // ── @font-face (JSX) ────────────────────────────────────────────────\r\n \"@font-face::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Font component instead of @font-face in <style>\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n @font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n }\r\n \\`}</style>\r\n</Head>\r\n<h1 style={{ fontFamily: \"'CustomFont'\" }}>Hello</h1>`,\r\n after: `import { Head, Font } from \"@react-email/components\";\r\n\r\n<Head>\r\n <Font\r\n fontFamily=\"CustomFont\"\r\n fallbackFontFamily=\"Arial\"\r\n webFont={{ url: \"https://example.com/custom.woff2\", format: \"woff2\" }}\r\n fontWeight={400}\r\n fontStyle=\"normal\"\r\n />\r\n</Head>\r\n<h1 style={{ fontFamily: \"'CustomFont', Arial, sans-serif\" }}>Hello</h1>`,\r\n },\r\n\r\n // ── <svg> (JSX) ─────────────────────────────────────────────────────\r\n \"<svg>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace inline SVG with React Email Img component\",\r\n before: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" fill=\"#6d28d9\"/>\r\n</svg>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n<Img\r\n src=\"https://example.com/icon.png\"\r\n width={24}\r\n height={24}\r\n alt=\"Icon\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── <video> (JSX) ───────────────────────────────────────────────────\r\n \"<video>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace video with a linked thumbnail using React Email Img + Link\",\r\n before: `<video width=\"600\" autoPlay muted>\r\n <source src=\"demo.mp4\" type=\"video/mp4\" />\r\n</video>`,\r\n after: `import { Img, Link } from \"@react-email/components\";\r\n\r\n<Link href=\"https://example.com/watch\">\r\n <Img\r\n src=\"https://example.com/video-thumb.gif\"\r\n width={600}\r\n alt=\"Watch the video\"\r\n style={{ display: \"block\", border: \"0\", maxWidth: \"100%\" }}\r\n />\r\n</Link>`,\r\n },\r\n\r\n // ── border-radius (Outlook JSX) ─────────────────────────────────────\r\n \"border-radius::outlook::jsx\": {\r\n language: \"jsx\",\r\n description:\r\n \"Render rounded buttons with VML via JSX dangerouslySetInnerHTML (Outlook workaround)\",\r\n before: `<a\r\n href=\"https://example.com\"\r\n style={{ backgroundColor: \"#6d28d9\", color: \"#fff\",\r\n padding: \"12px 32px\", borderRadius: \"6px\",\r\n textDecoration: \"none\", display: \"inline-block\" }}>\r\n Click Here\r\n</a>`,\r\n after:\r\n '{/* Use dangerouslySetInnerHTML to inject VML for Outlook rounded corners */}\\n<div\\n dangerouslySetInnerHTML={{\\n __html: `\\n<!--[if mso]>\\n<v:roundrect xmlns:v=\"urn:schemas-microsoft-com:vml\"\\n href=\"https://example.com\"\\n style=\"height:44px; v-text-anchor:middle; width:200px;\"\\n arcsize=\"14%\" strokecolor=\"#6d28d9\" fillcolor=\"#6d28d9\">\\n <w:anchorlock/>\\n <center style=\"color:#fff; font-family:Arial,sans-serif;\\n font-size:14px; font-weight:bold;\">Click Here</center>\\n</v:roundrect>\\n<![endif]-->\\n<!--[if !mso]><!-->\\n<a href=\"https://example.com\"\\n style=\"background-color:#6d28d9; color:#fff; padding:12px 32px;\\n border-radius:6px; text-decoration:none; display:inline-block;\">\\n Click Here\\n</a>\\n<!--<![endif]-->\\n`,\\n }}\\n/>',\r\n },\r\n\r\n // ── gap (JSX) ───────────────────────────────────────────────────────\r\n \"gap::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use padding style prop on Column instead of gap (email-safe spacing)\",\r\n before: `<Row style={{ gap: \"16px\" }}>\r\n <Column>Item 1</Column>\r\n <Column>Item 2</Column>\r\n <Column>Item 3</Column>\r\n</Row>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n{/* Use padding on Column — gap is not supported in email clients */}\r\n<Row>\r\n <Column style={{ paddingRight: \"16px\" }}>Item 1</Column>\r\n <Column style={{ paddingRight: \"16px\" }}>Item 2</Column>\r\n <Column>Item 3</Column>\r\n</Row>`,\r\n },\r\n\r\n // ── <style> (Gmail JSX) ─────────────────────────────────────────────\r\n \"<style>::gmail::jsx\": {\r\n language: \"jsx\",\r\n description:\r\n \"React Email inlines styles via style props — manual <style> blocks won't survive Gmail\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n .title { color: #fff; font-size: 24px; }\r\n \\`}</style>\r\n</Head>\r\n<div className=\"header\">\r\n <h1 className=\"title\">Hello</h1>\r\n</div>`,\r\n after: `{/* Gmail strips <style> blocks. Move styles to inline style props: */}\r\n<div style={{ backgroundColor: \"#6d28d9\", padding: \"32px\" }}>\r\n <h1 style={{ color: \"#fff\", fontSize: \"24px\", margin: 0 }}>Hello</h1>\r\n</div>`,\r\n },\r\n\r\n // ── <link> (JSX) ────────────────────────────────────────────────────\r\n \"<link>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Head component instead of <link> for stylesheet references\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <link rel=\"stylesheet\" href=\"styles.css\" />\r\n</Head>`,\r\n after: `import { Head } from \"@react-email/components\";\r\n\r\n{/* External stylesheets are stripped by most email clients.\r\n Place styles inline via style props, or use Head for font imports only. */}\r\n<Head>\r\n {/* Inline your CSS here or use Font component for web fonts */}\r\n</Head>`,\r\n },\r\n\r\n // ── <form> (JSX) ───────────────────────────────────────────────────\r\n \"<form>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace embedded form with a React Email Button linking to a hosted form\",\r\n before: `<form action=\"/subscribe\" method=\"POST\">\r\n <input type=\"email\" placeholder=\"Email\" />\r\n <button type=\"submit\">Subscribe</button>\r\n</form>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n<Button\r\n href=\"https://example.com/subscribe\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n padding: \"12px 32px\",\r\n borderRadius: \"6px\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n }}\r\n>\r\n Subscribe Now\r\n</Button>`,\r\n },\r\n\r\n // ── @media (JSX) ────────────────────────────────────────────────────\r\n \"@media::jsx\": {\r\n language: \"jsx\",\r\n description: \"Design mobile-first — @media queries are stripped by many clients\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n @media (max-width: 600px) {\r\n .cols { display: block !important; }\r\n .col { width: 100% !important; }\r\n }\r\n \\`}</style>\r\n</Head>\r\n<Row>\r\n <Column className=\"col\" style={{ width: \"50%\" }}>Left</Column>\r\n <Column className=\"col\" style={{ width: \"50%\" }}>Right</Column>\r\n</Row>`,\r\n after: `import { Container, Section, Text } from \"@react-email/components\";\r\n\r\n{/* Single-column stacked layout works without @media.\r\n Stack content vertically so it reads well on all clients. */}\r\n<Container style={{ maxWidth: \"600px\" }}>\r\n <Section style={{ padding: \"16px\" }}>\r\n <Text>Left</Text>\r\n </Section>\r\n <Section style={{ padding: \"16px\" }}>\r\n <Text>Right</Text>\r\n </Section>\r\n</Container>`,\r\n },\r\n\r\n // ── position (JSX) ─────────────────────────────────────────────────\r\n \"position::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row and Column for layout instead of CSS position\",\r\n before: `<div style={{ position: \"relative\" }}>\r\n <div style={{ position: \"absolute\", top: 0, right: 0 }}>\r\n Badge\r\n </div>\r\n <p>Content</p>\r\n</div>`,\r\n after: `import { Row, Column, Text } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ verticalAlign: \"top\" }}>\r\n <Text>Content</Text>\r\n </Column>\r\n <Column style={{ width: \"80px\", verticalAlign: \"top\", textAlign: \"right\" }}>\r\n <Text>Badge</Text>\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── float (JSX) ────────────────────────────────────────────────────\r\n \"float::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row and Column instead of float for side-by-side layout\",\r\n before: `<img src=\"photo.jpg\" style={{ float: \"left\", marginRight: \"16px\" }} width={200} />\r\n<p>Text wraps around the image.</p>`,\r\n after: `import { Row, Column, Img, Text } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"200px\", paddingRight: \"16px\", verticalAlign: \"top\" }}>\r\n <Img src=\"photo.jpg\" width={200} style={{ display: \"block\", border: \"0\" }} />\r\n </Column>\r\n <Column style={{ verticalAlign: \"top\" }}>\r\n <Text>Text next to the image.</Text>\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── background-image (Outlook JSX) ──────────────────────────────────\r\n \"background-image::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use VML for Outlook background images in JSX via dangerouslySetInnerHTML\",\r\n before: `<td style={{ backgroundImage: \"url('hero.jpg')\",\r\n backgroundSize: \"cover\", padding: \"40px\" }}>\r\n <h1 style={{ color: \"#fff\" }}>Hello World</h1>\r\n</td>`,\r\n after:\r\n '<div\\n dangerouslySetInnerHTML={{\\n __html: `\\n<!--[if gte mso 9]>\\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\\n stroke=\"false\" style=\"width:600px; height:300px;\">\\n <v:fill type=\"frame\" src=\"hero.jpg\" />\\n <v:textbox inset=\"0,0,0,0\">\\n<![endif]-->\\n<div style=\"background-image:url(\\'hero.jpg\\'); background-size:cover; padding:40px;\">\\n <h1 style=\"color:#fff;\">Hello World</h1>\\n</div>\\n<!--[if gte mso 9]>\\n </v:textbox>\\n</v:rect>\\n<![endif]-->\\n`,\\n }}\\n/>',\r\n },\r\n\r\n // ── opacity (JSX) ──────────────────────────────────────────────────\r\n \"opacity::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use solid colors instead of opacity in style objects\",\r\n before: `<div style={{\r\n backgroundColor: \"#000\",\r\n opacity: 0.5,\r\n}}>\r\n Overlay content\r\n</div>`,\r\n after: `<div style={{\r\n /* Use a pre-mixed solid color instead of opacity */\r\n backgroundColor: \"#808080\",\r\n}}>\r\n Overlay content\r\n</div>`,\r\n },\r\n\r\n // ── box-shadow (JSX) ──────────────────────────────────────────────\r\n \"box-shadow::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use border as a fallback for boxShadow in style objects\",\r\n before: `<div style={{\r\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\r\n padding: \"24px\",\r\n}}>\r\n Card content\r\n</div>`,\r\n after: `import { Section } from \"@react-email/components\";\r\n\r\n<Section style={{\r\n border: \"1px solid #e0e0e0\",\r\n padding: \"24px\",\r\n}}>\r\n Card content\r\n</Section>`,\r\n },\r\n\r\n // ── linear-gradient (JSX) ─────────────────────────────────────────\r\n \"linear-gradient::jsx\": {\r\n language: \"jsx\",\r\n description: \"Add a solid backgroundColor fallback before the gradient\",\r\n before: `<div style={{\r\n background: \"linear-gradient(135deg, #667eea, #764ba2)\",\r\n padding: \"40px\",\r\n color: \"#fff\",\r\n}}>\r\n Content here\r\n</div>`,\r\n after: `<div style={{\r\n /* Solid fallback for clients that strip gradients */\r\n backgroundColor: \"#667eea\",\r\n background: \"linear-gradient(135deg, #667eea, #764ba2)\",\r\n padding: \"40px\",\r\n color: \"#fff\",\r\n}}>\r\n Content here\r\n</div>`,\r\n },\r\n\r\n // ── transform (JSX) ──────────────────────────────────────────────\r\n \"transform::jsx\": {\r\n language: \"jsx\",\r\n description: \"Pre-render transformed content as an image using React Email Img\",\r\n before: `<div style={{ transform: \"rotate(45deg)\" }}>\r\n Rotated content\r\n</div>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* CSS transforms are not supported in email — pre-render as an image */}\r\n<Img\r\n src=\"https://example.com/rotated-content.png\"\r\n width={200}\r\n height={200}\r\n alt=\"Rotated content\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── animation (JSX) ──────────────────────────────────────────────\r\n \"animation::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace CSS animation with a React Email Img using an animated GIF\",\r\n before: `<span style={{ animation: \"pulse 2s infinite\" }}>New!</span>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* CSS animations are not supported — use an animated GIF */}\r\n<Img\r\n src=\"https://example.com/badge-animated.gif\"\r\n width={60}\r\n height={24}\r\n alt=\"New!\"\r\n style={{ display: \"inline-block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── transition (JSX) ─────────────────────────────────────────────\r\n \"transition::jsx\": {\r\n language: \"jsx\",\r\n description: \"Transitions don't work in email — style the default state well\",\r\n before: `<a\r\n href=\"#\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n transition: \"background-color 0.2s\",\r\n }}\r\n>\r\n Click\r\n</a>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n{/* Transitions are not supported — style the default state: */}\r\n<Button\r\n href=\"https://example.com\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n padding: \"12px 32px\",\r\n }}\r\n>\r\n Click\r\n</Button>`,\r\n },\r\n\r\n // ── overflow (JSX) ───────────────────────────────────────────────\r\n \"overflow::jsx\": {\r\n language: \"jsx\",\r\n description: \"Content will always be visible — design for full content display\",\r\n before: `<div style={{ maxHeight: \"200px\", overflow: \"hidden\" }}>\r\n Long content that gets clipped...\r\n</div>`,\r\n after: `import { Link, Text } from \"@react-email/components\";\r\n\r\n{/* overflow:hidden is stripped — show full content or truncate server-side */}\r\n<div>\r\n <Text>Shortened content that fits...</Text>\r\n <Link href=\"https://example.com/full\">Read more</Link>\r\n</div>`,\r\n },\r\n\r\n // ── visibility (JSX) ─────────────────────────────────────────────\r\n \"visibility::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use font-size/max-height trick instead of visibility:hidden\",\r\n before: `<div style={{ visibility: \"hidden\" }}>\r\n Hidden preheader text\r\n</div>`,\r\n after: `{/* visibility:hidden is stripped by most clients — use the preheader trick.\r\n msoHide is non-standard but needed to hide content in Outlook. */}\r\n<div\r\n style={{\r\n fontSize: \"0px\",\r\n lineHeight: \"0px\",\r\n maxHeight: \"0px\",\r\n overflow: \"hidden\",\r\n display: \"none\",\r\n msoHide: \"all\",\r\n } as React.CSSProperties}\r\n aria-hidden=\"true\"\r\n>\r\n Preheader text\r\n</div>`,\r\n },\r\n\r\n // ── object-fit (JSX) ─────────────────────────────────────────────\r\n \"object-fit::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Img with explicit width/height instead of object-fit\",\r\n before: `<img\r\n src=\"photo.jpg\"\r\n style={{ width: \"300px\", height: \"200px\", objectFit: \"cover\" }}\r\n/>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* Crop/resize image server-side to exact dimensions */}\r\n<Img\r\n src=\"https://example.com/photo-300x200.jpg\"\r\n width={300}\r\n height={200}\r\n alt=\"Photo\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── background-size (JSX) ────────────────────────────────────────\r\n \"background-size::jsx\": {\r\n language: \"jsx\",\r\n description: \"Outlook ignores background-size — use sized images instead\",\r\n before: `<div style={{\r\n background: \"url('bg.jpg') center/cover no-repeat\",\r\n}}>\r\n Content\r\n</div>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* background-size is not supported in most email clients.\r\n Use a full-width image instead of a background: */}\r\n<Img\r\n src=\"https://example.com/bg-600x400.jpg\"\r\n width={600}\r\n alt=\"\"\r\n style={{ display: \"block\", width: \"100%\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── box-sizing (JSX) ─────────────────────────────────────────────\r\n \"box-sizing::jsx\": {\r\n language: \"jsx\",\r\n description: \"Account for padding in width manually (no box-sizing support)\",\r\n before: `<div style={{\r\n width: \"300px\",\r\n padding: \"20px\",\r\n boxSizing: \"border-box\",\r\n}}>\r\n Content — total width stays 300px\r\n</div>`,\r\n after: `{/* Set outer width, use inner element for padding */}\r\n<div style={{ width: \"300px\" }}>\r\n <div style={{ padding: \"20px\" }}>\r\n Content — padding on inner element\r\n </div>\r\n</div>`,\r\n },\r\n\r\n // ── padding (Outlook MSO font-width trick, JSX) ───────────────────────\r\n \"padding::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Button component which handles MSO padding automatically\",\r\n before: `<a\r\n href=\"https://example.com\"\r\n style={{ backgroundColor: \"#6d28d9\", color: \"#fff\",\r\n padding: \"12px 32px\", display: \"inline-block\",\r\n textDecoration: \"none\" }}>\r\n Click Here\r\n</a>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n{/* The Button component automatically handles MSO padding\r\n via the mso-font-width +   technique */}\r\n<Button\r\n href=\"https://example.com\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n padding: \"12px 32px\",\r\n borderRadius: \"6px\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n }}\r\n>\r\n Click Here\r\n</Button>`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * MJML framework-specific code fix snippets.\r\n * All keys have a ::mjml suffix in the original FIX_DATABASE.\r\n */\r\nexport const MJML_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── word-break (MJML) ────────────────────────────────────────────────\r\n \"word-break::mjml\": {\r\n language: \"mjml\",\r\n description: \"MJML renders text in table cells by default — word-break works via mj-text\",\r\n before: `<mj-text>\r\n <span style=\"word-break: break-all;\">Long URL here</span>\r\n</mj-text>`,\r\n after: `<!-- mj-text already renders inside a <td>, so add word-break\r\n to the mj-text css-class or inline style -->\r\n<mj-text css-class=\"break-words\"\r\n padding=\"0\">\r\n Long URL here\r\n</mj-text>\r\n<mj-style>\r\n .break-words td { word-break: break-all; word-wrap: break-word; }\r\n</mj-style>`,\r\n },\r\n\r\n // ── @font-face (MJML) ───────────────────────────────────────────────\r\n \"@font-face::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-font in mj-head instead of @font-face\",\r\n before: `<mj-style>\r\n @font-face {\r\n font-family: 'CustomFont';\r\n src: url('https://example.com/custom.woff2') format('woff2');\r\n }\r\n</mj-style>`,\r\n after: `<mjml>\r\n <mj-head>\r\n <mj-font name=\"CustomFont\"\r\n href=\"https://fonts.googleapis.com/css2?family=CustomFont\" />\r\n <mj-attributes>\r\n <mj-all font-family=\"CustomFont, Arial, Helvetica, sans-serif\" />\r\n </mj-attributes>\r\n </mj-head>\r\n</mjml>`,\r\n },\r\n\r\n // ── <style> (Gmail MJML) ────────────────────────────────────────────\r\n \"<style>::gmail::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-style inline='inline' to force style inlining for Gmail\",\r\n before: `<mj-head>\r\n <mj-style>\r\n .custom { color: #6d28d9; }\r\n </mj-style>\r\n</mj-head>`,\r\n after: `<mj-head>\r\n <!-- Use inline=\"inline\" to force MJML to inline these styles.\r\n Class-based styles in a plain mj-style block will be stripped by Gmail. -->\r\n <mj-style inline=\"inline\">\r\n .custom { color: #6d28d9; }\r\n </mj-style>\r\n</mj-head>`,\r\n },\r\n\r\n // ── border-radius (Outlook MJML) ────────────────────────────────────\r\n \"border-radius::outlook::mjml\": {\r\n language: \"mjml\",\r\n description: \"MJML limitation: border-radius is unsupported in Outlook — MJML does not generate VML\",\r\n before: `<mj-button border-radius=\"6px\" background-color=\"#6d28d9\">\r\n Click Here\r\n</mj-button>`,\r\n after: `<!-- Known MJML limitation: MJML does not generate VML for rounded corners.\r\n Options: accept flat corners, use mj-raw for VML, or set border-radius=\"0\". -->\r\n<mj-button border-radius=\"0\" background-color=\"#6d28d9\">\r\n Click Here\r\n</mj-button>`,\r\n },\r\n\r\n // ── background-image (Outlook MJML) ─────────────────────────────────\r\n \"background-image::outlook::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-section background-url for Outlook-compatible background images\",\r\n before: `<mj-section>\r\n <mj-column>\r\n <mj-image src=\"hero.jpg\" />\r\n </mj-column>\r\n</mj-section>`,\r\n after: `<!-- MJML generates VML-compatible markup automatically via background-url on mj-section. -->\r\n<mj-section background-url=\"https://example.com/hero.jpg\"\r\n background-size=\"cover\"\r\n background-repeat=\"no-repeat\"\r\n background-color=\"#333333\">\r\n <mj-column>\r\n <mj-text color=\"#ffffff\">Your content here</mj-text>\r\n </mj-column>\r\n</mj-section>`,\r\n },\r\n\r\n // ── display:flex (MJML) ─────────────────────────────────────────────\r\n \"display:flex::mjml\": {\r\n language: \"mjml\",\r\n description: \"Replace flexbox (from mj-raw or inline styles) with mj-section and mj-column\",\r\n before: `<mj-raw>\r\n <div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n </div>\r\n</mj-raw>`,\r\n after: `<!-- Flexbox in MJML is not Outlook-compatible.\r\n Use mj-section and mj-column — MJML compiles these to table-based layouts. -->\r\n<mj-section>\r\n <mj-column width=\"50%\">\r\n <mj-text>Column 1</mj-text>\r\n </mj-column>\r\n <mj-column width=\"50%\">\r\n <mj-text>Column 2</mj-text>\r\n </mj-column>\r\n</mj-section>`,\r\n },\r\n\r\n // ── @media (MJML) ──────────────────────────────────────────────────\r\n \"@media::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use MJML responsive attributes and breakpoints instead of hand-written @media\",\r\n before: `<mj-style>\r\n @media (max-width: 600px) {\r\n .mobile-stack { display: block !important; width: 100% !important; }\r\n }\r\n</mj-style>`,\r\n after: `<!-- MJML generates responsive @media queries automatically.\r\n Use mj-breakpoint and mj-column widths to control responsive behavior. -->\r\n<mj-head>\r\n <mj-breakpoint width=\"600px\" />\r\n</mj-head>\r\n<mj-body>\r\n <mj-section>\r\n <mj-column width=\"50%\"><mj-text>Left</mj-text></mj-column>\r\n <mj-column width=\"50%\"><mj-text>Right</mj-text></mj-column>\r\n </mj-section>\r\n</mj-body>`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * Maizzle framework-specific code fix snippets.\r\n * All keys have a ::maizzle suffix in the original FIX_DATABASE.\r\n */\r\nexport const MAIZZLE_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── display:flex (Outlook Maizzle) ──────────────────────────────────\r\n \"display:flex::outlook::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Replace Tailwind flex classes with HTML table + MSO conditional comments\",\r\n before: `<div class=\"flex gap-4\">\r\n <div class=\"flex-1\">Column 1</div>\r\n <div class=\"flex-1\">Column 2</div>\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\"><tr>\r\n <td class=\"w-1/2\" valign=\"top\">Column 1</td>\r\n <td class=\"w-1/2\" valign=\"top\">Column 2</td>\r\n</tr></table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<div class=\"flex gap-4\">\r\n <div class=\"flex-1\">Column 1</div>\r\n <div class=\"flex-1\">Column 2</div>\r\n</div>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── @font-face (Maizzle) ────────────────────────────────────────────\r\n \"@font-face::maizzle\": {\r\n language: \"maizzle\",\r\n description:\r\n 'Add fonts via the googleFonts key in config.js — Maizzle injects the Google Fonts link tag automatically. Set googleFonts: \"Inter:ital,wght@0,400;0,700\" in your environment config, then reference the font family in your template.',\r\n before: `<style>\r\n @font-face {\r\n font-family: 'Inter';\r\n src: url('https://fonts.gstatic.com/...') format('woff2');\r\n }\r\n</style>`,\r\n after: `<!-- config.js: googleFonts: \"Inter:ital,wght@0,400;0,700\" -->\r\n<p class=\"font-['Inter',Arial,sans-serif]\">Hello</p>`,\r\n },\r\n\r\n // ── <style> (Gmail Maizzle) ─────────────────────────────────────────\r\n \"<style>::gmail::maizzle\": {\r\n language: \"maizzle\",\r\n description:\r\n \"Maizzle automatically inlines CSS via juice during build (inlineCSS: true in config.js). Manual <style> blocks bypass juice and will be stripped by Gmail — prefer Tailwind utility classes instead.\",\r\n before: `<style>\r\n .custom { color: #6d28d9; }\r\n</style>\r\n<div class=\"custom\">Hello</div>`,\r\n after: `<!-- Prefer Tailwind classes — Maizzle inlines them automatically during build -->\r\n<div class=\"text-[#6d28d9]\">Hello</div>`,\r\n },\r\n\r\n // ── max-width (Outlook Maizzle) ─────────────────────────────────────\r\n \"max-width::outlook::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Wrap max-width containers with MSO conditional table for Outlook\",\r\n before: `<div class=\"max-w-[600px] mx-auto\">\r\n Content here\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"600\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td>\r\n<![endif]-->\r\n<div class=\"max-w-[600px] mx-auto\">\r\n Content here\r\n</div>\r\n<!--[if mso]>\r\n</td></tr></table>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── gap (Maizzle) ──────────────────────────────────────────────────\r\n \"gap::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Use padding Tailwind classes on child elements instead of gap\",\r\n before: `<div class=\"flex gap-4\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n <div>Item 3</div>\r\n</div>`,\r\n after: `<!-- gap is not supported in Outlook or many email clients.\r\n Use padding classes on child elements instead. -->\r\n<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td class=\"pr-4\">Item 1</td>\r\n <td class=\"pr-4\">Item 2</td>\r\n <td>Item 3</td>\r\n </tr>\r\n</table>`,\r\n },\r\n};\r\n","/**\r\n * HTML/generic suggestion strings — entries that do NOT have a\r\n * ::jsx, ::mjml, or ::maizzle suffix in their key.\r\n */\r\nexport const HTML_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>\":\r\n \"Use a CSS inliner tool (like juice) to move styles to inline attributes.\",\r\n \"<style>:partial\":\r\n \"Use inline styles as the primary approach, with <style> in <head> as progressive enhancement.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>\": \"Inline all CSS directly in the HTML.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>\": \"Convert SVGs to PNG/JPG images.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>\":\r\n \"Use an animated GIF or a static image with a play button linking to the video.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>\": \"Use links to a web form instead of embedding forms in email.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face\":\r\n \"Always include a web-safe font stack as fallback (e.g., Arial, Helvetica, sans-serif).\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media\":\r\n \"Design emails mobile-first with a single-column layout that works without media queries.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex\":\r\n \"Use <table> layouts for email client compatibility.\",\r\n \"display:flex::outlook\":\r\n \"Use <table> layouts with <!--[if mso]> conditional comments for Outlook's Word engine.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid\":\r\n \"Replace CSS Grid with table layout for email compatibility.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient\":\r\n \"Add a solid background-color fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow\":\r\n \"Use border styling as an alternative to box-shadow.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius\":\r\n \"Use VML for rounded corners in Outlook, or accept square corners.\",\r\n \"border-radius::outlook\":\r\n \"Use VML (Vector Markup Language) for rounded buttons in Outlook.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width\":\r\n \"Use a fixed-width table wrapper for maximum compatibility.\",\r\n \"max-width::outlook\":\r\n \"Use a fixed width on table cells instead of max-width.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap\":\r\n \"Use padding/margin on child elements instead of gap.\",\r\n \"gap::outlook\":\r\n \"Use cellpadding/cellspacing on tables, or padding on cells.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float\":\r\n \"Use table cells with align attribute for side-by-side content.\",\r\n \"float::outlook\":\r\n 'Use table cells with align=\"left\" or align=\"right\".',\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image\":\r\n \"Use VML for background images in clients that require it.\",\r\n \"background-image::outlook\":\r\n \"Use <!--[if gte mso 9]> with <v:background> VML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position\":\r\n \"Use table-based positioning instead of CSS position.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity\":\r\n \"Use solid colors instead of opacity.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break\":\r\n \"Wrap long text in a <table><td> to force wrapping in clients that don't support word-break.\",\r\n \"word-break::outlook\":\r\n \"Outlook's Word engine ignores word-break. Place text inside a <td> with a constrained width — tables always wrap.\",\r\n\r\n // ── overflow-wrap ─────────────────────────────────────────────────────\r\n \"overflow-wrap\":\r\n \"Wrap text in a <table><td> to force wrapping. overflow-wrap is ignored by Outlook and unreliable in Yahoo.\",\r\n\r\n // ── white-space ───────────────────────────────────────────────────────\r\n \"white-space\":\r\n \"Outlook only supports 'normal' and 'nowrap'. Use for non-breaking spaces.\",\r\n\r\n // ── text-overflow ─────────────────────────────────────────────────────\r\n \"text-overflow\":\r\n \"text-overflow requires overflow:hidden which is stripped by Gmail. Truncate content server-side.\",\r\n\r\n // ── vertical-align ────────────────────────────────────────────────────\r\n \"vertical-align\":\r\n 'Use the valign HTML attribute on <td> elements for Outlook (e.g., valign=\"top\").',\r\n\r\n // ── border-spacing ────────────────────────────────────────────────────\r\n \"border-spacing\":\r\n 'Use the cellspacing HTML attribute instead (e.g., <table cellspacing=\"8\">).',\r\n\r\n // ── min-width / min-height ────────────────────────────────────────────\r\n \"min-width\":\r\n \"Outlook ignores min-width. Use a fixed width attribute on <td> or <table>.\",\r\n \"min-height\":\r\n \"Outlook ignores min-height. Use a fixed height or a spacer image.\",\r\n \"max-height\":\r\n \"Outlook ignores max-height. Truncate content server-side or use a fixed height.\",\r\n\r\n // ── text-shadow ───────────────────────────────────────────────────────\r\n \"text-shadow\":\r\n \"text-shadow is stripped by Gmail, Outlook, and Yahoo. Use font-weight for emphasis.\",\r\n\r\n // ── background-size / background-position ─────────────────────────────\r\n \"background-size\":\r\n \"Not supported in many clients. Set image dimensions directly.\",\r\n \"background-position\":\r\n \"Not supported in many clients. Use VML for positioning.\",\r\n\r\n // ── Additional properties covered by transform helpers ────────────────\r\n \"overflow\":\r\n \"Content will always be visible. Design accordingly.\",\r\n \"visibility\":\r\n \"Remove the element or use display:none as an alternative.\",\r\n \"transform\":\r\n \"CSS transforms are not supported in email. Pre-render the effect as an image.\",\r\n \"animation\":\r\n \"CSS animations are not supported. Use animated GIFs instead.\",\r\n \"transition\":\r\n \"CSS transitions are not supported in email.\",\r\n \"box-sizing\":\r\n \"Account for padding in your width calculations (use padding on a nested element).\",\r\n \"object-fit\":\r\n \"Use width/height attributes on <img> directly.\",\r\n \"display\":\r\n \"Use tables for layout in email clients.\",\r\n\r\n // ── padding ─────────────────────────────────────────────────────────────\r\n \"padding::outlook\":\r\n \"Outlook ignores padding on <a> tags. Use the MSO font-width trick with   hair spaces, or use VML. React Email's <Button> handles this automatically.\",\r\n};\r\n","/**\r\n * JSX (React Email) framework-specific suggestion strings.\r\n * All keys have a ::jsx suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const JSX_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::jsx\":\r\n \"Move styles to inline style props — React Email components accept style objects directly.\",\r\n \"<style>:partial::jsx\":\r\n \"Use inline style props on React Email components. Reserve <style> in <Head> for progressive enhancement only.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::jsx\":\r\n \"Use the React Email <Head> component for font imports; place all other styles inline via style props.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::jsx\":\r\n \"Replace inline SVG with the React Email <Img> component pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::jsx\":\r\n \"Replace <video> with a React Email <Link> wrapping an <Img> thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::jsx\":\r\n \"Replace the form with a React Email <Button> or <Link> component pointing to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::jsx\":\r\n \"Use the React Email <Font> component in <Head> with a fallbackFontFamily prop.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::jsx\":\r\n \"Use a single-column layout with React Email <Container> and <Section>. Avoid relying on @media queries.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::jsx\":\r\n \"Use React Email <Row> and <Column> components instead of flexbox.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::jsx\":\r\n \"Use React Email <Row> and <Column> components instead of CSS Grid.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::jsx\":\r\n \"Add a solid backgroundColor style prop as fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::jsx\":\r\n \"Use a border style prop as an alternative to boxShadow.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::jsx\":\r\n \"Outlook ignores borderRadius. Use dangerouslySetInnerHTML with VML for rounded buttons if needed.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::jsx\":\r\n \"Use the React Email <Container> component which handles max-width across clients.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::jsx\":\r\n \"Use padding style props on <Column> components instead of gap.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::jsx\":\r\n \"Use React Email <Row> and <Column> components for side-by-side layout.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::jsx\":\r\n \"Use VML via dangerouslySetInnerHTML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::jsx\":\r\n \"Use React Email <Row> and <Column> components for positioning.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::jsx\":\r\n \"Use solid colors. Opacity is not supported in many email clients.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break::jsx\":\r\n \"Wrap long text in a <table><tr><td> element. Outlook ignores wordBreak but respects table cell widths.\",\r\n\r\n // ── overflow-wrap ─────────────────────────────────────────────────────\r\n \"overflow-wrap::jsx\":\r\n \"Wrap text in a <table><tr><td> element. Outlook ignores overflowWrap but respects table cell widths.\",\r\n\r\n // ── padding ─────────────────────────────────────────────────────────────\r\n \"padding::outlook::jsx\":\r\n \"Use React Email's <Button> component which automatically generates MSO-compatible padding using the mso-font-width trick.\",\r\n};\r\n","/**\r\n * MJML framework-specific suggestion strings.\r\n * All keys have a ::mjml suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const MJML_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::mjml\":\r\n 'Use mj-style inline=\"inline\" to force MJML to inline styles for Gmail compatibility.',\r\n \"<style>:partial::mjml\":\r\n 'Use mj-style inline=\"inline\" for critical styles; plain mj-style for progressive enhancement.',\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::mjml\":\r\n \"MJML does not support external stylesheets. Use mj-style or inline attributes.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::mjml\":\r\n \"Replace inline SVG with an mj-image component pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::mjml\":\r\n \"Replace <video> with an mj-image linking to a video thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::mjml\":\r\n \"Replace the form with an mj-button linking to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::mjml\":\r\n \"Use mj-font in mj-head instead of @font-face in mj-style.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::mjml\":\r\n \"MJML generates responsive @media queries automatically. Use mj-breakpoint and mj-column widths.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::mjml\":\r\n \"Use mj-section and mj-column — MJML compiles these to table-based layouts.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::mjml\":\r\n \"Use mj-section and mj-column for grid-like layouts.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::mjml\":\r\n \"Add a background-color attribute on mj-section as a fallback.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::mjml\":\r\n \"Use a border attribute on mj-section or mj-column as an alternative.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::mjml\":\r\n 'MJML does not generate VML — border-radius will not render in Outlook. Set border-radius=\"0\" or accept flat corners.',\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::mjml\":\r\n \"Set the width attribute on mj-body or mj-section for maximum compatibility.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::mjml\":\r\n \"Use padding attribute on mj-column or mj-text for spacing.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::mjml\":\r\n \"Use mj-section with multiple mj-column elements for side-by-side layout.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::mjml\":\r\n \"Use background-url attribute on mj-section — MJML generates VML automatically.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::mjml\":\r\n \"Use mj-section and mj-column for layout positioning.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::mjml\":\r\n \"Use solid colors. Most email clients don't support opacity.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break::mjml\":\r\n \"mj-text renders inside a <td>, which helps. Add word-wrap: break-word to the td via mj-style.\",\r\n};\r\n","/**\r\n * Maizzle framework-specific suggestion strings.\r\n * All keys have a ::maizzle suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const MAIZZLE_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::maizzle\":\r\n \"Prefer Tailwind utility classes — Maizzle inlines CSS via juice during build (inlineCSS: true in config.js).\",\r\n \"<style>:partial::maizzle\":\r\n \"Use Tailwind utility classes for critical styles. Maizzle automatically inlines them at build time.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::maizzle\":\r\n \"External stylesheets are stripped. Use Tailwind CSS classes — Maizzle inlines them at build time.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::maizzle\":\r\n \"Replace inline SVG with an <img> tag pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::maizzle\":\r\n \"Replace <video> with a linked image thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::maizzle\":\r\n \"Replace the form with a CTA link/button pointing to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::maizzle\":\r\n \"Use the googleFonts key in config.js — Maizzle injects the Google Fonts link tag automatically.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::maizzle\":\r\n \"Use Tailwind responsive utility classes and Maizzle's breakpoints config instead of hand-written @media.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::maizzle\":\r\n \"Replace Tailwind flex classes with HTML table + MSO conditional comments for Outlook.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::maizzle\":\r\n \"Replace Tailwind grid classes with HTML table layout for email compatibility.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::maizzle\":\r\n \"Add a bg-[color] Tailwind class as a fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::maizzle\":\r\n \"Use Tailwind border classes as an alternative to shadow classes.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::maizzle\":\r\n \"Outlook ignores border-radius. Accept flat corners or use MSO conditional VML.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::maizzle\":\r\n \"Wrap max-w containers with MSO conditional table for Outlook.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::maizzle\":\r\n \"Use Tailwind padding classes on child elements instead of gap.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::maizzle\":\r\n \"Use HTML tables for side-by-side layout instead of Tailwind float classes.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::maizzle\":\r\n \"Use MSO conditional VML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::maizzle\":\r\n \"Use HTML table layout instead of Tailwind position classes.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::maizzle\":\r\n \"Use solid Tailwind color classes instead of opacity.\",\r\n};\r\n","import type { CodeFix, Framework } from \"../types\";\r\n\r\nimport { HTML_FIX_DATABASE } from \"./html-fixes\";\r\nimport { JSX_FIX_DATABASE } from \"./jsx-fixes\";\r\nimport { MJML_FIX_DATABASE } from \"./mjml-fixes\";\r\nimport { MAIZZLE_FIX_DATABASE } from \"./maizzle-fixes\";\r\n\r\nimport { HTML_SUGGESTION_DATABASE } from \"./html-suggestions\";\r\nimport { JSX_SUGGESTION_DATABASE } from \"./jsx-suggestions\";\r\nimport { MJML_SUGGESTION_DATABASE } from \"./mjml-suggestions\";\r\nimport { MAIZZLE_SUGGESTION_DATABASE } from \"./maizzle-suggestions\";\r\n\r\n/**\r\n * Inline code fix snippets — real, paste-ready code that turns\r\n * \"here's your problem\" into \"here's your solution.\"\r\n *\r\n * Keyed by property, with optional client-specific overrides.\r\n * Client-specific keys use the format \"property::clientPrefix\"\r\n * (e.g. \"border-radius::outlook\").\r\n */\r\nconst FIX_DATABASE: Record<string, CodeFix> = {\r\n ...HTML_FIX_DATABASE,\r\n ...JSX_FIX_DATABASE,\r\n ...MJML_FIX_DATABASE,\r\n ...MAIZZLE_FIX_DATABASE,\r\n};\r\n\r\n/**\r\n * Human-readable suggestion strings attached to CSSWarning.suggestion.\r\n *\r\n * Key format mirrors FIX_DATABASE:\r\n * property → generic HTML advice\r\n * property::clientPrefix → client-specific advice\r\n * property::framework → framework-specific advice\r\n * property::clientPrefix::framework → most-specific advice\r\n *\r\n * Use `getSuggestion()` to resolve the best match via tiered lookup.\r\n */\r\nconst SUGGESTION_DATABASE: Record<string, string> = {\r\n ...HTML_SUGGESTION_DATABASE,\r\n ...JSX_SUGGESTION_DATABASE,\r\n ...MJML_SUGGESTION_DATABASE,\r\n ...MAIZZLE_SUGGESTION_DATABASE,\r\n};\r\n\r\n/**\r\n * Look up a code fix for a given property, client, and optional framework.\r\n * Returns undefined if no fix snippet exists.\r\n *\r\n * Resolution order (most specific to least specific):\r\n * 1. property::clientPrefix::framework (e.g. \"display:flex::outlook::jsx\")\r\n * 2. property::framework (e.g. \"display:grid::jsx\")\r\n * 3. property::clientPrefix (e.g. \"border-radius::outlook\")\r\n * 4. property (generic fix)\r\n */\r\nexport function getCodeFix(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): CodeFix | undefined {\r\n const clientPrefix = getClientPrefix(clientId);\r\n\r\n // Tier 1: property::clientPrefix::framework\r\n if (framework && clientPrefix) {\r\n const tier1 = FIX_DATABASE[`${property}::${clientPrefix}::${framework}`];\r\n if (tier1) return tier1;\r\n }\r\n\r\n // Tier 2: property::framework\r\n if (framework) {\r\n const tier2 = FIX_DATABASE[`${property}::${framework}`];\r\n if (tier2) return tier2;\r\n }\r\n\r\n // Tier 3: property::clientPrefix (existing behavior)\r\n if (clientPrefix) {\r\n const tier3 = FIX_DATABASE[`${property}::${clientPrefix}`];\r\n if (tier3) return tier3;\r\n }\r\n\r\n // Tier 4: generic fix (existing behavior)\r\n return FIX_DATABASE[property];\r\n}\r\n\r\n/**\r\n * Returns true if a framework was specified but the code fix resolved to\r\n * a client-specific or fully generic entry (tiers 3–4) rather than a\r\n * framework-aware entry (tiers 1–2).\r\n */\r\nexport function isCodeFixGenericFallback(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): boolean {\r\n if (!framework) return false;\r\n const clientPrefix = getClientPrefix(clientId);\r\n if (clientPrefix && FIX_DATABASE[`${property}::${clientPrefix}::${framework}`]) return false;\r\n if (FIX_DATABASE[`${property}::${framework}`]) return false;\r\n return true;\r\n}\r\n\r\nfunction getClientPrefix(clientId: string): string | null {\r\n if (clientId === \"outlook-windows-legacy\") return \"outlook\"; // Word engine — VML fixes\r\n if (clientId === \"outlook-windows\") return null; // New Outlook — web engine, no special fixes\r\n if (clientId.startsWith(\"outlook\")) return null; // Outlook web is more standards-compliant\r\n if (clientId.startsWith(\"gmail\")) return \"gmail\";\r\n if (clientId.startsWith(\"apple-mail\")) return \"apple\";\r\n if (clientId === \"yahoo-mail\") return \"yahoo\";\r\n if (clientId === \"samsung-mail\") return \"samsung\";\r\n return null;\r\n}\r\n\r\n/**\r\n * Look up a suggestion string for a given property, client, and optional framework.\r\n *\r\n * Resolution order mirrors `getCodeFix()`:\r\n * 1. property::clientPrefix::framework\r\n * 2. property::framework\r\n * 3. property::clientPrefix\r\n * 4. property (generic)\r\n *\r\n * `isGenericFallback` is true when a framework was specified but no\r\n * framework-specific entry was found (resolution fell through to tiers 3–4).\r\n */\r\nexport function getSuggestion(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): { text: string; isGenericFallback: boolean } {\r\n const clientPrefix = getClientPrefix(clientId);\r\n\r\n // Tier 1: property::clientPrefix::framework\r\n if (framework && clientPrefix) {\r\n const tier1 = SUGGESTION_DATABASE[`${property}::${clientPrefix}::${framework}`];\r\n if (tier1) return { text: tier1, isGenericFallback: false };\r\n }\r\n\r\n // Tier 2: property::framework\r\n if (framework) {\r\n const tier2 = SUGGESTION_DATABASE[`${property}::${framework}`];\r\n if (tier2) return { text: tier2, isGenericFallback: false };\r\n }\r\n\r\n // Tier 3: property::clientPrefix\r\n if (clientPrefix) {\r\n const tier3 = SUGGESTION_DATABASE[`${property}::${clientPrefix}`];\r\n if (tier3) return { text: tier3, isGenericFallback: !!framework };\r\n }\r\n\r\n // Tier 4: generic\r\n const tier4 = SUGGESTION_DATABASE[property];\r\n if (tier4) return { text: tier4, isGenericFallback: !!framework };\r\n\r\n // No entry — return a default\r\n return {\r\n text: `\"${property}\" is not supported in this email client.`,\r\n isGenericFallback: !!framework,\r\n };\r\n}\r\n","/**\r\n * Shared utilities for parsing inline CSS style declarations.\r\n *\r\n * Used by both the analyzer and the per-client transformers to avoid\r\n * duplicating the semicolon-aware splitting logic.\r\n */\r\n\r\n/**\r\n * Split a CSS style string on semicolons while respecting\r\n * quoted strings and url()/function parentheses.\r\n */\r\nexport function splitStyleDeclarations(style: string): string[] {\r\n const parts: string[] = [];\r\n let current = \"\";\r\n let inSingleQuote = false;\r\n let inDoubleQuote = false;\r\n let parenDepth = 0;\r\n\r\n for (let i = 0; i < style.length; i++) {\r\n const ch = style[i];\r\n\r\n if (ch === \"'\" && !inDoubleQuote) {\r\n inSingleQuote = !inSingleQuote;\r\n } else if (ch === '\"' && !inSingleQuote) {\r\n inDoubleQuote = !inDoubleQuote;\r\n } else if (ch === \"(\" && !inSingleQuote && !inDoubleQuote) {\r\n parenDepth++;\r\n } else if (ch === \")\" && !inSingleQuote && !inDoubleQuote) {\r\n parenDepth = Math.max(0, parenDepth - 1);\r\n }\r\n\r\n if (ch === \";\" && !inSingleQuote && !inDoubleQuote && parenDepth === 0) {\r\n if (current.trim()) {\r\n parts.push(current.trim());\r\n }\r\n current = \"\";\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n\r\n if (current.trim()) {\r\n parts.push(current.trim());\r\n }\r\n return parts;\r\n}\r\n\r\n/**\r\n * Parse an inline style string into a list of property names.\r\n */\r\nexport function parseStyleProperties(style: string): string[] {\r\n const props: string[] = [];\r\n const parts = splitStyleDeclarations(style);\r\n for (const part of parts) {\r\n const colonIndex = part.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = part.slice(0, colonIndex).trim().toLowerCase();\r\n if (prop) props.push(prop);\r\n }\r\n return props;\r\n}\r\n\r\n/**\r\n * Extract the value of a specific property from an inline style string.\r\n */\r\nexport function getStyleValue(style: string, property: string): string | null {\r\n const parts = splitStyleDeclarations(style);\r\n for (const part of parts) {\r\n const colonIndex = part.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = part.slice(0, colonIndex).trim().toLowerCase();\r\n if (prop === property) {\r\n return part.slice(colonIndex + 1).trim();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Parse an inline style string into a Map of property → value.\r\n */\r\nexport function parseInlineStyle(style: string): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const declarations = splitStyleDeclarations(style);\r\n for (const decl of declarations) {\r\n const colonIndex = decl.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = decl.slice(0, colonIndex).trim().toLowerCase();\r\n const value = decl.slice(colonIndex + 1).trim();\r\n if (prop && value) {\r\n map.set(prop, value);\r\n }\r\n }\r\n return map;\r\n}\r\n\r\n/**\r\n * Serialize a Map of property → value back to an inline style string.\r\n */\r\nexport function serializeStyle(map: Map<string, string>): string {\r\n const parts: string[] = [];\r\n map.forEach((value, prop) => {\r\n parts.push(`${prop}: ${value}`);\r\n });\r\n return parts.join(\"; \");\r\n}\r\n","/**\n * Downlevel modern CSS in HTML emails to maximize email client compatibility.\n *\n * Transforms modern CSS features into widely-supported equivalents:\n * - Modern color functions (oklch, hsl, hwb) to rgb()\n * - Space-based rgb() to comma-based rgb()\n * - CSS logical properties to physical properties\n * - calc(infinity * 1px) to 9999px\n * - CSS nesting to flat rules\n * - Range media queries to legacy min/max syntax\n * - CSS variables (var()) resolved within same stylesheet\n */\n\nimport * as cheerio from \"cheerio\";\nimport * as csstree from \"css-tree\";\nimport { parseColor, formatRgb } from \"./color-utils\";\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\n\n// --- Logical property mappings ---\n\nconst LOGICAL_PROPERTY_MAP: Record<string, [string, string]> = {\n \"padding-inline\": [\"padding-left\", \"padding-right\"],\n \"padding-block\": [\"padding-top\", \"padding-bottom\"],\n \"margin-inline\": [\"margin-left\", \"margin-right\"],\n \"margin-block\": [\"margin-top\", \"margin-bottom\"],\n \"inset-inline\": [\"left\", \"right\"],\n \"inset-block\": [\"top\", \"bottom\"],\n \"border-inline\": [\"border-left\", \"border-right\"],\n \"border-block\": [\"border-top\", \"border-bottom\"],\n};\n\n// --- Color conversion ---\n\n/**\n * Regex matching modern color functions that need conversion.\n * Matches oklch(...), hsl(...), hsla(...), hwb(...), and space-based rgb(...).\n */\nconst MODERN_COLOR_RE =\n /\\b(oklch|hsl|hsla|hwb|rgba?)\\s*\\(/g;\n\n/**\n * Extract a balanced parenthesized expression starting at `(` position.\n * Returns the full function call including the function name prefix.\n */\nfunction extractFunctionCall(\n str: string,\n fnStart: number,\n openParenIndex: number,\n): string | null {\n let depth = 0;\n for (let i = openParenIndex; i < str.length; i++) {\n if (str[i] === \"(\") depth++;\n else if (str[i] === \")\") {\n depth--;\n if (depth === 0) {\n return str.slice(fnStart, i + 1);\n }\n }\n }\n return null;\n}\n\n/**\n * Check if an rgb/rgba call uses space syntax (needs conversion).\n */\nfunction isSpaceSyntaxRgb(args: string): boolean {\n // Space syntax: \"R G B\" or \"R G B / A\" — no commas\n const inner = args.trim();\n return !inner.includes(\",\") && /^\\d/.test(inner);\n}\n\nfunction convertModernColors(value: string): string {\n let result = value;\n let match: RegExpExecArray | null;\n\n // Reset regex state for each call\n MODERN_COLOR_RE.lastIndex = 0;\n\n // Collect replacements to apply from right to left (avoid index shifting)\n const replacements: { start: number; end: number; replacement: string }[] =\n [];\n\n while ((match = MODERN_COLOR_RE.exec(result)) !== null) {\n const fnName = match[1].toLowerCase();\n const fnStart = match.index;\n const openParen = fnStart + match[0].length - 1;\n\n const fullCall = extractFunctionCall(result, fnStart, openParen);\n if (!fullCall) continue;\n\n // For rgb/rgba, only convert if it uses space syntax\n if (fnName === \"rgb\" || fnName === \"rgba\") {\n const argsStr = fullCall.slice(fullCall.indexOf(\"(\") + 1, -1);\n if (!isSpaceSyntaxRgb(argsStr)) continue;\n }\n\n const parsed = parseColor(fullCall);\n if (parsed) {\n replacements.push({\n start: fnStart,\n end: fnStart + fullCall.length,\n replacement: formatRgb(parsed),\n });\n }\n }\n\n // Apply replacements right-to-left to preserve indices\n for (let i = replacements.length - 1; i >= 0; i--) {\n const r = replacements[i];\n result = result.slice(0, r.start) + r.replacement + result.slice(r.end);\n }\n\n return result;\n}\n\n// --- Logical properties ---\n\nfunction convertLogicalProperty(\n prop: string,\n value: string,\n): [string, string][] | null {\n const mapping = LOGICAL_PROPERTY_MAP[prop];\n if (!mapping) return null;\n\n const parts = value.trim().split(/\\s+/);\n const [first, second] = mapping;\n\n if (parts.length >= 2) {\n return [\n [first, parts[0]],\n [second, parts[1]],\n ];\n }\n return [\n [first, parts[0]],\n [second, parts[0]],\n ];\n}\n\n// --- calc(infinity) ---\n\nconst CALC_INFINITY_RE = /calc\\(\\s*infinity\\s*\\*\\s*1(px|em|rem|%|vh|vw)\\s*\\)/gi;\nconst CALC_INFINITY_SIMPLE_RE = /calc\\(\\s*infinity\\s*\\)/gi;\n\nfunction resolveCalcInfinity(value: string): string {\n let result = value.replace(CALC_INFINITY_RE, (_match, unit: string) => {\n return `9999${unit}`;\n });\n result = result.replace(CALC_INFINITY_SIMPLE_RE, \"9999px\");\n return result;\n}\n\n// --- CSS nesting (unnest) ---\n\n/**\n * Unnest CSS rules where @media is nested inside a selector.\n * `.sm_p-4{@media (min-width:40rem){padding:1rem!important}}`\n * becomes:\n * `@media (min-width:40rem){.sm_p-4{padding:1rem!important}}`\n */\nfunction unnestCSSRules(css: string): string {\n // Match: selector { @media ... { ... } }\n // Use brace-balancing to find the boundaries\n let result = \"\";\n let i = 0;\n\n while (i < css.length) {\n // Look for a pattern: <selector> { ... @media ... }\n const atMediaInside = findNestedAtRule(css, i);\n if (atMediaInside) {\n result += css.slice(i, atMediaInside.outerStart);\n // Emit any preamble declarations that preceded the nested @-rule\n if (atMediaInside.preamble) {\n result += `${atMediaInside.selector}{${atMediaInside.preamble}}`;\n }\n // Emit: @media <query> { <selector> { <declarations> } }\n result += `${atMediaInside.atRule}{${atMediaInside.selector}{${atMediaInside.body}}}`;\n i = atMediaInside.outerEnd;\n } else {\n result += css.slice(i);\n break;\n }\n }\n\n return result;\n}\n\ninterface NestedAtRule {\n outerStart: number;\n outerEnd: number;\n selector: string;\n atRule: string;\n body: string;\n /** Declarations before the nested @-rule that stay in the selector block. */\n preamble?: string;\n}\n\nfunction findNestedAtRule(css: string, startPos: number): NestedAtRule | null {\n // Find a { that is followed (eventually) by @media inside\n for (let i = startPos; i < css.length; i++) {\n if (css[i] === \"{\") {\n // Check what's inside this block\n const selector = css.slice(startPos, i).trim();\n if (!selector || selector.startsWith(\"@\")) {\n // Skip @-rules at top level, just find matching close brace\n const closeIdx = findMatchingBrace(css, i);\n if (closeIdx === -1) return null;\n // Look further after this block\n const rest = findNestedAtRule(css, closeIdx + 1);\n if (rest) return rest;\n return null;\n }\n\n // We have a selector. Check if the content contains @media (or @supports)\n const innerStart = i + 1;\n const closeIdx = findMatchingBrace(css, i);\n if (closeIdx === -1) return null;\n\n const innerContent = css.slice(innerStart, closeIdx).trim();\n\n // Find any @media or @supports nested inside (may not be at the start)\n const atMatch = innerContent.match(/@(media|supports)\\s/);\n if (atMatch && atMatch.index !== undefined) {\n const atPos = atMatch.index;\n const atBraceIdx = innerContent.indexOf(\"{\", atPos);\n if (atBraceIdx === -1) continue;\n\n const atRule = innerContent.slice(atPos, atBraceIdx).trim();\n const atCloseIdx = findMatchingBrace(innerContent, atBraceIdx);\n if (atCloseIdx === -1) continue;\n\n const body = innerContent.slice(atBraceIdx + 1, atCloseIdx).trim();\n\n // Content before the @-rule stays as regular declarations in the selector\n const beforeAt = innerContent.slice(0, atPos).trim();\n\n return {\n outerStart: findSelectorStart(css, i, startPos),\n outerEnd: closeIdx + 1,\n selector,\n atRule,\n body,\n // If there are declarations before the nested @-rule, keep them\n ...(beforeAt ? { preamble: beforeAt } : {}),\n };\n }\n }\n }\n return null;\n}\n\nfunction findSelectorStart(css: string, braceIdx: number, minPos: number): number {\n // Walk backwards from the opening brace to find where the selector starts\n let i = braceIdx - 1;\n while (i >= minPos && css[i] !== \"}\" && css[i] !== \";\") {\n i--;\n }\n return i + 1;\n}\n\nfunction findMatchingBrace(css: string, openIdx: number): number {\n let depth = 0;\n for (let i = openIdx; i < css.length; i++) {\n if (css[i] === \"{\") depth++;\n else if (css[i] === \"}\") {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n// --- Range media queries ---\n\n/**\n * Convert Media Queries Level 4 range syntax to legacy min/max.\n * (width >= 40rem) -> (min-width: 40rem)\n * (width <= 40rem) -> (max-width: 40rem)\n * (width > 40rem) -> (min-width: 40rem)\n * (width < 40rem) -> (max-width: 40rem)\n */\nfunction convertRangeMediaQueries(css: string): string {\n return css.replace(\n /\\(\\s*width\\s*(>=?|<=?)\\s*([\\d.]+\\w*)\\s*\\)/g,\n (_match, op: string, value: string) => {\n if (op === \">=\" || op === \">\") {\n return `(min-width: ${value})`;\n }\n return `(max-width: ${value})`;\n },\n );\n}\n\n// --- CSS variable resolution ---\n\n/** Universal selectors that apply to all elements. */\nconst UNIVERSAL_SELECTORS = new Set([\":root\", \"*\", \"html\"]);\n\n/** Check if a definition's selector could apply to a usage's selector scope. */\nfunction selectorsCouldMatch(defSelector: string, useSelector: string): boolean {\n if (defSelector === useSelector) return true;\n if (UNIVERSAL_SELECTORS.has(defSelector)) return true;\n return false;\n}\n\nfunction resolveCSSVariables(ast: csstree.CssNode): void {\n // Collect variable definitions: { selector, varName, value }\n const varDefs: { selector: string; varName: string; value: string }[] = [];\n\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.prelude || !rule.block) return;\n\n const selector = csstree.generate(rule.prelude);\n\n rule.block.children.forEach((node) => {\n if (\n node.type === \"Declaration\" &&\n node.property.startsWith(\"--\")\n ) {\n varDefs.push({\n selector,\n varName: node.property,\n value: csstree.generate(node.value),\n });\n }\n });\n },\n });\n\n if (varDefs.length === 0) return;\n\n // Resolve var() references — track the enclosing Rule selector for scoping\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.prelude || !rule.block) return;\n const useSelector = csstree.generate(rule.prelude);\n\n csstree.walk(rule.block, {\n visit: \"Function\",\n enter(node, item, list) {\n if (node.name !== \"var\" || !list) return;\n\n const args: string[] = [];\n if (node.children) {\n node.children.forEach((child) => {\n args.push(csstree.generate(child));\n });\n }\n\n const fullArgs = args.join(\"\");\n const commaIdx = fullArgs.indexOf(\",\");\n const varName = commaIdx !== -1 ? fullArgs.slice(0, commaIdx).trim() : fullArgs.trim();\n const fallback = commaIdx !== -1 ? fullArgs.slice(commaIdx + 1).trim() : null;\n\n // Look up the variable — only from scopes that could apply to this selector\n let resolved: string | null = null;\n\n // Priority: same selector > universal selectors (:root, *, html)\n for (const def of varDefs) {\n if (def.varName === varName && def.selector === useSelector) {\n resolved = def.value;\n break;\n }\n }\n if (!resolved) {\n for (const def of varDefs) {\n if (def.varName === varName && selectorsCouldMatch(def.selector, useSelector)) {\n resolved = def.value;\n break;\n }\n }\n }\n\n if (!resolved && fallback) {\n resolved = fallback;\n }\n\n if (resolved && item) {\n const replacement = csstree.parse(resolved, {\n context: \"value\",\n }) as csstree.Value;\n\n if (replacement.children) {\n replacement.children.forEach((child) => {\n list.insertData(child, item);\n });\n list.remove(item);\n }\n }\n },\n });\n },\n });\n}\n\n// --- Declaration sanitization (AST-level) ---\n\nfunction sanitizeDeclarations(ast: csstree.CssNode): void {\n csstree.walk(ast, {\n visit: \"Declaration\",\n enter(decl) {\n // Skip custom properties\n if (decl.property.startsWith(\"--\")) return;\n\n // Convert colors and calc in values\n if (decl.value.type === \"Value\") {\n const raw = csstree.generate(decl.value);\n let converted = convertModernColors(raw);\n converted = resolveCalcInfinity(converted);\n\n if (converted !== raw) {\n try {\n const newValue = csstree.parse(converted, {\n context: \"value\",\n }) as csstree.Value;\n decl.value = newValue;\n } catch {\n // If parsing fails, leave as-is\n }\n }\n }\n },\n });\n\n // Second pass: expand logical properties\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.block) return;\n\n const toInsert: { property: string; value: string; important: boolean; item: csstree.ListItem<csstree.CssNode> }[] = [];\n\n rule.block.children.forEach(function (node, item) {\n if (node.type !== \"Declaration\") return;\n\n const mapping = LOGICAL_PROPERTY_MAP[node.property];\n if (!mapping) return;\n\n const valueStr = csstree.generate(node.value);\n const parts = valueStr.trim().split(/\\s+/);\n const [first, second] = mapping;\n const val1 = parts[0];\n const val2 = parts.length >= 2 ? parts[1] : parts[0];\n\n toInsert.push(\n { property: first, value: val1, important: !!node.important, item },\n { property: second, value: val2, important: !!node.important, item },\n );\n });\n\n // Replace logical property declarations with physical ones\n for (const { property, value, important, item } of toInsert) {\n try {\n const newDecl: csstree.Declaration = {\n type: \"Declaration\",\n important,\n property,\n value: csstree.parse(value, { context: \"value\" }) as csstree.Value,\n };\n rule.block.children.insertData(newDecl, item);\n } catch {\n // Skip on parse failure\n }\n }\n\n // Remove original logical property declarations (deduplicate removal)\n const removed = new Set<csstree.ListItem<csstree.CssNode>>();\n for (const { item } of toInsert) {\n if (!removed.has(item)) {\n removed.add(item);\n rule.block.children.remove(item);\n }\n }\n },\n });\n}\n\n// --- Main export ---\n\n/**\n * Downlevel modern CSS in an HTML email to maximize email client compatibility.\n *\n * Transformations:\n * 1. Convert modern color functions (oklch, hsl, hwb) to rgb()\n * 2. Convert space-based rgb() to comma-based rgb()\n * 3. Convert CSS logical properties to physical properties\n * 4. Resolve calc(infinity * 1px) to 9999px\n * 5. Unnest CSS nesting to flat rules\n * 6. Convert range media queries to legacy min/max syntax\n * 7. Resolve CSS variables (var()) within same stylesheet\n */\nexport function downlevelCSS(html: string): string {\n const $ = cheerio.load(html);\n\n // Process <style> blocks\n $(\"style\").each((_, el) => {\n let css = $(el).text();\n\n // 1. Text-level transformations (nesting, range queries)\n css = unnestCSSRules(css);\n css = convertRangeMediaQueries(css);\n\n // 2. AST-level transformations\n try {\n const ast = csstree.parse(css, { parseCustomProperty: true });\n resolveCSSVariables(ast);\n sanitizeDeclarations(ast);\n $(el).text(csstree.generate(ast));\n } catch {\n // If CSS can't be parsed, still apply text-level transforms\n $(el).text(css);\n }\n });\n\n // Process inline styles\n $(\"[style]\").each((_, el) => {\n const style = $(el).attr(\"style\") || \"\";\n const props = parseInlineStyle(style);\n let changed = false;\n\n const newProps = new Map<string, string>();\n props.forEach((value, prop) => {\n // Convert modern colors in values\n const converted = convertModernColors(value);\n if (converted !== value) changed = true;\n\n // Convert logical properties\n const physical = convertLogicalProperty(prop, converted);\n if (physical) {\n changed = true;\n for (const [p, v] of physical) {\n newProps.set(p, v);\n }\n } else {\n // Check for calc(infinity)\n const calcFixed = resolveCalcInfinity(converted);\n if (calcFixed !== converted) changed = true;\n newProps.set(prop, calcFixed);\n }\n });\n\n if (changed) {\n $(el).attr(\"style\", serializeStyle(newProps));\n }\n });\n\n return $.html();\n}\n","/**\r\n * WCAG 2.1 color parsing, luminance, and contrast utilities.\r\n *\r\n * Handles hex (#rgb, #rgba, #rrggbb, #rrggbbaa), rgb()/rgba() (comma and\r\n * space syntax), hsl()/hsla(), hwb(), oklch(), 148 named CSS colors, and\r\n * `transparent`. Returns null for unresolvable values like var(), inherit,\r\n * currentColor.\r\n */\r\n\r\nexport interface RGBA {\r\n r: number; // 0-255\r\n g: number; // 0-255\r\n b: number; // 0-255\r\n a: number; // 0-1\r\n}\r\n\r\nexport type WcagGrade = \"AAA\" | \"AA\" | \"AA Large\" | \"Fail\";\r\n\r\n// 148 CSS named colors (lowercase → [r, g, b])\r\nconst NAMED_COLORS: Record<string, [number, number, number]> = {\r\n aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255],\r\n aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220],\r\n bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205],\r\n blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42],\r\n burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0],\r\n chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237],\r\n cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255],\r\n darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11],\r\n darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169],\r\n darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47],\r\n darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0],\r\n darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139],\r\n darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209],\r\n darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255],\r\n dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255],\r\n firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34],\r\n fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255],\r\n gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128],\r\n green: [0, 128, 0], greenyellow: [173, 255, 47], grey: [128, 128, 128],\r\n honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92],\r\n indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140],\r\n lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0],\r\n lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128],\r\n lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211],\r\n lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193],\r\n lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250],\r\n lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222],\r\n lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50],\r\n linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0],\r\n mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211],\r\n mediumpurple: [147, 111, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238],\r\n mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133],\r\n midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225],\r\n moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128],\r\n oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35],\r\n orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214],\r\n palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238],\r\n palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185],\r\n peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221],\r\n powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153],\r\n red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225],\r\n saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96],\r\n seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45],\r\n silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205],\r\n slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250],\r\n springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140],\r\n teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71],\r\n turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179],\r\n white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0],\r\n yellowgreen: [154, 205, 50],\r\n};\r\n\r\n// --- Internal conversion helpers ---\r\n\r\n/** Parse an alpha value that may be a number (0-1) or percentage (0%-100%). */\r\nfunction parseAlpha(raw: string | undefined): number {\r\n if (raw === undefined) return 1;\r\n const s = raw.trim();\r\n if (s.endsWith(\"%\")) {\r\n return Math.min(1, Math.max(0, parseFloat(s) / 100));\r\n }\r\n return Math.min(1, Math.max(0, parseFloat(s)));\r\n}\r\n\r\n/** Clamp a value to 0-255 and round. */\r\nfunction clamp255(n: number): number {\r\n return Math.round(Math.min(255, Math.max(0, n)));\r\n}\r\n\r\n/**\r\n * Convert HSL to RGB.\r\n * H in degrees [0,360), S and L in [0,1].\r\n */\r\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n const c = (1 - Math.abs(2 * l - 1)) * s;\r\n const hp = h / 60;\r\n const x = c * (1 - Math.abs((hp % 2) - 1));\r\n const m = l - c / 2;\r\n\r\n let r1 = 0, g1 = 0, b1 = 0;\r\n if (hp >= 0 && hp < 1) { r1 = c; g1 = x; b1 = 0; }\r\n else if (hp >= 1 && hp < 2) { r1 = x; g1 = c; b1 = 0; }\r\n else if (hp >= 2 && hp < 3) { r1 = 0; g1 = c; b1 = x; }\r\n else if (hp >= 3 && hp < 4) { r1 = 0; g1 = x; b1 = c; }\r\n else if (hp >= 4 && hp < 5) { r1 = x; g1 = 0; b1 = c; }\r\n else { r1 = c; g1 = 0; b1 = x; }\r\n\r\n return [\r\n clamp255((r1 + m) * 255),\r\n clamp255((g1 + m) * 255),\r\n clamp255((b1 + m) * 255),\r\n ];\r\n}\r\n\r\n/**\r\n * Convert HWB to RGB.\r\n * H in degrees, W and B in [0,1].\r\n */\r\nfunction hwbToRgb(h: number, w: number, b: number): [number, number, number] {\r\n if (w + b >= 1) {\r\n const gray = clamp255((w / (w + b)) * 255);\r\n return [gray, gray, gray];\r\n }\r\n // Get pure hue as RGB via HSL(h, 100%, 50%)\r\n const [r0, g0, b0] = hslToRgb(h, 1, 0.5);\r\n return [\r\n clamp255(r0 / 255 * (1 - w - b) * 255 + w * 255),\r\n clamp255(g0 / 255 * (1 - w - b) * 255 + w * 255),\r\n clamp255(b0 / 255 * (1 - w - b) * 255 + w * 255),\r\n ];\r\n}\r\n\r\n/** Linear-sRGB to sRGB gamma correction. */\r\nfunction linearToGamma(c: number): number {\r\n if (c <= 0.0031308) return 12.92 * c;\r\n return 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\r\n}\r\n\r\n/**\r\n * Convert OKLCh to RGB.\r\n * L in [0,1], C in [0,~0.4], H in degrees [0,360).\r\n */\r\nfunction oklchToRgb(L: number, C: number, H: number): [number, number, number] {\r\n // oklch → oklab\r\n const hRad = H * Math.PI / 180;\r\n const a = C * Math.cos(hRad);\r\n const b = C * Math.sin(hRad);\r\n\r\n // oklab → LMS (cubed roots)\r\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\r\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\r\n const s_ = L - 0.0894841775 * a - 1.2914855480 * b;\r\n\r\n const l = l_ * l_ * l_;\r\n const m = m_ * m_ * m_;\r\n const s = s_ * s_ * s_;\r\n\r\n // LMS → linear sRGB\r\n const rLin = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\r\n const gLin = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\r\n const bLin = -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s;\r\n\r\n // linear sRGB → sRGB gamma → 0-255\r\n return [\r\n clamp255(linearToGamma(rLin) * 255),\r\n clamp255(linearToGamma(gLin) * 255),\r\n clamp255(linearToGamma(bLin) * 255),\r\n ];\r\n}\r\n\r\n/**\r\n * Parse a CSS color value to RGBA. Returns null for unresolvable values.\r\n */\r\nexport function parseColor(value: string): RGBA | null {\r\n if (!value) return null;\r\n const v = value.trim().toLowerCase();\r\n\r\n // Unresolvable\r\n if (v === \"inherit\" || v === \"currentcolor\" || v === \"initial\" || v === \"unset\" || v.startsWith(\"var(\")) {\r\n return null;\r\n }\r\n\r\n if (v === \"transparent\") {\r\n return { r: 0, g: 0, b: 0, a: 0 };\r\n }\r\n\r\n // Named colors\r\n const named = NAMED_COLORS[v];\r\n if (named) {\r\n return { r: named[0], g: named[1], b: named[2], a: 1 };\r\n }\r\n\r\n // Hex: #rgb, #rgba, #rrggbb, #rrggbbaa\r\n if (v.startsWith(\"#\")) {\r\n const hex = v.slice(1);\r\n if (hex.length === 3) {\r\n return {\r\n r: parseInt(hex[0] + hex[0], 16),\r\n g: parseInt(hex[1] + hex[1], 16),\r\n b: parseInt(hex[2] + hex[2], 16),\r\n a: 1,\r\n };\r\n }\r\n if (hex.length === 4) {\r\n return {\r\n r: parseInt(hex[0] + hex[0], 16),\r\n g: parseInt(hex[1] + hex[1], 16),\r\n b: parseInt(hex[2] + hex[2], 16),\r\n a: parseInt(hex[3] + hex[3], 16) / 255,\r\n };\r\n }\r\n if (hex.length === 6) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: 1,\r\n };\r\n }\r\n if (hex.length === 8) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: parseInt(hex.slice(6, 8), 16) / 255,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n // rgb() / rgba() — comma syntax\r\n const rgbComma = v.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (rgbComma) {\r\n return {\r\n r: Math.min(255, parseInt(rgbComma[1], 10)),\r\n g: Math.min(255, parseInt(rgbComma[2], 10)),\r\n b: Math.min(255, parseInt(rgbComma[3], 10)),\r\n a: rgbComma[4] !== undefined ? parseAlpha(rgbComma[4]) : 1,\r\n };\r\n }\r\n\r\n // rgb() / rgba() — space syntax: rgb(255 0 0) or rgb(255 0 0 / 0.5) or rgb(255 0 0 / 50%)\r\n const rgbSpace = v.match(/^rgba?\\(\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (rgbSpace) {\r\n return {\r\n r: Math.min(255, parseInt(rgbSpace[1], 10)),\r\n g: Math.min(255, parseInt(rgbSpace[2], 10)),\r\n b: Math.min(255, parseInt(rgbSpace[3], 10)),\r\n a: rgbSpace[4] !== undefined ? parseAlpha(rgbSpace[4]) : 1,\r\n };\r\n }\r\n\r\n // hsl() / hsla() — comma syntax: hsl(120, 100%, 50%) or hsla(120, 100%, 50%, 0.5)\r\n const hslComma = v.match(/^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hslComma) {\r\n const h = ((parseFloat(hslComma[1]) % 360) + 360) % 360;\r\n const s = Math.min(100, parseFloat(hslComma[2])) / 100;\r\n const l = Math.min(100, parseFloat(hslComma[3])) / 100;\r\n const [r, g, b] = hslToRgb(h, s, l);\r\n return { r, g, b, a: hslComma[4] !== undefined ? parseAlpha(hslComma[4]) : 1 };\r\n }\r\n\r\n // hsl() / hsla() — space syntax: hsl(120 100% 50%) or hsl(120 100% 50% / 0.5)\r\n const hslSpace = v.match(/^hsla?\\(\\s*([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hslSpace) {\r\n const h = ((parseFloat(hslSpace[1]) % 360) + 360) % 360;\r\n const s = Math.min(100, parseFloat(hslSpace[2])) / 100;\r\n const l = Math.min(100, parseFloat(hslSpace[3])) / 100;\r\n const [r, g, b] = hslToRgb(h, s, l);\r\n return { r, g, b, a: hslSpace[4] !== undefined ? parseAlpha(hslSpace[4]) : 1 };\r\n }\r\n\r\n // hwb(): hwb(120 10% 20%) or hwb(120 10% 20% / 0.5)\r\n const hwbMatch = v.match(/^hwb\\(\\s*([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hwbMatch) {\r\n const h = ((parseFloat(hwbMatch[1]) % 360) + 360) % 360;\r\n const w = Math.min(100, parseFloat(hwbMatch[2])) / 100;\r\n const bk = Math.min(100, parseFloat(hwbMatch[3])) / 100;\r\n const [r, g, b] = hwbToRgb(h, w, bk);\r\n return { r, g, b, a: hwbMatch[4] !== undefined ? parseAlpha(hwbMatch[4]) : 1 };\r\n }\r\n\r\n // oklch(): oklch(0.7 0.15 180) or oklch(0.7 0.15 180 / 0.5)\r\n const oklchMatch = v.match(/^oklch\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (oklchMatch) {\r\n const L = Math.min(1, Math.max(0, parseFloat(oklchMatch[1])));\r\n const C = Math.max(0, parseFloat(oklchMatch[2]));\r\n const H = ((parseFloat(oklchMatch[3]) % 360) + 360) % 360;\r\n const [r, g, b] = oklchToRgb(L, C, H);\r\n return { r, g, b, a: oklchMatch[4] !== undefined ? parseAlpha(oklchMatch[4]) : 1 };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Format an RGBA value as an rgb() or rgba() CSS string.\r\n * Returns `rgba(r, g, b, a)` when alpha < 1, otherwise `rgb(r, g, b)`.\r\n */\r\nexport function formatRgb(rgba: RGBA): string {\r\n const r = clamp255(rgba.r);\r\n const g = clamp255(rgba.g);\r\n const b = clamp255(rgba.b);\r\n if (rgba.a < 1) {\r\n return `rgba(${r}, ${g}, ${b}, ${rgba.a})`;\r\n }\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\n/**\r\n * Compute WCAG 2.1 relative luminance for an sRGB color.\r\n * Input values 0-255.\r\n */\r\nexport function relativeLuminance(r: number, g: number, b: number): number {\r\n const [rs, gs, bs] = [r, g, b].map((c) => {\r\n const s = c / 255;\r\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\r\n });\r\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\r\n}\r\n\r\n/**\r\n * Compute the WCAG contrast ratio between two relative luminances.\r\n */\r\nexport function contrastRatio(l1: number, l2: number): number {\r\n const lighter = Math.max(l1, l2);\r\n const darker = Math.min(l1, l2);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/**\r\n * Determine WCAG 2.1 conformance grade for a contrast ratio.\r\n */\r\nexport function wcagGrade(ratio: number): WcagGrade {\r\n if (ratio >= 7) return \"AAA\";\r\n if (ratio >= 4.5) return \"AA\";\r\n if (ratio >= 3) return \"AA Large\";\r\n return \"Fail\";\r\n}\r\n\r\n/**\r\n * Alpha-blend a foreground RGBA onto an opaque background (r, g, b 0-255).\r\n * Returns the flattened [r, g, b] as 0-255 values.\r\n */\r\nexport function alphaBlend(fg: RGBA, bgR: number, bgG: number, bgB: number): [number, number, number] {\r\n const a = fg.a;\r\n return [\r\n Math.round(fg.r * a + bgR * (1 - a)),\r\n Math.round(fg.g * a + bgG * (1 - a)),\r\n Math.round(fg.b * a + bgB * (1 - a)),\r\n ];\r\n}\r\n","/**\r\n * Shared constants used across the engine.\r\n */\r\n\r\n/** Maximum HTML input size: 2MB. Inputs exceeding this are rejected early. */\r\nexport const MAX_HTML_SIZE = 2 * 1024 * 1024;\r\n\r\nexport const GENERIC_LINK_TEXT = new Set([\r\n \"click here\", \"here\", \"read more\", \"learn more\", \"more\",\r\n \"link\", \"this link\", \"click\", \"tap here\", \"this\",\r\n]);\r\n\r\n// ─── Gmail clipping thresholds ──────────────────────────────────────────────\r\n\r\n/** Gmail clips messages larger than ~102KB */\r\nexport const GMAIL_CLIP_THRESHOLD = 102 * 1024;\r\n\r\n/** Warning zone: messages approaching the clip threshold */\r\nexport const GMAIL_CLIP_WARNING_THRESHOLD = 90 * 1024;\r\n\r\n// ─── Per-client display limits ──────────────────────────────────────────────\r\n// Display limits last verified: 2026-03-04\r\n// Sources: emailtooltester.com, Campaign Monitor, Litmus preview text guide\r\n// Note: These are approximations — actual limits vary by device, screen size,\r\n// font rendering, and sender name length.\r\n\r\nexport interface ClientDisplayLimit {\r\n client: string;\r\n subjectLimit: number;\r\n preheaderLimit: number;\r\n}\r\n\r\nexport const CLIENT_DISPLAY_LIMITS: ClientDisplayLimit[] = [\r\n { client: \"Gmail (Web)\", subjectLimit: 70, preheaderLimit: 90 },\r\n { client: \"Gmail (Mobile)\", subjectLimit: 40, preheaderLimit: 45 },\r\n { client: \"Outlook (Web)\", subjectLimit: 60, preheaderLimit: 90 },\r\n { client: \"Outlook (Desktop)\", subjectLimit: 55, preheaderLimit: 35 },\r\n { client: \"Apple Mail (macOS)\", subjectLimit: 78, preheaderLimit: 140 },\r\n { client: \"Apple Mail (iOS)\", subjectLimit: 41, preheaderLimit: 90 },\r\n { client: \"Yahoo Mail\", subjectLimit: 46, preheaderLimit: 100 },\r\n { client: \"Samsung Email\", subjectLimit: 40, preheaderLimit: 70 },\r\n];\r\n\r\n// ─── Template variable patterns ─────────────────────────────────────────────\r\n\r\n/**\r\n * Patterns for detecting unresolved template/merge variables.\r\n * Each entry: [pattern, label]\r\n */\r\nexport const TEMPLATE_VARIABLE_PATTERNS: Array<[RegExp, string]> = [\r\n [/\\{\\{[\\s\\S]*?\\}\\}/g, \"Handlebars/Mustache\"], // {{var}}\r\n [/\\$\\{[^}]+\\}/g, \"ES template literal\"], // ${var}\r\n [/<%=?\\s*[^%]+%>/g, \"ERB/EJS\"], // <% %> / <%= %>\r\n [/\\*\\|[A-Z_][A-Z0-9_]*\\|\\*/g, \"Mailchimp merge tag\"], // *|TAG|*\r\n [/%%[A-Za-z_][A-Za-z0-9_]*%%/g, \"Salesforce AMPscript\"],// %%tag%%\r\n [/\\{[A-Za-z_][A-Za-z0-9_.]{2,}\\}/g, \"Single-brace merge field\"], // {merge_field} (3+ char names)\r\n];\r\n\r\n/** Shared empty report defaults for skipped checks and empty-input fast paths. */\r\nimport type { SpamReport, LinkReport, AccessibilityReport, ImageReport, InboxPreview, SizeReport, TemplateReport } from \"./types\";\r\n\r\nexport const EMPTY_SPAM: SpamReport = { score: 100, level: \"low\", issues: [] };\r\nexport const EMPTY_LINKS: LinkReport = {\r\n totalLinks: 0,\r\n issues: [],\r\n breakdown: { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 },\r\n};\r\nexport const EMPTY_ACCESSIBILITY: AccessibilityReport = { score: 100, issues: [] };\r\nexport const EMPTY_IMAGES: ImageReport = { total: 0, totalDataUriBytes: 0, issues: [], images: [] };\r\nexport const EMPTY_INBOX_PREVIEW: InboxPreview = { subject: null, preheader: null, subjectLength: 0, preheaderLength: 0, truncation: [], issues: [] };\r\nexport const EMPTY_SIZE: SizeReport = { htmlBytes: 0, humanSize: \"0 B\", clipped: false, issues: [] };\r\nexport const EMPTY_TEMPLATE: TemplateReport = { unresolvedCount: 0, issues: [] };\r\n\r\nimport type { DeliverabilityReport } from \"./types\";\r\nexport const EMPTY_DELIVERABILITY: DeliverabilityReport = { domain: \"\", checks: [], score: 0, issues: [] };\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport {\r\n CSS_SUPPORT,\r\n STRUCTURAL_FIX_PROPERTIES,\r\n HTML_ELEMENT_FEATURES,\r\n AT_RULE_FEATURES,\r\n COMPOUND_VALUE_FEATURES,\r\n CSS_FUNCTION_FEATURES,\r\n} from \"./rules/css-support\";\r\nimport { EMAIL_CLIENTS } from \"./clients\";\r\nimport { getCodeFix, getSuggestion, isCodeFixGenericFallback } from \"./fix-snippets\";\r\nimport { parseStyleProperties, getStyleValue } from \"./style-utils\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { CSSWarning, FixType, Framework, SupportLevel } from \"./types\";\r\n\r\n// ── Data-driven detection config ─────────────────────────────────────────────\r\n\r\n/**\r\n * HTML element detection rules.\r\n * Each maps a feature key to a CSS selector for DOM detection.\r\n * Special cases (like <form> also matching <input>/<button>) are listed explicitly.\r\n */\r\nconst HTML_ELEMENT_SELECTORS: Record<string, string> = {\r\n \"<style>\": \"style\",\r\n \"<link>\": \"link[rel='stylesheet']\",\r\n \"<svg>\": \"svg\",\r\n \"<video>\": \"video\",\r\n \"<form>\": \"form, input, button[type='submit']\",\r\n \"<audio>\": \"audio\",\r\n \"<picture>\": \"picture\",\r\n \"<dialog>\": \"dialog\",\r\n \"<meter>\": \"meter\",\r\n \"<progress>\": \"progress\",\r\n \"<select>\": \"select\",\r\n \"<textarea>\": \"textarea\",\r\n \"<marquee>\": \"marquee\",\r\n \"<object>\": \"object\",\r\n \"<base>\": \"base\",\r\n};\r\n\r\n/** Severity for HTML element detection (some are error, some warning). */\r\nconst HTML_ELEMENT_SEVERITY: Record<string, \"error\" | \"warning\"> = {\r\n \"<style>\": \"error\",\r\n \"<link>\": \"error\",\r\n \"<svg>\": \"error\",\r\n \"<form>\": \"error\",\r\n \"<video>\": \"warning\",\r\n \"<audio>\": \"warning\",\r\n \"<picture>\": \"warning\",\r\n \"<dialog>\": \"warning\",\r\n \"<marquee>\": \"warning\",\r\n \"<meter>\": \"warning\",\r\n \"<progress>\": \"warning\",\r\n \"<select>\": \"warning\",\r\n \"<textarea>\": \"warning\",\r\n \"<object>\": \"warning\",\r\n \"<base>\": \"warning\",\r\n};\r\n\r\n/** Custom messages for HTML elements. Falls back to generic message. */\r\nconst HTML_ELEMENT_MESSAGES: Record<string, (clientName: string) => string> = {\r\n \"<style>\": (n) => `${n} strips <style> blocks. Styles must be inlined.`,\r\n \"<link>\": (n) => `${n} does not support external stylesheets.`,\r\n \"<svg>\": (n) => `${n} does not support inline SVG.`,\r\n \"<video>\": (n) => `${n} does not support <video> elements.`,\r\n \"<form>\": (n) => `${n} strips form elements.`,\r\n};\r\n\r\n/** Compound value detection: maps compound feature keys to {property, valueIncludes}. */\r\nconst COMPOUND_DETECTORS: Array<{\r\n key: string;\r\n property: string;\r\n valueIncludes: string;\r\n}> = [\r\n { key: \"display:flex\", property: \"display\", valueIncludes: \"flex\" },\r\n { key: \"display:grid\", property: \"display\", valueIncludes: \"grid\" },\r\n { key: \"display:none\", property: \"display\", valueIncludes: \"none\" },\r\n];\r\n\r\n/** CSS function detection: require opening paren to avoid false positives (e.g., \"min\" in \"Minion\"). */\r\nconst CSS_FUNCTION_DETECTORS = CSS_FUNCTION_FEATURES.map((fn) => ({\r\n key: fn,\r\n pattern: `${fn}(`, // require opening paren — matches \"min(\" but not \"Minion\"\r\n}));\r\n\r\n// ── Analysis ─────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Analyze a pre-parsed email DOM for CSS compatibility warnings.\r\n *\r\n * Uses data-driven detection: HTML_ELEMENT_FEATURES, AT_RULE_FEATURES,\r\n * COMPOUND_VALUE_FEATURES, and CSS_FUNCTION_FEATURES are iterated\r\n * automatically from the generated css-support.ts arrays.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeEmailFromDom($: cheerio.CheerioAPI, framework?: Framework): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n const seenWarnings = new Set<string>();\r\n\r\n function addWarning(w: CSSWarning) {\r\n const key = `${w.client}:${w.property}:${w.severity}:${w.selector || \"\"}`;\r\n if (!seenWarnings.has(key)) {\r\n seenWarnings.add(key);\r\n warnings.push(w);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n function describeSelector(el: any): string {\r\n const $el = $(el);\r\n const tag = (el.tagName as string)?.toLowerCase() || \"\";\r\n const cls = $el.attr(\"class\");\r\n const id = $el.attr(\"id\");\r\n if (id) return `${tag}#${id}`;\r\n if (cls) return `${tag}.${cls.split(/\\s+/)[0]}`;\r\n const href = $el.attr(\"href\");\r\n if (href) return `${tag}[href]`;\r\n return tag;\r\n }\r\n\r\n // 1. Data-driven HTML element detection\r\n for (const feature of HTML_ELEMENT_FEATURES) {\r\n const selector = HTML_ELEMENT_SELECTORS[feature];\r\n if (!selector) continue; // Element not in our detection map — skip\r\n if ($(selector).length === 0) continue;\r\n\r\n const supportData = CSS_SUPPORT[feature];\r\n if (!supportData) continue;\r\n\r\n const baseSeverity = HTML_ELEMENT_SEVERITY[feature] || \"warning\";\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const support = supportData[client.id];\r\n if (support === \"unsupported\") {\r\n const msgFn = HTML_ELEMENT_MESSAGES[feature];\r\n const message = msgFn\r\n ? msgFn(client.name)\r\n : `${client.name} does not support ${feature}.`;\r\n const sug = getSuggestion(feature, client.id, framework);\r\n const fix = getCodeFix(feature, client.id, framework);\r\n addWarning({\r\n severity: baseSeverity,\r\n client: client.id,\r\n property: feature,\r\n message,\r\n suggestion: sug.text,\r\n fix,\r\n fixType: getFixType(feature),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(feature, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n } else if (support === \"partial\" && feature === \"<style>\") {\r\n // Special case: <style> partial gets a custom message\r\n const sug = getSuggestion(\"<style>:partial\", client.id, framework);\r\n const fix = getCodeFix(\"<style>\", client.id, framework);\r\n addWarning({\r\n severity: \"warning\",\r\n client: client.id,\r\n property: \"<style>\",\r\n message: `${client.name} has partial <style> support (head only, with limitations). Inline styles recommended.`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType: getFixType(\"<style>\"),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(\"<style>\", client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n }\r\n }\r\n }\r\n\r\n // 2. Parse <style> blocks with css-tree\r\n const parsedAtRules = new Set<string>();\r\n const parsedProperties = new Set<string>();\r\n const propertyLines = new Map<string, number>();\r\n const detectedCssFunctions = new Set<string>();\r\n const detectedPseudoClasses = new Set<string>();\r\n const detectedPseudoElements = new Set<string>();\r\n\r\n $(\"style\").each((_, el) => {\r\n const cssText = $(el).text();\r\n try {\r\n const ast = csstree.parse(cssText, { parseCustomProperty: true, positions: true });\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Atrule\") {\r\n parsedAtRules.add(`@${node.name}`);\r\n }\r\n // Detect pseudo-classes and pseudo-elements in selectors\r\n if (node.type === \"PseudoClassSelector\") {\r\n detectedPseudoClasses.add(`:${node.name}`);\r\n }\r\n if (node.type === \"PseudoElementSelector\") {\r\n detectedPseudoElements.add(`::${node.name}`);\r\n }\r\n if (node.type === \"Declaration\") {\r\n const prop = node.property.toLowerCase();\r\n parsedProperties.add(prop);\r\n if (node.loc && !propertyLines.has(prop)) {\r\n propertyLines.set(prop, node.loc.start.line);\r\n }\r\n\r\n // Data-driven compound value detection\r\n const valueStr = csstree.generate(node.value);\r\n for (const det of COMPOUND_DETECTORS) {\r\n if (prop === det.property && valueStr.includes(det.valueIncludes)) {\r\n parsedProperties.add(det.key);\r\n if (node.loc && !propertyLines.has(det.key)) {\r\n propertyLines.set(det.key, node.loc.start.line);\r\n }\r\n }\r\n }\r\n\r\n // Data-driven CSS function detection\r\n for (const fn of CSS_FUNCTION_DETECTORS) {\r\n if (valueStr.includes(fn.pattern)) {\r\n detectedCssFunctions.add(fn.key);\r\n if (node.loc && !propertyLines.has(fn.key)) {\r\n propertyLines.set(fn.key, node.loc.start.line);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n });\r\n } catch {\r\n // If css-tree can't parse, skip\r\n }\r\n });\r\n\r\n // 3. Data-driven at-rule checking\r\n for (const atRule of AT_RULE_FEATURES) {\r\n if (!parsedAtRules.has(atRule)) continue;\r\n checkPropertySupport(atRule, addWarning, framework);\r\n }\r\n\r\n // 4. Scan inline styles\r\n const cssPropertiesToCheck = Object.keys(CSS_SUPPORT).filter(\r\n (k) => !k.startsWith(\"<\") && !k.startsWith(\"@\")\r\n );\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseStyleProperties(style);\r\n const selector = describeSelector(el);\r\n\r\n for (const prop of props) {\r\n // Data-driven compound value detection in inline styles\r\n for (const det of COMPOUND_DETECTORS) {\r\n if (prop === det.property) {\r\n const value = getStyleValue(style, prop);\r\n if (value?.includes(det.valueIncludes)) {\r\n checkPropertySupport(det.key, addWarning, framework, selector);\r\n }\r\n }\r\n }\r\n\r\n if (cssPropertiesToCheck.includes(prop)) {\r\n checkPropertySupport(prop, addWarning, framework, selector);\r\n }\r\n\r\n // Data-driven CSS function detection in inline styles\r\n const value = getStyleValue(style, prop);\r\n if (value) {\r\n for (const fn of CSS_FUNCTION_DETECTORS) {\r\n if (value.includes(fn.pattern)) {\r\n checkPropertySupport(fn.key, addWarning, framework, selector);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 5. Check CSS properties from <style> blocks\r\n for (const prop of parsedProperties) {\r\n if (prop.includes(\":\")) continue;\r\n if (!cssPropertiesToCheck.includes(prop)) continue;\r\n checkPropertySupport(prop, addWarning, framework, undefined, propertyLines.get(prop));\r\n }\r\n\r\n // Data-driven compound values from <style> blocks (display:flex, display:grid, display:none)\r\n for (const compound of COMPOUND_VALUE_FEATURES) {\r\n // Only check actual compound values (property:value pairs), not pseudo-selectors\r\n if (compound.startsWith(\":\") || compound.startsWith(\"::\")) continue;\r\n if (parsedProperties.has(compound)) {\r\n checkPropertySupport(compound, addWarning, framework, undefined, propertyLines.get(compound));\r\n }\r\n }\r\n\r\n // Data-driven pseudo-class/element detection from <style> blocks\r\n for (const pseudo of detectedPseudoClasses) {\r\n if (CSS_SUPPORT[pseudo]) {\r\n checkPropertySupport(pseudo, addWarning, framework);\r\n }\r\n }\r\n for (const pseudo of detectedPseudoElements) {\r\n if (CSS_SUPPORT[pseudo]) {\r\n checkPropertySupport(pseudo, addWarning, framework);\r\n }\r\n }\r\n\r\n // Data-driven CSS functions from <style> blocks\r\n for (const fn of detectedCssFunctions) {\r\n checkPropertySupport(fn, addWarning, framework, undefined, propertyLines.get(fn));\r\n }\r\n\r\n // Sort: errors first, then warnings, then info\r\n const severityOrder: Record<string, number> = { error: 0, warning: 1, info: 2 };\r\n warnings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\r\n\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Analyze an HTML email and return CSS compatibility warnings\r\n * for all target email clients.\r\n *\r\n * The `framework` parameter controls which fix snippets are attached\r\n * to warnings — it does NOT change which warnings fire. Analysis always\r\n * runs on compiled HTML (what email clients actually receive). Fix\r\n * snippets reference source-level constructs so users know how to\r\n * modify their framework source code.\r\n */\r\nexport function analyzeEmail(html: string, framework?: Framework): CSSWarning[] {\r\n if (!html || !html.trim()) {\r\n return [];\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeEmailFromDom($, framework);\r\n}\r\n\r\nfunction getFixType(prop: string): FixType {\r\n return STRUCTURAL_FIX_PROPERTIES.has(prop) ? \"structural\" : \"css\";\r\n}\r\n\r\nfunction checkPropertySupport(\r\n prop: string,\r\n addWarning: (w: CSSWarning) => void,\r\n framework?: Framework,\r\n selector?: string,\r\n line?: number,\r\n) {\r\n const supportData = CSS_SUPPORT[prop];\r\n if (!supportData) return;\r\n\r\n const fixType = getFixType(prop);\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const support: SupportLevel = supportData[client.id] || \"unknown\";\r\n if (support === \"unsupported\") {\r\n const sug = getSuggestion(prop, client.id, framework);\r\n const fix = getCodeFix(prop, client.id, framework);\r\n addWarning({\r\n severity: \"warning\",\r\n client: client.id,\r\n property: prop,\r\n message: `${client.name} does not support \"${prop}\".`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType,\r\n ...(selector ? { selector } : {}),\r\n ...(line !== undefined ? { line } : {}),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(prop, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n } else if (support === \"partial\") {\r\n const sug = getSuggestion(prop, client.id, framework);\r\n const fix = getCodeFix(prop, client.id, framework);\r\n addWarning({\r\n severity: \"info\",\r\n client: client.id,\r\n property: prop,\r\n message: `${client.name} has partial support for \"${prop}\".`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType,\r\n ...(selector ? { selector } : {}),\r\n ...(line !== undefined ? { line } : {}),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(prop, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Generate a summary of CSS compatibility for the email.\r\n */\r\nexport function generateCompatibilityScore(\r\n warnings: CSSWarning[]\r\n): Record<string, { score: number; errors: number; warnings: number; info: number }> {\r\n const result: Record<string, { score: number; errors: number; warnings: number; info: number }> = {};\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const clientWarnings = warnings.filter((w) => w.client === client.id);\r\n\r\n // Count unique properties per severity so repeated elements don't inflate the score\r\n const errorProps = new Set(clientWarnings.filter((w) => w.severity === \"error\").map((w) => w.property));\r\n const warnProps = new Set(clientWarnings.filter((w) => w.severity === \"warning\").map((w) => w.property));\r\n const infoProps = new Set(clientWarnings.filter((w) => w.severity === \"info\").map((w) => w.property));\r\n\r\n const errors = errorProps.size;\r\n const warns = warnProps.size;\r\n const info = infoProps.size;\r\n\r\n // Score: 100 minus penalties, clamped to 0-100\r\n // Partial-support (info) items are not penalised — they mostly work\r\n const score = Math.max(0, Math.min(100, 100 - errors * 10 - warns * 3));\r\n\r\n result[client.id] = { score, errors, warnings: warns, info };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Filter warnings for a specific client. */\r\nexport function warningsForClient(warnings: CSSWarning[], clientId: string): CSSWarning[] {\r\n return warnings.filter(w => w.client === clientId);\r\n}\r\n\r\n/** Get only error-severity warnings. */\r\nexport function errorWarnings(warnings: CSSWarning[]): CSSWarning[] {\r\n return warnings.filter(w => w.severity === \"error\");\r\n}\r\n\r\n/** Get only structural fix warnings. */\r\nexport function structuralWarnings(warnings: CSSWarning[]): CSSWarning[] {\r\n return warnings.filter(w => w.fixType === \"structural\");\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport { parseColor, relativeLuminance } from \"./color-utils\";\r\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\r\nimport type { CSSWarning } from \"./types\";\r\nimport { getClient } from \"./clients\";\r\n\r\n/** Luminance threshold — colors above this are considered \"light\" */\r\nconst LIGHT_THRESHOLD = 0.7;\r\n/** Luminance threshold — colors below this are considered \"dark\" */\r\nconst DARK_THRESHOLD = 0.15;\r\n\r\n/**\r\n * Simulate dark mode rendering for an email.\r\n * Email clients apply dark mode differently:\r\n * - Some invert colors (Gmail Android)\r\n * - Some use prefers-color-scheme media query (Apple Mail)\r\n * - Some do partial inversion (Outlook.com)\r\n *\r\n * Last verified: 2026-03-04\r\n * Sources: Litmus dark mode guide, caniemail.com, Parcel dark mode guide\r\n */\r\nexport function simulateDarkMode(\r\n html: string,\r\n clientId: string\r\n): { html: string; warnings: CSSWarning[] } {\r\n if (!html || !html.trim()) {\r\n return { html: html || \"\", warnings: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Check for images with transparent backgrounds\r\n $(\"img\").each((_, el) => {\r\n const src = $(el).attr(\"src\") || \"\";\r\n if (src.endsWith(\".png\") || src.endsWith(\".svg\") || src.endsWith(\".webp\")) {\r\n warnings.push({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"Image with potentially transparent background may disappear in dark mode.\",\r\n suggestion:\r\n 'Add a background-color to the parent element, or use a non-transparent image format.',\r\n });\r\n }\r\n });\r\n\r\n // Determine dark mode behavior based on client\r\n switch (clientId) {\r\n case \"gmail-web\":\r\n // Gmail Web only darkens the UI chrome, not email content\r\n break;\r\n\r\n case \"gmail-ios\":\r\n // Gmail iOS applies full color inversion\r\n applyColorInversion($, \"full\");\r\n break;\r\n\r\n case \"gmail-android\":\r\n // Gmail Android applies partial color inversion\r\n applyColorInversion($, \"partial\");\r\n break;\r\n\r\n case \"outlook-web\":\r\n // Outlook.com applies its own dark mode with partial inversion\r\n // Also injects [data-ogsc] and [data-ogsb] attributes to store original colors\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook.com applies partial color inversion in dark mode.\",\r\n suggestion:\r\n \"Use [data-ogsc] or [data-ogsb] CSS attribute selectors to override Outlook.com's dark mode color changes.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-windows\":\r\n // New Outlook (web engine) applies partial inversion like Outlook.com\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook (New) applies partial color inversion in dark mode, similar to Outlook.com.\",\r\n suggestion:\r\n \"Use [data-ogsc] or [data-ogsb] CSS attribute selectors to override Outlook's dark mode color changes.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-ios\":\r\n case \"outlook-android\":\r\n // Outlook mobile apps apply partial inversion but do not inject [data-ogsc]/[data-ogsb] attributes\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n `${getClient(clientId)?.name ?? clientId} applies partial color inversion in dark mode.`,\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors. Outlook mobile does not support [data-ogsc]/[data-ogsb] attribute overrides.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-windows-legacy\":\r\n // Classic Outlook (Word engine) applies full color inversion in dark mode\r\n applyColorInversion($, \"full\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook Classic applies full color inversion in dark mode. Colors may shift unexpectedly.\",\r\n suggestion:\r\n \"Test with dark mode enabled. The Word rendering engine offers limited control over dark mode color shifts.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"apple-mail-macos\":\r\n case \"apple-mail-ios\":\r\n // Apple Mail respects prefers-color-scheme but does NOT force inversion when absent —\r\n // it leaves email content as-is (no color changes) unless the email opts in via\r\n // <meta name=\"color-scheme\" content=\"light dark\"> or prefers-color-scheme media queries.\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Apple Mail supports @media (prefers-color-scheme: dark). Without it, email content renders unchanged in dark mode.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"yahoo-mail\":\r\n // Yahoo Mail only darkens the UI chrome, not email content\r\n break;\r\n\r\n case \"samsung-mail\":\r\n // Samsung Mail supports prefers-color-scheme; apply partial inversion only if absent\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n applyColorInversion($, \"partial\");\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Samsung Mail supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"thunderbird\":\r\n // Thunderbird 140+ has Dark Message Mode; respects prefers-color-scheme\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n applyColorInversion($, \"full\");\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Thunderbird supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"hey-mail\":\r\n // HEY Mail respects prefers-color-scheme; simulate partial inversion\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"HEY Mail supports @media (prefers-color-scheme: dark). Add dark mode styles for the best experience.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"superhuman\":\r\n // Superhuman uses Blink and respects prefers-color-scheme\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Superhuman respects @media (prefers-color-scheme: dark). Many Superhuman users run in dark mode.\",\r\n suggestion:\r\n \"Add @media (prefers-color-scheme: dark) styles — Superhuman's power-user audience often prefers dark mode.\",\r\n });\r\n }\r\n break;\r\n }\r\n\r\n // Add dark mode wrapper styling\r\n $(\"body\").css(\"background-color\", \"#1a1a1a\");\r\n $(\"body\").css(\"color\", \"#e0e0e0\");\r\n\r\n return { html: $.html(), warnings };\r\n}\r\n\r\n/**\r\n * Invert a color value for dark mode.\r\n * Returns null if the color can't be parsed or shouldn't be inverted.\r\n */\r\nfunction invertColor(value: string, mode: \"full\" | \"partial\"): string | null {\r\n const parsed = parseColor(value);\r\n if (!parsed || parsed.a === 0) return null;\r\n\r\n const lum = relativeLuminance(parsed.r, parsed.g, parsed.b);\r\n\r\n if (mode === \"full\") {\r\n // Full inversion: invert both light and dark colors\r\n if (lum > LIGHT_THRESHOLD) {\r\n // Light color → dark\r\n return \"#1a1a1a\";\r\n }\r\n if (lum < DARK_THRESHOLD) {\r\n // Dark color → light\r\n return \"#e0e0e0\";\r\n }\r\n return null; // mid-range colors left alone\r\n } else {\r\n // Partial inversion: only invert very light backgrounds/very dark text\r\n if (lum > 0.85) {\r\n return \"#2d2d2d\";\r\n }\r\n if (lum < 0.05) {\r\n return \"#d4d4d4\";\r\n }\r\n return null;\r\n }\r\n}\r\n\r\n/** Color-bearing CSS properties */\r\nconst COLOR_PROPS = new Set([\r\n \"color\", \"background-color\", \"border-color\",\r\n \"border-top-color\", \"border-right-color\", \"border-bottom-color\", \"border-left-color\",\r\n \"outline-color\",\r\n]);\r\n\r\n/** Background shorthand — extract color portion */\r\nfunction extractBackgroundColor(value: string): string | null {\r\n // Simple heuristic: if background value starts with a color, extract it\r\n const trimmed = value.trim();\r\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"rgb\") || /^[a-z]+$/i.test(trimmed.split(/\\s/)[0])) {\r\n const firstToken = trimmed.split(/\\s/)[0];\r\n if (parseColor(firstToken)) return firstToken;\r\n }\r\n return null;\r\n}\r\n\r\nfunction applyColorInversion(\r\n $: cheerio.CheerioAPI,\r\n mode: \"full\" | \"partial\"\r\n): void {\r\n // Process inline styles using parseColor for accurate detection\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n let changed = false;\r\n\r\n props.forEach((value, prop) => {\r\n if (COLOR_PROPS.has(prop)) {\r\n const inverted = invertColor(value, mode);\r\n if (inverted) {\r\n props.set(prop, inverted);\r\n changed = true;\r\n }\r\n }\r\n // Handle background shorthand\r\n if (prop === \"background\") {\r\n const bgColor = extractBackgroundColor(value);\r\n if (bgColor) {\r\n const inverted = invertColor(bgColor, mode);\r\n if (inverted) {\r\n props.set(prop, value.replace(bgColor, inverted));\r\n changed = true;\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (changed) {\r\n $(el).attr(\"style\", serializeStyle(props));\r\n }\r\n });\r\n\r\n // Process <style> blocks\r\n $(\"style\").each((_, el) => {\r\n const cssText = $(el).text();\r\n try {\r\n const ast = csstree.parse(cssText, { parseCustomProperty: true });\r\n let modified = false;\r\n\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Declaration\") return;\r\n const prop = node.property.toLowerCase();\r\n if (!COLOR_PROPS.has(prop) && prop !== \"background\") return;\r\n\r\n const valueStr = csstree.generate(node.value);\r\n if (prop === \"background\") {\r\n const bgColor = extractBackgroundColor(valueStr);\r\n if (bgColor) {\r\n const inverted = invertColor(bgColor, mode);\r\n if (inverted) {\r\n const newValue = valueStr.replace(bgColor, inverted);\r\n node.value = csstree.parse(newValue, { context: \"value\" }) as csstree.Value;\r\n modified = true;\r\n }\r\n }\r\n } else {\r\n const inverted = invertColor(valueStr, mode);\r\n if (inverted) {\r\n node.value = csstree.parse(inverted, { context: \"value\" }) as csstree.Value;\r\n modified = true;\r\n }\r\n }\r\n },\r\n });\r\n\r\n if (modified) {\r\n $(el).text(csstree.generate(ast));\r\n }\r\n } catch {\r\n // If css-tree can't parse it, skip\r\n }\r\n });\r\n\r\n // Also handle bgcolor attributes on table elements\r\n $(\"[bgcolor]\").each((_, el) => {\r\n const bgcolor = $(el).attr(\"bgcolor\") || \"\";\r\n const inverted = invertColor(bgcolor, mode);\r\n if (inverted) {\r\n $(el).attr(\"bgcolor\", inverted);\r\n }\r\n });\r\n}\r\n","import type { CSSWarning, DiffResult } from \"./types\";\r\nimport { EMAIL_CLIENTS } from \"./clients\";\r\n\r\n/**\r\n * Compare two sets of analysis results to show what improved,\r\n * what regressed, and what stayed the same.\r\n */\r\nexport function diffResults(\r\n before: {\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n warnings: CSSWarning[];\r\n },\r\n after: {\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n warnings: CSSWarning[];\r\n }\r\n): DiffResult[] {\r\n const results: DiffResult[] = [];\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const scoreBefore = before.scores[client.id]?.score ?? 100;\r\n const scoreAfter = after.scores[client.id]?.score ?? 100;\r\n\r\n const beforeWarnings = before.warnings.filter((w) => w.client === client.id);\r\n const afterWarnings = after.warnings.filter((w) => w.client === client.id);\r\n\r\n // Key warnings by property+severity for comparison\r\n const beforeKeys = new Set(beforeWarnings.map(warningKey));\r\n const afterKeys = new Set(afterWarnings.map(warningKey));\r\n\r\n const fixed = beforeWarnings.filter((w) => !afterKeys.has(warningKey(w)));\r\n const introduced = afterWarnings.filter((w) => !beforeKeys.has(warningKey(w)));\r\n const unchanged = afterWarnings.filter((w) => beforeKeys.has(warningKey(w)));\r\n\r\n results.push({\r\n clientId: client.id,\r\n scoreBefore,\r\n scoreAfter,\r\n scoreDelta: scoreAfter - scoreBefore,\r\n fixed,\r\n introduced,\r\n unchanged,\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction warningKey(w: CSSWarning): string {\r\n return `${w.property}:${w.severity}`;\r\n}\r\n","import type { CSSWarning } from \"./types\";\r\nimport { getClient, EMAIL_CLIENTS } from \"./clients\";\r\n\r\nexport type ExportScope = \"all\" | \"current\";\r\n\r\nexport interface ExportPromptOptions {\r\n originalHtml: string;\r\n warnings: CSSWarning[];\r\n scores: Record<\r\n string,\r\n { score: number; errors: number; warnings: number; info: number }\r\n >;\r\n scope: ExportScope;\r\n selectedClientId?: string;\r\n format?: \"html\" | \"jsx\" | \"mjml\" | \"maizzle\";\r\n}\r\n\r\nexport function generateFixPrompt(options: ExportPromptOptions): string {\r\n const {\r\n originalHtml,\r\n warnings,\r\n scores,\r\n scope,\r\n selectedClientId,\r\n format = \"html\",\r\n } = options;\r\n\r\n const filteredWarnings =\r\n scope === \"current\" && selectedClientId\r\n ? warnings.filter((w) => w.client === selectedClientId)\r\n : warnings;\r\n\r\n const filteredScores =\r\n scope === \"current\" && selectedClientId\r\n ? { [selectedClientId]: scores[selectedClientId] }\r\n : scores;\r\n\r\n const clientCount = Object.keys(filteredScores).length;\r\n const errorCount = filteredWarnings.filter(\r\n (w) => w.severity === \"error\"\r\n ).length;\r\n const warnCount = filteredWarnings.filter(\r\n (w) => w.severity === \"warning\"\r\n ).length;\r\n const infoCount = filteredWarnings.filter(\r\n (w) => w.severity === \"info\"\r\n ).length;\r\n\r\n const clientLabel =\r\n scope === \"current\" && selectedClientId\r\n ? getClient(selectedClientId)?.name ?? selectedClientId\r\n : `${clientCount} email clients`;\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Context\r\n sections.push(\r\n `# Email Compatibility Fix Request\\n\\n` +\r\n `- **Format:** ${format.toUpperCase()}\\n` +\r\n `- **Scope:** ${clientLabel}\\n` +\r\n `- **Issues found:** ${errorCount} error${errorCount !== 1 ? \"s\" : \"\"}, ` +\r\n `${warnCount} warning${warnCount !== 1 ? \"s\" : \"\"}, ` +\r\n `${infoCount} info`\r\n );\r\n\r\n // 2. Original email code\r\n sections.push(\r\n `## Original Email Code\\n\\n` + `\\`\\`\\`${format}\\n${originalHtml}\\n\\`\\`\\``\r\n );\r\n\r\n // 3. Compatibility scores table\r\n const scoreEntries = Object.entries(filteredScores).filter(\r\n ([, v]) => v != null\r\n );\r\n if (scoreEntries.length > 0) {\r\n let table = `## Compatibility Scores\\n\\n`;\r\n table += `| Client | Score | Errors | Warnings | Info |\\n`;\r\n table += `|--------|------:|-------:|---------:|-----:|\\n`;\r\n for (const [clientId, data] of scoreEntries) {\r\n const name = getClient(clientId)?.name ?? clientId;\r\n table += `| ${name} | ${data.score} | ${data.errors} | ${data.warnings} | ${data.info} |\\n`;\r\n }\r\n sections.push(table.trimEnd());\r\n }\r\n\r\n // 4. Detected issues grouped by severity\r\n if (filteredWarnings.length > 0) {\r\n let issueSection = `## Detected Issues\\n`;\r\n\r\n const groups: [string, CSSWarning[]][] = [\r\n [\"Errors\", filteredWarnings.filter((w) => w.severity === \"error\")],\r\n [\"Warnings\", filteredWarnings.filter((w) => w.severity === \"warning\")],\r\n [\"Info\", filteredWarnings.filter((w) => w.severity === \"info\")],\r\n ];\r\n\r\n for (const [label, group] of groups) {\r\n if (group.length === 0) continue;\r\n issueSection += `\\n### ${label}\\n`;\r\n\r\n for (const w of group) {\r\n const clientName = getClient(w.client)?.name ?? w.client;\r\n const fixTypeLabel = w.fixType === \"structural\" ? \" [STRUCTURAL]\" : \"\";\r\n issueSection += `\\n- **${w.property}** (${clientName})${fixTypeLabel}: ${w.message}`;\r\n if (w.fixType === \"structural\") {\r\n issueSection += `\\n - **Fix type: structural** — CSS-only changes will NOT work. HTML restructuring required.`;\r\n }\r\n if (w.suggestion) {\r\n issueSection += `\\n - Suggestion: ${w.suggestion}`;\r\n }\r\n if (w.fix) {\r\n const fixLabel = w.fixIsGenericFallback && format !== \"html\"\r\n ? `Fix (generic HTML — adapt to ${format.toUpperCase()} syntax)`\r\n : \"Fix\";\r\n issueSection += `\\n - ${fixLabel}:`;\r\n issueSection += `\\n - Before: \\`${w.fix.before}\\``;\r\n issueSection += `\\n - After: \\`${w.fix.after}\\``;\r\n }\r\n }\r\n }\r\n\r\n sections.push(issueSection);\r\n }\r\n\r\n // 5. Instructions\r\n const formatInstructions: Record<string, string> = {\r\n jsx:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return complete fixed JSX code using @react-email/components. ` +\r\n `Use Row, Column, Container, Font, Img, Head, and Link components from ` +\r\n `@react-email/components wherever the fix suggests them. ` +\r\n `Keep all style values as camelCase JavaScript object properties (e.g. { backgroundColor: \"#fff\" }). ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the JSX structure and style props needed to fix the issues.`,\r\n mjml:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return complete fixed MJML markup. ` +\r\n `Use MJML-native elements (mj-section, mj-column, mj-text, mj-button, mj-font, mj-style, mj-raw) ` +\r\n `as indicated in the fixes. ` +\r\n `Ensure the result is valid MJML that compiles without errors. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the MJML structure and attributes needed to fix the issues.`,\r\n maizzle:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return the complete fixed Maizzle template. ` +\r\n `Use Tailwind CSS utility classes and Maizzle config settings as indicated in the fixes. ` +\r\n `Add MSO conditional comment table wrappers where needed for Outlook compatibility. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the Tailwind classes and HTML structure needed to fix the issues.`,\r\n html:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return the complete fixed HTML code. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the CSS and HTML attributes needed to fix the issues.`,\r\n };\r\n\r\n sections.push(\r\n `## Instructions\\n\\n` + (formatInstructions[format] ?? formatInstructions.html)\r\n );\r\n\r\n return sections.join(\"\\n\\n\");\r\n}\r\n","import { generateFixPrompt } from \"./export-prompt\";\r\nimport type { ExportPromptOptions } from \"./export-prompt\";\r\nimport type { CSSWarning } from \"./types\";\r\n\r\n/**\r\n * Heuristic token estimate: ~3.5 characters per token for mixed\r\n * HTML/CSS/code content. This is conservative (slightly over-counts)\r\n * to avoid surprise overruns.\r\n *\r\n * For precise counts, use Anthropic's `messages.countTokens()` API\r\n * or pass a custom `tokenCounter` callback to `estimateAiFixTokens()`.\r\n */\r\nconst CHARS_PER_TOKEN = 3.5;\r\n\r\n/**\r\n * Rough output-to-input ratio. The AI returns a fixed version of the\r\n * email, which is typically similar in size to the input HTML plus\r\n * some overhead for VML/table wrappers.\r\n */\r\nconst OUTPUT_RATIO = 1.3;\r\n\r\n/**\r\n * Default token overhead for the AI_FIX_SYSTEM_PROMPT exported from ai-fix.ts.\r\n * The system prompt is ~800 chars ≈ ~230 tokens. We use 250 as a safe default.\r\n * Consumers using a custom system prompt can override via `systemPromptTokens`.\r\n */\r\nconst DEFAULT_SYSTEM_PROMPT_TOKENS = 250;\r\n\r\nexport interface TokenEstimate {\r\n /** Estimated input tokens (prompt + system prompt) */\r\n inputTokens: number;\r\n /** Estimated output tokens (fixed code response) */\r\n estimatedOutputTokens: number;\r\n /** Raw character count of the prompt */\r\n promptCharacters: number;\r\n /** Character count of just the HTML being fixed */\r\n htmlCharacters: number;\r\n /** Total warnings included in the prompt */\r\n warningCount: number;\r\n /** How many warnings are structural (need HTML changes) */\r\n structuralCount: number;\r\n /** Whether warnings were truncated to fit within limits */\r\n truncated: boolean;\r\n /** Number of warnings removed during truncation */\r\n warningsRemoved: number;\r\n}\r\n\r\n/**\r\n * Extended return type from `estimateAiFixTokens()` that includes both the\r\n * token metrics AND the (potentially truncated) warnings list. The `warnings`\r\n * field is used internally by `generateAiFix()` to build the prompt with the\r\n * truncated set, but is NOT exposed in `AiFixResult.tokenEstimate` to keep\r\n * the public API clean.\r\n */\r\nexport interface TokenEstimateWithWarnings extends TokenEstimate {\r\n /** The warnings after smart truncation (may be shorter than the input list) */\r\n warnings: CSSWarning[];\r\n}\r\n\r\nexport interface EstimateOptions extends Omit<ExportPromptOptions, \"warnings\"> {\r\n warnings: CSSWarning[];\r\n /**\r\n * Maximum input tokens to target. If the estimated prompt exceeds\r\n * this, warnings will be truncated (info first, then duplicates).\r\n * Defaults to 16000 (~56KB of prompt text).\r\n */\r\n maxInputTokens?: number;\r\n /**\r\n * Optional precise token counter. If provided, it will be called\r\n * with the final prompt text for an exact count. Consumers can wire\r\n * this to `anthropic.messages.countTokens()`.\r\n */\r\n tokenCounter?: (text: string) => Promise<number> | number;\r\n /**\r\n * Token count for the system prompt. Added to the input token estimate\r\n * since the system prompt counts against the context window. Defaults\r\n * to 250 (matching the built-in AI_FIX_SYSTEM_PROMPT). Set to 0 if\r\n * not using a system prompt, or override for custom system prompts.\r\n */\r\n systemPromptTokens?: number;\r\n}\r\n\r\n/**\r\n * Estimate tokens for an AI fix prompt BEFORE making the API call.\r\n * Use this to show cost estimates, check limits, and decide whether\r\n * to proceed.\r\n *\r\n * @example\r\n * ```ts\r\n * const estimate = await estimateAiFixTokens({\r\n * originalHtml: html,\r\n * warnings,\r\n * scores,\r\n * scope: \"all\",\r\n * format: \"jsx\",\r\n * });\r\n *\r\n * console.log(`~${estimate.inputTokens} input tokens`);\r\n * console.log(`~${estimate.estimatedOutputTokens} output tokens`);\r\n * console.log(`Truncated: ${estimate.truncated}`);\r\n * ```\r\n */\r\nexport async function estimateAiFixTokens(\r\n options: EstimateOptions,\r\n): Promise<TokenEstimateWithWarnings> {\r\n const {\r\n maxInputTokens = 16000,\r\n tokenCounter,\r\n systemPromptTokens = DEFAULT_SYSTEM_PROMPT_TOKENS,\r\n ...rest\r\n } = options;\r\n\r\n // Reserve space for the system prompt when truncating\r\n const effectiveMaxTokens = maxInputTokens - systemPromptTokens;\r\n\r\n // Truncate warnings if needed to stay within token limits\r\n const { warnings: finalWarnings, truncated, removed } = truncateWarnings(\r\n rest.warnings,\r\n rest.originalHtml,\r\n effectiveMaxTokens,\r\n rest.scope,\r\n rest.selectedClientId,\r\n );\r\n\r\n const prompt = generateFixPrompt({ ...rest, warnings: finalWarnings });\r\n const promptChars = prompt.length;\r\n\r\n // Use precise counter if available, otherwise heuristic\r\n let promptTokens: number;\r\n if (tokenCounter) {\r\n const count = tokenCounter(prompt);\r\n promptTokens = count instanceof Promise ? await count : count;\r\n } else {\r\n promptTokens = heuristicTokenCount(prompt);\r\n }\r\n\r\n // Total input = user prompt + system prompt\r\n const inputTokens = promptTokens + systemPromptTokens;\r\n\r\n const estimatedOutputTokens = Math.ceil(\r\n heuristicTokenCount(rest.originalHtml) * OUTPUT_RATIO,\r\n );\r\n\r\n const structuralCount = finalWarnings.filter(\r\n (w) => w.fixType === \"structural\",\r\n ).length;\r\n\r\n return {\r\n inputTokens,\r\n estimatedOutputTokens,\r\n promptCharacters: promptChars,\r\n htmlCharacters: rest.originalHtml.length,\r\n warningCount: finalWarnings.length,\r\n structuralCount,\r\n truncated,\r\n warningsRemoved: removed,\r\n warnings: finalWarnings,\r\n };\r\n}\r\n\r\n/**\r\n * Quick synchronous heuristic token count. No deps, no API calls.\r\n * Accuracy: within ~10-15% of real Claude tokenizer for code/HTML.\r\n */\r\nexport function heuristicTokenCount(text: string): number {\r\n return Math.ceil(text.length / CHARS_PER_TOKEN);\r\n}\r\n\r\n/**\r\n * Intelligently trim warnings to keep the prompt within token limits.\r\n *\r\n * Truncation priority (least important removed first):\r\n * 1. Remove duplicate warnings (same property across different clients)\r\n * 2. Remove `info`-level warnings\r\n * 3. Remove `warning`-level warnings with CSS-only fixes (not structural)\r\n * 4. Trim long fix snippet before/after strings\r\n */\r\nfunction truncateWarnings(\r\n warnings: CSSWarning[],\r\n html: string,\r\n maxTokens: number,\r\n scope: string,\r\n selectedClientId?: string,\r\n): { warnings: CSSWarning[]; truncated: boolean; removed: number } {\r\n const originalCount = warnings.length;\r\n\r\n // Quick check: will the full prompt fit?\r\n const fullPromptEstimate = heuristicTokenCount(html) + heuristicTokenCount(\r\n JSON.stringify(warnings),\r\n ) + 500; // overhead for markdown structure\r\n\r\n if (fullPromptEstimate <= maxTokens) {\r\n return { warnings, truncated: false, removed: 0 };\r\n }\r\n\r\n let result = [...warnings];\r\n\r\n // Step 1: Deduplicate — keep one warning per property per severity,\r\n // preferring the most relevant client\r\n const seen = new Set<string>();\r\n result = result.filter((w) => {\r\n const key = `${w.property}:${w.severity}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 2: Remove info-level warnings\r\n result = result.filter((w) => w.severity !== \"info\");\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 3: Remove CSS-only warnings (keep structural ones)\r\n result = result.filter((w) => w.fixType === \"structural\" || w.severity === \"error\");\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 4: Trim fix snippets to just descriptions\r\n result = result.map((w) => ({\r\n ...w,\r\n fix: w.fix\r\n ? {\r\n ...w.fix,\r\n before: w.fix.before.length > 200\r\n ? w.fix.before.slice(0, 200) + \"\\n/* ... truncated ... */\"\r\n : w.fix.before,\r\n after: w.fix.after.length > 200\r\n ? w.fix.after.slice(0, 200) + \"\\n/* ... truncated ... */\"\r\n : w.fix.after,\r\n }\r\n : undefined,\r\n }));\r\n\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n}\r\n\r\nfunction estimateFits(\r\n warnings: CSSWarning[],\r\n html: string,\r\n maxTokens: number,\r\n): boolean {\r\n const estimate =\r\n heuristicTokenCount(html) +\r\n heuristicTokenCount(JSON.stringify(warnings)) +\r\n 500;\r\n return estimate <= maxTokens;\r\n}\r\n","import { generateFixPrompt } from \"./export-prompt\";\r\nimport type { ExportPromptOptions } from \"./export-prompt\";\r\nimport type { AiProvider, AiFixResult, CSSWarning } from \"./types\";\r\nimport { estimateAiFixTokens } from \"./token-utils\";\r\n\r\nexport interface GenerateAiFixOptions extends ExportPromptOptions {\r\n /** Callback that sends a prompt to an LLM and returns the response text. */\r\n provider: AiProvider;\r\n /**\r\n * Maximum input tokens for the prompt. If the estimated prompt exceeds\r\n * this, warnings are intelligently truncated (info first, then CSS-only\r\n * duplicates). Defaults to 16000.\r\n */\r\n maxInputTokens?: number;\r\n}\r\n\r\n/**\r\n * Generate an AI-powered fix for email compatibility issues.\r\n *\r\n * This uses the deterministic engine's analysis (warnings, scores, fix snippets)\r\n * to build a structured prompt, then delegates to an LLM for context-aware\r\n * structural fixes that static snippets cannot handle.\r\n *\r\n * The engine stays provider-agnostic — consumers pass their own `AiProvider`\r\n * callback (Anthropic SDK, Vercel AI SDK, OpenRouter, etc.).\r\n *\r\n * @example\r\n * ```ts\r\n * import Anthropic from \"@anthropic-ai/sdk\";\r\n * import { analyzeEmail, generateCompatibilityScore, generateAiFix } from \"@emailens/engine\";\r\n *\r\n * const anthropic = new Anthropic();\r\n * const warnings = analyzeEmail(html, \"jsx\");\r\n * const scores = generateCompatibilityScore(warnings);\r\n *\r\n * // 1. Check cost before calling\r\n * const estimate = await estimateAiFixTokens({\r\n * originalHtml: html, warnings, scores, scope: \"all\", format: \"jsx\",\r\n * });\r\n * console.log(`~${estimate.inputTokens} input tokens`);\r\n *\r\n * // 2. Generate the fix\r\n * const result = await generateAiFix({\r\n * originalHtml: html, warnings, scores, scope: \"all\", format: \"jsx\",\r\n * provider: async (prompt) => {\r\n * const msg = await anthropic.messages.create({\r\n * model: \"claude-sonnet-4-6\",\r\n * max_tokens: 8192,\r\n * system: AI_FIX_SYSTEM_PROMPT,\r\n * messages: [{ role: \"user\", content: prompt }],\r\n * });\r\n * return msg.content[0].type === \"text\" ? msg.content[0].text : \"\";\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function generateAiFix(\r\n options: GenerateAiFixOptions,\r\n): Promise<AiFixResult> {\r\n const { provider, maxInputTokens = 16000, ...promptOptions } = options;\r\n\r\n // Estimate tokens and apply smart truncation if needed\r\n const estimate = await estimateAiFixTokens({\r\n ...promptOptions,\r\n maxInputTokens,\r\n });\r\n\r\n // Use the truncated warnings from the estimate (not the original list)\r\n const truncatedWarnings = estimate.warnings;\r\n\r\n // Build the final prompt with the truncated warnings\r\n const prompt = generateFixPrompt({ ...promptOptions, warnings: truncatedWarnings });\r\n\r\n const structuralCount = countStructuralWarnings(\r\n truncatedWarnings,\r\n promptOptions.scope,\r\n promptOptions.selectedClientId,\r\n );\r\n\r\n // Strip the warnings list from the estimate to keep the public API clean\r\n const { warnings: _discarded, ...tokenEstimate } = estimate;\r\n\r\n const response = await provider(prompt);\r\n\r\n // Extract code from the response — the LLM may wrap it in a code fence\r\n const code = extractCode(response);\r\n\r\n return {\r\n code,\r\n prompt,\r\n targetedWarnings: tokenEstimate.warningCount,\r\n structuralCount,\r\n tokenEstimate,\r\n };\r\n}\r\n\r\n/**\r\n * System prompt for the AI fix provider. Consumers should pass this as\r\n * the `system` parameter to their LLM call for best results.\r\n */\r\nexport const AI_FIX_SYSTEM_PROMPT = `You are an expert email developer specializing in cross-client HTML email compatibility. You fix emails to render correctly across all email clients.\r\n\r\nRules:\r\n- Return ONLY the fixed code inside a single code fence. No explanations before or after.\r\n- Preserve all existing content, text, links, and visual design.\r\n- For structural issues (fixType: \"structural\"), you MUST restructure the HTML — CSS-only changes will not work.\r\n- Common structural patterns:\r\n - word-break/overflow-wrap unsupported → wrap text in <table><tr><td> with constrained width\r\n - display:flex/grid → convert to <table> layout (match the original column count and proportions)\r\n - border-radius in Outlook → use VML <v:roundrect> with <!--[if mso]> conditionals\r\n - background-image in Outlook → use VML <v:rect> with <v:fill>\r\n - max-width in Outlook → wrap in <!--[if mso]><table width=\"N\"> conditional\r\n - position:absolute → use <table> cells for layout\r\n - <svg> → replace with <img> pointing to a hosted PNG\r\n- For CSS-only issues (fixType: \"css\"), swap properties or add fallbacks.\r\n- Apply ALL fixes from the issues list — do not skip any.\r\n- Use the framework syntax specified (JSX/MJML/Maizzle/HTML).\r\n- For JSX: use camelCase style props, React Email components, and proper TypeScript types.\r\n- For MJML: use mj-* elements and attributes.\r\n- For Maizzle: use Tailwind CSS classes.`;\r\n\r\nfunction countStructuralWarnings(\r\n warnings: CSSWarning[],\r\n scope: string,\r\n selectedClientId?: string,\r\n): number {\r\n const filtered =\r\n scope === \"current\" && selectedClientId\r\n ? warnings.filter((w) => w.client === selectedClientId)\r\n : warnings;\r\n return filtered.filter((w) => w.fixType === \"structural\").length;\r\n}\r\n\r\n/**\r\n * Extract code from an LLM response that may contain markdown code fences.\r\n * If multiple fences exist, returns the largest one (most likely the full\r\n * fixed email rather than a small snippet).\r\n */\r\nfunction extractCode(response: string): string {\r\n // Find all code fences and pick the largest one\r\n const fencePattern = /```(?:[\\w]*)\\n([\\s\\S]*?)```/g;\r\n let largest: string | null = null;\r\n\r\n let match: RegExpExecArray | null;\r\n while ((match = fencePattern.exec(response)) !== null) {\r\n const content = match[1].trim();\r\n if (largest === null || content.length > largest.length) {\r\n largest = content;\r\n }\r\n }\r\n\r\n if (largest !== null) {\r\n return largest;\r\n }\r\n\r\n // If no code fence, return the whole response trimmed\r\n return response.trim();\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { SpamAnalysisOptions, SpamIssue, SpamReport } from \"./types\";\r\n\r\nconst SPAM_TRIGGER_PHRASES = [\r\n \"act now\", \"limited time\", \"click here\", \"buy now\", \"order now\",\r\n \"don't miss\", \"don't delete\", \"urgent\", \"congratulations\",\r\n \"you've been selected\", \"you've won\", \"winner\", \"free gift\",\r\n \"risk free\", \"no obligation\", \"no cost\", \"no fees\",\r\n \"100% free\", \"100% satisfied\", \"double your money\",\r\n \"earn extra cash\", \"make money\", \"cash bonus\",\r\n \"as seen on\", \"incredible deal\", \"lowest price\",\r\n \"once in a lifetime\", \"special promotion\", \"this isn't spam\",\r\n \"what are you waiting for\", \"apply now\", \"sign up free\",\r\n \"cancel anytime\", \"no strings attached\", \"no questions asked\",\r\n];\r\n\r\n// Fix #6: Pre-compiled word-boundary regexes for spam phrases\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\nconst SPAM_PHRASE_PATTERNS: Map<string, RegExp> = new Map(\r\n SPAM_TRIGGER_PHRASES.map((phrase) => [\r\n phrase,\r\n new RegExp(\"\\\\b\" + escapeRegex(phrase) + \"\\\\b\"),\r\n ]),\r\n);\r\n\r\nconst URL_SHORTENERS = [\r\n \"bit.ly\", \"tinyurl.com\", \"t.co\", \"goo.gl\", \"ow.ly\",\r\n \"is.gd\", \"buff.ly\", \"rebrand.ly\", \"bl.ink\", \"short.io\",\r\n \"cutt.ly\", \"rb.gy\",\r\n];\r\n\r\n// Fix #2: Known ESP tracking domains\r\nconst ESP_TRACKING_DOMAINS = [\r\n \"mailchi.mp\", \"list-manage.com\", \"click.mailchimp.com\",\r\n \"sendgrid.net\", \"click.sendgrid.net\", \"ct.sendgrid.net\",\r\n \"click.klaviyomail.com\", \"trk.klaviyo.com\",\r\n \"click.hubspotemail.net\",\r\n \"links.iterable.com\", \"track.customer.io\",\r\n \"go.pardot.com\", \"mailgun.org\",\r\n \"em.salesforce.com\", \"click.marketingcloud.com\",\r\n \"r.mail.yahoo.com\", \"t.dripemail2.com\",\r\n];\r\n\r\n// Fix #4: Transactional email signal phrases\r\nconst TRANSACTIONAL_SIGNALS = [\r\n \"reset your password\", \"password reset\",\r\n \"verify your email\", \"email verification\",\r\n \"order confirmation\", \"your order\",\r\n \"your receipt\", \"purchase confirmation\",\r\n \"verification code\", \"confirm your account\",\r\n \"your invoice\", \"shipping confirmation\",\r\n \"account activation\", \"security alert\",\r\n];\r\n\r\nconst TRANSACTIONAL_SIGNAL_PATTERN = new RegExp(\r\n TRANSACTIONAL_SIGNALS.map(escapeRegex).join(\"|\"),\r\n \"i\",\r\n);\r\n\r\n// OTP-like pattern: standalone 4-8 digit codes\r\nconst OTP_PATTERN = /\\b\\d{4,8}\\b/;\r\n\r\nconst WEIGHTS: Record<string, number> = {\r\n \"caps-ratio\": 15,\r\n \"excessive-punctuation\": 10,\r\n \"spam-phrases\": 5,\r\n \"missing-unsubscribe\": 15,\r\n \"hidden-text\": 20,\r\n \"url-shortener\": 10,\r\n \"image-only\": 20,\r\n \"high-image-ratio\": 10,\r\n \"deceptive-link\": 15,\r\n \"all-caps-subject\": 10,\r\n \"missing-physical-address\": 8,\r\n \"missing-one-click-unsubscribe\": 5,\r\n};\r\n\r\nfunction extractVisibleText($: cheerio.CheerioAPI): string {\r\n const clone = $.root().clone();\r\n clone.find(\"script, style, head\").remove();\r\n return clone.text().replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction checkCapsRatio(text: string): SpamIssue | null {\r\n const words = text.split(/\\s+/).filter((w) => w.length >= 3);\r\n if (words.length < 5) return null;\r\n\r\n const capsWords = words.filter((w) => w === w.toUpperCase() && /[A-Z]/.test(w));\r\n const ratio = capsWords.length / words.length;\r\n\r\n if (ratio > 0.2) {\r\n return {\r\n rule: \"caps-ratio\",\r\n severity: \"warning\",\r\n message: `${Math.round(ratio * 100)}% of words are ALL CAPS — spam filters flag excessive capitalization.`,\r\n detail: `Found ${capsWords.length} of ${words.length} words in all caps.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #5: Scale punctuation threshold by text length, exclude $digit patterns\r\nfunction checkExcessivePunctuation(text: string): SpamIssue | null {\r\n const exclamations = (text.match(/!/g) || []).length;\r\n // Only count $ NOT followed by a digit (skip price patterns like $29)\r\n const dollars = (text.match(/\\$(?!\\d)/g) || []).length;\r\n const total = exclamations + dollars;\r\n\r\n const threshold = Math.max(5, Math.floor(text.length / 200));\r\n\r\n if (total > threshold) {\r\n return {\r\n rule: \"excessive-punctuation\",\r\n severity: \"warning\",\r\n message: `Excessive special characters detected (${exclamations} \"!\", ${dollars} \"$\") — common spam trigger.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #6: Word-boundary matching for spam phrases\r\nfunction checkSpamPhrases(text: string): SpamIssue[] {\r\n const lower = text.toLowerCase();\r\n const found: SpamIssue[] = [];\r\n\r\n for (const [phrase, pattern] of SPAM_PHRASE_PATTERNS) {\r\n if (pattern.test(lower)) {\r\n found.push({\r\n rule: \"spam-phrases\",\r\n severity: \"info\",\r\n message: `Contains spam trigger phrase: \"${phrase}\"`,\r\n });\r\n }\r\n }\r\n return found;\r\n}\r\n\r\n// Fix #4: Transactional exemption + options API for unsubscribe\r\nfunction checkUnsubscribe(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Explicit transactional type → skip entirely\r\n if (options?.emailType === \"transactional\") return null;\r\n\r\n // List-Unsubscribe header provided → satisfied\r\n if (options?.listUnsubscribeHeader?.trim()) return null;\r\n\r\n let hasUnsubscribe = false;\r\n\r\n $(\"a\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const linkText = $(el).text().toLowerCase();\r\n if (\r\n linkText.includes(\"unsubscribe\") ||\r\n href.toLowerCase().includes(\"unsubscribe\") ||\r\n linkText.includes(\"opt out\") ||\r\n linkText.includes(\"opt-out\") ||\r\n href.toLowerCase().includes(\"opt-out\") ||\r\n href.toLowerCase().includes(\"optout\")\r\n ) {\r\n hasUnsubscribe = true;\r\n }\r\n });\r\n\r\n if (!hasUnsubscribe) {\r\n // Auto-detect transactional signals\r\n const lower = text.toLowerCase();\r\n const signalMatches = TRANSACTIONAL_SIGNALS.filter((s) =>\r\n lower.includes(s.toLowerCase()),\r\n );\r\n const hasOtp = OTP_PATTERN.test(text);\r\n const signalCount = signalMatches.length + (hasOtp ? 1 : 0);\r\n\r\n if (signalCount >= 2) {\r\n // Looks transactional — downgrade to info instead of error\r\n return {\r\n rule: \"missing-unsubscribe\",\r\n severity: \"info\",\r\n message:\r\n \"No unsubscribe link found, but email appears transactional — may not be required.\",\r\n detail: `Detected transactional signals: ${signalMatches.join(\", \")}${hasOtp ? \", OTP code\" : \"\"}`,\r\n };\r\n }\r\n\r\n return {\r\n rule: \"missing-unsubscribe\",\r\n severity: \"error\",\r\n message:\r\n \"No unsubscribe link found — required by CAN-SPAM and GDPR. Most spam filters penalize this.\",\r\n detail: 'Add an <a> link with \"unsubscribe\" text or href.',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #1: Preheader exemption for hidden text\r\nconst PREHEADER_ACCESSORY_PATTERNS = [\r\n /max-height\\s*:\\s*0/,\r\n /overflow\\s*:\\s*hidden/,\r\n /mso-hide\\s*:\\s*all/,\r\n /opacity\\s*:\\s*0/,\r\n /color\\s*:\\s*transparent/,\r\n /line-height\\s*:\\s*0/,\r\n];\r\n\r\n/**\r\n * Zero-width and other invisible characters. React Email's <Preview> (and most\r\n * hand-rolled preheaders) pad the preheader with hundreds of these so that body\r\n * copy does not leak into the inbox snippet.\r\n */\r\nconst INVISIBLE_CHARS = /[-]/g;\r\n\r\nfunction isLikelyPreheader(\r\n style: string,\r\n text: string,\r\n): boolean {\r\n // Measure VISIBLE length. The padding above is not text a human or a spam\r\n // filter ever sees, but counting it blew past this ceiling — which meant the\r\n // standard preheader of every React Email was reported as \"major spam filter\r\n // red flag\". The ceiling itself still matters: it stops someone hiding a wall\r\n // of keywords behind preheader-shaped CSS, so strip the padding, don't raise\r\n // the limit.\r\n if (text.replace(INVISIBLE_CHARS, \"\").trim().length > 200) return false;\r\n\r\n // Exempt only when preheader-specific accessory patterns are present\r\n return PREHEADER_ACCESSORY_PATTERNS.some((p) => p.test(style));\r\n}\r\n\r\nfunction checkHiddenText($: cheerio.CheerioAPI): SpamIssue | null {\r\n let found = false;\r\n let detail = \"\";\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = ($(el).attr(\"style\") || \"\").toLowerCase();\r\n const text = $(el).text().trim();\r\n if (!text) return;\r\n\r\n // visibility:hidden is always flagged — no legitimate preheader use\r\n if (/visibility\\s*:\\s*hidden/.test(style)) {\r\n found = true;\r\n detail = \"visibility:hidden on element with text content\";\r\n return false;\r\n }\r\n\r\n if (/font-size\\s*:\\s*0(?:px|em|rem|pt)?(?:\\s|;|$)/.test(style)) {\r\n if (!isLikelyPreheader(style, text)) {\r\n found = true;\r\n detail = \"font-size:0 on element with text content\";\r\n return false;\r\n }\r\n }\r\n\r\n if (/display\\s*:\\s*none/.test(style)) {\r\n if (!isLikelyPreheader(style, text)) {\r\n found = true;\r\n detail = \"display:none on element with text content\";\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n if (found) {\r\n return {\r\n rule: \"hidden-text\",\r\n severity: \"error\",\r\n message: \"Hidden text detected — major spam filter red flag.\",\r\n detail,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #3: Hostname matching instead of substring for URL shorteners\r\nfunction checkUrlShorteners($: cheerio.CheerioAPI): SpamIssue[] {\r\n const issues: SpamIssue[] = [];\r\n const seen = new Set<string>();\r\n\r\n $(\"a[href]\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n let hostname: string;\r\n try {\r\n hostname = new URL(href).hostname.toLowerCase();\r\n } catch {\r\n return; // malformed URL, skip\r\n }\r\n\r\n for (const shortener of URL_SHORTENERS) {\r\n if (\r\n (hostname === shortener || hostname.endsWith(\".\" + shortener)) &&\r\n !seen.has(shortener)\r\n ) {\r\n seen.add(shortener);\r\n issues.push({\r\n rule: \"url-shortener\",\r\n severity: \"warning\",\r\n message: `URL shortener detected (${shortener}) — spam filters distrust shortened links.`,\r\n detail: href,\r\n });\r\n }\r\n }\r\n });\r\n return issues;\r\n}\r\n\r\n// Fix #7: Accept pre-extracted text to avoid duplicate extractVisibleText call\r\nfunction checkImageToTextRatio(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n): SpamIssue | null {\r\n const images = $(\"img\").length;\r\n if (images === 0) return null;\r\n\r\n if (text.length < 50 && images > 0) {\r\n return {\r\n rule: \"image-only\",\r\n severity: \"error\",\r\n message: `Image-heavy email with almost no text (${text.length} chars, ${images} images) — likely to be flagged as spam or clipped.`,\r\n };\r\n }\r\n\r\n const ratio = images / (text.length / 100);\r\n if (ratio > 0.5 && images > 3) {\r\n return {\r\n rule: \"high-image-ratio\",\r\n severity: \"warning\",\r\n message: `High image-to-text ratio (${images} images for ${text.length} chars of text) — consider adding more text content.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #2: ESP tracking domain allowlist + encoded destination heuristic\r\nfunction isEspTrackingDomain(hostname: string): boolean {\r\n return ESP_TRACKING_DOMAINS.some(\r\n (esp) => hostname === esp || hostname.endsWith(\".\" + esp),\r\n );\r\n}\r\n\r\nfunction hasEncodedDestination(href: string, textDomain: string): boolean {\r\n // Check if the href path/query contains the text domain URL-encoded\r\n const encoded = encodeURIComponent(textDomain);\r\n return href.includes(encoded) || href.includes(textDomain);\r\n}\r\n\r\nfunction checkDeceptiveLinks($: cheerio.CheerioAPI): SpamIssue[] {\r\n const issues: SpamIssue[] = [];\r\n\r\n $(\"a[href]\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const text = $(el).text().trim();\r\n\r\n if (/^https?:\\/\\/\\S+/i.test(text) || /^www\\.\\S+/i.test(text)) {\r\n try {\r\n const textDomain = new URL(\r\n text.startsWith(\"www.\") ? `https://${text}` : text,\r\n ).hostname.replace(/^www\\./, \"\");\r\n const hrefDomain = new URL(href).hostname.replace(/^www\\./, \"\");\r\n\r\n if (textDomain !== hrefDomain) {\r\n // Skip known ESP tracking domains\r\n if (isEspTrackingDomain(hrefDomain)) return;\r\n\r\n // Skip if href contains encoded destination (redirect wrapper)\r\n if (hasEncodedDestination(href, textDomain)) return;\r\n\r\n issues.push({\r\n rule: \"deceptive-link\",\r\n severity: \"error\",\r\n message: `Link text shows \"${textDomain}\" but links to \"${hrefDomain}\" — phishing red flag.`,\r\n detail: `Text: ${text}\\nHref: ${href}`,\r\n });\r\n }\r\n } catch {\r\n // Malformed URL, skip\r\n }\r\n }\r\n });\r\n return issues;\r\n}\r\n\r\n// CAN-SPAM physical address detection — US-centric patterns\r\nconst STREET_ADDRESS_PATTERN = /\\b\\d{1,5}\\s+[A-Za-z]+\\s+(St(reet)?|Ave(nue)?|Blvd|Boulevard|Dr(ive)?|Rd|Road|Ln|Lane|Way|Ct|Court|Pl(ace)?|Pkwy|Parkway|Cir(cle)?|Terr(ace)?|Loop)\\b/i;\r\nconst PO_BOX_PATTERN = /\\bP\\.?\\s*O\\.?\\s*Box\\s+\\d+/i;\r\nconst ZIP_CODE_PATTERN = /\\b\\d{5}(-\\d{4})?\\b/;\r\nconst ADDRESS_CLASS_PATTERN = /address|mailing|postal|footer-address|physical-address/i;\r\n\r\nfunction checkPhysicalAddress(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Transactional emails are exempt\r\n if (options?.emailType === \"transactional\") return null;\r\n\r\n // Check visible text for street address patterns\r\n if (STREET_ADDRESS_PATTERN.test(text) && ZIP_CODE_PATTERN.test(text)) return null;\r\n if (PO_BOX_PATTERN.test(text) && ZIP_CODE_PATTERN.test(text)) return null;\r\n\r\n // Check for elements with address-related class names\r\n let foundByClass = false;\r\n $(\"[class]\").each((_, el) => {\r\n const cls = $(el).attr(\"class\") || \"\";\r\n if (ADDRESS_CLASS_PATTERN.test(cls)) {\r\n const elText = $(el).text().trim();\r\n if (elText.length > 5) {\r\n foundByClass = true;\r\n return false; // break\r\n }\r\n }\r\n });\r\n if (foundByClass) return null;\r\n\r\n // Check <address> element\r\n if ($(\"address\").length > 0 && $(\"address\").text().trim().length > 5) return null;\r\n\r\n return {\r\n rule: \"missing-physical-address\",\r\n severity: \"warning\",\r\n message: \"No physical mailing address detected — required by CAN-SPAM for marketing emails.\",\r\n detail: \"Include a street address or P.O. Box in the email footer.\",\r\n };\r\n}\r\n\r\nfunction checkOneClickUnsubscribe(\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Only relevant when List-Unsubscribe header is present\r\n if (!options?.listUnsubscribeHeader?.trim()) return null;\r\n\r\n // RFC 8058 requires List-Unsubscribe-Post header alongside List-Unsubscribe\r\n if (!options?.listUnsubscribePostHeader?.trim()) {\r\n return {\r\n rule: \"missing-one-click-unsubscribe\",\r\n severity: \"warning\",\r\n message: \"List-Unsubscribe header present but missing List-Unsubscribe-Post header (RFC 8058). Gmail and Yahoo require one-click unsubscribe.\",\r\n detail: 'Add \"List-Unsubscribe-Post: List-Unsubscribe=One-Click\" header.',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkAllCapsTitle($: cheerio.CheerioAPI): SpamIssue | null {\r\n const title = $(\"title\").text().trim();\r\n if (title.length > 5 && title === title.toUpperCase() && /[A-Z]/.test(title)) {\r\n return {\r\n rule: \"all-caps-subject\",\r\n severity: \"warning\",\r\n message: \"Email title/subject is ALL CAPS — common spam indicator.\",\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Analyze a pre-parsed email DOM for spam indicators.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeSpamFromDom(\r\n $: cheerio.CheerioAPI,\r\n options?: SpamAnalysisOptions,\r\n): SpamReport {\r\n const text = extractVisibleText($);\r\n const issues: SpamIssue[] = [];\r\n\r\n const capsIssue = checkCapsRatio(text);\r\n if (capsIssue) issues.push(capsIssue);\r\n\r\n const punctIssue = checkExcessivePunctuation(text);\r\n if (punctIssue) issues.push(punctIssue);\r\n\r\n issues.push(...checkSpamPhrases(text));\r\n\r\n const unsubIssue = checkUnsubscribe($, text, options);\r\n if (unsubIssue) issues.push(unsubIssue);\r\n\r\n const hiddenIssue = checkHiddenText($);\r\n if (hiddenIssue) issues.push(hiddenIssue);\r\n\r\n issues.push(...checkUrlShorteners($));\r\n\r\n const imageRatioIssue = checkImageToTextRatio($, text);\r\n if (imageRatioIssue) issues.push(imageRatioIssue);\r\n\r\n issues.push(...checkDeceptiveLinks($));\r\n\r\n const capsTitle = checkAllCapsTitle($);\r\n if (capsTitle) issues.push(capsTitle);\r\n\r\n const addressIssue = checkPhysicalAddress($, text, options);\r\n if (addressIssue) issues.push(addressIssue);\r\n\r\n const oneClickIssue = checkOneClickUnsubscribe(options);\r\n if (oneClickIssue) issues.push(oneClickIssue);\r\n\r\n // Calculate score\r\n let penalty = 0;\r\n const seenRules = new Map<string, number>();\r\n\r\n for (const issue of issues) {\r\n const count = (seenRules.get(issue.rule) || 0) + 1;\r\n seenRules.set(issue.rule, count);\r\n const weight = WEIGHTS[issue.rule] || 5;\r\n\r\n if (issue.rule === \"spam-phrases\") {\r\n if (count <= 5) penalty += weight;\r\n } else if (issue.rule === \"url-shortener\" || issue.rule === \"deceptive-link\") {\r\n if (count <= 2) penalty += weight;\r\n } else {\r\n if (issue.severity !== \"info\") {\r\n penalty += weight;\r\n }\r\n }\r\n }\r\n\r\n const score = Math.max(0, Math.min(100, 100 - penalty));\r\n const level: SpamReport[\"level\"] =\r\n score >= 70 ? \"low\" : score >= 40 ? \"medium\" : \"high\";\r\n\r\n return { score, level, issues };\r\n}\r\n\r\n/**\r\n * Analyze an HTML email for content hygiene issues.\r\n *\r\n * Returns a 0-100 score (100 = clean, 0 = many issues) and an array\r\n * of issues found. Uses heuristic rules modeled after common spam\r\n * filter triggers (CAN-SPAM, GDPR, SpamAssassin patterns).\r\n *\r\n * **Important:** This is heuristic content analysis, NOT a real spam\r\n * filter. It checks for common anti-patterns that trigger spam filters\r\n * but cannot predict actual inbox placement. For real spam testing,\r\n * use SpamAssassin integration or a dedicated service like GlockApps.\r\n */\r\nexport function analyzeSpam(\r\n html: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamReport {\r\n if (!html || !html.trim()) {\r\n return { score: 100, level: \"low\", issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeSpamFromDom($, options);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport type { LinkIssue, LinkReport } from \"./types\";\r\nimport { GENERIC_LINK_TEXT, MAX_HTML_SIZE } from \"./constants\";\r\n\r\nfunction classifyHref(href: string): string {\r\n if (!href || !href.trim()) return \"empty\";\r\n const h = href.trim().toLowerCase();\r\n if (h.startsWith(\"https://\")) return \"https\";\r\n if (h.startsWith(\"http://\")) return \"http\";\r\n if (h.startsWith(\"mailto:\")) return \"mailto\";\r\n if (h.startsWith(\"tel:\")) return \"tel\";\r\n if (h.startsWith(\"#\")) return \"anchor\";\r\n if (h.startsWith(\"javascript:\")) return \"javascript\";\r\n if (h.startsWith(\"//\")) return \"protocol-relative\";\r\n return \"other\";\r\n}\r\n\r\nfunction isPlaceholderHref(href: string): boolean {\r\n const h = href.trim().toLowerCase();\r\n return h === \"#\" || h === \"\" || h === \"javascript:void(0)\" || h === \"javascript:;\";\r\n}\r\n\r\n/**\r\n * Validate links from a pre-parsed email DOM.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function validateLinksFromDom($: cheerio.CheerioAPI): LinkReport {\r\n const issues: LinkIssue[] = [];\r\n const breakdown = { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 };\r\n\r\n const links = $(\"a\");\r\n const totalLinks = links.length;\r\n\r\n if (totalLinks === 0) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"no-links\",\r\n message: \"Email contains no links\",\r\n });\r\n return { totalLinks: 0, issues, breakdown };\r\n }\r\n\r\n const hrefCounts = new Map<string, number>();\r\n\r\n links.each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const text = $(el).text().trim();\r\n const category = classifyHref(href);\r\n\r\n // Count breakdown\r\n switch (category) {\r\n case \"https\": breakdown.https++; break;\r\n case \"http\": breakdown.http++; break;\r\n case \"mailto\": breakdown.mailto++; break;\r\n case \"tel\": breakdown.tel++; break;\r\n case \"anchor\": breakdown.anchor++; break;\r\n case \"javascript\": breakdown.javascript++; break;\r\n case \"protocol-relative\": breakdown.protocolRelative++; break;\r\n default: breakdown.other++; break;\r\n }\r\n\r\n // Track href occurrences for duplicate detection\r\n if (href && href.trim()) {\r\n hrefCounts.set(href, (hrefCounts.get(href) || 0) + 1);\r\n }\r\n\r\n // Empty or missing href\r\n if (!href || !href.trim()) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-href\",\r\n message: \"Link has no href attribute\",\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // javascript: protocol (not placeholder)\r\n if (category === \"javascript\" && !isPlaceholderHref(href)) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"javascript-href\",\r\n message: \"Link uses javascript: protocol\",\r\n href: href.slice(0, 100),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // Placeholder href\r\n if (isPlaceholderHref(href)) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"placeholder-href\",\r\n message: \"Link has a placeholder href (# or javascript:void)\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // HTTP instead of HTTPS\r\n if (category === \"http\") {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"insecure-link\",\r\n message: \"Link uses HTTP instead of HTTPS\",\r\n href: href.slice(0, 120),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Protocol-relative URL\r\n if (category === \"protocol-relative\") {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"protocol-relative\",\r\n message: \"Protocol-relative URL may break in email clients — use https:// explicitly\",\r\n href: href.slice(0, 120),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Generic link text\r\n if (text && GENERIC_LINK_TEXT.has(text.toLowerCase())) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"generic-link-text\",\r\n message: `Link text \"${text}\" is vague — use descriptive text for accessibility and engagement`,\r\n href: href.slice(0, 120),\r\n text,\r\n });\r\n }\r\n\r\n // Link with no text and no aria-label\r\n if (!text && !$(el).attr(\"aria-label\") && !$(el).find(\"img[alt]\").length) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-link-text\",\r\n message: \"Link has no visible text or aria-label\",\r\n href: href.slice(0, 120),\r\n });\r\n }\r\n\r\n // mailto without address\r\n if (category === \"mailto\" && href.trim().toLowerCase() === \"mailto:\") {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-mailto\",\r\n message: \"mailto: link has no email address\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // tel: without number\r\n if (category === \"tel\" && href.trim().toLowerCase() === \"tel:\") {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-tel\",\r\n message: \"tel: link has no phone number\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Very long URL\r\n if (href.length > 2000) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"long-url\",\r\n message: \"URL exceeds 2000 characters — may be truncated by some email clients\",\r\n href: href.slice(0, 120) + \"...\",\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n });\r\n\r\n // Broken anchor detection — #id links where no matching id exists\r\n links.each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const trimmed = href.trim();\r\n if (trimmed.startsWith(\"#\") && trimmed.length > 1) {\r\n const targetId = trimmed.slice(1);\r\n const target = $(`[id=\"${targetId}\"]`);\r\n if (target.length === 0) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"broken-anchor\",\r\n message: `Anchor link \"${trimmed}\" points to an element that does not exist`,\r\n href: trimmed,\r\n text: $(el).text().trim().slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Duplicate link detection\r\n for (const [href, count] of hrefCounts) {\r\n if (count > 5) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"duplicate-links\",\r\n message: `URL appears ${count} times — consider consolidating`,\r\n href: href.slice(0, 120),\r\n });\r\n }\r\n }\r\n\r\n return { totalLinks, issues, breakdown };\r\n}\r\n\r\n/**\r\n * Extract and validate all links from an HTML email.\r\n *\r\n * Performs static analysis only (no network requests). Checks for\r\n * empty/placeholder hrefs, javascript: protocol, insecure HTTP,\r\n * generic link text, accessibility issues, and more.\r\n */\r\nexport function validateLinks(html: string): LinkReport {\r\n if (!html || !html.trim()) {\r\n return {\r\n totalLinks: 0,\r\n issues: [],\r\n breakdown: { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 },\r\n };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return validateLinksFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport type { AccessibilityIssue, AccessibilityReport } from \"./types\";\r\nimport { GENERIC_LINK_TEXT, MAX_HTML_SIZE } from \"./constants\";\r\nimport { getStyleValue } from \"./style-utils\";\r\nimport { parseColor, relativeLuminance, contrastRatio, wcagGrade, alphaBlend } from \"./color-utils\";\r\n\r\n// Per-rule penalty caps — only the score penalty is capped, all issues are still reported\r\nconst RULE_PENALTY_CAPS: Record<string, number> = {\r\n \"img-missing-alt\": 3,\r\n \"link-generic-text\": 3,\r\n \"link-no-accessible-name\": 3,\r\n \"table-missing-role\": 2,\r\n \"low-contrast\": 3,\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nfunction describeElement($: cheerio.CheerioAPI, el: any): string {\r\n const tag = (el.tagName as string)?.toLowerCase() || \"unknown\";\r\n const src = $(el).attr(\"src\");\r\n const href = $(el).attr(\"href\");\r\n if (src) return `<${tag} src=\"${src.slice(0, 60)}${src.length > 60 ? \"...\" : \"\"}\">`;\r\n if (href) return `<${tag} href=\"${href.slice(0, 60)}${href.length > 60 ? \"...\" : \"\"}\">`;\r\n const text = $(el).text().trim().slice(0, 40);\r\n if (text) return `<${tag}>${text}${$(el).text().trim().length > 40 ? \"...\" : \"\"}</${tag}>`;\r\n return `<${tag}>`;\r\n}\r\n\r\nfunction checkLangAttribute($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n const lang = $(\"html\").attr(\"lang\");\r\n if (!lang || !lang.trim()) {\r\n return {\r\n severity: \"error\",\r\n rule: \"missing-lang\",\r\n message: \"Missing lang attribute on <html> element\",\r\n details: 'Screen readers use the lang attribute to determine pronunciation. Add lang=\"en\" (or appropriate language code).',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkTitle($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n const title = $(\"title\").text().trim();\r\n if (!title) {\r\n return {\r\n severity: \"warning\",\r\n rule: \"missing-title\",\r\n message: \"Missing or empty <title> element\",\r\n details: \"The <title> helps screen readers identify the email content.\",\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkImageAlt($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"img\").each((_, el) => {\r\n const alt = $(el).attr(\"alt\");\r\n const src = $(el).attr(\"src\") || \"\";\r\n const role = $(el).attr(\"role\");\r\n\r\n if (role === \"presentation\" || role === \"none\") return;\r\n\r\n if (alt === undefined) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"img-missing-alt\",\r\n message: \"Image missing alt attribute\",\r\n element: describeElement($, el),\r\n details: 'Every image must have an alt attribute. Use alt=\"\" for decorative images.',\r\n });\r\n } else if (alt.trim() === \"\") {\r\n const isLikelyContent =\r\n !src.includes(\"spacer\") &&\r\n !src.includes(\"pixel\") &&\r\n !src.includes(\"tracking\") &&\r\n !src.includes(\"1x1\") &&\r\n !src.includes(\"transparent\");\r\n\r\n if (isLikelyContent && ($(el).attr(\"width\") || \"0\") !== \"1\") {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"img-empty-alt\",\r\n message: \"Image has empty alt text — verify it is decorative\",\r\n element: describeElement($, el),\r\n details: \"Empty alt is correct for decorative images, but content images need descriptive alt text.\",\r\n });\r\n }\r\n } else if (/\\.(png|jpg|jpeg|gif|svg|webp|bmp)$/i.test(alt)) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"img-filename-alt\",\r\n message: \"Image alt text is a filename, not a description\",\r\n element: describeElement($, el),\r\n details: `Alt \"${alt}\" should describe the image content, not the file name.`,\r\n });\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkLinkAccessibility($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"a\").each((_, el) => {\r\n const text = $(el).text().trim().toLowerCase();\r\n const ariaLabel = $(el).attr(\"aria-label\");\r\n const title = $(el).attr(\"title\");\r\n const imgAlt = $(el).find(\"img\").attr(\"alt\");\r\n\r\n if (!text && !ariaLabel && !title && !imgAlt) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"link-no-accessible-name\",\r\n message: \"Link has no accessible name\",\r\n element: describeElement($, el),\r\n details: \"Links need visible text, aria-label, or an image with alt text.\",\r\n });\r\n return;\r\n }\r\n\r\n if (text && GENERIC_LINK_TEXT.has(text) && !ariaLabel) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"link-generic-text\",\r\n message: `Link text \"${$(el).text().trim()}\" is not descriptive`,\r\n element: describeElement($, el),\r\n details: \"Screen readers often list links out of context. Use text that describes the destination.\",\r\n });\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkTableAccessibility($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"table\").each((_, el) => {\r\n // Skip inner tables that are inside a presentation/none ancestor\r\n if ($(el).parents('table[role=\"presentation\"], table[role=\"none\"]').length > 0) return;\r\n\r\n const role = $(el).attr(\"role\");\r\n const hasHeaders = $(el).find(\"th\").length > 0;\r\n const looksLikeLayout = !hasHeaders;\r\n\r\n if (looksLikeLayout && role !== \"presentation\" && role !== \"none\") {\r\n const nestedTables = $(el).find(\"table\").length;\r\n if (nestedTables > 0 || $(el).find(\"td\").length > 2) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"table-missing-role\",\r\n message: 'Layout table missing role=\"presentation\"',\r\n element: `<table> with ${$(el).find(\"td\").length} cells`,\r\n details: 'Add role=\"presentation\" to tables used for layout so screen readers don\\'t announce them as data tables.',\r\n });\r\n }\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkTextSizeAndContrast($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n let smallTextCount = 0;\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n\r\n // --- Small text check (threshold lowered to 9px) ---\r\n const fontSizeMatch = style.match(/font-size\\s*:\\s*(\\d+(?:\\.\\d+)?)(px|pt)/i);\r\n if (fontSizeMatch) {\r\n const size = parseFloat(fontSizeMatch[1]);\r\n const unit = fontSizeMatch[2].toLowerCase();\r\n const pxSize = unit === \"pt\" ? size * 1.333 : size;\r\n\r\n if (pxSize < 9 && pxSize > 0) {\r\n smallTextCount++;\r\n if (smallTextCount <= 3) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"small-text\",\r\n message: `Very small text (${fontSizeMatch[0].trim()})`,\r\n element: describeElement($, el),\r\n details: \"Text smaller than 9px is difficult to read, especially on mobile devices.\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n // --- Color contrast check ---\r\n const colorValue = getStyleValue(style, \"color\");\r\n if (colorValue) {\r\n const fg = parseColor(colorValue);\r\n if (fg) {\r\n // Find nearest ancestor background-color, default white\r\n let bgR = 255, bgG = 255, bgB = 255;\r\n let current = $(el);\r\n let foundBg = false;\r\n\r\n // Check own background first, then walk ancestors\r\n const elements = [current, ...$(el).parents(\"[style]\").toArray().map((p) => $(p))];\r\n for (const ancestor of elements) {\r\n const ancestorStyle = (typeof ancestor === \"function\" ? ancestor : $(ancestor)).attr(\"style\") || \"\";\r\n const bgValue = getStyleValue(ancestorStyle, \"background-color\");\r\n if (bgValue) {\r\n const bg = parseColor(bgValue);\r\n if (bg && bg.a > 0) {\r\n if (bg.a < 1) {\r\n // Semi-transparent bg — blend against white\r\n [bgR, bgG, bgB] = alphaBlend(bg, 255, 255, 255);\r\n } else {\r\n bgR = bg.r;\r\n bgG = bg.g;\r\n bgB = bg.b;\r\n }\r\n foundBg = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Alpha-blend foreground if needed\r\n const [fR, fG, fB] = fg.a < 1 ? alphaBlend(fg, bgR, bgG, bgB) : [fg.r, fg.g, fg.b];\r\n\r\n const fgLum = relativeLuminance(fR, fG, fB);\r\n const bgLum = relativeLuminance(bgR, bgG, bgB);\r\n const ratio = contrastRatio(fgLum, bgLum);\r\n\r\n // Determine if text is \"large\" (≥18px, or ≥14px bold)\r\n let isLargeText = false;\r\n if (fontSizeMatch) {\r\n const size = parseFloat(fontSizeMatch[1]);\r\n const unit = fontSizeMatch[2].toLowerCase();\r\n const pxSize = unit === \"pt\" ? size * 1.333 : size;\r\n const fontWeight = getStyleValue(style, \"font-weight\");\r\n const isBold = fontWeight === \"bold\" || fontWeight === \"bolder\" || (fontWeight && parseInt(fontWeight, 10) >= 700);\r\n isLargeText = pxSize >= 18 || (pxSize >= 14 && !!isBold);\r\n }\r\n\r\n const grade = wcagGrade(ratio);\r\n if (grade === \"Fail\") {\r\n // ratio < 3:1 — error for all text\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"low-contrast\",\r\n message: `Low contrast ratio ${ratio.toFixed(1)}:1 — fails WCAG minimum`,\r\n element: describeElement($, el),\r\n details: `Foreground ${colorValue} on background needs at least ${isLargeText ? \"3:1\" : \"4.5:1\"} contrast ratio.`,\r\n });\r\n } else if (!isLargeText && grade === \"AA Large\") {\r\n // ratio 3:1–4.5:1 — only passes for large text, so flag normal text\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"low-contrast\",\r\n message: `Low contrast ratio ${ratio.toFixed(1)}:1 — fails WCAG AA for normal text`,\r\n element: describeElement($, el),\r\n details: `Foreground ${colorValue} on background needs at least 4.5:1 for normal-sized text.`,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (smallTextCount > 3) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"small-text-multiple\",\r\n message: `${smallTextCount} elements with text smaller than 9px`,\r\n details: \"Consider using a minimum font size of 12-14px for readability.\",\r\n });\r\n }\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkCharsetDeclaration($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n // Check for <meta charset=\"...\">\r\n const metaCharset = $('meta[charset]');\r\n if (metaCharset.length > 0) return null;\r\n\r\n // Check for <meta http-equiv=\"Content-Type\" content=\"...charset=...\">\r\n const httpEquiv = $('meta[http-equiv=\"Content-Type\"]');\r\n if (httpEquiv.length > 0) {\r\n const content = httpEquiv.attr(\"content\") || \"\";\r\n if (/charset\\s*=/i.test(content)) return null;\r\n }\r\n\r\n return {\r\n severity: \"warning\",\r\n rule: \"missing-charset\",\r\n message: \"Missing charset declaration\",\r\n details: 'Add <meta charset=\"utf-8\"> in <head> to prevent encoding issues across email clients.',\r\n };\r\n}\r\n\r\nfunction checkSemanticStructure($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n const headings: { level: number; text: string }[] = [];\r\n $(\"h1, h2, h3, h4, h5, h6\").each((_, el) => {\r\n const level = parseInt(el.tagName.replace(/h/i, \"\"), 10);\r\n headings.push({ level, text: $(el).text().trim().slice(0, 60) });\r\n });\r\n\r\n for (let i = 1; i < headings.length; i++) {\r\n const gap = headings[i].level - headings[i - 1].level;\r\n if (gap > 1) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"heading-skip\",\r\n message: `Heading level skipped: h${headings[i - 1].level} to h${headings[i].level}`,\r\n details: \"Skipped heading levels can confuse screen readers. Use sequential heading levels.\",\r\n });\r\n break;\r\n }\r\n }\r\n\r\n return issues;\r\n}\r\n\r\n/**\r\n * Audit a pre-parsed email DOM for accessibility issues.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function checkAccessibilityFromDom($: cheerio.CheerioAPI): AccessibilityReport {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n const langIssue = checkLangAttribute($);\r\n if (langIssue) issues.push(langIssue);\r\n\r\n const titleIssue = checkTitle($);\r\n if (titleIssue) issues.push(titleIssue);\r\n\r\n issues.push(...checkImageAlt($));\r\n issues.push(...checkLinkAccessibility($));\r\n issues.push(...checkTableAccessibility($));\r\n issues.push(...checkTextSizeAndContrast($));\r\n issues.push(...checkSemanticStructure($));\r\n\r\n const charsetIssue = checkCharsetDeclaration($);\r\n if (charsetIssue) issues.push(charsetIssue);\r\n\r\n // Calculate score with per-rule penalty capping\r\n let penalty = 0;\r\n const seenRules = new Map<string, number>();\r\n\r\n for (const issue of issues) {\r\n const count = (seenRules.get(issue.rule) || 0) + 1;\r\n seenRules.set(issue.rule, count);\r\n\r\n const cap = RULE_PENALTY_CAPS[issue.rule];\r\n if (cap !== undefined && count > cap) continue;\r\n\r\n switch (issue.severity) {\r\n case \"error\": penalty += 12; break;\r\n case \"warning\": penalty += 6; break;\r\n case \"info\": penalty += 2; break;\r\n }\r\n }\r\n\r\n const score = Math.max(0, 100 - penalty);\r\n return { score, issues };\r\n}\r\n\r\n/**\r\n * Audit an HTML email for accessibility issues.\r\n *\r\n * Checks for missing lang attributes, image alt text, small fonts,\r\n * layout table roles, link accessibility, heading hierarchy, and\r\n * color contrast. Returns a 0–100 score and detailed issues.\r\n */\r\nexport function checkAccessibility(html: string): AccessibilityReport {\r\n if (!html || !html.trim()) {\r\n return { score: 100, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkAccessibilityFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { ImageIssue, ImageInfo, ImageReport } from \"./types\";\r\n\r\nconst DATA_URI_WARN_BYTES = 100 * 1024;\r\nconst TOTAL_DATA_URI_WARN_BYTES = 500 * 1024;\r\nconst HIGH_IMAGE_COUNT = 10;\r\n\r\nfunction estimateBase64Bytes(dataUri: string): number {\r\n const commaIdx = dataUri.indexOf(\",\");\r\n if (commaIdx === -1) return 0;\r\n const payload = dataUri.slice(commaIdx + 1);\r\n return Math.floor((payload.length * 3) / 4);\r\n}\r\n\r\nfunction isTrackingPixel(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n el: cheerio.Cheerio<any>,\r\n): boolean {\r\n const width = el.attr(\"width\");\r\n const height = el.attr(\"height\");\r\n const style = (el.attr(\"style\") || \"\").toLowerCase();\r\n\r\n if (width === \"1\" && height === \"1\") return true;\r\n if (width === \"0\" || height === \"0\") return true;\r\n\r\n if (\r\n style.includes(\"display:none\") ||\r\n style.includes(\"display: none\") ||\r\n style.includes(\"visibility:hidden\") ||\r\n style.includes(\"visibility: hidden\")\r\n ) {\r\n return true;\r\n }\r\n\r\n if (/width\\s*:\\s*1px/.test(style) && /height\\s*:\\s*1px/.test(style)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction truncateSrc(src: string, max = 60): string {\r\n if (src.startsWith(\"data:\")) {\r\n const semi = src.indexOf(\";\");\r\n return semi > 0 ? src.slice(0, semi + 1) + \"base64,...\" : \"data:...\";\r\n }\r\n return src.length > max ? src.slice(0, max - 3) + \"...\" : src;\r\n}\r\n\r\n/**\r\n * Analyze images from a pre-parsed email DOM.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeImagesFromDom($: cheerio.CheerioAPI): ImageReport {\r\n const issues: ImageIssue[] = [];\r\n const images: ImageInfo[] = [];\r\n let totalDataUriBytes = 0;\r\n\r\n $(\"img\").each((_, el) => {\r\n const img = $(el);\r\n const src = img.attr(\"src\") || \"\";\r\n const alt = img.attr(\"alt\") ?? null;\r\n const width = img.attr(\"width\") ?? null;\r\n const height = img.attr(\"height\") ?? null;\r\n const style = (img.attr(\"style\") || \"\").toLowerCase();\r\n const imgIssues: string[] = [];\r\n\r\n const tracking = isTrackingPixel(img);\r\n\r\n let dataUriBytes = 0;\r\n if (src.startsWith(\"data:\")) {\r\n dataUriBytes = estimateBase64Bytes(src);\r\n totalDataUriBytes += dataUriBytes;\r\n }\r\n\r\n // Skip detailed checks for tracking pixels\r\n if (tracking) {\r\n images.push({\r\n src: truncateSrc(src),\r\n alt, width, height,\r\n isTrackingPixel: true,\r\n dataUriBytes,\r\n issues: [\"tracking-pixel\"],\r\n });\r\n return;\r\n }\r\n\r\n // Missing width/height\r\n if (!width && !height) {\r\n const hasStyleWidth = /width\\s*:/.test(style);\r\n const hasStyleHeight = /height\\s*:/.test(style);\r\n if (!hasStyleWidth && !hasStyleHeight) {\r\n imgIssues.push(\"missing-dimensions\");\r\n issues.push({\r\n rule: \"missing-dimensions\",\r\n severity: \"warning\",\r\n message: \"Image missing width/height attributes — causes layout shifts and Outlook rendering issues.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n }\r\n\r\n // Large data URI\r\n if (dataUriBytes > DATA_URI_WARN_BYTES) {\r\n const kb = Math.round(dataUriBytes / 1024);\r\n imgIssues.push(\"large-data-uri\");\r\n issues.push({\r\n rule: \"large-data-uri\",\r\n severity: \"warning\",\r\n message: `Data URI is ${kb}KB — consider hosting the image externally to reduce email size.`,\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // Missing alt\r\n if (alt === null) {\r\n imgIssues.push(\"missing-alt\");\r\n issues.push({\r\n rule: \"missing-alt\",\r\n severity: \"warning\",\r\n message: \"Image missing alt attribute — hurts deliverability and accessibility.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // WebP format\r\n if (src.toLowerCase().endsWith(\".webp\") || src.includes(\"image/webp\")) {\r\n imgIssues.push(\"webp-format\");\r\n issues.push({\r\n rule: \"webp-format\",\r\n severity: \"info\",\r\n message: \"WebP format detected — not supported by all email clients. Consider PNG or JPEG.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // SVG format\r\n if (src.toLowerCase().endsWith(\".svg\") || src.includes(\"image/svg\")) {\r\n imgIssues.push(\"svg-format\");\r\n issues.push({\r\n rule: \"svg-format\",\r\n severity: \"info\",\r\n message: \"SVG format detected — not supported by most email clients. Use PNG instead.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // Missing display:block\r\n if (!style.includes(\"display:block\") && !style.includes(\"display: block\")) {\r\n imgIssues.push(\"missing-display-block\");\r\n issues.push({\r\n rule: \"missing-display-block\",\r\n severity: \"info\",\r\n message: \"Image without display:block — may cause unwanted gaps in Outlook.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n images.push({\r\n src: truncateSrc(src),\r\n alt, width, height,\r\n isTrackingPixel: false,\r\n dataUriBytes,\r\n issues: imgIssues,\r\n });\r\n });\r\n\r\n // Aggregate checks\r\n const nonTrackingImages = images.filter((i) => !i.isTrackingPixel);\r\n\r\n if (nonTrackingImages.length > HIGH_IMAGE_COUNT) {\r\n issues.push({\r\n rule: \"high-image-count\",\r\n severity: \"info\",\r\n message: `Email contains ${nonTrackingImages.length} images — heavy emails may be clipped or load slowly.`,\r\n });\r\n }\r\n\r\n const trackingPixels = images.filter((i) => i.isTrackingPixel);\r\n if (trackingPixels.length > 0) {\r\n issues.push({\r\n rule: \"tracking-pixel\",\r\n severity: \"info\",\r\n message: `${trackingPixels.length} tracking pixel${trackingPixels.length > 1 ? \"s\" : \"\"} detected.`,\r\n });\r\n }\r\n\r\n if (totalDataUriBytes > TOTAL_DATA_URI_WARN_BYTES) {\r\n const kb = Math.round(totalDataUriBytes / 1024);\r\n issues.push({\r\n rule: \"total-data-uri-size\",\r\n severity: \"warning\",\r\n message: `Total data URI size is ${kb}KB — consider hosting images externally to reduce email size.`,\r\n });\r\n }\r\n\r\n return { total: images.length, totalDataUriBytes, issues, images };\r\n}\r\n\r\n/**\r\n * Analyze images in an HTML email for best practices.\r\n *\r\n * Checks for missing dimensions, oversized data URIs, missing alt\r\n * attributes, unsupported formats (WebP, SVG), tracking pixels,\r\n * missing display:block, and overall image heaviness.\r\n */\r\nexport function analyzeImages(html: string): ImageReport {\r\n if (!html || !html.trim()) {\r\n return { total: 0, totalDataUriBytes: 0, issues: [], images: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeImagesFromDom($);\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, CLIENT_DISPLAY_LIMITS } from \"./constants\";\r\nimport type { InboxPreviewIssue, InboxPreview, ClientTruncation } from \"./types\";\r\n\r\nconst MAX_SUBJECT_LENGTH = 60;\r\nconst MAX_PREHEADER_LENGTH = 100;\r\nconst MIN_PREHEADER_LENGTH = 30;\r\n\r\n/** Emoji regex — covers most common emoji ranges */\r\nconst EMOJI_PATTERN = /[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{2B50}-\\u{2B55}\\u{FE00}-\\u{FE0F}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{200D}\\u{20E3}\\u{E0020}-\\u{E007F}]/u;\r\n\r\n/**\r\n * Detect ‌ padding hack in preheader elements.\r\n * Cheerio partially decodes entities: zwnj → \\u200C but may stay as entity.\r\n * Match both decoded Unicode and HTML entity forms.\r\n */\r\nconst ZWNJ_PADDING_PATTERN = /(\\u200C\\s*( |\\u00A0)\\s*){2,}|(‌\\s* \\s*){2,}/;\r\n\r\n/**\r\n * Extract subject and preheader text from the email HTML, plus\r\n * flag common issues (missing title, length problems, etc.).\r\n *\r\n * The subject comes from the `<title>` tag. The preheader is extracted\r\n * from the first visible text in `<body>`, including hidden preheader\r\n * hacks (zero-width divs, display:none spans, etc.).\r\n */\r\nexport function extractInboxPreview(html: string): InboxPreview {\r\n if (!html || !html.trim()) {\r\n return {\r\n subject: null,\r\n preheader: null,\r\n subjectLength: 0,\r\n preheaderLength: 0,\r\n truncation: [],\r\n issues: [{ rule: \"missing-subject\", severity: \"warning\", message: \"No <title> tag found. Most email clients use this as the subject line.\" }],\r\n };\r\n }\r\n\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return extractInboxPreviewFromDom($);\r\n}\r\n\r\n/**\r\n * DOM-based implementation for use with shared Cheerio sessions.\r\n */\r\nexport function extractInboxPreviewFromDom($: CheerioAPI): InboxPreview {\r\n const issues: InboxPreviewIssue[] = [];\r\n\r\n // ── Subject (from <title>) ──\r\n const titleEl = $(\"title\");\r\n const subject = titleEl.length > 0 ? titleEl.first().text().trim() || null : null;\r\n const subjectLength = subject?.length ?? 0;\r\n\r\n if (!subject) {\r\n issues.push({\r\n rule: \"missing-subject\",\r\n severity: \"warning\",\r\n message: \"No <title> tag found. Most email clients use this as the subject line.\",\r\n });\r\n } else if (subjectLength > MAX_SUBJECT_LENGTH) {\r\n issues.push({\r\n rule: \"subject-too-long\",\r\n severity: \"warning\",\r\n message: `Subject is ${subjectLength} characters — may be truncated in inboxes (recommended: ${MAX_SUBJECT_LENGTH} or fewer).`,\r\n });\r\n }\r\n\r\n // ── Preheader ──\r\n // Look for common preheader patterns first:\r\n // 1. Hidden divs/spans at the start of <body> (display:none, visibility:hidden, mso-hide:all)\r\n // 2. First visible text in <body>\r\n const preheader = extractPreheaderText($);\r\n const preheaderLength = preheader?.length ?? 0;\r\n\r\n if (!preheader) {\r\n issues.push({\r\n rule: \"missing-preheader\",\r\n severity: \"info\",\r\n message: \"No preheader text detected. Adding preview text improves open rates in crowded inboxes.\",\r\n });\r\n } else if (preheaderLength < MIN_PREHEADER_LENGTH) {\r\n issues.push({\r\n rule: \"preheader-too-short\",\r\n severity: \"warning\",\r\n message: `Preheader is only ${preheaderLength} characters — email clients may backfill with body text (recommended: ${MIN_PREHEADER_LENGTH}+).`,\r\n });\r\n } else if (preheaderLength > MAX_PREHEADER_LENGTH) {\r\n issues.push({\r\n rule: \"preheader-too-long\",\r\n severity: \"info\",\r\n message: `Preheader is ${preheaderLength} characters — most clients show 40–100 characters. Text beyond that is hidden.`,\r\n });\r\n }\r\n\r\n // ── ZWNJ/NBSP padding detection ──\r\n if (hasZwnjPadding($)) {\r\n issues.push({\r\n rule: \"zwnj-padding\",\r\n severity: \"info\",\r\n message: \"Preheader uses ‌ padding hack — works in most clients but may show garbled text in some.\",\r\n });\r\n }\r\n\r\n // ── Emoji in subject ──\r\n if (subject && EMOJI_PATTERN.test(subject)) {\r\n issues.push({\r\n rule: \"emoji-in-subject\",\r\n severity: \"info\",\r\n message: \"Subject line contains emoji — renders inconsistently across email clients and may trigger spam filters.\",\r\n });\r\n }\r\n\r\n // ── Per-client truncation ──\r\n const truncation = computeTruncation(subject, preheader);\r\n\r\n return {\r\n subject,\r\n preheader,\r\n subjectLength,\r\n preheaderLength,\r\n truncation,\r\n issues,\r\n };\r\n}\r\n\r\n/**\r\n * Compute per-client truncation data for subject and preheader.\r\n */\r\nfunction computeTruncation(subject: string | null, preheader: string | null): ClientTruncation[] {\r\n return CLIENT_DISPLAY_LIMITS.map((limit) => {\r\n const truncatedSubject = subject && subject.length > limit.subjectLimit\r\n ? subject.slice(0, limit.subjectLimit - 1) + \"…\"\r\n : subject;\r\n const truncatedPreheader = preheader && preheader.length > limit.preheaderLimit\r\n ? preheader.slice(0, limit.preheaderLimit - 1) + \"…\"\r\n : preheader;\r\n\r\n return {\r\n client: limit.client,\r\n subjectLimit: limit.subjectLimit,\r\n preheaderLimit: limit.preheaderLimit,\r\n truncatedSubject: truncatedSubject ?? null,\r\n truncatedPreheader: truncatedPreheader ?? null,\r\n subjectTruncated: !!subject && subject.length > limit.subjectLimit,\r\n preheaderTruncated: !!preheader && preheader.length > limit.preheaderLimit,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Detect ‌ padding hack in preheader-like elements.\r\n */\r\nfunction hasZwnjPadding($: CheerioAPI): boolean {\r\n const body = $(\"body\");\r\n if (!body.length) return false;\r\n\r\n const hiddenSelectors = [\r\n 'div[style*=\"display:none\"]', 'div[style*=\"display: none\"]',\r\n 'span[style*=\"display:none\"]', 'span[style*=\"display: none\"]',\r\n 'div[style*=\"max-height:0\"]', 'div[style*=\"max-height: 0\"]',\r\n 'span[style*=\"max-height:0\"]', 'span[style*=\"max-height: 0\"]',\r\n '[class*=\"preheader\"]', '[class*=\"preview-text\"]', '[class*=\"previewText\"]',\r\n ];\r\n\r\n for (const sel of hiddenSelectors) {\r\n const el = body.find(sel).first();\r\n if (el.length) {\r\n const rawHtml = el.html() || \"\";\r\n if (ZWNJ_PADDING_PATTERN.test(rawHtml)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Try to extract preheader text from the email body.\r\n *\r\n * Strategy:\r\n * 1. Look for hidden elements at the start of body (common preheader hacks)\r\n * 2. Fall back to the first visible text in body\r\n */\r\nfunction extractPreheaderText($: CheerioAPI): string | null {\r\n const body = $(\"body\");\r\n if (!body.length) return null;\r\n\r\n // Check for hidden preheader hacks — these are typically the first child\r\n // elements with display:none, visibility:hidden, max-height:0, or mso-hide:all\r\n const hiddenSelectors = [\r\n 'div[style*=\"display:none\"]',\r\n 'div[style*=\"display: none\"]',\r\n 'span[style*=\"display:none\"]',\r\n 'span[style*=\"display: none\"]',\r\n 'div[style*=\"visibility:hidden\"]',\r\n 'div[style*=\"visibility: hidden\"]',\r\n 'span[style*=\"visibility:hidden\"]',\r\n 'span[style*=\"visibility: hidden\"]',\r\n 'div[style*=\"max-height:0\"]',\r\n 'div[style*=\"max-height: 0\"]',\r\n 'span[style*=\"max-height:0\"]',\r\n 'span[style*=\"max-height: 0\"]',\r\n 'div[style*=\"mso-hide:all\"]',\r\n 'div[style*=\"mso-hide: all\"]',\r\n ];\r\n\r\n for (const sel of hiddenSelectors) {\r\n const el = body.find(sel).first();\r\n if (el.length) {\r\n const text = el.text().trim();\r\n if (text) return text;\r\n }\r\n }\r\n\r\n // Also check for elements with class names suggesting preheader\r\n const preheaderClasses = body.find(\r\n '[class*=\"preheader\"], [class*=\"preview-text\"], [class*=\"previewText\"]'\r\n ).first();\r\n if (preheaderClasses.length) {\r\n const text = preheaderClasses.text().trim();\r\n if (text) return text;\r\n }\r\n\r\n // Fall back to the first block of visible text in the body\r\n // Walk the first few direct children to find text\r\n const firstText = getFirstVisibleText($, body);\r\n return firstText || null;\r\n}\r\n\r\n/**\r\n * Extract the first meaningful visible text from a body element.\r\n * Skips style/script tags and stops after finding the first text block.\r\n */\r\nfunction getFirstVisibleText($: CheerioAPI, body: cheerio.Cheerio<any>): string | null {\r\n const skipTags = new Set([\"style\", \"script\", \"head\", \"title\"]);\r\n let result: string | null = null;\r\n\r\n body.find(\"*\").each((_, el) => {\r\n if (result) return false; // stop iterating\r\n const tagName = (el as any).tagName?.toLowerCase();\r\n if (skipTags.has(tagName)) return;\r\n\r\n // Check if this element is hidden (skip hidden elements for preheader detection)\r\n const style = $(el).attr(\"style\") || \"\";\r\n if (\r\n style.includes(\"display:none\") ||\r\n style.includes(\"display: none\") ||\r\n style.includes(\"visibility:hidden\") ||\r\n style.includes(\"visibility: hidden\")\r\n ) {\r\n return;\r\n }\r\n\r\n // Get direct text content (not from children)\r\n const directText = $(el)\r\n .contents()\r\n .filter((_, node) => node.type === \"text\")\r\n .text()\r\n .trim();\r\n\r\n if (directText && directText.length > 1) {\r\n // Skip whitespace-only padding (common in email templates)\r\n const cleaned = directText.replace(/[\\u200B\\u00A0\\s]+/g, \" \").trim();\r\n if (cleaned.length > 1) {\r\n result = cleaned;\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, GMAIL_CLIP_THRESHOLD, GMAIL_CLIP_WARNING_THRESHOLD } from \"./constants\";\r\nimport type { SizeIssue, SizeReport } from \"./types\";\r\n\r\n/**\r\n * Format bytes into a human-readable string.\r\n */\r\nfunction humanizeBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n const kb = bytes / 1024;\r\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\r\n const mb = kb / 1024;\r\n return `${mb.toFixed(2)} MB`;\r\n}\r\n\r\n/**\r\n * Check email HTML size for Gmail clipping issues.\r\n *\r\n * Accepts both Cheerio + raw HTML because byte length requires the raw\r\n * string (Cheerio serialization may differ from the original).\r\n *\r\n * @internal Used by audit pipeline with pre-parsed DOM.\r\n */\r\nexport function checkSizeFromDom(_$: CheerioAPI, html: string): SizeReport {\r\n const htmlBytes = new TextEncoder().encode(html).length;\r\n const humanSize = humanizeBytes(htmlBytes);\r\n const issues: SizeIssue[] = [];\r\n let clipped = false;\r\n\r\n if (htmlBytes > GMAIL_CLIP_THRESHOLD) {\r\n clipped = true;\r\n issues.push({\r\n rule: \"gmail-clipped\",\r\n severity: \"error\",\r\n message: `Email is ${humanSize} — Gmail will clip it at ~102 KB. Recipients see a \"View entire message\" link instead of your content.`,\r\n detail: `${htmlBytes} bytes exceeds the ${GMAIL_CLIP_THRESHOLD} byte threshold.`,\r\n });\r\n } else if (htmlBytes > GMAIL_CLIP_WARNING_THRESHOLD) {\r\n issues.push({\r\n rule: \"gmail-clip-warning\",\r\n severity: \"warning\",\r\n message: `Email is ${humanSize} — approaching Gmail's ~102 KB clip threshold. Consider trimming.`,\r\n detail: `${htmlBytes} bytes is within ${GMAIL_CLIP_THRESHOLD - htmlBytes} bytes of the clip threshold.`,\r\n });\r\n }\r\n\r\n return { htmlBytes, humanSize, clipped, issues };\r\n}\r\n\r\n/**\r\n * Check email HTML size for Gmail clipping issues.\r\n *\r\n * Returns byte count, human-readable size, clip status, and issues.\r\n * Gmail clips messages larger than ~102 KB, hiding content behind a\r\n * \"View entire message\" link.\r\n */\r\nexport function checkSize(html: string): SizeReport {\r\n if (!html || !html.trim()) {\r\n return { htmlBytes: 0, humanSize: \"0 B\", clipped: false, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkSizeFromDom($, html);\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, TEMPLATE_VARIABLE_PATTERNS } from \"./constants\";\r\nimport type { TemplateIssue, TemplateReport } from \"./types\";\r\n\r\n/**\r\n * Scan DOM text nodes and attributes for unresolved template variables.\r\n *\r\n * Scans DOM text (not raw HTML) to avoid false positives from CSS/style\r\n * blocks. Also checks href, src, and alt attributes for merge tags.\r\n *\r\n * @internal Used by audit pipeline with pre-parsed DOM.\r\n */\r\nexport function checkTemplateVariablesFromDom($: CheerioAPI): TemplateReport {\r\n const issues: TemplateIssue[] = [];\r\n const seen = new Set<string>();\r\n\r\n // ── Scan visible text content ──\r\n const textContent = extractTextContent($);\r\n for (const [pattern, label] of TEMPLATE_VARIABLE_PATTERNS) {\r\n // Reset lastIndex for global regexes\r\n pattern.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = pattern.exec(textContent)) !== null) {\r\n const variable = match[0];\r\n const key = `text:${variable}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n issues.push({\r\n rule: \"unresolved-variable\",\r\n severity: \"error\",\r\n message: `Unresolved ${label} variable \"${variable}\" found in text content.`,\r\n variable,\r\n location: \"text\",\r\n });\r\n }\r\n }\r\n\r\n // ── Scan attributes (href, src, alt) ──\r\n const attrSelectors = [\"[href]\", \"[src]\", \"[alt]\"];\r\n for (const sel of attrSelectors) {\r\n $(sel).each((_, el) => {\r\n const attrs = [\"href\", \"src\", \"alt\"] as const;\r\n for (const attr of attrs) {\r\n const value = $(el).attr(attr);\r\n if (!value) continue;\r\n\r\n for (const [pattern, label] of TEMPLATE_VARIABLE_PATTERNS) {\r\n pattern.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = pattern.exec(value)) !== null) {\r\n const variable = match[0];\r\n const key = `attr:${attr}:${variable}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n issues.push({\r\n rule: \"unresolved-variable\",\r\n severity: \"error\",\r\n message: `Unresolved ${label} variable \"${variable}\" found in ${attr} attribute.`,\r\n variable,\r\n location: \"attribute\",\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n return { unresolvedCount: issues.length, issues };\r\n}\r\n\r\n/**\r\n * Extract visible text content from DOM (excluding style/script).\r\n */\r\nfunction extractTextContent($: CheerioAPI): string {\r\n const clone = $.root().clone();\r\n clone.find(\"style, script, head\").remove();\r\n return clone.text();\r\n}\r\n\r\n/**\r\n * Scan HTML email for unresolved template/merge variables.\r\n *\r\n * Detects patterns like `{{var}}`, `${var}`, `<%= %>`, `*|TAG|*`,\r\n * `%%tag%%`, and `{merge_field}` in text content and key attributes.\r\n *\r\n * Returns the count of unresolved variables and detailed issues.\r\n */\r\nexport function checkTemplateVariables(html: string): TemplateReport {\r\n if (!html || !html.trim()) {\r\n return { unresolvedCount: 0, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkTemplateVariablesFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { analyzeEmailFromDom, generateCompatibilityScore } from \"./analyze\";\r\nimport { analyzeSpamFromDom } from \"./spam-scorer\";\r\nimport { validateLinksFromDom } from \"./link-validator\";\r\nimport { checkAccessibilityFromDom } from \"./accessibility-checker\";\r\nimport { analyzeImagesFromDom } from \"./image-analyzer\";\r\nimport { extractInboxPreviewFromDom } from \"./inbox-preview\";\r\nimport { checkSizeFromDom } from \"./size-checker\";\r\nimport { checkTemplateVariablesFromDom } from \"./template-checker\";\r\nimport {\r\n MAX_HTML_SIZE,\r\n EMPTY_SPAM, EMPTY_LINKS, EMPTY_ACCESSIBILITY, EMPTY_IMAGES,\r\n EMPTY_INBOX_PREVIEW, EMPTY_SIZE, EMPTY_TEMPLATE,\r\n} from \"./constants\";\r\nimport type {\r\n CSSWarning,\r\n Framework,\r\n SpamAnalysisOptions,\r\n SpamReport,\r\n LinkReport,\r\n AccessibilityReport,\r\n ImageReport,\r\n InboxPreview,\r\n SizeReport,\r\n TemplateReport,\r\n} from \"./types\";\r\n\r\nexport interface AuditOptions {\r\n framework?: Framework;\r\n /** Options for spam analysis */\r\n spam?: SpamAnalysisOptions;\r\n /** Skip specific checks */\r\n skip?: Array<\"spam\" | \"links\" | \"accessibility\" | \"images\" | \"compatibility\" | \"inboxPreview\" | \"size\" | \"templateVariables\">;\r\n}\r\n\r\nexport interface AuditReport {\r\n compatibility: {\r\n warnings: CSSWarning[];\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n };\r\n spam: SpamReport;\r\n links: LinkReport;\r\n accessibility: AccessibilityReport;\r\n images: ImageReport;\r\n inboxPreview: InboxPreview;\r\n size: SizeReport;\r\n templateVariables: TemplateReport;\r\n}\r\n\r\n/**\r\n * Run all email analysis checks in a single call.\r\n *\r\n * Returns a unified report with compatibility warnings + scores,\r\n * spam analysis, link validation, accessibility audit, and image analysis.\r\n * Use the `skip` option to omit checks you don't need.\r\n *\r\n * Internally parses the HTML once and shares the parsed DOM across\r\n * all analyzers to avoid redundant parsing overhead.\r\n */\r\nexport function auditEmail(html: string, options?: AuditOptions): AuditReport {\r\n if (!html || !html.trim()) {\r\n return {\r\n compatibility: { warnings: [], scores: {} },\r\n spam: EMPTY_SPAM,\r\n links: EMPTY_LINKS,\r\n accessibility: EMPTY_ACCESSIBILITY,\r\n images: EMPTY_IMAGES,\r\n inboxPreview: EMPTY_INBOX_PREVIEW,\r\n size: EMPTY_SIZE,\r\n templateVariables: EMPTY_TEMPLATE,\r\n };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const framework = options?.framework;\r\n const skip = new Set(options?.skip ?? []);\r\n\r\n // Parse once, share across all analyzers\r\n const $ = cheerio.load(html);\r\n\r\n const warnings = skip.has(\"compatibility\") ? [] : analyzeEmailFromDom($, framework);\r\n const scores = skip.has(\"compatibility\") ? {} : generateCompatibilityScore(warnings);\r\n const spam = skip.has(\"spam\") ? EMPTY_SPAM : analyzeSpamFromDom($, options?.spam);\r\n const links = skip.has(\"links\") ? EMPTY_LINKS : validateLinksFromDom($);\r\n const accessibility = skip.has(\"accessibility\") ? EMPTY_ACCESSIBILITY : checkAccessibilityFromDom($);\r\n const images = skip.has(\"images\") ? EMPTY_IMAGES : analyzeImagesFromDom($);\r\n const inboxPreview = skip.has(\"inboxPreview\") ? EMPTY_INBOX_PREVIEW : extractInboxPreviewFromDom($);\r\n const size = skip.has(\"size\") ? EMPTY_SIZE : checkSizeFromDom($, html);\r\n const templateVariables = skip.has(\"templateVariables\") ? EMPTY_TEMPLATE : checkTemplateVariablesFromDom($);\r\n\r\n return { compatibility: { warnings, scores }, spam, links, accessibility, images, inboxPreview, size, templateVariables };\r\n}\r\n","import * as cheerio from \"cheerio\";\nimport type { AnyNode, Element, Text } from \"domhandler\";\n\n/**\n * Convert HTML email to plain text suitable for multipart/alternative emails.\n *\n * Walks the DOM tree node-by-node, emitting text content with proper\n * line breaks for block elements. Avoids cheerio's `.text()` which\n * preserves all source whitespace from deeply nested email tables.\n */\nexport function toPlainText(html: string): string {\n const $ = cheerio.load(html);\n\n // Remove elements that should not appear in plain text\n $(\"style, script, head\").remove();\n $(\"[data-skip-in-text='true']\").remove();\n\n const lines: string[] = [];\n let currentLine = \"\";\n\n const BLOCK_TAGS = new Set([\n \"p\", \"div\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"tr\", \"table\", \"blockquote\", \"ul\", \"ol\", \"li\",\n \"section\", \"article\", \"header\", \"footer\", \"main\",\n \"td\", \"th\", // treat cells as blocks to avoid run-on text\n ]);\n\n const SKIP_TAGS = new Set([\"style\", \"script\", \"head\"]);\n\n function flushLine() {\n const trimmed = currentLine.trim();\n if (trimmed) lines.push(trimmed);\n currentLine = \"\";\n }\n\n function walk(node: AnyNode) {\n if (node.type === \"text\") {\n // Collapse whitespace in text nodes (like browser rendering)\n const text = (node as Text).data.replace(/\\s+/g, \" \");\n if (text.trim()) {\n currentLine += text;\n }\n return;\n }\n\n if (node.type !== \"tag\") return;\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n\n if (SKIP_TAGS.has(tag)) return;\n\n // Self-closing conversions\n if (tag === \"br\") {\n flushLine();\n return;\n }\n if (tag === \"hr\") {\n flushLine();\n lines.push(\"---\");\n return;\n }\n if (tag === \"img\") {\n const alt = $(el).attr(\"alt\")?.trim();\n if (alt) currentLine += alt;\n return;\n }\n\n // Links — inline, append URL if different from text\n if (tag === \"a\") {\n const href = $(el).attr(\"href\") || \"\";\n const text = $(el).text().trim();\n if (!href || href === \"#\" || href === text) {\n currentLine += text || href;\n } else if (!text) {\n currentLine += href;\n } else {\n currentLine += `${text} (${href})`;\n }\n return; // don't recurse into children — already extracted text\n }\n\n // Block elements: flush before and after\n const isBlock = BLOCK_TAGS.has(tag);\n if (isBlock) {\n flushLine();\n } else if (currentLine && !currentLine.endsWith(\" \")) {\n // Inline elements: ensure a space separator so sibling spans\n // like <span>15</span><span>Clients</span> become \"15 Clients\"\n currentLine += \" \";\n }\n\n // List items get a bullet prefix\n if (tag === \"li\") {\n currentLine = \"- \";\n }\n\n // Recurse into children\n for (const child of el.children) {\n walk(child);\n }\n\n if (isBlock) flushLine();\n }\n\n // Start walking from body, or root if no body\n const body = $(\"body\");\n const root = body.length ? body[0] : $.root()[0];\n if (root && \"children\" in root) {\n for (const child of root.children) {\n walk(child);\n }\n }\n flushLine();\n\n // Join lines, collapse multiple blank lines into one\n let result = lines.join(\"\\n\");\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n return result.trim();\n}\n","import * as cheerio from \"cheerio\";\r\nimport { analyzeEmailFromDom, generateCompatibilityScore } from \"./analyze\";\r\nimport { analyzeSpamFromDom } from \"./spam-scorer\";\r\nimport { validateLinksFromDom } from \"./link-validator\";\r\nimport { checkAccessibilityFromDom } from \"./accessibility-checker\";\r\nimport { analyzeImagesFromDom } from \"./image-analyzer\";\r\nimport { extractInboxPreviewFromDom } from \"./inbox-preview\";\r\nimport { checkSizeFromDom } from \"./size-checker\";\r\nimport { checkTemplateVariablesFromDom } from \"./template-checker\";\r\nimport { transformForClient, transformForAllClients } from \"./transform\";\r\nimport { simulateDarkMode } from \"./dark-mode\";\r\nimport {\r\n MAX_HTML_SIZE,\r\n EMPTY_SPAM, EMPTY_LINKS, EMPTY_ACCESSIBILITY, EMPTY_IMAGES,\r\n EMPTY_INBOX_PREVIEW, EMPTY_SIZE, EMPTY_TEMPLATE,\r\n} from \"./constants\";\r\nimport type {\r\n CSSWarning,\r\n Framework,\r\n SpamAnalysisOptions,\r\n SpamReport,\r\n LinkReport,\r\n AccessibilityReport,\r\n ImageReport,\r\n InboxPreview,\r\n SizeReport,\r\n TemplateReport,\r\n TransformResult,\r\n} from \"./types\";\r\nimport type { AuditOptions, AuditReport } from \"./audit\";\r\n\r\nexport interface CreateSessionOptions {\r\n /** Framework for fix snippets (applies to analyze/audit/transform). */\r\n framework?: Framework;\r\n}\r\n\r\n/**\r\n * A pre-parsed email session.\r\n *\r\n * Analysis methods (`analyze`, `audit`, `analyzeSpam`, `validateLinks`,\r\n * `checkAccessibility`, `analyzeImages`) share a single Cheerio DOM\r\n * parse, eliminating redundant parsing overhead.\r\n *\r\n * Transformation methods (`transformForClient`, `transformForAllClients`,\r\n * `simulateDarkMode`) parse internally since they mutate the DOM per\r\n * client. They still benefit from having the session hold the HTML and\r\n * framework so you don't need to pass them repeatedly.\r\n */\r\nexport interface EmailSession {\r\n /** The original HTML string. */\r\n readonly html: string;\r\n\r\n /** The framework set at session creation. */\r\n readonly framework: Framework | undefined;\r\n\r\n /**\r\n * Run all analysis checks in one call (shares pre-parsed DOM).\r\n *\r\n * Equivalent to `auditEmail()` but avoids re-parsing the HTML.\r\n */\r\n audit(options?: Omit<AuditOptions, \"framework\">): AuditReport;\r\n\r\n /**\r\n * Analyze CSS compatibility warnings (shares pre-parsed DOM).\r\n *\r\n * Equivalent to `analyzeEmail()` but avoids re-parsing the HTML.\r\n */\r\n analyze(): CSSWarning[];\r\n\r\n /** Generate per-client compatibility scores from warnings. */\r\n score(\r\n warnings: CSSWarning[],\r\n ): Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n\r\n /** Analyze spam indicators (shares pre-parsed DOM). */\r\n analyzeSpam(options?: SpamAnalysisOptions): SpamReport;\r\n\r\n /** Validate links (shares pre-parsed DOM). */\r\n validateLinks(): LinkReport;\r\n\r\n /** Check accessibility (shares pre-parsed DOM). */\r\n checkAccessibility(): AccessibilityReport;\r\n\r\n /** Analyze images (shares pre-parsed DOM). */\r\n analyzeImages(): ImageReport;\r\n\r\n /** Extract subject line and preheader text (shares pre-parsed DOM). */\r\n extractInboxPreview(): InboxPreview;\r\n\r\n /** Check email size for Gmail clipping (needs raw HTML for byte count). */\r\n checkSize(): SizeReport;\r\n\r\n /** Scan for unresolved template/merge variables (shares pre-parsed DOM). */\r\n checkTemplateVariables(): TemplateReport;\r\n\r\n /**\r\n * Transform HTML for a specific client.\r\n *\r\n * Creates an isolated DOM copy per call (transforms mutate the DOM).\r\n */\r\n transformForClient(clientId: string): TransformResult;\r\n\r\n /**\r\n * Transform HTML for all email clients.\r\n *\r\n * Creates an isolated DOM copy per client (transforms mutate the DOM).\r\n */\r\n transformForAllClients(): TransformResult[];\r\n\r\n /**\r\n * Simulate dark mode for a specific client.\r\n *\r\n * Creates an isolated DOM copy per call (simulation mutates the DOM).\r\n * Operates on the **original** HTML — if you need dark mode on\r\n * already-transformed HTML, use the standalone `simulateDarkMode()` instead.\r\n */\r\n simulateDarkMode(clientId: string): { html: string; warnings: CSSWarning[] };\r\n\r\n}\r\n\r\n/**\r\n * Create a session that pre-parses the HTML once and shares the parsed\r\n * DOM across all read-only analysis operations.\r\n *\r\n * Use this when you need to call multiple analysis functions on the\r\n * same HTML — it eliminates redundant `cheerio.load()` calls.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createSession } from \"@emailens/engine\";\r\n *\r\n * const session = createSession(html, { framework: \"jsx\" });\r\n *\r\n * // These all share a single DOM parse:\r\n * const warnings = session.analyze();\r\n * const scores = session.score(warnings);\r\n * const spam = session.analyzeSpam();\r\n * const links = session.validateLinks();\r\n * const a11y = session.checkAccessibility();\r\n * const images = session.analyzeImages();\r\n *\r\n * // Or run everything at once:\r\n * const report = session.audit();\r\n *\r\n * // Transforms still work (parse internally per client):\r\n * const transforms = session.transformForAllClients();\r\n * ```\r\n */\r\nexport function createSession(\r\n html: string,\r\n options?: CreateSessionOptions,\r\n): EmailSession {\r\n if (!html || !html.trim()) {\r\n // Return a no-op session for empty input\r\n const fw = options?.framework;\r\n return {\r\n html: html || \"\",\r\n framework: fw,\r\n audit: () => ({\r\n compatibility: { warnings: [], scores: {} },\r\n spam: EMPTY_SPAM,\r\n links: EMPTY_LINKS,\r\n accessibility: EMPTY_ACCESSIBILITY,\r\n images: EMPTY_IMAGES,\r\n inboxPreview: EMPTY_INBOX_PREVIEW,\r\n size: EMPTY_SIZE,\r\n templateVariables: EMPTY_TEMPLATE,\r\n }),\r\n analyze: () => [],\r\n score: () => ({}),\r\n analyzeSpam: () => EMPTY_SPAM,\r\n validateLinks: () => EMPTY_LINKS,\r\n checkAccessibility: () => EMPTY_ACCESSIBILITY,\r\n analyzeImages: () => EMPTY_IMAGES,\r\n extractInboxPreview: () => EMPTY_INBOX_PREVIEW,\r\n checkSize: () => EMPTY_SIZE,\r\n checkTemplateVariables: () => EMPTY_TEMPLATE,\r\n transformForClient: (clientId) => ({ clientId, html: html || \"\", warnings: [] }),\r\n transformForAllClients: () => [],\r\n simulateDarkMode: (clientId) => ({ html: html || \"\", warnings: [] }),\r\n };\r\n }\r\n\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n // Parse once — shared across all read-only analysis operations\r\n const $ = cheerio.load(html);\r\n const framework = options?.framework;\r\n\r\n return {\r\n html,\r\n framework,\r\n\r\n audit(opts) {\r\n const skip = new Set(opts?.skip ?? []);\r\n\r\n const warnings = skip.has(\"compatibility\") ? [] : analyzeEmailFromDom($, framework);\r\n const scores = skip.has(\"compatibility\") ? {} : generateCompatibilityScore(warnings);\r\n const spam = skip.has(\"spam\") ? EMPTY_SPAM : analyzeSpamFromDom($, opts?.spam);\r\n const links = skip.has(\"links\") ? EMPTY_LINKS : validateLinksFromDom($);\r\n const accessibility = skip.has(\"accessibility\") ? EMPTY_ACCESSIBILITY : checkAccessibilityFromDom($);\r\n const images = skip.has(\"images\") ? EMPTY_IMAGES : analyzeImagesFromDom($);\r\n const inboxPreview = skip.has(\"inboxPreview\") ? EMPTY_INBOX_PREVIEW : extractInboxPreviewFromDom($);\r\n const size = skip.has(\"size\") ? EMPTY_SIZE : checkSizeFromDom($, html);\r\n const templateVariables = skip.has(\"templateVariables\") ? EMPTY_TEMPLATE : checkTemplateVariablesFromDom($);\r\n\r\n return { compatibility: { warnings, scores }, spam, links, accessibility, images, inboxPreview, size, templateVariables };\r\n },\r\n\r\n analyze() {\r\n return analyzeEmailFromDom($, framework);\r\n },\r\n\r\n score(warnings) {\r\n return generateCompatibilityScore(warnings);\r\n },\r\n\r\n analyzeSpam(opts) {\r\n return analyzeSpamFromDom($, opts);\r\n },\r\n\r\n validateLinks() {\r\n return validateLinksFromDom($);\r\n },\r\n\r\n checkAccessibility() {\r\n return checkAccessibilityFromDom($);\r\n },\r\n\r\n analyzeImages() {\r\n return analyzeImagesFromDom($);\r\n },\r\n\r\n extractInboxPreview() {\r\n return extractInboxPreviewFromDom($);\r\n },\r\n\r\n checkSize() {\r\n return checkSizeFromDom($, html);\r\n },\r\n\r\n checkTemplateVariables() {\r\n return checkTemplateVariablesFromDom($);\r\n },\r\n\r\n // Transforms create isolated copies since they mutate the DOM\r\n transformForClient(clientId) {\r\n return transformForClient(html, clientId, framework);\r\n },\r\n\r\n transformForAllClients() {\r\n return transformForAllClients(html, framework);\r\n },\r\n\r\n simulateDarkMode(clientId) {\r\n return simulateDarkMode(html, clientId);\r\n },\r\n };\r\n}\r\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,4BAA4B,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO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","names":["cheerio","csstree","closeIdx","_","cheerio","csstree","value","cheerio","csstree","cheerio","cheerio","cheerio","cheerio","cheerio","_","cheerio","cheerio","cheerio","cheerio","walk","cheerio"]}
|
|
1
|
+
{"version":3,"sources":["../src/clients.ts","../src/transform.ts","../src/rules/css-support.ts","../src/fix-snippets/html-fixes.ts","../src/fix-snippets/jsx-fixes.ts","../src/fix-snippets/mjml-fixes.ts","../src/fix-snippets/maizzle-fixes.ts","../src/fix-snippets/html-suggestions.ts","../src/fix-snippets/jsx-suggestions.ts","../src/fix-snippets/mjml-suggestions.ts","../src/fix-snippets/maizzle-suggestions.ts","../src/fix-snippets/index.ts","../src/style-utils.ts","../src/downlevel.ts","../src/color-utils.ts","../src/constants.ts","../src/analyze.ts","../src/dark-mode.ts","../src/diff.ts","../src/export-prompt.ts","../src/token-utils.ts","../src/ai-fix.ts","../src/spam-scorer.ts","../src/link-validator.ts","../src/accessibility-checker.ts","../src/image-analyzer.ts","../src/inbox-preview.ts","../src/size-checker.ts","../src/template-checker.ts","../src/audit.ts","../src/plain-text.ts","../src/session.ts"],"sourcesContent":["import type { EmailClient } from \"./types\";\r\n\r\nexport const EMAIL_CLIENTS: EmailClient[] = [\r\n {\r\n id: \"gmail-web\",\r\n name: \"Gmail\",\r\n category: \"webmail\",\r\n engine: \"Gmail Web\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"gmail-android\",\r\n name: \"Gmail Android\",\r\n category: \"mobile\",\r\n engine: \"Gmail Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"gmail-ios\",\r\n name: \"Gmail iOS\",\r\n category: \"mobile\",\r\n engine: \"Gmail Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"outlook-web\",\r\n name: \"Outlook 365\",\r\n category: \"webmail\",\r\n engine: \"Outlook Web\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"outlook-windows\",\r\n name: \"Outlook (New)\",\r\n category: \"desktop\",\r\n engine: \"Outlook Web\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"outlook-windows-legacy\",\r\n name: \"Outlook Classic\",\r\n category: \"desktop\",\r\n engine: \"Microsoft Word\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n deprecated: \"2026-10\",\r\n },\r\n {\r\n id: \"outlook-ios\",\r\n name: \"Outlook iOS\",\r\n category: \"mobile\",\r\n engine: \"Outlook Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"outlook-android\",\r\n name: \"Outlook Android\",\r\n category: \"mobile\",\r\n engine: \"Outlook Mobile\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"apple-mail-macos\",\r\n name: \"Apple Mail\",\r\n category: \"desktop\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"apple-mail-ios\",\r\n name: \"Apple Mail iOS\",\r\n category: \"mobile\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"yahoo-mail\",\r\n name: \"Yahoo Mail\",\r\n category: \"webmail\",\r\n engine: \"Yahoo\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"samsung-mail\",\r\n name: \"Samsung Mail\",\r\n category: \"mobile\",\r\n engine: \"Samsung\",\r\n darkModeSupport: true,\r\n icon: \"smartphone\",\r\n },\r\n {\r\n id: \"thunderbird\",\r\n name: \"Thunderbird\",\r\n category: \"desktop\",\r\n engine: \"Gecko\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n {\r\n id: \"hey-mail\",\r\n name: \"HEY Mail\",\r\n category: \"webmail\",\r\n engine: \"WebKit\",\r\n darkModeSupport: true,\r\n icon: \"mail\",\r\n },\r\n {\r\n id: \"superhuman\",\r\n name: \"Superhuman\",\r\n category: \"desktop\",\r\n engine: \"Blink\",\r\n darkModeSupport: true,\r\n icon: \"monitor\",\r\n },\r\n];\r\n\r\nexport function getClient(id: string): EmailClient | undefined {\r\n return EMAIL_CLIENTS.find((c) => c.id === id);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport type { CSSWarning, Framework, TransformResult } from \"./types\";\r\nimport {\r\n CSS_SUPPORT,\r\n GMAIL_STRIPPED_PROPERTIES,\r\n OUTLOOK_WORD_UNSUPPORTED,\r\n STRUCTURAL_FIX_PROPERTIES,\r\n} from \"./rules/css-support\";\r\nimport { getCodeFix, getSuggestion, isCodeFixGenericFallback } from \"./fix-snippets\";\r\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\r\nimport { downlevelCSS } from \"./downlevel\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\n\r\n// =============================================================================\r\n// Shared helpers\r\n// =============================================================================\r\n\r\n/** Check if a selector contains pseudo-classes or pseudo-elements. */\r\nfunction hasPseudoSelector(selector: string): boolean {\r\n // Match :pseudo or ::pseudo — but not bare : in attribute selectors like [attr:value]\r\n // This catches :hover, :focus, :nth-of-type, :not(), ::before, ::after, etc.\r\n return /(?<![[\\w])::?[a-z][\\w-]*(?:\\(|(?=[^(]))/i.test(selector);\r\n}\r\n\r\n/** Add !important to all declarations in an at-rule AST node. */\r\nfunction addImportantToDeclarations(node: csstree.CssNode): void {\r\n csstree.walk(node, {\r\n visit: \"Declaration\",\r\n enter(decl: csstree.CssNode) {\r\n if (decl.type !== \"Declaration\") return;\r\n if (decl.important) return;\r\n decl.important = true;\r\n },\r\n });\r\n}\r\n\r\n/** Inline <style> blocks into elements using css-tree. Returns non-inlinable CSS. */\r\nfunction inlineStyles($: cheerio.CheerioAPI): string {\r\n const styleBlocks: string[] = [];\r\n $(\"style\").each((_, el) => {\r\n styleBlocks.push($(el).text());\r\n });\r\n\r\n if (styleBlocks.length === 0) return \"\";\r\n\r\n const preserved: string[] = [];\r\n\r\n for (const block of styleBlocks) {\r\n let ast: csstree.CssNode;\r\n try {\r\n ast = csstree.parse(block, { parseCustomProperty: true });\r\n } catch {\r\n continue;\r\n }\r\n\r\n // Collect non-inlinable at-rules (@media, @supports, @keyframes)\r\n csstree.walk(ast, {\r\n visit: \"Atrule\",\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Atrule\") return;\r\n const name = node.name.toLowerCase();\r\n if (name === \"media\" || name === \"supports\" || name === \"keyframes\" || name === \"-webkit-keyframes\" || name === \"font-face\") {\r\n // Add !important to declarations inside @media/@supports so they override inline styles\r\n if (name === \"media\" || name === \"supports\") {\r\n addImportantToDeclarations(node);\r\n }\r\n preserved.push(csstree.generate(node));\r\n return this.skip;\r\n }\r\n },\r\n });\r\n\r\n // Inline regular rules and collect pseudo-selector rules\r\n csstree.walk(ast, {\r\n visit: \"Rule\",\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Rule\" || node.prelude.type !== \"SelectorList\") return;\r\n\r\n const declarations = csstree.generate(node.block);\r\n const declText = declarations.slice(1, -1).trim();\r\n if (!declText) return;\r\n\r\n const selectorText = csstree.generate(node.prelude);\r\n\r\n if (hasPseudoSelector(selectorText)) {\r\n preserved.push(csstree.generate(node));\r\n return;\r\n }\r\n\r\n try {\r\n $(selectorText).each((_, el) => {\r\n const existing = $(el).attr(\"style\") || \"\";\r\n $(el).attr(\"style\", existing ? `${existing}; ${declText}` : declText);\r\n });\r\n } catch {\r\n // Invalid selector for cheerio, skip\r\n }\r\n },\r\n });\r\n }\r\n\r\n return preserved.join(\"\\n\");\r\n}\r\n\r\n/** Build a CSSWarning with framework-aware suggestion + fix + fallback flag. */\r\nfunction makeWarning(\r\n base: Omit<CSSWarning, \"suggestion\" | \"fix\" | \"fixIsGenericFallback\" | \"fixType\">,\r\n prop: string,\r\n clientId: string,\r\n framework?: Framework,\r\n): CSSWarning {\r\n const sug = getSuggestion(prop, clientId, framework);\r\n const fix = getCodeFix(prop, clientId, framework);\r\n const isFallback = framework && (\r\n (sug?.isGenericFallback) ||\r\n (fix && isCodeFixGenericFallback(prop, clientId, framework))\r\n );\r\n return {\r\n ...base,\r\n ...(sug ? { suggestion: sug.text } : {}),\r\n ...(fix ? { fix } : {}),\r\n ...(isFallback ? { fixIsGenericFallback: true } : {}),\r\n fixType: STRUCTURAL_FIX_PROPERTIES.has(prop) ? \"structural\" : \"css\",\r\n };\r\n}\r\n\r\n/** Detect animation/transition usage in inline styles and <style> blocks. */\r\nfunction detectAnimations($: cheerio.CheerioAPI): boolean {\r\n let found = false;\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n props.forEach((_, prop) => {\r\n if (\r\n prop === \"animation\" || prop === \"transition\" ||\r\n prop.startsWith(\"animation-\") || prop.startsWith(\"transition-\")\r\n ) {\r\n found = true;\r\n }\r\n });\r\n });\r\n\r\n if (!found) {\r\n $(\"style\").each((_, el) => {\r\n try {\r\n const ast = csstree.parse($(el).text());\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Declaration\") {\r\n const prop = node.property.toLowerCase();\r\n if (prop === \"animation\" || prop === \"transition\" ||\r\n prop.startsWith(\"animation-\") || prop.startsWith(\"transition-\")) {\r\n found = true;\r\n }\r\n }\r\n },\r\n });\r\n } catch { /* skip unparseable CSS */ }\r\n });\r\n }\r\n\r\n return found;\r\n}\r\n\r\n// =============================================================================\r\n// Data-driven client config\r\n// =============================================================================\r\n\r\ninterface ClientTransformConfig {\r\n id: string;\r\n /** CSS properties stripped from inline styles */\r\n strippedProperties: Set<string>;\r\n /** How stripped properties are treated: \"strip\" removes them, \"info\" just warns */\r\n stripMode: \"strip\" | \"info\";\r\n /** Custom value-level checks (e.g., display:grid but not display:flex) */\r\n valueStrips?: Array<{ prop: string; pattern: RegExp }>;\r\n /** Whether to inline <style> blocks and remove them */\r\n inlineAndStripStyles: boolean;\r\n /** Whether to strip <link rel=\"stylesheet\"> */\r\n stripExternalStylesheets: boolean;\r\n /** Whether to strip <form> elements */\r\n stripForms: boolean;\r\n /** Whether to strip <svg> elements */\r\n stripSvg: boolean;\r\n /** Additional checks to run (animation detection, dark mode hints, etc.) */\r\n additionalChecks?: (\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n framework?: Framework,\r\n ) => CSSWarning[];\r\n}\r\n\r\n// -- Shared additional check functions --\r\n\r\nfunction gmailAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Check for @font-face (must happen before style removal — called pre-strip)\r\n let hasAtFontFace = false;\r\n $(\"style\").each((_, el) => {\r\n try {\r\n const ast = csstree.parse($(el).text());\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Atrule\" && node.name === \"font-face\") {\r\n hasAtFontFace = true;\r\n }\r\n },\r\n });\r\n } catch { /* skip unparseable CSS */ }\r\n });\r\n if (hasAtFontFace) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"@font-face\",\r\n message: \"Gmail does not support custom web fonts.\",\r\n }, \"@font-face\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction gmailPostChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Remove MSO conditional comments\r\n $(\"*\")\r\n .contents()\r\n .filter(function () {\r\n return this.type === \"comment\";\r\n })\r\n .each(function () {\r\n const commentText = (this as unknown as { data: string }).data || \"\";\r\n if (commentText.includes(\"<style\") || commentText.includes(\"[if mso]\") || commentText.includes(\"[if gte mso\")) {\r\n $(this).remove();\r\n }\r\n });\r\n\r\n const styleSug = getSuggestion(\"<style>:partial\", clientId, framework);\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"<style>\",\r\n message: \"Gmail partially supports <style> blocks (head only, 16KB limit). Inlining recommended for safety.\",\r\n suggestion: styleSug.text,\r\n });\r\n\r\n return warnings;\r\n}\r\n\r\nfunction outlookWindowsAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if ($(\"[style*='border-radius']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"border-radius\",\r\n message: \"Outlook Classic ignores border-radius. Buttons and containers will have sharp corners.\",\r\n }, \"border-radius\", clientId, framework));\r\n }\r\n\r\n if ($(\"[style*='max-width']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"max-width\",\r\n message: \"Outlook Classic ignores max-width.\",\r\n }, \"max-width\", clientId, framework));\r\n }\r\n\r\n const hasDivLayout =\r\n $(\"div[style*='display']\").length > 0 ||\r\n $(\"div[style*='flex']\").length > 0 ||\r\n $(\"div[style*='grid']\").length > 0;\r\n\r\n if (hasDivLayout) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"display:flex\",\r\n message: \"Outlook Classic uses Microsoft Word for rendering. Flexbox and Grid layouts will break.\",\r\n }, \"display:flex\", clientId, framework));\r\n }\r\n\r\n if (\r\n $(\"[style*='background-image']\").length > 0 ||\r\n $(\"[style*='background:']\").filter((_, el) =>\r\n ($(el).attr(\"style\") || \"\").includes(\"url(\")\r\n ).length > 0\r\n ) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"background-image\",\r\n message: \"Outlook Classic requires VML for background images.\",\r\n }, \"background-image\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction appleMailAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n const imgsWithTransparentBg = $(\"img\").filter((_, el) => {\r\n const src = $(el).attr(\"src\") || \"\";\r\n return src.endsWith(\".png\") || src.endsWith(\".svg\");\r\n });\r\n\r\n if (imgsWithTransparentBg.length > 0) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"PNG/SVG images with transparent backgrounds may become invisible in Apple Mail dark mode.\",\r\n suggestion: \"Add a white background or padding around images, or use dark-mode-friendly image variants.\",\r\n });\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction yahooAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n _html: string,\r\n framework?: Framework,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"class\",\r\n message: \"Yahoo Mail rewrites CSS class names with a prefix. Class-based selectors in <style> blocks will still work but the names change.\",\r\n });\r\n\r\n if (\r\n $(\"[style*='background']\").filter((_, el) =>\r\n ($(el).attr(\"style\") || \"\").includes(\"url(\")\r\n ).length > 0\r\n ) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"background-image\",\r\n message: \"Yahoo Mail has inconsistent support for CSS background images.\",\r\n }, \"background-image\", clientId, framework));\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction thunderbirdAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n): CSSWarning[] {\r\n if (detectAnimations($)) {\r\n return [{\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"animation\",\r\n message: \"Thunderbird does not support CSS animations or transitions.\",\r\n }];\r\n }\r\n return [];\r\n}\r\n\r\nfunction heyAdditionalChecks(\r\n _$: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"HEY Mail supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion: \"Add a @media (prefers-color-scheme: dark) block to optimize for HEY's audience.\",\r\n });\r\n }\r\n\r\n return warnings;\r\n}\r\n\r\nfunction superhumanAdditionalChecks(\r\n $: cheerio.CheerioAPI,\r\n clientId: string,\r\n html: string,\r\n): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n\r\n if (detectAnimations($)) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"animation\",\r\n message: \"Superhuman may honor OS-level 'reduce motion' preferences, disabling animations.\",\r\n suggestion: \"Use @media (prefers-reduced-motion: reduce) to provide static fallbacks.\",\r\n });\r\n }\r\n\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"<style>\",\r\n message: \"Superhuman uses Chromium rendering with excellent CSS support. Flexbox, Grid, CSS variables, and modern properties all work.\",\r\n });\r\n\r\n return warnings;\r\n}\r\n\r\n// =============================================================================\r\n// Per-client configurations (declarative data)\r\n// =============================================================================\r\n\r\nconst EMPTY_SET: Set<string> = new Set();\r\nconst OUTLOOK_WEB_STRIPPED = new Set([\"position\", \"transform\", \"animation\", \"transition\"]);\r\n\r\nconst CLIENT_CONFIGS: Record<string, ClientTransformConfig> = {\r\n \"gmail-web\": {\r\n id: \"gmail-web\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"gmail-android\": {\r\n id: \"gmail-android\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"gmail-ios\": {\r\n id: \"gmail-ios\",\r\n strippedProperties: GMAIL_STRIPPED_PROPERTIES,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"display\", pattern: /grid/ },\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: true,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: true,\r\n additionalChecks: gmailAdditionalChecks,\r\n },\r\n \"outlook-windows\": {\r\n id: \"outlook-windows\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-windows-legacy\": {\r\n id: \"outlook-windows-legacy\",\r\n strippedProperties: OUTLOOK_WORD_UNSUPPORTED,\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"background\", pattern: /linear-gradient|radial-gradient/ },\r\n { prop: \"background-image\", pattern: /linear-gradient|radial-gradient/ },\r\n ],\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: outlookWindowsAdditionalChecks,\r\n },\r\n \"outlook-web\": {\r\n id: \"outlook-web\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-ios\": {\r\n id: \"outlook-ios\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"outlook-android\": {\r\n id: \"outlook-android\",\r\n strippedProperties: OUTLOOK_WEB_STRIPPED,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"apple-mail-macos\": {\r\n id: \"apple-mail-macos\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: appleMailAdditionalChecks,\r\n },\r\n \"apple-mail-ios\": {\r\n id: \"apple-mail-ios\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: appleMailAdditionalChecks,\r\n },\r\n \"yahoo-mail\": {\r\n id: \"yahoo-mail\",\r\n strippedProperties: new Set([\"position\", \"box-shadow\", \"transform\", \"animation\", \"transition\", \"opacity\"]),\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: yahooAdditionalChecks,\r\n },\r\n \"samsung-mail\": {\r\n id: \"samsung-mail\",\r\n strippedProperties: new Set([\"box-shadow\", \"transform\", \"animation\", \"transition\", \"opacity\"]),\r\n stripMode: \"info\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n },\r\n \"thunderbird\": {\r\n id: \"thunderbird\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: false,\r\n stripForms: false,\r\n stripSvg: false,\r\n additionalChecks: thunderbirdAdditionalChecks,\r\n },\r\n \"hey-mail\": {\r\n id: \"hey-mail\",\r\n strippedProperties: new Set([\"transform\", \"animation\", \"transition\"]),\r\n stripMode: \"strip\",\r\n valueStrips: [\r\n { prop: \"position\", pattern: /fixed|sticky/ },\r\n ],\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: false,\r\n additionalChecks: heyAdditionalChecks,\r\n },\r\n \"superhuman\": {\r\n id: \"superhuman\",\r\n strippedProperties: EMPTY_SET,\r\n stripMode: \"strip\",\r\n inlineAndStripStyles: false,\r\n stripExternalStylesheets: true,\r\n stripForms: true,\r\n stripSvg: false,\r\n additionalChecks: superhumanAdditionalChecks,\r\n },\r\n};\r\n\r\n// =============================================================================\r\n// Shared transform engine\r\n// =============================================================================\r\n\r\nfunction applyTransform(\r\n html: string,\r\n config: ClientTransformConfig,\r\n framework?: Framework,\r\n): TransformResult {\r\n const $ = cheerio.load(html);\r\n const warnings: CSSWarning[] = [];\r\n const clientId = config.id;\r\n\r\n // 1a. Pre-strip additional checks (e.g., Gmail @font-face detection)\r\n if (config.additionalChecks && config.inlineAndStripStyles) {\r\n warnings.push(...config.additionalChecks($, clientId, html, framework));\r\n }\r\n\r\n // 1b. Inline + strip <style> if needed\r\n if (config.inlineAndStripStyles) {\r\n const preserved = inlineStyles($);\r\n $(\"style\").remove();\r\n if (preserved.trim()) {\r\n const head = $(\"head\");\r\n if (head.length > 0) {\r\n head.append(`<style>${preserved}</style>`);\r\n } else {\r\n // If no <head>, prepend to body\r\n $(\"body\").prepend(`<style>${preserved}</style>`);\r\n }\r\n }\r\n }\r\n\r\n // 2. Strip external stylesheets\r\n if (config.stripExternalStylesheets) {\r\n if ($(\"link[rel='stylesheet']\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<link>\",\r\n message: `${clientId} does not load external stylesheets.`,\r\n }, \"<link>\", clientId, framework));\r\n $(\"link[rel='stylesheet']\").remove();\r\n }\r\n }\r\n\r\n // 3. Strip forms\r\n if (config.stripForms && $(\"form\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<form>\",\r\n message: `${clientId} removes form elements.`,\r\n }, \"<form>\", clientId, framework));\r\n $(\"form\").each((_, el) => {\r\n $(el).replaceWith($(el).html() || \"\");\r\n });\r\n }\r\n\r\n // 4. Strip SVG\r\n if (config.stripSvg && $(\"svg\").length > 0) {\r\n warnings.push(makeWarning({\r\n severity: \"error\",\r\n client: clientId,\r\n property: \"<svg>\",\r\n message: `${clientId} does not support inline SVG elements.`,\r\n }, \"<svg>\", clientId, framework));\r\n $(\"svg\").each((_, el) => {\r\n $(el).replaceWith('<img alt=\"[SVG not supported]\" />');\r\n });\r\n }\r\n\r\n // 5. Strip/warn about unsupported CSS properties (shared loop)\r\n if (config.strippedProperties.size > 0 || (config.valueStrips && config.valueStrips.length > 0)) {\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n const removed: string[] = [];\r\n\r\n props.forEach((value, prop) => {\r\n // Check stripped properties\r\n if (config.strippedProperties.has(prop)) {\r\n if (config.stripMode === \"strip\") {\r\n removed.push(prop);\r\n props.delete(prop);\r\n } else {\r\n warnings.push(makeWarning({\r\n severity: \"info\",\r\n client: clientId,\r\n property: prop,\r\n message: `${clientId} has limited support for \"${prop}\".`,\r\n }, prop, clientId, framework));\r\n }\r\n return;\r\n }\r\n\r\n // Check value-level strips\r\n for (const vs of config.valueStrips ?? []) {\r\n if (prop === vs.prop && vs.pattern.test(value)) {\r\n removed.push(prop);\r\n props.delete(prop);\r\n return;\r\n }\r\n }\r\n });\r\n\r\n if (removed.length > 0) {\r\n $(el).attr(\"style\", serializeStyle(props));\r\n for (const prop of removed) {\r\n warnings.push(makeWarning({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: prop,\r\n message: `${clientId} strips \"${prop}\" from styles.`,\r\n }, prop, clientId, framework));\r\n }\r\n }\r\n });\r\n }\r\n\r\n // 6. Gmail-specific post-strip checks (MSO comments, partial style info)\r\n if (config.inlineAndStripStyles) {\r\n warnings.push(...gmailPostChecks($, clientId, html, framework));\r\n }\r\n\r\n // 7. Run additional checks (non-Gmail, or non-pre-strip)\r\n if (config.additionalChecks && !config.inlineAndStripStyles) {\r\n warnings.push(...config.additionalChecks($, clientId, html, framework));\r\n }\r\n\r\n return { clientId, html: $.html(), warnings };\r\n}\r\n\r\n// =============================================================================\r\n// Public API\r\n// =============================================================================\r\n\r\nexport function transformForClient(\r\n html: string,\r\n clientId: string,\r\n framework?: Framework,\r\n): TransformResult {\r\n if (!html || !html.trim()) {\r\n return { clientId, html: html || \"\", warnings: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const config = CLIENT_CONFIGS[clientId];\r\n if (!config) {\r\n return {\r\n clientId,\r\n html,\r\n warnings: [\r\n {\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"unknown\",\r\n message: `No transformation rules available for client \"${clientId}\".`,\r\n },\r\n ],\r\n };\r\n }\r\n\r\n // Downlevel once per transformForClient call\r\n const downleveled = downlevelCSS(html);\r\n return applyTransform(downleveled, config, framework);\r\n}\r\n\r\nexport function transformForAllClients(html: string, framework?: Framework): TransformResult[] {\r\n if (!html || !html.trim()) {\r\n return Object.keys(CLIENT_CONFIGS).map((clientId) => ({\r\n clientId, html: html || \"\", warnings: [],\r\n }));\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n // Downlevel once, reuse for all clients\r\n const downleveled = downlevelCSS(html);\r\n return Object.keys(CLIENT_CONFIGS).map((clientId) =>\r\n applyTransform(downleveled, CLIENT_CONFIGS[clientId], framework)\r\n );\r\n}\r\n","import type { SupportLevel } from \"../types\";\n\n/**\n * CSS/HTML feature support matrix — auto-generated from caniemail.com.\n * Last synced: 2026-03-23\n * caniemail last updated: 2026-02-16 15:39:06 +0000\n *\n * 251 features across 15 email clients.\n *\n * Support levels:\n * - \"supported\": fully supported\n * - \"partial\": partially supported (with caveats)\n * - \"unsupported\": not supported at all\n * - \"unknown\": no data available\n *\n * Data sources:\n * - Most clients: caniemail.com API (verified data)\n * - hey-mail: caniemail.com (WebKit-based)\n * - superhuman: Manual overrides (Chromium/Blink-based, best-effort estimates)\n *\n * DO NOT EDIT — regenerate with: bun run sync:caniemail\n */\nexport const CSS_SUPPORT: Record<\n string,\n Record<string, SupportLevel>\n> = {\n \"<abbr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<acronym>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<address>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<audio>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<base>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<bdi>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<blockquote>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<body>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"<code>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<del>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<dfn>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<dialog>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<div>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<form>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<h1>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<hr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"<img>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<link>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<marquee>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<meter>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<object>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<p>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<picture>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"supported\",\n },\n \"<pre>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<progress>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<rp>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<rt>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<ruby>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<select>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<small>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<span>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<strike>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<strong>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<style>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"<svg>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"supported\",\n },\n \"<table>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<textarea>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"<ul>\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"<video>\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unsupported\",\n },\n \"<wbr>\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"@font-face\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"@import\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unsupported\",\n },\n \"@keyframes\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"@media\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"@supports\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"!important\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"accent-color\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"align-items\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"animation\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"aspect-ratio\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"backdrop-filter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"background\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-blend-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"background-clip\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-image\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-origin\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-repeat\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"background-size\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"bimi\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"border\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"border-collapse\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"border-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline-individual\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-inline-longhand\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-radius\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"border-radius-logical\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"border-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"bottom\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"box-shadow\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"box-sizing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"calc\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"caption-side\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"clamp\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"clear\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"clip-path\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"color-scheme\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \"column-count\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"columns\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"conic-gradient\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"css-comments\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"cursor\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unknown\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"unknown\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"custom-properties\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"direction\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"empty-cells\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"filter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"fit-content\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"flex-direction\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"flex-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"float\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"font\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"font-family\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"font-kerning\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"font-size\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"font-stretch\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"font-weight\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"gap\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"grid-template-columns\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"hyphenate-character\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"hyphenate-limit-chars\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"hyphens\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"inset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"justify-content\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"left\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"letter-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"light-dark\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unknown\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"unknown\",\n },\n \"line-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"linear-gradient\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"list-style\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"list-style-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"list-style-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"list-style-type\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"margin\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"margin-block-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"margin-inline-block\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"margin-inline-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"mask-image\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"max-block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"max-inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"max-width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"min\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"min-block-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"min-height\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"min-inline-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"min-width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"mix-blend-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"modern-color\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"nesting\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"object-fit\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"object-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"opacity\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"orphans\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"outline\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"outline-offset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"overflow\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"overflow-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"padding\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"padding-block-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"padding-inline-block\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"padding-inline-start-end\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"position\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"partial\",\n },\n \"pseudo-class-active\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"pseudo-class-default\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unknown\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"pseudo-class-nth-last-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"radial-gradient\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"resize\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unsupported\",\n },\n \"rgb\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"rgba\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"right\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"scroll-snap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"shape-margin\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"shape-outside\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"system-ui\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"partial\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"tab-size\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"table-layout\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"text-align\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-align-last\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unknown\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-decoration-color\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-line\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-skip-ink\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-style\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-decoration-thickness\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-emphasis\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-emphasis-position\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-indent\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-justify\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-orientation\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-overflow\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-shadow\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-transform\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"text-underline-offset\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"text-underline-position\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"text-wrap\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"top\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"transform\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"partial\",\n },\n \"transition\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"partial\",\n },\n \"unit-ch\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-cm\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-em\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-ex\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-in\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-initial\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-mm\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-pc\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-percent\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-pt\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-px\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-rem\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vh\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vmax\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vmin\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"unit-vw\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"user-select\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"vertical-align\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"visibility\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"white-space\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"white-space-collapse\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \"widows\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"width\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"word-break\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"partial\",\n \"apple-mail-ios\": \"partial\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"partial\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"partial\",\n \"superhuman\": \"supported\",\n },\n \"word-spacing\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"supported\",\n },\n \"writing-mode\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"z-index\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"::after\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::before\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::first-letter\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::first-line\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::marker\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"::placeholder\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":adjacent-sibling\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":attribute-selector\": {\n \"gmail-web\": \"partial\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"partial\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":chaining\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":checked\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"partial\",\n \"outlook-android\": \"partial\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":child-combinator\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":class-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":descendant-combinator\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":first-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":first-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":focus\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":general-sibling\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":grouping\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":has\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unsupported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":hover\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":id-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":lang\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"unknown\",\n \"hey-mail\": \"unknown\",\n \"superhuman\": \"unknown\",\n },\n \":last-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":last-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":link\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":not\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-last-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":nth-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"unsupported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":only-child\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":only-of-type\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":target\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"unsupported\",\n \"superhuman\": \"unknown\",\n },\n \":type-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"supported\",\n \"outlook-windows-legacy\": \"supported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":universal-selector\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \":visited\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"partial\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"unsupported\",\n \"apple-mail-ios\": \"unsupported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"unsupported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"unknown\",\n },\n \"display:flex\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"partial\",\n \"gmail-ios\": \"partial\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display:grid\": {\n \"gmail-web\": \"unsupported\",\n \"gmail-android\": \"unsupported\",\n \"gmail-ios\": \"unsupported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"unsupported\",\n \"outlook-windows-legacy\": \"unsupported\",\n \"outlook-ios\": \"unsupported\",\n \"outlook-android\": \"unsupported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"unsupported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n \"display:none\": {\n \"gmail-web\": \"supported\",\n \"gmail-android\": \"supported\",\n \"gmail-ios\": \"supported\",\n \"outlook-web\": \"supported\",\n \"outlook-windows\": \"partial\",\n \"outlook-windows-legacy\": \"partial\",\n \"outlook-ios\": \"supported\",\n \"outlook-android\": \"supported\",\n \"apple-mail-macos\": \"supported\",\n \"apple-mail-ios\": \"supported\",\n \"yahoo-mail\": \"supported\",\n \"samsung-mail\": \"supported\",\n \"thunderbird\": \"supported\",\n \"hey-mail\": \"supported\",\n \"superhuman\": \"supported\",\n },\n};\n\n/**\n * CSS properties that Gmail strips from inline styles.\n * Updated per caniemail.com data — Gmail keeps float and display (basic values).\n */\nexport const GMAIL_STRIPPED_PROPERTIES = new Set([\n \"position\",\n \"visibility\",\n \"box-shadow\",\n \"text-shadow\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"gap\",\n \"filter\",\n \"clip-path\",\n \"backdrop-filter\",\n]);\n\n/** CSS properties that Outlook Word engine ignores */\nexport const OUTLOOK_WORD_UNSUPPORTED = new Set([\n \"border-radius\",\n \"box-shadow\",\n \"text-shadow\",\n \"max-width\",\n \"max-height\",\n \"min-width\",\n \"min-height\",\n \"float\",\n \"position\",\n \"display\",\n \"overflow\",\n \"opacity\",\n \"transform\",\n \"animation\",\n \"transition\",\n \"background-size\",\n \"background-position\",\n \"box-sizing\",\n \"object-fit\",\n \"gap\",\n \"word-break\",\n \"overflow-wrap\",\n \"text-overflow\",\n \"border-spacing\",\n \"filter\",\n \"clip-path\",\n \"backdrop-filter\",\n \"visibility\",\n]);\n\n/**\n * Properties that require HTML structural changes (not just CSS swaps)\n * to fix. These cannot be solved by replacing one CSS value with another.\n */\nexport const STRUCTURAL_FIX_PROPERTIES = new Set([\n \"display:flex\",\n \"display:grid\",\n \"word-break\",\n \"overflow-wrap\",\n \"text-overflow\",\n \"position\",\n \"float\",\n \"gap\",\n \"max-width\",\n \"border-radius\",\n \"background-image\",\n \"background-size\",\n \"background-position\",\n \"<svg>\",\n \"<video>\",\n \"<form>\",\n \"object-fit\",\n]);\n\n/** HTML element features in the support matrix (for data-driven detection). */\nexport const HTML_ELEMENT_FEATURES = [\n \"<abbr>\",\n \"<acronym>\",\n \"<address>\",\n \"<audio>\",\n \"<base>\",\n \"<bdi>\",\n \"<blockquote>\",\n \"<body>\",\n \"<code>\",\n \"<del>\",\n \"<dfn>\",\n \"<dialog>\",\n \"<div>\",\n \"<form>\",\n \"<h1>\",\n \"<hr>\",\n \"<img>\",\n \"<link>\",\n \"<marquee>\",\n \"<meter>\",\n \"<object>\",\n \"<p>\",\n \"<picture>\",\n \"<pre>\",\n \"<progress>\",\n \"<rp>\",\n \"<rt>\",\n \"<ruby>\",\n \"<select>\",\n \"<small>\",\n \"<span>\",\n \"<strike>\",\n \"<strong>\",\n \"<style>\",\n \"<svg>\",\n \"<table>\",\n \"<textarea>\",\n \"<ul>\",\n \"<video>\",\n \"<wbr>\",\n] as const;\n\n/** CSS at-rule features in the support matrix. */\nexport const AT_RULE_FEATURES = [\n \"@font-face\",\n \"@import\",\n \"@keyframes\",\n \"@media\",\n \"@supports\",\n] as const;\n\n/** Compound CSS value features (e.g., \"display:flex\"). */\nexport const COMPOUND_VALUE_FEATURES = [\n \"::after\",\n \"::before\",\n \"::first-letter\",\n \"::first-line\",\n \"::marker\",\n \"::placeholder\",\n \":adjacent-sibling\",\n \":attribute-selector\",\n \":chaining\",\n \":checked\",\n \":child-combinator\",\n \":class-selector\",\n \":descendant-combinator\",\n \":first-child\",\n \":first-of-type\",\n \":focus\",\n \":general-sibling\",\n \":grouping\",\n \":has\",\n \":hover\",\n \":id-selector\",\n \":lang\",\n \":last-child\",\n \":last-of-type\",\n \":link\",\n \":not\",\n \":nth-child\",\n \":nth-last-child\",\n \":nth-of-type\",\n \":only-child\",\n \":only-of-type\",\n \":target\",\n \":type-selector\",\n \":universal-selector\",\n \":visited\",\n \"display:flex\",\n \"display:grid\",\n \"display:none\",\n] as const;\n\n/** CSS function features (e.g., \"linear-gradient\"). */\nexport const CSS_FUNCTION_FEATURES = [\n \"calc\",\n \"clamp\",\n \"conic-gradient\",\n \"fit-content\",\n \"linear-gradient\",\n \"max\",\n \"min\",\n \"radial-gradient\",\n] as const;\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * HTML/generic code fix snippets — entries that do NOT have a\r\n * ::jsx, ::mjml, or ::maizzle suffix in their key.\r\n */\r\nexport const HTML_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── border-radius (Outlook VML fallback) ──────────────────────────────\r\n \"border-radius::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML to render rounded buttons in Outlook\",\r\n before: `<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; border-radius: 6px;\r\n text-decoration: none; display: inline-block;\">\r\n Click Here\r\n</a>`,\r\n after: `<!--[if mso]>\r\n<v:roundrect xmlns:v=\"urn:schemas-microsoft-com:vml\"\r\n href=\"https://example.com\"\r\n style=\"height:44px; v-text-anchor:middle; width:200px;\"\r\n arcsize=\"14%\" strokecolor=\"#6d28d9\" fillcolor=\"#6d28d9\">\r\n <w:anchorlock/>\r\n <center style=\"color:#fff; font-family:Arial,sans-serif;\r\n font-size:14px; font-weight:bold;\">Click Here</center>\r\n</v:roundrect>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; border-radius: 6px;\r\n text-decoration: none; display: inline-block;\">\r\n Click Here\r\n</a>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── background-image (Outlook VML) ────────────────────────────────────\r\n \"background-image::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML for background images in Outlook\",\r\n before: `<td style=\"background-image: url('hero.jpg');\r\n background-size: cover; padding: 40px;\">\r\n <h1 style=\"color: #fff;\">Hello World</h1>\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px; height:300px;\">\r\n <v:fill type=\"frame\" src=\"hero.jpg\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background-image: url('hero.jpg');\r\n background-size: cover; padding: 40px;\">\r\n <h1 style=\"color: #fff;\">Hello World</h1>\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── display:flex → table layout ───────────────────────────────────────\r\n \"display:flex::outlook\": {\r\n language: \"html\",\r\n description: \"Use table layout as fallback for flexbox in Outlook\",\r\n before: `<div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\"><tr>\r\n <td width=\"50%\" valign=\"top\">Column 1</td>\r\n <td width=\"50%\" valign=\"top\">Column 2</td>\r\n</tr></table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n</div>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── display:grid → table layout ───────────────────────────────────────\r\n \"display:grid\": {\r\n language: \"html\",\r\n description: \"Replace CSS Grid with table layout for email compatibility\",\r\n before: `<div style=\"display: grid;\r\n grid-template-columns: 1fr 1fr; gap: 16px;\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n</div>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td width=\"50%\" style=\"padding: 8px;\" valign=\"top\">\r\n Item 1\r\n </td>\r\n <td width=\"50%\" style=\"padding: 8px;\" valign=\"top\">\r\n Item 2\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── linear-gradient fallback ──────────────────────────────────────────\r\n \"linear-gradient\": {\r\n language: \"html\",\r\n description: \"Add solid color fallback for gradient backgrounds\",\r\n before: `<td style=\"background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n after: `<!-- Always declare a solid background-color before the gradient.\r\n Clients that strip gradients will show the fallback color. -->\r\n<td style=\"background-color: #667eea;\r\n background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n },\r\n\r\n \"linear-gradient::outlook\": {\r\n language: \"html\",\r\n description: \"Use VML to render gradients in Outlook\",\r\n before: `<td style=\"background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px;\">\r\n <v:fill type=\"gradient\" color=\"#667eea\" color2=\"#764ba2\"\r\n angle=\"135\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background-color: #667eea;\r\n background: linear-gradient(135deg, #667eea, #764ba2);\r\n padding: 40px; color: #fff;\">\r\n Content here\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── <style> stripped by Gmail ──────────────────────────────────────────\r\n \"<style>::gmail\": {\r\n language: \"html\",\r\n description: \"Inline CSS for Gmail compatibility\",\r\n before: `<style>\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n .title { color: #fff; font-size: 24px; }\r\n</style>\r\n<div class=\"header\">\r\n <h1 class=\"title\">Hello</h1>\r\n</div>`,\r\n after: `<div style=\"background-color: #6d28d9; padding: 32px;\">\r\n <h1 style=\"color: #fff; font-size: 24px;\r\n font-family: Arial, sans-serif; margin: 0;\">\r\n Hello\r\n </h1>\r\n</div>`,\r\n },\r\n\r\n // ── <svg> replaced with image ─────────────────────────────────────────\r\n \"<svg>\": {\r\n language: \"html\",\r\n description: \"Convert inline SVG to an image for email compatibility\",\r\n before: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" fill=\"#6d28d9\"/>\r\n</svg>`,\r\n after: `<img src=\"https://example.com/icon.png\"\r\n width=\"24\" height=\"24\" alt=\"Icon\"\r\n style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── <form> → link to web form ─────────────────────────────────────────\r\n \"<form>\": {\r\n language: \"html\",\r\n description: \"Replace embedded form with a link to a hosted form\",\r\n before: `<form action=\"/subscribe\" method=\"POST\">\r\n <input type=\"email\" placeholder=\"Email\" />\r\n <button type=\"submit\">Subscribe</button>\r\n</form>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\">\r\n <tr>\r\n <td style=\"background-color: #6d28d9; border-radius: 6px;\r\n padding: 12px 32px;\">\r\n <a href=\"https://example.com/subscribe\"\r\n style=\"color: #fff; text-decoration: none;\r\n font-family: Arial, sans-serif;\r\n font-weight: bold;\">\r\n Subscribe Now\r\n </a>\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── <video> → GIF + play button ───────────────────────────────────────\r\n \"<video>\": {\r\n language: \"html\",\r\n description: \"Replace video with animated GIF or linked thumbnail\",\r\n before: `<video width=\"600\" autoplay muted>\r\n <source src=\"demo.mp4\" type=\"video/mp4\">\r\n</video>`,\r\n after: `<a href=\"https://example.com/watch\" target=\"_blank\">\r\n <img src=\"https://example.com/video-thumb.gif\"\r\n width=\"600\" alt=\"Watch the video\"\r\n style=\"display: block; border: 0; max-width: 100%;\" />\r\n</a>`,\r\n },\r\n\r\n // ── @font-face → web-safe stack ───────────────────────────────────────\r\n \"@font-face\": {\r\n language: \"css\",\r\n description: \"Add web-safe font fallback stack\",\r\n before: `@font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n}\r\nh1 { font-family: 'CustomFont'; }`,\r\n after: `/* Keep @font-face for clients that support it */\r\n@font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n}\r\nh1 {\r\n font-family: 'CustomFont', Arial, Helvetica, sans-serif;\r\n}`,\r\n },\r\n\r\n // ── @media → mobile-first layout ──────────────────────────────────────\r\n \"@media\": {\r\n language: \"html\",\r\n description: \"Design mobile-first for clients without media query support\",\r\n before: `<table width=\"800\">\r\n <tr>\r\n <td width=\"400\">Left Column</td>\r\n <td width=\"400\">Right Column</td>\r\n </tr>\r\n</table>\r\n<style>\r\n @media (max-width: 600px) {\r\n table { width: 100% !important; }\r\n td { display: block !important; width: 100% !important; }\r\n }\r\n</style>`,\r\n after: `<!-- Single-column layout that works without @media -->\r\n<table role=\"presentation\" width=\"100%\"\r\n style=\"max-width: 600px;\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"padding: 16px;\">Left Column</td>\r\n </tr>\r\n <tr>\r\n <td style=\"padding: 16px;\">Right Column</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── box-shadow → border alternative ───────────────────────────────────\r\n \"box-shadow\": {\r\n language: \"css\",\r\n description: \"Use border as a fallback for box-shadow\",\r\n before: `.card {\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n}`,\r\n after: `.card {\r\n border: 1px solid #e0e0e0;\r\n /* box-shadow as progressive enhancement */\r\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\r\n}`,\r\n },\r\n\r\n // ── max-width (Outlook) → fixed width table ───────────────────────────\r\n \"max-width::outlook\": {\r\n language: \"html\",\r\n description: \"Use a fixed-width table wrapper for Outlook\",\r\n before: `<div style=\"max-width: 600px; margin: 0 auto;\">\r\n Content here\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"600\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td>\r\n<![endif]-->\r\n<div style=\"max-width: 600px; margin: 0 auto;\">\r\n Content here\r\n</div>\r\n<!--[if mso]>\r\n</td></tr></table>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── float (Outlook) → table align ─────────────────────────────────────\r\n \"float::outlook\": {\r\n language: \"html\",\r\n description: \"Use table align attribute instead of CSS float\",\r\n before: `<img src=\"photo.jpg\" style=\"float: left;\r\n margin-right: 16px;\" width=\"200\" />\r\n<p>Text wraps around the image.</p>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td width=\"200\" valign=\"top\" style=\"padding-right: 16px;\">\r\n <img src=\"photo.jpg\" width=\"200\"\r\n style=\"display: block; border: 0;\" />\r\n </td>\r\n <td valign=\"top\">\r\n <p>Text next to the image.</p>\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── gap → padding on children ─────────────────────────────────────────\r\n \"gap\": {\r\n language: \"html\",\r\n description: \"Use padding or margin on child elements instead of gap\",\r\n before: `<div style=\"display: flex; gap: 16px;\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n <div>Item 3</div>\r\n</div>`,\r\n after: `<table role=\"presentation\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"padding-right: 16px;\">Item 1</td>\r\n <td style=\"padding-right: 16px;\">Item 2</td>\r\n <td>Item 3</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── opacity → solid colors ────────────────────────────────────────────\r\n \"opacity\": {\r\n language: \"css\",\r\n description: \"Replace opacity with solid color equivalents\",\r\n before: `.overlay {\r\n background-color: #000;\r\n opacity: 0.5;\r\n}`,\r\n after: `.overlay {\r\n /* Use a semi-transparent color instead of opacity */\r\n background-color: #808080;\r\n /* Or for modern clients: rgba(0, 0, 0, 0.5) */\r\n}`,\r\n },\r\n\r\n // ── position → table layout ───────────────────────────────────────────\r\n \"position\": {\r\n language: \"html\",\r\n description: \"Use table-based positioning instead of CSS position\",\r\n before: `<div style=\"position: relative;\">\r\n <div style=\"position: absolute; top: 0; right: 0;\">\r\n Badge\r\n </div>\r\n <p>Content</p>\r\n</div>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td valign=\"top\">Content</td>\r\n <td width=\"80\" valign=\"top\" align=\"right\">Badge</td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── box-sizing → nested padding ───────────────────────────────────────\r\n \"box-sizing\": {\r\n language: \"html\",\r\n description: \"Account for padding in width manually (no box-sizing)\",\r\n before: `<div style=\"width: 300px; padding: 20px;\r\n box-sizing: border-box;\">\r\n Content — total width stays 300px\r\n</div>`,\r\n after: `<!-- Set width to content-width (300 - 40 = 260px) -->\r\n<div style=\"width: 300px;\">\r\n <div style=\"padding: 20px;\">\r\n Content — padding on inner element\r\n </div>\r\n</div>`,\r\n },\r\n\r\n // ── <link> → inline styles ────────────────────────────────────────────\r\n \"<link>\": {\r\n language: \"html\",\r\n description: \"Inline all CSS instead of using external stylesheets\",\r\n before: `<head>\r\n <link rel=\"stylesheet\" href=\"styles.css\" />\r\n</head>`,\r\n after: `<head>\r\n <style>\r\n /* Paste your CSS here, or use a build tool like\r\n juice/inline-css to inline automatically */\r\n .container { max-width: 600px; margin: 0 auto; }\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n </style>\r\n</head>`,\r\n },\r\n\r\n // ── dark-mode (Apple Mail) ────────────────────────────────────────────\r\n \"dark-mode::apple\": {\r\n language: \"css\",\r\n description: \"Add prefers-color-scheme dark mode styles for Apple Mail\",\r\n before: `<style>\r\n .header { background-color: #6d28d9; }\r\n .content { background-color: #ffffff; color: #333; }\r\n</style>`,\r\n after: `<style>\r\n .header { background-color: #6d28d9; }\r\n .content { background-color: #ffffff; color: #333; }\r\n\r\n @media (prefers-color-scheme: dark) {\r\n .content {\r\n background-color: #1a1a2e !important;\r\n color: #e0e0e0 !important;\r\n }\r\n /* Force images to stay visible */\r\n img { opacity: 1 !important; }\r\n }\r\n</style>`,\r\n },\r\n\r\n // ── object-fit → width/height attributes ──────────────────────────────\r\n \"object-fit\": {\r\n language: \"html\",\r\n description: \"Use width/height attributes instead of object-fit\",\r\n before: `<img src=\"photo.jpg\" style=\"width: 300px; height: 200px;\r\n object-fit: cover;\" />`,\r\n after: `<!-- Crop/resize image server-side to exact dimensions -->\r\n<img src=\"photo-300x200.jpg\" width=\"300\" height=\"200\"\r\n alt=\"Photo\" style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── transform (not supported) ─────────────────────────────────────────\r\n \"transform\": {\r\n language: \"html\",\r\n description: \"Pre-render transformed states as images or use table layout\",\r\n before: `<div style=\"transform: rotate(45deg);\">\r\n Rotated content\r\n</div>`,\r\n after: `<!-- Pre-render rotated content as an image -->\r\n<img src=\"rotated-content.png\" width=\"200\" height=\"200\"\r\n alt=\"Rotated content\"\r\n style=\"display: block; border: 0;\" />`,\r\n },\r\n\r\n // ── animation → animated GIF ──────────────────────────────────────────\r\n \"animation\": {\r\n language: \"html\",\r\n description: \"Replace CSS animation with an animated GIF\",\r\n before: `<style>\r\n @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }\r\n .badge { animation: pulse 2s infinite; }\r\n</style>\r\n<span class=\"badge\">New!</span>`,\r\n after: `<!-- Use an animated GIF for the effect -->\r\n<img src=\"https://example.com/badge-animated.gif\"\r\n width=\"60\" height=\"24\" alt=\"New!\"\r\n style=\"display: inline-block; border: 0;\" />`,\r\n },\r\n\r\n // ── transition (not supported) ────────────────────────────────────────\r\n \"transition\": {\r\n language: \"css\",\r\n description: \"Transitions don't work in email — style the default state well\",\r\n before: `.button {\r\n background-color: #6d28d9;\r\n transition: background-color 0.2s;\r\n}\r\n.button:hover {\r\n background-color: #5b21b6;\r\n}`,\r\n after: `.button {\r\n /* Use the most visually appealing state as default.\r\n :hover is only supported in a few clients. */\r\n background-color: #6d28d9;\r\n color: #ffffff;\r\n text-decoration: none;\r\n font-weight: bold;\r\n}`,\r\n },\r\n\r\n // ── background-size (Outlook) → VML ───────────────────────────────────\r\n \"background-size\": {\r\n language: \"html\",\r\n description: \"Outlook ignores background-size — use VML or sized images\",\r\n before: `<td style=\"background: url('bg.jpg') center/cover no-repeat;\">\r\n Content\r\n</td>`,\r\n after: `<!--[if gte mso 9]>\r\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\r\n stroke=\"false\" style=\"width:600px; height:400px;\">\r\n <v:fill type=\"frame\" src=\"bg.jpg\" />\r\n <v:textbox inset=\"0,0,0,0\">\r\n<![endif]-->\r\n<td style=\"background: url('bg.jpg') center/cover no-repeat;\r\n background-color: #333;\">\r\n Content\r\n</td>\r\n<!--[if gte mso 9]>\r\n </v:textbox>\r\n</v:rect>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── overflow (Gmail strips it) ────────────────────────────────────────\r\n \"overflow\": {\r\n language: \"html\",\r\n description: \"Content will always be visible — design for full content display\",\r\n before: `<div style=\"max-height: 200px; overflow: hidden;\">\r\n Long content that gets clipped...\r\n</div>`,\r\n after: `<!-- Show full content, or truncate server-side -->\r\n<div style=\"max-height: 200px;\">\r\n Shortened content that fits...\r\n <a href=\"https://example.com/full\">Read more</a>\r\n</div>`,\r\n },\r\n\r\n // ── visibility (Gmail strips it) ──────────────────────────────────────\r\n \"visibility\": {\r\n language: \"html\",\r\n description: \"Use conditional comments or remove hidden content\",\r\n before: `<div style=\"visibility: hidden;\">\r\n Hidden content for screen readers\r\n</div>`,\r\n after: `<!-- For screen readers, use font-size: 0 trick -->\r\n<div style=\"font-size: 0; max-height: 0; overflow: hidden;\r\n mso-hide: all;\" aria-hidden=\"true\">\r\n Preheader text\r\n</div>`,\r\n },\r\n\r\n // ── word-break → table cell wrapping ──────────────────────────────────\r\n \"word-break\": {\r\n language: \"html\",\r\n description: \"Wrap long text in a table cell to force line breaks without word-break\",\r\n before: `<span style=\"word-break: break-all;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n</span>`,\r\n after: `<!-- Table cells force text wrapping in all clients including Outlook -->\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"word-break: break-all; overflow-wrap: break-word;\r\n word-wrap: break-word;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── overflow-wrap → table cell wrapping ───────────────────────────────\r\n \"overflow-wrap\": {\r\n language: \"html\",\r\n description: \"Use a table cell to force word wrapping without overflow-wrap\",\r\n before: `<p style=\"overflow-wrap: break-word;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n</p>`,\r\n after: `<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td style=\"overflow-wrap: break-word; word-wrap: break-word;\r\n word-break: break-all;\">\r\n https://example.com/very/long/url?token=abc123def456\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── text-shadow → border/font-weight alternative ──────────────────────\r\n \"text-shadow\": {\r\n language: \"css\",\r\n description: \"Use font-weight or border-bottom as alternatives to text-shadow\",\r\n before: `.glow {\r\n text-shadow: 0 0 10px rgba(255, 255, 255, 0.5);\r\n}`,\r\n after: `.glow {\r\n /* text-shadow is not supported in Gmail, Outlook, Yahoo.\r\n Use font-weight or letter-spacing for emphasis instead. */\r\n font-weight: bold;\r\n letter-spacing: 0.5px;\r\n}`,\r\n },\r\n\r\n // ── border-spacing → cellspacing attribute ────────────────────────────\r\n \"border-spacing\": {\r\n language: \"html\",\r\n description: \"Use the cellspacing HTML attribute instead of border-spacing CSS\",\r\n before: `<table style=\"border-spacing: 8px; border-collapse: separate;\">\r\n <tr><td>Cell</td></tr>\r\n</table>`,\r\n after: `<table cellspacing=\"8\" style=\"border-collapse: separate;\">\r\n <tr><td>Cell</td></tr>\r\n</table>`,\r\n },\r\n\r\n // ── min-width → fixed width ──────────────────────────────────────────\r\n \"min-width\": {\r\n language: \"html\",\r\n description: \"Use a fixed width instead of min-width for Outlook compatibility\",\r\n before: `<td style=\"min-width: 200px;\">Content</td>`,\r\n after: `<!-- Outlook ignores min-width. Use a fixed width or a spacer. -->\r\n<td width=\"200\" style=\"width: 200px;\">Content</td>`,\r\n },\r\n\r\n // ── min-height → fixed height ────────────────────────────────────────\r\n \"min-height\": {\r\n language: \"html\",\r\n description: \"Use a fixed height or spacer instead of min-height\",\r\n before: `<td style=\"min-height: 100px;\">Content</td>`,\r\n after: `<!-- Outlook ignores min-height. Use height or a spacer image. -->\r\n<td height=\"100\" style=\"height: 100px;\">Content</td>`,\r\n },\r\n\r\n // ── max-height → fixed height ────────────────────────────────────────\r\n \"max-height\": {\r\n language: \"html\",\r\n description: \"Outlook ignores max-height — truncate content server-side\",\r\n before: `<div style=\"max-height: 200px; overflow: hidden;\">\r\n Long content...\r\n</div>`,\r\n after: `<!-- Outlook ignores max-height. Truncate content server-side. -->\r\n<div style=\"height: 200px;\">\r\n Shortened content...\r\n <a href=\"https://example.com/full\">Read more</a>\r\n</div>`,\r\n },\r\n\r\n // ── padding (Outlook MSO font-width trick) ─────────────────────────────\r\n \"padding::outlook\": {\r\n language: \"html\",\r\n description: \"Use MSO font-width trick for reliable button padding in Outlook\",\r\n before: `<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; display: inline-block;\r\n text-decoration: none;\">\r\n Click Here\r\n</a>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\"\r\n style=\"border-collapse: collapse;\">\r\n <tr>\r\n <td style=\"background-color: #6d28d9; padding: 0;\r\n mso-padding-alt: 12px 32px;\">\r\n <!--[if mso]>\r\n <i style=\"letter-spacing: 32px; mso-font-width: -100%;\r\n mso-text-raise: 18pt;\" hidden> </i>\r\n <![endif]-->\r\n <a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n mso-text-raise: 9pt; text-decoration: none;\r\n font-family: Arial, sans-serif; font-size: 14px;\r\n font-weight: bold;\">Click Here</a>\r\n <!--[if mso]>\r\n <i style=\"letter-spacing: 32px; mso-font-width: -100%;\"\r\n hidden> </i>\r\n <![endif]-->\r\n </td>\r\n </tr>\r\n</table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<a href=\"https://example.com\"\r\n style=\"background-color: #6d28d9; color: #fff;\r\n padding: 12px 32px; display: inline-block;\r\n text-decoration: none;\">\r\n Click Here\r\n</a>\r\n<!--<![endif]-->`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * JSX (React Email) framework-specific code fix snippets.\r\n * All keys have a ::jsx suffix in the original FIX_DATABASE.\r\n */\r\nexport const JSX_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── word-break (JSX) ─────────────────────────────────────────────────\r\n \"word-break::jsx\": {\r\n language: \"jsx\",\r\n description: \"Wrap long text in a table cell for Outlook-safe word breaking\",\r\n before: `<span style={{ wordBreak: \"break-all\" }}>{url}</span>`,\r\n after: `{/* Table cells force text wrapping in Outlook and Yahoo */}\r\n<table width=\"100%\" cellPadding={0} cellSpacing={0}\r\n role=\"presentation\" style={{ borderCollapse: \"collapse\" }}>\r\n <tr>\r\n <td style={{\r\n wordBreak: \"break-all\" as const,\r\n overflowWrap: \"break-word\" as const,\r\n wordWrap: \"break-word\" as const,\r\n }}>\r\n {url}\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── overflow-wrap (JSX) ──────────────────────────────────────────────\r\n \"overflow-wrap::jsx\": {\r\n language: \"jsx\",\r\n description: \"Wrap text in a table cell for Outlook-safe overflow wrapping\",\r\n before: `<p style={{ overflowWrap: \"break-word\" }}>{longText}</p>`,\r\n after: `<table width=\"100%\" cellPadding={0} cellSpacing={0}\r\n role=\"presentation\" style={{ borderCollapse: \"collapse\" }}>\r\n <tr>\r\n <td style={{\r\n overflowWrap: \"break-word\" as const,\r\n wordWrap: \"break-word\" as const,\r\n wordBreak: \"break-all\" as const,\r\n }}>\r\n {longText}\r\n </td>\r\n </tr>\r\n</table>`,\r\n },\r\n\r\n // ── display:flex (Outlook JSX) ───────────────────────────────────────\r\n \"display:flex::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row + Column components instead of flexbox (Outlook-safe)\",\r\n before: `<div style={{ display: \"flex\", gap: \"16px\" }}>\r\n <div style={{ flex: 1 }}>Column 1</div>\r\n <div style={{ flex: 1 }}>Column 2</div>\r\n</div>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"50%\", verticalAlign: \"top\" }}>\r\n Column 1\r\n </Column>\r\n <Column style={{ width: \"50%\", verticalAlign: \"top\" }}>\r\n Column 2\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── display:grid (JSX) ──────────────────────────────────────────────\r\n \"display:grid::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace CSS Grid with React Email Row + Column components\",\r\n before: `<div style={{ display: \"grid\", gridTemplateColumns: \"1fr 1fr\", gap: \"16px\" }}>\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n</div>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"50%\", padding: \"8px\", verticalAlign: \"top\" }}>\r\n Item 1\r\n </Column>\r\n <Column style={{ width: \"50%\", padding: \"8px\", verticalAlign: \"top\" }}>\r\n Item 2\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── max-width (Outlook JSX) ─────────────────────────────────────────\r\n \"max-width::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Container component for Outlook-safe max-width centering\",\r\n before: `<div style={{ maxWidth: \"600px\", margin: \"0 auto\" }}>\r\n Content here\r\n</div>`,\r\n after: `import { Container } from \"@react-email/components\";\r\n\r\n<Container style={{ maxWidth: \"600px\" }}>\r\n Content here\r\n</Container>`,\r\n },\r\n\r\n // ── @font-face (JSX) ────────────────────────────────────────────────\r\n \"@font-face::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Font component instead of @font-face in <style>\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n @font-face {\r\n font-family: 'CustomFont';\r\n src: url('custom.woff2') format('woff2');\r\n }\r\n \\`}</style>\r\n</Head>\r\n<h1 style={{ fontFamily: \"'CustomFont'\" }}>Hello</h1>`,\r\n after: `import { Head, Font } from \"@react-email/components\";\r\n\r\n<Head>\r\n <Font\r\n fontFamily=\"CustomFont\"\r\n fallbackFontFamily=\"Arial\"\r\n webFont={{ url: \"https://example.com/custom.woff2\", format: \"woff2\" }}\r\n fontWeight={400}\r\n fontStyle=\"normal\"\r\n />\r\n</Head>\r\n<h1 style={{ fontFamily: \"'CustomFont', Arial, sans-serif\" }}>Hello</h1>`,\r\n },\r\n\r\n // ── <svg> (JSX) ─────────────────────────────────────────────────────\r\n \"<svg>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace inline SVG with React Email Img component\",\r\n before: `<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\r\n <path d=\"M12 2L2 7l10 5 10-5-10-5z\" fill=\"#6d28d9\"/>\r\n</svg>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n<Img\r\n src=\"https://example.com/icon.png\"\r\n width={24}\r\n height={24}\r\n alt=\"Icon\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── <video> (JSX) ───────────────────────────────────────────────────\r\n \"<video>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace video with a linked thumbnail using React Email Img + Link\",\r\n before: `<video width=\"600\" autoPlay muted>\r\n <source src=\"demo.mp4\" type=\"video/mp4\" />\r\n</video>`,\r\n after: `import { Img, Link } from \"@react-email/components\";\r\n\r\n<Link href=\"https://example.com/watch\">\r\n <Img\r\n src=\"https://example.com/video-thumb.gif\"\r\n width={600}\r\n alt=\"Watch the video\"\r\n style={{ display: \"block\", border: \"0\", maxWidth: \"100%\" }}\r\n />\r\n</Link>`,\r\n },\r\n\r\n // ── border-radius (Outlook JSX) ─────────────────────────────────────\r\n \"border-radius::outlook::jsx\": {\r\n language: \"jsx\",\r\n description:\r\n \"Render rounded buttons with VML via JSX dangerouslySetInnerHTML (Outlook workaround)\",\r\n before: `<a\r\n href=\"https://example.com\"\r\n style={{ backgroundColor: \"#6d28d9\", color: \"#fff\",\r\n padding: \"12px 32px\", borderRadius: \"6px\",\r\n textDecoration: \"none\", display: \"inline-block\" }}>\r\n Click Here\r\n</a>`,\r\n after:\r\n '{/* Use dangerouslySetInnerHTML to inject VML for Outlook rounded corners */}\\n<div\\n dangerouslySetInnerHTML={{\\n __html: `\\n<!--[if mso]>\\n<v:roundrect xmlns:v=\"urn:schemas-microsoft-com:vml\"\\n href=\"https://example.com\"\\n style=\"height:44px; v-text-anchor:middle; width:200px;\"\\n arcsize=\"14%\" strokecolor=\"#6d28d9\" fillcolor=\"#6d28d9\">\\n <w:anchorlock/>\\n <center style=\"color:#fff; font-family:Arial,sans-serif;\\n font-size:14px; font-weight:bold;\">Click Here</center>\\n</v:roundrect>\\n<![endif]-->\\n<!--[if !mso]><!-->\\n<a href=\"https://example.com\"\\n style=\"background-color:#6d28d9; color:#fff; padding:12px 32px;\\n border-radius:6px; text-decoration:none; display:inline-block;\">\\n Click Here\\n</a>\\n<!--<![endif]-->\\n`,\\n }}\\n/>',\r\n },\r\n\r\n // ── gap (JSX) ───────────────────────────────────────────────────────\r\n \"gap::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use padding style prop on Column instead of gap (email-safe spacing)\",\r\n before: `<Row style={{ gap: \"16px\" }}>\r\n <Column>Item 1</Column>\r\n <Column>Item 2</Column>\r\n <Column>Item 3</Column>\r\n</Row>`,\r\n after: `import { Row, Column } from \"@react-email/components\";\r\n\r\n{/* Use padding on Column — gap is not supported in email clients */}\r\n<Row>\r\n <Column style={{ paddingRight: \"16px\" }}>Item 1</Column>\r\n <Column style={{ paddingRight: \"16px\" }}>Item 2</Column>\r\n <Column>Item 3</Column>\r\n</Row>`,\r\n },\r\n\r\n // ── <style> (Gmail JSX) ─────────────────────────────────────────────\r\n \"<style>::gmail::jsx\": {\r\n language: \"jsx\",\r\n description:\r\n \"React Email inlines styles via style props — manual <style> blocks won't survive Gmail\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n .header { background-color: #6d28d9; padding: 32px; }\r\n .title { color: #fff; font-size: 24px; }\r\n \\`}</style>\r\n</Head>\r\n<div className=\"header\">\r\n <h1 className=\"title\">Hello</h1>\r\n</div>`,\r\n after: `{/* Gmail strips <style> blocks. Move styles to inline style props: */}\r\n<div style={{ backgroundColor: \"#6d28d9\", padding: \"32px\" }}>\r\n <h1 style={{ color: \"#fff\", fontSize: \"24px\", margin: 0 }}>Hello</h1>\r\n</div>`,\r\n },\r\n\r\n // ── <link> (JSX) ────────────────────────────────────────────────────\r\n \"<link>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Head component instead of <link> for stylesheet references\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <link rel=\"stylesheet\" href=\"styles.css\" />\r\n</Head>`,\r\n after: `import { Head } from \"@react-email/components\";\r\n\r\n{/* External stylesheets are stripped by most email clients.\r\n Place styles inline via style props, or use Head for font imports only. */}\r\n<Head>\r\n {/* Inline your CSS here or use Font component for web fonts */}\r\n</Head>`,\r\n },\r\n\r\n // ── <form> (JSX) ───────────────────────────────────────────────────\r\n \"<form>::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace embedded form with a React Email Button linking to a hosted form\",\r\n before: `<form action=\"/subscribe\" method=\"POST\">\r\n <input type=\"email\" placeholder=\"Email\" />\r\n <button type=\"submit\">Subscribe</button>\r\n</form>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n<Button\r\n href=\"https://example.com/subscribe\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n padding: \"12px 32px\",\r\n borderRadius: \"6px\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n }}\r\n>\r\n Subscribe Now\r\n</Button>`,\r\n },\r\n\r\n // ── @media (JSX) ────────────────────────────────────────────────────\r\n \"@media::jsx\": {\r\n language: \"jsx\",\r\n description: \"Design mobile-first — @media queries are stripped by many clients\",\r\n before: `import { Head } from \"@react-email/components\";\r\n\r\n<Head>\r\n <style>{\\`\r\n @media (max-width: 600px) {\r\n .cols { display: block !important; }\r\n .col { width: 100% !important; }\r\n }\r\n \\`}</style>\r\n</Head>\r\n<Row>\r\n <Column className=\"col\" style={{ width: \"50%\" }}>Left</Column>\r\n <Column className=\"col\" style={{ width: \"50%\" }}>Right</Column>\r\n</Row>`,\r\n after: `import { Container, Section, Text } from \"@react-email/components\";\r\n\r\n{/* Single-column stacked layout works without @media.\r\n Stack content vertically so it reads well on all clients. */}\r\n<Container style={{ maxWidth: \"600px\" }}>\r\n <Section style={{ padding: \"16px\" }}>\r\n <Text>Left</Text>\r\n </Section>\r\n <Section style={{ padding: \"16px\" }}>\r\n <Text>Right</Text>\r\n </Section>\r\n</Container>`,\r\n },\r\n\r\n // ── position (JSX) ─────────────────────────────────────────────────\r\n \"position::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row and Column for layout instead of CSS position\",\r\n before: `<div style={{ position: \"relative\" }}>\r\n <div style={{ position: \"absolute\", top: 0, right: 0 }}>\r\n Badge\r\n </div>\r\n <p>Content</p>\r\n</div>`,\r\n after: `import { Row, Column, Text } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ verticalAlign: \"top\" }}>\r\n <Text>Content</Text>\r\n </Column>\r\n <Column style={{ width: \"80px\", verticalAlign: \"top\", textAlign: \"right\" }}>\r\n <Text>Badge</Text>\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── float (JSX) ────────────────────────────────────────────────────\r\n \"float::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Row and Column instead of float for side-by-side layout\",\r\n before: `<img src=\"photo.jpg\" style={{ float: \"left\", marginRight: \"16px\" }} width={200} />\r\n<p>Text wraps around the image.</p>`,\r\n after: `import { Row, Column, Img, Text } from \"@react-email/components\";\r\n\r\n<Row>\r\n <Column style={{ width: \"200px\", paddingRight: \"16px\", verticalAlign: \"top\" }}>\r\n <Img src=\"photo.jpg\" width={200} style={{ display: \"block\", border: \"0\" }} />\r\n </Column>\r\n <Column style={{ verticalAlign: \"top\" }}>\r\n <Text>Text next to the image.</Text>\r\n </Column>\r\n</Row>`,\r\n },\r\n\r\n // ── background-image (Outlook JSX) ──────────────────────────────────\r\n \"background-image::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use VML for Outlook background images in JSX via dangerouslySetInnerHTML\",\r\n before: `<td style={{ backgroundImage: \"url('hero.jpg')\",\r\n backgroundSize: \"cover\", padding: \"40px\" }}>\r\n <h1 style={{ color: \"#fff\" }}>Hello World</h1>\r\n</td>`,\r\n after:\r\n '<div\\n dangerouslySetInnerHTML={{\\n __html: `\\n<!--[if gte mso 9]>\\n<v:rect xmlns:v=\"urn:schemas-microsoft-com:vml\" fill=\"true\"\\n stroke=\"false\" style=\"width:600px; height:300px;\">\\n <v:fill type=\"frame\" src=\"hero.jpg\" />\\n <v:textbox inset=\"0,0,0,0\">\\n<![endif]-->\\n<div style=\"background-image:url(\\'hero.jpg\\'); background-size:cover; padding:40px;\">\\n <h1 style=\"color:#fff;\">Hello World</h1>\\n</div>\\n<!--[if gte mso 9]>\\n </v:textbox>\\n</v:rect>\\n<![endif]-->\\n`,\\n }}\\n/>',\r\n },\r\n\r\n // ── opacity (JSX) ──────────────────────────────────────────────────\r\n \"opacity::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use solid colors instead of opacity in style objects\",\r\n before: `<div style={{\r\n backgroundColor: \"#000\",\r\n opacity: 0.5,\r\n}}>\r\n Overlay content\r\n</div>`,\r\n after: `<div style={{\r\n /* Use a pre-mixed solid color instead of opacity */\r\n backgroundColor: \"#808080\",\r\n}}>\r\n Overlay content\r\n</div>`,\r\n },\r\n\r\n // ── box-shadow (JSX) ──────────────────────────────────────────────\r\n \"box-shadow::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use border as a fallback for boxShadow in style objects\",\r\n before: `<div style={{\r\n boxShadow: \"0 2px 8px rgba(0, 0, 0, 0.15)\",\r\n padding: \"24px\",\r\n}}>\r\n Card content\r\n</div>`,\r\n after: `import { Section } from \"@react-email/components\";\r\n\r\n<Section style={{\r\n border: \"1px solid #e0e0e0\",\r\n padding: \"24px\",\r\n}}>\r\n Card content\r\n</Section>`,\r\n },\r\n\r\n // ── linear-gradient (JSX) ─────────────────────────────────────────\r\n \"linear-gradient::jsx\": {\r\n language: \"jsx\",\r\n description: \"Add a solid backgroundColor fallback before the gradient\",\r\n before: `<div style={{\r\n background: \"linear-gradient(135deg, #667eea, #764ba2)\",\r\n padding: \"40px\",\r\n color: \"#fff\",\r\n}}>\r\n Content here\r\n</div>`,\r\n after: `<div style={{\r\n /* Solid fallback for clients that strip gradients */\r\n backgroundColor: \"#667eea\",\r\n background: \"linear-gradient(135deg, #667eea, #764ba2)\",\r\n padding: \"40px\",\r\n color: \"#fff\",\r\n}}>\r\n Content here\r\n</div>`,\r\n },\r\n\r\n // ── transform (JSX) ──────────────────────────────────────────────\r\n \"transform::jsx\": {\r\n language: \"jsx\",\r\n description: \"Pre-render transformed content as an image using React Email Img\",\r\n before: `<div style={{ transform: \"rotate(45deg)\" }}>\r\n Rotated content\r\n</div>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* CSS transforms are not supported in email — pre-render as an image */}\r\n<Img\r\n src=\"https://example.com/rotated-content.png\"\r\n width={200}\r\n height={200}\r\n alt=\"Rotated content\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── animation (JSX) ──────────────────────────────────────────────\r\n \"animation::jsx\": {\r\n language: \"jsx\",\r\n description: \"Replace CSS animation with a React Email Img using an animated GIF\",\r\n before: `<span style={{ animation: \"pulse 2s infinite\" }}>New!</span>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* CSS animations are not supported — use an animated GIF */}\r\n<Img\r\n src=\"https://example.com/badge-animated.gif\"\r\n width={60}\r\n height={24}\r\n alt=\"New!\"\r\n style={{ display: \"inline-block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── transition (JSX) ─────────────────────────────────────────────\r\n \"transition::jsx\": {\r\n language: \"jsx\",\r\n description: \"Transitions don't work in email — style the default state well\",\r\n before: `<a\r\n href=\"#\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n transition: \"background-color 0.2s\",\r\n }}\r\n>\r\n Click\r\n</a>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n{/* Transitions are not supported — style the default state: */}\r\n<Button\r\n href=\"https://example.com\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n padding: \"12px 32px\",\r\n }}\r\n>\r\n Click\r\n</Button>`,\r\n },\r\n\r\n // ── overflow (JSX) ───────────────────────────────────────────────\r\n \"overflow::jsx\": {\r\n language: \"jsx\",\r\n description: \"Content will always be visible — design for full content display\",\r\n before: `<div style={{ maxHeight: \"200px\", overflow: \"hidden\" }}>\r\n Long content that gets clipped...\r\n</div>`,\r\n after: `import { Link, Text } from \"@react-email/components\";\r\n\r\n{/* overflow:hidden is stripped — show full content or truncate server-side */}\r\n<div>\r\n <Text>Shortened content that fits...</Text>\r\n <Link href=\"https://example.com/full\">Read more</Link>\r\n</div>`,\r\n },\r\n\r\n // ── visibility (JSX) ─────────────────────────────────────────────\r\n \"visibility::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use font-size/max-height trick instead of visibility:hidden\",\r\n before: `<div style={{ visibility: \"hidden\" }}>\r\n Hidden preheader text\r\n</div>`,\r\n after: `{/* visibility:hidden is stripped by most clients — use the preheader trick.\r\n msoHide is non-standard but needed to hide content in Outlook. */}\r\n<div\r\n style={{\r\n fontSize: \"0px\",\r\n lineHeight: \"0px\",\r\n maxHeight: \"0px\",\r\n overflow: \"hidden\",\r\n display: \"none\",\r\n msoHide: \"all\",\r\n } as React.CSSProperties}\r\n aria-hidden=\"true\"\r\n>\r\n Preheader text\r\n</div>`,\r\n },\r\n\r\n // ── object-fit (JSX) ─────────────────────────────────────────────\r\n \"object-fit::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Img with explicit width/height instead of object-fit\",\r\n before: `<img\r\n src=\"photo.jpg\"\r\n style={{ width: \"300px\", height: \"200px\", objectFit: \"cover\" }}\r\n/>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* Crop/resize image server-side to exact dimensions */}\r\n<Img\r\n src=\"https://example.com/photo-300x200.jpg\"\r\n width={300}\r\n height={200}\r\n alt=\"Photo\"\r\n style={{ display: \"block\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── background-size (JSX) ────────────────────────────────────────\r\n \"background-size::jsx\": {\r\n language: \"jsx\",\r\n description: \"Outlook ignores background-size — use sized images instead\",\r\n before: `<div style={{\r\n background: \"url('bg.jpg') center/cover no-repeat\",\r\n}}>\r\n Content\r\n</div>`,\r\n after: `import { Img } from \"@react-email/components\";\r\n\r\n{/* background-size is not supported in most email clients.\r\n Use a full-width image instead of a background: */}\r\n<Img\r\n src=\"https://example.com/bg-600x400.jpg\"\r\n width={600}\r\n alt=\"\"\r\n style={{ display: \"block\", width: \"100%\", border: \"0\" }}\r\n/>`,\r\n },\r\n\r\n // ── box-sizing (JSX) ─────────────────────────────────────────────\r\n \"box-sizing::jsx\": {\r\n language: \"jsx\",\r\n description: \"Account for padding in width manually (no box-sizing support)\",\r\n before: `<div style={{\r\n width: \"300px\",\r\n padding: \"20px\",\r\n boxSizing: \"border-box\",\r\n}}>\r\n Content — total width stays 300px\r\n</div>`,\r\n after: `{/* Set outer width, use inner element for padding */}\r\n<div style={{ width: \"300px\" }}>\r\n <div style={{ padding: \"20px\" }}>\r\n Content — padding on inner element\r\n </div>\r\n</div>`,\r\n },\r\n\r\n // ── padding (Outlook MSO font-width trick, JSX) ───────────────────────\r\n \"padding::outlook::jsx\": {\r\n language: \"jsx\",\r\n description: \"Use React Email Button component which handles MSO padding automatically\",\r\n before: `<a\r\n href=\"https://example.com\"\r\n style={{ backgroundColor: \"#6d28d9\", color: \"#fff\",\r\n padding: \"12px 32px\", display: \"inline-block\",\r\n textDecoration: \"none\" }}>\r\n Click Here\r\n</a>`,\r\n after: `import { Button } from \"@react-email/components\";\r\n\r\n{/* The Button component automatically handles MSO padding\r\n via the mso-font-width +   technique */}\r\n<Button\r\n href=\"https://example.com\"\r\n style={{\r\n backgroundColor: \"#6d28d9\",\r\n color: \"#fff\",\r\n padding: \"12px 32px\",\r\n borderRadius: \"6px\",\r\n textDecoration: \"none\",\r\n fontWeight: \"bold\",\r\n }}\r\n>\r\n Click Here\r\n</Button>`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * MJML framework-specific code fix snippets.\r\n * All keys have a ::mjml suffix in the original FIX_DATABASE.\r\n */\r\nexport const MJML_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── word-break (MJML) ────────────────────────────────────────────────\r\n \"word-break::mjml\": {\r\n language: \"mjml\",\r\n description: \"MJML renders text in table cells by default — word-break works via mj-text\",\r\n before: `<mj-text>\r\n <span style=\"word-break: break-all;\">Long URL here</span>\r\n</mj-text>`,\r\n after: `<!-- mj-text already renders inside a <td>, so add word-break\r\n to the mj-text css-class or inline style -->\r\n<mj-text css-class=\"break-words\"\r\n padding=\"0\">\r\n Long URL here\r\n</mj-text>\r\n<mj-style>\r\n .break-words td { word-break: break-all; word-wrap: break-word; }\r\n</mj-style>`,\r\n },\r\n\r\n // ── @font-face (MJML) ───────────────────────────────────────────────\r\n \"@font-face::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-font in mj-head instead of @font-face\",\r\n before: `<mj-style>\r\n @font-face {\r\n font-family: 'CustomFont';\r\n src: url('https://example.com/custom.woff2') format('woff2');\r\n }\r\n</mj-style>`,\r\n after: `<mjml>\r\n <mj-head>\r\n <mj-font name=\"CustomFont\"\r\n href=\"https://fonts.googleapis.com/css2?family=CustomFont\" />\r\n <mj-attributes>\r\n <mj-all font-family=\"CustomFont, Arial, Helvetica, sans-serif\" />\r\n </mj-attributes>\r\n </mj-head>\r\n</mjml>`,\r\n },\r\n\r\n // ── <style> (Gmail MJML) ────────────────────────────────────────────\r\n \"<style>::gmail::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-style inline='inline' to force style inlining for Gmail\",\r\n before: `<mj-head>\r\n <mj-style>\r\n .custom { color: #6d28d9; }\r\n </mj-style>\r\n</mj-head>`,\r\n after: `<mj-head>\r\n <!-- Use inline=\"inline\" to force MJML to inline these styles.\r\n Class-based styles in a plain mj-style block will be stripped by Gmail. -->\r\n <mj-style inline=\"inline\">\r\n .custom { color: #6d28d9; }\r\n </mj-style>\r\n</mj-head>`,\r\n },\r\n\r\n // ── border-radius (Outlook MJML) ────────────────────────────────────\r\n \"border-radius::outlook::mjml\": {\r\n language: \"mjml\",\r\n description: \"MJML limitation: border-radius is unsupported in Outlook — MJML does not generate VML\",\r\n before: `<mj-button border-radius=\"6px\" background-color=\"#6d28d9\">\r\n Click Here\r\n</mj-button>`,\r\n after: `<!-- Known MJML limitation: MJML does not generate VML for rounded corners.\r\n Options: accept flat corners, use mj-raw for VML, or set border-radius=\"0\". -->\r\n<mj-button border-radius=\"0\" background-color=\"#6d28d9\">\r\n Click Here\r\n</mj-button>`,\r\n },\r\n\r\n // ── background-image (Outlook MJML) ─────────────────────────────────\r\n \"background-image::outlook::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use mj-section background-url for Outlook-compatible background images\",\r\n before: `<mj-section>\r\n <mj-column>\r\n <mj-image src=\"hero.jpg\" />\r\n </mj-column>\r\n</mj-section>`,\r\n after: `<!-- MJML generates VML-compatible markup automatically via background-url on mj-section. -->\r\n<mj-section background-url=\"https://example.com/hero.jpg\"\r\n background-size=\"cover\"\r\n background-repeat=\"no-repeat\"\r\n background-color=\"#333333\">\r\n <mj-column>\r\n <mj-text color=\"#ffffff\">Your content here</mj-text>\r\n </mj-column>\r\n</mj-section>`,\r\n },\r\n\r\n // ── display:flex (MJML) ─────────────────────────────────────────────\r\n \"display:flex::mjml\": {\r\n language: \"mjml\",\r\n description: \"Replace flexbox (from mj-raw or inline styles) with mj-section and mj-column\",\r\n before: `<mj-raw>\r\n <div style=\"display: flex; gap: 16px;\">\r\n <div style=\"flex: 1;\">Column 1</div>\r\n <div style=\"flex: 1;\">Column 2</div>\r\n </div>\r\n</mj-raw>`,\r\n after: `<!-- Flexbox in MJML is not Outlook-compatible.\r\n Use mj-section and mj-column — MJML compiles these to table-based layouts. -->\r\n<mj-section>\r\n <mj-column width=\"50%\">\r\n <mj-text>Column 1</mj-text>\r\n </mj-column>\r\n <mj-column width=\"50%\">\r\n <mj-text>Column 2</mj-text>\r\n </mj-column>\r\n</mj-section>`,\r\n },\r\n\r\n // ── @media (MJML) ──────────────────────────────────────────────────\r\n \"@media::mjml\": {\r\n language: \"mjml\",\r\n description: \"Use MJML responsive attributes and breakpoints instead of hand-written @media\",\r\n before: `<mj-style>\r\n @media (max-width: 600px) {\r\n .mobile-stack { display: block !important; width: 100% !important; }\r\n }\r\n</mj-style>`,\r\n after: `<!-- MJML generates responsive @media queries automatically.\r\n Use mj-breakpoint and mj-column widths to control responsive behavior. -->\r\n<mj-head>\r\n <mj-breakpoint width=\"600px\" />\r\n</mj-head>\r\n<mj-body>\r\n <mj-section>\r\n <mj-column width=\"50%\"><mj-text>Left</mj-text></mj-column>\r\n <mj-column width=\"50%\"><mj-text>Right</mj-text></mj-column>\r\n </mj-section>\r\n</mj-body>`,\r\n },\r\n};\r\n","import type { CodeFix } from \"../types\";\r\n\r\n/**\r\n * Maizzle framework-specific code fix snippets.\r\n * All keys have a ::maizzle suffix in the original FIX_DATABASE.\r\n */\r\nexport const MAIZZLE_FIX_DATABASE: Record<string, CodeFix> = {\r\n // ── display:flex (Outlook Maizzle) ──────────────────────────────────\r\n \"display:flex::outlook::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Replace Tailwind flex classes with HTML table + MSO conditional comments\",\r\n before: `<div class=\"flex gap-4\">\r\n <div class=\"flex-1\">Column 1</div>\r\n <div class=\"flex-1\">Column 2</div>\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\"><tr>\r\n <td class=\"w-1/2\" valign=\"top\">Column 1</td>\r\n <td class=\"w-1/2\" valign=\"top\">Column 2</td>\r\n</tr></table>\r\n<![endif]-->\r\n<!--[if !mso]><!-->\r\n<div class=\"flex gap-4\">\r\n <div class=\"flex-1\">Column 1</div>\r\n <div class=\"flex-1\">Column 2</div>\r\n</div>\r\n<!--<![endif]-->`,\r\n },\r\n\r\n // ── @font-face (Maizzle) ────────────────────────────────────────────\r\n \"@font-face::maizzle\": {\r\n language: \"maizzle\",\r\n description:\r\n 'Add fonts via the googleFonts key in config.js — Maizzle injects the Google Fonts link tag automatically. Set googleFonts: \"Inter:ital,wght@0,400;0,700\" in your environment config, then reference the font family in your template.',\r\n before: `<style>\r\n @font-face {\r\n font-family: 'Inter';\r\n src: url('https://fonts.gstatic.com/...') format('woff2');\r\n }\r\n</style>`,\r\n after: `<!-- config.js: googleFonts: \"Inter:ital,wght@0,400;0,700\" -->\r\n<p class=\"font-['Inter',Arial,sans-serif]\">Hello</p>`,\r\n },\r\n\r\n // ── <style> (Gmail Maizzle) ─────────────────────────────────────────\r\n \"<style>::gmail::maizzle\": {\r\n language: \"maizzle\",\r\n description:\r\n \"Maizzle automatically inlines CSS via juice during build (inlineCSS: true in config.js). Manual <style> blocks bypass juice and will be stripped by Gmail — prefer Tailwind utility classes instead.\",\r\n before: `<style>\r\n .custom { color: #6d28d9; }\r\n</style>\r\n<div class=\"custom\">Hello</div>`,\r\n after: `<!-- Prefer Tailwind classes — Maizzle inlines them automatically during build -->\r\n<div class=\"text-[#6d28d9]\">Hello</div>`,\r\n },\r\n\r\n // ── max-width (Outlook Maizzle) ─────────────────────────────────────\r\n \"max-width::outlook::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Wrap max-width containers with MSO conditional table for Outlook\",\r\n before: `<div class=\"max-w-[600px] mx-auto\">\r\n Content here\r\n</div>`,\r\n after: `<!--[if mso]>\r\n<table role=\"presentation\" width=\"600\" cellpadding=\"0\"\r\n cellspacing=\"0\" border=\"0\" align=\"center\"><tr><td>\r\n<![endif]-->\r\n<div class=\"max-w-[600px] mx-auto\">\r\n Content here\r\n</div>\r\n<!--[if mso]>\r\n</td></tr></table>\r\n<![endif]-->`,\r\n },\r\n\r\n // ── gap (Maizzle) ──────────────────────────────────────────────────\r\n \"gap::maizzle\": {\r\n language: \"maizzle\",\r\n description: \"Use padding Tailwind classes on child elements instead of gap\",\r\n before: `<div class=\"flex gap-4\">\r\n <div>Item 1</div>\r\n <div>Item 2</div>\r\n <div>Item 3</div>\r\n</div>`,\r\n after: `<!-- gap is not supported in Outlook or many email clients.\r\n Use padding classes on child elements instead. -->\r\n<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\r\n <tr>\r\n <td class=\"pr-4\">Item 1</td>\r\n <td class=\"pr-4\">Item 2</td>\r\n <td>Item 3</td>\r\n </tr>\r\n</table>`,\r\n },\r\n};\r\n","/**\r\n * HTML/generic suggestion strings — entries that do NOT have a\r\n * ::jsx, ::mjml, or ::maizzle suffix in their key.\r\n */\r\nexport const HTML_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>\":\r\n \"Use a CSS inliner tool (like juice) to move styles to inline attributes.\",\r\n \"<style>:partial\":\r\n \"Use inline styles as the primary approach, with <style> in <head> as progressive enhancement.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>\": \"Inline all CSS directly in the HTML.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>\": \"Convert SVGs to PNG/JPG images.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>\":\r\n \"Use an animated GIF or a static image with a play button linking to the video.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>\": \"Use links to a web form instead of embedding forms in email.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face\":\r\n \"Always include a web-safe font stack as fallback (e.g., Arial, Helvetica, sans-serif).\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media\":\r\n \"Design emails mobile-first with a single-column layout that works without media queries.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex\":\r\n \"Use <table> layouts for email client compatibility.\",\r\n \"display:flex::outlook\":\r\n \"Use <table> layouts with <!--[if mso]> conditional comments for Outlook's Word engine.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid\":\r\n \"Replace CSS Grid with table layout for email compatibility.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient\":\r\n \"Add a solid background-color fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow\":\r\n \"Use border styling as an alternative to box-shadow.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius\":\r\n \"Use VML for rounded corners in Outlook, or accept square corners.\",\r\n \"border-radius::outlook\":\r\n \"Use VML (Vector Markup Language) for rounded buttons in Outlook.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width\":\r\n \"Use a fixed-width table wrapper for maximum compatibility.\",\r\n \"max-width::outlook\":\r\n \"Use a fixed width on table cells instead of max-width.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap\":\r\n \"Use padding/margin on child elements instead of gap.\",\r\n \"gap::outlook\":\r\n \"Use cellpadding/cellspacing on tables, or padding on cells.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float\":\r\n \"Use table cells with align attribute for side-by-side content.\",\r\n \"float::outlook\":\r\n 'Use table cells with align=\"left\" or align=\"right\".',\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image\":\r\n \"Use VML for background images in clients that require it.\",\r\n \"background-image::outlook\":\r\n \"Use <!--[if gte mso 9]> with <v:background> VML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position\":\r\n \"Use table-based positioning instead of CSS position.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity\":\r\n \"Use solid colors instead of opacity.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break\":\r\n \"Wrap long text in a <table><td> to force wrapping in clients that don't support word-break.\",\r\n \"word-break::outlook\":\r\n \"Outlook's Word engine ignores word-break. Place text inside a <td> with a constrained width — tables always wrap.\",\r\n\r\n // ── overflow-wrap ─────────────────────────────────────────────────────\r\n \"overflow-wrap\":\r\n \"Wrap text in a <table><td> to force wrapping. overflow-wrap is ignored by Outlook and unreliable in Yahoo.\",\r\n\r\n // ── white-space ───────────────────────────────────────────────────────\r\n \"white-space\":\r\n \"Outlook only supports 'normal' and 'nowrap'. Use for non-breaking spaces.\",\r\n\r\n // ── text-overflow ─────────────────────────────────────────────────────\r\n \"text-overflow\":\r\n \"text-overflow requires overflow:hidden which is stripped by Gmail. Truncate content server-side.\",\r\n\r\n // ── vertical-align ────────────────────────────────────────────────────\r\n \"vertical-align\":\r\n 'Use the valign HTML attribute on <td> elements for Outlook (e.g., valign=\"top\").',\r\n\r\n // ── border-spacing ────────────────────────────────────────────────────\r\n \"border-spacing\":\r\n 'Use the cellspacing HTML attribute instead (e.g., <table cellspacing=\"8\">).',\r\n\r\n // ── min-width / min-height ────────────────────────────────────────────\r\n \"min-width\":\r\n \"Outlook ignores min-width. Use a fixed width attribute on <td> or <table>.\",\r\n \"min-height\":\r\n \"Outlook ignores min-height. Use a fixed height or a spacer image.\",\r\n \"max-height\":\r\n \"Outlook ignores max-height. Truncate content server-side or use a fixed height.\",\r\n\r\n // ── text-shadow ───────────────────────────────────────────────────────\r\n \"text-shadow\":\r\n \"text-shadow is stripped by Gmail, Outlook, and Yahoo. Use font-weight for emphasis.\",\r\n\r\n // ── background-size / background-position ─────────────────────────────\r\n \"background-size\":\r\n \"Not supported in many clients. Set image dimensions directly.\",\r\n \"background-position\":\r\n \"Not supported in many clients. Use VML for positioning.\",\r\n\r\n // ── Additional properties covered by transform helpers ────────────────\r\n \"overflow\":\r\n \"Content will always be visible. Design accordingly.\",\r\n \"visibility\":\r\n \"Remove the element or use display:none as an alternative.\",\r\n \"transform\":\r\n \"CSS transforms are not supported in email. Pre-render the effect as an image.\",\r\n \"animation\":\r\n \"CSS animations are not supported. Use animated GIFs instead.\",\r\n \"transition\":\r\n \"CSS transitions are not supported in email.\",\r\n \"box-sizing\":\r\n \"Account for padding in your width calculations (use padding on a nested element).\",\r\n \"object-fit\":\r\n \"Use width/height attributes on <img> directly.\",\r\n \"display\":\r\n \"Use tables for layout in email clients.\",\r\n\r\n // ── padding ─────────────────────────────────────────────────────────────\r\n \"padding::outlook\":\r\n \"Outlook ignores padding on <a> tags. Use the MSO font-width trick with   hair spaces, or use VML. React Email's <Button> handles this automatically.\",\r\n};\r\n","/**\r\n * JSX (React Email) framework-specific suggestion strings.\r\n * All keys have a ::jsx suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const JSX_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::jsx\":\r\n \"Move styles to inline style props — React Email components accept style objects directly.\",\r\n \"<style>:partial::jsx\":\r\n \"Use inline style props on React Email components. Reserve <style> in <Head> for progressive enhancement only.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::jsx\":\r\n \"Use the React Email <Head> component for font imports; place all other styles inline via style props.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::jsx\":\r\n \"Replace inline SVG with the React Email <Img> component pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::jsx\":\r\n \"Replace <video> with a React Email <Link> wrapping an <Img> thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::jsx\":\r\n \"Replace the form with a React Email <Button> or <Link> component pointing to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::jsx\":\r\n \"Use the React Email <Font> component in <Head> with a fallbackFontFamily prop.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::jsx\":\r\n \"Use a single-column layout with React Email <Container> and <Section>. Avoid relying on @media queries.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::jsx\":\r\n \"Use React Email <Row> and <Column> components instead of flexbox.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::jsx\":\r\n \"Use React Email <Row> and <Column> components instead of CSS Grid.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::jsx\":\r\n \"Add a solid backgroundColor style prop as fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::jsx\":\r\n \"Use a border style prop as an alternative to boxShadow.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::jsx\":\r\n \"Outlook ignores borderRadius. Use dangerouslySetInnerHTML with VML for rounded buttons if needed.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::jsx\":\r\n \"Use the React Email <Container> component which handles max-width across clients.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::jsx\":\r\n \"Use padding style props on <Column> components instead of gap.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::jsx\":\r\n \"Use React Email <Row> and <Column> components for side-by-side layout.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::jsx\":\r\n \"Use VML via dangerouslySetInnerHTML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::jsx\":\r\n \"Use React Email <Row> and <Column> components for positioning.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::jsx\":\r\n \"Use solid colors. Opacity is not supported in many email clients.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break::jsx\":\r\n \"Wrap long text in a <table><tr><td> element. Outlook ignores wordBreak but respects table cell widths.\",\r\n\r\n // ── overflow-wrap ─────────────────────────────────────────────────────\r\n \"overflow-wrap::jsx\":\r\n \"Wrap text in a <table><tr><td> element. Outlook ignores overflowWrap but respects table cell widths.\",\r\n\r\n // ── padding ─────────────────────────────────────────────────────────────\r\n \"padding::outlook::jsx\":\r\n \"Use React Email's <Button> component which automatically generates MSO-compatible padding using the mso-font-width trick.\",\r\n};\r\n","/**\r\n * MJML framework-specific suggestion strings.\r\n * All keys have a ::mjml suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const MJML_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::mjml\":\r\n 'Use mj-style inline=\"inline\" to force MJML to inline styles for Gmail compatibility.',\r\n \"<style>:partial::mjml\":\r\n 'Use mj-style inline=\"inline\" for critical styles; plain mj-style for progressive enhancement.',\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::mjml\":\r\n \"MJML does not support external stylesheets. Use mj-style or inline attributes.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::mjml\":\r\n \"Replace inline SVG with an mj-image component pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::mjml\":\r\n \"Replace <video> with an mj-image linking to a video thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::mjml\":\r\n \"Replace the form with an mj-button linking to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::mjml\":\r\n \"Use mj-font in mj-head instead of @font-face in mj-style.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::mjml\":\r\n \"MJML generates responsive @media queries automatically. Use mj-breakpoint and mj-column widths.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::mjml\":\r\n \"Use mj-section and mj-column — MJML compiles these to table-based layouts.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::mjml\":\r\n \"Use mj-section and mj-column for grid-like layouts.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::mjml\":\r\n \"Add a background-color attribute on mj-section as a fallback.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::mjml\":\r\n \"Use a border attribute on mj-section or mj-column as an alternative.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::mjml\":\r\n 'MJML does not generate VML — border-radius will not render in Outlook. Set border-radius=\"0\" or accept flat corners.',\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::mjml\":\r\n \"Set the width attribute on mj-body or mj-section for maximum compatibility.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::mjml\":\r\n \"Use padding attribute on mj-column or mj-text for spacing.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::mjml\":\r\n \"Use mj-section with multiple mj-column elements for side-by-side layout.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::mjml\":\r\n \"Use background-url attribute on mj-section — MJML generates VML automatically.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::mjml\":\r\n \"Use mj-section and mj-column for layout positioning.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::mjml\":\r\n \"Use solid colors. Most email clients don't support opacity.\",\r\n\r\n // ── word-break ────────────────────────────────────────────────────────\r\n \"word-break::mjml\":\r\n \"mj-text renders inside a <td>, which helps. Add word-wrap: break-word to the td via mj-style.\",\r\n};\r\n","/**\r\n * Maizzle framework-specific suggestion strings.\r\n * All keys have a ::maizzle suffix in the original SUGGESTION_DATABASE.\r\n */\r\nexport const MAIZZLE_SUGGESTION_DATABASE: Record<string, string> = {\r\n // ── <style> ───────────────────────────────────────────────────────────\r\n \"<style>::maizzle\":\r\n \"Prefer Tailwind utility classes — Maizzle inlines CSS via juice during build (inlineCSS: true in config.js).\",\r\n \"<style>:partial::maizzle\":\r\n \"Use Tailwind utility classes for critical styles. Maizzle automatically inlines them at build time.\",\r\n\r\n // ── <link> ────────────────────────────────────────────────────────────\r\n \"<link>::maizzle\":\r\n \"External stylesheets are stripped. Use Tailwind CSS classes — Maizzle inlines them at build time.\",\r\n\r\n // ── <svg> ─────────────────────────────────────────────────────────────\r\n \"<svg>::maizzle\":\r\n \"Replace inline SVG with an <img> tag pointing to a hosted PNG.\",\r\n\r\n // ── <video> ───────────────────────────────────────────────────────────\r\n \"<video>::maizzle\":\r\n \"Replace <video> with a linked image thumbnail.\",\r\n\r\n // ── <form> ────────────────────────────────────────────────────────────\r\n \"<form>::maizzle\":\r\n \"Replace the form with a CTA link/button pointing to a hosted form page.\",\r\n\r\n // ── @font-face ────────────────────────────────────────────────────────\r\n \"@font-face::maizzle\":\r\n \"Use the googleFonts key in config.js — Maizzle injects the Google Fonts link tag automatically.\",\r\n\r\n // ── @media ────────────────────────────────────────────────────────────\r\n \"@media::maizzle\":\r\n \"Use Tailwind responsive utility classes and Maizzle's breakpoints config instead of hand-written @media.\",\r\n\r\n // ── display:flex ──────────────────────────────────────────────────────\r\n \"display:flex::maizzle\":\r\n \"Replace Tailwind flex classes with HTML table + MSO conditional comments for Outlook.\",\r\n\r\n // ── display:grid ──────────────────────────────────────────────────────\r\n \"display:grid::maizzle\":\r\n \"Replace Tailwind grid classes with HTML table layout for email compatibility.\",\r\n\r\n // ── linear-gradient ───────────────────────────────────────────────────\r\n \"linear-gradient::maizzle\":\r\n \"Add a bg-[color] Tailwind class as a fallback before the gradient.\",\r\n\r\n // ── box-shadow ────────────────────────────────────────────────────────\r\n \"box-shadow::maizzle\":\r\n \"Use Tailwind border classes as an alternative to shadow classes.\",\r\n\r\n // ── border-radius ─────────────────────────────────────────────────────\r\n \"border-radius::maizzle\":\r\n \"Outlook ignores border-radius. Accept flat corners or use MSO conditional VML.\",\r\n\r\n // ── max-width ─────────────────────────────────────────────────────────\r\n \"max-width::maizzle\":\r\n \"Wrap max-w containers with MSO conditional table for Outlook.\",\r\n\r\n // ── gap ───────────────────────────────────────────────────────────────\r\n \"gap::maizzle\":\r\n \"Use Tailwind padding classes on child elements instead of gap.\",\r\n\r\n // ── float ─────────────────────────────────────────────────────────────\r\n \"float::maizzle\":\r\n \"Use HTML tables for side-by-side layout instead of Tailwind float classes.\",\r\n\r\n // ── background-image ──────────────────────────────────────────────────\r\n \"background-image::maizzle\":\r\n \"Use MSO conditional VML for Outlook background images.\",\r\n\r\n // ── position ──────────────────────────────────────────────────────────\r\n \"position::maizzle\":\r\n \"Use HTML table layout instead of Tailwind position classes.\",\r\n\r\n // ── opacity ───────────────────────────────────────────────────────────\r\n \"opacity::maizzle\":\r\n \"Use solid Tailwind color classes instead of opacity.\",\r\n};\r\n","import type { CodeFix, Framework } from \"../types\";\r\n\r\nimport { HTML_FIX_DATABASE } from \"./html-fixes\";\r\nimport { JSX_FIX_DATABASE } from \"./jsx-fixes\";\r\nimport { MJML_FIX_DATABASE } from \"./mjml-fixes\";\r\nimport { MAIZZLE_FIX_DATABASE } from \"./maizzle-fixes\";\r\n\r\nimport { HTML_SUGGESTION_DATABASE } from \"./html-suggestions\";\r\nimport { JSX_SUGGESTION_DATABASE } from \"./jsx-suggestions\";\r\nimport { MJML_SUGGESTION_DATABASE } from \"./mjml-suggestions\";\r\nimport { MAIZZLE_SUGGESTION_DATABASE } from \"./maizzle-suggestions\";\r\n\r\n/**\r\n * Inline code fix snippets — real, paste-ready code that turns\r\n * \"here's your problem\" into \"here's your solution.\"\r\n *\r\n * Keyed by property, with optional client-specific overrides.\r\n * Client-specific keys use the format \"property::clientPrefix\"\r\n * (e.g. \"border-radius::outlook\").\r\n */\r\nconst FIX_DATABASE: Record<string, CodeFix> = {\r\n ...HTML_FIX_DATABASE,\r\n ...JSX_FIX_DATABASE,\r\n ...MJML_FIX_DATABASE,\r\n ...MAIZZLE_FIX_DATABASE,\r\n};\r\n\r\n/**\r\n * Human-readable suggestion strings attached to CSSWarning.suggestion.\r\n *\r\n * Key format mirrors FIX_DATABASE:\r\n * property → generic HTML advice\r\n * property::clientPrefix → client-specific advice\r\n * property::framework → framework-specific advice\r\n * property::clientPrefix::framework → most-specific advice\r\n *\r\n * Use `getSuggestion()` to resolve the best match via tiered lookup.\r\n */\r\nconst SUGGESTION_DATABASE: Record<string, string> = {\r\n ...HTML_SUGGESTION_DATABASE,\r\n ...JSX_SUGGESTION_DATABASE,\r\n ...MJML_SUGGESTION_DATABASE,\r\n ...MAIZZLE_SUGGESTION_DATABASE,\r\n};\r\n\r\n/**\r\n * Look up a code fix for a given property, client, and optional framework.\r\n * Returns undefined if no fix snippet exists.\r\n *\r\n * Resolution order (most specific to least specific):\r\n * 1. property::clientPrefix::framework (e.g. \"display:flex::outlook::jsx\")\r\n * 2. property::framework (e.g. \"display:grid::jsx\")\r\n * 3. property::clientPrefix (e.g. \"border-radius::outlook\")\r\n * 4. property (generic fix)\r\n */\r\nexport function getCodeFix(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): CodeFix | undefined {\r\n const clientPrefix = getClientPrefix(clientId);\r\n\r\n // Tier 1: property::clientPrefix::framework\r\n if (framework && clientPrefix) {\r\n const tier1 = FIX_DATABASE[`${property}::${clientPrefix}::${framework}`];\r\n if (tier1) return tier1;\r\n }\r\n\r\n // Tier 2: property::framework\r\n if (framework) {\r\n const tier2 = FIX_DATABASE[`${property}::${framework}`];\r\n if (tier2) return tier2;\r\n }\r\n\r\n // Tier 3: property::clientPrefix (existing behavior)\r\n if (clientPrefix) {\r\n const tier3 = FIX_DATABASE[`${property}::${clientPrefix}`];\r\n if (tier3) return tier3;\r\n }\r\n\r\n // Tier 4: generic fix (existing behavior)\r\n return FIX_DATABASE[property];\r\n}\r\n\r\n/**\r\n * Returns true if a framework was specified but the code fix resolved to\r\n * a client-specific or fully generic entry (tiers 3–4) rather than a\r\n * framework-aware entry (tiers 1–2).\r\n */\r\nexport function isCodeFixGenericFallback(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): boolean {\r\n if (!framework) return false;\r\n const clientPrefix = getClientPrefix(clientId);\r\n if (clientPrefix && FIX_DATABASE[`${property}::${clientPrefix}::${framework}`]) return false;\r\n if (FIX_DATABASE[`${property}::${framework}`]) return false;\r\n return true;\r\n}\r\n\r\nfunction getClientPrefix(clientId: string): string | null {\r\n if (clientId === \"outlook-windows-legacy\") return \"outlook\"; // Word engine — VML fixes\r\n if (clientId === \"outlook-windows\") return null; // New Outlook — web engine, no special fixes\r\n if (clientId.startsWith(\"outlook\")) return null; // Outlook web is more standards-compliant\r\n if (clientId.startsWith(\"gmail\")) return \"gmail\";\r\n if (clientId.startsWith(\"apple-mail\")) return \"apple\";\r\n if (clientId === \"yahoo-mail\") return \"yahoo\";\r\n if (clientId === \"samsung-mail\") return \"samsung\";\r\n return null;\r\n}\r\n\r\n/**\r\n * Look up a suggestion string for a given property, client, and optional framework.\r\n *\r\n * Resolution order mirrors `getCodeFix()`:\r\n * 1. property::clientPrefix::framework\r\n * 2. property::framework\r\n * 3. property::clientPrefix\r\n * 4. property (generic)\r\n *\r\n * `isGenericFallback` is true when a framework was specified but no\r\n * framework-specific entry was found (resolution fell through to tiers 3–4).\r\n */\r\nexport function getSuggestion(\r\n property: string,\r\n clientId: string,\r\n framework?: Framework\r\n): { text: string; isGenericFallback: boolean } {\r\n const clientPrefix = getClientPrefix(clientId);\r\n\r\n // Tier 1: property::clientPrefix::framework\r\n if (framework && clientPrefix) {\r\n const tier1 = SUGGESTION_DATABASE[`${property}::${clientPrefix}::${framework}`];\r\n if (tier1) return { text: tier1, isGenericFallback: false };\r\n }\r\n\r\n // Tier 2: property::framework\r\n if (framework) {\r\n const tier2 = SUGGESTION_DATABASE[`${property}::${framework}`];\r\n if (tier2) return { text: tier2, isGenericFallback: false };\r\n }\r\n\r\n // Tier 3: property::clientPrefix\r\n if (clientPrefix) {\r\n const tier3 = SUGGESTION_DATABASE[`${property}::${clientPrefix}`];\r\n if (tier3) return { text: tier3, isGenericFallback: !!framework };\r\n }\r\n\r\n // Tier 4: generic\r\n const tier4 = SUGGESTION_DATABASE[property];\r\n if (tier4) return { text: tier4, isGenericFallback: !!framework };\r\n\r\n // No entry — return a default\r\n return {\r\n text: `\"${property}\" is not supported in this email client.`,\r\n isGenericFallback: !!framework,\r\n };\r\n}\r\n","/**\r\n * Shared utilities for parsing inline CSS style declarations.\r\n *\r\n * Used by both the analyzer and the per-client transformers to avoid\r\n * duplicating the semicolon-aware splitting logic.\r\n */\r\n\r\n/**\r\n * Split a CSS style string on semicolons while respecting\r\n * quoted strings and url()/function parentheses.\r\n */\r\nexport function splitStyleDeclarations(style: string): string[] {\r\n const parts: string[] = [];\r\n let current = \"\";\r\n let inSingleQuote = false;\r\n let inDoubleQuote = false;\r\n let parenDepth = 0;\r\n\r\n for (let i = 0; i < style.length; i++) {\r\n const ch = style[i];\r\n\r\n if (ch === \"'\" && !inDoubleQuote) {\r\n inSingleQuote = !inSingleQuote;\r\n } else if (ch === '\"' && !inSingleQuote) {\r\n inDoubleQuote = !inDoubleQuote;\r\n } else if (ch === \"(\" && !inSingleQuote && !inDoubleQuote) {\r\n parenDepth++;\r\n } else if (ch === \")\" && !inSingleQuote && !inDoubleQuote) {\r\n parenDepth = Math.max(0, parenDepth - 1);\r\n }\r\n\r\n if (ch === \";\" && !inSingleQuote && !inDoubleQuote && parenDepth === 0) {\r\n if (current.trim()) {\r\n parts.push(current.trim());\r\n }\r\n current = \"\";\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n\r\n if (current.trim()) {\r\n parts.push(current.trim());\r\n }\r\n return parts;\r\n}\r\n\r\n/**\r\n * Parse an inline style string into a list of property names.\r\n */\r\nexport function parseStyleProperties(style: string): string[] {\r\n const props: string[] = [];\r\n const parts = splitStyleDeclarations(style);\r\n for (const part of parts) {\r\n const colonIndex = part.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = part.slice(0, colonIndex).trim().toLowerCase();\r\n if (prop) props.push(prop);\r\n }\r\n return props;\r\n}\r\n\r\n/**\r\n * Extract the value of a specific property from an inline style string.\r\n */\r\nexport function getStyleValue(style: string, property: string): string | null {\r\n const parts = splitStyleDeclarations(style);\r\n for (const part of parts) {\r\n const colonIndex = part.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = part.slice(0, colonIndex).trim().toLowerCase();\r\n if (prop === property) {\r\n return part.slice(colonIndex + 1).trim();\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Parse an inline style string into a Map of property → value.\r\n */\r\nexport function parseInlineStyle(style: string): Map<string, string> {\r\n const map = new Map<string, string>();\r\n const declarations = splitStyleDeclarations(style);\r\n for (const decl of declarations) {\r\n const colonIndex = decl.indexOf(\":\");\r\n if (colonIndex === -1) continue;\r\n const prop = decl.slice(0, colonIndex).trim().toLowerCase();\r\n const value = decl.slice(colonIndex + 1).trim();\r\n if (prop && value) {\r\n map.set(prop, value);\r\n }\r\n }\r\n return map;\r\n}\r\n\r\n/**\r\n * Serialize a Map of property → value back to an inline style string.\r\n */\r\nexport function serializeStyle(map: Map<string, string>): string {\r\n const parts: string[] = [];\r\n map.forEach((value, prop) => {\r\n parts.push(`${prop}: ${value}`);\r\n });\r\n return parts.join(\"; \");\r\n}\r\n","/**\n * Downlevel modern CSS in HTML emails to maximize email client compatibility.\n *\n * Transforms modern CSS features into widely-supported equivalents:\n * - Modern color functions (oklch, hsl, hwb) to rgb()\n * - Space-based rgb() to comma-based rgb()\n * - CSS logical properties to physical properties\n * - calc(infinity * 1px) to 9999px\n * - CSS nesting to flat rules\n * - Range media queries to legacy min/max syntax\n * - CSS variables (var()) resolved within same stylesheet\n */\n\nimport * as cheerio from \"cheerio\";\nimport * as csstree from \"css-tree\";\nimport { parseColor, formatRgb } from \"./color-utils\";\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\n\n// --- Logical property mappings ---\n\nconst LOGICAL_PROPERTY_MAP: Record<string, [string, string]> = {\n \"padding-inline\": [\"padding-left\", \"padding-right\"],\n \"padding-block\": [\"padding-top\", \"padding-bottom\"],\n \"margin-inline\": [\"margin-left\", \"margin-right\"],\n \"margin-block\": [\"margin-top\", \"margin-bottom\"],\n \"inset-inline\": [\"left\", \"right\"],\n \"inset-block\": [\"top\", \"bottom\"],\n \"border-inline\": [\"border-left\", \"border-right\"],\n \"border-block\": [\"border-top\", \"border-bottom\"],\n};\n\n// --- Color conversion ---\n\n/**\n * Regex matching modern color functions that need conversion.\n * Matches oklch(...), hsl(...), hsla(...), hwb(...), and space-based rgb(...).\n */\nconst MODERN_COLOR_RE =\n /\\b(oklch|hsl|hsla|hwb|rgba?)\\s*\\(/g;\n\n/**\n * Extract a balanced parenthesized expression starting at `(` position.\n * Returns the full function call including the function name prefix.\n */\nfunction extractFunctionCall(\n str: string,\n fnStart: number,\n openParenIndex: number,\n): string | null {\n let depth = 0;\n for (let i = openParenIndex; i < str.length; i++) {\n if (str[i] === \"(\") depth++;\n else if (str[i] === \")\") {\n depth--;\n if (depth === 0) {\n return str.slice(fnStart, i + 1);\n }\n }\n }\n return null;\n}\n\n/**\n * Check if an rgb/rgba call uses space syntax (needs conversion).\n */\nfunction isSpaceSyntaxRgb(args: string): boolean {\n // Space syntax: \"R G B\" or \"R G B / A\" — no commas\n const inner = args.trim();\n return !inner.includes(\",\") && /^\\d/.test(inner);\n}\n\nfunction convertModernColors(value: string): string {\n let result = value;\n let match: RegExpExecArray | null;\n\n // Reset regex state for each call\n MODERN_COLOR_RE.lastIndex = 0;\n\n // Collect replacements to apply from right to left (avoid index shifting)\n const replacements: { start: number; end: number; replacement: string }[] =\n [];\n\n while ((match = MODERN_COLOR_RE.exec(result)) !== null) {\n const fnName = match[1].toLowerCase();\n const fnStart = match.index;\n const openParen = fnStart + match[0].length - 1;\n\n const fullCall = extractFunctionCall(result, fnStart, openParen);\n if (!fullCall) continue;\n\n // For rgb/rgba, only convert if it uses space syntax\n if (fnName === \"rgb\" || fnName === \"rgba\") {\n const argsStr = fullCall.slice(fullCall.indexOf(\"(\") + 1, -1);\n if (!isSpaceSyntaxRgb(argsStr)) continue;\n }\n\n const parsed = parseColor(fullCall);\n if (parsed) {\n replacements.push({\n start: fnStart,\n end: fnStart + fullCall.length,\n replacement: formatRgb(parsed),\n });\n }\n }\n\n // Apply replacements right-to-left to preserve indices\n for (let i = replacements.length - 1; i >= 0; i--) {\n const r = replacements[i];\n result = result.slice(0, r.start) + r.replacement + result.slice(r.end);\n }\n\n return result;\n}\n\n// --- Logical properties ---\n\nfunction convertLogicalProperty(\n prop: string,\n value: string,\n): [string, string][] | null {\n const mapping = LOGICAL_PROPERTY_MAP[prop];\n if (!mapping) return null;\n\n const parts = value.trim().split(/\\s+/);\n const [first, second] = mapping;\n\n if (parts.length >= 2) {\n return [\n [first, parts[0]],\n [second, parts[1]],\n ];\n }\n return [\n [first, parts[0]],\n [second, parts[0]],\n ];\n}\n\n// --- calc(infinity) ---\n\nconst CALC_INFINITY_RE = /calc\\(\\s*infinity\\s*\\*\\s*1(px|em|rem|%|vh|vw)\\s*\\)/gi;\nconst CALC_INFINITY_SIMPLE_RE = /calc\\(\\s*infinity\\s*\\)/gi;\n\nfunction resolveCalcInfinity(value: string): string {\n let result = value.replace(CALC_INFINITY_RE, (_match, unit: string) => {\n return `9999${unit}`;\n });\n result = result.replace(CALC_INFINITY_SIMPLE_RE, \"9999px\");\n return result;\n}\n\n// --- CSS nesting (unnest) ---\n\n/**\n * Unnest CSS rules where @media is nested inside a selector.\n * `.sm_p-4{@media (min-width:40rem){padding:1rem!important}}`\n * becomes:\n * `@media (min-width:40rem){.sm_p-4{padding:1rem!important}}`\n */\nfunction unnestCSSRules(css: string): string {\n // Match: selector { @media ... { ... } }\n // Use brace-balancing to find the boundaries\n let result = \"\";\n let i = 0;\n\n while (i < css.length) {\n // Look for a pattern: <selector> { ... @media ... }\n const atMediaInside = findNestedAtRule(css, i);\n if (atMediaInside) {\n result += css.slice(i, atMediaInside.outerStart);\n // Emit any preamble declarations that preceded the nested @-rule\n if (atMediaInside.preamble) {\n result += `${atMediaInside.selector}{${atMediaInside.preamble}}`;\n }\n // Emit: @media <query> { <selector> { <declarations> } }\n result += `${atMediaInside.atRule}{${atMediaInside.selector}{${atMediaInside.body}}}`;\n i = atMediaInside.outerEnd;\n } else {\n result += css.slice(i);\n break;\n }\n }\n\n return result;\n}\n\ninterface NestedAtRule {\n outerStart: number;\n outerEnd: number;\n selector: string;\n atRule: string;\n body: string;\n /** Declarations before the nested @-rule that stay in the selector block. */\n preamble?: string;\n}\n\nfunction findNestedAtRule(css: string, startPos: number): NestedAtRule | null {\n // Find a { that is followed (eventually) by @media inside\n for (let i = startPos; i < css.length; i++) {\n if (css[i] === \"{\") {\n // Check what's inside this block\n const selector = css.slice(startPos, i).trim();\n if (!selector || selector.startsWith(\"@\")) {\n // Skip @-rules at top level, just find matching close brace\n const closeIdx = findMatchingBrace(css, i);\n if (closeIdx === -1) return null;\n // Look further after this block\n const rest = findNestedAtRule(css, closeIdx + 1);\n if (rest) return rest;\n return null;\n }\n\n // We have a selector. Check if the content contains @media (or @supports)\n const innerStart = i + 1;\n const closeIdx = findMatchingBrace(css, i);\n if (closeIdx === -1) return null;\n\n const innerContent = css.slice(innerStart, closeIdx).trim();\n\n // Find any @media or @supports nested inside (may not be at the start)\n const atMatch = innerContent.match(/@(media|supports)\\s/);\n if (atMatch && atMatch.index !== undefined) {\n const atPos = atMatch.index;\n const atBraceIdx = innerContent.indexOf(\"{\", atPos);\n if (atBraceIdx === -1) continue;\n\n const atRule = innerContent.slice(atPos, atBraceIdx).trim();\n const atCloseIdx = findMatchingBrace(innerContent, atBraceIdx);\n if (atCloseIdx === -1) continue;\n\n const body = innerContent.slice(atBraceIdx + 1, atCloseIdx).trim();\n\n // Content before the @-rule stays as regular declarations in the selector\n const beforeAt = innerContent.slice(0, atPos).trim();\n\n return {\n outerStart: findSelectorStart(css, i, startPos),\n outerEnd: closeIdx + 1,\n selector,\n atRule,\n body,\n // If there are declarations before the nested @-rule, keep them\n ...(beforeAt ? { preamble: beforeAt } : {}),\n };\n }\n }\n }\n return null;\n}\n\nfunction findSelectorStart(css: string, braceIdx: number, minPos: number): number {\n // Walk backwards from the opening brace to find where the selector starts\n let i = braceIdx - 1;\n while (i >= minPos && css[i] !== \"}\" && css[i] !== \";\") {\n i--;\n }\n return i + 1;\n}\n\nfunction findMatchingBrace(css: string, openIdx: number): number {\n let depth = 0;\n for (let i = openIdx; i < css.length; i++) {\n if (css[i] === \"{\") depth++;\n else if (css[i] === \"}\") {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n// --- Range media queries ---\n\n/**\n * Convert Media Queries Level 4 range syntax to legacy min/max.\n * (width >= 40rem) -> (min-width: 40rem)\n * (width <= 40rem) -> (max-width: 40rem)\n * (width > 40rem) -> (min-width: 40rem)\n * (width < 40rem) -> (max-width: 40rem)\n */\nfunction convertRangeMediaQueries(css: string): string {\n return css.replace(\n /\\(\\s*width\\s*(>=?|<=?)\\s*([\\d.]+\\w*)\\s*\\)/g,\n (_match, op: string, value: string) => {\n if (op === \">=\" || op === \">\") {\n return `(min-width: ${value})`;\n }\n return `(max-width: ${value})`;\n },\n );\n}\n\n// --- CSS variable resolution ---\n\n/** Universal selectors that apply to all elements. */\nconst UNIVERSAL_SELECTORS = new Set([\":root\", \"*\", \"html\"]);\n\n/** Check if a definition's selector could apply to a usage's selector scope. */\nfunction selectorsCouldMatch(defSelector: string, useSelector: string): boolean {\n if (defSelector === useSelector) return true;\n if (UNIVERSAL_SELECTORS.has(defSelector)) return true;\n return false;\n}\n\nfunction resolveCSSVariables(ast: csstree.CssNode): void {\n // Collect variable definitions: { selector, varName, value }\n const varDefs: { selector: string; varName: string; value: string }[] = [];\n\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.prelude || !rule.block) return;\n\n const selector = csstree.generate(rule.prelude);\n\n rule.block.children.forEach((node) => {\n if (\n node.type === \"Declaration\" &&\n node.property.startsWith(\"--\")\n ) {\n varDefs.push({\n selector,\n varName: node.property,\n value: csstree.generate(node.value),\n });\n }\n });\n },\n });\n\n if (varDefs.length === 0) return;\n\n // Resolve var() references — track the enclosing Rule selector for scoping\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.prelude || !rule.block) return;\n const useSelector = csstree.generate(rule.prelude);\n\n csstree.walk(rule.block, {\n visit: \"Function\",\n enter(node, item, list) {\n if (node.name !== \"var\" || !list) return;\n\n const args: string[] = [];\n if (node.children) {\n node.children.forEach((child) => {\n args.push(csstree.generate(child));\n });\n }\n\n const fullArgs = args.join(\"\");\n const commaIdx = fullArgs.indexOf(\",\");\n const varName = commaIdx !== -1 ? fullArgs.slice(0, commaIdx).trim() : fullArgs.trim();\n const fallback = commaIdx !== -1 ? fullArgs.slice(commaIdx + 1).trim() : null;\n\n // Look up the variable — only from scopes that could apply to this selector\n let resolved: string | null = null;\n\n // Priority: same selector > universal selectors (:root, *, html)\n for (const def of varDefs) {\n if (def.varName === varName && def.selector === useSelector) {\n resolved = def.value;\n break;\n }\n }\n if (!resolved) {\n for (const def of varDefs) {\n if (def.varName === varName && selectorsCouldMatch(def.selector, useSelector)) {\n resolved = def.value;\n break;\n }\n }\n }\n\n if (!resolved && fallback) {\n resolved = fallback;\n }\n\n if (resolved && item) {\n const replacement = csstree.parse(resolved, {\n context: \"value\",\n }) as csstree.Value;\n\n if (replacement.children) {\n replacement.children.forEach((child) => {\n list.insertData(child, item);\n });\n list.remove(item);\n }\n }\n },\n });\n },\n });\n}\n\n// --- Declaration sanitization (AST-level) ---\n\nfunction sanitizeDeclarations(ast: csstree.CssNode): void {\n csstree.walk(ast, {\n visit: \"Declaration\",\n enter(decl) {\n // Skip custom properties\n if (decl.property.startsWith(\"--\")) return;\n\n // Convert colors and calc in values\n if (decl.value.type === \"Value\") {\n const raw = csstree.generate(decl.value);\n let converted = convertModernColors(raw);\n converted = resolveCalcInfinity(converted);\n\n if (converted !== raw) {\n try {\n const newValue = csstree.parse(converted, {\n context: \"value\",\n }) as csstree.Value;\n decl.value = newValue;\n } catch {\n // If parsing fails, leave as-is\n }\n }\n }\n },\n });\n\n // Second pass: expand logical properties\n csstree.walk(ast, {\n visit: \"Rule\",\n enter(rule) {\n if (rule.type !== \"Rule\" || !rule.block) return;\n\n const toInsert: { property: string; value: string; important: boolean; item: csstree.ListItem<csstree.CssNode> }[] = [];\n\n rule.block.children.forEach(function (node, item) {\n if (node.type !== \"Declaration\") return;\n\n const mapping = LOGICAL_PROPERTY_MAP[node.property];\n if (!mapping) return;\n\n const valueStr = csstree.generate(node.value);\n const parts = valueStr.trim().split(/\\s+/);\n const [first, second] = mapping;\n const val1 = parts[0];\n const val2 = parts.length >= 2 ? parts[1] : parts[0];\n\n toInsert.push(\n { property: first, value: val1, important: !!node.important, item },\n { property: second, value: val2, important: !!node.important, item },\n );\n });\n\n // Replace logical property declarations with physical ones\n for (const { property, value, important, item } of toInsert) {\n try {\n const newDecl: csstree.Declaration = {\n type: \"Declaration\",\n important,\n property,\n value: csstree.parse(value, { context: \"value\" }) as csstree.Value,\n };\n rule.block.children.insertData(newDecl, item);\n } catch {\n // Skip on parse failure\n }\n }\n\n // Remove original logical property declarations (deduplicate removal)\n const removed = new Set<csstree.ListItem<csstree.CssNode>>();\n for (const { item } of toInsert) {\n if (!removed.has(item)) {\n removed.add(item);\n rule.block.children.remove(item);\n }\n }\n },\n });\n}\n\n// --- Main export ---\n\n/**\n * Downlevel modern CSS in an HTML email to maximize email client compatibility.\n *\n * Transformations:\n * 1. Convert modern color functions (oklch, hsl, hwb) to rgb()\n * 2. Convert space-based rgb() to comma-based rgb()\n * 3. Convert CSS logical properties to physical properties\n * 4. Resolve calc(infinity * 1px) to 9999px\n * 5. Unnest CSS nesting to flat rules\n * 6. Convert range media queries to legacy min/max syntax\n * 7. Resolve CSS variables (var()) within same stylesheet\n */\nexport function downlevelCSS(html: string): string {\n const $ = cheerio.load(html);\n\n // Process <style> blocks\n $(\"style\").each((_, el) => {\n let css = $(el).text();\n\n // 1. Text-level transformations (nesting, range queries)\n css = unnestCSSRules(css);\n css = convertRangeMediaQueries(css);\n\n // 2. AST-level transformations\n try {\n const ast = csstree.parse(css, { parseCustomProperty: true });\n resolveCSSVariables(ast);\n sanitizeDeclarations(ast);\n $(el).text(csstree.generate(ast));\n } catch {\n // If CSS can't be parsed, still apply text-level transforms\n $(el).text(css);\n }\n });\n\n // Process inline styles\n $(\"[style]\").each((_, el) => {\n const style = $(el).attr(\"style\") || \"\";\n const props = parseInlineStyle(style);\n let changed = false;\n\n const newProps = new Map<string, string>();\n props.forEach((value, prop) => {\n // Convert modern colors in values\n const converted = convertModernColors(value);\n if (converted !== value) changed = true;\n\n // Convert logical properties\n const physical = convertLogicalProperty(prop, converted);\n if (physical) {\n changed = true;\n for (const [p, v] of physical) {\n newProps.set(p, v);\n }\n } else {\n // Check for calc(infinity)\n const calcFixed = resolveCalcInfinity(converted);\n if (calcFixed !== converted) changed = true;\n newProps.set(prop, calcFixed);\n }\n });\n\n if (changed) {\n $(el).attr(\"style\", serializeStyle(newProps));\n }\n });\n\n return $.html();\n}\n","/**\r\n * WCAG 2.1 color parsing, luminance, and contrast utilities.\r\n *\r\n * Handles hex (#rgb, #rgba, #rrggbb, #rrggbbaa), rgb()/rgba() (comma and\r\n * space syntax), hsl()/hsla(), hwb(), oklch(), 148 named CSS colors, and\r\n * `transparent`. Returns null for unresolvable values like var(), inherit,\r\n * currentColor.\r\n */\r\n\r\nexport interface RGBA {\r\n r: number; // 0-255\r\n g: number; // 0-255\r\n b: number; // 0-255\r\n a: number; // 0-1\r\n}\r\n\r\nexport type WcagGrade = \"AAA\" | \"AA\" | \"AA Large\" | \"Fail\";\r\n\r\n// 148 CSS named colors (lowercase → [r, g, b])\r\nconst NAMED_COLORS: Record<string, [number, number, number]> = {\r\n aliceblue: [240, 248, 255], antiquewhite: [250, 235, 215], aqua: [0, 255, 255],\r\n aquamarine: [127, 255, 212], azure: [240, 255, 255], beige: [245, 245, 220],\r\n bisque: [255, 228, 196], black: [0, 0, 0], blanchedalmond: [255, 235, 205],\r\n blue: [0, 0, 255], blueviolet: [138, 43, 226], brown: [165, 42, 42],\r\n burlywood: [222, 184, 135], cadetblue: [95, 158, 160], chartreuse: [127, 255, 0],\r\n chocolate: [210, 105, 30], coral: [255, 127, 80], cornflowerblue: [100, 149, 237],\r\n cornsilk: [255, 248, 220], crimson: [220, 20, 60], cyan: [0, 255, 255],\r\n darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgoldenrod: [184, 134, 11],\r\n darkgray: [169, 169, 169], darkgreen: [0, 100, 0], darkgrey: [169, 169, 169],\r\n darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47],\r\n darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0],\r\n darksalmon: [233, 150, 122], darkseagreen: [143, 188, 143], darkslateblue: [72, 61, 139],\r\n darkslategray: [47, 79, 79], darkslategrey: [47, 79, 79], darkturquoise: [0, 206, 209],\r\n darkviolet: [148, 0, 211], deeppink: [255, 20, 147], deepskyblue: [0, 191, 255],\r\n dimgray: [105, 105, 105], dimgrey: [105, 105, 105], dodgerblue: [30, 144, 255],\r\n firebrick: [178, 34, 34], floralwhite: [255, 250, 240], forestgreen: [34, 139, 34],\r\n fuchsia: [255, 0, 255], gainsboro: [220, 220, 220], ghostwhite: [248, 248, 255],\r\n gold: [255, 215, 0], goldenrod: [218, 165, 32], gray: [128, 128, 128],\r\n green: [0, 128, 0], greenyellow: [173, 255, 47], grey: [128, 128, 128],\r\n honeydew: [240, 255, 240], hotpink: [255, 105, 180], indianred: [205, 92, 92],\r\n indigo: [75, 0, 130], ivory: [255, 255, 240], khaki: [240, 230, 140],\r\n lavender: [230, 230, 250], lavenderblush: [255, 240, 245], lawngreen: [124, 252, 0],\r\n lemonchiffon: [255, 250, 205], lightblue: [173, 216, 230], lightcoral: [240, 128, 128],\r\n lightcyan: [224, 255, 255], lightgoldenrodyellow: [250, 250, 210], lightgray: [211, 211, 211],\r\n lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193],\r\n lightsalmon: [255, 160, 122], lightseagreen: [32, 178, 170], lightskyblue: [135, 206, 250],\r\n lightslategray: [119, 136, 153], lightslategrey: [119, 136, 153], lightsteelblue: [176, 196, 222],\r\n lightyellow: [255, 255, 224], lime: [0, 255, 0], limegreen: [50, 205, 50],\r\n linen: [250, 240, 230], magenta: [255, 0, 255], maroon: [128, 0, 0],\r\n mediumaquamarine: [102, 205, 170], mediumblue: [0, 0, 205], mediumorchid: [186, 85, 211],\r\n mediumpurple: [147, 111, 219], mediumseagreen: [60, 179, 113], mediumslateblue: [123, 104, 238],\r\n mediumspringgreen: [0, 250, 154], mediumturquoise: [72, 209, 204], mediumvioletred: [199, 21, 133],\r\n midnightblue: [25, 25, 112], mintcream: [245, 255, 250], mistyrose: [255, 228, 225],\r\n moccasin: [255, 228, 181], navajowhite: [255, 222, 173], navy: [0, 0, 128],\r\n oldlace: [253, 245, 230], olive: [128, 128, 0], olivedrab: [107, 142, 35],\r\n orange: [255, 165, 0], orangered: [255, 69, 0], orchid: [218, 112, 214],\r\n palegoldenrod: [238, 232, 170], palegreen: [152, 251, 152], paleturquoise: [175, 238, 238],\r\n palevioletred: [219, 112, 147], papayawhip: [255, 239, 213], peachpuff: [255, 218, 185],\r\n peru: [205, 133, 63], pink: [255, 192, 203], plum: [221, 160, 221],\r\n powderblue: [176, 224, 230], purple: [128, 0, 128], rebeccapurple: [102, 51, 153],\r\n red: [255, 0, 0], rosybrown: [188, 143, 143], royalblue: [65, 105, 225],\r\n saddlebrown: [139, 69, 19], salmon: [250, 128, 114], sandybrown: [244, 164, 96],\r\n seagreen: [46, 139, 87], seashell: [255, 245, 238], sienna: [160, 82, 45],\r\n silver: [192, 192, 192], skyblue: [135, 206, 235], slateblue: [106, 90, 205],\r\n slategray: [112, 128, 144], slategrey: [112, 128, 144], snow: [255, 250, 250],\r\n springgreen: [0, 255, 127], steelblue: [70, 130, 180], tan: [210, 180, 140],\r\n teal: [0, 128, 128], thistle: [216, 191, 216], tomato: [255, 99, 71],\r\n turquoise: [64, 224, 208], violet: [238, 130, 238], wheat: [245, 222, 179],\r\n white: [255, 255, 255], whitesmoke: [245, 245, 245], yellow: [255, 255, 0],\r\n yellowgreen: [154, 205, 50],\r\n};\r\n\r\n// --- Internal conversion helpers ---\r\n\r\n/** Parse an alpha value that may be a number (0-1) or percentage (0%-100%). */\r\nfunction parseAlpha(raw: string | undefined): number {\r\n if (raw === undefined) return 1;\r\n const s = raw.trim();\r\n if (s.endsWith(\"%\")) {\r\n return Math.min(1, Math.max(0, parseFloat(s) / 100));\r\n }\r\n return Math.min(1, Math.max(0, parseFloat(s)));\r\n}\r\n\r\n/** Clamp a value to 0-255 and round. */\r\nfunction clamp255(n: number): number {\r\n return Math.round(Math.min(255, Math.max(0, n)));\r\n}\r\n\r\n/**\r\n * Convert HSL to RGB.\r\n * H in degrees [0,360), S and L in [0,1].\r\n */\r\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\r\n const c = (1 - Math.abs(2 * l - 1)) * s;\r\n const hp = h / 60;\r\n const x = c * (1 - Math.abs((hp % 2) - 1));\r\n const m = l - c / 2;\r\n\r\n let r1 = 0, g1 = 0, b1 = 0;\r\n if (hp >= 0 && hp < 1) { r1 = c; g1 = x; b1 = 0; }\r\n else if (hp >= 1 && hp < 2) { r1 = x; g1 = c; b1 = 0; }\r\n else if (hp >= 2 && hp < 3) { r1 = 0; g1 = c; b1 = x; }\r\n else if (hp >= 3 && hp < 4) { r1 = 0; g1 = x; b1 = c; }\r\n else if (hp >= 4 && hp < 5) { r1 = x; g1 = 0; b1 = c; }\r\n else { r1 = c; g1 = 0; b1 = x; }\r\n\r\n return [\r\n clamp255((r1 + m) * 255),\r\n clamp255((g1 + m) * 255),\r\n clamp255((b1 + m) * 255),\r\n ];\r\n}\r\n\r\n/**\r\n * Convert HWB to RGB.\r\n * H in degrees, W and B in [0,1].\r\n */\r\nfunction hwbToRgb(h: number, w: number, b: number): [number, number, number] {\r\n if (w + b >= 1) {\r\n const gray = clamp255((w / (w + b)) * 255);\r\n return [gray, gray, gray];\r\n }\r\n // Get pure hue as RGB via HSL(h, 100%, 50%)\r\n const [r0, g0, b0] = hslToRgb(h, 1, 0.5);\r\n return [\r\n clamp255(r0 / 255 * (1 - w - b) * 255 + w * 255),\r\n clamp255(g0 / 255 * (1 - w - b) * 255 + w * 255),\r\n clamp255(b0 / 255 * (1 - w - b) * 255 + w * 255),\r\n ];\r\n}\r\n\r\n/** Linear-sRGB to sRGB gamma correction. */\r\nfunction linearToGamma(c: number): number {\r\n if (c <= 0.0031308) return 12.92 * c;\r\n return 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\r\n}\r\n\r\n/**\r\n * Convert OKLCh to RGB.\r\n * L in [0,1], C in [0,~0.4], H in degrees [0,360).\r\n */\r\nfunction oklchToRgb(L: number, C: number, H: number): [number, number, number] {\r\n // oklch → oklab\r\n const hRad = H * Math.PI / 180;\r\n const a = C * Math.cos(hRad);\r\n const b = C * Math.sin(hRad);\r\n\r\n // oklab → LMS (cubed roots)\r\n const l_ = L + 0.3963377774 * a + 0.2158037573 * b;\r\n const m_ = L - 0.1055613458 * a - 0.0638541728 * b;\r\n const s_ = L - 0.0894841775 * a - 1.2914855480 * b;\r\n\r\n const l = l_ * l_ * l_;\r\n const m = m_ * m_ * m_;\r\n const s = s_ * s_ * s_;\r\n\r\n // LMS → linear sRGB\r\n const rLin = +4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s;\r\n const gLin = -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s;\r\n const bLin = -0.0041960863 * l - 0.7034186147 * m + 1.7076147010 * s;\r\n\r\n // linear sRGB → sRGB gamma → 0-255\r\n return [\r\n clamp255(linearToGamma(rLin) * 255),\r\n clamp255(linearToGamma(gLin) * 255),\r\n clamp255(linearToGamma(bLin) * 255),\r\n ];\r\n}\r\n\r\n/**\r\n * Parse a CSS color value to RGBA. Returns null for unresolvable values.\r\n */\r\nexport function parseColor(value: string): RGBA | null {\r\n if (!value) return null;\r\n const v = value.trim().toLowerCase();\r\n\r\n // Unresolvable\r\n if (v === \"inherit\" || v === \"currentcolor\" || v === \"initial\" || v === \"unset\" || v.startsWith(\"var(\")) {\r\n return null;\r\n }\r\n\r\n if (v === \"transparent\") {\r\n return { r: 0, g: 0, b: 0, a: 0 };\r\n }\r\n\r\n // Named colors\r\n const named = NAMED_COLORS[v];\r\n if (named) {\r\n return { r: named[0], g: named[1], b: named[2], a: 1 };\r\n }\r\n\r\n // Hex: #rgb, #rgba, #rrggbb, #rrggbbaa\r\n if (v.startsWith(\"#\")) {\r\n const hex = v.slice(1);\r\n if (hex.length === 3) {\r\n return {\r\n r: parseInt(hex[0] + hex[0], 16),\r\n g: parseInt(hex[1] + hex[1], 16),\r\n b: parseInt(hex[2] + hex[2], 16),\r\n a: 1,\r\n };\r\n }\r\n if (hex.length === 4) {\r\n return {\r\n r: parseInt(hex[0] + hex[0], 16),\r\n g: parseInt(hex[1] + hex[1], 16),\r\n b: parseInt(hex[2] + hex[2], 16),\r\n a: parseInt(hex[3] + hex[3], 16) / 255,\r\n };\r\n }\r\n if (hex.length === 6) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: 1,\r\n };\r\n }\r\n if (hex.length === 8) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: parseInt(hex.slice(6, 8), 16) / 255,\r\n };\r\n }\r\n return null;\r\n }\r\n\r\n // rgb() / rgba() — comma syntax\r\n const rgbComma = v.match(/^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (rgbComma) {\r\n return {\r\n r: Math.min(255, parseInt(rgbComma[1], 10)),\r\n g: Math.min(255, parseInt(rgbComma[2], 10)),\r\n b: Math.min(255, parseInt(rgbComma[3], 10)),\r\n a: rgbComma[4] !== undefined ? parseAlpha(rgbComma[4]) : 1,\r\n };\r\n }\r\n\r\n // rgb() / rgba() — space syntax: rgb(255 0 0) or rgb(255 0 0 / 0.5) or rgb(255 0 0 / 50%)\r\n const rgbSpace = v.match(/^rgba?\\(\\s*(\\d+)\\s+(\\d+)\\s+(\\d+)(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (rgbSpace) {\r\n return {\r\n r: Math.min(255, parseInt(rgbSpace[1], 10)),\r\n g: Math.min(255, parseInt(rgbSpace[2], 10)),\r\n b: Math.min(255, parseInt(rgbSpace[3], 10)),\r\n a: rgbSpace[4] !== undefined ? parseAlpha(rgbSpace[4]) : 1,\r\n };\r\n }\r\n\r\n // hsl() / hsla() — comma syntax: hsl(120, 100%, 50%) or hsla(120, 100%, 50%, 0.5)\r\n const hslComma = v.match(/^hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hslComma) {\r\n const h = ((parseFloat(hslComma[1]) % 360) + 360) % 360;\r\n const s = Math.min(100, parseFloat(hslComma[2])) / 100;\r\n const l = Math.min(100, parseFloat(hslComma[3])) / 100;\r\n const [r, g, b] = hslToRgb(h, s, l);\r\n return { r, g, b, a: hslComma[4] !== undefined ? parseAlpha(hslComma[4]) : 1 };\r\n }\r\n\r\n // hsl() / hsla() — space syntax: hsl(120 100% 50%) or hsl(120 100% 50% / 0.5)\r\n const hslSpace = v.match(/^hsla?\\(\\s*([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hslSpace) {\r\n const h = ((parseFloat(hslSpace[1]) % 360) + 360) % 360;\r\n const s = Math.min(100, parseFloat(hslSpace[2])) / 100;\r\n const l = Math.min(100, parseFloat(hslSpace[3])) / 100;\r\n const [r, g, b] = hslToRgb(h, s, l);\r\n return { r, g, b, a: hslSpace[4] !== undefined ? parseAlpha(hslSpace[4]) : 1 };\r\n }\r\n\r\n // hwb(): hwb(120 10% 20%) or hwb(120 10% 20% / 0.5)\r\n const hwbMatch = v.match(/^hwb\\(\\s*([\\d.]+)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (hwbMatch) {\r\n const h = ((parseFloat(hwbMatch[1]) % 360) + 360) % 360;\r\n const w = Math.min(100, parseFloat(hwbMatch[2])) / 100;\r\n const bk = Math.min(100, parseFloat(hwbMatch[3])) / 100;\r\n const [r, g, b] = hwbToRgb(h, w, bk);\r\n return { r, g, b, a: hwbMatch[4] !== undefined ? parseAlpha(hwbMatch[4]) : 1 };\r\n }\r\n\r\n // oklch(): oklch(0.7 0.15 180) or oklch(0.7 0.15 180 / 0.5)\r\n const oklchMatch = v.match(/^oklch\\(\\s*([\\d.]+)\\s+([\\d.]+)\\s+([\\d.]+)(?:\\s*\\/\\s*([\\d.]+%?))?\\s*\\)$/);\r\n if (oklchMatch) {\r\n const L = Math.min(1, Math.max(0, parseFloat(oklchMatch[1])));\r\n const C = Math.max(0, parseFloat(oklchMatch[2]));\r\n const H = ((parseFloat(oklchMatch[3]) % 360) + 360) % 360;\r\n const [r, g, b] = oklchToRgb(L, C, H);\r\n return { r, g, b, a: oklchMatch[4] !== undefined ? parseAlpha(oklchMatch[4]) : 1 };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Format an RGBA value as an rgb() or rgba() CSS string.\r\n * Returns `rgba(r, g, b, a)` when alpha < 1, otherwise `rgb(r, g, b)`.\r\n */\r\nexport function formatRgb(rgba: RGBA): string {\r\n const r = clamp255(rgba.r);\r\n const g = clamp255(rgba.g);\r\n const b = clamp255(rgba.b);\r\n if (rgba.a < 1) {\r\n return `rgba(${r}, ${g}, ${b}, ${rgba.a})`;\r\n }\r\n return `rgb(${r}, ${g}, ${b})`;\r\n}\r\n\r\n/**\r\n * Compute WCAG 2.1 relative luminance for an sRGB color.\r\n * Input values 0-255.\r\n */\r\nexport function relativeLuminance(r: number, g: number, b: number): number {\r\n const [rs, gs, bs] = [r, g, b].map((c) => {\r\n const s = c / 255;\r\n return s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\r\n });\r\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\r\n}\r\n\r\n/**\r\n * Compute the WCAG contrast ratio between two relative luminances.\r\n */\r\nexport function contrastRatio(l1: number, l2: number): number {\r\n const lighter = Math.max(l1, l2);\r\n const darker = Math.min(l1, l2);\r\n return (lighter + 0.05) / (darker + 0.05);\r\n}\r\n\r\n/**\r\n * Determine WCAG 2.1 conformance grade for a contrast ratio.\r\n */\r\nexport function wcagGrade(ratio: number): WcagGrade {\r\n if (ratio >= 7) return \"AAA\";\r\n if (ratio >= 4.5) return \"AA\";\r\n if (ratio >= 3) return \"AA Large\";\r\n return \"Fail\";\r\n}\r\n\r\n/**\r\n * Alpha-blend a foreground RGBA onto an opaque background (r, g, b 0-255).\r\n * Returns the flattened [r, g, b] as 0-255 values.\r\n */\r\nexport function alphaBlend(fg: RGBA, bgR: number, bgG: number, bgB: number): [number, number, number] {\r\n const a = fg.a;\r\n return [\r\n Math.round(fg.r * a + bgR * (1 - a)),\r\n Math.round(fg.g * a + bgG * (1 - a)),\r\n Math.round(fg.b * a + bgB * (1 - a)),\r\n ];\r\n}\r\n","/**\r\n * Shared constants used across the engine.\r\n */\r\n\r\n/** Maximum HTML input size: 2MB. Inputs exceeding this are rejected early. */\r\nexport const MAX_HTML_SIZE = 2 * 1024 * 1024;\r\n\r\nexport const GENERIC_LINK_TEXT = new Set([\r\n \"click here\", \"here\", \"read more\", \"learn more\", \"more\",\r\n \"link\", \"this link\", \"click\", \"tap here\", \"this\",\r\n]);\r\n\r\n// ─── Gmail clipping thresholds ──────────────────────────────────────────────\r\n\r\n/** Gmail clips messages larger than ~102KB */\r\nexport const GMAIL_CLIP_THRESHOLD = 102 * 1024;\r\n\r\n/** Warning zone: messages approaching the clip threshold */\r\nexport const GMAIL_CLIP_WARNING_THRESHOLD = 90 * 1024;\r\n\r\n// ─── Per-client display limits ──────────────────────────────────────────────\r\n// Display limits last verified: 2026-03-04\r\n// Sources: emailtooltester.com, Campaign Monitor, Litmus preview text guide\r\n// Note: These are approximations — actual limits vary by device, screen size,\r\n// font rendering, and sender name length.\r\n\r\nexport interface ClientDisplayLimit {\r\n client: string;\r\n subjectLimit: number;\r\n preheaderLimit: number;\r\n}\r\n\r\nexport const CLIENT_DISPLAY_LIMITS: ClientDisplayLimit[] = [\r\n { client: \"Gmail (Web)\", subjectLimit: 70, preheaderLimit: 90 },\r\n { client: \"Gmail (Mobile)\", subjectLimit: 40, preheaderLimit: 45 },\r\n { client: \"Outlook (Web)\", subjectLimit: 60, preheaderLimit: 90 },\r\n { client: \"Outlook (Desktop)\", subjectLimit: 55, preheaderLimit: 35 },\r\n { client: \"Apple Mail (macOS)\", subjectLimit: 78, preheaderLimit: 140 },\r\n { client: \"Apple Mail (iOS)\", subjectLimit: 41, preheaderLimit: 90 },\r\n { client: \"Yahoo Mail\", subjectLimit: 46, preheaderLimit: 100 },\r\n { client: \"Samsung Email\", subjectLimit: 40, preheaderLimit: 70 },\r\n];\r\n\r\n// ─── Template variable patterns ─────────────────────────────────────────────\r\n\r\n/**\r\n * Patterns for detecting unresolved template/merge variables.\r\n * Each entry: [pattern, label]\r\n */\r\nexport const TEMPLATE_VARIABLE_PATTERNS: Array<[RegExp, string]> = [\r\n [/\\{\\{[\\s\\S]*?\\}\\}/g, \"Handlebars/Mustache\"], // {{var}}\r\n [/\\$\\{[^}]+\\}/g, \"ES template literal\"], // ${var}\r\n [/<%=?\\s*[^%]+%>/g, \"ERB/EJS\"], // <% %> / <%= %>\r\n [/\\*\\|[A-Z_][A-Z0-9_]*\\|\\*/g, \"Mailchimp merge tag\"], // *|TAG|*\r\n [/%%[A-Za-z_][A-Za-z0-9_]*%%/g, \"Salesforce AMPscript\"],// %%tag%%\r\n [/\\{[A-Za-z_][A-Za-z0-9_.]{2,}\\}/g, \"Single-brace merge field\"], // {merge_field} (3+ char names)\r\n];\r\n\r\n/** Shared empty report defaults for skipped checks and empty-input fast paths. */\r\nimport type { SpamReport, LinkReport, AccessibilityReport, ImageReport, InboxPreview, SizeReport, TemplateReport } from \"./types\";\r\n\r\nexport const EMPTY_SPAM: SpamReport = { score: 100, level: \"low\", issues: [] };\r\nexport const EMPTY_LINKS: LinkReport = {\r\n totalLinks: 0,\r\n issues: [],\r\n breakdown: { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 },\r\n};\r\nexport const EMPTY_ACCESSIBILITY: AccessibilityReport = { score: 100, issues: [] };\r\nexport const EMPTY_IMAGES: ImageReport = { total: 0, totalDataUriBytes: 0, issues: [], images: [] };\r\nexport const EMPTY_INBOX_PREVIEW: InboxPreview = { subject: null, preheader: null, subjectLength: 0, preheaderLength: 0, truncation: [], issues: [] };\r\nexport const EMPTY_SIZE: SizeReport = { htmlBytes: 0, humanSize: \"0 B\", clipped: false, issues: [] };\r\nexport const EMPTY_TEMPLATE: TemplateReport = { unresolvedCount: 0, issues: [] };\r\n\r\nimport type { DeliverabilityReport } from \"./types\";\r\nexport const EMPTY_DELIVERABILITY: DeliverabilityReport = { domain: \"\", checks: [], score: 0, issues: [] };\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport {\r\n CSS_SUPPORT,\r\n STRUCTURAL_FIX_PROPERTIES,\r\n HTML_ELEMENT_FEATURES,\r\n AT_RULE_FEATURES,\r\n COMPOUND_VALUE_FEATURES,\r\n CSS_FUNCTION_FEATURES,\r\n} from \"./rules/css-support\";\r\nimport { EMAIL_CLIENTS } from \"./clients\";\r\nimport { getCodeFix, getSuggestion, isCodeFixGenericFallback } from \"./fix-snippets\";\r\nimport { parseStyleProperties, getStyleValue } from \"./style-utils\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { CSSWarning, FixType, Framework, SupportLevel } from \"./types\";\r\n\r\n// ── Data-driven detection config ─────────────────────────────────────────────\r\n\r\n/**\r\n * HTML element detection rules.\r\n * Each maps a feature key to a CSS selector for DOM detection.\r\n * Special cases (like <form> also matching <input>/<button>) are listed explicitly.\r\n */\r\nconst HTML_ELEMENT_SELECTORS: Record<string, string> = {\r\n \"<style>\": \"style\",\r\n \"<link>\": \"link[rel='stylesheet']\",\r\n \"<svg>\": \"svg\",\r\n \"<video>\": \"video\",\r\n \"<form>\": \"form, input, button[type='submit']\",\r\n \"<audio>\": \"audio\",\r\n \"<picture>\": \"picture\",\r\n \"<dialog>\": \"dialog\",\r\n \"<meter>\": \"meter\",\r\n \"<progress>\": \"progress\",\r\n \"<select>\": \"select\",\r\n \"<textarea>\": \"textarea\",\r\n \"<marquee>\": \"marquee\",\r\n \"<object>\": \"object\",\r\n \"<base>\": \"base\",\r\n};\r\n\r\n/** Severity for HTML element detection (some are error, some warning). */\r\nconst HTML_ELEMENT_SEVERITY: Record<string, \"error\" | \"warning\"> = {\r\n \"<style>\": \"error\",\r\n \"<link>\": \"error\",\r\n \"<svg>\": \"error\",\r\n \"<form>\": \"error\",\r\n \"<video>\": \"warning\",\r\n \"<audio>\": \"warning\",\r\n \"<picture>\": \"warning\",\r\n \"<dialog>\": \"warning\",\r\n \"<marquee>\": \"warning\",\r\n \"<meter>\": \"warning\",\r\n \"<progress>\": \"warning\",\r\n \"<select>\": \"warning\",\r\n \"<textarea>\": \"warning\",\r\n \"<object>\": \"warning\",\r\n \"<base>\": \"warning\",\r\n};\r\n\r\n/** Custom messages for HTML elements. Falls back to generic message. */\r\nconst HTML_ELEMENT_MESSAGES: Record<string, (clientName: string) => string> = {\r\n \"<style>\": (n) => `${n} strips <style> blocks. Styles must be inlined.`,\r\n \"<link>\": (n) => `${n} does not support external stylesheets.`,\r\n \"<svg>\": (n) => `${n} does not support inline SVG.`,\r\n \"<video>\": (n) => `${n} does not support <video> elements.`,\r\n \"<form>\": (n) => `${n} strips form elements.`,\r\n};\r\n\r\n/** Compound value detection: maps compound feature keys to {property, valueIncludes}. */\r\nconst COMPOUND_DETECTORS: Array<{\r\n key: string;\r\n property: string;\r\n valueIncludes: string;\r\n}> = [\r\n { key: \"display:flex\", property: \"display\", valueIncludes: \"flex\" },\r\n { key: \"display:grid\", property: \"display\", valueIncludes: \"grid\" },\r\n { key: \"display:none\", property: \"display\", valueIncludes: \"none\" },\r\n];\r\n\r\n/** CSS function detection: require opening paren to avoid false positives (e.g., \"min\" in \"Minion\"). */\r\nconst CSS_FUNCTION_DETECTORS = CSS_FUNCTION_FEATURES.map((fn) => ({\r\n key: fn,\r\n pattern: `${fn}(`, // require opening paren — matches \"min(\" but not \"Minion\"\r\n}));\r\n\r\n// ── Analysis ─────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * Analyze a pre-parsed email DOM for CSS compatibility warnings.\r\n *\r\n * Uses data-driven detection: HTML_ELEMENT_FEATURES, AT_RULE_FEATURES,\r\n * COMPOUND_VALUE_FEATURES, and CSS_FUNCTION_FEATURES are iterated\r\n * automatically from the generated css-support.ts arrays.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeEmailFromDom($: cheerio.CheerioAPI, framework?: Framework): CSSWarning[] {\r\n const warnings: CSSWarning[] = [];\r\n const seenWarnings = new Set<string>();\r\n\r\n function addWarning(w: CSSWarning) {\r\n const key = `${w.client}:${w.property}:${w.severity}:${w.selector || \"\"}`;\r\n if (!seenWarnings.has(key)) {\r\n seenWarnings.add(key);\r\n warnings.push(w);\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n function describeSelector(el: any): string {\r\n const $el = $(el);\r\n const tag = (el.tagName as string)?.toLowerCase() || \"\";\r\n const cls = $el.attr(\"class\");\r\n const id = $el.attr(\"id\");\r\n if (id) return `${tag}#${id}`;\r\n if (cls) return `${tag}.${cls.split(/\\s+/)[0]}`;\r\n const href = $el.attr(\"href\");\r\n if (href) return `${tag}[href]`;\r\n return tag;\r\n }\r\n\r\n // 1. Data-driven HTML element detection\r\n for (const feature of HTML_ELEMENT_FEATURES) {\r\n const selector = HTML_ELEMENT_SELECTORS[feature];\r\n if (!selector) continue; // Element not in our detection map — skip\r\n if ($(selector).length === 0) continue;\r\n\r\n const supportData = CSS_SUPPORT[feature];\r\n if (!supportData) continue;\r\n\r\n const baseSeverity = HTML_ELEMENT_SEVERITY[feature] || \"warning\";\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const support = supportData[client.id];\r\n if (support === \"unsupported\") {\r\n const msgFn = HTML_ELEMENT_MESSAGES[feature];\r\n const message = msgFn\r\n ? msgFn(client.name)\r\n : `${client.name} does not support ${feature}.`;\r\n const sug = getSuggestion(feature, client.id, framework);\r\n const fix = getCodeFix(feature, client.id, framework);\r\n addWarning({\r\n severity: baseSeverity,\r\n client: client.id,\r\n property: feature,\r\n message,\r\n suggestion: sug.text,\r\n fix,\r\n fixType: getFixType(feature),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(feature, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n } else if (support === \"partial\" && feature === \"<style>\") {\r\n // Special case: <style> partial gets a custom message\r\n const sug = getSuggestion(\"<style>:partial\", client.id, framework);\r\n const fix = getCodeFix(\"<style>\", client.id, framework);\r\n addWarning({\r\n severity: \"warning\",\r\n client: client.id,\r\n property: \"<style>\",\r\n message: `${client.name} has partial <style> support (head only, with limitations). Inline styles recommended.`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType: getFixType(\"<style>\"),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(\"<style>\", client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n }\r\n }\r\n }\r\n\r\n // 2. Parse <style> blocks with css-tree\r\n const parsedAtRules = new Set<string>();\r\n const parsedProperties = new Set<string>();\r\n const propertyLines = new Map<string, number>();\r\n const detectedCssFunctions = new Set<string>();\r\n const detectedPseudoClasses = new Set<string>();\r\n const detectedPseudoElements = new Set<string>();\r\n\r\n $(\"style\").each((_, el) => {\r\n const cssText = $(el).text();\r\n try {\r\n const ast = csstree.parse(cssText, { parseCustomProperty: true, positions: true });\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type === \"Atrule\") {\r\n parsedAtRules.add(`@${node.name}`);\r\n }\r\n // Detect pseudo-classes and pseudo-elements in selectors\r\n if (node.type === \"PseudoClassSelector\") {\r\n detectedPseudoClasses.add(`:${node.name}`);\r\n }\r\n if (node.type === \"PseudoElementSelector\") {\r\n detectedPseudoElements.add(`::${node.name}`);\r\n }\r\n if (node.type === \"Declaration\") {\r\n const prop = node.property.toLowerCase();\r\n parsedProperties.add(prop);\r\n if (node.loc && !propertyLines.has(prop)) {\r\n propertyLines.set(prop, node.loc.start.line);\r\n }\r\n\r\n // Data-driven compound value detection\r\n const valueStr = csstree.generate(node.value);\r\n for (const det of COMPOUND_DETECTORS) {\r\n if (prop === det.property && valueStr.includes(det.valueIncludes)) {\r\n parsedProperties.add(det.key);\r\n if (node.loc && !propertyLines.has(det.key)) {\r\n propertyLines.set(det.key, node.loc.start.line);\r\n }\r\n }\r\n }\r\n\r\n // Data-driven CSS function detection\r\n for (const fn of CSS_FUNCTION_DETECTORS) {\r\n if (valueStr.includes(fn.pattern)) {\r\n detectedCssFunctions.add(fn.key);\r\n if (node.loc && !propertyLines.has(fn.key)) {\r\n propertyLines.set(fn.key, node.loc.start.line);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n });\r\n } catch {\r\n // If css-tree can't parse, skip\r\n }\r\n });\r\n\r\n // 3. Data-driven at-rule checking\r\n for (const atRule of AT_RULE_FEATURES) {\r\n if (!parsedAtRules.has(atRule)) continue;\r\n checkPropertySupport(atRule, addWarning, framework);\r\n }\r\n\r\n // 4. Scan inline styles\r\n const cssPropertiesToCheck = Object.keys(CSS_SUPPORT).filter(\r\n (k) => !k.startsWith(\"<\") && !k.startsWith(\"@\")\r\n );\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseStyleProperties(style);\r\n const selector = describeSelector(el);\r\n\r\n for (const prop of props) {\r\n // Data-driven compound value detection in inline styles\r\n for (const det of COMPOUND_DETECTORS) {\r\n if (prop === det.property) {\r\n const value = getStyleValue(style, prop);\r\n if (value?.includes(det.valueIncludes)) {\r\n checkPropertySupport(det.key, addWarning, framework, selector);\r\n }\r\n }\r\n }\r\n\r\n if (cssPropertiesToCheck.includes(prop)) {\r\n checkPropertySupport(prop, addWarning, framework, selector);\r\n }\r\n\r\n // Data-driven CSS function detection in inline styles\r\n const value = getStyleValue(style, prop);\r\n if (value) {\r\n for (const fn of CSS_FUNCTION_DETECTORS) {\r\n if (value.includes(fn.pattern)) {\r\n checkPropertySupport(fn.key, addWarning, framework, selector);\r\n }\r\n }\r\n }\r\n }\r\n });\r\n\r\n // 5. Check CSS properties from <style> blocks\r\n for (const prop of parsedProperties) {\r\n if (prop.includes(\":\")) continue;\r\n if (!cssPropertiesToCheck.includes(prop)) continue;\r\n checkPropertySupport(prop, addWarning, framework, undefined, propertyLines.get(prop));\r\n }\r\n\r\n // Data-driven compound values from <style> blocks (display:flex, display:grid, display:none)\r\n for (const compound of COMPOUND_VALUE_FEATURES) {\r\n // Only check actual compound values (property:value pairs), not pseudo-selectors\r\n if (compound.startsWith(\":\") || compound.startsWith(\"::\")) continue;\r\n if (parsedProperties.has(compound)) {\r\n checkPropertySupport(compound, addWarning, framework, undefined, propertyLines.get(compound));\r\n }\r\n }\r\n\r\n // Data-driven pseudo-class/element detection from <style> blocks\r\n for (const pseudo of detectedPseudoClasses) {\r\n if (CSS_SUPPORT[pseudo]) {\r\n checkPropertySupport(pseudo, addWarning, framework);\r\n }\r\n }\r\n for (const pseudo of detectedPseudoElements) {\r\n if (CSS_SUPPORT[pseudo]) {\r\n checkPropertySupport(pseudo, addWarning, framework);\r\n }\r\n }\r\n\r\n // Data-driven CSS functions from <style> blocks\r\n for (const fn of detectedCssFunctions) {\r\n checkPropertySupport(fn, addWarning, framework, undefined, propertyLines.get(fn));\r\n }\r\n\r\n // Sort: errors first, then warnings, then info\r\n const severityOrder: Record<string, number> = { error: 0, warning: 1, info: 2 };\r\n warnings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\r\n\r\n return warnings;\r\n}\r\n\r\n/**\r\n * Analyze an HTML email and return CSS compatibility warnings\r\n * for all target email clients.\r\n *\r\n * The `framework` parameter controls which fix snippets are attached\r\n * to warnings — it does NOT change which warnings fire. Analysis always\r\n * runs on compiled HTML (what email clients actually receive). Fix\r\n * snippets reference source-level constructs so users know how to\r\n * modify their framework source code.\r\n */\r\nexport function analyzeEmail(html: string, framework?: Framework): CSSWarning[] {\r\n if (!html || !html.trim()) {\r\n return [];\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeEmailFromDom($, framework);\r\n}\r\n\r\nfunction getFixType(prop: string): FixType {\r\n return STRUCTURAL_FIX_PROPERTIES.has(prop) ? \"structural\" : \"css\";\r\n}\r\n\r\nfunction checkPropertySupport(\r\n prop: string,\r\n addWarning: (w: CSSWarning) => void,\r\n framework?: Framework,\r\n selector?: string,\r\n line?: number,\r\n) {\r\n const supportData = CSS_SUPPORT[prop];\r\n if (!supportData) return;\r\n\r\n const fixType = getFixType(prop);\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const support: SupportLevel = supportData[client.id] || \"unknown\";\r\n if (support === \"unsupported\") {\r\n const sug = getSuggestion(prop, client.id, framework);\r\n const fix = getCodeFix(prop, client.id, framework);\r\n addWarning({\r\n severity: \"warning\",\r\n client: client.id,\r\n property: prop,\r\n message: `${client.name} does not support \"${prop}\".`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType,\r\n ...(selector ? { selector } : {}),\r\n ...(line !== undefined ? { line } : {}),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(prop, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n } else if (support === \"partial\") {\r\n const sug = getSuggestion(prop, client.id, framework);\r\n const fix = getCodeFix(prop, client.id, framework);\r\n addWarning({\r\n severity: \"info\",\r\n client: client.id,\r\n property: prop,\r\n message: `${client.name} has partial support for \"${prop}\".`,\r\n suggestion: sug.text,\r\n fix,\r\n fixType,\r\n ...(selector ? { selector } : {}),\r\n ...(line !== undefined ? { line } : {}),\r\n ...(framework && (sug.isGenericFallback || (fix && isCodeFixGenericFallback(prop, client.id, framework)))\r\n ? { fixIsGenericFallback: true } : {}),\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Generate a summary of CSS compatibility for the email.\r\n */\r\nexport function generateCompatibilityScore(\r\n warnings: CSSWarning[]\r\n): Record<string, { score: number; errors: number; warnings: number; info: number }> {\r\n const result: Record<string, { score: number; errors: number; warnings: number; info: number }> = {};\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const clientWarnings = warnings.filter((w) => w.client === client.id);\r\n\r\n // Count unique properties per severity so repeated elements don't inflate the score\r\n const errorProps = new Set(clientWarnings.filter((w) => w.severity === \"error\").map((w) => w.property));\r\n const warnProps = new Set(clientWarnings.filter((w) => w.severity === \"warning\").map((w) => w.property));\r\n const infoProps = new Set(clientWarnings.filter((w) => w.severity === \"info\").map((w) => w.property));\r\n\r\n const errors = errorProps.size;\r\n const warns = warnProps.size;\r\n const info = infoProps.size;\r\n\r\n // Score: 100 minus penalties, clamped to 0-100\r\n // Partial-support (info) items are not penalised — they mostly work\r\n const score = Math.max(0, Math.min(100, 100 - errors * 10 - warns * 3));\r\n\r\n result[client.id] = { score, errors, warnings: warns, info };\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/** Filter warnings for a specific client. */\r\nexport function warningsForClient(warnings: CSSWarning[], clientId: string): CSSWarning[] {\r\n return warnings.filter(w => w.client === clientId);\r\n}\r\n\r\n/** Get only error-severity warnings. */\r\nexport function errorWarnings(warnings: CSSWarning[]): CSSWarning[] {\r\n return warnings.filter(w => w.severity === \"error\");\r\n}\r\n\r\n/** Get only structural fix warnings. */\r\nexport function structuralWarnings(warnings: CSSWarning[]): CSSWarning[] {\r\n return warnings.filter(w => w.fixType === \"structural\");\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport * as csstree from \"css-tree\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport { parseColor, relativeLuminance } from \"./color-utils\";\r\nimport { parseInlineStyle, serializeStyle } from \"./style-utils\";\r\nimport type { CSSWarning } from \"./types\";\r\nimport { getClient } from \"./clients\";\r\n\r\n/** Luminance threshold — colors above this are considered \"light\" */\r\nconst LIGHT_THRESHOLD = 0.7;\r\n/** Luminance threshold — colors below this are considered \"dark\" */\r\nconst DARK_THRESHOLD = 0.15;\r\n\r\n/**\r\n * Simulate dark mode rendering for an email.\r\n * Email clients apply dark mode differently:\r\n * - Some invert colors (Gmail Android)\r\n * - Some use prefers-color-scheme media query (Apple Mail)\r\n * - Some do partial inversion (Outlook.com)\r\n *\r\n * Last verified: 2026-03-04\r\n * Sources: Litmus dark mode guide, caniemail.com, Parcel dark mode guide\r\n */\r\nexport function simulateDarkMode(\r\n html: string,\r\n clientId: string\r\n): { html: string; warnings: CSSWarning[] } {\r\n if (!html || !html.trim()) {\r\n return { html: html || \"\", warnings: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n const warnings: CSSWarning[] = [];\r\n\r\n // Check for images with transparent backgrounds\r\n $(\"img\").each((_, el) => {\r\n const src = $(el).attr(\"src\") || \"\";\r\n if (src.endsWith(\".png\") || src.endsWith(\".svg\") || src.endsWith(\".webp\")) {\r\n warnings.push({\r\n severity: \"warning\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message: \"Image with potentially transparent background may disappear in dark mode.\",\r\n suggestion:\r\n 'Add a background-color to the parent element, or use a non-transparent image format.',\r\n });\r\n }\r\n });\r\n\r\n // Determine dark mode behavior based on client\r\n switch (clientId) {\r\n case \"gmail-web\":\r\n // Gmail Web only darkens the UI chrome, not email content\r\n break;\r\n\r\n case \"gmail-ios\":\r\n // Gmail iOS applies full color inversion\r\n applyColorInversion($, \"full\");\r\n break;\r\n\r\n case \"gmail-android\":\r\n // Gmail Android applies partial color inversion\r\n applyColorInversion($, \"partial\");\r\n break;\r\n\r\n case \"outlook-web\":\r\n // Outlook.com applies its own dark mode with partial inversion\r\n // Also injects [data-ogsc] and [data-ogsb] attributes to store original colors\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook.com applies partial color inversion in dark mode.\",\r\n suggestion:\r\n \"Use [data-ogsc] or [data-ogsb] CSS attribute selectors to override Outlook.com's dark mode color changes.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-windows\":\r\n // New Outlook (web engine) applies partial inversion like Outlook.com\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook (New) applies partial color inversion in dark mode, similar to Outlook.com.\",\r\n suggestion:\r\n \"Use [data-ogsc] or [data-ogsb] CSS attribute selectors to override Outlook's dark mode color changes.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-ios\":\r\n case \"outlook-android\":\r\n // Outlook mobile apps apply partial inversion but do not inject [data-ogsc]/[data-ogsb] attributes\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n `${getClient(clientId)?.name ?? clientId} applies partial color inversion in dark mode.`,\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors. Outlook mobile does not support [data-ogsc]/[data-ogsb] attribute overrides.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"outlook-windows-legacy\":\r\n // Classic Outlook (Word engine) applies full color inversion in dark mode\r\n applyColorInversion($, \"full\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Outlook Classic applies full color inversion in dark mode. Colors may shift unexpectedly.\",\r\n suggestion:\r\n \"Test with dark mode enabled. The Word rendering engine offers limited control over dark mode color shifts.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"apple-mail-macos\":\r\n case \"apple-mail-ios\":\r\n // Apple Mail respects prefers-color-scheme but does NOT force inversion when absent —\r\n // it leaves email content as-is (no color changes) unless the email opts in via\r\n // <meta name=\"color-scheme\" content=\"light dark\"> or prefers-color-scheme media queries.\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Apple Mail supports @media (prefers-color-scheme: dark). Without it, email content renders unchanged in dark mode.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"yahoo-mail\":\r\n // Yahoo Mail only darkens the UI chrome, not email content\r\n break;\r\n\r\n case \"samsung-mail\":\r\n // Samsung Mail supports prefers-color-scheme; apply partial inversion only if absent\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n applyColorInversion($, \"partial\");\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Samsung Mail supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"thunderbird\":\r\n // Thunderbird 140+ has Dark Message Mode; respects prefers-color-scheme\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n applyColorInversion($, \"full\");\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Thunderbird supports @media (prefers-color-scheme: dark). Consider adding dark mode styles.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors for the best dark mode experience.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"hey-mail\":\r\n // HEY Mail respects prefers-color-scheme; simulate partial inversion\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"HEY Mail supports @media (prefers-color-scheme: dark). Add dark mode styles for the best experience.\",\r\n suggestion:\r\n \"Add a @media (prefers-color-scheme: dark) block with inverted colors.\",\r\n });\r\n }\r\n break;\r\n\r\n case \"superhuman\":\r\n // Superhuman uses Blink and respects prefers-color-scheme\r\n applyColorInversion($, \"partial\");\r\n if (!html.includes(\"prefers-color-scheme\")) {\r\n warnings.push({\r\n severity: \"info\",\r\n client: clientId,\r\n property: \"dark-mode\",\r\n message:\r\n \"Superhuman respects @media (prefers-color-scheme: dark). Many Superhuman users run in dark mode.\",\r\n suggestion:\r\n \"Add @media (prefers-color-scheme: dark) styles — Superhuman's power-user audience often prefers dark mode.\",\r\n });\r\n }\r\n break;\r\n }\r\n\r\n // Add dark mode wrapper styling\r\n $(\"body\").css(\"background-color\", \"#1a1a1a\");\r\n $(\"body\").css(\"color\", \"#e0e0e0\");\r\n\r\n return { html: $.html(), warnings };\r\n}\r\n\r\n/**\r\n * Invert a color value for dark mode.\r\n * Returns null if the color can't be parsed or shouldn't be inverted.\r\n */\r\nfunction invertColor(value: string, mode: \"full\" | \"partial\"): string | null {\r\n const parsed = parseColor(value);\r\n if (!parsed || parsed.a === 0) return null;\r\n\r\n const lum = relativeLuminance(parsed.r, parsed.g, parsed.b);\r\n\r\n if (mode === \"full\") {\r\n // Full inversion: invert both light and dark colors\r\n if (lum > LIGHT_THRESHOLD) {\r\n // Light color → dark\r\n return \"#1a1a1a\";\r\n }\r\n if (lum < DARK_THRESHOLD) {\r\n // Dark color → light\r\n return \"#e0e0e0\";\r\n }\r\n return null; // mid-range colors left alone\r\n } else {\r\n // Partial inversion: only invert very light backgrounds/very dark text\r\n if (lum > 0.85) {\r\n return \"#2d2d2d\";\r\n }\r\n if (lum < 0.05) {\r\n return \"#d4d4d4\";\r\n }\r\n return null;\r\n }\r\n}\r\n\r\n/** Color-bearing CSS properties */\r\nconst COLOR_PROPS = new Set([\r\n \"color\", \"background-color\", \"border-color\",\r\n \"border-top-color\", \"border-right-color\", \"border-bottom-color\", \"border-left-color\",\r\n \"outline-color\",\r\n]);\r\n\r\n/** Background shorthand — extract color portion */\r\nfunction extractBackgroundColor(value: string): string | null {\r\n // Simple heuristic: if background value starts with a color, extract it\r\n const trimmed = value.trim();\r\n if (trimmed.startsWith(\"#\") || trimmed.startsWith(\"rgb\") || /^[a-z]+$/i.test(trimmed.split(/\\s/)[0])) {\r\n const firstToken = trimmed.split(/\\s/)[0];\r\n if (parseColor(firstToken)) return firstToken;\r\n }\r\n return null;\r\n}\r\n\r\nfunction applyColorInversion(\r\n $: cheerio.CheerioAPI,\r\n mode: \"full\" | \"partial\"\r\n): void {\r\n // Process inline styles using parseColor for accurate detection\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n const props = parseInlineStyle(style);\r\n let changed = false;\r\n\r\n props.forEach((value, prop) => {\r\n if (COLOR_PROPS.has(prop)) {\r\n const inverted = invertColor(value, mode);\r\n if (inverted) {\r\n props.set(prop, inverted);\r\n changed = true;\r\n }\r\n }\r\n // Handle background shorthand\r\n if (prop === \"background\") {\r\n const bgColor = extractBackgroundColor(value);\r\n if (bgColor) {\r\n const inverted = invertColor(bgColor, mode);\r\n if (inverted) {\r\n props.set(prop, value.replace(bgColor, inverted));\r\n changed = true;\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (changed) {\r\n $(el).attr(\"style\", serializeStyle(props));\r\n }\r\n });\r\n\r\n // Process <style> blocks\r\n $(\"style\").each((_, el) => {\r\n const cssText = $(el).text();\r\n try {\r\n const ast = csstree.parse(cssText, { parseCustomProperty: true });\r\n let modified = false;\r\n\r\n csstree.walk(ast, {\r\n enter(node: csstree.CssNode) {\r\n if (node.type !== \"Declaration\") return;\r\n const prop = node.property.toLowerCase();\r\n if (!COLOR_PROPS.has(prop) && prop !== \"background\") return;\r\n\r\n const valueStr = csstree.generate(node.value);\r\n if (prop === \"background\") {\r\n const bgColor = extractBackgroundColor(valueStr);\r\n if (bgColor) {\r\n const inverted = invertColor(bgColor, mode);\r\n if (inverted) {\r\n const newValue = valueStr.replace(bgColor, inverted);\r\n node.value = csstree.parse(newValue, { context: \"value\" }) as csstree.Value;\r\n modified = true;\r\n }\r\n }\r\n } else {\r\n const inverted = invertColor(valueStr, mode);\r\n if (inverted) {\r\n node.value = csstree.parse(inverted, { context: \"value\" }) as csstree.Value;\r\n modified = true;\r\n }\r\n }\r\n },\r\n });\r\n\r\n if (modified) {\r\n $(el).text(csstree.generate(ast));\r\n }\r\n } catch {\r\n // If css-tree can't parse it, skip\r\n }\r\n });\r\n\r\n // Also handle bgcolor attributes on table elements\r\n $(\"[bgcolor]\").each((_, el) => {\r\n const bgcolor = $(el).attr(\"bgcolor\") || \"\";\r\n const inverted = invertColor(bgcolor, mode);\r\n if (inverted) {\r\n $(el).attr(\"bgcolor\", inverted);\r\n }\r\n });\r\n}\r\n","import type { CSSWarning, DiffResult } from \"./types\";\r\nimport { EMAIL_CLIENTS } from \"./clients\";\r\n\r\n/**\r\n * Compare two sets of analysis results to show what improved,\r\n * what regressed, and what stayed the same.\r\n */\r\nexport function diffResults(\r\n before: {\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n warnings: CSSWarning[];\r\n },\r\n after: {\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n warnings: CSSWarning[];\r\n }\r\n): DiffResult[] {\r\n const results: DiffResult[] = [];\r\n\r\n for (const client of EMAIL_CLIENTS) {\r\n const scoreBefore = before.scores[client.id]?.score ?? 100;\r\n const scoreAfter = after.scores[client.id]?.score ?? 100;\r\n\r\n const beforeWarnings = before.warnings.filter((w) => w.client === client.id);\r\n const afterWarnings = after.warnings.filter((w) => w.client === client.id);\r\n\r\n // Key warnings by property+severity for comparison\r\n const beforeKeys = new Set(beforeWarnings.map(warningKey));\r\n const afterKeys = new Set(afterWarnings.map(warningKey));\r\n\r\n const fixed = beforeWarnings.filter((w) => !afterKeys.has(warningKey(w)));\r\n const introduced = afterWarnings.filter((w) => !beforeKeys.has(warningKey(w)));\r\n const unchanged = afterWarnings.filter((w) => beforeKeys.has(warningKey(w)));\r\n\r\n results.push({\r\n clientId: client.id,\r\n scoreBefore,\r\n scoreAfter,\r\n scoreDelta: scoreAfter - scoreBefore,\r\n fixed,\r\n introduced,\r\n unchanged,\r\n });\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction warningKey(w: CSSWarning): string {\r\n return `${w.property}:${w.severity}`;\r\n}\r\n","import type { CSSWarning } from \"./types\";\r\nimport { getClient, EMAIL_CLIENTS } from \"./clients\";\r\n\r\nexport type ExportScope = \"all\" | \"current\";\r\n\r\nexport interface ExportPromptOptions {\r\n originalHtml: string;\r\n warnings: CSSWarning[];\r\n scores: Record<\r\n string,\r\n { score: number; errors: number; warnings: number; info: number }\r\n >;\r\n scope: ExportScope;\r\n selectedClientId?: string;\r\n format?: \"html\" | \"jsx\" | \"mjml\" | \"maizzle\";\r\n /** Optional user goal for the fix (e.g. \"keep the gradient header\"). */\r\n intent?: string;\r\n}\r\n\r\nexport function generateFixPrompt(options: ExportPromptOptions): string {\r\n const {\r\n originalHtml,\r\n warnings,\r\n scores,\r\n scope,\r\n selectedClientId,\r\n format = \"html\",\r\n intent,\r\n } = options;\r\n\r\n const filteredWarnings =\r\n scope === \"current\" && selectedClientId\r\n ? warnings.filter((w) => w.client === selectedClientId)\r\n : warnings;\r\n\r\n const filteredScores =\r\n scope === \"current\" && selectedClientId\r\n ? { [selectedClientId]: scores[selectedClientId] }\r\n : scores;\r\n\r\n const clientCount = Object.keys(filteredScores).length;\r\n const errorCount = filteredWarnings.filter(\r\n (w) => w.severity === \"error\"\r\n ).length;\r\n const warnCount = filteredWarnings.filter(\r\n (w) => w.severity === \"warning\"\r\n ).length;\r\n const infoCount = filteredWarnings.filter(\r\n (w) => w.severity === \"info\"\r\n ).length;\r\n\r\n const clientLabel =\r\n scope === \"current\" && selectedClientId\r\n ? getClient(selectedClientId)?.name ?? selectedClientId\r\n : `${clientCount} email clients`;\r\n\r\n const sections: string[] = [];\r\n\r\n // 1. Context\r\n sections.push(\r\n `# Email Compatibility Fix Request\\n\\n` +\r\n `- **Format:** ${format.toUpperCase()}\\n` +\r\n `- **Scope:** ${clientLabel}\\n` +\r\n `- **Issues found:** ${errorCount} error${errorCount !== 1 ? \"s\" : \"\"}, ` +\r\n `${warnCount} warning${warnCount !== 1 ? \"s\" : \"\"}, ` +\r\n `${infoCount} info`\r\n );\r\n\r\n // 2. User intent\r\n const trimmedIntent = intent?.trim();\r\n if (trimmedIntent) {\r\n sections.push(\r\n `## User Intent\\n\\n` +\r\n `The user described what they want this email to achieve. Honor it where ` +\r\n `possible, but never at the cost of breaking email-client compatibility:\\n\\n` +\r\n trimmedIntent\r\n );\r\n }\r\n\r\n // 3. Original email code\r\n sections.push(\r\n `## Original Email Code\\n\\n` + `\\`\\`\\`${format}\\n${originalHtml}\\n\\`\\`\\``\r\n );\r\n\r\n // 4. Compatibility scores table\r\n const scoreEntries = Object.entries(filteredScores).filter(\r\n ([, v]) => v != null\r\n );\r\n if (scoreEntries.length > 0) {\r\n let table = `## Compatibility Scores\\n\\n`;\r\n table += `| Client | Score | Errors | Warnings | Info |\\n`;\r\n table += `|--------|------:|-------:|---------:|-----:|\\n`;\r\n for (const [clientId, data] of scoreEntries) {\r\n const name = getClient(clientId)?.name ?? clientId;\r\n table += `| ${name} | ${data.score} | ${data.errors} | ${data.warnings} | ${data.info} |\\n`;\r\n }\r\n sections.push(table.trimEnd());\r\n }\r\n\r\n // 5. Detected issues grouped by severity\r\n if (filteredWarnings.length > 0) {\r\n let issueSection = `## Detected Issues\\n`;\r\n\r\n const groups: [string, CSSWarning[]][] = [\r\n [\"Errors\", filteredWarnings.filter((w) => w.severity === \"error\")],\r\n [\"Warnings\", filteredWarnings.filter((w) => w.severity === \"warning\")],\r\n [\"Info\", filteredWarnings.filter((w) => w.severity === \"info\")],\r\n ];\r\n\r\n for (const [label, group] of groups) {\r\n if (group.length === 0) continue;\r\n issueSection += `\\n### ${label}\\n`;\r\n\r\n for (const w of group) {\r\n const clientName = getClient(w.client)?.name ?? w.client;\r\n const fixTypeLabel = w.fixType === \"structural\" ? \" [STRUCTURAL]\" : \"\";\r\n issueSection += `\\n- **${w.property}** (${clientName})${fixTypeLabel}: ${w.message}`;\r\n if (w.fixType === \"structural\") {\r\n issueSection += `\\n - **Fix type: structural** — CSS-only changes will NOT work. HTML restructuring required.`;\r\n }\r\n if (w.suggestion) {\r\n issueSection += `\\n - Suggestion: ${w.suggestion}`;\r\n }\r\n if (w.fix) {\r\n const fixLabel = w.fixIsGenericFallback && format !== \"html\"\r\n ? `Fix (generic HTML — adapt to ${format.toUpperCase()} syntax)`\r\n : \"Fix\";\r\n issueSection += `\\n - ${fixLabel}:`;\r\n issueSection += `\\n - Before: \\`${w.fix.before}\\``;\r\n issueSection += `\\n - After: \\`${w.fix.after}\\``;\r\n }\r\n }\r\n }\r\n\r\n sections.push(issueSection);\r\n }\r\n\r\n // 6. Instructions\r\n const formatInstructions: Record<string, string> = {\r\n jsx:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return complete fixed JSX code using @react-email/components. ` +\r\n `Use Row, Column, Container, Font, Img, Head, and Link components from ` +\r\n `@react-email/components wherever the fix suggests them. ` +\r\n `Keep all style values as camelCase JavaScript object properties (e.g. { backgroundColor: \"#fff\" }). ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the JSX structure and style props needed to fix the issues.`,\r\n mjml:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return complete fixed MJML markup. ` +\r\n `Use MJML-native elements (mj-section, mj-column, mj-text, mj-button, mj-font, mj-style, mj-raw) ` +\r\n `as indicated in the fixes. ` +\r\n `Ensure the result is valid MJML that compiles without errors. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the MJML structure and attributes needed to fix the issues.`,\r\n maizzle:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return the complete fixed Maizzle template. ` +\r\n `Use Tailwind CSS utility classes and Maizzle config settings as indicated in the fixes. ` +\r\n `Add MSO conditional comment table wrappers where needed for Outlook compatibility. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the Tailwind classes and HTML structure needed to fix the issues.`,\r\n html:\r\n `Apply all the fixes listed above to the original email code. ` +\r\n `Return the complete fixed HTML code. ` +\r\n `Ensure the result is compatible with ${clientLabel}. ` +\r\n `Do not remove any content — only modify the CSS and HTML attributes needed to fix the issues.`,\r\n };\r\n\r\n sections.push(\r\n `## Instructions\\n\\n` + (formatInstructions[format] ?? formatInstructions.html)\r\n );\r\n\r\n return sections.join(\"\\n\\n\");\r\n}\r\n","import { generateFixPrompt } from \"./export-prompt\";\r\nimport type { ExportPromptOptions } from \"./export-prompt\";\r\nimport type { CSSWarning } from \"./types\";\r\n\r\n/**\r\n * Heuristic token estimate: ~3.5 characters per token for mixed\r\n * HTML/CSS/code content. This is conservative (slightly over-counts)\r\n * to avoid surprise overruns.\r\n *\r\n * For precise counts, use Anthropic's `messages.countTokens()` API\r\n * or pass a custom `tokenCounter` callback to `estimateAiFixTokens()`.\r\n */\r\nconst CHARS_PER_TOKEN = 3.5;\r\n\r\n/**\r\n * Rough output-to-input ratio. The AI returns a fixed version of the\r\n * email, which is typically similar in size to the input HTML plus\r\n * some overhead for VML/table wrappers.\r\n */\r\nconst OUTPUT_RATIO = 1.3;\r\n\r\n/**\r\n * Default token overhead for the AI_FIX_SYSTEM_PROMPT exported from ai-fix.ts.\r\n * The system prompt is ~800 chars ≈ ~230 tokens. We use 250 as a safe default.\r\n * Consumers using a custom system prompt can override via `systemPromptTokens`.\r\n */\r\nconst DEFAULT_SYSTEM_PROMPT_TOKENS = 250;\r\n\r\nexport interface TokenEstimate {\r\n /** Estimated input tokens (prompt + system prompt) */\r\n inputTokens: number;\r\n /** Estimated output tokens (fixed code response) */\r\n estimatedOutputTokens: number;\r\n /** Raw character count of the prompt */\r\n promptCharacters: number;\r\n /** Character count of just the HTML being fixed */\r\n htmlCharacters: number;\r\n /** Total warnings included in the prompt */\r\n warningCount: number;\r\n /** How many warnings are structural (need HTML changes) */\r\n structuralCount: number;\r\n /** Whether warnings were truncated to fit within limits */\r\n truncated: boolean;\r\n /** Number of warnings removed during truncation */\r\n warningsRemoved: number;\r\n}\r\n\r\n/**\r\n * Extended return type from `estimateAiFixTokens()` that includes both the\r\n * token metrics AND the (potentially truncated) warnings list. The `warnings`\r\n * field is used internally by `generateAiFix()` to build the prompt with the\r\n * truncated set, but is NOT exposed in `AiFixResult.tokenEstimate` to keep\r\n * the public API clean.\r\n */\r\nexport interface TokenEstimateWithWarnings extends TokenEstimate {\r\n /** The warnings after smart truncation (may be shorter than the input list) */\r\n warnings: CSSWarning[];\r\n}\r\n\r\nexport interface EstimateOptions extends Omit<ExportPromptOptions, \"warnings\"> {\r\n warnings: CSSWarning[];\r\n /**\r\n * Maximum input tokens to target. If the estimated prompt exceeds\r\n * this, warnings will be truncated (info first, then duplicates).\r\n * Defaults to 16000 (~56KB of prompt text).\r\n */\r\n maxInputTokens?: number;\r\n /**\r\n * Optional precise token counter. If provided, it will be called\r\n * with the final prompt text for an exact count. Consumers can wire\r\n * this to `anthropic.messages.countTokens()`.\r\n */\r\n tokenCounter?: (text: string) => Promise<number> | number;\r\n /**\r\n * Token count for the system prompt. Added to the input token estimate\r\n * since the system prompt counts against the context window. Defaults\r\n * to 250 (matching the built-in AI_FIX_SYSTEM_PROMPT). Set to 0 if\r\n * not using a system prompt, or override for custom system prompts.\r\n */\r\n systemPromptTokens?: number;\r\n}\r\n\r\n/**\r\n * Estimate tokens for an AI fix prompt BEFORE making the API call.\r\n * Use this to show cost estimates, check limits, and decide whether\r\n * to proceed.\r\n *\r\n * @example\r\n * ```ts\r\n * const estimate = await estimateAiFixTokens({\r\n * originalHtml: html,\r\n * warnings,\r\n * scores,\r\n * scope: \"all\",\r\n * format: \"jsx\",\r\n * });\r\n *\r\n * console.log(`~${estimate.inputTokens} input tokens`);\r\n * console.log(`~${estimate.estimatedOutputTokens} output tokens`);\r\n * console.log(`Truncated: ${estimate.truncated}`);\r\n * ```\r\n */\r\nexport async function estimateAiFixTokens(\r\n options: EstimateOptions,\r\n): Promise<TokenEstimateWithWarnings> {\r\n const {\r\n maxInputTokens = 16000,\r\n tokenCounter,\r\n systemPromptTokens = DEFAULT_SYSTEM_PROMPT_TOKENS,\r\n ...rest\r\n } = options;\r\n\r\n // Reserve space for the system prompt when truncating\r\n const effectiveMaxTokens = maxInputTokens - systemPromptTokens;\r\n\r\n // Truncate warnings if needed to stay within token limits\r\n const { warnings: finalWarnings, truncated, removed } = truncateWarnings(\r\n rest.warnings,\r\n rest.originalHtml,\r\n effectiveMaxTokens,\r\n rest.scope,\r\n rest.selectedClientId,\r\n );\r\n\r\n const prompt = generateFixPrompt({ ...rest, warnings: finalWarnings });\r\n const promptChars = prompt.length;\r\n\r\n // Use precise counter if available, otherwise heuristic\r\n let promptTokens: number;\r\n if (tokenCounter) {\r\n const count = tokenCounter(prompt);\r\n promptTokens = count instanceof Promise ? await count : count;\r\n } else {\r\n promptTokens = heuristicTokenCount(prompt);\r\n }\r\n\r\n // Total input = user prompt + system prompt\r\n const inputTokens = promptTokens + systemPromptTokens;\r\n\r\n const estimatedOutputTokens = Math.ceil(\r\n heuristicTokenCount(rest.originalHtml) * OUTPUT_RATIO,\r\n );\r\n\r\n const structuralCount = finalWarnings.filter(\r\n (w) => w.fixType === \"structural\",\r\n ).length;\r\n\r\n return {\r\n inputTokens,\r\n estimatedOutputTokens,\r\n promptCharacters: promptChars,\r\n htmlCharacters: rest.originalHtml.length,\r\n warningCount: finalWarnings.length,\r\n structuralCount,\r\n truncated,\r\n warningsRemoved: removed,\r\n warnings: finalWarnings,\r\n };\r\n}\r\n\r\n/**\r\n * Quick synchronous heuristic token count. No deps, no API calls.\r\n * Accuracy: within ~10-15% of real Claude tokenizer for code/HTML.\r\n */\r\nexport function heuristicTokenCount(text: string): number {\r\n return Math.ceil(text.length / CHARS_PER_TOKEN);\r\n}\r\n\r\n/**\r\n * Intelligently trim warnings to keep the prompt within token limits.\r\n *\r\n * Truncation priority (least important removed first):\r\n * 1. Remove duplicate warnings (same property across different clients)\r\n * 2. Remove `info`-level warnings\r\n * 3. Remove `warning`-level warnings with CSS-only fixes (not structural)\r\n * 4. Trim long fix snippet before/after strings\r\n */\r\nfunction truncateWarnings(\r\n warnings: CSSWarning[],\r\n html: string,\r\n maxTokens: number,\r\n scope: string,\r\n selectedClientId?: string,\r\n): { warnings: CSSWarning[]; truncated: boolean; removed: number } {\r\n const originalCount = warnings.length;\r\n\r\n // Quick check: will the full prompt fit?\r\n const fullPromptEstimate = heuristicTokenCount(html) + heuristicTokenCount(\r\n JSON.stringify(warnings),\r\n ) + 500; // overhead for markdown structure\r\n\r\n if (fullPromptEstimate <= maxTokens) {\r\n return { warnings, truncated: false, removed: 0 };\r\n }\r\n\r\n let result = [...warnings];\r\n\r\n // Step 1: Deduplicate — keep one warning per property per severity,\r\n // preferring the most relevant client\r\n const seen = new Set<string>();\r\n result = result.filter((w) => {\r\n const key = `${w.property}:${w.severity}`;\r\n if (seen.has(key)) return false;\r\n seen.add(key);\r\n return true;\r\n });\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 2: Remove info-level warnings\r\n result = result.filter((w) => w.severity !== \"info\");\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 3: Remove CSS-only warnings (keep structural ones)\r\n result = result.filter((w) => w.fixType === \"structural\" || w.severity === \"error\");\r\n\r\n if (estimateFits(result, html, maxTokens)) {\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n }\r\n\r\n // Step 4: Trim fix snippets to just descriptions\r\n result = result.map((w) => ({\r\n ...w,\r\n fix: w.fix\r\n ? {\r\n ...w.fix,\r\n before: w.fix.before.length > 200\r\n ? w.fix.before.slice(0, 200) + \"\\n/* ... truncated ... */\"\r\n : w.fix.before,\r\n after: w.fix.after.length > 200\r\n ? w.fix.after.slice(0, 200) + \"\\n/* ... truncated ... */\"\r\n : w.fix.after,\r\n }\r\n : undefined,\r\n }));\r\n\r\n return { warnings: result, truncated: true, removed: originalCount - result.length };\r\n}\r\n\r\nfunction estimateFits(\r\n warnings: CSSWarning[],\r\n html: string,\r\n maxTokens: number,\r\n): boolean {\r\n const estimate =\r\n heuristicTokenCount(html) +\r\n heuristicTokenCount(JSON.stringify(warnings)) +\r\n 500;\r\n return estimate <= maxTokens;\r\n}\r\n","import { generateFixPrompt } from \"./export-prompt\";\r\nimport type { ExportPromptOptions } from \"./export-prompt\";\r\nimport type { AiProvider, AiFixResult, CSSWarning } from \"./types\";\r\nimport { estimateAiFixTokens } from \"./token-utils\";\r\n\r\nexport interface GenerateAiFixOptions extends ExportPromptOptions {\r\n /** Callback that sends a prompt to an LLM and returns the response text. */\r\n provider: AiProvider;\r\n /**\r\n * Maximum input tokens for the prompt. If the estimated prompt exceeds\r\n * this, warnings are intelligently truncated (info first, then CSS-only\r\n * duplicates). Defaults to 16000.\r\n */\r\n maxInputTokens?: number;\r\n}\r\n\r\n/**\r\n * Generate an AI-powered fix for email compatibility issues.\r\n *\r\n * This uses the deterministic engine's analysis (warnings, scores, fix snippets)\r\n * to build a structured prompt, then delegates to an LLM for context-aware\r\n * structural fixes that static snippets cannot handle.\r\n *\r\n * The engine stays provider-agnostic — consumers pass their own `AiProvider`\r\n * callback (Anthropic SDK, Vercel AI SDK, OpenRouter, etc.).\r\n *\r\n * @example\r\n * ```ts\r\n * import Anthropic from \"@anthropic-ai/sdk\";\r\n * import { analyzeEmail, generateCompatibilityScore, generateAiFix } from \"@emailens/engine\";\r\n *\r\n * const anthropic = new Anthropic();\r\n * const warnings = analyzeEmail(html, \"jsx\");\r\n * const scores = generateCompatibilityScore(warnings);\r\n *\r\n * // 1. Check cost before calling\r\n * const estimate = await estimateAiFixTokens({\r\n * originalHtml: html, warnings, scores, scope: \"all\", format: \"jsx\",\r\n * });\r\n * console.log(`~${estimate.inputTokens} input tokens`);\r\n *\r\n * // 2. Generate the fix\r\n * const result = await generateAiFix({\r\n * originalHtml: html, warnings, scores, scope: \"all\", format: \"jsx\",\r\n * provider: async (prompt) => {\r\n * const msg = await anthropic.messages.create({\r\n * model: \"claude-sonnet-4-6\",\r\n * max_tokens: 8192,\r\n * system: AI_FIX_SYSTEM_PROMPT,\r\n * messages: [{ role: \"user\", content: prompt }],\r\n * });\r\n * return msg.content[0].type === \"text\" ? msg.content[0].text : \"\";\r\n * },\r\n * });\r\n * ```\r\n */\r\nexport async function generateAiFix(\r\n options: GenerateAiFixOptions,\r\n): Promise<AiFixResult> {\r\n const { provider, maxInputTokens = 16000, ...promptOptions } = options;\r\n\r\n // Estimate tokens and apply smart truncation if needed\r\n const estimate = await estimateAiFixTokens({\r\n ...promptOptions,\r\n maxInputTokens,\r\n });\r\n\r\n // Use the truncated warnings from the estimate (not the original list)\r\n const truncatedWarnings = estimate.warnings;\r\n\r\n // Build the final prompt with the truncated warnings\r\n const prompt = generateFixPrompt({ ...promptOptions, warnings: truncatedWarnings });\r\n\r\n const structuralCount = countStructuralWarnings(\r\n truncatedWarnings,\r\n promptOptions.scope,\r\n promptOptions.selectedClientId,\r\n );\r\n\r\n // Strip the warnings list from the estimate to keep the public API clean\r\n const { warnings: _discarded, ...tokenEstimate } = estimate;\r\n\r\n const response = await provider(prompt);\r\n\r\n // Extract code from the response — the LLM may wrap it in a code fence\r\n const code = extractCode(response);\r\n\r\n return {\r\n code,\r\n prompt,\r\n targetedWarnings: tokenEstimate.warningCount,\r\n structuralCount,\r\n tokenEstimate,\r\n };\r\n}\r\n\r\n/**\r\n * System prompt for the AI fix provider. Consumers should pass this as\r\n * the `system` parameter to their LLM call for best results.\r\n */\r\nexport const AI_FIX_SYSTEM_PROMPT = `You are an expert email developer specializing in cross-client HTML email compatibility. You fix emails to render correctly across all email clients.\r\n\r\nRules:\r\n- Return ONLY the fixed code inside a single code fence. No explanations before or after.\r\n- Preserve all existing content, text, links, and visual design.\r\n- For structural issues (fixType: \"structural\"), you MUST restructure the HTML — CSS-only changes will not work.\r\n- Common structural patterns:\r\n - word-break/overflow-wrap unsupported → wrap text in <table><tr><td> with constrained width\r\n - display:flex/grid → convert to <table> layout (match the original column count and proportions)\r\n - border-radius in Outlook → use VML <v:roundrect> with <!--[if mso]> conditionals\r\n - background-image in Outlook → use VML <v:rect> with <v:fill>\r\n - max-width in Outlook → wrap in <!--[if mso]><table width=\"N\"> conditional\r\n - position:absolute → use <table> cells for layout\r\n - <svg> → replace with <img> pointing to a hosted PNG\r\n- For CSS-only issues (fixType: \"css\"), swap properties or add fallbacks.\r\n- Apply ALL fixes from the issues list — do not skip any.\r\n- Use the framework syntax specified (JSX/MJML/Maizzle/HTML).\r\n- For JSX: use camelCase style props, React Email components, and proper TypeScript types.\r\n- For MJML: use mj-* elements and attributes.\r\n- For Maizzle: use Tailwind CSS classes.`;\r\n\r\nfunction countStructuralWarnings(\r\n warnings: CSSWarning[],\r\n scope: string,\r\n selectedClientId?: string,\r\n): number {\r\n const filtered =\r\n scope === \"current\" && selectedClientId\r\n ? warnings.filter((w) => w.client === selectedClientId)\r\n : warnings;\r\n return filtered.filter((w) => w.fixType === \"structural\").length;\r\n}\r\n\r\n/**\r\n * Extract code from an LLM response that may contain markdown code fences.\r\n * If multiple fences exist, returns the largest one (most likely the full\r\n * fixed email rather than a small snippet).\r\n */\r\nfunction extractCode(response: string): string {\r\n // Find all code fences and pick the largest one\r\n const fencePattern = /```(?:[\\w]*)\\n([\\s\\S]*?)```/g;\r\n let largest: string | null = null;\r\n\r\n let match: RegExpExecArray | null;\r\n while ((match = fencePattern.exec(response)) !== null) {\r\n const content = match[1].trim();\r\n if (largest === null || content.length > largest.length) {\r\n largest = content;\r\n }\r\n }\r\n\r\n if (largest !== null) {\r\n return largest;\r\n }\r\n\r\n // If no code fence, return the whole response trimmed\r\n return response.trim();\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { SpamAnalysisOptions, SpamIssue, SpamReport } from \"./types\";\r\n\r\nconst SPAM_TRIGGER_PHRASES = [\r\n \"act now\", \"limited time\", \"click here\", \"buy now\", \"order now\",\r\n \"don't miss\", \"don't delete\", \"urgent\", \"congratulations\",\r\n \"you've been selected\", \"you've won\", \"winner\", \"free gift\",\r\n \"risk free\", \"no obligation\", \"no cost\", \"no fees\",\r\n \"100% free\", \"100% satisfied\", \"double your money\",\r\n \"earn extra cash\", \"make money\", \"cash bonus\",\r\n \"as seen on\", \"incredible deal\", \"lowest price\",\r\n \"once in a lifetime\", \"special promotion\", \"this isn't spam\",\r\n \"what are you waiting for\", \"apply now\", \"sign up free\",\r\n \"cancel anytime\", \"no strings attached\", \"no questions asked\",\r\n];\r\n\r\n// Fix #6: Pre-compiled word-boundary regexes for spam phrases\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n\r\nconst SPAM_PHRASE_PATTERNS: Map<string, RegExp> = new Map(\r\n SPAM_TRIGGER_PHRASES.map((phrase) => [\r\n phrase,\r\n new RegExp(\"\\\\b\" + escapeRegex(phrase) + \"\\\\b\"),\r\n ]),\r\n);\r\n\r\nconst URL_SHORTENERS = [\r\n \"bit.ly\", \"tinyurl.com\", \"t.co\", \"goo.gl\", \"ow.ly\",\r\n \"is.gd\", \"buff.ly\", \"rebrand.ly\", \"bl.ink\", \"short.io\",\r\n \"cutt.ly\", \"rb.gy\",\r\n];\r\n\r\n// Fix #2: Known ESP tracking domains\r\nconst ESP_TRACKING_DOMAINS = [\r\n \"mailchi.mp\", \"list-manage.com\", \"click.mailchimp.com\",\r\n \"sendgrid.net\", \"click.sendgrid.net\", \"ct.sendgrid.net\",\r\n \"click.klaviyomail.com\", \"trk.klaviyo.com\",\r\n \"click.hubspotemail.net\",\r\n \"links.iterable.com\", \"track.customer.io\",\r\n \"go.pardot.com\", \"mailgun.org\",\r\n \"em.salesforce.com\", \"click.marketingcloud.com\",\r\n \"r.mail.yahoo.com\", \"t.dripemail2.com\",\r\n];\r\n\r\n// Fix #4: Transactional email signal phrases\r\nconst TRANSACTIONAL_SIGNALS = [\r\n \"reset your password\", \"password reset\",\r\n \"verify your email\", \"email verification\",\r\n \"order confirmation\", \"your order\",\r\n \"your receipt\", \"purchase confirmation\",\r\n \"verification code\", \"confirm your account\",\r\n \"your invoice\", \"shipping confirmation\",\r\n \"account activation\", \"security alert\",\r\n];\r\n\r\nconst TRANSACTIONAL_SIGNAL_PATTERN = new RegExp(\r\n TRANSACTIONAL_SIGNALS.map(escapeRegex).join(\"|\"),\r\n \"i\",\r\n);\r\n\r\n// OTP-like pattern: standalone 4-8 digit codes\r\nconst OTP_PATTERN = /\\b\\d{4,8}\\b/;\r\n\r\nconst WEIGHTS: Record<string, number> = {\r\n \"caps-ratio\": 15,\r\n \"excessive-punctuation\": 10,\r\n \"spam-phrases\": 5,\r\n \"missing-unsubscribe\": 15,\r\n \"hidden-text\": 20,\r\n \"url-shortener\": 10,\r\n \"image-only\": 20,\r\n \"high-image-ratio\": 10,\r\n \"deceptive-link\": 15,\r\n \"all-caps-subject\": 10,\r\n \"missing-physical-address\": 8,\r\n \"missing-one-click-unsubscribe\": 5,\r\n};\r\n\r\nfunction extractVisibleText($: cheerio.CheerioAPI): string {\r\n const clone = $.root().clone();\r\n clone.find(\"script, style, head\").remove();\r\n return clone.text().replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction checkCapsRatio(text: string): SpamIssue | null {\r\n const words = text.split(/\\s+/).filter((w) => w.length >= 3);\r\n if (words.length < 5) return null;\r\n\r\n const capsWords = words.filter((w) => w === w.toUpperCase() && /[A-Z]/.test(w));\r\n const ratio = capsWords.length / words.length;\r\n\r\n if (ratio > 0.2) {\r\n return {\r\n rule: \"caps-ratio\",\r\n severity: \"warning\",\r\n message: `${Math.round(ratio * 100)}% of words are ALL CAPS — spam filters flag excessive capitalization.`,\r\n detail: `Found ${capsWords.length} of ${words.length} words in all caps.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #5: Scale punctuation threshold by text length, exclude $digit patterns\r\nfunction checkExcessivePunctuation(text: string): SpamIssue | null {\r\n const exclamations = (text.match(/!/g) || []).length;\r\n // Only count $ NOT followed by a digit (skip price patterns like $29)\r\n const dollars = (text.match(/\\$(?!\\d)/g) || []).length;\r\n const total = exclamations + dollars;\r\n\r\n const threshold = Math.max(5, Math.floor(text.length / 200));\r\n\r\n if (total > threshold) {\r\n return {\r\n rule: \"excessive-punctuation\",\r\n severity: \"warning\",\r\n message: `Excessive special characters detected (${exclamations} \"!\", ${dollars} \"$\") — common spam trigger.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #6: Word-boundary matching for spam phrases\r\nfunction checkSpamPhrases(text: string): SpamIssue[] {\r\n const lower = text.toLowerCase();\r\n const found: SpamIssue[] = [];\r\n\r\n for (const [phrase, pattern] of SPAM_PHRASE_PATTERNS) {\r\n if (pattern.test(lower)) {\r\n found.push({\r\n rule: \"spam-phrases\",\r\n severity: \"info\",\r\n message: `Contains spam trigger phrase: \"${phrase}\"`,\r\n });\r\n }\r\n }\r\n return found;\r\n}\r\n\r\n// Fix #4: Transactional exemption + options API for unsubscribe\r\nfunction checkUnsubscribe(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Explicit transactional type → skip entirely\r\n if (options?.emailType === \"transactional\") return null;\r\n\r\n // List-Unsubscribe header provided → satisfied\r\n if (options?.listUnsubscribeHeader?.trim()) return null;\r\n\r\n let hasUnsubscribe = false;\r\n\r\n $(\"a\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const linkText = $(el).text().toLowerCase();\r\n if (\r\n linkText.includes(\"unsubscribe\") ||\r\n href.toLowerCase().includes(\"unsubscribe\") ||\r\n linkText.includes(\"opt out\") ||\r\n linkText.includes(\"opt-out\") ||\r\n href.toLowerCase().includes(\"opt-out\") ||\r\n href.toLowerCase().includes(\"optout\")\r\n ) {\r\n hasUnsubscribe = true;\r\n }\r\n });\r\n\r\n if (!hasUnsubscribe) {\r\n // Auto-detect transactional signals\r\n const lower = text.toLowerCase();\r\n const signalMatches = TRANSACTIONAL_SIGNALS.filter((s) =>\r\n lower.includes(s.toLowerCase()),\r\n );\r\n const hasOtp = OTP_PATTERN.test(text);\r\n const signalCount = signalMatches.length + (hasOtp ? 1 : 0);\r\n\r\n if (signalCount >= 2) {\r\n // Looks transactional — downgrade to info instead of error\r\n return {\r\n rule: \"missing-unsubscribe\",\r\n severity: \"info\",\r\n message:\r\n \"No unsubscribe link found, but email appears transactional — may not be required.\",\r\n detail: `Detected transactional signals: ${signalMatches.join(\", \")}${hasOtp ? \", OTP code\" : \"\"}`,\r\n };\r\n }\r\n\r\n return {\r\n rule: \"missing-unsubscribe\",\r\n severity: \"error\",\r\n message:\r\n \"No unsubscribe link found — required by CAN-SPAM and GDPR. Most spam filters penalize this.\",\r\n detail: 'Add an <a> link with \"unsubscribe\" text or href.',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #1: Preheader exemption for hidden text\r\nconst PREHEADER_ACCESSORY_PATTERNS = [\r\n /max-height\\s*:\\s*0/,\r\n /overflow\\s*:\\s*hidden/,\r\n /mso-hide\\s*:\\s*all/,\r\n /opacity\\s*:\\s*0/,\r\n /color\\s*:\\s*transparent/,\r\n /line-height\\s*:\\s*0/,\r\n];\r\n\r\n/**\r\n * Zero-width and other invisible characters. React Email's <Preview> (and most\r\n * hand-rolled preheaders) pad the preheader with hundreds of these so that body\r\n * copy does not leak into the inbox snippet.\r\n */\r\nconst INVISIBLE_CHARS = /[-]/g;\r\n\r\nfunction isLikelyPreheader(\r\n style: string,\r\n text: string,\r\n): boolean {\r\n // Measure VISIBLE length. The padding above is not text a human or a spam\r\n // filter ever sees, but counting it blew past this ceiling — which meant the\r\n // standard preheader of every React Email was reported as \"major spam filter\r\n // red flag\". The ceiling itself still matters: it stops someone hiding a wall\r\n // of keywords behind preheader-shaped CSS, so strip the padding, don't raise\r\n // the limit.\r\n if (text.replace(INVISIBLE_CHARS, \"\").trim().length > 200) return false;\r\n\r\n // Exempt only when preheader-specific accessory patterns are present\r\n return PREHEADER_ACCESSORY_PATTERNS.some((p) => p.test(style));\r\n}\r\n\r\nfunction checkHiddenText($: cheerio.CheerioAPI): SpamIssue | null {\r\n let found = false;\r\n let detail = \"\";\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = ($(el).attr(\"style\") || \"\").toLowerCase();\r\n const text = $(el).text().trim();\r\n if (!text) return;\r\n\r\n // visibility:hidden is always flagged — no legitimate preheader use\r\n if (/visibility\\s*:\\s*hidden/.test(style)) {\r\n found = true;\r\n detail = \"visibility:hidden on element with text content\";\r\n return false;\r\n }\r\n\r\n if (/font-size\\s*:\\s*0(?:px|em|rem|pt)?(?:\\s|;|$)/.test(style)) {\r\n if (!isLikelyPreheader(style, text)) {\r\n found = true;\r\n detail = \"font-size:0 on element with text content\";\r\n return false;\r\n }\r\n }\r\n\r\n if (/display\\s*:\\s*none/.test(style)) {\r\n if (!isLikelyPreheader(style, text)) {\r\n found = true;\r\n detail = \"display:none on element with text content\";\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n if (found) {\r\n return {\r\n rule: \"hidden-text\",\r\n severity: \"error\",\r\n message: \"Hidden text detected — major spam filter red flag.\",\r\n detail,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #3: Hostname matching instead of substring for URL shorteners\r\nfunction checkUrlShorteners($: cheerio.CheerioAPI): SpamIssue[] {\r\n const issues: SpamIssue[] = [];\r\n const seen = new Set<string>();\r\n\r\n $(\"a[href]\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n let hostname: string;\r\n try {\r\n hostname = new URL(href).hostname.toLowerCase();\r\n } catch {\r\n return; // malformed URL, skip\r\n }\r\n\r\n for (const shortener of URL_SHORTENERS) {\r\n if (\r\n (hostname === shortener || hostname.endsWith(\".\" + shortener)) &&\r\n !seen.has(shortener)\r\n ) {\r\n seen.add(shortener);\r\n issues.push({\r\n rule: \"url-shortener\",\r\n severity: \"warning\",\r\n message: `URL shortener detected (${shortener}) — spam filters distrust shortened links.`,\r\n detail: href,\r\n });\r\n }\r\n }\r\n });\r\n return issues;\r\n}\r\n\r\n// Fix #7: Accept pre-extracted text to avoid duplicate extractVisibleText call\r\nfunction checkImageToTextRatio(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n): SpamIssue | null {\r\n const images = $(\"img\").length;\r\n if (images === 0) return null;\r\n\r\n if (text.length < 50 && images > 0) {\r\n return {\r\n rule: \"image-only\",\r\n severity: \"error\",\r\n message: `Image-heavy email with almost no text (${text.length} chars, ${images} images) — likely to be flagged as spam or clipped.`,\r\n };\r\n }\r\n\r\n const ratio = images / (text.length / 100);\r\n if (ratio > 0.5 && images > 3) {\r\n return {\r\n rule: \"high-image-ratio\",\r\n severity: \"warning\",\r\n message: `High image-to-text ratio (${images} images for ${text.length} chars of text) — consider adding more text content.`,\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n// Fix #2: ESP tracking domain allowlist + encoded destination heuristic\r\nfunction isEspTrackingDomain(hostname: string): boolean {\r\n return ESP_TRACKING_DOMAINS.some(\r\n (esp) => hostname === esp || hostname.endsWith(\".\" + esp),\r\n );\r\n}\r\n\r\nfunction hasEncodedDestination(href: string, textDomain: string): boolean {\r\n // Check if the href path/query contains the text domain URL-encoded\r\n const encoded = encodeURIComponent(textDomain);\r\n return href.includes(encoded) || href.includes(textDomain);\r\n}\r\n\r\nfunction checkDeceptiveLinks($: cheerio.CheerioAPI): SpamIssue[] {\r\n const issues: SpamIssue[] = [];\r\n\r\n $(\"a[href]\").each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const text = $(el).text().trim();\r\n\r\n if (/^https?:\\/\\/\\S+/i.test(text) || /^www\\.\\S+/i.test(text)) {\r\n try {\r\n const textDomain = new URL(\r\n text.startsWith(\"www.\") ? `https://${text}` : text,\r\n ).hostname.replace(/^www\\./, \"\");\r\n const hrefDomain = new URL(href).hostname.replace(/^www\\./, \"\");\r\n\r\n if (textDomain !== hrefDomain) {\r\n // Skip known ESP tracking domains\r\n if (isEspTrackingDomain(hrefDomain)) return;\r\n\r\n // Skip if href contains encoded destination (redirect wrapper)\r\n if (hasEncodedDestination(href, textDomain)) return;\r\n\r\n issues.push({\r\n rule: \"deceptive-link\",\r\n severity: \"error\",\r\n message: `Link text shows \"${textDomain}\" but links to \"${hrefDomain}\" — phishing red flag.`,\r\n detail: `Text: ${text}\\nHref: ${href}`,\r\n });\r\n }\r\n } catch {\r\n // Malformed URL, skip\r\n }\r\n }\r\n });\r\n return issues;\r\n}\r\n\r\n// CAN-SPAM physical address detection.\r\n//\r\n// Anglo addresses put the street TYPE last (\"123 Main St\"); Romance and\r\n// Germanic ones put it right after the number (\"12 chemin du Beauregard\",\r\n// \"Bahnhofstrasse 5\"). Both orders are matched — the US-only pattern flagged\r\n// every European address as missing, which is wrong on a checker used\r\n// worldwide.\r\n// Anglo, type last (\"123 Main St\", \"221B Baker Street\"). The [A-Za-z]? allows\r\n// a UK-style house-number letter suffix.\r\nconst STREET_ADDRESS_PATTERN = /\\b\\d{1,5}[A-Za-z]?\\s+[A-Za-z]+\\s+(St(reet)?|Ave(nue)?|Blvd|Boulevard|Dr(ive)?|Rd|Road|Ln|Lane|Way|Ct|Court|Pl(ace)?|Pkwy|Parkway|Cir(cle)?|Terr(ace)?|Loop)\\b/i;\r\n// number → type (French/Italian): \"12 chemin du…\", \"5 rue de…\"\r\nconst STREET_TYPE_FIRST_PATTERN = /\\b\\d{1,5}\\s+(rue|chemin|avenue|av|boulevard|bd|impasse|all[ée]e|place|route|quai|cours|via|viale|piazza|strada)\\b/i;\r\n// type → … → number (Spanish/Portuguese/Catalan): \"Calle Mayor 10\"\r\nconst STREET_TYPE_LEADING_PATTERN = /\\b(calle|avenida|avda|plaza|paseo|carrer|rua|travessa)\\s+[A-Za-zÀ-ÿ]+.{0,30}?\\d{1,4}\\b/i;\r\n// name+type suffix, then number (German/Dutch/Nordic): \"Bahnhofstrasse 5\"\r\nconst STREET_TYPE_SUFFIX_PATTERN = /\\b[A-Za-zÀ-ÿ]+(stra(ss|ß)e|straat|weg|gasse|allee|platz|vej|gata|gate)\\s+\\d{1,4}\\b/i;\r\nconst PO_BOX_PATTERN = /\\bP\\.?\\s*O\\.?\\s*Box\\s+\\d+/i;\r\n// 5-digit (US/FR/DE/ES/IT), UK (\"SW1A 1AA\"), or NL/postal (\"1011 AB\").\r\nconst ZIP_CODE_PATTERN = /\\b(\\d{5}(-\\d{4})?|[A-Z]{1,2}\\d[A-Z\\d]?\\s*\\d[A-Z]{2}|\\d{4}\\s*[A-Z]{2})\\b/i;\r\nconst ADDRESS_CLASS_PATTERN = /address|mailing|postal|footer-address|physical-address/i;\r\n\r\nfunction checkPhysicalAddress(\r\n $: cheerio.CheerioAPI,\r\n text: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Transactional emails are exempt\r\n if (options?.emailType === \"transactional\") return null;\r\n\r\n // Check visible text for street address patterns. A postal code alone is too\r\n // weak (any 5-digit number), so require a street signal too — in any of the\r\n // three word orders.\r\n const hasStreet =\r\n STREET_ADDRESS_PATTERN.test(text) ||\r\n STREET_TYPE_FIRST_PATTERN.test(text) ||\r\n STREET_TYPE_LEADING_PATTERN.test(text) ||\r\n STREET_TYPE_SUFFIX_PATTERN.test(text);\r\n if (hasStreet && ZIP_CODE_PATTERN.test(text)) return null;\r\n if (PO_BOX_PATTERN.test(text) && ZIP_CODE_PATTERN.test(text)) return null;\r\n\r\n // Check for elements with address-related class names\r\n let foundByClass = false;\r\n $(\"[class]\").each((_, el) => {\r\n const cls = $(el).attr(\"class\") || \"\";\r\n if (ADDRESS_CLASS_PATTERN.test(cls)) {\r\n const elText = $(el).text().trim();\r\n if (elText.length > 5) {\r\n foundByClass = true;\r\n return false; // break\r\n }\r\n }\r\n });\r\n if (foundByClass) return null;\r\n\r\n // Check <address> element\r\n if ($(\"address\").length > 0 && $(\"address\").text().trim().length > 5) return null;\r\n\r\n return {\r\n rule: \"missing-physical-address\",\r\n severity: \"warning\",\r\n message: \"No physical mailing address detected — required by CAN-SPAM for marketing emails.\",\r\n detail: \"Include a street address or P.O. Box in the email footer.\",\r\n };\r\n}\r\n\r\nfunction checkOneClickUnsubscribe(\r\n options?: SpamAnalysisOptions,\r\n): SpamIssue | null {\r\n // Only relevant when List-Unsubscribe header is present\r\n if (!options?.listUnsubscribeHeader?.trim()) return null;\r\n\r\n // RFC 8058 requires List-Unsubscribe-Post header alongside List-Unsubscribe\r\n if (!options?.listUnsubscribePostHeader?.trim()) {\r\n return {\r\n rule: \"missing-one-click-unsubscribe\",\r\n severity: \"warning\",\r\n message: \"List-Unsubscribe header present but missing List-Unsubscribe-Post header (RFC 8058). Gmail and Yahoo require one-click unsubscribe.\",\r\n detail: 'Add \"List-Unsubscribe-Post: List-Unsubscribe=One-Click\" header.',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkAllCapsTitle($: cheerio.CheerioAPI): SpamIssue | null {\r\n const title = $(\"title\").text().trim();\r\n if (title.length > 5 && title === title.toUpperCase() && /[A-Z]/.test(title)) {\r\n return {\r\n rule: \"all-caps-subject\",\r\n severity: \"warning\",\r\n message: \"Email title/subject is ALL CAPS — common spam indicator.\",\r\n };\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Analyze a pre-parsed email DOM for spam indicators.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeSpamFromDom(\r\n $: cheerio.CheerioAPI,\r\n options?: SpamAnalysisOptions,\r\n): SpamReport {\r\n const text = extractVisibleText($);\r\n const issues: SpamIssue[] = [];\r\n\r\n const capsIssue = checkCapsRatio(text);\r\n if (capsIssue) issues.push(capsIssue);\r\n\r\n const punctIssue = checkExcessivePunctuation(text);\r\n if (punctIssue) issues.push(punctIssue);\r\n\r\n issues.push(...checkSpamPhrases(text));\r\n\r\n const unsubIssue = checkUnsubscribe($, text, options);\r\n if (unsubIssue) issues.push(unsubIssue);\r\n\r\n const hiddenIssue = checkHiddenText($);\r\n if (hiddenIssue) issues.push(hiddenIssue);\r\n\r\n issues.push(...checkUrlShorteners($));\r\n\r\n const imageRatioIssue = checkImageToTextRatio($, text);\r\n if (imageRatioIssue) issues.push(imageRatioIssue);\r\n\r\n issues.push(...checkDeceptiveLinks($));\r\n\r\n const capsTitle = checkAllCapsTitle($);\r\n if (capsTitle) issues.push(capsTitle);\r\n\r\n const addressIssue = checkPhysicalAddress($, text, options);\r\n if (addressIssue) issues.push(addressIssue);\r\n\r\n const oneClickIssue = checkOneClickUnsubscribe(options);\r\n if (oneClickIssue) issues.push(oneClickIssue);\r\n\r\n // Calculate score\r\n let penalty = 0;\r\n const seenRules = new Map<string, number>();\r\n\r\n for (const issue of issues) {\r\n const count = (seenRules.get(issue.rule) || 0) + 1;\r\n seenRules.set(issue.rule, count);\r\n const weight = WEIGHTS[issue.rule] || 5;\r\n\r\n if (issue.rule === \"spam-phrases\") {\r\n if (count <= 5) penalty += weight;\r\n } else if (issue.rule === \"url-shortener\" || issue.rule === \"deceptive-link\") {\r\n if (count <= 2) penalty += weight;\r\n } else {\r\n if (issue.severity !== \"info\") {\r\n penalty += weight;\r\n }\r\n }\r\n }\r\n\r\n const score = Math.max(0, Math.min(100, 100 - penalty));\r\n const level: SpamReport[\"level\"] =\r\n score >= 70 ? \"low\" : score >= 40 ? \"medium\" : \"high\";\r\n\r\n return { score, level, issues };\r\n}\r\n\r\n/**\r\n * Analyze an HTML email for content hygiene issues.\r\n *\r\n * Returns a 0-100 score (100 = clean, 0 = many issues) and an array\r\n * of issues found. Uses heuristic rules modeled after common spam\r\n * filter triggers (CAN-SPAM, GDPR, SpamAssassin patterns).\r\n *\r\n * **Important:** This is heuristic content analysis, NOT a real spam\r\n * filter. It checks for common anti-patterns that trigger spam filters\r\n * but cannot predict actual inbox placement. For real spam testing,\r\n * use SpamAssassin integration or a dedicated service like GlockApps.\r\n */\r\nexport function analyzeSpam(\r\n html: string,\r\n options?: SpamAnalysisOptions,\r\n): SpamReport {\r\n if (!html || !html.trim()) {\r\n return { score: 100, level: \"low\", issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeSpamFromDom($, options);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport type { LinkIssue, LinkReport } from \"./types\";\r\nimport { GENERIC_LINK_TEXT, MAX_HTML_SIZE } from \"./constants\";\r\n\r\nfunction classifyHref(href: string): string {\r\n if (!href || !href.trim()) return \"empty\";\r\n const h = href.trim().toLowerCase();\r\n if (h.startsWith(\"https://\")) return \"https\";\r\n if (h.startsWith(\"http://\")) return \"http\";\r\n if (h.startsWith(\"mailto:\")) return \"mailto\";\r\n if (h.startsWith(\"tel:\")) return \"tel\";\r\n if (h.startsWith(\"#\")) return \"anchor\";\r\n if (h.startsWith(\"javascript:\")) return \"javascript\";\r\n if (h.startsWith(\"//\")) return \"protocol-relative\";\r\n return \"other\";\r\n}\r\n\r\nfunction isPlaceholderHref(href: string): boolean {\r\n const h = href.trim().toLowerCase();\r\n return h === \"#\" || h === \"\" || h === \"javascript:void(0)\" || h === \"javascript:;\";\r\n}\r\n\r\n/**\r\n * Validate links from a pre-parsed email DOM.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function validateLinksFromDom($: cheerio.CheerioAPI): LinkReport {\r\n const issues: LinkIssue[] = [];\r\n const breakdown = { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 };\r\n\r\n const links = $(\"a\");\r\n const totalLinks = links.length;\r\n\r\n if (totalLinks === 0) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"no-links\",\r\n message: \"Email contains no links\",\r\n });\r\n return { totalLinks: 0, issues, breakdown };\r\n }\r\n\r\n const hrefCounts = new Map<string, number>();\r\n\r\n links.each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const text = $(el).text().trim();\r\n const category = classifyHref(href);\r\n\r\n // Count breakdown\r\n switch (category) {\r\n case \"https\": breakdown.https++; break;\r\n case \"http\": breakdown.http++; break;\r\n case \"mailto\": breakdown.mailto++; break;\r\n case \"tel\": breakdown.tel++; break;\r\n case \"anchor\": breakdown.anchor++; break;\r\n case \"javascript\": breakdown.javascript++; break;\r\n case \"protocol-relative\": breakdown.protocolRelative++; break;\r\n default: breakdown.other++; break;\r\n }\r\n\r\n // Track href occurrences for duplicate detection\r\n if (href && href.trim()) {\r\n hrefCounts.set(href, (hrefCounts.get(href) || 0) + 1);\r\n }\r\n\r\n // Empty or missing href\r\n if (!href || !href.trim()) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-href\",\r\n message: \"Link has no href attribute\",\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // javascript: protocol (not placeholder)\r\n if (category === \"javascript\" && !isPlaceholderHref(href)) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"javascript-href\",\r\n message: \"Link uses javascript: protocol\",\r\n href: href.slice(0, 100),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // Placeholder href\r\n if (isPlaceholderHref(href)) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"placeholder-href\",\r\n message: \"Link has a placeholder href (# or javascript:void)\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n return;\r\n }\r\n\r\n // HTTP instead of HTTPS\r\n if (category === \"http\") {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"insecure-link\",\r\n message: \"Link uses HTTP instead of HTTPS\",\r\n href: href.slice(0, 120),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Protocol-relative URL\r\n if (category === \"protocol-relative\") {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"protocol-relative\",\r\n message: \"Protocol-relative URL may break in email clients — use https:// explicitly\",\r\n href: href.slice(0, 120),\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Generic link text\r\n if (text && GENERIC_LINK_TEXT.has(text.toLowerCase())) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"generic-link-text\",\r\n message: `Link text \"${text}\" is vague — use descriptive text for accessibility and engagement`,\r\n href: href.slice(0, 120),\r\n text,\r\n });\r\n }\r\n\r\n // Link with no text and no aria-label\r\n if (!text && !$(el).attr(\"aria-label\") && !$(el).find(\"img[alt]\").length) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-link-text\",\r\n message: \"Link has no visible text or aria-label\",\r\n href: href.slice(0, 120),\r\n });\r\n }\r\n\r\n // mailto without address\r\n if (category === \"mailto\" && href.trim().toLowerCase() === \"mailto:\") {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-mailto\",\r\n message: \"mailto: link has no email address\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // tel: without number\r\n if (category === \"tel\" && href.trim().toLowerCase() === \"tel:\") {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"empty-tel\",\r\n message: \"tel: link has no phone number\",\r\n href,\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n\r\n // Very long URL\r\n if (href.length > 2000) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"long-url\",\r\n message: \"URL exceeds 2000 characters — may be truncated by some email clients\",\r\n href: href.slice(0, 120) + \"...\",\r\n text: text.slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n });\r\n\r\n // Broken anchor detection — #id links where no matching id exists\r\n links.each((_, el) => {\r\n const href = $(el).attr(\"href\") || \"\";\r\n const trimmed = href.trim();\r\n if (trimmed.startsWith(\"#\") && trimmed.length > 1) {\r\n const targetId = trimmed.slice(1);\r\n const target = $(`[id=\"${targetId}\"]`);\r\n if (target.length === 0) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"broken-anchor\",\r\n message: `Anchor link \"${trimmed}\" points to an element that does not exist`,\r\n href: trimmed,\r\n text: $(el).text().trim().slice(0, 80) || \"(no text)\",\r\n });\r\n }\r\n }\r\n });\r\n\r\n // Duplicate link detection\r\n for (const [href, count] of hrefCounts) {\r\n if (count > 5) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"duplicate-links\",\r\n message: `URL appears ${count} times — consider consolidating`,\r\n href: href.slice(0, 120),\r\n });\r\n }\r\n }\r\n\r\n return { totalLinks, issues, breakdown };\r\n}\r\n\r\n/**\r\n * Extract and validate all links from an HTML email.\r\n *\r\n * Performs static analysis only (no network requests). Checks for\r\n * empty/placeholder hrefs, javascript: protocol, insecure HTTP,\r\n * generic link text, accessibility issues, and more.\r\n */\r\nexport function validateLinks(html: string): LinkReport {\r\n if (!html || !html.trim()) {\r\n return {\r\n totalLinks: 0,\r\n issues: [],\r\n breakdown: { https: 0, http: 0, mailto: 0, tel: 0, anchor: 0, javascript: 0, protocolRelative: 0, other: 0 },\r\n };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return validateLinksFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport type { AccessibilityIssue, AccessibilityReport } from \"./types\";\r\nimport { GENERIC_LINK_TEXT, MAX_HTML_SIZE } from \"./constants\";\r\nimport { getStyleValue } from \"./style-utils\";\r\nimport { parseColor, relativeLuminance, contrastRatio, wcagGrade, alphaBlend } from \"./color-utils\";\r\n\r\n// Per-rule penalty caps — only the score penalty is capped, all issues are still reported\r\nconst RULE_PENALTY_CAPS: Record<string, number> = {\r\n \"img-missing-alt\": 3,\r\n \"link-generic-text\": 3,\r\n \"link-no-accessible-name\": 3,\r\n \"table-missing-role\": 2,\r\n \"low-contrast\": 3,\r\n};\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nfunction describeElement($: cheerio.CheerioAPI, el: any): string {\r\n const tag = (el.tagName as string)?.toLowerCase() || \"unknown\";\r\n const src = $(el).attr(\"src\");\r\n const href = $(el).attr(\"href\");\r\n if (src) return `<${tag} src=\"${src.slice(0, 60)}${src.length > 60 ? \"...\" : \"\"}\">`;\r\n if (href) return `<${tag} href=\"${href.slice(0, 60)}${href.length > 60 ? \"...\" : \"\"}\">`;\r\n const text = $(el).text().trim().slice(0, 40);\r\n if (text) return `<${tag}>${text}${$(el).text().trim().length > 40 ? \"...\" : \"\"}</${tag}>`;\r\n return `<${tag}>`;\r\n}\r\n\r\nfunction checkLangAttribute($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n const lang = $(\"html\").attr(\"lang\");\r\n if (!lang || !lang.trim()) {\r\n return {\r\n severity: \"error\",\r\n rule: \"missing-lang\",\r\n message: \"Missing lang attribute on <html> element\",\r\n details: 'Screen readers use the lang attribute to determine pronunciation. Add lang=\"en\" (or appropriate language code).',\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkTitle($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n const title = $(\"title\").text().trim();\r\n if (!title) {\r\n return {\r\n severity: \"warning\",\r\n rule: \"missing-title\",\r\n message: \"Missing or empty <title> element\",\r\n details: \"The <title> helps screen readers identify the email content.\",\r\n };\r\n }\r\n return null;\r\n}\r\n\r\nfunction checkImageAlt($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"img\").each((_, el) => {\r\n const alt = $(el).attr(\"alt\");\r\n const src = $(el).attr(\"src\") || \"\";\r\n const role = $(el).attr(\"role\");\r\n\r\n if (role === \"presentation\" || role === \"none\") return;\r\n\r\n if (alt === undefined) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"img-missing-alt\",\r\n message: \"Image missing alt attribute\",\r\n element: describeElement($, el),\r\n details: 'Every image must have an alt attribute. Use alt=\"\" for decorative images.',\r\n });\r\n } else if (alt.trim() === \"\") {\r\n const isLikelyContent =\r\n !src.includes(\"spacer\") &&\r\n !src.includes(\"pixel\") &&\r\n !src.includes(\"tracking\") &&\r\n !src.includes(\"1x1\") &&\r\n !src.includes(\"transparent\");\r\n\r\n if (isLikelyContent && ($(el).attr(\"width\") || \"0\") !== \"1\") {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"img-empty-alt\",\r\n message: \"Image has empty alt text — verify it is decorative\",\r\n element: describeElement($, el),\r\n details: \"Empty alt is correct for decorative images, but content images need descriptive alt text.\",\r\n });\r\n }\r\n } else if (/\\.(png|jpg|jpeg|gif|svg|webp|bmp)$/i.test(alt)) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"img-filename-alt\",\r\n message: \"Image alt text is a filename, not a description\",\r\n element: describeElement($, el),\r\n details: `Alt \"${alt}\" should describe the image content, not the file name.`,\r\n });\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkLinkAccessibility($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"a\").each((_, el) => {\r\n const text = $(el).text().trim().toLowerCase();\r\n const ariaLabel = $(el).attr(\"aria-label\");\r\n const title = $(el).attr(\"title\");\r\n const imgAlt = $(el).find(\"img\").attr(\"alt\");\r\n\r\n if (!text && !ariaLabel && !title && !imgAlt) {\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"link-no-accessible-name\",\r\n message: \"Link has no accessible name\",\r\n element: describeElement($, el),\r\n details: \"Links need visible text, aria-label, or an image with alt text.\",\r\n });\r\n return;\r\n }\r\n\r\n if (text && GENERIC_LINK_TEXT.has(text) && !ariaLabel) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"link-generic-text\",\r\n message: `Link text \"${$(el).text().trim()}\" is not descriptive`,\r\n element: describeElement($, el),\r\n details: \"Screen readers often list links out of context. Use text that describes the destination.\",\r\n });\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkTableAccessibility($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n $(\"table\").each((_, el) => {\r\n // Skip inner tables that are inside a presentation/none ancestor\r\n if ($(el).parents('table[role=\"presentation\"], table[role=\"none\"]').length > 0) return;\r\n\r\n const role = $(el).attr(\"role\");\r\n const hasHeaders = $(el).find(\"th\").length > 0;\r\n const looksLikeLayout = !hasHeaders;\r\n\r\n if (looksLikeLayout && role !== \"presentation\" && role !== \"none\") {\r\n const nestedTables = $(el).find(\"table\").length;\r\n if (nestedTables > 0 || $(el).find(\"td\").length > 2) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"table-missing-role\",\r\n message: 'Layout table missing role=\"presentation\"',\r\n element: `<table> with ${$(el).find(\"td\").length} cells`,\r\n details: 'Add role=\"presentation\" to tables used for layout so screen readers don\\'t announce them as data tables.',\r\n });\r\n }\r\n }\r\n });\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkTextSizeAndContrast($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n let smallTextCount = 0;\r\n\r\n $(\"[style]\").each((_, el) => {\r\n const style = $(el).attr(\"style\") || \"\";\r\n\r\n // --- Small text check (threshold lowered to 9px) ---\r\n const fontSizeMatch = style.match(/font-size\\s*:\\s*(\\d+(?:\\.\\d+)?)(px|pt)/i);\r\n if (fontSizeMatch) {\r\n const size = parseFloat(fontSizeMatch[1]);\r\n const unit = fontSizeMatch[2].toLowerCase();\r\n const pxSize = unit === \"pt\" ? size * 1.333 : size;\r\n\r\n if (pxSize < 9 && pxSize > 0) {\r\n smallTextCount++;\r\n if (smallTextCount <= 3) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"small-text\",\r\n message: `Very small text (${fontSizeMatch[0].trim()})`,\r\n element: describeElement($, el),\r\n details: \"Text smaller than 9px is difficult to read, especially on mobile devices.\",\r\n });\r\n }\r\n }\r\n }\r\n\r\n // --- Color contrast check ---\r\n const colorValue = getStyleValue(style, \"color\");\r\n if (colorValue) {\r\n const fg = parseColor(colorValue);\r\n if (fg) {\r\n // Find nearest ancestor background-color, default white\r\n let bgR = 255, bgG = 255, bgB = 255;\r\n let current = $(el);\r\n let foundBg = false;\r\n\r\n // Check own background first, then walk ancestors\r\n const elements = [current, ...$(el).parents(\"[style]\").toArray().map((p) => $(p))];\r\n for (const ancestor of elements) {\r\n const ancestorStyle = (typeof ancestor === \"function\" ? ancestor : $(ancestor)).attr(\"style\") || \"\";\r\n const bgValue = getStyleValue(ancestorStyle, \"background-color\");\r\n if (bgValue) {\r\n const bg = parseColor(bgValue);\r\n if (bg && bg.a > 0) {\r\n if (bg.a < 1) {\r\n // Semi-transparent bg — blend against white\r\n [bgR, bgG, bgB] = alphaBlend(bg, 255, 255, 255);\r\n } else {\r\n bgR = bg.r;\r\n bgG = bg.g;\r\n bgB = bg.b;\r\n }\r\n foundBg = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Alpha-blend foreground if needed\r\n const [fR, fG, fB] = fg.a < 1 ? alphaBlend(fg, bgR, bgG, bgB) : [fg.r, fg.g, fg.b];\r\n\r\n const fgLum = relativeLuminance(fR, fG, fB);\r\n const bgLum = relativeLuminance(bgR, bgG, bgB);\r\n const ratio = contrastRatio(fgLum, bgLum);\r\n\r\n // Determine if text is \"large\" (≥18px, or ≥14px bold)\r\n let isLargeText = false;\r\n if (fontSizeMatch) {\r\n const size = parseFloat(fontSizeMatch[1]);\r\n const unit = fontSizeMatch[2].toLowerCase();\r\n const pxSize = unit === \"pt\" ? size * 1.333 : size;\r\n const fontWeight = getStyleValue(style, \"font-weight\");\r\n const isBold = fontWeight === \"bold\" || fontWeight === \"bolder\" || (fontWeight && parseInt(fontWeight, 10) >= 700);\r\n isLargeText = pxSize >= 18 || (pxSize >= 14 && !!isBold);\r\n }\r\n\r\n const grade = wcagGrade(ratio);\r\n if (grade === \"Fail\") {\r\n // ratio < 3:1 — error for all text\r\n issues.push({\r\n severity: \"error\",\r\n rule: \"low-contrast\",\r\n message: `Low contrast ratio ${ratio.toFixed(1)}:1 — fails WCAG minimum`,\r\n element: describeElement($, el),\r\n details: `Foreground ${colorValue} on background needs at least ${isLargeText ? \"3:1\" : \"4.5:1\"} contrast ratio.`,\r\n });\r\n } else if (!isLargeText && grade === \"AA Large\") {\r\n // ratio 3:1–4.5:1 — only passes for large text, so flag normal text\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"low-contrast\",\r\n message: `Low contrast ratio ${ratio.toFixed(1)}:1 — fails WCAG AA for normal text`,\r\n element: describeElement($, el),\r\n details: `Foreground ${colorValue} on background needs at least 4.5:1 for normal-sized text.`,\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n if (smallTextCount > 3) {\r\n issues.push({\r\n severity: \"warning\",\r\n rule: \"small-text-multiple\",\r\n message: `${smallTextCount} elements with text smaller than 9px`,\r\n details: \"Consider using a minimum font size of 12-14px for readability.\",\r\n });\r\n }\r\n\r\n return issues;\r\n}\r\n\r\nfunction checkCharsetDeclaration($: cheerio.CheerioAPI): AccessibilityIssue | null {\r\n // Check for <meta charset=\"...\">\r\n const metaCharset = $('meta[charset]');\r\n if (metaCharset.length > 0) return null;\r\n\r\n // Check for <meta http-equiv=\"Content-Type\" content=\"...charset=...\">\r\n const httpEquiv = $('meta[http-equiv=\"Content-Type\"]');\r\n if (httpEquiv.length > 0) {\r\n const content = httpEquiv.attr(\"content\") || \"\";\r\n if (/charset\\s*=/i.test(content)) return null;\r\n }\r\n\r\n return {\r\n severity: \"warning\",\r\n rule: \"missing-charset\",\r\n message: \"Missing charset declaration\",\r\n details: 'Add <meta charset=\"utf-8\"> in <head> to prevent encoding issues across email clients.',\r\n };\r\n}\r\n\r\nfunction checkSemanticStructure($: cheerio.CheerioAPI): AccessibilityIssue[] {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n const headings: { level: number; text: string }[] = [];\r\n $(\"h1, h2, h3, h4, h5, h6\").each((_, el) => {\r\n const level = parseInt(el.tagName.replace(/h/i, \"\"), 10);\r\n headings.push({ level, text: $(el).text().trim().slice(0, 60) });\r\n });\r\n\r\n for (let i = 1; i < headings.length; i++) {\r\n const gap = headings[i].level - headings[i - 1].level;\r\n if (gap > 1) {\r\n issues.push({\r\n severity: \"info\",\r\n rule: \"heading-skip\",\r\n message: `Heading level skipped: h${headings[i - 1].level} to h${headings[i].level}`,\r\n details: \"Skipped heading levels can confuse screen readers. Use sequential heading levels.\",\r\n });\r\n break;\r\n }\r\n }\r\n\r\n return issues;\r\n}\r\n\r\n/**\r\n * Audit a pre-parsed email DOM for accessibility issues.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function checkAccessibilityFromDom($: cheerio.CheerioAPI): AccessibilityReport {\r\n const issues: AccessibilityIssue[] = [];\r\n\r\n const langIssue = checkLangAttribute($);\r\n if (langIssue) issues.push(langIssue);\r\n\r\n const titleIssue = checkTitle($);\r\n if (titleIssue) issues.push(titleIssue);\r\n\r\n issues.push(...checkImageAlt($));\r\n issues.push(...checkLinkAccessibility($));\r\n issues.push(...checkTableAccessibility($));\r\n issues.push(...checkTextSizeAndContrast($));\r\n issues.push(...checkSemanticStructure($));\r\n\r\n const charsetIssue = checkCharsetDeclaration($);\r\n if (charsetIssue) issues.push(charsetIssue);\r\n\r\n // Calculate score with per-rule penalty capping\r\n let penalty = 0;\r\n const seenRules = new Map<string, number>();\r\n\r\n for (const issue of issues) {\r\n const count = (seenRules.get(issue.rule) || 0) + 1;\r\n seenRules.set(issue.rule, count);\r\n\r\n const cap = RULE_PENALTY_CAPS[issue.rule];\r\n if (cap !== undefined && count > cap) continue;\r\n\r\n switch (issue.severity) {\r\n case \"error\": penalty += 12; break;\r\n case \"warning\": penalty += 6; break;\r\n case \"info\": penalty += 2; break;\r\n }\r\n }\r\n\r\n const score = Math.max(0, 100 - penalty);\r\n return { score, issues };\r\n}\r\n\r\n/**\r\n * Audit an HTML email for accessibility issues.\r\n *\r\n * Checks for missing lang attributes, image alt text, small fonts,\r\n * layout table roles, link accessibility, heading hierarchy, and\r\n * color contrast. Returns a 0–100 score and detailed issues.\r\n */\r\nexport function checkAccessibility(html: string): AccessibilityReport {\r\n if (!html || !html.trim()) {\r\n return { score: 100, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkAccessibilityFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE } from \"./constants\";\r\nimport type { ImageIssue, ImageInfo, ImageReport } from \"./types\";\r\n\r\nconst DATA_URI_WARN_BYTES = 100 * 1024;\r\nconst TOTAL_DATA_URI_WARN_BYTES = 500 * 1024;\r\nconst HIGH_IMAGE_COUNT = 10;\r\n\r\nfunction estimateBase64Bytes(dataUri: string): number {\r\n const commaIdx = dataUri.indexOf(\",\");\r\n if (commaIdx === -1) return 0;\r\n const payload = dataUri.slice(commaIdx + 1);\r\n return Math.floor((payload.length * 3) / 4);\r\n}\r\n\r\nfunction isTrackingPixel(\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n el: cheerio.Cheerio<any>,\r\n): boolean {\r\n const width = el.attr(\"width\");\r\n const height = el.attr(\"height\");\r\n const style = (el.attr(\"style\") || \"\").toLowerCase();\r\n\r\n if (width === \"1\" && height === \"1\") return true;\r\n if (width === \"0\" || height === \"0\") return true;\r\n\r\n if (\r\n style.includes(\"display:none\") ||\r\n style.includes(\"display: none\") ||\r\n style.includes(\"visibility:hidden\") ||\r\n style.includes(\"visibility: hidden\")\r\n ) {\r\n return true;\r\n }\r\n\r\n if (/width\\s*:\\s*1px/.test(style) && /height\\s*:\\s*1px/.test(style)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction truncateSrc(src: string, max = 60): string {\r\n if (src.startsWith(\"data:\")) {\r\n const semi = src.indexOf(\";\");\r\n return semi > 0 ? src.slice(0, semi + 1) + \"base64,...\" : \"data:...\";\r\n }\r\n return src.length > max ? src.slice(0, max - 3) + \"...\" : src;\r\n}\r\n\r\n/**\r\n * Analyze images from a pre-parsed email DOM.\r\n *\r\n * Accepts a Cheerio instance to avoid redundant HTML parsing when\r\n * called from `auditEmail()` or `createSession()`.\r\n *\r\n * @internal\r\n */\r\nexport function analyzeImagesFromDom($: cheerio.CheerioAPI): ImageReport {\r\n const issues: ImageIssue[] = [];\r\n const images: ImageInfo[] = [];\r\n let totalDataUriBytes = 0;\r\n\r\n $(\"img\").each((_, el) => {\r\n const img = $(el);\r\n const src = img.attr(\"src\") || \"\";\r\n const alt = img.attr(\"alt\") ?? null;\r\n const width = img.attr(\"width\") ?? null;\r\n const height = img.attr(\"height\") ?? null;\r\n const style = (img.attr(\"style\") || \"\").toLowerCase();\r\n const imgIssues: string[] = [];\r\n\r\n const tracking = isTrackingPixel(img);\r\n\r\n let dataUriBytes = 0;\r\n if (src.startsWith(\"data:\")) {\r\n dataUriBytes = estimateBase64Bytes(src);\r\n totalDataUriBytes += dataUriBytes;\r\n }\r\n\r\n // Skip detailed checks for tracking pixels\r\n if (tracking) {\r\n images.push({\r\n src: truncateSrc(src),\r\n alt, width, height,\r\n isTrackingPixel: true,\r\n dataUriBytes,\r\n issues: [\"tracking-pixel\"],\r\n });\r\n return;\r\n }\r\n\r\n // Missing width/height\r\n if (!width && !height) {\r\n const hasStyleWidth = /width\\s*:/.test(style);\r\n const hasStyleHeight = /height\\s*:/.test(style);\r\n if (!hasStyleWidth && !hasStyleHeight) {\r\n imgIssues.push(\"missing-dimensions\");\r\n issues.push({\r\n rule: \"missing-dimensions\",\r\n severity: \"warning\",\r\n message: \"Image missing width/height attributes — causes layout shifts and Outlook rendering issues.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n }\r\n\r\n // Large data URI\r\n if (dataUriBytes > DATA_URI_WARN_BYTES) {\r\n const kb = Math.round(dataUriBytes / 1024);\r\n imgIssues.push(\"large-data-uri\");\r\n issues.push({\r\n rule: \"large-data-uri\",\r\n severity: \"warning\",\r\n message: `Data URI is ${kb}KB — consider hosting the image externally to reduce email size.`,\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // Missing alt\r\n if (alt === null) {\r\n imgIssues.push(\"missing-alt\");\r\n issues.push({\r\n rule: \"missing-alt\",\r\n severity: \"warning\",\r\n message: \"Image missing alt attribute — hurts deliverability and accessibility.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // WebP format\r\n if (src.toLowerCase().endsWith(\".webp\") || src.includes(\"image/webp\")) {\r\n imgIssues.push(\"webp-format\");\r\n issues.push({\r\n rule: \"webp-format\",\r\n severity: \"info\",\r\n message: \"WebP format detected — not supported by all email clients. Consider PNG or JPEG.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // SVG format\r\n if (src.toLowerCase().endsWith(\".svg\") || src.includes(\"image/svg\")) {\r\n imgIssues.push(\"svg-format\");\r\n issues.push({\r\n rule: \"svg-format\",\r\n severity: \"info\",\r\n message: \"SVG format detected — not supported by most email clients. Use PNG instead.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n // Missing display:block\r\n if (!style.includes(\"display:block\") && !style.includes(\"display: block\")) {\r\n imgIssues.push(\"missing-display-block\");\r\n issues.push({\r\n rule: \"missing-display-block\",\r\n severity: \"info\",\r\n message: \"Image without display:block — may cause unwanted gaps in Outlook.\",\r\n src: truncateSrc(src),\r\n });\r\n }\r\n\r\n images.push({\r\n src: truncateSrc(src),\r\n alt, width, height,\r\n isTrackingPixel: false,\r\n dataUriBytes,\r\n issues: imgIssues,\r\n });\r\n });\r\n\r\n // Aggregate checks\r\n const nonTrackingImages = images.filter((i) => !i.isTrackingPixel);\r\n\r\n if (nonTrackingImages.length > HIGH_IMAGE_COUNT) {\r\n issues.push({\r\n rule: \"high-image-count\",\r\n severity: \"info\",\r\n message: `Email contains ${nonTrackingImages.length} images — heavy emails may be clipped or load slowly.`,\r\n });\r\n }\r\n\r\n const trackingPixels = images.filter((i) => i.isTrackingPixel);\r\n if (trackingPixels.length > 0) {\r\n issues.push({\r\n rule: \"tracking-pixel\",\r\n severity: \"info\",\r\n message: `${trackingPixels.length} tracking pixel${trackingPixels.length > 1 ? \"s\" : \"\"} detected.`,\r\n });\r\n }\r\n\r\n if (totalDataUriBytes > TOTAL_DATA_URI_WARN_BYTES) {\r\n const kb = Math.round(totalDataUriBytes / 1024);\r\n issues.push({\r\n rule: \"total-data-uri-size\",\r\n severity: \"warning\",\r\n message: `Total data URI size is ${kb}KB — consider hosting images externally to reduce email size.`,\r\n });\r\n }\r\n\r\n return { total: images.length, totalDataUriBytes, issues, images };\r\n}\r\n\r\n/**\r\n * Analyze images in an HTML email for best practices.\r\n *\r\n * Checks for missing dimensions, oversized data URIs, missing alt\r\n * attributes, unsupported formats (WebP, SVG), tracking pixels,\r\n * missing display:block, and overall image heaviness.\r\n */\r\nexport function analyzeImages(html: string): ImageReport {\r\n if (!html || !html.trim()) {\r\n return { total: 0, totalDataUriBytes: 0, issues: [], images: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return analyzeImagesFromDom($);\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, CLIENT_DISPLAY_LIMITS } from \"./constants\";\r\nimport type { InboxPreviewIssue, InboxPreview, ClientTruncation } from \"./types\";\r\n\r\nconst MAX_SUBJECT_LENGTH = 60;\r\nconst MAX_PREHEADER_LENGTH = 100;\r\nconst MIN_PREHEADER_LENGTH = 30;\r\n\r\n/** Emoji regex — covers most common emoji ranges */\r\nconst EMOJI_PATTERN = /[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{1F1E0}-\\u{1F1FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}\\u{2B50}-\\u{2B55}\\u{FE00}-\\u{FE0F}\\u{1F900}-\\u{1F9FF}\\u{1FA00}-\\u{1FA6F}\\u{1FA70}-\\u{1FAFF}\\u{200D}\\u{20E3}\\u{E0020}-\\u{E007F}]/u;\r\n\r\n/**\r\n * Detect ‌ padding hack in preheader elements.\r\n * Cheerio partially decodes entities: zwnj → \\u200C but may stay as entity.\r\n * Match both decoded Unicode and HTML entity forms.\r\n */\r\nconst ZWNJ_PADDING_PATTERN = /(\\u200C\\s*( |\\u00A0)\\s*){2,}|(‌\\s* \\s*){2,}/;\r\n\r\n/**\r\n * Extract subject and preheader text from the email HTML, plus\r\n * flag common issues (missing title, length problems, etc.).\r\n *\r\n * The subject comes from the `<title>` tag. The preheader is extracted\r\n * from the first visible text in `<body>`, including hidden preheader\r\n * hacks (zero-width divs, display:none spans, etc.).\r\n */\r\nexport function extractInboxPreview(html: string): InboxPreview {\r\n if (!html || !html.trim()) {\r\n return {\r\n subject: null,\r\n preheader: null,\r\n subjectLength: 0,\r\n preheaderLength: 0,\r\n truncation: [],\r\n issues: [{ rule: \"missing-subject\", severity: \"warning\", message: \"No <title> tag found. Most email clients use this as the subject line.\" }],\r\n };\r\n }\r\n\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return extractInboxPreviewFromDom($);\r\n}\r\n\r\n/**\r\n * DOM-based implementation for use with shared Cheerio sessions.\r\n */\r\nexport function extractInboxPreviewFromDom($: CheerioAPI): InboxPreview {\r\n const issues: InboxPreviewIssue[] = [];\r\n\r\n // ── Subject (from <title>) ──\r\n const titleEl = $(\"title\");\r\n const subject = titleEl.length > 0 ? titleEl.first().text().trim() || null : null;\r\n const subjectLength = subject?.length ?? 0;\r\n\r\n if (!subject) {\r\n issues.push({\r\n rule: \"missing-subject\",\r\n severity: \"warning\",\r\n message: \"No <title> tag found. Most email clients use this as the subject line.\",\r\n });\r\n } else if (subjectLength > MAX_SUBJECT_LENGTH) {\r\n issues.push({\r\n rule: \"subject-too-long\",\r\n severity: \"warning\",\r\n message: `Subject is ${subjectLength} characters — may be truncated in inboxes (recommended: ${MAX_SUBJECT_LENGTH} or fewer).`,\r\n });\r\n }\r\n\r\n // ── Preheader ──\r\n // Look for common preheader patterns first:\r\n // 1. Hidden divs/spans at the start of <body> (display:none, visibility:hidden, mso-hide:all)\r\n // 2. First visible text in <body>\r\n const preheader = extractPreheaderText($);\r\n const preheaderLength = preheader?.length ?? 0;\r\n\r\n if (!preheader) {\r\n issues.push({\r\n rule: \"missing-preheader\",\r\n severity: \"info\",\r\n message: \"No preheader text detected. Adding preview text improves open rates in crowded inboxes.\",\r\n });\r\n } else if (preheaderLength < MIN_PREHEADER_LENGTH) {\r\n issues.push({\r\n rule: \"preheader-too-short\",\r\n severity: \"warning\",\r\n message: `Preheader is only ${preheaderLength} characters — email clients may backfill with body text (recommended: ${MIN_PREHEADER_LENGTH}+).`,\r\n });\r\n } else if (preheaderLength > MAX_PREHEADER_LENGTH) {\r\n issues.push({\r\n rule: \"preheader-too-long\",\r\n severity: \"info\",\r\n message: `Preheader is ${preheaderLength} characters — most clients show 40–100 characters. Text beyond that is hidden.`,\r\n });\r\n }\r\n\r\n // ── ZWNJ/NBSP padding detection ──\r\n if (hasZwnjPadding($)) {\r\n issues.push({\r\n rule: \"zwnj-padding\",\r\n severity: \"info\",\r\n message: \"Preheader uses ‌ padding hack — works in most clients but may show garbled text in some.\",\r\n });\r\n }\r\n\r\n // ── Emoji in subject ──\r\n if (subject && EMOJI_PATTERN.test(subject)) {\r\n issues.push({\r\n rule: \"emoji-in-subject\",\r\n severity: \"info\",\r\n message: \"Subject line contains emoji — renders inconsistently across email clients and may trigger spam filters.\",\r\n });\r\n }\r\n\r\n // ── Per-client truncation ──\r\n const truncation = computeTruncation(subject, preheader);\r\n\r\n return {\r\n subject,\r\n preheader,\r\n subjectLength,\r\n preheaderLength,\r\n truncation,\r\n issues,\r\n };\r\n}\r\n\r\n/**\r\n * Compute per-client truncation data for subject and preheader.\r\n */\r\nfunction computeTruncation(subject: string | null, preheader: string | null): ClientTruncation[] {\r\n return CLIENT_DISPLAY_LIMITS.map((limit) => {\r\n const truncatedSubject = subject && subject.length > limit.subjectLimit\r\n ? subject.slice(0, limit.subjectLimit - 1) + \"…\"\r\n : subject;\r\n const truncatedPreheader = preheader && preheader.length > limit.preheaderLimit\r\n ? preheader.slice(0, limit.preheaderLimit - 1) + \"…\"\r\n : preheader;\r\n\r\n return {\r\n client: limit.client,\r\n subjectLimit: limit.subjectLimit,\r\n preheaderLimit: limit.preheaderLimit,\r\n truncatedSubject: truncatedSubject ?? null,\r\n truncatedPreheader: truncatedPreheader ?? null,\r\n subjectTruncated: !!subject && subject.length > limit.subjectLimit,\r\n preheaderTruncated: !!preheader && preheader.length > limit.preheaderLimit,\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Detect ‌ padding hack in preheader-like elements.\r\n */\r\nfunction hasZwnjPadding($: CheerioAPI): boolean {\r\n const body = $(\"body\");\r\n if (!body.length) return false;\r\n\r\n const hiddenSelectors = [\r\n 'div[style*=\"display:none\"]', 'div[style*=\"display: none\"]',\r\n 'span[style*=\"display:none\"]', 'span[style*=\"display: none\"]',\r\n 'div[style*=\"max-height:0\"]', 'div[style*=\"max-height: 0\"]',\r\n 'span[style*=\"max-height:0\"]', 'span[style*=\"max-height: 0\"]',\r\n '[class*=\"preheader\"]', '[class*=\"preview-text\"]', '[class*=\"previewText\"]',\r\n ];\r\n\r\n for (const sel of hiddenSelectors) {\r\n const el = body.find(sel).first();\r\n if (el.length) {\r\n const rawHtml = el.html() || \"\";\r\n if (ZWNJ_PADDING_PATTERN.test(rawHtml)) return true;\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Try to extract preheader text from the email body.\r\n *\r\n * Strategy:\r\n * 1. Look for hidden elements at the start of body (common preheader hacks)\r\n * 2. Fall back to the first visible text in body\r\n */\r\nfunction extractPreheaderText($: CheerioAPI): string | null {\r\n const body = $(\"body\");\r\n if (!body.length) return null;\r\n\r\n // Check for hidden preheader hacks — these are typically the first child\r\n // elements with display:none, visibility:hidden, max-height:0, or mso-hide:all\r\n const hiddenSelectors = [\r\n 'div[style*=\"display:none\"]',\r\n 'div[style*=\"display: none\"]',\r\n 'span[style*=\"display:none\"]',\r\n 'span[style*=\"display: none\"]',\r\n 'div[style*=\"visibility:hidden\"]',\r\n 'div[style*=\"visibility: hidden\"]',\r\n 'span[style*=\"visibility:hidden\"]',\r\n 'span[style*=\"visibility: hidden\"]',\r\n 'div[style*=\"max-height:0\"]',\r\n 'div[style*=\"max-height: 0\"]',\r\n 'span[style*=\"max-height:0\"]',\r\n 'span[style*=\"max-height: 0\"]',\r\n 'div[style*=\"mso-hide:all\"]',\r\n 'div[style*=\"mso-hide: all\"]',\r\n ];\r\n\r\n for (const sel of hiddenSelectors) {\r\n const el = body.find(sel).first();\r\n if (el.length) {\r\n const text = el.text().trim();\r\n if (text) return text;\r\n }\r\n }\r\n\r\n // Also check for elements with class names suggesting preheader\r\n const preheaderClasses = body.find(\r\n '[class*=\"preheader\"], [class*=\"preview-text\"], [class*=\"previewText\"]'\r\n ).first();\r\n if (preheaderClasses.length) {\r\n const text = preheaderClasses.text().trim();\r\n if (text) return text;\r\n }\r\n\r\n // Fall back to the first block of visible text in the body\r\n // Walk the first few direct children to find text\r\n const firstText = getFirstVisibleText($, body);\r\n return firstText || null;\r\n}\r\n\r\n/**\r\n * Extract the first meaningful visible text from a body element.\r\n * Skips style/script tags and stops after finding the first text block.\r\n */\r\nfunction getFirstVisibleText($: CheerioAPI, body: cheerio.Cheerio<any>): string | null {\r\n const skipTags = new Set([\"style\", \"script\", \"head\", \"title\"]);\r\n let result: string | null = null;\r\n\r\n body.find(\"*\").each((_, el) => {\r\n if (result) return false; // stop iterating\r\n const tagName = (el as any).tagName?.toLowerCase();\r\n if (skipTags.has(tagName)) return;\r\n\r\n // Check if this element is hidden (skip hidden elements for preheader detection)\r\n const style = $(el).attr(\"style\") || \"\";\r\n if (\r\n style.includes(\"display:none\") ||\r\n style.includes(\"display: none\") ||\r\n style.includes(\"visibility:hidden\") ||\r\n style.includes(\"visibility: hidden\")\r\n ) {\r\n return;\r\n }\r\n\r\n // Get direct text content (not from children)\r\n const directText = $(el)\r\n .contents()\r\n .filter((_, node) => node.type === \"text\")\r\n .text()\r\n .trim();\r\n\r\n if (directText && directText.length > 1) {\r\n // Skip whitespace-only padding (common in email templates)\r\n const cleaned = directText.replace(/[\\u200B\\u00A0\\s]+/g, \" \").trim();\r\n if (cleaned.length > 1) {\r\n result = cleaned;\r\n return false;\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, GMAIL_CLIP_THRESHOLD, GMAIL_CLIP_WARNING_THRESHOLD } from \"./constants\";\r\nimport type { SizeIssue, SizeReport } from \"./types\";\r\n\r\n/**\r\n * Format bytes into a human-readable string.\r\n */\r\nfunction humanizeBytes(bytes: number): string {\r\n if (bytes < 1024) return `${bytes} B`;\r\n const kb = bytes / 1024;\r\n if (kb < 1024) return `${kb.toFixed(1)} KB`;\r\n const mb = kb / 1024;\r\n return `${mb.toFixed(2)} MB`;\r\n}\r\n\r\n/**\r\n * Check email HTML size for Gmail clipping issues.\r\n *\r\n * Accepts both Cheerio + raw HTML because byte length requires the raw\r\n * string (Cheerio serialization may differ from the original).\r\n *\r\n * @internal Used by audit pipeline with pre-parsed DOM.\r\n */\r\nexport function checkSizeFromDom(_$: CheerioAPI, html: string): SizeReport {\r\n const htmlBytes = new TextEncoder().encode(html).length;\r\n const humanSize = humanizeBytes(htmlBytes);\r\n const issues: SizeIssue[] = [];\r\n let clipped = false;\r\n\r\n if (htmlBytes > GMAIL_CLIP_THRESHOLD) {\r\n clipped = true;\r\n issues.push({\r\n rule: \"gmail-clipped\",\r\n severity: \"error\",\r\n message: `Email is ${humanSize} — Gmail will clip it at ~102 KB. Recipients see a \"View entire message\" link instead of your content.`,\r\n detail: `${htmlBytes} bytes exceeds the ${GMAIL_CLIP_THRESHOLD} byte threshold.`,\r\n });\r\n } else if (htmlBytes > GMAIL_CLIP_WARNING_THRESHOLD) {\r\n issues.push({\r\n rule: \"gmail-clip-warning\",\r\n severity: \"warning\",\r\n message: `Email is ${humanSize} — approaching Gmail's ~102 KB clip threshold. Consider trimming.`,\r\n detail: `${htmlBytes} bytes is within ${GMAIL_CLIP_THRESHOLD - htmlBytes} bytes of the clip threshold.`,\r\n });\r\n }\r\n\r\n return { htmlBytes, humanSize, clipped, issues };\r\n}\r\n\r\n/**\r\n * Check email HTML size for Gmail clipping issues.\r\n *\r\n * Returns byte count, human-readable size, clip status, and issues.\r\n * Gmail clips messages larger than ~102 KB, hiding content behind a\r\n * \"View entire message\" link.\r\n */\r\nexport function checkSize(html: string): SizeReport {\r\n if (!html || !html.trim()) {\r\n return { htmlBytes: 0, humanSize: \"0 B\", clipped: false, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkSizeFromDom($, html);\r\n}\r\n","import type { CheerioAPI } from \"cheerio\";\r\nimport * as cheerio from \"cheerio\";\r\nimport { MAX_HTML_SIZE, TEMPLATE_VARIABLE_PATTERNS } from \"./constants\";\r\nimport type { TemplateIssue, TemplateReport } from \"./types\";\r\n\r\n/**\r\n * Scan DOM text nodes and attributes for unresolved template variables.\r\n *\r\n * Scans DOM text (not raw HTML) to avoid false positives from CSS/style\r\n * blocks. Also checks href, src, and alt attributes for merge tags.\r\n *\r\n * @internal Used by audit pipeline with pre-parsed DOM.\r\n */\r\nexport function checkTemplateVariablesFromDom($: CheerioAPI): TemplateReport {\r\n const issues: TemplateIssue[] = [];\r\n const seen = new Set<string>();\r\n\r\n // ── Scan visible text content ──\r\n const textContent = extractTextContent($);\r\n for (const [pattern, label] of TEMPLATE_VARIABLE_PATTERNS) {\r\n // Reset lastIndex for global regexes\r\n pattern.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = pattern.exec(textContent)) !== null) {\r\n const variable = match[0];\r\n const key = `text:${variable}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n issues.push({\r\n rule: \"unresolved-variable\",\r\n severity: \"error\",\r\n message: `Unresolved ${label} variable \"${variable}\" found in text content.`,\r\n variable,\r\n location: \"text\",\r\n });\r\n }\r\n }\r\n\r\n // ── Scan attributes (href, src, alt) ──\r\n const attrSelectors = [\"[href]\", \"[src]\", \"[alt]\"];\r\n for (const sel of attrSelectors) {\r\n $(sel).each((_, el) => {\r\n const attrs = [\"href\", \"src\", \"alt\"] as const;\r\n for (const attr of attrs) {\r\n const value = $(el).attr(attr);\r\n if (!value) continue;\r\n\r\n for (const [pattern, label] of TEMPLATE_VARIABLE_PATTERNS) {\r\n pattern.lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n while ((match = pattern.exec(value)) !== null) {\r\n const variable = match[0];\r\n const key = `attr:${attr}:${variable}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n issues.push({\r\n rule: \"unresolved-variable\",\r\n severity: \"error\",\r\n message: `Unresolved ${label} variable \"${variable}\" found in ${attr} attribute.`,\r\n variable,\r\n location: \"attribute\",\r\n });\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n return { unresolvedCount: issues.length, issues };\r\n}\r\n\r\n/**\r\n * Extract visible text content from DOM (excluding style/script).\r\n */\r\nfunction extractTextContent($: CheerioAPI): string {\r\n const clone = $.root().clone();\r\n clone.find(\"style, script, head\").remove();\r\n return clone.text();\r\n}\r\n\r\n/**\r\n * Scan HTML email for unresolved template/merge variables.\r\n *\r\n * Detects patterns like `{{var}}`, `${var}`, `<%= %>`, `*|TAG|*`,\r\n * `%%tag%%`, and `{merge_field}` in text content and key attributes.\r\n *\r\n * Returns the count of unresolved variables and detailed issues.\r\n */\r\nexport function checkTemplateVariables(html: string): TemplateReport {\r\n if (!html || !html.trim()) {\r\n return { unresolvedCount: 0, issues: [] };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const $ = cheerio.load(html);\r\n return checkTemplateVariablesFromDom($);\r\n}\r\n","import * as cheerio from \"cheerio\";\r\nimport { analyzeEmailFromDom, generateCompatibilityScore } from \"./analyze\";\r\nimport { analyzeSpamFromDom } from \"./spam-scorer\";\r\nimport { validateLinksFromDom } from \"./link-validator\";\r\nimport { checkAccessibilityFromDom } from \"./accessibility-checker\";\r\nimport { analyzeImagesFromDom } from \"./image-analyzer\";\r\nimport { extractInboxPreviewFromDom } from \"./inbox-preview\";\r\nimport { checkSizeFromDom } from \"./size-checker\";\r\nimport { checkTemplateVariablesFromDom } from \"./template-checker\";\r\nimport {\r\n MAX_HTML_SIZE,\r\n EMPTY_SPAM, EMPTY_LINKS, EMPTY_ACCESSIBILITY, EMPTY_IMAGES,\r\n EMPTY_INBOX_PREVIEW, EMPTY_SIZE, EMPTY_TEMPLATE,\r\n} from \"./constants\";\r\nimport type {\r\n CSSWarning,\r\n Framework,\r\n SpamAnalysisOptions,\r\n SpamReport,\r\n LinkReport,\r\n AccessibilityReport,\r\n ImageReport,\r\n InboxPreview,\r\n SizeReport,\r\n TemplateReport,\r\n} from \"./types\";\r\n\r\nexport interface AuditOptions {\r\n framework?: Framework;\r\n /** Options for spam analysis */\r\n spam?: SpamAnalysisOptions;\r\n /** Skip specific checks */\r\n skip?: Array<\"spam\" | \"links\" | \"accessibility\" | \"images\" | \"compatibility\" | \"inboxPreview\" | \"size\" | \"templateVariables\">;\r\n}\r\n\r\nexport interface AuditReport {\r\n compatibility: {\r\n warnings: CSSWarning[];\r\n scores: Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n };\r\n spam: SpamReport;\r\n links: LinkReport;\r\n accessibility: AccessibilityReport;\r\n images: ImageReport;\r\n inboxPreview: InboxPreview;\r\n size: SizeReport;\r\n templateVariables: TemplateReport;\r\n}\r\n\r\n/**\r\n * Run all email analysis checks in a single call.\r\n *\r\n * Returns a unified report with compatibility warnings + scores,\r\n * spam analysis, link validation, accessibility audit, and image analysis.\r\n * Use the `skip` option to omit checks you don't need.\r\n *\r\n * Internally parses the HTML once and shares the parsed DOM across\r\n * all analyzers to avoid redundant parsing overhead.\r\n */\r\nexport function auditEmail(html: string, options?: AuditOptions): AuditReport {\r\n if (!html || !html.trim()) {\r\n return {\r\n compatibility: { warnings: [], scores: {} },\r\n spam: EMPTY_SPAM,\r\n links: EMPTY_LINKS,\r\n accessibility: EMPTY_ACCESSIBILITY,\r\n images: EMPTY_IMAGES,\r\n inboxPreview: EMPTY_INBOX_PREVIEW,\r\n size: EMPTY_SIZE,\r\n templateVariables: EMPTY_TEMPLATE,\r\n };\r\n }\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n const framework = options?.framework;\r\n const skip = new Set(options?.skip ?? []);\r\n\r\n // Parse once, share across all analyzers\r\n const $ = cheerio.load(html);\r\n\r\n const warnings = skip.has(\"compatibility\") ? [] : analyzeEmailFromDom($, framework);\r\n const scores = skip.has(\"compatibility\") ? {} : generateCompatibilityScore(warnings);\r\n const spam = skip.has(\"spam\") ? EMPTY_SPAM : analyzeSpamFromDom($, options?.spam);\r\n const links = skip.has(\"links\") ? EMPTY_LINKS : validateLinksFromDom($);\r\n const accessibility = skip.has(\"accessibility\") ? EMPTY_ACCESSIBILITY : checkAccessibilityFromDom($);\r\n const images = skip.has(\"images\") ? EMPTY_IMAGES : analyzeImagesFromDom($);\r\n const inboxPreview = skip.has(\"inboxPreview\") ? EMPTY_INBOX_PREVIEW : extractInboxPreviewFromDom($);\r\n const size = skip.has(\"size\") ? EMPTY_SIZE : checkSizeFromDom($, html);\r\n const templateVariables = skip.has(\"templateVariables\") ? EMPTY_TEMPLATE : checkTemplateVariablesFromDom($);\r\n\r\n return { compatibility: { warnings, scores }, spam, links, accessibility, images, inboxPreview, size, templateVariables };\r\n}\r\n","import * as cheerio from \"cheerio\";\nimport type { AnyNode, Element, Text } from \"domhandler\";\n\n/**\n * Convert HTML email to plain text suitable for multipart/alternative emails.\n *\n * Walks the DOM tree node-by-node, emitting text content with proper\n * line breaks for block elements. Avoids cheerio's `.text()` which\n * preserves all source whitespace from deeply nested email tables.\n */\nexport function toPlainText(html: string): string {\n const $ = cheerio.load(html);\n\n // Remove elements that should not appear in plain text\n $(\"style, script, head\").remove();\n $(\"[data-skip-in-text='true']\").remove();\n\n const lines: string[] = [];\n let currentLine = \"\";\n\n const BLOCK_TAGS = new Set([\n \"p\", \"div\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\",\n \"tr\", \"table\", \"blockquote\", \"ul\", \"ol\", \"li\",\n \"section\", \"article\", \"header\", \"footer\", \"main\",\n \"td\", \"th\", // treat cells as blocks to avoid run-on text\n ]);\n\n const SKIP_TAGS = new Set([\"style\", \"script\", \"head\"]);\n\n function flushLine() {\n const trimmed = currentLine.trim();\n if (trimmed) lines.push(trimmed);\n currentLine = \"\";\n }\n\n function walk(node: AnyNode) {\n if (node.type === \"text\") {\n // Collapse whitespace in text nodes (like browser rendering)\n const text = (node as Text).data.replace(/\\s+/g, \" \");\n if (text.trim()) {\n currentLine += text;\n }\n return;\n }\n\n if (node.type !== \"tag\") return;\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n\n if (SKIP_TAGS.has(tag)) return;\n\n // Self-closing conversions\n if (tag === \"br\") {\n flushLine();\n return;\n }\n if (tag === \"hr\") {\n flushLine();\n lines.push(\"---\");\n return;\n }\n if (tag === \"img\") {\n const alt = $(el).attr(\"alt\")?.trim();\n if (alt) currentLine += alt;\n return;\n }\n\n // Links — inline, append URL if different from text\n if (tag === \"a\") {\n const href = $(el).attr(\"href\") || \"\";\n const text = $(el).text().trim();\n if (!href || href === \"#\" || href === text) {\n currentLine += text || href;\n } else if (!text) {\n currentLine += href;\n } else {\n currentLine += `${text} (${href})`;\n }\n return; // don't recurse into children — already extracted text\n }\n\n // Block elements: flush before and after\n const isBlock = BLOCK_TAGS.has(tag);\n if (isBlock) {\n flushLine();\n } else if (currentLine && !currentLine.endsWith(\" \")) {\n // Inline elements: ensure a space separator so sibling spans\n // like <span>15</span><span>Clients</span> become \"15 Clients\"\n currentLine += \" \";\n }\n\n // List items get a bullet prefix\n if (tag === \"li\") {\n currentLine = \"- \";\n }\n\n // Recurse into children\n for (const child of el.children) {\n walk(child);\n }\n\n if (isBlock) flushLine();\n }\n\n // Start walking from body, or root if no body\n const body = $(\"body\");\n const root = body.length ? body[0] : $.root()[0];\n if (root && \"children\" in root) {\n for (const child of root.children) {\n walk(child);\n }\n }\n flushLine();\n\n // Join lines, collapse multiple blank lines into one\n let result = lines.join(\"\\n\");\n result = result.replace(/\\n{3,}/g, \"\\n\\n\");\n return result.trim();\n}\n","import * as cheerio from \"cheerio\";\r\nimport { analyzeEmailFromDom, generateCompatibilityScore } from \"./analyze\";\r\nimport { analyzeSpamFromDom } from \"./spam-scorer\";\r\nimport { validateLinksFromDom } from \"./link-validator\";\r\nimport { checkAccessibilityFromDom } from \"./accessibility-checker\";\r\nimport { analyzeImagesFromDom } from \"./image-analyzer\";\r\nimport { extractInboxPreviewFromDom } from \"./inbox-preview\";\r\nimport { checkSizeFromDom } from \"./size-checker\";\r\nimport { checkTemplateVariablesFromDom } from \"./template-checker\";\r\nimport { transformForClient, transformForAllClients } from \"./transform\";\r\nimport { simulateDarkMode } from \"./dark-mode\";\r\nimport {\r\n MAX_HTML_SIZE,\r\n EMPTY_SPAM, EMPTY_LINKS, EMPTY_ACCESSIBILITY, EMPTY_IMAGES,\r\n EMPTY_INBOX_PREVIEW, EMPTY_SIZE, EMPTY_TEMPLATE,\r\n} from \"./constants\";\r\nimport type {\r\n CSSWarning,\r\n Framework,\r\n SpamAnalysisOptions,\r\n SpamReport,\r\n LinkReport,\r\n AccessibilityReport,\r\n ImageReport,\r\n InboxPreview,\r\n SizeReport,\r\n TemplateReport,\r\n TransformResult,\r\n} from \"./types\";\r\nimport type { AuditOptions, AuditReport } from \"./audit\";\r\n\r\nexport interface CreateSessionOptions {\r\n /** Framework for fix snippets (applies to analyze/audit/transform). */\r\n framework?: Framework;\r\n}\r\n\r\n/**\r\n * A pre-parsed email session.\r\n *\r\n * Analysis methods (`analyze`, `audit`, `analyzeSpam`, `validateLinks`,\r\n * `checkAccessibility`, `analyzeImages`) share a single Cheerio DOM\r\n * parse, eliminating redundant parsing overhead.\r\n *\r\n * Transformation methods (`transformForClient`, `transformForAllClients`,\r\n * `simulateDarkMode`) parse internally since they mutate the DOM per\r\n * client. They still benefit from having the session hold the HTML and\r\n * framework so you don't need to pass them repeatedly.\r\n */\r\nexport interface EmailSession {\r\n /** The original HTML string. */\r\n readonly html: string;\r\n\r\n /** The framework set at session creation. */\r\n readonly framework: Framework | undefined;\r\n\r\n /**\r\n * Run all analysis checks in one call (shares pre-parsed DOM).\r\n *\r\n * Equivalent to `auditEmail()` but avoids re-parsing the HTML.\r\n */\r\n audit(options?: Omit<AuditOptions, \"framework\">): AuditReport;\r\n\r\n /**\r\n * Analyze CSS compatibility warnings (shares pre-parsed DOM).\r\n *\r\n * Equivalent to `analyzeEmail()` but avoids re-parsing the HTML.\r\n */\r\n analyze(): CSSWarning[];\r\n\r\n /** Generate per-client compatibility scores from warnings. */\r\n score(\r\n warnings: CSSWarning[],\r\n ): Record<string, { score: number; errors: number; warnings: number; info: number }>;\r\n\r\n /** Analyze spam indicators (shares pre-parsed DOM). */\r\n analyzeSpam(options?: SpamAnalysisOptions): SpamReport;\r\n\r\n /** Validate links (shares pre-parsed DOM). */\r\n validateLinks(): LinkReport;\r\n\r\n /** Check accessibility (shares pre-parsed DOM). */\r\n checkAccessibility(): AccessibilityReport;\r\n\r\n /** Analyze images (shares pre-parsed DOM). */\r\n analyzeImages(): ImageReport;\r\n\r\n /** Extract subject line and preheader text (shares pre-parsed DOM). */\r\n extractInboxPreview(): InboxPreview;\r\n\r\n /** Check email size for Gmail clipping (needs raw HTML for byte count). */\r\n checkSize(): SizeReport;\r\n\r\n /** Scan for unresolved template/merge variables (shares pre-parsed DOM). */\r\n checkTemplateVariables(): TemplateReport;\r\n\r\n /**\r\n * Transform HTML for a specific client.\r\n *\r\n * Creates an isolated DOM copy per call (transforms mutate the DOM).\r\n */\r\n transformForClient(clientId: string): TransformResult;\r\n\r\n /**\r\n * Transform HTML for all email clients.\r\n *\r\n * Creates an isolated DOM copy per client (transforms mutate the DOM).\r\n */\r\n transformForAllClients(): TransformResult[];\r\n\r\n /**\r\n * Simulate dark mode for a specific client.\r\n *\r\n * Creates an isolated DOM copy per call (simulation mutates the DOM).\r\n * Operates on the **original** HTML — if you need dark mode on\r\n * already-transformed HTML, use the standalone `simulateDarkMode()` instead.\r\n */\r\n simulateDarkMode(clientId: string): { html: string; warnings: CSSWarning[] };\r\n\r\n}\r\n\r\n/**\r\n * Create a session that pre-parses the HTML once and shares the parsed\r\n * DOM across all read-only analysis operations.\r\n *\r\n * Use this when you need to call multiple analysis functions on the\r\n * same HTML — it eliminates redundant `cheerio.load()` calls.\r\n *\r\n * @example\r\n * ```typescript\r\n * import { createSession } from \"@emailens/engine\";\r\n *\r\n * const session = createSession(html, { framework: \"jsx\" });\r\n *\r\n * // These all share a single DOM parse:\r\n * const warnings = session.analyze();\r\n * const scores = session.score(warnings);\r\n * const spam = session.analyzeSpam();\r\n * const links = session.validateLinks();\r\n * const a11y = session.checkAccessibility();\r\n * const images = session.analyzeImages();\r\n *\r\n * // Or run everything at once:\r\n * const report = session.audit();\r\n *\r\n * // Transforms still work (parse internally per client):\r\n * const transforms = session.transformForAllClients();\r\n * ```\r\n */\r\nexport function createSession(\r\n html: string,\r\n options?: CreateSessionOptions,\r\n): EmailSession {\r\n if (!html || !html.trim()) {\r\n // Return a no-op session for empty input\r\n const fw = options?.framework;\r\n return {\r\n html: html || \"\",\r\n framework: fw,\r\n audit: () => ({\r\n compatibility: { warnings: [], scores: {} },\r\n spam: EMPTY_SPAM,\r\n links: EMPTY_LINKS,\r\n accessibility: EMPTY_ACCESSIBILITY,\r\n images: EMPTY_IMAGES,\r\n inboxPreview: EMPTY_INBOX_PREVIEW,\r\n size: EMPTY_SIZE,\r\n templateVariables: EMPTY_TEMPLATE,\r\n }),\r\n analyze: () => [],\r\n score: () => ({}),\r\n analyzeSpam: () => EMPTY_SPAM,\r\n validateLinks: () => EMPTY_LINKS,\r\n checkAccessibility: () => EMPTY_ACCESSIBILITY,\r\n analyzeImages: () => EMPTY_IMAGES,\r\n extractInboxPreview: () => EMPTY_INBOX_PREVIEW,\r\n checkSize: () => EMPTY_SIZE,\r\n checkTemplateVariables: () => EMPTY_TEMPLATE,\r\n transformForClient: (clientId) => ({ clientId, html: html || \"\", warnings: [] }),\r\n transformForAllClients: () => [],\r\n simulateDarkMode: (clientId) => ({ html: html || \"\", warnings: [] }),\r\n };\r\n }\r\n\r\n if (html.length > MAX_HTML_SIZE) {\r\n throw new Error(`HTML input exceeds ${MAX_HTML_SIZE / 1024}KB limit.`);\r\n }\r\n\r\n // Parse once — shared across all read-only analysis operations\r\n const $ = cheerio.load(html);\r\n const framework = options?.framework;\r\n\r\n return {\r\n html,\r\n framework,\r\n\r\n audit(opts) {\r\n const skip = new Set(opts?.skip ?? []);\r\n\r\n const warnings = skip.has(\"compatibility\") ? [] : analyzeEmailFromDom($, framework);\r\n const scores = skip.has(\"compatibility\") ? {} : generateCompatibilityScore(warnings);\r\n const spam = skip.has(\"spam\") ? EMPTY_SPAM : analyzeSpamFromDom($, opts?.spam);\r\n const links = skip.has(\"links\") ? EMPTY_LINKS : validateLinksFromDom($);\r\n const accessibility = skip.has(\"accessibility\") ? EMPTY_ACCESSIBILITY : checkAccessibilityFromDom($);\r\n const images = skip.has(\"images\") ? EMPTY_IMAGES : analyzeImagesFromDom($);\r\n const inboxPreview = skip.has(\"inboxPreview\") ? EMPTY_INBOX_PREVIEW : extractInboxPreviewFromDom($);\r\n const size = skip.has(\"size\") ? EMPTY_SIZE : checkSizeFromDom($, html);\r\n const templateVariables = skip.has(\"templateVariables\") ? EMPTY_TEMPLATE : checkTemplateVariablesFromDom($);\r\n\r\n return { compatibility: { warnings, scores }, spam, links, accessibility, images, inboxPreview, size, templateVariables };\r\n },\r\n\r\n analyze() {\r\n return analyzeEmailFromDom($, framework);\r\n },\r\n\r\n score(warnings) {\r\n return generateCompatibilityScore(warnings);\r\n },\r\n\r\n analyzeSpam(opts) {\r\n return analyzeSpamFromDom($, opts);\r\n },\r\n\r\n validateLinks() {\r\n return validateLinksFromDom($);\r\n },\r\n\r\n checkAccessibility() {\r\n return checkAccessibilityFromDom($);\r\n },\r\n\r\n analyzeImages() {\r\n return analyzeImagesFromDom($);\r\n },\r\n\r\n extractInboxPreview() {\r\n return extractInboxPreviewFromDom($);\r\n },\r\n\r\n checkSize() {\r\n return checkSizeFromDom($, html);\r\n },\r\n\r\n checkTemplateVariables() {\r\n return checkTemplateVariablesFromDom($);\r\n },\r\n\r\n // Transforms create isolated copies since they mutate the DOM\r\n transformForClient(clientId) {\r\n return transformForClient(html, clientId, framework);\r\n },\r\n\r\n transformForAllClients() {\r\n return transformForAllClients(html, framework);\r\n },\r\n\r\n simulateDarkMode(clientId) {\r\n return simulateDarkMode(html, clientId);\r\n },\r\n };\r\n}\r\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,4BAA4B,oBAAI,IAAI;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,wBAAwB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,IAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO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","names":["cheerio","csstree","closeIdx","_","cheerio","csstree","value","cheerio","csstree","cheerio","cheerio","cheerio","cheerio","cheerio","_","cheerio","cheerio","cheerio","cheerio","walk","cheerio"]}
|