@clay-design-system/email 0.0.0-stage → 0.2.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/README.md +48 -2
- package/dist/build/asset-scoring.d.ts +48 -0
- package/dist/build/asset-scoring.d.ts.map +1 -0
- package/dist/build/asset-scoring.js +57 -0
- package/dist/build/asset-scoring.js.map +1 -0
- package/dist/build/braze-transform.d.ts +20 -0
- package/dist/build/braze-transform.d.ts.map +1 -0
- package/dist/build/braze-transform.js +26 -0
- package/dist/build/braze-transform.js.map +1 -0
- package/dist/build/catalog.d.ts +25 -0
- package/dist/build/catalog.d.ts.map +1 -0
- package/dist/build/catalog.js +3 -0
- package/dist/build/catalog.js.map +1 -0
- package/dist/build/cloudinary-env.d.ts +15 -0
- package/dist/build/cloudinary-env.d.ts.map +1 -0
- package/dist/build/cloudinary-env.js +36 -0
- package/dist/build/cloudinary-env.js.map +1 -0
- package/dist/build/cloudinary-manifest.d.ts +33 -0
- package/dist/build/cloudinary-manifest.d.ts.map +1 -0
- package/dist/build/cloudinary-manifest.js +36 -0
- package/dist/build/cloudinary-manifest.js.map +1 -0
- package/dist/build/compile.d.ts +11 -0
- package/dist/build/compile.d.ts.map +1 -0
- package/dist/build/compile.js +234 -0
- package/dist/build/compile.js.map +1 -0
- package/dist/build/email-config.d.ts +26 -0
- package/dist/build/email-config.d.ts.map +1 -0
- package/dist/build/email-config.js +17 -0
- package/dist/build/email-config.js.map +1 -0
- package/dist/build/email-list.d.ts +6 -0
- package/dist/build/email-list.d.ts.map +1 -0
- package/dist/build/email-list.js +17 -0
- package/dist/build/email-list.js.map +1 -0
- package/dist/build/email-tree.d.ts +23 -0
- package/dist/build/email-tree.d.ts.map +1 -0
- package/dist/build/email-tree.js +46 -0
- package/dist/build/email-tree.js.map +1 -0
- package/dist/build/export-braze.d.ts +22 -0
- package/dist/build/export-braze.d.ts.map +1 -0
- package/dist/build/export-braze.js +92 -0
- package/dist/build/export-braze.js.map +1 -0
- package/dist/build/generate-stock-library-map.d.ts +13 -0
- package/dist/build/generate-stock-library-map.d.ts.map +1 -0
- package/dist/build/generate-stock-library-map.js +202 -0
- package/dist/build/generate-stock-library-map.js.map +1 -0
- package/dist/build/icon-registry-map.d.ts +34 -0
- package/dist/build/icon-registry-map.d.ts.map +1 -0
- package/dist/build/icon-registry-map.js +44 -0
- package/dist/build/icon-registry-map.js.map +1 -0
- package/dist/build/import-examples.d.ts +14 -0
- package/dist/build/import-examples.d.ts.map +1 -0
- package/dist/build/import-examples.js +65 -0
- package/dist/build/import-examples.js.map +1 -0
- package/dist/build/persona-character-map.d.ts +32 -0
- package/dist/build/persona-character-map.d.ts.map +1 -0
- package/dist/build/persona-character-map.js +90 -0
- package/dist/build/persona-character-map.js.map +1 -0
- package/dist/build/stock-library-map.d.ts +57 -0
- package/dist/build/stock-library-map.d.ts.map +1 -0
- package/dist/build/stock-library-map.js +1261 -0
- package/dist/build/stock-library-map.js.map +1 -0
- package/dist/build/upload-assets.d.ts +20 -0
- package/dist/build/upload-assets.d.ts.map +1 -0
- package/dist/build/upload-assets.js +153 -0
- package/dist/build/upload-assets.js.map +1 -0
- package/dist/build/upload-library-assets.d.ts +21 -0
- package/dist/build/upload-library-assets.d.ts.map +1 -0
- package/dist/build/upload-library-assets.js +182 -0
- package/dist/build/upload-library-assets.js.map +1 -0
- package/dist/build/visual-resolver.d.ts +70 -0
- package/dist/build/visual-resolver.d.ts.map +1 -0
- package/dist/build/visual-resolver.js +375 -0
- package/dist/build/visual-resolver.js.map +1 -0
- package/dist/catalog.json +467 -0
- package/dist/emails/component-buttons-icons.html +435 -0
- package/dist/emails/component-buttons-integration.html +256 -0
- package/dist/emails/component-buttons-primary.html +269 -0
- package/dist/emails/component-buttons-secondary.html +255 -0
- package/dist/emails/component-buttons-two-integrations.html +310 -0
- package/dist/emails/component-images-card-280h.html +281 -0
- package/dist/emails/component-images-card-320h.html +281 -0
- package/dist/emails/component-images-card.html +281 -0
- package/dist/emails/component-images-full-bleed-280h.html +279 -0
- package/dist/emails/component-images-full-bleed-400h.html +279 -0
- package/dist/emails/component-images-full-bleed.html +279 -0
- package/dist/emails/component-text-h1.html +254 -0
- package/dist/emails/component-text-h2.html +230 -0
- package/dist/emails/component-text-h3.html +255 -0
- package/dist/emails/component-text-h4.html +255 -0
- package/dist/emails/component-text-h5.html +254 -0
- package/dist/emails/component-text-p2.html +253 -0
- package/dist/emails/component-text-p3.html +254 -0
- package/dist/emails/component-text-p4.html +254 -0
- package/dist/emails/container.html +250 -0
- package/dist/emails/section-changelog-icon-list.html +1201 -0
- package/dist/emails/section-divider-line.html +340 -0
- package/dist/emails/section-feature-highlight-reversed.html +377 -0
- package/dist/emails/section-feature-highlight.html +384 -0
- package/dist/emails/section-feature-rows.html +328 -0
- package/dist/emails/section-feature-story-row-reversed.html +381 -0
- package/dist/emails/section-feature-story-row.html +382 -0
- package/dist/emails/section-footer-lifecycle.html +650 -0
- package/dist/emails/section-footer-two-column-minimal.html +318 -0
- package/dist/emails/section-footer.html +413 -0
- package/dist/emails/section-header.html +290 -0
- package/dist/emails/section-hero.html +276 -0
- package/dist/emails/section-icon-feature-list.html +554 -0
- package/dist/emails/section-image-caption-block.html +313 -0
- package/dist/emails/section-image-hero.html +341 -0
- package/dist/emails/section-lesson-card.html +628 -0
- package/dist/emails/section-list-action-items.html +590 -0
- package/dist/emails/section-list-feature-items.html +713 -0
- package/dist/emails/section-list-icon-items.html +701 -0
- package/dist/emails/section-list-numbered-items.html +733 -0
- package/dist/emails/section-logo-header.html +288 -0
- package/dist/emails/section-newsletter-hero.html +393 -0
- package/dist/emails/section-product-ui-hero.html +496 -0
- package/dist/emails/section-promo-banner.html +308 -0
- package/dist/emails/section-qa-block.html +440 -0
- package/dist/emails/section-resource-link-list.html +481 -0
- package/dist/emails/section-signoff.html +279 -0
- package/dist/emails/section-single-column-author.html +453 -0
- package/dist/emails/section-single-column-feature-card.html +312 -0
- package/dist/emails/section-single-column-product-card.html +393 -0
- package/dist/emails/section-single-column-promo-card.html +306 -0
- package/dist/emails/section-spacer-fill.html +281 -0
- package/dist/emails/section-testimonial-dark-card.html +363 -0
- package/dist/emails/section-text-h1-regular.html +254 -0
- package/dist/emails/section-text-h2-regular.html +254 -0
- package/dist/emails/section-text-h3-regular.html +254 -0
- package/dist/emails/section-text-h4-regular.html +254 -0
- package/dist/emails/section-text-h5-regular.html +254 -0
- package/dist/emails/section-text-mixed-heading.html +269 -0
- package/dist/emails/section-text-overline-heading.html +281 -0
- package/dist/emails/section-text-p1-bold.html +254 -0
- package/dist/emails/section-text-p1-regular.html +255 -0
- package/dist/emails/section-text-paragraph.html +358 -0
- package/dist/emails/section-text-quote-card.html +269 -0
- package/dist/emails/section-text-quote.html +313 -0
- package/dist/emails/section-text-small-headline.html +279 -0
- package/dist/emails/section-three-column-content-cards.html +499 -0
- package/dist/emails/section-three-column-icon-cards.html +510 -0
- package/dist/emails/section-three-column-image-grid.html +466 -0
- package/dist/emails/section-three-up-icon-benefits.html +464 -0
- package/dist/emails/section-two-column-feature-cards.html +708 -0
- package/dist/emails/section-two-column-grid.html +1131 -0
- package/dist/emails/section-two-column-img-text.html +331 -0
- package/dist/emails/section-two-column-live-tags.html +367 -0
- package/dist/emails/section-two-column-stacked.html +629 -0
- package/dist/emails/section-upsell-cta.html +597 -0
- package/dist/emails/section-value-bullet-list.html +313 -0
- package/dist/examples/manifest.d.ts +21 -0
- package/dist/examples/manifest.d.ts.map +1 -0
- package/dist/examples/manifest.js +84 -0
- package/dist/examples/manifest.js.map +1 -0
- 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 +837 -0
- package/dist/exports/contact-sales/index.html +837 -0
- 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 +1055 -0
- package/dist/exports/event-confirmation/index.html +1055 -0
- 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 +1731 -0
- package/dist/exports/legal-update/index.html +1731 -0
- 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 +125 -0
- package/dist/exports/newsletter/index.html +125 -0
- 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 +1640 -0
- package/dist/exports/newsletter-ai-june-july/index.html +1640 -0
- 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 +515 -0
- package/dist/exports/survey/index.html +515 -0
- 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 +941 -0
- package/dist/exports/trial-01-welcome/index.html +941 -0
- 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 +923 -0
- package/dist/exports/trial-02/index.html +923 -0
- 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 +1129 -0
- package/dist/exports/trial-03/index.html +1129 -0
- 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 +885 -0
- package/dist/exports/trial-04/index.html +885 -0
- 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 +1023 -0
- package/dist/exports/trial-05/index.html +1023 -0
- 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 +773 -0
- package/dist/exports/trial-06/index.html +773 -0
- 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 +605 -0
- package/dist/exports/winback/index.html +605 -0
- package/dist/generated/email-tokens.d.ts +101 -0
- package/dist/generated/email-tokens.d.ts.map +1 -0
- package/dist/generated/email-tokens.js +104 -0
- package/dist/generated/email-tokens.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens/build-email-assets.d.ts +19 -0
- package/dist/tokens/build-email-assets.d.ts.map +1 -0
- package/dist/tokens/build-email-assets.js +186 -0
- package/dist/tokens/build-email-assets.js.map +1 -0
- package/dist/tokens/build-email-tokens.d.ts +17 -0
- package/dist/tokens/build-email-tokens.d.ts.map +1 -0
- package/dist/tokens/build-email-tokens.js +229 -0
- package/dist/tokens/build-email-tokens.js.map +1 -0
- package/package.json +41 -3
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/** Unitless size/spacing token → px string. */
|
|
2
|
+
export declare const px: (n: number) => string;
|
|
3
|
+
export declare const emailColor: {
|
|
4
|
+
readonly page: "#f3f4f5";
|
|
5
|
+
readonly surface: "#ffffff";
|
|
6
|
+
readonly text: "#252526";
|
|
7
|
+
readonly textMuted: "#7c7b7b";
|
|
8
|
+
readonly brand: "#6161ff";
|
|
9
|
+
readonly brandLink: "#6161ff";
|
|
10
|
+
readonly onBrand: "#ffffff";
|
|
11
|
+
readonly surfaceWarm: "#f7f3ea";
|
|
12
|
+
readonly surfaceWarmBorder: "#f2e7d6";
|
|
13
|
+
readonly pageDark: "#000000";
|
|
14
|
+
readonly surfaceDark: "#252526";
|
|
15
|
+
readonly textDark: "#ffffff";
|
|
16
|
+
};
|
|
17
|
+
export declare const emailType: {
|
|
18
|
+
readonly family: "Poppins, sans-serif";
|
|
19
|
+
readonly weightRegular: 400;
|
|
20
|
+
readonly weightSemi: 600;
|
|
21
|
+
readonly h1: {
|
|
22
|
+
readonly size: "56px";
|
|
23
|
+
readonly sizeMobile: "48px";
|
|
24
|
+
readonly weight: 600;
|
|
25
|
+
readonly lineHeight: 1.1;
|
|
26
|
+
readonly letterSpacing: "-1px";
|
|
27
|
+
};
|
|
28
|
+
readonly h2: {
|
|
29
|
+
readonly size: "48px";
|
|
30
|
+
readonly sizeMobile: "40px";
|
|
31
|
+
readonly weight: 600;
|
|
32
|
+
readonly lineHeight: 1.3;
|
|
33
|
+
readonly letterSpacing: "-1px";
|
|
34
|
+
};
|
|
35
|
+
readonly h3: {
|
|
36
|
+
readonly size: "40px";
|
|
37
|
+
readonly sizeMobile: "32px";
|
|
38
|
+
readonly weight: 600;
|
|
39
|
+
readonly lineHeight: 1.3;
|
|
40
|
+
readonly letterSpacing: "-1px";
|
|
41
|
+
};
|
|
42
|
+
readonly h4: {
|
|
43
|
+
readonly size: "32px";
|
|
44
|
+
readonly sizeMobile: "24px";
|
|
45
|
+
readonly weight: 600;
|
|
46
|
+
readonly lineHeight: 1.3;
|
|
47
|
+
};
|
|
48
|
+
readonly h5: {
|
|
49
|
+
readonly size: "24px";
|
|
50
|
+
readonly sizeMobile: "24px";
|
|
51
|
+
readonly weight: 600;
|
|
52
|
+
readonly lineHeight: 1.3;
|
|
53
|
+
};
|
|
54
|
+
readonly p1: {
|
|
55
|
+
readonly size: "16px";
|
|
56
|
+
readonly sizeMobile: "16px";
|
|
57
|
+
readonly weight: 400;
|
|
58
|
+
readonly lineHeight: 1.4;
|
|
59
|
+
};
|
|
60
|
+
readonly p2: {
|
|
61
|
+
readonly size: "15px";
|
|
62
|
+
readonly sizeMobile: "15px";
|
|
63
|
+
readonly weight: 400;
|
|
64
|
+
readonly lineHeight: 1.4;
|
|
65
|
+
};
|
|
66
|
+
readonly p3: {
|
|
67
|
+
readonly size: "14px";
|
|
68
|
+
readonly sizeMobile: "14px";
|
|
69
|
+
readonly weight: 400;
|
|
70
|
+
readonly lineHeight: 1.5;
|
|
71
|
+
};
|
|
72
|
+
readonly p4: {
|
|
73
|
+
readonly size: "12px";
|
|
74
|
+
readonly sizeMobile: "12px";
|
|
75
|
+
readonly weight: 400;
|
|
76
|
+
readonly lineHeight: 1.5;
|
|
77
|
+
};
|
|
78
|
+
readonly button: {
|
|
79
|
+
readonly size: "16px";
|
|
80
|
+
readonly weight: 400;
|
|
81
|
+
readonly lineHeight: 1;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
export declare const emailLayout: {
|
|
85
|
+
readonly canvasWidth: 640;
|
|
86
|
+
readonly contentWidth: 560;
|
|
87
|
+
readonly hPadding: "40px";
|
|
88
|
+
readonly sectionY: "24px";
|
|
89
|
+
readonly gapMd: "16px";
|
|
90
|
+
readonly gapLg: "32px";
|
|
91
|
+
readonly cardRadius: "16px";
|
|
92
|
+
readonly pillRadius: "9999px";
|
|
93
|
+
readonly iconSize: "24px";
|
|
94
|
+
};
|
|
95
|
+
export declare const emailEffect: {
|
|
96
|
+
readonly shadowLight: "0px 0px 40px 0px rgba(23, 24, 28, 0.06)";
|
|
97
|
+
readonly shadowHard: "0px 8px 40px 0px rgba(23, 24, 28, 0.12)";
|
|
98
|
+
};
|
|
99
|
+
/** Poppins → system fallback stack (email webfonts are unreliable). */
|
|
100
|
+
export declare const emailFontStack = "Poppins, 'Helvetica Neue', Helvetica, Arial, sans-serif";
|
|
101
|
+
//# sourceMappingURL=email-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-tokens.d.ts","sourceRoot":"","sources":["../../src/generated/email-tokens.ts"],"names":[],"mappings":"AAIA,+CAA+C;AAC/C,eAAO,MAAM,EAAE,GAAI,GAAG,MAAM,KAAG,MAAkB,CAAA;AAEjD,eAAO,MAAM,UAAU;;;;;;;;;;;;;CAab,CAAA;AAEV,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEZ,CAAA;AAEV,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAA;AAEV,eAAO,MAAM,WAAW;;;CAGd,CAAA;AAEV,uEAAuE;AACvE,eAAO,MAAM,cAAc,4DAA4D,CAAA"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// GENERATED by src/tokens/build-email-tokens.ts — do not edit. Run `pnpm --filter @clay-design-system/email tokens:check`.
|
|
2
|
+
// Inline-able literal token values for MJML email authoring. Emails cannot use var(--clay-*),
|
|
3
|
+
// so sections copy these literals. Roles that mj-class carries (clay-h1…h5, clay-p1…p4, clay-button) live in base-head.mjml.
|
|
4
|
+
/** Unitless size/spacing token → px string. */
|
|
5
|
+
export const px = (n) => `${n}px`;
|
|
6
|
+
export const emailColor = {
|
|
7
|
+
"page": "#f3f4f5",
|
|
8
|
+
"surface": "#ffffff",
|
|
9
|
+
"text": "#252526",
|
|
10
|
+
"textMuted": "#7c7b7b",
|
|
11
|
+
"brand": "#6161ff",
|
|
12
|
+
"brandLink": "#6161ff",
|
|
13
|
+
"onBrand": "#ffffff",
|
|
14
|
+
"surfaceWarm": "#f7f3ea",
|
|
15
|
+
"surfaceWarmBorder": "#f2e7d6",
|
|
16
|
+
"pageDark": "#000000",
|
|
17
|
+
"surfaceDark": "#252526",
|
|
18
|
+
"textDark": "#ffffff"
|
|
19
|
+
};
|
|
20
|
+
export const emailType = {
|
|
21
|
+
"family": "Poppins, sans-serif",
|
|
22
|
+
"weightRegular": 400,
|
|
23
|
+
"weightSemi": 600,
|
|
24
|
+
"h1": {
|
|
25
|
+
"size": "56px",
|
|
26
|
+
"sizeMobile": "48px",
|
|
27
|
+
"weight": 600,
|
|
28
|
+
"lineHeight": 1.1,
|
|
29
|
+
"letterSpacing": "-1px"
|
|
30
|
+
},
|
|
31
|
+
"h2": {
|
|
32
|
+
"size": "48px",
|
|
33
|
+
"sizeMobile": "40px",
|
|
34
|
+
"weight": 600,
|
|
35
|
+
"lineHeight": 1.3,
|
|
36
|
+
"letterSpacing": "-1px"
|
|
37
|
+
},
|
|
38
|
+
"h3": {
|
|
39
|
+
"size": "40px",
|
|
40
|
+
"sizeMobile": "32px",
|
|
41
|
+
"weight": 600,
|
|
42
|
+
"lineHeight": 1.3,
|
|
43
|
+
"letterSpacing": "-1px"
|
|
44
|
+
},
|
|
45
|
+
"h4": {
|
|
46
|
+
"size": "32px",
|
|
47
|
+
"sizeMobile": "24px",
|
|
48
|
+
"weight": 600,
|
|
49
|
+
"lineHeight": 1.3
|
|
50
|
+
},
|
|
51
|
+
"h5": {
|
|
52
|
+
"size": "24px",
|
|
53
|
+
"sizeMobile": "24px",
|
|
54
|
+
"weight": 600,
|
|
55
|
+
"lineHeight": 1.3
|
|
56
|
+
},
|
|
57
|
+
"p1": {
|
|
58
|
+
"size": "16px",
|
|
59
|
+
"sizeMobile": "16px",
|
|
60
|
+
"weight": 400,
|
|
61
|
+
"lineHeight": 1.4
|
|
62
|
+
},
|
|
63
|
+
"p2": {
|
|
64
|
+
"size": "15px",
|
|
65
|
+
"sizeMobile": "15px",
|
|
66
|
+
"weight": 400,
|
|
67
|
+
"lineHeight": 1.4
|
|
68
|
+
},
|
|
69
|
+
"p3": {
|
|
70
|
+
"size": "14px",
|
|
71
|
+
"sizeMobile": "14px",
|
|
72
|
+
"weight": 400,
|
|
73
|
+
"lineHeight": 1.5
|
|
74
|
+
},
|
|
75
|
+
"p4": {
|
|
76
|
+
"size": "12px",
|
|
77
|
+
"sizeMobile": "12px",
|
|
78
|
+
"weight": 400,
|
|
79
|
+
"lineHeight": 1.5
|
|
80
|
+
},
|
|
81
|
+
"button": {
|
|
82
|
+
"size": "16px",
|
|
83
|
+
"weight": 400,
|
|
84
|
+
"lineHeight": 1
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
export const emailLayout = {
|
|
88
|
+
"canvasWidth": 640,
|
|
89
|
+
"contentWidth": 560,
|
|
90
|
+
"hPadding": "40px",
|
|
91
|
+
"sectionY": "24px",
|
|
92
|
+
"gapMd": "16px",
|
|
93
|
+
"gapLg": "32px",
|
|
94
|
+
"cardRadius": "16px",
|
|
95
|
+
"pillRadius": "9999px",
|
|
96
|
+
"iconSize": "24px"
|
|
97
|
+
};
|
|
98
|
+
export const emailEffect = {
|
|
99
|
+
"shadowLight": "0px 0px 40px 0px rgba(23, 24, 28, 0.06)",
|
|
100
|
+
"shadowHard": "0px 8px 40px 0px rgba(23, 24, 28, 0.12)"
|
|
101
|
+
};
|
|
102
|
+
/** Poppins → system fallback stack (email webfonts are unreliable). */
|
|
103
|
+
export const emailFontStack = "Poppins, 'Helvetica Neue', Helvetica, Arial, sans-serif";
|
|
104
|
+
//# sourceMappingURL=email-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-tokens.js","sourceRoot":"","sources":["../../src/generated/email-tokens.ts"],"names":[],"mappings":"AAAA,2HAA2H;AAC3H,8FAA8F;AAC9F,6HAA6H;AAE7H,+CAA+C;AAC/C,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,CAAC,IAAI,CAAA;AAEjD,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IACpB,MAAM,EAAE,SAAS;IACjB,WAAW,EAAE,SAAS;IACtB,OAAO,EAAE,SAAS;IAClB,WAAW,EAAE,SAAS;IACtB,SAAS,EAAE,SAAS;IACpB,aAAa,EAAE,SAAS;IACxB,mBAAmB,EAAE,SAAS;IAC9B,UAAU,EAAE,SAAS;IACrB,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,SAAS;CACb,CAAA;AAEV,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,qBAAqB;IAC/B,eAAe,EAAE,GAAG;IACpB,YAAY,EAAE,GAAG;IACjB,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,MAAM;KACxB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,MAAM;KACxB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,MAAM;KACxB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,GAAG;KAClB;IACD,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,GAAG;QACb,YAAY,EAAE,CAAC;KAChB;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE,GAAG;IAClB,cAAc,EAAE,GAAG;IACnB,UAAU,EAAE,MAAM;IAClB,UAAU,EAAE,MAAM;IAClB,OAAO,EAAE,MAAM;IACf,OAAO,EAAE,MAAM;IACf,YAAY,EAAE,MAAM;IACpB,YAAY,EAAE,QAAQ;IACtB,UAAU,EAAE,MAAM;CACV,CAAA;AAEV,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE,yCAAyC;IACxD,YAAY,EAAE,yCAAyC;CAC/C,CAAA;AAEV,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,yDAAyD,CAAA"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clay-design-system/email public entry.
|
|
3
|
+
*
|
|
4
|
+
* Runtime surface = the inline-able email token constants (generated from @clay-design-system/tokens) and the
|
|
5
|
+
* catalog types. Compiled email HTML is read from `@clay-design-system/email/catalog.json`.
|
|
6
|
+
*/
|
|
7
|
+
export * from './generated/email-tokens';
|
|
8
|
+
export type { Catalog, CatalogItem, CatalogKind } from './build/catalog';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,0BAA0B,CAAA;AACxC,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clay-design-system/email public entry.
|
|
3
|
+
*
|
|
4
|
+
* Runtime surface = the inline-able email token constants (generated from @clay-design-system/tokens) and the
|
|
5
|
+
* catalog types. Compiled email HTML is read from `@clay-design-system/email/catalog.json`.
|
|
6
|
+
*/
|
|
7
|
+
export * from './generated/email-tokens';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,0BAA0B,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-email-assets.d.ts","sourceRoot":"","sources":["../../src/tokens/build-email-assets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
|
|
@@ -0,0 +1,186 @@
|
|
|
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" color="#000000"><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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-email-assets.js","sourceRoot":"","sources":["../../src/tokens/build-email-assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-email-tokens.d.ts","sourceRoot":"","sources":["../../src/tokens/build-email-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|