@clay-design-system/email 0.2.4 → 0.3.1

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.
Files changed (195) hide show
  1. package/MIGRATION.md +31 -0
  2. package/README.md +7 -0
  3. package/dist/build/catalog.d.ts +0 -1
  4. package/dist/generated/email-tokens.d.ts +0 -1
  5. package/dist/generated/email-tokens.js +0 -1
  6. package/dist/index.d.ts +1 -2
  7. package/dist/index.js +0 -1
  8. package/package.json +14 -5
  9. package/dist/build/asset-scoring.d.ts +0 -48
  10. package/dist/build/asset-scoring.d.ts.map +0 -1
  11. package/dist/build/asset-scoring.js +0 -58
  12. package/dist/build/asset-scoring.js.map +0 -1
  13. package/dist/build/braze-transform.d.ts +0 -20
  14. package/dist/build/braze-transform.d.ts.map +0 -1
  15. package/dist/build/braze-transform.js +0 -26
  16. package/dist/build/braze-transform.js.map +0 -1
  17. package/dist/build/catalog.d.ts.map +0 -1
  18. package/dist/build/catalog.js +0 -3
  19. package/dist/build/catalog.js.map +0 -1
  20. package/dist/build/cloudinary-env.d.ts +0 -15
  21. package/dist/build/cloudinary-env.d.ts.map +0 -1
  22. package/dist/build/cloudinary-env.js +0 -36
  23. package/dist/build/cloudinary-env.js.map +0 -1
  24. package/dist/build/cloudinary-manifest.d.ts +0 -33
  25. package/dist/build/cloudinary-manifest.d.ts.map +0 -1
  26. package/dist/build/cloudinary-manifest.js +0 -36
  27. package/dist/build/cloudinary-manifest.js.map +0 -1
  28. package/dist/build/compile.d.ts +0 -11
  29. package/dist/build/compile.d.ts.map +0 -1
  30. package/dist/build/compile.js +0 -234
  31. package/dist/build/compile.js.map +0 -1
  32. package/dist/build/email-config.d.ts +0 -26
  33. package/dist/build/email-config.d.ts.map +0 -1
  34. package/dist/build/email-config.js +0 -17
  35. package/dist/build/email-config.js.map +0 -1
  36. package/dist/build/email-list.d.ts +0 -6
  37. package/dist/build/email-list.d.ts.map +0 -1
  38. package/dist/build/email-list.js +0 -17
  39. package/dist/build/email-list.js.map +0 -1
  40. package/dist/build/email-tree.d.ts +0 -23
  41. package/dist/build/email-tree.d.ts.map +0 -1
  42. package/dist/build/email-tree.js +0 -46
  43. package/dist/build/email-tree.js.map +0 -1
  44. package/dist/build/export-braze.d.ts +0 -22
  45. package/dist/build/export-braze.d.ts.map +0 -1
  46. package/dist/build/export-braze.js +0 -92
  47. package/dist/build/export-braze.js.map +0 -1
  48. package/dist/build/generate-stock-library-map.d.ts +0 -13
  49. package/dist/build/generate-stock-library-map.d.ts.map +0 -1
  50. package/dist/build/generate-stock-library-map.js +0 -202
  51. package/dist/build/generate-stock-library-map.js.map +0 -1
  52. package/dist/build/icon-registry-map.d.ts +0 -34
  53. package/dist/build/icon-registry-map.d.ts.map +0 -1
  54. package/dist/build/icon-registry-map.js +0 -44
  55. package/dist/build/icon-registry-map.js.map +0 -1
  56. package/dist/build/import-examples.d.ts +0 -14
  57. package/dist/build/import-examples.d.ts.map +0 -1
  58. package/dist/build/import-examples.js +0 -65
  59. package/dist/build/import-examples.js.map +0 -1
  60. package/dist/build/persona-character-map.d.ts +0 -32
  61. package/dist/build/persona-character-map.d.ts.map +0 -1
  62. package/dist/build/persona-character-map.js +0 -90
  63. package/dist/build/persona-character-map.js.map +0 -1
  64. package/dist/build/placeholder.d.ts +0 -79
  65. package/dist/build/placeholder.d.ts.map +0 -1
  66. package/dist/build/placeholder.js +0 -148
  67. package/dist/build/placeholder.js.map +0 -1
  68. package/dist/build/stock-library-map.d.ts +0 -57
  69. package/dist/build/stock-library-map.d.ts.map +0 -1
  70. package/dist/build/stock-library-map.js +0 -1261
  71. package/dist/build/stock-library-map.js.map +0 -1
  72. package/dist/build/upload-assets.d.ts +0 -20
  73. package/dist/build/upload-assets.d.ts.map +0 -1
  74. package/dist/build/upload-assets.js +0 -153
  75. package/dist/build/upload-assets.js.map +0 -1
  76. package/dist/build/upload-library-assets.d.ts +0 -21
  77. package/dist/build/upload-library-assets.d.ts.map +0 -1
  78. package/dist/build/upload-library-assets.js +0 -182
  79. package/dist/build/upload-library-assets.js.map +0 -1
  80. package/dist/build/visual-resolver.d.ts +0 -87
  81. package/dist/build/visual-resolver.d.ts.map +0 -1
  82. package/dist/build/visual-resolver.js +0 -439
  83. package/dist/build/visual-resolver.js.map +0 -1
  84. package/dist/examples/manifest.d.ts +0 -21
  85. package/dist/examples/manifest.d.ts.map +0 -1
  86. package/dist/examples/manifest.js +0 -84
  87. package/dist/examples/manifest.js.map +0 -1
  88. package/dist/exports/contact-sales/Images/Contact_sales_Image_16f4175c-d08c-43f6-9d4c-a0606383271d.png +0 -0
  89. package/dist/exports/contact-sales/Images/Contact_sales_Image_659b3091-1da9-40c2-86b0-04250982e529.png +0 -0
  90. package/dist/exports/contact-sales/Images/Contact_sales_Image_79c651f4-5f0f-4a7f-8354-1f6f95ae86d9.png +0 -0
  91. package/dist/exports/contact-sales/index.braze.html +0 -837
  92. package/dist/exports/contact-sales/index.html +0 -837
  93. package/dist/exports/event-confirmation/Images/Confirmation_Image_11938de2-4161-4ae8-8969-90ea0d8b45cb.png +0 -0
  94. package/dist/exports/event-confirmation/Images/Confirmation_Image_3c52e81f-5d4f-452c-bad1-0471a27598f1.png +0 -0
  95. package/dist/exports/event-confirmation/Images/Confirmation_Image_3ec1fec8-bf46-4068-8835-633567a715f9.png +0 -0
  96. package/dist/exports/event-confirmation/Images/Confirmation_Image_c4980c01-c270-4384-a56c-0bae74814cf9.png +0 -0
  97. package/dist/exports/event-confirmation/Images/Confirmation_Image_cde93e8c-0f96-434d-acaf-1b86503c66f0.png +0 -0
  98. package/dist/exports/event-confirmation/index.braze.html +0 -1055
  99. package/dist/exports/event-confirmation/index.html +0 -1055
  100. package/dist/exports/legal-update/Images/v2_Image_07bbcc13-0ab8-46e4-ab94-98f215f85f69.png +0 -0
  101. package/dist/exports/legal-update/Images/v2_Image_34394d50-acdf-4375-b254-eef1f84aaacb.png +0 -0
  102. package/dist/exports/legal-update/Images/v2_Image_4a25f2bd-6270-439b-86c5-4a968a1b104f.png +0 -0
  103. package/dist/exports/legal-update/Images/v2_Image_7e8e814f-3112-4d8c-af5b-4f4616d84d9c.png +0 -0
  104. package/dist/exports/legal-update/Images/v2_Image_b24a04c8-4af0-42a1-be0f-cd3f66595e47.png +0 -0
  105. package/dist/exports/legal-update/Images/v2_Image_b709b9fb-836e-4c20-82e5-a9cb9d702392.png +0 -0
  106. package/dist/exports/legal-update/Images/v2_Image_ed7b924b-35e6-4536-be0c-92ddc8a34fc2.png +0 -0
  107. package/dist/exports/legal-update/index.braze.html +0 -1731
  108. package/dist/exports/legal-update/index.html +0 -1731
  109. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_09be22f6-1f30-4c58-bf33-1df0494b8fc2.png +0 -0
  110. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_2dfb595e-6fe2-4e6e-a73a-942a085b38ab.png +0 -0
  111. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_544c971b-b4b5-4c89-a25a-8f0d92644009.png +0 -0
  112. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_5b6a9576-1c33-40c5-81e3-637514fb6c78.png +0 -0
  113. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_680c6193-793a-4a24-8288-4bb4046f4f5e.png +0 -0
  114. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_75818ba9-026a-45d7-91e4-f992d4ee7690.png +0 -0
  115. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_785f18e6-816d-44d1-8efb-ecc82510b540.png +0 -0
  116. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_8bf9141d-9d63-4601-9e81-5c9d726e17f8.png +0 -0
  117. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_9097d6e0-65d0-4237-9661-963751812786.png +0 -0
  118. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_a4ef2f53-2eaf-438a-bfef-61455ac0915e.png +0 -0
  119. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_b7748f87-a7b7-4a91-981a-16567683e4b4.png +0 -0
  120. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_bc9830a4-2911-4768-808a-32cbbc39215e.png +0 -0
  121. package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_ef0e8e92-9075-43a9-991f-09a77ef6d6d4.png +0 -0
  122. package/dist/exports/newsletter/index.braze.html +0 -125
  123. package/dist/exports/newsletter/index.html +0 -125
  124. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-blocks.png +0 -0
  125. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-hero-mcp.png +0 -0
  126. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-magic.png +0 -0
  127. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-mcp.png +0 -0
  128. package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-portfolio.png +0 -0
  129. package/dist/exports/newsletter-ai-june-july/index.braze.html +0 -1640
  130. package/dist/exports/newsletter-ai-june-july/index.html +0 -1640
  131. package/dist/exports/survey/Images/EmailLove_Image_3b6f4a6f-7f5f-418b-be71-9371b25c20ce.png +0 -0
  132. package/dist/exports/survey/Images/EmailLove_Image_f659c728-2401-485d-8d90-98c962d28c0c.png +0 -0
  133. package/dist/exports/survey/index.braze.html +0 -515
  134. package/dist/exports/survey/index.html +0 -515
  135. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_115ccc58-a47f-4eca-a1f2-c0d86e1e1cf4.png +0 -0
  136. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_aec4d0d3-6057-4b8a-8d8f-46fbd024f182.png +0 -0
  137. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_d139966a-6051-4383-bf8f-1e5138e1b030.png +0 -0
  138. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_080fa361-a3f2-4593-9ac0-03cf3a7972ff.png +0 -0
  139. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_5ebade34-8f1d-4c2c-9d27-5f9e843ce502.png +0 -0
  140. package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_aa5e4144-9ec8-4525-b01e-077d72f0bab6.png +0 -0
  141. package/dist/exports/trial-01-welcome/index.braze.html +0 -941
  142. package/dist/exports/trial-01-welcome/index.html +0 -941
  143. package/dist/exports/trial-02/Images/tp2_Image_5b0d9bc4-2e38-4252-8f20-d9f27d471c21.png +0 -0
  144. package/dist/exports/trial-02/Images/tp2_Image_b3f77c7c-cc8e-4db8-a5d9-072f4f621e72.png +0 -0
  145. package/dist/exports/trial-02/Images/tp2_Image_cafd1a17-1915-47cd-80f2-1c2d0b133cfe.png +0 -0
  146. package/dist/exports/trial-02/index.braze.html +0 -923
  147. package/dist/exports/trial-02/index.html +0 -923
  148. package/dist/exports/trial-03/Images/tp3_Image_1b96630c-fc4d-4aec-91fb-3c1d4d8544b3.png +0 -0
  149. package/dist/exports/trial-03/Images/tp3_Image_58f3a342-2193-4b5c-b30a-96f7f3338dd8.png +0 -0
  150. package/dist/exports/trial-03/Images/tp3_Image_6c4f307a-bac2-40e7-b4f1-9aa623c9eb8e.png +0 -0
  151. package/dist/exports/trial-03/Images/tp3_Image_848917ce-3f89-4538-a826-558b21f5fea7.png +0 -0
  152. package/dist/exports/trial-03/Images/tp3_Image_aae8410f-556f-4fb9-88f9-f276d75bafd2.png +0 -0
  153. package/dist/exports/trial-03/Images/tp3_Image_b4d5be39-509e-4f22-9601-dd070e4c6561.png +0 -0
  154. package/dist/exports/trial-03/index.braze.html +0 -1129
  155. package/dist/exports/trial-03/index.html +0 -1129
  156. package/dist/exports/trial-04/Images/tp4_Image_03bd5a56-25e3-4dcc-bef5-143bf12312d5.png +0 -0
  157. package/dist/exports/trial-04/Images/tp4_Image_0facbfca-b735-4199-a0d9-05a59341a1e3.gif +0 -0
  158. package/dist/exports/trial-04/Images/tp4_Image_171cee5f-cd3d-42f0-a180-995893d3742a.png +0 -0
  159. package/dist/exports/trial-04/Images/tp4_Image_3509d89d-1825-4817-8c1e-130fa294d0e1.png +0 -0
  160. package/dist/exports/trial-04/Images/tp4_Image_763a0f40-2985-4140-859b-ddd34f20a520.png +0 -0
  161. package/dist/exports/trial-04/Images/tp4_Image_cc2db4f5-b41d-45d7-a798-7a79e7b8d4d8.png +0 -0
  162. package/dist/exports/trial-04/index.braze.html +0 -885
  163. package/dist/exports/trial-04/index.html +0 -885
  164. package/dist/exports/trial-05/Images/tp5_Image_0248a517-5c60-4e84-ad1c-449dcf4f6a64.png +0 -0
  165. package/dist/exports/trial-05/Images/tp5_Image_4c1a2d5a-47d3-4801-bb3a-01c22decc108.png +0 -0
  166. package/dist/exports/trial-05/Images/tp5_Image_63ae77e7-cec7-4b4a-91e0-603b5a80929f.png +0 -0
  167. package/dist/exports/trial-05/Images/tp5_Image_7aa43530-6707-4308-ab0e-e4c38fc1b77d.png +0 -0
  168. package/dist/exports/trial-05/Images/tp5_Image_7efe5b6d-b360-4179-bee1-72908ba569bc.png +0 -0
  169. package/dist/exports/trial-05/Images/tp5_Image_b142bd84-c40a-4a29-b9d5-715b52fdd937.png +0 -0
  170. package/dist/exports/trial-05/Images/tp5_Image_c0c896ea-5b68-4f58-9e27-cdb4a1f1b438.png +0 -0
  171. package/dist/exports/trial-05/index.braze.html +0 -1023
  172. package/dist/exports/trial-05/index.html +0 -1023
  173. package/dist/exports/trial-06/Images/tp6_Image_2267a268-8a80-4e0d-8813-d4c75dbab6f2.png +0 -0
  174. package/dist/exports/trial-06/Images/tp6_Image_637a97b7-837e-478d-8ed1-6e8c2739fdc7.png +0 -0
  175. package/dist/exports/trial-06/Images/tp6_Image_a78df270-ad6f-41e6-8822-ba8ec38313a3.png +0 -0
  176. package/dist/exports/trial-06/index.braze.html +0 -773
  177. package/dist/exports/trial-06/index.html +0 -773
  178. package/dist/exports/winback/Images/_managers_Image_4587ac22-460c-487a-bc37-9dbc487e95a4.png +0 -0
  179. package/dist/exports/winback/Images/_managers_Image_8a77ec2c-ed49-480d-a1a1-7a38abad232a.png +0 -0
  180. package/dist/exports/winback/Images/_managers_Image_bb643775-8a2f-4e28-9dfb-6d1838c3561f.png +0 -0
  181. package/dist/exports/winback/Images/_managers_Image_f7d1bca5-0fcb-4d4c-abcd-40ce2d453b07.png +0 -0
  182. package/dist/exports/winback/index.braze.html +0 -605
  183. package/dist/exports/winback/index.html +0 -605
  184. package/dist/generated/email-tokens.d.ts.map +0 -1
  185. package/dist/generated/email-tokens.js.map +0 -1
  186. package/dist/index.d.ts.map +0 -1
  187. package/dist/index.js.map +0 -1
  188. package/dist/tokens/build-email-assets.d.ts +0 -19
  189. package/dist/tokens/build-email-assets.d.ts.map +0 -1
  190. package/dist/tokens/build-email-assets.js +0 -186
  191. package/dist/tokens/build-email-assets.js.map +0 -1
  192. package/dist/tokens/build-email-tokens.d.ts +0 -17
  193. package/dist/tokens/build-email-tokens.d.ts.map +0 -1
  194. package/dist/tokens/build-email-tokens.js +0 -229
  195. package/dist/tokens/build-email-tokens.js.map +0 -1
@@ -1,19 +0,0 @@
1
- /**
2
- * Email asset bridge — recolors real Clay/monday foundation assets with foundation TOKEN colors and
3
- * writes them as SVG files to src/assets/icons/ and src/assets/logos/.
4
- *
5
- * Sections generated (MJML references relative SVG paths, no base64):
6
- * - src/sections/logo-header/logo-header.mjml (monday.com wordmark, light + dark)
7
- * - src/sections/icon-feature-list/icon-feature-list.mjml (Clay icons, iris-brand recolored)
8
- * - src/sections/list-icon-items/list-icon-items.mjml (Clay icons, iris-brand recolored)
9
- * - src/sections/header/header.mjml (product logo, light + dark)
10
- *
11
- * Asset files written:
12
- * src/assets/icons/ ← recolored Clay line icons (SVG, currentColor → brand #6161ff)
13
- * src/assets/logos/ ← monday wordmark + product logos (SVG, light + dark variants)
14
- * src/assets/*.png ← raster image placeholders (committed separately, not touched here)
15
- *
16
- * Run via `pnpm --filter @clay-design-system/email build` (before compile step).
17
- */
18
- export {};
19
- //# sourceMappingURL=build-email-assets.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-email-assets.d.ts","sourceRoot":"","sources":["../../src/tokens/build-email-assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,186 +0,0 @@
1
- /**
2
- * Email asset bridge — recolors real Clay/monday foundation assets with foundation TOKEN colors and
3
- * writes them as SVG files to src/assets/icons/ and src/assets/logos/.
4
- *
5
- * Sections generated (MJML references relative SVG paths, no base64):
6
- * - src/sections/logo-header/logo-header.mjml (monday.com wordmark, light + dark)
7
- * - src/sections/icon-feature-list/icon-feature-list.mjml (Clay icons, iris-brand recolored)
8
- * - src/sections/list-icon-items/list-icon-items.mjml (Clay icons, iris-brand recolored)
9
- * - src/sections/header/header.mjml (product logo, light + dark)
10
- *
11
- * Asset files written:
12
- * src/assets/icons/ ← recolored Clay line icons (SVG, currentColor → brand #6161ff)
13
- * src/assets/logos/ ← monday wordmark + product logos (SVG, light + dark variants)
14
- * src/assets/*.png ← raster image placeholders (committed separately, not touched here)
15
- *
16
- * Run via `pnpm --filter @clay-design-system/email build` (before compile step).
17
- */
18
- import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync } from 'node:fs';
19
- import { resolve, dirname, join } from 'node:path';
20
- import { fileURLToPath } from 'node:url';
21
- import * as tokens from '@clay-design-system/tokens';
22
- const __dirname = dirname(fileURLToPath(import.meta.url));
23
- const emailSrc = resolve(__dirname, '..');
24
- const reactSrc = resolve(emailSrc, '..', '..', 'react', 'src');
25
- const assetsIcons = resolve(emailSrc, 'assets', 'icons');
26
- const assetsLogos = resolve(emailSrc, 'assets', 'logos');
27
- const emailsDir = resolve(emailSrc, 'emails');
28
- mkdirSync(assetsIcons, { recursive: true });
29
- mkdirSync(assetsLogos, { recursive: true });
30
- // Foundation token colors — single source of truth for asset coloring.
31
- const onDark = tokens.ClayColorTextOnDark; // #ffffff (dark-mode text/logos)
32
- const brand = tokens.ClayColorBackgroundBrandDefault; // #6161ff (icons, iris)
33
- const BANNER = 'GENERATED by src/tokens/build-email-assets.ts — do not edit. Real DS assets recolored via foundation tokens.';
34
- // ── Helpers ──────────────────────────────────────────────────────────────────
35
- /**
36
- * Recolor a Clay icon SVG (currentColor → color), write to assets/icons/<name>.svg,
37
- * and return the relative src path for use in MJML.
38
- */
39
- const writeIconSvg = (name, color) => {
40
- const svg = readFileSync(resolve(reactSrc, 'icons', 'svg', `${name}.svg`), 'utf-8');
41
- writeFileSync(resolve(assetsIcons, `${name}.svg`), svg.replace(/currentColor/g, color));
42
- return `../../assets/icons/${name}.svg`;
43
- };
44
- /**
45
- * Write a logo SVG to assets/logos/<filename> and return the relative src path.
46
- */
47
- const writeLogoSvg = (content, filename) => {
48
- writeFileSync(resolve(assetsLogos, filename), content);
49
- return `../../assets/logos/${filename}`;
50
- };
51
- // ── monday.com wordmark ───────────────────────────────────────────────────────
52
- // Master logo: colored symbol (#00BA5F / #FB275D / #FFCC00) + grey-900 (#17181C) wordmark text.
53
- // Light variant = as-is. Dark variant = recolor wordmark text to white only.
54
- const wordmarkSrc = resolve(reactSrc, 'logos', 'products', 'monday-com', 'Layout=Master, Type Color=Black, Com=On.svg');
55
- const wordmark = readFileSync(wordmarkSrc, 'utf-8');
56
- const logoLightSrc = writeLogoSvg(wordmark, 'wordmark-light.svg');
57
- const logoDarkSrc = writeLogoSvg(wordmark.replace(/#17181[cC]/g, onDark), 'wordmark-dark.svg');
58
- const logoHeader = `<!-- ${BANNER} -->
59
- <mj-section padding="24px 40px">
60
- <mj-column>
61
- <mj-image css-class="ll" width="150px" align="center" padding="0" alt="monday.com" src="${logoLightSrc}" />
62
- <mj-image css-class="dl" width="150px" align="center" padding="0" alt="monday.com" src="${logoDarkSrc}" />
63
- </mj-column>
64
- </mj-section>
65
- `;
66
- writeFileSync(resolve(emailSrc, 'sections', 'logo-header', 'logo-header.mjml'), logoHeader);
67
- // ── icon-feature-list ─────────────────────────────────────────────────────────
68
- const featureRows = [
69
- { icon: 'download-01', title: 'Extract key details', desc: 'Automatically pull important information from emails, documents, or updates into your boards.' },
70
- { icon: 'file-02', title: 'Categorize effortlessly', desc: 'Let AI sort and label tasks based on urgency, sentiment, or topic.' },
71
- { icon: 'align-left', title: 'Summarize updates', desc: 'Quickly get the gist of lengthy updates or threads without reading every detail.' },
72
- ];
73
- const iconFeatureRow = (r) => {
74
- const src = writeIconSvg(r.icon, brand);
75
- return ` <mj-section padding="8px 40px">
76
- <mj-column width="44px" vertical-align="top">
77
- <mj-image src="${src}" width="24px" align="left" padding="0" alt="" />
78
- </mj-column>
79
- <mj-column vertical-align="top">
80
- <mj-text mj-class="clay-h5" css-class="email-text">${r.title}</mj-text>
81
- <mj-spacer height="4px" />
82
- <mj-text mj-class="clay-p1" css-class="email-text">${r.desc}</mj-text>
83
- </mj-column>
84
- </mj-section>`;
85
- };
86
- const iconList = `<!-- ${BANNER} -->
87
- ${featureRows.map(iconFeatureRow).join('\n')}
88
- `;
89
- writeFileSync(resolve(emailSrc, 'sections', 'icon-feature-list', 'icon-feature-list.mjml'), iconList);
90
- // ── list-icon-items ───────────────────────────────────────────────────────────
91
- const listRows = [
92
- { icon: 'check-done-01', title: 'Stay on top of every task', desc: 'Assign owners, set due dates, and track status — all in one place, so nothing slips through.' },
93
- { icon: 'users-01', title: 'Collaborate across teams', desc: 'Share boards with anyone, invite guests, and keep every stakeholder in the loop without extra tools.' },
94
- { icon: 'lightning-01', title: 'Automate the repetitive stuff', desc: 'Build no-code workflows that move items, send alerts, and update fields the moment conditions are met.' },
95
- { icon: 'eye', title: 'Get full visibility in real time', desc: 'Dashboards and live reports surface blockers and progress instantly, so you can act before things stall.' },
96
- ];
97
- const iconListRow = (r, i) => {
98
- const src = writeIconSvg(r.icon, brand);
99
- return ` <mj-section padding="${i === 0 ? '0' : '20px 0 0'}">
100
- <mj-group width="100%">
101
- <mj-column width="7.857143%" vertical-align="top" padding="0">
102
- <mj-image src="${src}" width="24px" align="left" padding="0" alt="" />
103
- </mj-column>
104
- <mj-column width="92.142857%" vertical-align="top" padding-left="8px">
105
- <mj-text mj-class="clay-p2" css-class="email-text"><span style="font-weight:600;">${r.title}</span><br /><span>${r.desc}</span></mj-text>
106
- </mj-column>
107
- </mj-group>
108
- </mj-section>`;
109
- };
110
- const listIconItemsMjml = `<!-- ${BANNER} -->
111
- <!-- list-icon-items — DS icon per row (brand-recolored SVG) aligned top with title + description.
112
- mj-group keeps icon + text inline at ALL viewport sizes (no stacking).
113
- Mobile: H-padding → 24px (email-mobile-px-24 on wrapper). -->
114
- <mj-wrapper padding="24px 40px" background-color="#ffffff" css-class="email-card email-mobile-px-24">
115
- ${listRows.map(iconListRow).join('\n')}
116
- </mj-wrapper>
117
- `;
118
- mkdirSync(resolve(emailSrc, 'sections', 'list-icon-items'), { recursive: true });
119
- writeFileSync(resolve(emailSrc, 'sections', 'list-icon-items', 'list-icon-items.mjml'), listIconItemsMjml);
120
- const HEADER_LOGO = {
121
- dir: 'monday-com',
122
- alt: 'monday.com',
123
- width: '178px',
124
- lightFile: 'Layout=Master, Type Color=Black, Com=On.svg',
125
- darkFile: 'Layout=Master, Type Color=White, Com=On.svg',
126
- };
127
- const writeProductLogo = (dir, file, outName) => writeLogoSvg(readFileSync(resolve(reactSrc, 'logos', 'products', dir, file), 'utf-8'), outName);
128
- const hlLightSrc = writeProductLogo(HEADER_LOGO.dir, HEADER_LOGO.lightFile, 'product-logo-light.svg');
129
- const hlDarkSrc = writeProductLogo(HEADER_LOGO.dir, HEADER_LOGO.darkFile, 'product-logo-dark.svg');
130
- const headerMjml = `<!-- ${BANNER} -->
131
- <!-- header: one monday product logo, centered. Light: "Type Color=Black" (.ll class).
132
- Dark: "Type Color=White" (.dl class, via @media prefers-color-scheme:dark).
133
- To swap product: edit HEADER_LOGO in build-email-assets.ts and rebuild. -->
134
- <mj-section padding="24px 40px" css-class="email-mobile-px-24">
135
- <mj-column>
136
- <mj-image css-class="ll" alt="${HEADER_LOGO.alt}" width="${HEADER_LOGO.width}" align="center" padding="0" src="${hlLightSrc}" />
137
- <mj-image css-class="dl" alt="${HEADER_LOGO.alt}" width="${HEADER_LOGO.width}" align="center" padding="0" src="${hlDarkSrc}" />
138
- </mj-column>
139
- </mj-section>
140
- `;
141
- mkdirSync(resolve(emailSrc, 'sections', 'header'), { recursive: true });
142
- writeFileSync(resolve(emailSrc, 'sections', 'header', 'header.mjml'), headerMjml);
143
- // ── icons referenced by real composed emails ──────────────────────────────────
144
- // The three generators above only ever write the icons baked into their OWN default example
145
- // content. Any icon a real composed email under src/emails/ actually picks — a different one, per
146
- // campaign — was never copied/recolored here, so compile.ts's inlineAssetsInHtml found no file at
147
- // the resolved path and silently left the raw relative src in the shipped HTML (a real, already-
148
- // shipped bug — confirmed in hr-agent-activation/tp1b-scheduling-library, which references
149
- // search-lg/calendar-check-02/user-check-01, none of which existed in assets/icons/ before this).
150
- // src/emails/ is gitignored local-only output, so this scan is a no-op on a fresh clone until
151
- // someone composes an email — that's correct, there's nothing to generate yet.
152
- function findMjmlFiles(dir) {
153
- if (!existsSync(dir))
154
- return [];
155
- const out = [];
156
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
157
- const full = join(dir, entry.name);
158
- if (entry.isDirectory())
159
- out.push(...findMjmlFiles(full));
160
- else if (entry.name.endsWith('.mjml'))
161
- out.push(full);
162
- }
163
- return out;
164
- }
165
- const referencedIconNames = new Set();
166
- for (const file of findMjmlFiles(emailsDir)) {
167
- const content = readFileSync(file, 'utf-8');
168
- for (const match of content.matchAll(/assets\/icons\/([a-zA-Z0-9_-]+)\.svg/g)) {
169
- referencedIconNames.add(match[1]);
170
- }
171
- }
172
- let missingIcons = 0;
173
- for (const name of referencedIconNames) {
174
- const svgSrc = resolve(reactSrc, 'icons', 'svg', `${name}.svg`);
175
- if (!existsSync(svgSrc)) {
176
- console.warn(`@clay-design-system/email: ⚠ icon "${name}" referenced by a composed email does not exist in the Clay icon registry (packages/react/src/icons/svg/) — its <mj-image> will stay broken until the name is fixed`);
177
- missingIcons++;
178
- continue;
179
- }
180
- writeIconSvg(name, brand);
181
- }
182
- if (referencedIconNames.size > 0) {
183
- console.log(`@clay-design-system/email: ${referencedIconNames.size - missingIcons}/${referencedIconNames.size} composed-email icon(s) recolored from the Clay registry`);
184
- }
185
- console.log('@clay-design-system/email: SVG assets written to src/assets/icons/ + src/assets/logos/ (no base64)');
186
- //# sourceMappingURL=build-email-assets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-email-assets.js","sourceRoot":"","sources":["../../src/tokens/build-email-assets.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Token → email bridge.
3
- *
4
- * Emails cannot use CSS custom properties (`var(--clay-*)`) — Outlook and others strip them. So this
5
- * script reads the RESOLVED LITERAL token values from `@clay-design-system/tokens` (the dist/tokens.js ES export)
6
- * and materializes them into two generated artifacts consumed by the MJML sections:
7
- *
8
- * src/generated/base-head.mjml — <mj-head> fragment: fonts, mj-class roles, dark-mode <mj-style>
9
- * src/generated/email-tokens.ts — inline-able constants + px() helper for section authoring/docs
10
- *
11
- * Both are GENERATED — never edit by hand. `pnpm --filter @clay-design-system/email tokens:check` regenerates
12
- * and fails on drift (mirrors the repo-wide `docs:check` guard).
13
- *
14
- * Run as the first step of the package build (before compile.ts).
15
- */
16
- export {};
17
- //# sourceMappingURL=build-email-tokens.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-email-tokens.d.ts","sourceRoot":"","sources":["../../src/tokens/build-email-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -1,229 +0,0 @@
1
- /**
2
- * Token → email bridge.
3
- *
4
- * Emails cannot use CSS custom properties (`var(--clay-*)`) — Outlook and others strip them. So this
5
- * script reads the RESOLVED LITERAL token values from `@clay-design-system/tokens` (the dist/tokens.js ES export)
6
- * and materializes them into two generated artifacts consumed by the MJML sections:
7
- *
8
- * src/generated/base-head.mjml — <mj-head> fragment: fonts, mj-class roles, dark-mode <mj-style>
9
- * src/generated/email-tokens.ts — inline-able constants + px() helper for section authoring/docs
10
- *
11
- * Both are GENERATED — never edit by hand. `pnpm --filter @clay-design-system/email tokens:check` regenerates
12
- * and fails on drift (mirrors the repo-wide `docs:check` guard).
13
- *
14
- * Run as the first step of the package build (before compile.ts).
15
- */
16
- import { writeFileSync, mkdirSync } from 'node:fs';
17
- import { resolve, dirname } from 'node:path';
18
- import { fileURLToPath } from 'node:url';
19
- import * as tokens from '@clay-design-system/tokens';
20
- const __dirname = dirname(fileURLToPath(import.meta.url));
21
- const generatedDir = resolve(__dirname, '..', 'generated');
22
- mkdirSync(generatedDir, { recursive: true });
23
- /** Unitless number token → px string. Line-heights/weights stay unitless (valid + preferred in email). */
24
- const px = (n) => `${n}px`;
25
- // ── Resolved literals from the foundation (single source of truth) ──────────────────────────────
26
- const color = {
27
- page: tokens.ClayColorBackgroundDefaultSecondary, // #f3f4f5
28
- surface: tokens.ClayColorBackgroundDefaultDefault, // #ffffff
29
- text: tokens.ClayColorTextDefaultDefault, // #252526
30
- textMuted: tokens.ClayColorTextDefaultSecondary, // #45454a (grey-700)
31
- brand: tokens.ClayColorBackgroundBrandDefault, // #6161ff
32
- brandLink: tokens.ClayColorTextBrandDefault, // #6161ff
33
- onBrand: tokens.ClayColorTextOnDark, // #ffffff
34
- // Stone / warm-beige palette (quote cards, warm editorial surfaces)
35
- surfaceWarm: tokens.ClayColorStone100, // #f7f3ea
36
- surfaceWarmBorder: tokens.ClayColorStone200, // #f2e7d6
37
- // dark-mode surfaces (from the grey ramp)
38
- pageDark: tokens.ClayFoundationBrandColorGrey950, // #000000
39
- surfaceDark: tokens.ClayFoundationBrandColorGrey800, // #252526
40
- textDark: tokens.ClayColorTextOnDark, // #ffffff
41
- };
42
- // Lifecycle email type scale — matches Life cycle DS Figma (Heading 1-5, Paragraph 1-4).
43
- // All entries carry an explicit `weight` so email-tokens.ts is self-documenting without inference.
44
- const type = {
45
- family: tokens.ClayEmailTypeFamily,
46
- weightRegular: tokens.ClayEmailTypeWeightRegular,
47
- weightSemi: tokens.ClayEmailTypeWeightSemi,
48
- // Headings h1–h4 shrink on mobile (emaillove @media step-down); h5 and below do not.
49
- h1: { size: px(tokens.ClayEmailTypeH1Size), sizeMobile: px(tokens.ClayEmailTypeH1SizeMobile), weight: tokens.ClayEmailTypeWeightSemi, lineHeight: tokens.ClayEmailTypeH1LineHeight, letterSpacing: px(tokens.ClayEmailTypeH1LetterSpacing) },
50
- h2: { size: px(tokens.ClayEmailTypeH2Size), sizeMobile: px(tokens.ClayEmailTypeH2SizeMobile), weight: tokens.ClayEmailTypeWeightSemi, lineHeight: tokens.ClayEmailTypeH2LineHeight, letterSpacing: px(tokens.ClayEmailTypeH2LetterSpacing) },
51
- h3: { size: px(tokens.ClayEmailTypeH3Size), sizeMobile: px(tokens.ClayEmailTypeH3SizeMobile), weight: tokens.ClayEmailTypeWeightSemi, lineHeight: tokens.ClayEmailTypeH3LineHeight, letterSpacing: px(tokens.ClayEmailTypeH3LetterSpacing) },
52
- h4: { size: px(tokens.ClayEmailTypeH4Size), sizeMobile: px(tokens.ClayEmailTypeH4SizeMobile), weight: tokens.ClayEmailTypeWeightSemi, lineHeight: tokens.ClayEmailTypeH4LineHeight },
53
- h5: { size: px(tokens.ClayEmailTypeH5Size), sizeMobile: px(tokens.ClayEmailTypeH5SizeMobile), weight: tokens.ClayEmailTypeWeightSemi, lineHeight: tokens.ClayEmailTypeH5LineHeight },
54
- p1: { size: px(tokens.ClayEmailTypeP1Size), sizeMobile: px(tokens.ClayEmailTypeP1SizeMobile), weight: tokens.ClayEmailTypeWeightRegular, lineHeight: tokens.ClayEmailTypeP1LineHeight },
55
- p2: { size: px(tokens.ClayEmailTypeP2Size), sizeMobile: px(tokens.ClayEmailTypeP2SizeMobile), weight: tokens.ClayEmailTypeWeightRegular, lineHeight: tokens.ClayEmailTypeP2LineHeight },
56
- p3: { size: px(tokens.ClayEmailTypeP3Size), sizeMobile: px(tokens.ClayEmailTypeP3SizeMobile), weight: tokens.ClayEmailTypeWeightRegular, lineHeight: tokens.ClayEmailTypeP3LineHeight },
57
- p4: { size: px(tokens.ClayEmailTypeP4Size), sizeMobile: px(tokens.ClayEmailTypeP4SizeMobile), weight: tokens.ClayEmailTypeWeightRegular, lineHeight: tokens.ClayEmailTypeP4LineHeight },
58
- button: { size: px(tokens.ClayEmailTypeButtonSize), weight: tokens.ClayEmailTypeButtonWeight, lineHeight: tokens.ClayEmailTypeButtonLineHeight },
59
- };
60
- const layout = {
61
- canvasWidth: 640,
62
- contentWidth: 560,
63
- hPadding: px(tokens.ClaySizeSpace1000), // 40px
64
- sectionY: px(tokens.ClaySizeSpace600), // 24px
65
- gapMd: px(tokens.ClaySizeSpace400), // 16px
66
- gapLg: px(tokens.ClaySizeSpace800), // 32px
67
- cardRadius: px(tokens.ClayRadiusLg), // 16px
68
- pillRadius: px(tokens.ClayRadiusFull), // 9999px
69
- iconSize: px(tokens.ClaySizeSpace600), // 24px
70
- };
71
- // Effects (shadows) — from the foundation effect tokens. Emails are mostly flat; exposed for cards
72
- // that need elevation. Values are already email-safe CSS box-shadow strings.
73
- const effect = {
74
- shadowLight: tokens.ClayEffectShadowLight,
75
- shadowHard: tokens.ClayEffectShadowHard,
76
- };
77
- // The email fallback stack Poppins → system — email clients frequently lack the webfont.
78
- const fontStack = `Poppins, 'Helvetica Neue', Helvetica, Arial, sans-serif`;
79
- const BANNER = 'GENERATED by src/tokens/build-email-tokens.ts — do not edit. Run `pnpm --filter @clay-design-system/email tokens:check`.';
80
- // ── 1. base-head.mjml — an <mj-head> FRAGMENT (included inside the container's <mj-head>) ─────────
81
- const baseHead = `<!-- ${BANNER} -->
82
- <mj-raw>
83
- <meta name="viewport" content="width=device-width, initial-scale=1" />
84
- <meta name="x-apple-disable-message-reformatting" />
85
- <meta name="color-scheme" content="light dark" />
86
- <meta name="supported-color-schemes" content="light dark" />
87
- </mj-raw>
88
- <mj-font name="Poppins" href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap" />
89
-
90
- <mj-attributes>
91
- <mj-all font-family="${fontStack}" />
92
- <mj-text color="${color.text}" font-size="${type.p1.size}" line-height="${type.p1.lineHeight}" padding="0" />
93
- <!-- Lifecycle heading scale (semi-bold default; override font-weight inline for regular variant) -->
94
- <mj-class name="clay-h1" color="${color.text}" font-size="${type.h1.size}" font-weight="${type.weightSemi}" line-height="${type.h1.lineHeight}" letter-spacing="${type.h1.letterSpacing}" />
95
- <mj-class name="clay-h2" color="${color.text}" font-size="${type.h2.size}" font-weight="${type.weightSemi}" line-height="${type.h2.lineHeight}" letter-spacing="${type.h2.letterSpacing}" />
96
- <mj-class name="clay-h3" color="${color.text}" font-size="${type.h3.size}" font-weight="${type.weightSemi}" line-height="${type.h3.lineHeight}" letter-spacing="${type.h3.letterSpacing}" />
97
- <mj-class name="clay-h4" color="${color.text}" font-size="${type.h4.size}" font-weight="${type.weightSemi}" line-height="${type.h4.lineHeight}" />
98
- <mj-class name="clay-h5" color="${color.text}" font-size="${type.h5.size}" font-weight="${type.weightSemi}" line-height="${type.h5.lineHeight}" />
99
- <!-- Lifecycle paragraph scale (regular-weight default) -->
100
- <mj-class name="clay-p1" color="${color.text}" font-size="${type.p1.size}" font-weight="${type.weightRegular}" line-height="${type.p1.lineHeight}" />
101
- <mj-class name="clay-p2" color="${color.text}" font-size="${type.p2.size}" font-weight="${type.weightRegular}" line-height="${type.p2.lineHeight}" />
102
- <mj-class name="clay-p3" color="${color.textMuted}" font-size="${type.p3.size}" font-weight="${type.weightRegular}" line-height="${type.p3.lineHeight}" />
103
- <mj-class name="clay-p4" color="${color.textMuted}" font-size="${type.p4.size}" font-weight="${type.weightRegular}" line-height="${type.p4.lineHeight}" />
104
- <mj-class name="clay-button" background-color="${color.brand}" color="${color.onBrand}" border-radius="${layout.pillRadius}" font-size="${type.button.size}" font-weight="${type.button.weight}" inner-padding="12px 24px" />
105
- </mj-attributes>
106
-
107
- <mj-style>
108
- /* Client resets emaillove ships that MJML omits (Outlook.com line-height, image gaps). */
109
- img { display: block; }
110
- .ExternalClass { width: 100%; }
111
- .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div { line-height: 100%; }
112
- /* Dark-only images hidden in light mode; swapped in the dark block below. */
113
- .dl { display: none; }
114
-
115
- /* Mobile heading step-down — one-notch scale at the DS phone-only breakpoint
116
- @media(max-width:479px) (h1 56→48, h2 48→40, h3 40→32, h4 32→24). Keyed off the clay-h*
117
- css-class on the mj-text td; targets the inner div where MJML places font-size. Desktop
118
- size is the inline fallback if style is dropped. Per production emails, only the primary/
119
- hero heading opts in — add css-class="clay-hN" (alongside mj-class) to the hero heading's
120
- mj-text; secondary content headings keep mj-class alone and stay at desktop size. */
121
- @media only screen and (max-width: 479px) {
122
- .clay-h1 > div { font-size: ${type.h1.sizeMobile} !important; }
123
- .clay-h2 > div { font-size: ${type.h2.sizeMobile} !important; }
124
- .clay-h3 > div { font-size: ${type.h3.sizeMobile} !important; }
125
- .clay-h4 > div { font-size: ${type.h4.sizeMobile} !important; }
126
-
127
- /* Mobile H-padding utilities — apply as css-class on mj-wrapper or mj-section to reduce
128
- the 40px horizontal padding to the source breakpoint value when columns stack (below 480px).
129
- Source: emaillove export mobile CSS (.b98-68 → 24px, .d9b-0c → 16px, .fb5-e8 → 24px).
130
- Targets the outer td MJML generates with inline padding-left/padding-right. */
131
- .email-mobile-px-24 > table > tbody > tr > td { padding-right: 24px !important; padding-left: 24px !important; }
132
- .email-mobile-px-16 > table > tbody > tr > td { padding-right: 16px !important; padding-left: 16px !important; }
133
- .email-mobile-px-0 > table > tbody > tr > td { padding-right: 0 !important; padding-left: 0 !important; }
134
- .email-mobile-pt-0 > table > tbody > tr > td { padding-top: 0 !important; }
135
-
136
- /* Mobile text centering — apply as css-class on mj-text elements whose content should be
137
- center-aligned on mobile (below 480px). Matches the source emaillove .s0>div{text-align:center}.
138
- Targets the inner div MJML wraps text content in. */
139
- .email-mobile-center > div { text-align: center !important; }
140
-
141
- /* Mobile image centering — apply css-class="email-mobile-center-img" on mj-image.
142
- text-align on the td does not reposition its block-level child table (CSS text-align
143
- only affects inline content), so the nested image-wrapper table also needs margin:auto
144
- to actually override the mj-image align="left"/"right" attribute on mobile. */
145
- .email-mobile-center-img { text-align: center !important; }
146
- .email-mobile-center-img > table { margin: 0 auto !important; }
147
-
148
- /* Full-width button on mobile — apply css-class="email-btn-full" to mj-button.
149
- Makes the button's inner table fill the column width and centers it.
150
- Matches emaillove .mj-b-full pattern. */
151
- .email-btn-full > table { width: 100% !important; }
152
- .email-btn-full > table > tbody > tr > td { text-align: center !important; }
153
- }
154
-
155
- /* Left-aligned button content — apply css-class="email-btn-left" to mj-button.
156
- Overrides MJML's default text-align:center on the inner td and anchor so
157
- icon+text rows (e.g. buttons-icons) are left-aligned like the emaillove source. */
158
- .email-btn-left > table > tbody > tr > td { text-align: left !important; }
159
- .email-btn-left > table > tbody > tr > td > a { text-align: left !important; }
160
-
161
- /* Decorative image tilt — apply css-class="email-tilt-1".."email-tilt-4" to mj-image for a
162
- fanned photo-stack look (e.g. an avatar composite row). Webkit/Blink clients rotate the
163
- image; Outlook and other non-supporting clients silently ignore the transform and show the
164
- image unrotated — safe graceful degradation, never a broken layout. */
165
- .email-tilt-1 { transform: rotate(-6deg); }
166
- .email-tilt-2 { transform: rotate(4deg); }
167
- .email-tilt-3 { transform: rotate(-4deg); }
168
- .email-tilt-4 { transform: rotate(6deg); }
169
-
170
- :root { color-scheme: light dark; supported-color-schemes: light dark; }
171
- @media (prefers-color-scheme: dark) {
172
- body, .email-page { background-color: ${color.pageDark} !important; }
173
- /*
174
- * email-card: flip a section or column's background to dark.
175
- *
176
- * Three selectors cover every compiled MJML structure:
177
- * 1. .email-card — the outer div (mj-section or mj-column)
178
- * 2. .email-card > table — the direct child table (mj-section has inline bg here)
179
- * 3. .email-card > table > tbody > tr > td
180
- * — the content td inside mj-column (carries inline bg-color
181
- * + border-radius when background-color is set on mj-column)
182
- *
183
- * Apply css-class="email-card" to any mj-section or mj-column that should
184
- * become dark. Works for grey inner cards (#f3f4f5), coloured panels, etc.
185
- */
186
- .email-card,
187
- .email-card > table,
188
- .email-card > table > tbody > tr > td { background-color: ${color.surfaceDark} !important; }
189
- .email-text, .email-text * { color: ${color.textDark} !important; }
190
- .ll { display: none !important; }
191
- .dl { display: block !important; }
192
- /* Black CTA button invert — apply css-class="email-btn-invert-dark" to invert a black
193
- mj-button to white background + black text in dark mode. Matches emaillove global
194
- .mj-b>td { background-color:#ffffff } pattern for black CTA buttons. */
195
- .email-btn-invert-dark > table > tbody > tr > td { background-color: #ffffff !important; }
196
- .email-btn-invert-dark > table > tbody > tr > td > a { background-color: #ffffff !important; color: #000000 !important; }
197
- }
198
- /* Outlook.com + Gmail-app dark mode — these clients ignore prefers-color-scheme and instead
199
- prefix overridden nodes with data-ogsc (foreground) / data-ogsb (background). */
200
- [data-ogsb] body, [data-ogsb] .email-page { background-color: ${color.pageDark} !important; }
201
- [data-ogsb] .email-card,
202
- [data-ogsb] .email-card > table,
203
- [data-ogsb] .email-card > table > tbody > tr > td { background-color: ${color.surfaceDark} !important; }
204
- [data-ogsc] .email-text, [data-ogsc] .email-text * { color: ${color.textDark} !important; }
205
- </mj-style>
206
- `;
207
- writeFileSync(resolve(generatedDir, 'base-head.mjml'), baseHead);
208
- // ── 2. email-tokens.ts — inline-able constants for section authoring + docs ──────────────────────
209
- const emailTokensTs = `// ${BANNER}
210
- // Inline-able literal token values for MJML email authoring. Emails cannot use var(--clay-*),
211
- // so sections copy these literals. Roles that mj-class carries (clay-h1…h5, clay-p1…p4, clay-button) live in base-head.mjml.
212
-
213
- /** Unitless size/spacing token → px string. */
214
- export const px = (n: number): string => \`\${n}px\`
215
-
216
- export const emailColor = ${JSON.stringify(color, null, 2)} as const
217
-
218
- export const emailType = ${JSON.stringify(type, null, 2)} as const
219
-
220
- export const emailLayout = ${JSON.stringify(layout, null, 2)} as const
221
-
222
- export const emailEffect = ${JSON.stringify(effect, null, 2)} as const
223
-
224
- /** Poppins → system fallback stack (email webfonts are unreliable). */
225
- export const emailFontStack = ${JSON.stringify(fontStack)}
226
- `;
227
- writeFileSync(resolve(generatedDir, 'email-tokens.ts'), emailTokensTs);
228
- console.log('@clay-design-system/email: token bridge generated (base-head.mjml + email-tokens.ts)');
229
- //# sourceMappingURL=build-email-tokens.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"build-email-tokens.js","sourceRoot":"","sources":["../../src/tokens/build-email-tokens.ts"],"names":[],"mappings":"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"}