@depup/react-email 5.2.10-depup.0 → 6.9.0-depup.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/CHANGELOG.md +313 -0
  2. package/README.md +11 -10
  3. package/changes.json +21 -17
  4. package/dev/CHANGELOG.md +2 -0
  5. package/dev/index.js +1 -1
  6. package/dev/package.json +1 -1
  7. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  8. package/dist/cli/index.mjs +7801 -0
  9. package/dist/components/body/body.cjs +39 -0
  10. package/dist/components/body/body.d.cts +7 -0
  11. package/dist/components/body/body.d.mts +7 -0
  12. package/dist/components/body/body.mjs +37 -0
  13. package/dist/components/body/index.d.cts +1 -0
  14. package/dist/components/body/index.d.mts +1 -0
  15. package/dist/components/body/margin-properties.cjs +30 -0
  16. package/dist/components/body/margin-properties.mjs +29 -0
  17. package/dist/components/button/button.cjs +64 -0
  18. package/dist/components/button/button.d.cts +13 -0
  19. package/dist/components/button/button.d.mts +13 -0
  20. package/dist/components/button/button.mjs +62 -0
  21. package/dist/components/button/index.d.cts +1 -0
  22. package/dist/components/button/index.d.mts +1 -0
  23. package/dist/components/button/utils/parse-padding.cjs +90 -0
  24. package/dist/components/button/utils/parse-padding.mjs +90 -0
  25. package/dist/components/button/utils/px-to-pt.cjs +4 -0
  26. package/dist/components/button/utils/px-to-pt.mjs +4 -0
  27. package/dist/components/code-block/code-block.cjs +79 -0
  28. package/dist/components/code-block/code-block.d.cts +20 -0
  29. package/dist/components/code-block/code-block.d.mts +20 -0
  30. package/dist/components/code-block/code-block.mjs +77 -0
  31. package/dist/components/code-block/index.d.cts +3 -0
  32. package/dist/components/code-block/index.d.mts +3 -0
  33. package/dist/components/code-block/languages-available.d.cts +4 -0
  34. package/dist/components/code-block/languages-available.d.mts +4 -0
  35. package/dist/components/code-block/prism.cjs +14564 -0
  36. package/dist/components/code-block/prism.mjs +14562 -0
  37. package/dist/components/code-block/themes.cjs +2578 -0
  38. package/dist/components/code-block/themes.d.cts +4877 -0
  39. package/dist/components/code-block/themes.d.mts +4877 -0
  40. package/dist/components/code-block/themes.mjs +2541 -0
  41. package/dist/components/code-inline/code-inline.cjs +43 -0
  42. package/dist/components/code-inline/code-inline.d.cts +12 -0
  43. package/dist/components/code-inline/code-inline.d.mts +12 -0
  44. package/dist/components/code-inline/code-inline.mjs +41 -0
  45. package/dist/components/code-inline/index.d.cts +1 -0
  46. package/dist/components/code-inline/index.d.mts +1 -0
  47. package/dist/components/column/column.cjs +19 -0
  48. package/dist/components/column/column.d.cts +7 -0
  49. package/dist/components/column/column.d.mts +7 -0
  50. package/dist/components/column/column.mjs +17 -0
  51. package/dist/components/column/index.d.cts +1 -0
  52. package/dist/components/column/index.d.mts +1 -0
  53. package/dist/components/container/container.cjs +42 -0
  54. package/dist/components/container/container.d.cts +7 -0
  55. package/dist/components/container/container.d.mts +7 -0
  56. package/dist/components/container/container.mjs +40 -0
  57. package/dist/components/container/index.d.cts +1 -0
  58. package/dist/components/container/index.d.mts +1 -0
  59. package/dist/components/element-marker.cjs +8 -0
  60. package/dist/components/element-marker.mjs +7 -0
  61. package/dist/components/font/font.cjs +22 -0
  62. package/dist/components/font/font.d.cts +26 -0
  63. package/dist/components/font/font.d.mts +26 -0
  64. package/dist/components/font/font.mjs +21 -0
  65. package/dist/components/font/index.d.cts +1 -0
  66. package/dist/components/font/index.d.mts +1 -0
  67. package/dist/components/head/head.cjs +20 -0
  68. package/dist/components/head/head.d.cts +7 -0
  69. package/dist/components/head/head.d.mts +7 -0
  70. package/dist/components/head/head.mjs +18 -0
  71. package/dist/components/head/index.d.cts +1 -0
  72. package/dist/components/head/index.d.mts +1 -0
  73. package/dist/components/heading/heading.cjs +30 -0
  74. package/dist/components/heading/heading.d.cts +22 -0
  75. package/dist/components/heading/heading.d.mts +22 -0
  76. package/dist/components/heading/heading.mjs +28 -0
  77. package/dist/components/heading/index.d.cts +1 -0
  78. package/dist/components/heading/index.d.mts +1 -0
  79. package/dist/components/heading/utils/as.d.cts +16 -0
  80. package/dist/components/heading/utils/as.d.mts +16 -0
  81. package/dist/components/heading/utils/spaces.cjs +24 -0
  82. package/dist/components/heading/utils/spaces.d.cts +14 -0
  83. package/dist/components/heading/utils/spaces.d.mts +14 -0
  84. package/dist/components/heading/utils/spaces.mjs +24 -0
  85. package/dist/components/hr/hr.cjs +21 -0
  86. package/dist/components/hr/hr.d.cts +7 -0
  87. package/dist/components/hr/hr.d.mts +7 -0
  88. package/dist/components/hr/hr.mjs +19 -0
  89. package/dist/components/hr/index.d.cts +1 -0
  90. package/dist/components/hr/index.d.mts +1 -0
  91. package/dist/components/html/html.cjs +15 -0
  92. package/dist/components/html/html.d.cts +7 -0
  93. package/dist/components/html/html.d.mts +7 -0
  94. package/dist/components/html/html.mjs +13 -0
  95. package/dist/components/html/index.d.cts +1 -0
  96. package/dist/components/html/index.d.mts +1 -0
  97. package/dist/components/img/img.cjs +25 -0
  98. package/dist/components/img/img.d.cts +7 -0
  99. package/dist/components/img/img.d.mts +7 -0
  100. package/dist/components/img/img.mjs +23 -0
  101. package/dist/components/img/index.d.cts +1 -0
  102. package/dist/components/img/index.d.mts +1 -0
  103. package/dist/components/index.d.cts +24 -0
  104. package/dist/components/index.d.mts +24 -0
  105. package/dist/components/link/index.d.cts +1 -0
  106. package/dist/components/link/index.d.mts +1 -0
  107. package/dist/components/link/link.cjs +21 -0
  108. package/dist/components/link/link.d.cts +7 -0
  109. package/dist/components/link/link.d.mts +7 -0
  110. package/dist/components/link/link.mjs +19 -0
  111. package/dist/components/markdown/index.d.cts +1 -0
  112. package/dist/components/markdown/index.d.mts +1 -0
  113. package/dist/components/markdown/markdown.cjs +101 -0
  114. package/dist/components/markdown/markdown.d.cts +16 -0
  115. package/dist/components/markdown/markdown.d.mts +16 -0
  116. package/dist/components/markdown/markdown.mjs +99 -0
  117. package/dist/components/markdown/styles.cjs +92 -0
  118. package/dist/components/markdown/styles.d.cts +31 -0
  119. package/dist/components/markdown/styles.d.mts +31 -0
  120. package/dist/components/markdown/styles.mjs +92 -0
  121. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.cjs +60 -0
  122. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.mjs +60 -0
  123. package/dist/components/preview/index.d.cts +1 -0
  124. package/dist/components/preview/index.d.mts +1 -0
  125. package/dist/components/preview/preview.cjs +34 -0
  126. package/dist/components/preview/preview.d.cts +21 -0
  127. package/dist/components/preview/preview.d.mts +21 -0
  128. package/dist/components/preview/preview.mjs +31 -0
  129. package/dist/components/row/index.d.cts +1 -0
  130. package/dist/components/row/index.d.mts +1 -0
  131. package/dist/components/row/row.cjs +30 -0
  132. package/dist/components/row/row.d.cts +11 -0
  133. package/dist/components/row/row.d.mts +11 -0
  134. package/dist/components/row/row.mjs +28 -0
  135. package/dist/components/section/index.d.cts +1 -0
  136. package/dist/components/section/index.d.mts +1 -0
  137. package/dist/components/section/section.cjs +36 -0
  138. package/dist/components/section/section.d.cts +7 -0
  139. package/dist/components/section/section.d.mts +7 -0
  140. package/dist/components/section/section.mjs +34 -0
  141. package/dist/components/tailwind/hooks/use-suspended-promise.cjs +15 -0
  142. package/dist/components/tailwind/hooks/use-suspended-promise.mjs +15 -0
  143. package/dist/components/tailwind/index.d.cts +4 -0
  144. package/dist/components/tailwind/index.d.mts +4 -0
  145. package/dist/components/tailwind/inline-styles.cjs +11 -0
  146. package/dist/components/tailwind/inline-styles.d.cts +6 -0
  147. package/dist/components/tailwind/inline-styles.d.mts +6 -0
  148. package/dist/components/tailwind/inline-styles.mjs +11 -0
  149. package/dist/components/tailwind/sanitize-stylesheet.cjs +11 -0
  150. package/dist/components/tailwind/sanitize-stylesheet.d.cts +6 -0
  151. package/dist/components/tailwind/sanitize-stylesheet.d.mts +6 -0
  152. package/dist/components/tailwind/sanitize-stylesheet.mjs +11 -0
  153. package/dist/components/tailwind/tailwind.cjs +120 -0
  154. package/dist/components/tailwind/tailwind.d.cts +25 -0
  155. package/dist/components/tailwind/tailwind.d.mts +25 -0
  156. package/dist/components/tailwind/tailwind.mjs +117 -0
  157. package/dist/components/tailwind/utils/compatibility/get-react-property.cjs +10 -0
  158. package/dist/components/tailwind/utils/compatibility/get-react-property.mjs +10 -0
  159. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.cjs +26 -0
  160. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.mjs +26 -0
  161. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.cjs +126 -0
  162. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.mjs +125 -0
  163. package/dist/components/tailwind/utils/css/extract-rules-per-class.cjs +45 -0
  164. package/dist/components/tailwind/utils/css/extract-rules-per-class.mjs +44 -0
  165. package/dist/components/tailwind/utils/css/get-custom-properties.cjs +35 -0
  166. package/dist/components/tailwind/utils/css/get-custom-properties.mjs +34 -0
  167. package/dist/components/tailwind/utils/css/is-part-inlinable.cjs +10 -0
  168. package/dist/components/tailwind/utils/css/is-part-inlinable.mjs +9 -0
  169. package/dist/components/tailwind/utils/css/is-rule-inlinable.cjs +10 -0
  170. package/dist/components/tailwind/utils/css/is-rule-inlinable.mjs +9 -0
  171. package/dist/components/tailwind/utils/css/make-inline-styles-for.cjs +52 -0
  172. package/dist/components/tailwind/utils/css/make-inline-styles-for.mjs +51 -0
  173. package/dist/components/tailwind/utils/css/resolve-all-css-variables.cjs +89 -0
  174. package/dist/components/tailwind/utils/css/resolve-all-css-variables.mjs +88 -0
  175. package/dist/components/tailwind/utils/css/resolve-calc-expressions.cjs +92 -0
  176. package/dist/components/tailwind/utils/css/resolve-calc-expressions.mjs +91 -0
  177. package/dist/components/tailwind/utils/css/sanitize-declarations.cjs +310 -0
  178. package/dist/components/tailwind/utils/css/sanitize-declarations.mjs +309 -0
  179. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.cjs +46 -0
  180. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.mjs +45 -0
  181. package/dist/components/tailwind/utils/css/split-mixed-rule.cjs +41 -0
  182. package/dist/components/tailwind/utils/css/split-mixed-rule.mjs +40 -0
  183. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.cjs +52 -0
  184. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.mjs +51 -0
  185. package/dist/components/tailwind/utils/css/unwrap-value.cjs +7 -0
  186. package/dist/components/tailwind/utils/css/unwrap-value.mjs +7 -0
  187. package/dist/components/tailwind/utils/react/is-component.cjs +7 -0
  188. package/dist/components/tailwind/utils/react/is-component.mjs +7 -0
  189. package/dist/components/tailwind/utils/react/map-react-tree.cjs +32 -0
  190. package/dist/components/tailwind/utils/react/map-react-tree.mjs +30 -0
  191. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.cjs +37 -0
  192. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.mjs +35 -0
  193. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.cjs +77 -0
  194. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.cts +19 -0
  195. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.mts +19 -0
  196. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.mjs +76 -0
  197. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.cjs +901 -0
  198. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.mjs +901 -0
  199. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.cjs +398 -0
  200. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.mjs +398 -0
  201. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.cjs +467 -0
  202. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.mjs +467 -0
  203. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.cjs +6 -0
  204. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.mjs +6 -0
  205. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.cjs +6 -0
  206. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.mjs +6 -0
  207. package/dist/components/text/index.d.cts +1 -0
  208. package/dist/components/text/index.d.mts +1 -0
  209. package/dist/components/text/text.cjs +43 -0
  210. package/dist/components/text/text.d.cts +7 -0
  211. package/dist/components/text/text.d.mts +7 -0
  212. package/dist/components/text/text.mjs +41 -0
  213. package/dist/components/text/utils/compute-margins.cjs +62 -0
  214. package/dist/components/text/utils/compute-margins.mjs +62 -0
  215. package/dist/index.cjs +95 -0
  216. package/dist/index.d.cts +26 -0
  217. package/dist/index.d.mts +26 -0
  218. package/dist/index.mjs +25 -7326
  219. package/package.json +64 -32
  220. package/src/components/body/__snapshots__/body.spec.tsx.snap +23 -0
  221. package/src/components/body/body.spec.tsx +78 -0
  222. package/src/components/body/body.tsx +62 -0
  223. package/src/components/body/index.ts +1 -0
  224. package/src/components/body/margin-properties.ts +27 -0
  225. package/src/components/button/button.spec.tsx +53 -0
  226. package/src/components/button/button.tsx +114 -0
  227. package/src/components/button/index.ts +1 -0
  228. package/src/components/button/utils/parse-padding.ts +137 -0
  229. package/src/components/button/utils/px-to-pt.ts +4 -0
  230. package/src/components/button/utils/utils.spec.ts +153 -0
  231. package/src/components/code-block/code-block.tsx +136 -0
  232. package/src/components/code-block/index.ts +3 -0
  233. package/src/components/code-block/languages-available.ts +402 -0
  234. package/src/components/code-block/prism.ts +15618 -0
  235. package/src/components/code-block/themes.ts +4929 -0
  236. package/src/components/code-inline/code-inline.tsx +60 -0
  237. package/src/components/code-inline/index.ts +1 -0
  238. package/src/components/column/column.spec.tsx +28 -0
  239. package/src/components/column/column.tsx +17 -0
  240. package/src/components/column/index.ts +1 -0
  241. package/src/components/container/container.spec.tsx +33 -0
  242. package/src/components/container/container.tsx +59 -0
  243. package/src/components/container/index.ts +1 -0
  244. package/src/components/element-marker.ts +5 -0
  245. package/src/components/font/font.spec.tsx +63 -0
  246. package/src/components/font/font.tsx +76 -0
  247. package/src/components/font/index.ts +1 -0
  248. package/src/components/head/head.spec.tsx +34 -0
  249. package/src/components/head/head.tsx +15 -0
  250. package/src/components/head/index.ts +1 -0
  251. package/src/components/heading/heading.spec.tsx +32 -0
  252. package/src/components/heading/heading.tsx +31 -0
  253. package/src/components/heading/index.ts +1 -0
  254. package/src/components/heading/utils/as.ts +26 -0
  255. package/src/components/heading/utils/spaces.ts +64 -0
  256. package/src/components/heading/utils/utils.spec.ts +70 -0
  257. package/src/components/hr/hr.spec.tsx +22 -0
  258. package/src/components/hr/hr.tsx +23 -0
  259. package/src/components/hr/index.ts +1 -0
  260. package/src/components/html/html.spec.tsx +26 -0
  261. package/src/components/html/html.tsx +13 -0
  262. package/src/components/html/index.ts +1 -0
  263. package/src/components/img/img.spec.tsx +30 -0
  264. package/src/components/img/img.tsx +27 -0
  265. package/src/components/img/index.ts +1 -0
  266. package/src/components/index.ts +19 -0
  267. package/src/components/link/index.ts +1 -0
  268. package/src/components/link/link.spec.tsx +37 -0
  269. package/src/components/link/link.tsx +24 -0
  270. package/src/components/markdown/index.ts +1 -0
  271. package/src/components/markdown/markdown.spec.tsx +221 -0
  272. package/src/components/markdown/markdown.tsx +239 -0
  273. package/src/components/markdown/styles.ts +130 -0
  274. package/src/components/markdown/utils/parse-css-in-js-to-inline-css.spec.ts +42 -0
  275. package/src/components/markdown/utils/parse-css-in-js-to-inline-css.ts +73 -0
  276. package/src/components/preview/index.ts +1 -0
  277. package/src/components/preview/preview.spec.tsx +49 -0
  278. package/src/components/preview/preview.tsx +56 -0
  279. package/src/components/row/index.ts +1 -0
  280. package/src/components/row/row.spec.tsx +28 -0
  281. package/src/components/row/row.tsx +33 -0
  282. package/src/components/section/index.ts +1 -0
  283. package/src/components/section/section.spec.tsx +58 -0
  284. package/src/components/section/section.tsx +59 -0
  285. package/src/components/tailwind/e2e/integrations.spec.ts +44 -0
  286. package/src/components/tailwind/e2e/nextjs/README.md +9 -0
  287. package/src/components/tailwind/e2e/nextjs/emails/vercel-invite-user.tsx +151 -0
  288. package/src/components/tailwind/e2e/nextjs/next.config.mjs +6 -0
  289. package/src/components/tailwind/e2e/nextjs/package.json +24 -0
  290. package/src/components/tailwind/e2e/nextjs/src/app/favicon.ico +0 -0
  291. package/src/components/tailwind/e2e/nextjs/src/app/layout.tsx +23 -0
  292. package/src/components/tailwind/e2e/nextjs/src/app/page.tsx +7 -0
  293. package/src/components/tailwind/e2e/nextjs/tsconfig.json +27 -0
  294. package/src/components/tailwind/e2e/vite/README.md +9 -0
  295. package/src/components/tailwind/e2e/vite/emails/vercel-invite-user.tsx +151 -0
  296. package/src/components/tailwind/e2e/vite/index.html +13 -0
  297. package/src/components/tailwind/e2e/vite/package.json +25 -0
  298. package/src/components/tailwind/e2e/vite/public/vite.svg +1 -0
  299. package/src/components/tailwind/e2e/vite/src/App.tsx +10 -0
  300. package/src/components/tailwind/e2e/vite/src/main.tsx +9 -0
  301. package/src/components/tailwind/e2e/vite/src/vite-env.d.ts +1 -0
  302. package/src/components/tailwind/e2e/vite/tsconfig.json +25 -0
  303. package/src/components/tailwind/e2e/vite/tsconfig.node.json +11 -0
  304. package/src/components/tailwind/e2e/vite/vite.config.ts +7 -0
  305. package/src/components/tailwind/hooks/use-suspended-promise.ts +34 -0
  306. package/src/components/tailwind/hooks/use-suspensed-promise.spec.ts +263 -0
  307. package/src/components/tailwind/index.ts +4 -0
  308. package/src/components/tailwind/inline-styles.spec.ts +49 -0
  309. package/src/components/tailwind/inline-styles.ts +21 -0
  310. package/src/components/tailwind/sanitize-stylesheet.ts +10 -0
  311. package/src/components/tailwind/tailwind.spec.tsx +1390 -0
  312. package/src/components/tailwind/tailwind.tsx +178 -0
  313. package/src/components/tailwind/utils/__snapshots__/quick-safe-render-to-string.spec.tsx.snap +3 -0
  314. package/src/components/tailwind/utils/compatibility/escape-class-name.spec.ts +17 -0
  315. package/src/components/tailwind/utils/compatibility/escape-class-name.ts +18 -0
  316. package/src/components/tailwind/utils/compatibility/get-react-property.ts +15 -0
  317. package/src/components/tailwind/utils/compatibility/sanitize-class-name.spec.ts +7 -0
  318. package/src/components/tailwind/utils/compatibility/sanitize-class-name.ts +36 -0
  319. package/src/components/tailwind/utils/compatibility/unescape-class.ts +3 -0
  320. package/src/components/tailwind/utils/css/__snapshots__/extract-rules-matching-classes.spec.ts.snap +23 -0
  321. package/src/components/tailwind/utils/css/__snapshots__/remove-rule-duplicates-from-root.spec.ts.snap +3 -0
  322. package/src/components/tailwind/utils/css/__snapshots__/sanitize-non-inlinable-classes.spec.ts.snap +7 -0
  323. package/src/components/tailwind/utils/css/downlevel-for-email-clients.spec.ts +119 -0
  324. package/src/components/tailwind/utils/css/downlevel-for-email-clients.ts +244 -0
  325. package/src/components/tailwind/utils/css/extract-rules-per-class.spec.ts +232 -0
  326. package/src/components/tailwind/utils/css/extract-rules-per-class.ts +76 -0
  327. package/src/components/tailwind/utils/css/get-custom-properties.ts +49 -0
  328. package/src/components/tailwind/utils/css/is-part-inlinable.ts +15 -0
  329. package/src/components/tailwind/utils/css/is-rule-inlinable.ts +15 -0
  330. package/src/components/tailwind/utils/css/make-inline-styles-for.spec.ts +124 -0
  331. package/src/components/tailwind/utils/css/make-inline-styles-for.ts +73 -0
  332. package/src/components/tailwind/utils/css/resolve-all-css-variables.spec.ts +296 -0
  333. package/src/components/tailwind/utils/css/resolve-all-css-variables.ts +236 -0
  334. package/src/components/tailwind/utils/css/resolve-calc-expressions.spec.ts +36 -0
  335. package/src/components/tailwind/utils/css/resolve-calc-expressions.ts +147 -0
  336. package/src/components/tailwind/utils/css/sanitize-declarations.spec.ts +491 -0
  337. package/src/components/tailwind/utils/css/sanitize-declarations.ts +443 -0
  338. package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.spec.ts +72 -0
  339. package/src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts +48 -0
  340. package/src/components/tailwind/utils/css/split-mixed-rule.ts +68 -0
  341. package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.spec.ts +128 -0
  342. package/src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts +70 -0
  343. package/src/components/tailwind/utils/css/unwrap-value.ts +9 -0
  344. package/src/components/tailwind/utils/react/is-component.ts +12 -0
  345. package/src/components/tailwind/utils/react/map-react-tree.spec.tsx +58 -0
  346. package/src/components/tailwind/utils/react/map-react-tree.ts +58 -0
  347. package/src/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.ts +61 -0
  348. package/src/components/tailwind/utils/tailwindcss/setup-tailwind.spec.ts +25 -0
  349. package/src/components/tailwind/utils/tailwindcss/setup-tailwind.ts +121 -0
  350. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.ts +900 -0
  351. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.ts +397 -0
  352. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.ts +466 -0
  353. package/src/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.ts +5 -0
  354. package/src/components/tailwind/utils/text/from-dash-case-to-camel-case.ts +3 -0
  355. package/src/components/text/index.ts +1 -0
  356. package/src/components/text/text.spec.tsx +35 -0
  357. package/src/components/text/text.tsx +50 -0
  358. package/src/components/text/utils/compute-margins.spec.ts +67 -0
  359. package/src/components/text/utils/compute-margins.ts +102 -0
  360. package/src/index.ts +2 -110
  361. package/tsconfig.json +9 -4
  362. package/tsdown.config.ts +51 -6
  363. package/vitest.config.ts +1 -0
  364. package/vitest.e2e.config.ts +17 -0
  365. package/src/commands/build.ts +0 -269
  366. package/src/commands/dev.ts +0 -27
  367. package/src/commands/export.ts +0 -204
  368. package/src/commands/resend/reset.ts +0 -8
  369. package/src/commands/resend/setup.ts +0 -29
  370. package/src/commands/start.ts +0 -38
  371. package/src/utils/conf.ts +0 -9
  372. package/src/utils/esbuild/escape-string-for-regex.ts +0 -3
  373. package/src/utils/esbuild/renderring-utilities-exporter.ts +0 -63
  374. package/src/utils/get-emails-directory-metadata.spec.ts +0 -82
  375. package/src/utils/get-emails-directory-metadata.ts +0 -140
  376. package/src/utils/get-preview-server-location.ts +0 -50
  377. package/src/utils/index.ts +0 -2
  378. package/src/utils/packageJson.ts +0 -4
  379. package/src/utils/preview/get-env-variables-for-preview-app.ts +0 -20
  380. package/src/utils/preview/hot-reloading/create-dependency-graph.spec.ts +0 -226
  381. package/src/utils/preview/hot-reloading/create-dependency-graph.ts +0 -343
  382. package/src/utils/preview/hot-reloading/get-imported-modules.spec.ts +0 -151
  383. package/src/utils/preview/hot-reloading/get-imported-modules.ts +0 -49
  384. package/src/utils/preview/hot-reloading/resolve-path-aliases.spec.ts +0 -11
  385. package/src/utils/preview/hot-reloading/resolve-path-aliases.ts +0 -32
  386. package/src/utils/preview/hot-reloading/setup-hot-reloading.ts +0 -121
  387. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/data-to-import.json +0 -1
  388. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-a.ts +0 -5
  389. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/file-b.ts +0 -5
  390. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/general-importing-file.ts +0 -9
  391. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/outer-dependency.ts +0 -3
  392. package/src/utils/preview/hot-reloading/test/dependency-graph/inner/path-aliases.ts +0 -1
  393. package/src/utils/preview/hot-reloading/test/dependency-graph/outer.ts +0 -5
  394. package/src/utils/preview/hot-reloading/test/some-file.ts +0 -0
  395. package/src/utils/preview/hot-reloading/test/tsconfig.json +0 -8
  396. package/src/utils/preview/index.ts +0 -2
  397. package/src/utils/preview/serve-static-file.ts +0 -51
  398. package/src/utils/preview/start-dev-server.ts +0 -252
  399. package/src/utils/register-spinner-autostopping.ts +0 -28
  400. package/src/utils/style-text.ts +0 -11
  401. package/src/utils/tree.spec.ts +0 -29
  402. package/src/utils/tree.ts +0 -76
  403. package/src/utils/types/hot-reload-change.ts +0 -6
  404. package/src/utils/types/hot-reload-event.ts +0 -3
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import { markAsElement } from '../element-marker.js';
3
+
4
+ export type HrProps = Readonly<React.ComponentPropsWithoutRef<'hr'>>;
5
+
6
+ export const Hr = React.forwardRef<HTMLHRElement, HrProps>(
7
+ ({ style, ...props }, ref) => (
8
+ <hr
9
+ {...props}
10
+ ref={ref}
11
+ style={{
12
+ width: '100%',
13
+ border: 'none',
14
+ borderColor: 'transparent',
15
+ borderTop: '1px solid #eaeaea',
16
+ ...style,
17
+ }}
18
+ />
19
+ ),
20
+ );
21
+
22
+ Hr.displayName = 'Hr';
23
+ markAsElement(Hr);
@@ -0,0 +1 @@
1
+ export * from './hr.js';
@@ -0,0 +1,26 @@
1
+ import { render } from '@react-email/render';
2
+ import { Html } from './index.js';
3
+
4
+ describe('<Html> component', () => {
5
+ it('renders children correctly', async () => {
6
+ const testMessage = 'Test message';
7
+ const html = await render(<Html>{testMessage}</Html>);
8
+ expect(html).toContain(testMessage);
9
+ });
10
+
11
+ it('passes props correctly', async () => {
12
+ const html = await render(
13
+ <Html data-testid="html-test" dir="rtl" lang="fr" />,
14
+ );
15
+ expect(html).toContain('lang="fr"');
16
+ expect(html).toContain('dir="rtl"');
17
+ expect(html).toContain('data-testid="html-test"');
18
+ });
19
+
20
+ it('renders correctly', async () => {
21
+ const actualOutput = await render(<Html />);
22
+ expect(actualOutput).toMatchInlineSnapshot(
23
+ `"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html dir="ltr" lang="en"><head></head><!--$--><!--html--><!--/$--></html>"`,
24
+ );
25
+ });
26
+ });
@@ -0,0 +1,13 @@
1
+ import * as React from 'react';
2
+
3
+ export type HtmlProps = Readonly<React.ComponentPropsWithoutRef<'html'>>;
4
+
5
+ export const Html = React.forwardRef<HTMLHtmlElement, HtmlProps>(
6
+ ({ children, lang = 'en', dir = 'ltr', ...props }, ref) => (
7
+ <html {...props} dir={dir} lang={lang} ref={ref}>
8
+ {children}
9
+ </html>
10
+ ),
11
+ );
12
+
13
+ Html.displayName = 'Html';
@@ -0,0 +1 @@
1
+ export * from './html.js';
@@ -0,0 +1,30 @@
1
+ import { render } from '@react-email/render';
2
+ import { Img } from './index.js';
3
+
4
+ describe('<Img> component', () => {
5
+ it('passes style and other props correctly', async () => {
6
+ const style = { backgroundColor: 'red', border: 'solid 1px black' };
7
+ const html = await render(
8
+ <Img
9
+ alt="Cat"
10
+ data-testid="img-test"
11
+ height="300"
12
+ src="cat.jpg"
13
+ style={style}
14
+ width="300"
15
+ />,
16
+ );
17
+ expect(html).toContain('background-color:red');
18
+ expect(html).toContain('border:solid 1px black');
19
+ expect(html).toContain('data-testid="img-test"');
20
+ });
21
+
22
+ it('renders correctly', async () => {
23
+ const actualOutput = await render(
24
+ <Img alt="Cat" height="300" src="cat.jpg" width="300" />,
25
+ );
26
+ expect(actualOutput).toMatchInlineSnapshot(
27
+ `"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><img alt="Cat" height="300" src="cat.jpg" style="display:block;outline:none;border:none;text-decoration:none" width="300"/><!--/$-->"`,
28
+ );
29
+ });
30
+ });
@@ -0,0 +1,27 @@
1
+ import * as React from 'react';
2
+ import { markAsElement } from '../element-marker.js';
3
+
4
+ export type ImgProps = Readonly<React.ComponentPropsWithoutRef<'img'>>;
5
+
6
+ export const Img = React.forwardRef<HTMLImageElement, ImgProps>(
7
+ ({ alt, src, width, height, style, ...props }, ref) => (
8
+ <img
9
+ {...props}
10
+ alt={alt ?? ''}
11
+ height={height}
12
+ ref={ref}
13
+ src={src}
14
+ style={{
15
+ display: 'block',
16
+ outline: 'none',
17
+ border: 'none',
18
+ textDecoration: 'none',
19
+ ...style,
20
+ }}
21
+ width={width}
22
+ />
23
+ ),
24
+ );
25
+
26
+ Img.displayName = 'Img';
27
+ markAsElement(Img);
@@ -0,0 +1 @@
1
+ export * from './img.js';
@@ -0,0 +1,19 @@
1
+ export * from './body/index.js';
2
+ export * from './button/index.js';
3
+ export * from './code-block/index.js';
4
+ export * from './code-inline/index.js';
5
+ export * from './column/index.js';
6
+ export * from './container/index.js';
7
+ export * from './font/index.js';
8
+ export * from './head/index.js';
9
+ export * from './heading/index.js';
10
+ export * from './hr/index.js';
11
+ export * from './html/index.js';
12
+ export * from './img/index.js';
13
+ export * from './link/index.js';
14
+ export * from './markdown/index.js';
15
+ export * from './preview/index.js';
16
+ export * from './row/index.js';
17
+ export * from './section/index.js';
18
+ export * from './tailwind/index.js';
19
+ export * from './text/index.js';
@@ -0,0 +1 @@
1
+ export * from './link.js';
@@ -0,0 +1,37 @@
1
+ import { render } from '@react-email/render';
2
+ import { Link } from './index.js';
3
+
4
+ describe('<Link> component', () => {
5
+ it('renders children correctly', async () => {
6
+ const testMessage = 'Test message';
7
+ const html = await render(
8
+ <Link href="https://example.com">{testMessage}</Link>,
9
+ );
10
+ expect(html).toContain(testMessage);
11
+ });
12
+
13
+ it('passes style and other props correctly', async () => {
14
+ const style = { color: 'red' };
15
+ const html = await render(
16
+ <Link data-testid="link-test" href="https://example.com" style={style}>
17
+ Test
18
+ </Link>,
19
+ );
20
+ expect(html).toContain('color:red');
21
+ expect(html).toContain('data-testid="link-test"');
22
+ });
23
+
24
+ it('opens in a new tab', async () => {
25
+ const html = await render(<Link href="https://example.com">Test</Link>);
26
+ expect(html).toContain(`target="_blank"`);
27
+ });
28
+
29
+ it('renders correctly', async () => {
30
+ const actualOutput = await render(
31
+ <Link href="https://example.com">Example</Link>,
32
+ );
33
+ expect(actualOutput).toMatchInlineSnapshot(
34
+ `"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><a href="https://example.com" style="color:#067df7;text-decoration-line:none" target="_blank">Example</a><!--/$-->"`,
35
+ );
36
+ });
37
+ });
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { markAsElement } from '../element-marker.js';
3
+
4
+ export type LinkProps = Readonly<React.ComponentPropsWithoutRef<'a'>>;
5
+
6
+ export const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
7
+ ({ target = '_blank', style, ...props }, ref) => (
8
+ <a
9
+ {...props}
10
+ ref={ref}
11
+ style={{
12
+ color: '#067df7',
13
+ textDecorationLine: 'none',
14
+ ...style,
15
+ }}
16
+ target={target}
17
+ >
18
+ {props.children}
19
+ </a>
20
+ ),
21
+ );
22
+
23
+ Link.displayName = 'Link';
24
+ markAsElement(Link);
@@ -0,0 +1 @@
1
+ export * from './markdown.js';
@@ -0,0 +1,221 @@
1
+ import { render } from '@react-email/render';
2
+ import { Markdown } from './markdown.js';
3
+
4
+ describe('<Markdown> component renders correctly', () => {
5
+ it('renders the markdown in the correct format for browsers', async () => {
6
+ const actualOutput = await render(
7
+ <Markdown>
8
+ {`# Markdown Test Document
9
+
10
+ This is a **test document** to check the capabilities of a Markdown parser.
11
+
12
+ ## Headings
13
+
14
+ ### Third-Level Heading
15
+
16
+ #### Fourth-Level Heading
17
+
18
+ ##### Fifth-Level Heading
19
+
20
+ ###### Sixth-Level Heading
21
+
22
+ ## Text Formatting
23
+
24
+ This is some **bold text** and this is some *italic text*. You can also use ~~strikethrough~~ and \`inline code\`.
25
+
26
+ ## Lists
27
+
28
+ 1. Ordered List Item 1
29
+ 2. Ordered List Item 2
30
+ 3. Ordered List Item 3
31
+
32
+ - Unordered List Item 1
33
+ - Unordered List Item 2
34
+ - Unordered List Item 3
35
+
36
+ ## Links
37
+
38
+ [Markdown Guide](https://www.markdownguide.org)
39
+
40
+ ## Images
41
+
42
+ ![Markdown Logo](https://markdown-here.com/img/icon256.png)
43
+
44
+ ## Blockquotes
45
+
46
+ > This is a blockquote.
47
+ > - Author
48
+
49
+ ## Code Blocks
50
+
51
+ \`\`\`javascript
52
+ function greet(name) {
53
+ console.log(\`Hello, $\{name}!\`);
54
+ }
55
+ \`\`\``}
56
+ </Markdown>,
57
+ );
58
+ expect(actualOutput).toMatchInlineSnapshot(`
59
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><h1 style="font-weight:500;padding-top:20px;font-size:2.5rem">Markdown Test Document</h1><p>This is a <strong style="font-weight:bold">test document</strong> to check the capabilities of a Markdown parser.</p>
60
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Headings</h2><h3 style="font-weight:500;padding-top:20px;font-size:1.75rem">Third-Level Heading</h3><h4 style="font-weight:500;padding-top:20px;font-size:1.5rem">Fourth-Level Heading</h4><h5 style="font-weight:500;padding-top:20px;font-size:1.25rem">Fifth-Level Heading</h5><h6 style="font-weight:500;padding-top:20px;font-size:1rem">Sixth-Level Heading</h6><h2 style="font-weight:500;padding-top:20px;font-size:2rem">Text Formatting</h2><p>This is some <strong style="font-weight:bold">bold text</strong> and this is some <em style="font-style:italic">italic text</em>. You can also use <del>strikethrough</del> and <code style="color:#212529;font-size:87.5%;display:inline;background: #f8f8f8;font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;word-wrap:break-word">inline code</code>.</p>
61
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Lists</h2><ol>
62
+ <li>Ordered List Item 1</li>
63
+ <li>Ordered List Item 2</li>
64
+ <li>Ordered List Item 3</li>
65
+ </ol>
66
+ <ul>
67
+ <li>Unordered List Item 1</li>
68
+ <li>Unordered List Item 2</li>
69
+ <li>Unordered List Item 3</li>
70
+ </ul>
71
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Links</h2><p><a href="https://www.markdownguide.org" target="_blank" style="color:#007bff;text-decoration:underline;background-color:transparent">Markdown Guide</a></p>
72
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Images</h2><p><img src="https://markdown-here.com/img/icon256.png" alt="Markdown Logo"></p>
73
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Blockquotes</h2><blockquote style="background:#f9f9f9;border-left:10px solid #ccc;margin:1.5em 10px;padding:1em 10px">
74
+ <p>This is a blockquote.</p>
75
+ <ul>
76
+ <li>Author</li>
77
+ </ul>
78
+ </blockquote>
79
+ <h2 style="font-weight:500;padding-top:20px;font-size:2rem">Code Blocks</h2><pre style="color:#212529;font-size:87.5%;display:block;background: #f8f8f8;font-family:SFMono-Regular,Menlo,Monaco,Consolas,monospace;padding-top:10px;padding-right:10px;padding-left:10px;padding-bottom:1px;margin-bottom:20px;word-wrap:break-word"><code>function greet(name) {
80
+ console.log(\`Hello, \${name}!\`);
81
+ }
82
+ </code></pre>
83
+ </div><!--/$-->"
84
+ `);
85
+ });
86
+
87
+ it('renders the headers in the correct format for browsers', async () => {
88
+ const actualOutput = await render(
89
+ <Markdown>
90
+ {`
91
+ # Heading 1!
92
+ ## Heading 2!
93
+ ### Heading 3!
94
+ #### Heading 4!
95
+ ##### Heading 5!
96
+ ###### Heading 6!
97
+ `}
98
+ </Markdown>,
99
+ );
100
+ expect(actualOutput).toMatchInlineSnapshot(
101
+ `"<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><h1 style="font-weight:500;padding-top:20px;font-size:2.5rem">Heading 1!</h1><h2 style="font-weight:500;padding-top:20px;font-size:2rem">Heading 2!</h2><h3 style="font-weight:500;padding-top:20px;font-size:1.75rem">Heading 3!</h3><h4 style="font-weight:500;padding-top:20px;font-size:1.5rem">Heading 4!</h4><h5 style="font-weight:500;padding-top:20px;font-size:1.25rem">Heading 5!</h5><h6 style="font-weight:500;padding-top:20px;font-size:1rem">Heading 6!</h6></div><!--/$-->"`,
102
+ );
103
+ });
104
+
105
+ it('renders text in the correct format for browsers', async () => {
106
+ const actualOutput = await render(
107
+ <Markdown
108
+ markdownCustomStyles={{
109
+ bold: {
110
+ font: '700 23px / 32px "Roobert PRO", system-ui, sans-serif',
111
+ background: 'url("path/to/image")',
112
+ },
113
+ }}
114
+ >
115
+ **This is sample bold text in markdown** and *this is italic text*
116
+ </Markdown>,
117
+ );
118
+ expect(actualOutput).toMatchInlineSnapshot(`
119
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><p><strong style="font:700 23px / 32px &quot;Roobert PRO&quot;, system-ui, sans-serif;background:url(&quot;path/to/image&quot;)">This is sample bold text in markdown</strong> and <em style="font-style:italic">this is italic text</em></p>
120
+ </div><!--/$-->"
121
+ `);
122
+ });
123
+
124
+ it('renders links in the correct format for browsers', async () => {
125
+ const actualOutput = await render(
126
+ <Markdown>Link to [React-email](https://react.email)</Markdown>,
127
+ );
128
+ expect(actualOutput).toMatchInlineSnapshot(`
129
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><p>Link to <a href="https://react.email" target="_blank" style="color:#007bff;text-decoration:underline;background-color:transparent">React-email</a></p>
130
+ </div><!--/$-->"
131
+ `);
132
+ });
133
+
134
+ it('escapes double quotes in link/image href and title attributes', async () => {
135
+ const actualOutput = await render(
136
+ <Markdown>
137
+ {`[guide](https://example.com/?q="a" 'The "Complete" Guide') and ![logo](https://cdn.example.com/a.png 'Acme "logo"')`}
138
+ </Markdown>,
139
+ );
140
+ expect(actualOutput).toMatchInlineSnapshot(`
141
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><p><a href="https://example.com/?q=&quot;a&quot;" target="_blank" title="The &quot;Complete&quot; Guide" style="color:#007bff;text-decoration:underline;background-color:transparent">guide</a> and <img src="https://cdn.example.com/a.png" alt="logo" title="Acme &quot;logo&quot;"></p>
142
+ </div><!--/$-->"
143
+ `);
144
+ });
145
+
146
+ it('renders lists in the correct format for browsers', async () => {
147
+ const actualOutput = await render(
148
+ <Markdown>
149
+ {`
150
+ # Below is a list
151
+
152
+ - Item One
153
+ - Item Two
154
+ - Item Three
155
+ `}
156
+ </Markdown>,
157
+ );
158
+ expect(actualOutput).toMatchInlineSnapshot(`
159
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><h1 style="font-weight:500;padding-top:20px;font-size:2.5rem">Below is a list</h1><ul>
160
+ <li>Item One</li>
161
+ <li>Item Two</li>
162
+ <li>Item Three</li>
163
+ </ul>
164
+ </div><!--/$-->"
165
+ `);
166
+ });
167
+
168
+ it('renders loose lists with paragraph continuations without crashing', async () => {
169
+ const actualOutput = await render(
170
+ <Markdown>
171
+ {`- item1
172
+
173
+ paragraph continuation
174
+
175
+ - item2`}
176
+ </Markdown>,
177
+ );
178
+ expect(actualOutput).toMatchInlineSnapshot(`
179
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><ul>
180
+ <li><p>item1</p>
181
+ <p>paragraph continuation</p>
182
+ </li>
183
+ <li><p>item2</p>
184
+ </li>
185
+ </ul>
186
+ </div><!--/$-->"
187
+ `);
188
+ });
189
+
190
+ it('renders nested lists in the correct format for browsers', async () => {
191
+ const actualOutput = await render(
192
+ <Markdown>
193
+ {`
194
+ - parent list item
195
+ - nested list item 1
196
+ - nested list item 2
197
+ - another parent item
198
+ 1. nested ordered item 1
199
+ 2. nested ordered item 2
200
+ `}
201
+ </Markdown>,
202
+ );
203
+ expect(actualOutput).toMatchInlineSnapshot(`
204
+ "<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!--$--><div data-id="react-email-markdown"><ul>
205
+ <li><p>parent list item</p>
206
+ <ul>
207
+ <li>nested list item 1</li>
208
+ <li>nested list item 2</li>
209
+ </ul>
210
+ </li>
211
+ <li><p>another parent item</p>
212
+ <ol>
213
+ <li>nested ordered item 1</li>
214
+ <li>nested ordered item 2</li>
215
+ </ol>
216
+ </li>
217
+ </ul>
218
+ </div><!--/$-->"
219
+ `);
220
+ });
221
+ });