ima-claude 2.15.0 → 2.18.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.
Files changed (37) hide show
  1. package/README.md +13 -1
  2. package/dist/cli.js +18 -1
  3. package/package.json +1 -1
  4. package/plugins/ima-claude/.claude-plugin/plugin.json +2 -2
  5. package/plugins/ima-claude/agents/wp-developer.md +2 -1
  6. package/plugins/ima-claude/hooks/prompt_coach_digest.md +1 -1
  7. package/plugins/ima-claude/skills/espocrm/SKILL.md +79 -0
  8. package/plugins/ima-claude/skills/espocrm-api/SKILL.md +360 -0
  9. package/plugins/ima-claude/skills/espocrm-api/references/where-operators.md +84 -0
  10. package/plugins/ima-claude/skills/functional-programmer/SKILL.md +15 -0
  11. package/plugins/ima-claude/skills/ima-copywriting/SKILL.md +232 -0
  12. package/plugins/ima-claude/skills/ima-copywriting/references/format-blog-post.md +51 -0
  13. package/plugins/ima-claude/skills/ima-copywriting/references/format-fundraising-email.md +54 -0
  14. package/plugins/ima-claude/skills/ima-copywriting/references/format-newsletter.md +54 -0
  15. package/plugins/ima-claude/skills/ima-copywriting/references/format-op-ed.md +41 -0
  16. package/plugins/ima-claude/skills/ima-copywriting/references/format-press-release.md +45 -0
  17. package/plugins/ima-claude/skills/ima-copywriting/references/format-social-media.md +141 -0
  18. package/plugins/ima-claude/skills/ima-copywriting/references/format-webinar-email.md +37 -0
  19. package/plugins/ima-claude/skills/ima-copywriting/references/ima-copy-frameworks.md +299 -0
  20. package/plugins/ima-claude/skills/ima-copywriting/references/ima-transitions.md +199 -0
  21. package/plugins/ima-claude/skills/ima-editorial-scorecard/SKILL.md +159 -0
  22. package/plugins/ima-claude/skills/ima-editorial-scorecard/references/format-expectations.md +66 -0
  23. package/plugins/ima-claude/skills/ima-editorial-scorecard/references/scoring-rubrics.md +73 -0
  24. package/plugins/ima-claude/skills/ima-editorial-workflow/SKILL.md +171 -0
  25. package/plugins/ima-claude/skills/ima-email-creator/SKILL.md +104 -0
  26. package/plugins/ima-claude/skills/ima-email-creator/assets/base-template.html +256 -0
  27. package/plugins/ima-claude/skills/ima-email-creator/references/drip-sequence.md +66 -0
  28. package/plugins/ima-claude/skills/ima-email-creator/references/email-css-safe.md +104 -0
  29. package/plugins/ima-claude/skills/ima-email-creator/references/espocrm-compat.md +58 -0
  30. package/plugins/ima-claude/skills/ima-email-creator/references/newsletter-layout.md +127 -0
  31. package/plugins/ima-claude/skills/ima-email-creator/references/wp-transactional.md +77 -0
  32. package/plugins/ima-claude/skills/ima-email-creator/scripts/css-inliner.py +47 -0
  33. package/plugins/ima-claude/skills/ima-email-creator/scripts/espocrm-prep.py +52 -0
  34. package/plugins/ima-claude/skills/ima-email-creator/scripts/requirements.txt +2 -0
  35. package/plugins/ima-claude/skills/wp-ddev/SKILL.md +264 -0
  36. package/plugins/ima-claude/skills/wp-ddev/references/ddev-commands.md +232 -0
  37. package/plugins/ima-claude/skills/wp-ddev/references/wp-cli-reference.md +406 -0
@@ -0,0 +1,256 @@
1
+ <!doctype html>
2
+ <html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <!--[if mso]>
7
+ <noscript><xml><o:OfficeDocumentSettings><o:AllowPNG/><o:PixelsPerInch>96</o:PixelsPerInch></o:OfficeDocumentSettings></xml></noscript>
8
+ <![endif]-->
9
+ <!--[if !mso]><!-->
10
+ <link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&family=Open+Sans:wght@400;600&display=swap" rel="stylesheet">
11
+ <!--<![endif]-->
12
+ <title>{{subject}}</title>
13
+ <style>
14
+ * { box-sizing: border-box; }
15
+ body { margin: 0; padding: 0; -webkit-text-size-adjust: none; text-size-adjust: none; }
16
+ a[x-apple-data-detectors] { color: inherit !important; text-decoration: inherit !important; }
17
+ #MessageViewBody a { color: inherit; text-decoration: none; }
18
+ p { line-height: inherit; }
19
+ .desktop_hide, .desktop_hide table { mso-hide: all; display: none; max-height: 0; overflow: hidden; }
20
+ .image_block img + div { display: none; }
21
+ @media (max-width: 620px) {
22
+ .row-content { width: 100% !important; }
23
+ .stack .column { width: 100%; display: block; }
24
+ .mobile_hide { display: none; }
25
+ .desktop_hide, .desktop_hide table { display: table !important; max-height: none !important; }
26
+ .image_block div.fullWidth { max-width: 100% !important; }
27
+ }
28
+ </style>
29
+ <!--[if mso]>
30
+ <style>sup, sub { font-size: 100% !important; } sup { mso-text-raise: 10%; } sub { mso-text-raise: -10%; }</style>
31
+ <![endif]-->
32
+ </head>
33
+ <body class="body" style="background-color:#F2F3F5;margin:0;padding:0;-webkit-text-size-adjust:none;text-size-adjust:none;">
34
+ <table class="nl-container" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;">
35
+ <tbody><tr><td>
36
+
37
+ <!-- Row 1: Header -->
38
+ <table class="row row-1" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
39
+ <tbody><tr><td>
40
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
41
+ <tbody><tr>
42
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
43
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
44
+ <tr><td class="pad" style="padding-top:10px;padding-bottom:10px;text-align:center;">
45
+
46
+ <!-- image_block: IMA logo -->
47
+ <div class="image_block" style="text-align:center;">
48
+ <a href="https://imahealth.org/?utm_source=email&utm_medium=newsletter&utm_campaign={{utmCampaign}}" target="_blank" style="outline:none;" tabindex="-1">
49
+ <img src="https://imagedelivery.net/JtZuhs_w2Ns2ySmaMNtbTw/4024a8d2-4d98-48c5-fed5-b4e3a8e4c200/xs"
50
+ alt="IMA Health"
51
+ width="178"
52
+ style="display:block;height:auto;max-width:178.8px;border:0;margin:0 auto;">
53
+ </a>
54
+ </div>
55
+
56
+ <!-- spacer_block: 10px -->
57
+ <div class="spacer_block" style="height:10px;line-height:10px;font-size:1px;">&#8202;</div>
58
+
59
+ </td></tr>
60
+ </table>
61
+ </td>
62
+ </tr></tbody>
63
+ </table>
64
+ </td></tr></tbody>
65
+ </table>
66
+ <!-- /Row 1 -->
67
+
68
+ <!-- Row 2: Content -->
69
+ <table class="row row-2" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
70
+ <tbody><tr><td>
71
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
72
+ <tbody><tr>
73
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
74
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
75
+ <tr><td class="pad" style="padding-top:10px;padding-bottom:10px;">
76
+
77
+ <!-- heading_block: main H1 -->
78
+ <div class="heading_block" style="text-align:center;">
79
+ <h1 style="margin:0;color:#00066F;font-family:Lato,Arial,Helvetica,sans-serif;font-size:28px;font-weight:400;letter-spacing:normal;line-height:1.2;text-align:center;mso-line-height-alt:34px;">
80
+ Hi {Person.firstName}, here's your latest from IMA
81
+ </h1>
82
+ </div>
83
+
84
+ <!-- paragraph_block: intro body text -->
85
+ <div class="paragraph_block" style="padding:10px 20px;">
86
+ <p style="margin:0;color:#494949;font-family:&quot;Open Sans&quot;,&quot;Helvetica Neue&quot;,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:1.2;mso-line-height-alt:19px;text-align:left;">
87
+ Body copy goes here. This is the introductory paragraph for the email. Keep it concise and focused on the reader's needs.
88
+ </p>
89
+ </div>
90
+
91
+ <!-- heading_block: section H1 (20px, weight 500, emoji prefix) -->
92
+ <div class="heading_block" style="padding:10px 20px;">
93
+ <h1 style="margin:0;color:#00066F;font-family:Lato,Arial,Helvetica,sans-serif;font-size:20px;font-weight:500;letter-spacing:normal;line-height:1.2;text-align:left;mso-line-height-alt:24px;">
94
+ 🔹 Section Heading
95
+ </h1>
96
+ </div>
97
+
98
+ <!-- image_block: section image, linked with UTM -->
99
+ <div class="image_block" style="padding:10px 20px;">
100
+ <a href="https://imahealth.org/?utm_source=email&utm_medium=newsletter&utm_campaign={{utmCampaign}}" target="_blank" style="outline:none;" tabindex="-1">
101
+ <img src="https://via.placeholder.com/580x300"
102
+ alt=""
103
+ width="580"
104
+ style="display:block;height:auto;max-width:580px;border:0;border-radius:5px;">
105
+ </a>
106
+ </div>
107
+
108
+ <!-- paragraph_block: section body copy -->
109
+ <div class="paragraph_block" style="padding:10px 20px;">
110
+ <p style="margin:0;color:#494949;font-family:&quot;Open Sans&quot;,&quot;Helvetica Neue&quot;,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:1.2;mso-line-height-alt:19px;text-align:left;">
111
+ Section body copy goes here. Describe the content, news, or article being referenced. Keep paragraphs short and scannable.
112
+ </p>
113
+ </div>
114
+
115
+ <!-- button_block: VML hybrid CTA -->
116
+ <div class="button_block" style="padding:10px 20px;text-align:left;">
117
+ <!--[if mso]>
118
+ <v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word"
119
+ href="https://imahealth.org/?utm_source=email&utm_medium=newsletter&utm_campaign={{utmCampaign}}"
120
+ style="height:42px;v-text-anchor:middle;width:160px;"
121
+ arcsize="9%"
122
+ stroke="false"
123
+ fillcolor="#00B8B8">
124
+ <w:anchorlock/>
125
+ <center style="color:#ffffff;font-family:Arial,Helvetica,sans-serif;font-size:16px;font-weight:500;">Read <b>More »</b></center>
126
+ </v:roundrect>
127
+ <![endif]-->
128
+ <!--[if !mso]><!-->
129
+ <a href="https://imahealth.org/?utm_source=email&utm_medium=newsletter&utm_campaign={{utmCampaign}}"
130
+ target="_blank"
131
+ style="display:inline-block;text-decoration:none;background-color:#00B8B8;border-radius:4px;color:#ffffff;font-family:Lato,Arial,Helvetica,sans-serif;font-size:16px;font-weight:500;height:42px;line-height:42px;padding:0 16px;mso-padding-alt:0;mso-text-raise:0;">
132
+ Read <b>More »</b>
133
+ </a>
134
+ <!--<![endif]-->
135
+ </div>
136
+
137
+ <!-- divider_block -->
138
+ <div class="divider_block" style="padding:10px 20px;">
139
+ <table width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
140
+ <tr>
141
+ <td style="border-top:1px solid #dddddd;font-size:1px;line-height:1px;">&#8202;</td>
142
+ </tr>
143
+ </table>
144
+ </div>
145
+
146
+ </td></tr>
147
+ </table>
148
+ </td>
149
+ </tr></tbody>
150
+ </table>
151
+ </td></tr></tbody>
152
+ </table>
153
+ <!-- /Row 2 -->
154
+
155
+ <!-- Row 3: Divider -->
156
+ <table class="row row-3" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
157
+ <tbody><tr><td>
158
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
159
+ <tbody><tr>
160
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
161
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
162
+ <tr><td class="pad" style="padding-top:10px;padding-bottom:10px;">
163
+ <div class="divider_block">
164
+ <table width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
165
+ <tr>
166
+ <td style="border-top:1px solid #dddddd;font-size:1px;line-height:1px;">&#8202;</td>
167
+ </tr>
168
+ </table>
169
+ </div>
170
+ </td></tr>
171
+ </table>
172
+ </td>
173
+ </tr></tbody>
174
+ </table>
175
+ </td></tr></tbody>
176
+ </table>
177
+ <!-- /Row 3 -->
178
+
179
+ <!-- Row 4: Footer -->
180
+ <table class="row row-4" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
181
+ <tbody><tr><td>
182
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
183
+ <tbody><tr>
184
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
185
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
186
+ <tr><td class="pad" style="padding-top:10px;padding-bottom:10px;">
187
+
188
+ <!-- paragraph_block: org info -->
189
+ <div class="paragraph_block" style="padding:10px 20px;">
190
+ <p style="margin:0;color:#919396;font-family:&quot;Open Sans&quot;,&quot;Helvetica Neue&quot;,Helvetica,Arial,sans-serif;font-size:16px;font-weight:400;line-height:1.2;mso-line-height-alt:19px;text-align:center;">
191
+ IMA Health &bull; imahealth.org<br>
192
+ &copy; 2026 Independent Medical Alliance. All rights reserved.
193
+ </p>
194
+ </div>
195
+
196
+ <!-- social icons placeholder (production uses BeeFree CDN icons) -->
197
+ <div class="social_block" style="padding:10px 20px;text-align:center;">
198
+ <!-- BeeFree CDN social icons would be rendered here by the email builder -->
199
+ </div>
200
+
201
+ </td></tr>
202
+ </table>
203
+ </td>
204
+ </tr></tbody>
205
+ </table>
206
+ </td></tr></tbody>
207
+ </table>
208
+ <!-- /Row 4 -->
209
+
210
+ <!-- Row 5: Spacer -->
211
+ <table class="row row-5" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
212
+ <tbody><tr><td>
213
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
214
+ <tbody><tr>
215
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
216
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
217
+ <tr><td class="pad" style="padding-top:0;padding-bottom:0;">
218
+ <div class="spacer_block" style="height:10px;line-height:10px;font-size:1px;">&#8202;</div>
219
+ </td></tr>
220
+ </table>
221
+ </td>
222
+ </tr></tbody>
223
+ </table>
224
+ </td></tr></tbody>
225
+ </table>
226
+ <!-- /Row 5 -->
227
+
228
+ <!-- Row 6: Unsubscribe -->
229
+ <table class="row row-6" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;background-color:#F2F3F5;" align="center">
230
+ <tbody><tr><td>
231
+ <table class="row-content stack" width="600" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;color:#000;background-color:#FFFFFF;width:600px;margin:0 auto;" align="center">
232
+ <tbody><tr>
233
+ <td class="column column-1" width="100%" style="mso-table-lspace:0;mso-table-rspace:0;font-weight:400;text-align:left;vertical-align:top;border-top:0;border-right:0;border-bottom:0;border-left:0;">
234
+ <table class="col-pad" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation" style="mso-table-lspace:0;mso-table-rspace:0;">
235
+ <tr><td class="pad" style="padding-top:10px;padding-bottom:10px;">
236
+
237
+ <!-- html_block: EspoCRM unsubscribe token -->
238
+ <div class="html_block" style="text-align:center;">
239
+ <p style="margin:0;font-family:&quot;Open Sans&quot;,&quot;Helvetica Neue&quot;,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.2;mso-line-height-alt:19px;text-align:center;">
240
+ <a href="{optOutLink}" style="color:#00B8B8;text-decoration:none;" target="_blank">Unsubscribe</a>
241
+ </p>
242
+ </div>
243
+
244
+ </td></tr>
245
+ </table>
246
+ </td>
247
+ </tr></tbody>
248
+ </table>
249
+ </td></tr></tbody>
250
+ </table>
251
+ <!-- /Row 6 -->
252
+
253
+ </td></tr></tbody>
254
+ </table>
255
+ </body>
256
+ </html>
@@ -0,0 +1,66 @@
1
+ # Drip Sequence Reference
2
+
3
+ Patterns for individual drip/sequence emails. EspoCRM handles timing — this skill only produces standalone HTML.
4
+
5
+ ## What This Covers
6
+
7
+ Individual email HTML for sequences. The sequencing logic (delays, conditions, triggers) lives in EspoCRM's BPM/Workflows — not in this skill.
8
+
9
+ ## Common Sequence Types
10
+
11
+ | Sequence | Emails | Goal |
12
+ |----------|--------|------|
13
+ | Welcome | 3-5 | Onboard new member, set expectations |
14
+ | Donor nurture | 4-6 | First donation → recurring donor |
15
+ | Re-engagement | 2-3 | Win back inactive members |
16
+ | Event follow-up | 2-3 | Post-webinar engagement |
17
+
18
+ ## Individual Email Patterns
19
+
20
+ **Welcome Email 1 (Immediate)**
21
+ - Warm, personal tone (Friendly + Supportive)
22
+ - Confirm what they signed up for
23
+ - Set expectations (what they'll receive, how often)
24
+ - One clear CTA: "Complete Your Profile »" or "Explore Resources »"
25
+ - Keep short — they just signed up, don't overwhelm
26
+
27
+ **Welcome Email 2 (Day 2-3)**
28
+ - Highlight one valuable resource
29
+ - Social proof (member count, impact stats)
30
+ - CTA: engage with specific content
31
+
32
+ **Welcome Email 3 (Day 5-7)**
33
+ - Deeper engagement — invite to community, events
34
+ - Ask for feedback or preferences
35
+ - CTA: "Join the Conversation »" or similar
36
+
37
+ ## Design Rules for Sequences
38
+
39
+ - Each email MUST stand alone (reader may not have seen previous ones)
40
+ - Progressive disclosure — don't front-load all information
41
+ - Consistent header/footer across sequence
42
+ - Vary CTA text (don't repeat "Learn More" 5 times)
43
+ - Subject lines should work independently (no "Part 2 of 5")
44
+ - Match production email styling: Lato headings / Open Sans body, #00B8B8 CTA color, #494949 body text, 16px body size
45
+
46
+ ## HTML Structure
47
+
48
+ Each drip email uses the same BeeFree-style HTML structure:
49
+ `nl-container → row → row-content → column`
50
+
51
+ Use `assets/base-template.html` as the starting skeleton for every email.
52
+
53
+ ## EspoCRM Variables
54
+
55
+ Use single-brace syntax: `{Person.firstName}`, `{optOutLink}`, `{accountName}`
56
+
57
+ Do NOT use Handlebars double-brace syntax (`{{variable}}`).
58
+
59
+ ## EspoCRM Integration Note
60
+
61
+ Each email is a separate EspoCRM Email Template. The BPM process handles:
62
+ - Trigger conditions (signup, purchase, inactivity period)
63
+ - Delays between emails
64
+ - Exit conditions (unsubscribe, completed action)
65
+
66
+ The skill outputs individual HTML files; configure sequencing in EspoCRM.
@@ -0,0 +1,104 @@
1
+ # Email CSS Safety Reference
2
+
3
+ ## Safe CSS Properties
4
+
5
+ | Property | Gmail | Outlook | Apple Mail | Notes |
6
+ |---|---|---|---|---|
7
+ | `color` | ✓ | ✓ | ✓ | Always inline |
8
+ | `font-family` | ✓ | ✓ | ✓ | Include fallback stack |
9
+ | `font-size` | ✓ | ✓ | ✓ | Use px, not rem/em |
10
+ | `font-weight` | ✓ | ✓ | ✓ | Use numeric values (400, 700) |
11
+ | `background-color` | ✓ | ✓ | ✓ | On `<td>`, not `<div>` for Outlook |
12
+ | `text-align` | ✓ | ✓ | ✓ | Also use HTML `align=""` for Outlook |
13
+ | `text-decoration` | ✓ | ✓ | ✓ | — |
14
+ | `line-height` | ✓ | ✓ | ✓ | Unitless values safest; add `mso-line-height-alt` for Outlook |
15
+ | `border` | ✓ | ✓ | ✓ | Shorthand works |
16
+ | `padding` on `<td>` | ✓ | ✓ | ✓ | Use `<td>` not `<p>`/`<div>` |
17
+ | `vertical-align` | ✓ | ✓ | ✓ | Use on `<td>` |
18
+ | `width` | ✓ | ✓ | ✓ | Also set HTML `width=""` attribute |
19
+ | `height` | ✓ | ✓ | ✓ | Also set HTML `height=""` attribute |
20
+
21
+ ## Partially Supported
22
+
23
+ | Property | Issue |
24
+ |---|---|
25
+ | `border-radius` | Outlook ignores it entirely |
26
+ | `max-width` | Gmail app (Android) ignores; use `width` on table instead |
27
+ | `margin` | Outlook collapses margins unpredictably; avoid on block elements |
28
+ | `padding` on `<p>`/`<div>` | Outlook unreliable; wrap in `<td>` instead |
29
+ | `background-image` | Outlook (Word engine) ignores CSS background images |
30
+
31
+ ## Never Use in Email
32
+
33
+ | Property | Reason |
34
+ |---|---|
35
+ | `position` | Broken across all clients |
36
+ | `float` | Outlook ignores; use tables |
37
+ | `display: flex` / `grid` | Not supported in Outlook or Gmail app |
38
+ | `box-shadow` | Stripped by most clients |
39
+ | `opacity` | Inconsistent; prefer solid colors |
40
+ | `calc()` | Not supported |
41
+ | CSS variables (`--var`) | Not supported |
42
+ | `@media` queries | Gmail app strips; limit use |
43
+
44
+ ## Layout Rules
45
+
46
+ - Tables ONLY for layout — Outlook uses the Word rendering engine, not a browser
47
+ - `role="presentation"` on all layout tables
48
+ - Always set `cellpadding="0" cellspacing="0" border="0"` explicitly
49
+ - Use HTML `width` attributes on `<table>` and `<td>` (not just CSS) for Outlook
50
+ - 600px max width for email body
51
+ - Use `align="center"` on wrapper table, not CSS margin auto
52
+
53
+ ## Typography
54
+
55
+ **Google Fonts import** (wrap in MSO conditional so Outlook skips it):
56
+ ```html
57
+ <!--[if !mso]><!-->
58
+ <link href="https://fonts.googleapis.com/css2?family=Lato:wght@700&family=Open+Sans:wght@400" rel="stylesheet">
59
+ <!--<![endif]-->
60
+ ```
61
+
62
+ | Element | Primary | Fallback Stack |
63
+ |---|---|---|
64
+ | Headings | Lato | Arial, Helvetica, sans-serif |
65
+ | Body / Footer | Open Sans | "Helvetica Neue", Helvetica, Arial, sans-serif |
66
+ | Monospace | Courier New | Courier, monospace |
67
+
68
+ **Font sizes (production):**
69
+
70
+ | Element | Size | Weight | Line-height | Outlook `mso-line-height-alt` |
71
+ |---|---|---|---|---|
72
+ | Main H1 | 28px | 700 | 1.2 | 34px |
73
+ | Section H1 | 20px | 700 | 1.2 | 24px |
74
+ | Body | 16px | 400 | 1.2 | 19px |
75
+ | Button | 16px | 700 | — | — |
76
+
77
+ ## CSS Reset
78
+
79
+ ```css
80
+ * { box-sizing: border-box; }
81
+ body { margin: 0; padding: 0; }
82
+ a[x-apple-data-detectors] { color: inherit !important; text-decoration: inherit !important; }
83
+ #MessageViewBody a { color: inherit; text-decoration: none; }
84
+ p { line-height: inherit; }
85
+ ```
86
+
87
+ ## Image Rules
88
+
89
+ - Always: absolute URLs (`https://`), explicit `width` + `height` attributes, `display:block`, meaningful `alt` text
90
+ - Standard content images: `border-radius: 5px`
91
+ - Never: CSS `background-image` (Outlook won't render), rely on images for critical content
92
+ - Retina: serve 2x images with 1x `width`/`height` attributes
93
+ - Max image width: match container (typically 600px or less)
94
+
95
+ ## Color Accessibility
96
+
97
+ | Color | Use | Ratio | Status |
98
+ |---|---|---|---|
99
+ | Body text `#494949` (Gravel) | Body/footer text | 7.7:1 | ✓ WCAG AA |
100
+ | Headings `#00066F` (Trustworthy Indigo) | H1/H2 on white | >10:1 | ✓ WCAG AAA |
101
+ | `#007BB4` (Accessible Teal) | Links, small CTA | 4.6:1 | ✓ WCAG AA |
102
+ | `#00B8B8` (Aquatic Pulse) | Large text/buttons only | 3.0:1 | ✗ Body text; use 18px+ or bold 16px+ |
103
+
104
+ Minimum 4.5:1 for body text (WCAG AA). Use `#00B8B8` only on large text or solid-fill buttons where background provides contrast.
@@ -0,0 +1,58 @@
1
+ # EspoCRM Email Template Compatibility
2
+
3
+ ## What EspoCRM Strips
4
+
5
+ | Tag / Attribute | Notes |
6
+ |---|---|
7
+ | `<html>`, `<head>`, `<body>` | Document-level structure removed |
8
+ | `<style>` blocks | Stripped by prep script; inline CSS only is the guarantee |
9
+ | `<script>`, `<iframe>`, `<embed>`, `<object>` | Security-stripped |
10
+ | Event handlers (`onclick`, `onload`, etc.) | Stripped |
11
+ | `data-*` attributes | May be stripped |
12
+
13
+ Responsive `@media` queries in `<style>` blocks are lost after EspoCRM prep. This is expected — EspoCRM renders in its own container.
14
+
15
+ ## What Survives
16
+
17
+ - Table-based layouts with inline `style=""` attributes
18
+ - `<img>` with inline styles and HTML attributes (`width`, `height`, `alt`)
19
+ - `<a>` links
20
+ - Standard block/inline elements: `div`, `span`, `p`, `h1–h6`, `ul`, `ol`, `li`, `br`, `hr`
21
+
22
+ ## The Body→Div Transform
23
+
24
+ The key transform is simple: `espocrm-prep.py` extracts `<body>` content and wraps it in a `<div>`. The `<head>` style block, Google Fonts import, and MSO conditionals are all stripped.
25
+
26
+ ```bash
27
+ python3 scripts/espocrm-prep.py input.html --out output.html
28
+ ```
29
+
30
+ ## Source View Paste Workflow
31
+
32
+ 1. Generate email HTML (or receive from BeeFree/external tool)
33
+ 2. Run `espocrm-prep.py` — this extracts `<body>` content and wraps in `<div>`. The `<head>` style block, Google Fonts import, and MSO conditionals are all stripped.
34
+ 3. In EspoCRM: Email Template → Edit → switch to Source View (`< >` icon)
35
+ 4. Paste the prepared HTML
36
+ 5. **NEVER switch back to WYSIWYG** — it will corrupt the HTML
37
+ 6. Save directly from source view
38
+
39
+ ## EspoCRM Template Variables
40
+
41
+ EspoCRM uses **single-brace** syntax (NOT Handlebars double-brace):
42
+
43
+ | Variable | Usage | Email Types |
44
+ |----------|-------|-------------|
45
+ | `{Person.firstName}` | First name greeting | Newsletters |
46
+ | `{Person.name}` | Full name greeting | Campaigns, fundraising |
47
+ | `{optOutLink}` | Unsubscribe link | ALL emails (footer) |
48
+
49
+ The `{optOutLink}` renders as a clickable link. Style the container:
50
+ ```html
51
+ <div style="text-align: center; color: #00B8B8;">{optOutLink}</div>
52
+ ```
53
+
54
+ ## Tips
55
+
56
+ - Build HTML externally, paste into source view as a single operation
57
+ - Test by sending a test email to yourself before mass send
58
+ - If HTML looks broken after saving, it was round-tripped through WYSIWYG — rebuild from source
@@ -0,0 +1,127 @@
1
+ # Newsletter Layout Reference
2
+
3
+ HTML structure patterns for newsletters, campaigns, fundraising, and webinar promo emails. IMA-branded.
4
+
5
+ ## Common Structure (BeeFree DOM)
6
+
7
+ ```
8
+ body (background: #F2F3F5)
9
+ └── nl-container table (100% width, role="presentation")
10
+ └── row table (100% width, center-aligned)
11
+ └── row-content stack table (600px, margin: 0 auto, background: #FFFFFF)
12
+ └── column column-1 td (100%)
13
+ └── col-pad td (padding)
14
+ └── [content block tables]
15
+ ```
16
+
17
+ Content block class names: `image_block`, `heading_block`, `paragraph_block`, `button_block`, `divider_block`, `list_block`, `html_block`, `social_block`
18
+
19
+ ## Preheader Pattern
20
+
21
+ ```html
22
+ <div style="display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0;max-width:0;opacity:0;overflow:hidden;">
23
+ Preview text here (50-100 chars for inbox)
24
+ </div>
25
+ ```
26
+
27
+ ## CTA Button Pattern (VML hybrid, Outlook-safe)
28
+
29
+ ```html
30
+ <a href="URL" target="_blank" style="color: #ffffff; text-decoration: none;">
31
+ <!--[if mso]>
32
+ <v:roundrect style="height:42px;width:122px;v-text-anchor:middle;" arcsize="10%" fillcolor="#00B8B8">
33
+ <v:stroke dashstyle="Solid" weight="0px" color="#00B8B8"/>
34
+ <w:anchorlock/>
35
+ <v:textbox inset="0px,0px,0px,0px">
36
+ <center style="color:#ffffff;font-family:Arial, Helvetica, sans-serif;font-size:16px">
37
+ <![endif]-->
38
+ <span class="button" style="background-color:#00B8B8;border-radius:4px;color:#ffffff;display:inline-block;font-family:Lato,Arial,Helvetica,sans-serif;font-size:16px;font-weight:500;text-align:center;word-break:keep-all;">
39
+ <span class="btn-pad" style="padding:5px 10px;display:block;">
40
+ <span style="word-break:break-word;line-height:32px;">Read <strong>More »</strong></span>
41
+ </span>
42
+ </span>
43
+ <!--[if mso]></center></v:textbox></v:roundrect><![endif]-->
44
+ </a>
45
+ ```
46
+
47
+ Note: VML width varies per button text. CTA text uses `»` (raquo) chevron. "More" is bold.
48
+
49
+ ## Section Divider Pattern
50
+
51
+ ```html
52
+ <table class="divider_block" width="100%" cellpadding="0" cellspacing="0" border="0" role="presentation">
53
+ <tr>
54
+ <td class="divider_inner" style="border-top:1px solid #dddddd;font-size:1px;line-height:1px;">&#8202;</td>
55
+ </tr>
56
+ </table>
57
+ ```
58
+
59
+ Note: Uses `&#8202;` (hair space), not `&nbsp;`.
60
+
61
+ ## Content Block Repeating Pattern
62
+
63
+ ```
64
+ heading_block (h1, 20px emoji + title, color:#00066F, font: Lato, Arial, Helvetica, sans-serif)
65
+ → image_block (580px, border-radius 5px, linked)
66
+ → paragraph_block (16px body text, color #494949, font: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif)
67
+ → button_block (VML hybrid CTA)
68
+ → divider_block (#dddddd)
69
+ ```
70
+
71
+ ## Colors & Fonts
72
+
73
+ Colors — CTA: `#00B8B8` | Body text: `#494949` | Outer background: `#F2F3F5` | Inner container: `#FFFFFF` | Dividers: `#dddddd` | Footer: `#919396` | H1: `#00066F`
74
+
75
+ Fonts — Headings: `Lato, Arial, Helvetica, sans-serif` | Body: `"Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif`
76
+
77
+ ## UTM Tracking
78
+
79
+ ALL links must include UTM params:
80
+ `?utm_term=YYYY-MM-DD&utm_medium=email&utm_source=bulk-mailer&utm_content=slug&utm_campaign=type`
81
+
82
+ ## EspoCRM Variables
83
+
84
+ Single-brace syntax: `{Person.firstName}`, `{Person.name}`, `{optOutLink}`
85
+
86
+ ## Newsletter Layout
87
+
88
+ 1. **Preheader** — preview text
89
+ 2. **Header** — IMA logo (horizontal lockup, 200px min width)
90
+ 3. **Opening hook** — `{Person.firstName}` greeting, 2-3 sentences, personality-forward
91
+ 4. **Quick Links** — emoji + title list (3-6 items)
92
+ 5. **Content sections** (3-6) — emoji header, 2-3 sentence summary, "Read More »" CTA
93
+ 6. **Support footer** — "PLEASE SUPPORT HONEST MEDICINE" + donate CTA
94
+ 7. **Standard footer** — disclaimer, `{optOutLink}`, address
95
+
96
+ ## Fundraising / Campaign Layout
97
+
98
+ 1. **Preheader**
99
+ 2. **Header** with logo
100
+ 3. **Emotional headline** (h1)
101
+ 4. **Donate CTA above fold** — "💙 Match My Gift Today »" (or "💙 Please Donate »")
102
+ 5. **Salutation** — "Dear {Person.name}"
103
+ 6. **Problem/solution narrative** — 2-3 paragraphs
104
+ 7. **Pull quote** from named leader
105
+ 8. **"Why Your Support Matters"** — 3-4 bullets
106
+ 9. **"Your Gift Powers What's Next"** — 4 bullets with specific dollar amounts
107
+ 10. **Signoff** with full credentials + P.S. with deadline + repeat CTA
108
+ 11. **Footer**
109
+
110
+ Note: If match campaign, repeat "EVERY DOLLAR DOUBLED" 2-3 times.
111
+
112
+ ## Webinar / Resource Promo Layout
113
+
114
+ 1. **Preheader** → **Header**
115
+ 2. **"Watch Now!" header** (h1) + hook headline
116
+ 3. **Context** — 3-4 sentences with tension
117
+ 4. **"In this episode, you'll learn:"** — 3 surprising bullets
118
+ 5. **Expert attribution** — name, credentials, affiliation
119
+ 6. **"👉 Watch Now »" / "Download Now »"** CTA → **Footer**
120
+
121
+ ## Journal / Institutional Layout
122
+
123
+ Static only — no template variables. Institutional tone. CTAs: "Submit a Paper »" / "Get Tickets »"
124
+
125
+ 1. **Preheader** → **Header** → **Headline + subhead**
126
+ 2. **Content sections** — article summaries or event details
127
+ 3. **CTA block** → **Footer**