@clay-design-system/email 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +31 -0
- package/README.md +7 -0
- package/dist/build/catalog.d.ts +0 -1
- package/dist/generated/email-tokens.d.ts +0 -1
- package/dist/generated/email-tokens.js +0 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.js +0 -1
- package/package.json +14 -5
- package/dist/build/asset-scoring.d.ts +0 -48
- package/dist/build/asset-scoring.d.ts.map +0 -1
- package/dist/build/asset-scoring.js +0 -58
- package/dist/build/asset-scoring.js.map +0 -1
- package/dist/build/braze-transform.d.ts +0 -20
- package/dist/build/braze-transform.d.ts.map +0 -1
- package/dist/build/braze-transform.js +0 -26
- package/dist/build/braze-transform.js.map +0 -1
- package/dist/build/catalog.d.ts.map +0 -1
- package/dist/build/catalog.js +0 -3
- package/dist/build/catalog.js.map +0 -1
- package/dist/build/cloudinary-env.d.ts +0 -15
- package/dist/build/cloudinary-env.d.ts.map +0 -1
- package/dist/build/cloudinary-env.js +0 -36
- package/dist/build/cloudinary-env.js.map +0 -1
- package/dist/build/cloudinary-manifest.d.ts +0 -33
- package/dist/build/cloudinary-manifest.d.ts.map +0 -1
- package/dist/build/cloudinary-manifest.js +0 -36
- package/dist/build/cloudinary-manifest.js.map +0 -1
- package/dist/build/compile.d.ts +0 -11
- package/dist/build/compile.d.ts.map +0 -1
- package/dist/build/compile.js +0 -234
- package/dist/build/compile.js.map +0 -1
- package/dist/build/email-config.d.ts +0 -26
- package/dist/build/email-config.d.ts.map +0 -1
- package/dist/build/email-config.js +0 -17
- package/dist/build/email-config.js.map +0 -1
- package/dist/build/email-list.d.ts +0 -6
- package/dist/build/email-list.d.ts.map +0 -1
- package/dist/build/email-list.js +0 -17
- package/dist/build/email-list.js.map +0 -1
- package/dist/build/email-tree.d.ts +0 -23
- package/dist/build/email-tree.d.ts.map +0 -1
- package/dist/build/email-tree.js +0 -46
- package/dist/build/email-tree.js.map +0 -1
- package/dist/build/export-braze.d.ts +0 -22
- package/dist/build/export-braze.d.ts.map +0 -1
- package/dist/build/export-braze.js +0 -92
- package/dist/build/export-braze.js.map +0 -1
- package/dist/build/generate-stock-library-map.d.ts +0 -13
- package/dist/build/generate-stock-library-map.d.ts.map +0 -1
- package/dist/build/generate-stock-library-map.js +0 -202
- package/dist/build/generate-stock-library-map.js.map +0 -1
- package/dist/build/icon-registry-map.d.ts +0 -34
- package/dist/build/icon-registry-map.d.ts.map +0 -1
- package/dist/build/icon-registry-map.js +0 -44
- package/dist/build/icon-registry-map.js.map +0 -1
- package/dist/build/import-examples.d.ts +0 -14
- package/dist/build/import-examples.d.ts.map +0 -1
- package/dist/build/import-examples.js +0 -65
- package/dist/build/import-examples.js.map +0 -1
- package/dist/build/persona-character-map.d.ts +0 -32
- package/dist/build/persona-character-map.d.ts.map +0 -1
- package/dist/build/persona-character-map.js +0 -90
- package/dist/build/persona-character-map.js.map +0 -1
- package/dist/build/placeholder.d.ts +0 -79
- package/dist/build/placeholder.d.ts.map +0 -1
- package/dist/build/placeholder.js +0 -148
- package/dist/build/placeholder.js.map +0 -1
- package/dist/build/stock-library-map.d.ts +0 -57
- package/dist/build/stock-library-map.d.ts.map +0 -1
- package/dist/build/stock-library-map.js +0 -1261
- package/dist/build/stock-library-map.js.map +0 -1
- package/dist/build/upload-assets.d.ts +0 -20
- package/dist/build/upload-assets.d.ts.map +0 -1
- package/dist/build/upload-assets.js +0 -153
- package/dist/build/upload-assets.js.map +0 -1
- package/dist/build/upload-library-assets.d.ts +0 -21
- package/dist/build/upload-library-assets.d.ts.map +0 -1
- package/dist/build/upload-library-assets.js +0 -182
- package/dist/build/upload-library-assets.js.map +0 -1
- package/dist/build/visual-resolver.d.ts +0 -87
- package/dist/build/visual-resolver.d.ts.map +0 -1
- package/dist/build/visual-resolver.js +0 -439
- package/dist/build/visual-resolver.js.map +0 -1
- package/dist/examples/manifest.d.ts +0 -21
- package/dist/examples/manifest.d.ts.map +0 -1
- package/dist/examples/manifest.js +0 -84
- package/dist/examples/manifest.js.map +0 -1
- package/dist/exports/contact-sales/Images/Contact_sales_Image_16f4175c-d08c-43f6-9d4c-a0606383271d.png +0 -0
- package/dist/exports/contact-sales/Images/Contact_sales_Image_659b3091-1da9-40c2-86b0-04250982e529.png +0 -0
- package/dist/exports/contact-sales/Images/Contact_sales_Image_79c651f4-5f0f-4a7f-8354-1f6f95ae86d9.png +0 -0
- package/dist/exports/contact-sales/index.braze.html +0 -837
- package/dist/exports/contact-sales/index.html +0 -837
- package/dist/exports/event-confirmation/Images/Confirmation_Image_11938de2-4161-4ae8-8969-90ea0d8b45cb.png +0 -0
- package/dist/exports/event-confirmation/Images/Confirmation_Image_3c52e81f-5d4f-452c-bad1-0471a27598f1.png +0 -0
- package/dist/exports/event-confirmation/Images/Confirmation_Image_3ec1fec8-bf46-4068-8835-633567a715f9.png +0 -0
- package/dist/exports/event-confirmation/Images/Confirmation_Image_c4980c01-c270-4384-a56c-0bae74814cf9.png +0 -0
- package/dist/exports/event-confirmation/Images/Confirmation_Image_cde93e8c-0f96-434d-acaf-1b86503c66f0.png +0 -0
- package/dist/exports/event-confirmation/index.braze.html +0 -1055
- package/dist/exports/event-confirmation/index.html +0 -1055
- package/dist/exports/legal-update/Images/v2_Image_07bbcc13-0ab8-46e4-ab94-98f215f85f69.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_34394d50-acdf-4375-b254-eef1f84aaacb.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_4a25f2bd-6270-439b-86c5-4a968a1b104f.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_7e8e814f-3112-4d8c-af5b-4f4616d84d9c.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_b24a04c8-4af0-42a1-be0f-cd3f66595e47.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_b709b9fb-836e-4c20-82e5-a9cb9d702392.png +0 -0
- package/dist/exports/legal-update/Images/v2_Image_ed7b924b-35e6-4536-be0c-92ddc8a34fc2.png +0 -0
- package/dist/exports/legal-update/index.braze.html +0 -1731
- package/dist/exports/legal-update/index.html +0 -1731
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_09be22f6-1f30-4c58-bf33-1df0494b8fc2.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_2dfb595e-6fe2-4e6e-a73a-942a085b38ab.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_544c971b-b4b5-4c89-a25a-8f0d92644009.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_5b6a9576-1c33-40c5-81e3-637514fb6c78.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_680c6193-793a-4a24-8288-4bb4046f4f5e.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_75818ba9-026a-45d7-91e4-f992d4ee7690.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_785f18e6-816d-44d1-8efb-ecc82510b540.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_8bf9141d-9d63-4601-9e81-5c9d726e17f8.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_9097d6e0-65d0-4237-9661-963751812786.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_a4ef2f53-2eaf-438a-bfef-61455ac0915e.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_b7748f87-a7b7-4a91-981a-16567683e4b4.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_bc9830a4-2911-4768-808a-32cbbc39215e.png +0 -0
- package/dist/exports/newsletter/Images/Status_update_-_July_26_Image_ef0e8e92-9075-43a9-991f-09a77ef6d6d4.png +0 -0
- package/dist/exports/newsletter/index.braze.html +0 -125
- package/dist/exports/newsletter/index.html +0 -125
- package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-blocks.png +0 -0
- package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-hero-mcp.png +0 -0
- package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-magic.png +0 -0
- package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-mcp.png +0 -0
- package/dist/exports/newsletter-ai-june-july/Images/newsletter-ai-portfolio.png +0 -0
- package/dist/exports/newsletter-ai-june-july/index.braze.html +0 -1640
- package/dist/exports/newsletter-ai-june-july/index.html +0 -1640
- package/dist/exports/survey/Images/EmailLove_Image_3b6f4a6f-7f5f-418b-be71-9371b25c20ce.png +0 -0
- package/dist/exports/survey/Images/EmailLove_Image_f659c728-2401-485d-8d90-98c962d28c0c.png +0 -0
- package/dist/exports/survey/index.braze.html +0 -515
- package/dist/exports/survey/index.html +0 -515
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_115ccc58-a47f-4eca-a1f2-c0d86e1e1cf4.png +0 -0
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_aec4d0d3-6057-4b8a-8d8f-46fbd024f182.png +0 -0
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Before_d139966a-6051-4383-bf8f-1e5138e1b030.png +0 -0
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_080fa361-a3f2-4593-9ac0-03cf3a7972ff.png +0 -0
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_5ebade34-8f1d-4c2c-9d27-5f9e843ce502.png +0 -0
- package/dist/exports/trial-01-welcome/Images/tp1_-_welcome_Image_aa5e4144-9ec8-4525-b01e-077d72f0bab6.png +0 -0
- package/dist/exports/trial-01-welcome/index.braze.html +0 -941
- package/dist/exports/trial-01-welcome/index.html +0 -941
- package/dist/exports/trial-02/Images/tp2_Image_5b0d9bc4-2e38-4252-8f20-d9f27d471c21.png +0 -0
- package/dist/exports/trial-02/Images/tp2_Image_b3f77c7c-cc8e-4db8-a5d9-072f4f621e72.png +0 -0
- package/dist/exports/trial-02/Images/tp2_Image_cafd1a17-1915-47cd-80f2-1c2d0b133cfe.png +0 -0
- package/dist/exports/trial-02/index.braze.html +0 -923
- package/dist/exports/trial-02/index.html +0 -923
- package/dist/exports/trial-03/Images/tp3_Image_1b96630c-fc4d-4aec-91fb-3c1d4d8544b3.png +0 -0
- package/dist/exports/trial-03/Images/tp3_Image_58f3a342-2193-4b5c-b30a-96f7f3338dd8.png +0 -0
- package/dist/exports/trial-03/Images/tp3_Image_6c4f307a-bac2-40e7-b4f1-9aa623c9eb8e.png +0 -0
- package/dist/exports/trial-03/Images/tp3_Image_848917ce-3f89-4538-a826-558b21f5fea7.png +0 -0
- package/dist/exports/trial-03/Images/tp3_Image_aae8410f-556f-4fb9-88f9-f276d75bafd2.png +0 -0
- package/dist/exports/trial-03/Images/tp3_Image_b4d5be39-509e-4f22-9601-dd070e4c6561.png +0 -0
- package/dist/exports/trial-03/index.braze.html +0 -1129
- package/dist/exports/trial-03/index.html +0 -1129
- package/dist/exports/trial-04/Images/tp4_Image_03bd5a56-25e3-4dcc-bef5-143bf12312d5.png +0 -0
- package/dist/exports/trial-04/Images/tp4_Image_0facbfca-b735-4199-a0d9-05a59341a1e3.gif +0 -0
- package/dist/exports/trial-04/Images/tp4_Image_171cee5f-cd3d-42f0-a180-995893d3742a.png +0 -0
- package/dist/exports/trial-04/Images/tp4_Image_3509d89d-1825-4817-8c1e-130fa294d0e1.png +0 -0
- package/dist/exports/trial-04/Images/tp4_Image_763a0f40-2985-4140-859b-ddd34f20a520.png +0 -0
- package/dist/exports/trial-04/Images/tp4_Image_cc2db4f5-b41d-45d7-a798-7a79e7b8d4d8.png +0 -0
- package/dist/exports/trial-04/index.braze.html +0 -885
- package/dist/exports/trial-04/index.html +0 -885
- package/dist/exports/trial-05/Images/tp5_Image_0248a517-5c60-4e84-ad1c-449dcf4f6a64.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_4c1a2d5a-47d3-4801-bb3a-01c22decc108.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_63ae77e7-cec7-4b4a-91e0-603b5a80929f.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_7aa43530-6707-4308-ab0e-e4c38fc1b77d.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_7efe5b6d-b360-4179-bee1-72908ba569bc.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_b142bd84-c40a-4a29-b9d5-715b52fdd937.png +0 -0
- package/dist/exports/trial-05/Images/tp5_Image_c0c896ea-5b68-4f58-9e27-cdb4a1f1b438.png +0 -0
- package/dist/exports/trial-05/index.braze.html +0 -1023
- package/dist/exports/trial-05/index.html +0 -1023
- package/dist/exports/trial-06/Images/tp6_Image_2267a268-8a80-4e0d-8813-d4c75dbab6f2.png +0 -0
- package/dist/exports/trial-06/Images/tp6_Image_637a97b7-837e-478d-8ed1-6e8c2739fdc7.png +0 -0
- package/dist/exports/trial-06/Images/tp6_Image_a78df270-ad6f-41e6-8822-ba8ec38313a3.png +0 -0
- package/dist/exports/trial-06/index.braze.html +0 -773
- package/dist/exports/trial-06/index.html +0 -773
- package/dist/exports/winback/Images/_managers_Image_4587ac22-460c-487a-bc37-9dbc487e95a4.png +0 -0
- package/dist/exports/winback/Images/_managers_Image_8a77ec2c-ed49-480d-a1a1-7a38abad232a.png +0 -0
- package/dist/exports/winback/Images/_managers_Image_bb643775-8a2f-4e28-9dfb-6d1838c3561f.png +0 -0
- package/dist/exports/winback/Images/_managers_Image_f7d1bca5-0fcb-4d4c-abcd-40ce2d453b07.png +0 -0
- package/dist/exports/winback/index.braze.html +0 -605
- package/dist/exports/winback/index.html +0 -605
- package/dist/generated/email-tokens.d.ts.map +0 -1
- package/dist/generated/email-tokens.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/tokens/build-email-assets.d.ts +0 -19
- package/dist/tokens/build-email-assets.d.ts.map +0 -1
- package/dist/tokens/build-email-assets.js +0 -186
- package/dist/tokens/build-email-assets.js.map +0 -1
- package/dist/tokens/build-email-tokens.d.ts +0 -17
- package/dist/tokens/build-email-tokens.d.ts.map +0 -1
- package/dist/tokens/build-email-tokens.js +0 -229
- 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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"}
|