@depup/react-email 5.2.10-depup.1 → 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,128 @@
1
+ import {
2
+ type Atrule,
3
+ type Declaration,
4
+ generate,
5
+ parse,
6
+ type Rule,
7
+ type StyleSheet,
8
+ walk,
9
+ } from 'css-tree';
10
+ import { sanitizeStyleSheet } from '../../sanitize-stylesheet.js';
11
+ import { setupTailwind } from '../tailwindcss/setup-tailwind.js';
12
+ import { isRuleInlinable } from './is-rule-inlinable.js';
13
+ import { sanitizeNonInlinableRules } from './sanitize-non-inlinable-rules.js';
14
+ import { stripEmptyTailwindVars } from './strip-empty-tailwind-vars.js';
15
+
16
+ describe('stripEmptyTailwindVars()', () => {
17
+ it('removes empty-fallback var(--tw-*,) refs from declaration values', () => {
18
+ const stylesheet = parse(`
19
+ .tabular-nums {
20
+ font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) tabular-nums var(--tw-numeric-fraction,);
21
+ }
22
+ `) as StyleSheet;
23
+
24
+ const rule = stylesheet.children.first as Rule;
25
+ const declaration = rule.block.children.first as Declaration;
26
+ stripEmptyTailwindVars(declaration.value);
27
+
28
+ expect(generate(declaration.value)).toBe('tabular-nums');
29
+ });
30
+
31
+ it('does not remove var() refs with non-empty fallbacks or non --tw- names', () => {
32
+ const stylesheet = parse(`
33
+ .thing {
34
+ line-height: var(--tw-leading, var(--text-lg--line-height));
35
+ color: var(--my-color,);
36
+ }
37
+ `) as StyleSheet;
38
+
39
+ const rule = stylesheet.children.first as Rule;
40
+ const leading = rule.block.children.first as Declaration;
41
+ const color = rule.block.children.last as Declaration;
42
+
43
+ stripEmptyTailwindVars(leading.value);
44
+ stripEmptyTailwindVars(color.value);
45
+
46
+ expect(generate(leading.value)).toBe(
47
+ 'var(--tw-leading, var(--text-lg--line-height))',
48
+ );
49
+ expect(generate(color.value)).toBe('var(--my-color,)');
50
+ });
51
+
52
+ it('does not remove --tw-* custom property declarations (only var() usages in values)', () => {
53
+ const stylesheet = parse(`
54
+ .print_border-solid {
55
+ @media print {
56
+ --tw-border-style: solid;
57
+ border-style: var(--tw-border-style,);
58
+ }
59
+ }
60
+ `) as StyleSheet;
61
+
62
+ const rule = stylesheet.children.first as Rule;
63
+ const atrule = rule.block.children.first as Atrule;
64
+ const twDeclaration = atrule.block!.children.first as Declaration;
65
+ const borderDeclaration = atrule.block!.children.last as Declaration;
66
+
67
+ stripEmptyTailwindVars(borderDeclaration.value);
68
+
69
+ expect(twDeclaration.property).toBe('--tw-border-style');
70
+ expect(generate(twDeclaration.value).trim()).toBe('solid');
71
+ expect(generate(borderDeclaration.value)).toBe('');
72
+ expect(generate(stylesheet)).toContain('--tw-border-style: solid');
73
+ });
74
+ });
75
+
76
+ describe('stripEmptyTailwindVars() with non-inlinable print: rules', () => {
77
+ it('print:border-solid still leaves --tw-* declarations if only stripEmptyTailwindVars runs', async () => {
78
+ const tailwind = await setupTailwind({});
79
+ tailwind.addUtilities(['print:border-solid']);
80
+ const stylesheet = tailwind.getStyleSheet();
81
+
82
+ sanitizeStyleSheet(stylesheet);
83
+
84
+ walkDeclarationsInNonInlinableRules(stylesheet, (declaration) => {
85
+ stripEmptyTailwindVars(declaration.value);
86
+ });
87
+
88
+ const result = generate(stylesheet);
89
+
90
+ expect(result).not.toMatch(/var\(--tw-[^,()]+,\s*\)/);
91
+ expect(result).toMatch(/--tw-[^:]+:/);
92
+ });
93
+
94
+ it('print:border-solid is clean after sanitizeNonInlinableRules removes resolved --tw-* declarations', async () => {
95
+ const tailwind = await setupTailwind({});
96
+ tailwind.addUtilities(['print:border-solid']);
97
+ const stylesheet = tailwind.getStyleSheet();
98
+
99
+ sanitizeStyleSheet(stylesheet);
100
+ sanitizeNonInlinableRules(stylesheet);
101
+ const result = generate(stylesheet);
102
+
103
+ expect(result).not.toMatch(/var\(--tw-[^,()]+,\s*\)/);
104
+ expect(result).not.toMatch(/--tw-[^:]+:/);
105
+ expect(result).toMatchInlineSnapshot(
106
+ `"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer theme,base,components,utilities;@layer utilities{.print_border-solid{@media print{border-style:solid!important}}}"`,
107
+ );
108
+ });
109
+ });
110
+
111
+ function walkDeclarationsInNonInlinableRules(
112
+ node: StyleSheet,
113
+ onDeclaration: (declaration: Declaration) => void,
114
+ ) {
115
+ walk(node, {
116
+ visit: 'Rule',
117
+ enter(rule) {
118
+ if (!isRuleInlinable(rule)) {
119
+ walk(rule, {
120
+ visit: 'Declaration',
121
+ enter(declaration) {
122
+ onDeclaration(declaration);
123
+ },
124
+ });
125
+ }
126
+ },
127
+ });
128
+ }
@@ -0,0 +1,70 @@
1
+ import { type CssNode, generate, walk } from 'css-tree';
2
+
3
+ /**
4
+ * Tailwind v4 emits variant-stacking idioms like
5
+ * font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) tabular-nums var(--tw-numeric-fraction,)
6
+ * filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-invert,) ...
7
+ * where each var() has an empty fallback so missing variants collapse to nothing.
8
+ * Tailwind deliberately leaves these variant vars undefined until used, so they
9
+ * stay in the output here and produce unresolvable custom properties in email HTML
10
+ * (no email client supports CSS custom properties reliably). Per the CSS spec
11
+ * (https://www.w3.org/TR/css-variables-1/#using-variables) an empty fallback means
12
+ * "use empty string if the variable is undefined", which is exactly what we want.
13
+ *
14
+ * Scoped to the `--tw-` prefix so any user-authored empty-fallback var() refs
15
+ * are left untouched.
16
+ *
17
+ * Uses post-order traversal so an outer var(--tw-X, var(--tw-Y,)) collapses
18
+ * correctly after the inner var() has been removed.
19
+ */
20
+ export function stripEmptyTailwindVars(node: CssNode) {
21
+ walk(node, {
22
+ visit: 'Function',
23
+ leave(func, funcItem, funcList) {
24
+ if (func.name !== 'var') {
25
+ return;
26
+ }
27
+
28
+ let variableName: string | undefined;
29
+ walk(func, {
30
+ visit: 'Identifier',
31
+ enter(identifier) {
32
+ variableName = identifier.name;
33
+ return this.break;
34
+ },
35
+ });
36
+ if (!variableName?.startsWith('--tw-')) {
37
+ return;
38
+ }
39
+
40
+ let sawComma = false;
41
+ let hasFallbackContent = false;
42
+ func.children.forEach((child) => {
43
+ if (!sawComma) {
44
+ if (child.type === 'Operator' && child.value === ',') {
45
+ sawComma = true;
46
+ }
47
+ return;
48
+ }
49
+
50
+ let childValue = generate(child).trim();
51
+ if (child.type === 'Raw') {
52
+ const emptyTailwindVarPattern = /var\(--tw-[^,()]+,\s*\)/g;
53
+ childValue = childValue
54
+ .replaceAll(emptyTailwindVarPattern, '')
55
+ .trim();
56
+ }
57
+
58
+ if (childValue.length > 0) {
59
+ hasFallbackContent = true;
60
+ }
61
+ });
62
+
63
+ if (!sawComma || hasFallbackContent) {
64
+ return;
65
+ }
66
+
67
+ funcList.remove(funcItem);
68
+ },
69
+ });
70
+ }
@@ -0,0 +1,9 @@
1
+ import type { Raw, Value } from 'css-tree';
2
+
3
+ export function unwrapValue(value: Value | Raw) {
4
+ if (value.type === 'Value' && value.children.size === 1) {
5
+ return value.children.first ?? value;
6
+ }
7
+
8
+ return value;
9
+ }
@@ -0,0 +1,12 @@
1
+ import { elementMarker } from '../../../element-marker.js';
2
+
3
+ export const isComponent = (
4
+ element: React.ReactElement,
5
+ ): element is React.ReactElement<unknown, React.FC<unknown>> => {
6
+ return (
7
+ (typeof element.type === 'function' ||
8
+ // @ts-expect-error - we know this is a component that may have a render function
9
+ element.type.render !== undefined) &&
10
+ !(elementMarker in (element.type as object))
11
+ );
12
+ };
@@ -0,0 +1,58 @@
1
+ import { render } from '@react-email/render';
2
+ import { mapReactTree } from './map-react-tree.js';
3
+
4
+ describe('mapReactTree()', () => {
5
+ it('process should be called for all normal elements', async () => {
6
+ const node = (
7
+ <>
8
+ <div>This is a div</div>
9
+ <span>Interesting span</span>
10
+ <h1>header 1</h1>
11
+ </>
12
+ );
13
+
14
+ const process = vi.fn((n: React.ReactNode) => n);
15
+
16
+ const result = mapReactTree(node, process);
17
+
18
+ await render(<>{result}</>);
19
+
20
+ expect(process).toHaveBeenCalledTimes(7);
21
+ });
22
+
23
+ it('process should be called for all elements with custom components', async () => {
24
+ const Custom = (props: { children: React.ReactNode }) => {
25
+ return (
26
+ <>
27
+ <div>
28
+ <span>
29
+ <h1>Testing heading</h1> surrounded span
30
+ </span>
31
+ surrounded by div
32
+ </div>
33
+
34
+ {props.children}
35
+ </>
36
+ );
37
+ };
38
+ const node = (
39
+ <>
40
+ <div>This is a div</div>
41
+ <span>Interesting span</span>
42
+ <h1>header 1</h1>
43
+
44
+ <Custom>
45
+ <h1>Well, hello friends!</h1>
46
+ </Custom>
47
+ </>
48
+ );
49
+
50
+ const process = vi.fn((n: React.ReactNode) => n);
51
+
52
+ const result = mapReactTree(node, process);
53
+
54
+ await render(<>{result}</>);
55
+
56
+ expect(process).toHaveBeenCalledTimes(17);
57
+ });
58
+ });
@@ -0,0 +1,58 @@
1
+ import React from 'react';
2
+ import { isComponent } from './is-component.js';
3
+
4
+ /**
5
+ * A function made for deep mapping a React tree from a node, even through its components.
6
+ * For all the components it finds, it renders them by directly calling them. This has a few issues
7
+ * with hooks, and the only solution is `renderAsync` here, which will probably be done in the future.
8
+ *
9
+ * @param process - The callback that will be called every time a new element has been reached.
10
+ *
11
+ * For components, this is going to be called, most of the time, two times. This is because the best
12
+ * approach is to process *both* before rendering the components (i.e. on the props.children of a component element)
13
+ * and after rendering them because the children themselves might have been modified in the component's
14
+ * rendering.
15
+ */
16
+ export function mapReactTree(
17
+ value: React.ReactNode,
18
+ process: (node: React.ReactNode) => React.ReactNode,
19
+ ): React.ReactNode {
20
+ const mapped = React.Children.map(value, (node) => {
21
+ if (React.isValidElement<{ children?: React.ReactNode }>(node)) {
22
+ const newProps = { ...node.props };
23
+
24
+ if (node.props.children && !isComponent(node)) {
25
+ newProps.children = mapReactTree(node.props.children, process);
26
+ }
27
+
28
+ const processed = process(
29
+ React.cloneElement(node, newProps, newProps.children),
30
+ );
31
+
32
+ if (
33
+ React.isValidElement<{ children?: React.ReactNode }>(processed) &&
34
+ isComponent(processed)
35
+ ) {
36
+ const OriginalComponent =
37
+ typeof processed.type === 'object'
38
+ ? // @ts-expect-error - we know this is a component with a render function
39
+ (processed.type.render as React.FC)
40
+ : (processed.type as React.FC);
41
+
42
+ const rendered = OriginalComponent(processed.props);
43
+ const mappedRenderedNode = mapReactTree(
44
+ rendered as React.ReactNode,
45
+ process,
46
+ );
47
+
48
+ return mappedRenderedNode;
49
+ }
50
+
51
+ return processed;
52
+ }
53
+
54
+ return process(node);
55
+ });
56
+
57
+ return mapped && mapped.length === 1 ? mapped[0] : mapped;
58
+ }
@@ -0,0 +1,61 @@
1
+ import type { Rule } from 'css-tree';
2
+ import React from 'react';
3
+ import type { EmailElementProps } from '../../tailwind.js';
4
+ import { sanitizeClassName } from '../compatibility/sanitize-class-name.js';
5
+ import type { CustomProperties } from '../css/get-custom-properties.js';
6
+ import { makeInlineStylesFor } from '../css/make-inline-styles-for.js';
7
+ import { isComponent } from '../react/is-component.js';
8
+
9
+ export function cloneElementWithInlinedStyles(
10
+ element: React.ReactElement<EmailElementProps>,
11
+ inlinableRules: Map<string, Rule[]>,
12
+ nonInlinableRules: Map<string, Rule[]>,
13
+ customProperties: CustomProperties,
14
+ ) {
15
+ const propsToOverwrite: Partial<EmailElementProps> = {};
16
+
17
+ if (element.props.className && !isComponent(element)) {
18
+ const classes = element.props.className.trim().split(/\s+/);
19
+
20
+ const residualClasses: string[] = [];
21
+
22
+ const rules: Rule[] = [];
23
+ for (const className of classes) {
24
+ const classRules = inlinableRules.get(className);
25
+ if (classRules) {
26
+ rules.push(...classRules);
27
+ }
28
+ if (nonInlinableRules.has(className)) {
29
+ residualClasses.push(className);
30
+ } else if (!classRules) {
31
+ residualClasses.push(className);
32
+ }
33
+ }
34
+
35
+ const styles = makeInlineStylesFor(rules, customProperties);
36
+ propsToOverwrite.style = {
37
+ ...styles,
38
+ ...element.props.style,
39
+ };
40
+
41
+ if (residualClasses.length > 0) {
42
+ propsToOverwrite.className = residualClasses
43
+ .map((className) => {
44
+ if (nonInlinableRules.has(className)) {
45
+ return sanitizeClassName(className);
46
+ }
47
+ return className;
48
+ })
49
+ .join(' ');
50
+ } else {
51
+ propsToOverwrite.className = undefined;
52
+ }
53
+ }
54
+
55
+ const newProps = {
56
+ ...element.props,
57
+ ...propsToOverwrite,
58
+ };
59
+
60
+ return React.cloneElement(element, newProps, newProps.children);
61
+ }
@@ -0,0 +1,25 @@
1
+ import { generate } from 'css-tree';
2
+ import { setupTailwind } from './setup-tailwind.js';
3
+
4
+ test('setupTailwind() and addUtilities()', async () => {
5
+ const { addUtilities, getStyleSheet } = await setupTailwind({});
6
+
7
+ addUtilities(['text-red-500', 'sm:bg-blue-300', 'bg-slate-900']);
8
+
9
+ expect(generate(getStyleSheet())).toMatchInlineSnapshot(
10
+ `"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer theme,base,components,utilities;@layer theme{:root,:host{--color-red-500: oklch(63.7% 0.237 25.331);--color-blue-300: oklch(80.9% 0.105 251.813);--color-slate-900: oklch(20.8% 0.042 265.755)}}@layer utilities{.bg-slate-900{background-color:var(--color-slate-900)}.text-red-500{color:var(--color-red-500)}.sm\\:bg-blue-300{@media (width>=40rem){background-color:var(--color-blue-300)}}}"`,
11
+ );
12
+
13
+ addUtilities(['bg-red-100']);
14
+
15
+ expect(generate(getStyleSheet())).toMatchInlineSnapshot(
16
+ `"/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */@layer theme,base,components,utilities;@layer theme{:root,:host{--color-red-100: oklch(93.6% 0.032 17.717);--color-red-500: oklch(63.7% 0.237 25.331);--color-blue-300: oklch(80.9% 0.105 251.813);--color-slate-900: oklch(20.8% 0.042 265.755)}}@layer utilities{.bg-red-100{background-color:var(--color-red-100)}.bg-slate-900{background-color:var(--color-slate-900)}.text-red-500{color:var(--color-red-500)}.sm\\:bg-blue-300{@media (width>=40rem){background-color:var(--color-blue-300)}}}"`,
17
+ );
18
+ });
19
+
20
+ test('setupTailwind() throws on legacy positional config shape', async () => {
21
+ await expect(
22
+ // @ts-expect-error — intentionally calling with the old shape to verify the guard
23
+ setupTailwind({ plugins: [], theme: { extend: {} } }),
24
+ ).rejects.toThrowError(/setupTailwind now takes \{ config, cssConfigs \}/);
25
+ });
@@ -0,0 +1,121 @@
1
+ import { parse, type StyleSheet } from 'css-tree';
2
+ import { compile } from 'tailwindcss';
3
+ import type { TailwindConfig } from '../../tailwind.js';
4
+ import indexCss from './tailwind-stylesheets/index.js';
5
+ import preflightCss from './tailwind-stylesheets/preflight.js';
6
+ import themeCss from './tailwind-stylesheets/theme.js';
7
+ import utilitiesCss from './tailwind-stylesheets/utilities.js';
8
+
9
+ export type TailwindSetup = Awaited<ReturnType<typeof setupTailwind>>;
10
+
11
+ interface CSSConfigs {
12
+ theme?: string;
13
+ utility?: string;
14
+ }
15
+
16
+ interface SetupTailwindProps {
17
+ config?: TailwindConfig;
18
+ cssConfigs?: CSSConfigs;
19
+ }
20
+
21
+ const SETUP_TAILWIND_KEYS = new Set(['config', 'cssConfigs']);
22
+
23
+ export async function setupTailwind(props: SetupTailwindProps = {}) {
24
+ const stray = Object.keys(props).filter((k) => !SETUP_TAILWIND_KEYS.has(k));
25
+ if (stray.length > 0) {
26
+ throw new Error(
27
+ `setupTailwind now takes { config, cssConfigs } — received unexpected keys: ${stray.join(', ')}. ` +
28
+ 'If you used to call setupTailwind(config), wrap it: setupTailwind({ config }).',
29
+ );
30
+ }
31
+ const { config, cssConfigs } = props;
32
+ const baseCss = `
33
+ @layer theme, base, components, utilities;
34
+ @import "tailwindcss/theme.css" layer(theme);
35
+ @import "tailwindcss/utilities.css" layer(utilities);
36
+ ${cssConfigs?.theme ? '@import "custom-theme.css" layer(theme);' : ''}
37
+ ${cssConfigs?.utility ? '@import "custom-utilities.css" layer(utilities);' : ''}
38
+ @config;
39
+ `;
40
+
41
+ const compiler = await compile(baseCss, {
42
+ async loadModule(id, base, resourceHint) {
43
+ if (resourceHint === 'config') {
44
+ return {
45
+ path: id,
46
+ base: base,
47
+ module: config ?? {},
48
+ };
49
+ }
50
+
51
+ throw new Error(
52
+ `NO-OP: should we implement support for ${resourceHint}?`,
53
+ );
54
+ },
55
+ polyfills: 0, // All
56
+ async loadStylesheet(id, base) {
57
+ if (id === 'tailwindcss') {
58
+ return {
59
+ base,
60
+ path: 'tailwindcss/index.css',
61
+ content: indexCss,
62
+ };
63
+ }
64
+
65
+ if (id === 'tailwindcss/preflight.css') {
66
+ return {
67
+ base,
68
+ path: id,
69
+ content: preflightCss,
70
+ };
71
+ }
72
+
73
+ if (id === 'tailwindcss/theme.css') {
74
+ return {
75
+ base,
76
+ path: id,
77
+ content: themeCss,
78
+ };
79
+ }
80
+
81
+ if (id === 'tailwindcss/utilities.css') {
82
+ return {
83
+ base,
84
+ path: id,
85
+ content: utilitiesCss,
86
+ };
87
+ }
88
+
89
+ if (id === 'custom-theme.css') {
90
+ return {
91
+ base,
92
+ path: id,
93
+ content: cssConfigs?.theme ?? '',
94
+ };
95
+ }
96
+
97
+ if (id === 'custom-utilities.css') {
98
+ return {
99
+ base,
100
+ path: id,
101
+ content: cssConfigs?.utility ?? '',
102
+ };
103
+ }
104
+
105
+ throw new Error(
106
+ 'stylesheet not supported, you can only import the ones from tailwindcss',
107
+ );
108
+ },
109
+ });
110
+
111
+ let css: string = baseCss;
112
+
113
+ return {
114
+ addUtilities: function addUtilities(candidates: string[]): void {
115
+ css = compiler.build(candidates);
116
+ },
117
+ getStyleSheet: function getCss() {
118
+ return parse(css) as StyleSheet;
119
+ },
120
+ };
121
+ }