--- name: maestra-email description: Creates and modifies emails for the Maestra editor (visual builder) from a text description. Use when the user asks to create or modify an email, or describes an email template. The technical layout is passed for preview and saving to the linked skill maestra-email-ops. --- # maestra-email — email generation Generates a technical email layout from a text description. The internal output for Ops is valid JSX, which is then converted into the Maestra editor's JSON. ## Skill boundaries This is a portable JSX generator. It does **not work directly** with gallery/upload tools, mailing ID and rowVersion, VNet, or saving to Maestra. All operational actions — uploading and searching images via Ops, JSX → JSON conversion, HTML rendering, PNG preview, reading campaign metadata/visual template, and saving — are performed by the linked skill **maestra-email-ops**. The Generator uses JSON/HTML/PNG feedback from Ops to self-correct the JSX, but does not fix operational errors on its own and does not invent URLs. ## Communicating with the user JSX, internal IDs, and rowVersion are internal details of the Generator–Ops interaction. In a normal dialogue with a CSM, use "email", "email layout", "email content", "preview", and "saving" — not JSX, `mailingInternalId`, `variantInternalId`, `formatInternalId`, `rowVersion`, or `visualTemplateRowVersion`. Do not replace the terms Active/Draft: if they are needed to pick the exact version, use Active/Draft verbatim. Do not show raw JSX or GUIDs unless the user explicitly requested code, an export, markup, or technical details. Return backend errors verbatim, even if they contain technical terms, tag names, line numbers, or identifiers. ## Not implemented (deliberately) - **Do not use `variant`.** Theme sync is currently disabled, so theme presets are not part of the DSL and are not activated on request. Set styles via `style={{...}}` (Text) or `simpleTextStyles={{...}}` (Button); when asked to use a preset, explain the limitation and offer explicit styles. - **Do not use** `` — the email theme is not accessible from the DSL; styles are set via `style` on Text and `simpleTextStyles` on Button. - **Do not set** `targeting` on Block/Row — it is an external setting, not accessible from the DSL. - **Do not use** `mobile={{…}}` — mobile values are written inside the attribute's JSON structure (for example `innerSpacing={{ top: 24, mobile: { top: 12 } }}`). - **Do not use** the `` tag and do not insert arbitrary personalization (`{{name}}`, `${Customer...}`, `${Order...}`) into text or URLs. If the user asks for personalization — offer static text. Existing personalization in an email is preserved on round-trip. The only permitted new exception is the exact token `${Message.UnsubscribeLink}` in the `href` of an `` link inside `` per the rules of the "Unsubscribe link" section. - **`` is allowed only with a source.** Write the full form `image={{ mode: "static", static: { url, fileName } }}`; bare `` is forbidden, because the backend substitutes a base64 placeholder. Source rules are in the "Images" section. - **`` without `bulletIcon` breaks the layout.** The default system marker renders as a giant black circle: the backend inserts SVG into `src` without escaping quotes. Always set an HTTPS icon explicitly. For a small dot use the live-verified flat form `bulletIcon={{ url, fileName }}` — it renders a marker 4px wide. For a large editable marker/number badge use the constructor-compatible form `bulletIcon={{ type: "custom", url, fileName, size: N }}` — the stored template and live preview/HTML confirmed an actual width of `N`. The form `{{ mode: "static", static: {...} }}` is silently ignored; a string crashes the preview with `Internal server error`. - **Standalone** ``, `