@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,309 @@
1
+ import { List, generate, parse, walk } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/sanitize-declarations.ts
3
+ function rgbNode(r, g, b, alpha) {
4
+ const children = new List();
5
+ children.appendData({
6
+ type: "Number",
7
+ value: r.toFixed(0)
8
+ });
9
+ children.appendData({
10
+ type: "Operator",
11
+ value: ","
12
+ });
13
+ children.appendData({
14
+ type: "Number",
15
+ value: g.toFixed(0)
16
+ });
17
+ children.appendData({
18
+ type: "Operator",
19
+ value: ","
20
+ });
21
+ children.appendData({
22
+ type: "Number",
23
+ value: b.toFixed(0)
24
+ });
25
+ if (alpha !== 1 && alpha !== void 0) {
26
+ children.appendData({
27
+ type: "Operator",
28
+ value: ","
29
+ });
30
+ children.appendData({
31
+ type: "Number",
32
+ value: alpha.toString()
33
+ });
34
+ }
35
+ return {
36
+ type: "Function",
37
+ name: "rgb",
38
+ children
39
+ };
40
+ }
41
+ const LAB_TO_LMS = {
42
+ l: [.3963377773761749, .2158037573099136],
43
+ m: [-.1055613458156586, -.0638541728258133],
44
+ s: [-.0894841775298119, -1.2914855480194092]
45
+ };
46
+ const LSM_TO_RGB = {
47
+ r: [
48
+ 4.076741636075958,
49
+ -3.307711539258063,
50
+ .2309699031821043
51
+ ],
52
+ g: [
53
+ -1.2684379732850315,
54
+ 2.609757349287688,
55
+ -.341319376002657
56
+ ],
57
+ b: [
58
+ -.0041960761386756,
59
+ -.7034186179359362,
60
+ 1.7076146940746117
61
+ ]
62
+ };
63
+ function lrgbToRgb(input) {
64
+ const absoluteNumber = Math.abs(input);
65
+ const sign = input < 0 ? -1 : 1;
66
+ if (absoluteNumber > .0031308) return sign * (absoluteNumber ** (1 / 2.4) * 1.055 - .055);
67
+ return input * 12.92;
68
+ }
69
+ function clamp(value, min, max) {
70
+ return Math.min(Math.max(value, min), max);
71
+ }
72
+ function oklchToOklab(oklch) {
73
+ return {
74
+ l: oklch.l,
75
+ a: oklch.c * Math.cos(oklch.h / 180 * Math.PI),
76
+ b: oklch.c * Math.sin(oklch.h / 180 * Math.PI)
77
+ };
78
+ }
79
+ /** Convert oklab to RGB */
80
+ function oklchToRgb(oklch) {
81
+ const oklab = oklchToOklab(oklch);
82
+ const l = (oklab.l + LAB_TO_LMS.l[0] * oklab.a + LAB_TO_LMS.l[1] * oklab.b) ** 3;
83
+ const m = (oklab.l + LAB_TO_LMS.m[0] * oklab.a + LAB_TO_LMS.m[1] * oklab.b) ** 3;
84
+ const s = (oklab.l + LAB_TO_LMS.s[0] * oklab.a + LAB_TO_LMS.s[1] * oklab.b) ** 3;
85
+ const r = 255 * lrgbToRgb(LSM_TO_RGB.r[0] * l + LSM_TO_RGB.r[1] * m + LSM_TO_RGB.r[2] * s);
86
+ const g = 255 * lrgbToRgb(LSM_TO_RGB.g[0] * l + LSM_TO_RGB.g[1] * m + LSM_TO_RGB.g[2] * s);
87
+ const b = 255 * lrgbToRgb(LSM_TO_RGB.b[0] * l + LSM_TO_RGB.b[1] * m + LSM_TO_RGB.b[2] * s);
88
+ return {
89
+ r: clamp(r, 0, 255),
90
+ g: clamp(g, 0, 255),
91
+ b: clamp(b, 0, 255)
92
+ };
93
+ }
94
+ function separteShorthandDeclaration(shorthandToReplace, [start, end]) {
95
+ shorthandToReplace.property = start;
96
+ const values = shorthandToReplace.value.type === "Value" ? shorthandToReplace.value.children.toArray().filter((child) => child.type !== "Operator" && child.type !== "WhiteSpace") : [shorthandToReplace.value];
97
+ let endValue = shorthandToReplace.value;
98
+ if (values.length === 2) {
99
+ endValue = {
100
+ type: "Value",
101
+ children: new List().fromArray([values[1]])
102
+ };
103
+ shorthandToReplace.value = {
104
+ type: "Value",
105
+ children: new List().fromArray([values[0]])
106
+ };
107
+ }
108
+ return {
109
+ type: "Declaration",
110
+ property: end,
111
+ value: endValue,
112
+ important: shorthandToReplace.important
113
+ };
114
+ }
115
+ /**
116
+ * Meant to do all the things necessary, in a per-declaration basis, to have the best email client
117
+ * support possible.
118
+ *
119
+ * Here's the transformations it does so far:
120
+ * - convert all `rgb` with space-based syntax into a comma based one;
121
+ * - convert all `oklch` values into `rgb`;
122
+ * - convert all hex values into `rgb`;
123
+ * - convert `padding-inline` into `padding-left` and `padding-right`;
124
+ * - convert `padding-block` into `padding-top` and `padding-bottom`;
125
+ * - convert `margin-inline` into `margin-left` and `margin-right`;
126
+ * - convert `margin-block` into `margin-top` and `margin-bottom`.
127
+ */
128
+ function sanitizeDeclarations(nodeContainingDeclarations) {
129
+ walk(nodeContainingDeclarations, {
130
+ visit: "Declaration",
131
+ enter(declaration, item, list) {
132
+ if (declaration.value.type === "Raw") declaration.value = parse(declaration.value.value, { context: "value" });
133
+ if (/border-(?:[a-z]+-){0,2}radius\s*:\s*calc\s*\(\s*infinity\s*\*\s*1px\s*\)/i.test(generate(declaration))) declaration.value = parse("9999px", { context: "value" });
134
+ walk(declaration, {
135
+ visit: "Function",
136
+ enter(func, funcParentListItem) {
137
+ const children = func.children.toArray();
138
+ if (func.name === "oklch") {
139
+ let l;
140
+ let c;
141
+ let h;
142
+ let a;
143
+ for (const child of children) {
144
+ if (child.type === "Number") {
145
+ if (l === void 0) {
146
+ l = Number.parseFloat(child.value);
147
+ continue;
148
+ }
149
+ if (c === void 0) {
150
+ c = Number.parseFloat(child.value);
151
+ continue;
152
+ }
153
+ if (h === void 0) {
154
+ h = Number.parseFloat(child.value);
155
+ continue;
156
+ }
157
+ if (a === void 0) {
158
+ a = Number.parseFloat(child.value);
159
+ continue;
160
+ }
161
+ }
162
+ if (child.type === "Dimension" && child.unit === "deg") {
163
+ if (h === void 0) {
164
+ h = Number.parseFloat(child.value);
165
+ continue;
166
+ }
167
+ }
168
+ if (child.type === "Percentage") {
169
+ if (l === void 0) {
170
+ l = Number.parseFloat(child.value) / 100;
171
+ continue;
172
+ }
173
+ if (a === void 0) a = Number.parseFloat(child.value) / 100;
174
+ }
175
+ }
176
+ if (l === void 0 || c === void 0 || h === void 0) throw new Error("Could not determine the parameters of an oklch() function.", { cause: declaration });
177
+ const rgb = oklchToRgb({
178
+ l,
179
+ c,
180
+ h
181
+ });
182
+ funcParentListItem.data = rgbNode(rgb.r, rgb.g, rgb.b, a);
183
+ }
184
+ if (func.name === "rgb" || func.name === "rgba") {
185
+ let r;
186
+ let g;
187
+ let b;
188
+ let a;
189
+ for (const child of children) {
190
+ if (child.type === "Number") {
191
+ if (r === void 0) {
192
+ r = Number.parseFloat(child.value);
193
+ continue;
194
+ }
195
+ if (g === void 0) {
196
+ g = Number.parseFloat(child.value);
197
+ continue;
198
+ }
199
+ if (b === void 0) {
200
+ b = Number.parseFloat(child.value);
201
+ continue;
202
+ }
203
+ if (a === void 0) {
204
+ a = Number.parseFloat(child.value);
205
+ continue;
206
+ }
207
+ }
208
+ if (child.type === "Percentage") {
209
+ if (r === void 0) {
210
+ r = Number.parseFloat(child.value) * 255 / 100;
211
+ continue;
212
+ }
213
+ if (g === void 0) {
214
+ g = Number.parseFloat(child.value) * 255 / 100;
215
+ continue;
216
+ }
217
+ if (b === void 0) {
218
+ b = Number.parseFloat(child.value) * 255 / 100;
219
+ continue;
220
+ }
221
+ if (a === void 0) a = Number.parseFloat(child.value) / 100;
222
+ }
223
+ }
224
+ if (r === void 0 || g === void 0 || b === void 0) throw new Error("Could not determine the parameters of an rgb() function.", { cause: declaration });
225
+ if (a === void 0 || a === 1) funcParentListItem.data = rgbNode(r, g, b);
226
+ else funcParentListItem.data = rgbNode(r, g, b, a);
227
+ }
228
+ }
229
+ });
230
+ walk(declaration, {
231
+ visit: "Hash",
232
+ enter(hash, hashParentListItem) {
233
+ const hex = hash.value.trim();
234
+ if (hex.length === 3) {
235
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.charAt(0) + hex.charAt(0), 16), Number.parseInt(hex.charAt(1) + hex.charAt(1), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16));
236
+ return;
237
+ }
238
+ if (hex.length === 4) {
239
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.charAt(0) + hex.charAt(0), 16), Number.parseInt(hex.charAt(1) + hex.charAt(1), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16), Number.parseInt(hex.charAt(3) + hex.charAt(3), 16) / 255);
240
+ return;
241
+ }
242
+ if (hex.length === 5) {
243
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.charAt(2) + hex.charAt(2), 16), Number.parseInt(hex.charAt(3) + hex.charAt(3), 16), Number.parseInt(hex.charAt(4) + hex.charAt(4), 16) / 255);
244
+ return;
245
+ }
246
+ if (hex.length === 6) {
247
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16));
248
+ return;
249
+ }
250
+ if (hex.length === 7) {
251
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16), Number.parseInt(hex.charAt(6) + hex.charAt(6), 16) / 255);
252
+ return;
253
+ }
254
+ hashParentListItem.data = rgbNode(Number.parseInt(hex.slice(0, 2), 16), Number.parseInt(hex.slice(2, 4), 16), Number.parseInt(hex.slice(4, 6), 16), Number.parseInt(hex.slice(6, 8), 16) / 255);
255
+ }
256
+ });
257
+ walk(declaration, {
258
+ visit: "Function",
259
+ enter(func, parentListItem) {
260
+ if (func.name === "color-mix") {
261
+ const children = func.children.toArray();
262
+ const color = children[3];
263
+ const opacity = children[4];
264
+ if (func.children.last?.type === "Identifier" && func.children.last.name === "transparent" && color?.type === "Function" && color?.name === "rgb" && opacity) {
265
+ if (opacity.type === "Percentage") {
266
+ const alpha = Number.parseFloat(opacity.value) / 100;
267
+ if (alpha < 1) {
268
+ color.children.appendData({
269
+ type: "Operator",
270
+ value: ","
271
+ });
272
+ color.children.appendData({
273
+ type: "Number",
274
+ value: alpha.toString()
275
+ });
276
+ }
277
+ } else {
278
+ color.children.appendData({
279
+ type: "Operator",
280
+ value: ","
281
+ });
282
+ color.children.appendData(opacity);
283
+ }
284
+ parentListItem.data = color;
285
+ }
286
+ }
287
+ }
288
+ });
289
+ if (declaration.property === "padding-inline") {
290
+ const paddingRight = separteShorthandDeclaration(declaration, ["padding-left", "padding-right"]);
291
+ list.insertData(paddingRight, item);
292
+ }
293
+ if (declaration.property === "padding-block") {
294
+ const paddingBottom = separteShorthandDeclaration(declaration, ["padding-top", "padding-bottom"]);
295
+ list.insertData(paddingBottom, item);
296
+ }
297
+ if (declaration.property === "margin-inline") {
298
+ const marginRight = separteShorthandDeclaration(declaration, ["margin-left", "margin-right"]);
299
+ list.insertData(marginRight, item);
300
+ }
301
+ if (declaration.property === "margin-block") {
302
+ const paddingBottom = separteShorthandDeclaration(declaration, ["margin-top", "margin-bottom"]);
303
+ list.insertData(paddingBottom, item);
304
+ }
305
+ }
306
+ });
307
+ }
308
+ //#endregion
309
+ export { sanitizeDeclarations };
@@ -0,0 +1,46 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_is_rule_inlinable = require("./is-rule-inlinable.cjs");
3
+ const require_strip_empty_tailwind_vars = require("./strip-empty-tailwind-vars.cjs");
4
+ const require_sanitize_class_name = require("../compatibility/sanitize-class-name.cjs");
5
+ let css_tree = require("css-tree");
6
+ //#region src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts
7
+ /**
8
+ * This function goes through a few steps to ensure the best email client support and
9
+ * to ensure that media queries and pseudo classes are applied correctly alongside
10
+ * the inline styles.
11
+ *
12
+ * What it does:
13
+ * 1. Converts all declarations in all rules into important ones
14
+ * 2. Sanitizes class selectors of all non-inlinable rules
15
+ * 3. Removes --tw-* custom property declarations — by this point all CSS
16
+ * variables have been resolved, so these are dead weight in email HTML.
17
+ * 4. Strips empty-fallback var(--tw-*,) refs that Tailwind v4 emits for
18
+ * variant-stacking idioms (filter, font-variant-numeric, etc.) — email
19
+ * clients can't resolve CSS custom properties reliably, so any --tw-*
20
+ * left as a bare empty-fallback ref would reach the client broken.
21
+ */
22
+ function sanitizeNonInlinableRules(node) {
23
+ (0, css_tree.walk)(node, {
24
+ visit: "Rule",
25
+ enter(rule) {
26
+ if (!require_is_rule_inlinable.isRuleInlinable(rule)) {
27
+ (0, css_tree.walk)(rule.prelude, (node) => {
28
+ if (node.type === "ClassSelector") node.name = require_sanitize_class_name.sanitizeClassName(css_tree.string.decode(node.name));
29
+ });
30
+ (0, css_tree.walk)(rule, {
31
+ visit: "Declaration",
32
+ enter(declaration, item, list) {
33
+ if (declaration.property.startsWith("--tw-")) {
34
+ list.remove(item);
35
+ return;
36
+ }
37
+ declaration.important = true;
38
+ require_strip_empty_tailwind_vars.stripEmptyTailwindVars(declaration.value);
39
+ }
40
+ });
41
+ }
42
+ }
43
+ });
44
+ }
45
+ //#endregion
46
+ exports.sanitizeNonInlinableRules = sanitizeNonInlinableRules;
@@ -0,0 +1,45 @@
1
+ import { isRuleInlinable } from "./is-rule-inlinable.mjs";
2
+ import { stripEmptyTailwindVars } from "./strip-empty-tailwind-vars.mjs";
3
+ import { sanitizeClassName } from "../compatibility/sanitize-class-name.mjs";
4
+ import { string, walk } from "css-tree/dist/csstree.esm";
5
+ //#region src/components/tailwind/utils/css/sanitize-non-inlinable-rules.ts
6
+ /**
7
+ * This function goes through a few steps to ensure the best email client support and
8
+ * to ensure that media queries and pseudo classes are applied correctly alongside
9
+ * the inline styles.
10
+ *
11
+ * What it does:
12
+ * 1. Converts all declarations in all rules into important ones
13
+ * 2. Sanitizes class selectors of all non-inlinable rules
14
+ * 3. Removes --tw-* custom property declarations — by this point all CSS
15
+ * variables have been resolved, so these are dead weight in email HTML.
16
+ * 4. Strips empty-fallback var(--tw-*,) refs that Tailwind v4 emits for
17
+ * variant-stacking idioms (filter, font-variant-numeric, etc.) — email
18
+ * clients can't resolve CSS custom properties reliably, so any --tw-*
19
+ * left as a bare empty-fallback ref would reach the client broken.
20
+ */
21
+ function sanitizeNonInlinableRules(node) {
22
+ walk(node, {
23
+ visit: "Rule",
24
+ enter(rule) {
25
+ if (!isRuleInlinable(rule)) {
26
+ walk(rule.prelude, (node) => {
27
+ if (node.type === "ClassSelector") node.name = sanitizeClassName(string.decode(node.name));
28
+ });
29
+ walk(rule, {
30
+ visit: "Declaration",
31
+ enter(declaration, item, list) {
32
+ if (declaration.property.startsWith("--tw-")) {
33
+ list.remove(item);
34
+ return;
35
+ }
36
+ declaration.important = true;
37
+ stripEmptyTailwindVars(declaration.value);
38
+ }
39
+ });
40
+ }
41
+ }
42
+ });
43
+ }
44
+ //#endregion
45
+ export { sanitizeNonInlinableRules };
@@ -0,0 +1,41 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_is_part_inlinable = require("./is-part-inlinable.cjs");
3
+ let css_tree = require("css-tree");
4
+ //#region src/components/tailwind/utils/css/split-mixed-rule.ts
5
+ /**
6
+ * Split a rule into inlinable and non-inlinable parts. Caller must only pass rules
7
+ * for which isRuleInlinable(rule) is false. Returns clones so the original stylesheet is never mutated.
8
+ *
9
+ * @returns inlinablePart: rule with only inlinable block children, or null if none.
10
+ * nonInlinablePart: rule with only non-inlinable block children, or null if none.
11
+ */
12
+ function splitMixedRule(rule) {
13
+ if (rule.prelude !== null && (0, css_tree.find)(rule.prelude, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null) return {
14
+ inlinablePart: null,
15
+ nonInlinablePart: (0, css_tree.clone)(rule)
16
+ };
17
+ const ruleCloneInlinable = (0, css_tree.clone)(rule);
18
+ const ruleCloneNonInlinable = (0, css_tree.clone)(rule);
19
+ const inlinableParts = [];
20
+ const nonInlinableParts = [];
21
+ for (const part of ruleCloneInlinable.block.children.toArray()) if (require_is_part_inlinable.isPartInlinable(part)) inlinableParts.push(part);
22
+ else nonInlinableParts.push(part);
23
+ return {
24
+ inlinablePart: inlinableParts.length > 0 ? {
25
+ ...ruleCloneInlinable,
26
+ block: {
27
+ type: "Block",
28
+ children: new css_tree.List().fromArray(inlinableParts)
29
+ }
30
+ } : null,
31
+ nonInlinablePart: nonInlinableParts.length > 0 ? {
32
+ ...ruleCloneNonInlinable,
33
+ block: {
34
+ type: "Block",
35
+ children: new css_tree.List().fromArray(nonInlinableParts)
36
+ }
37
+ } : null
38
+ };
39
+ }
40
+ //#endregion
41
+ exports.splitMixedRule = splitMixedRule;
@@ -0,0 +1,40 @@
1
+ import { isPartInlinable } from "./is-part-inlinable.mjs";
2
+ import { List, clone, find } from "css-tree/dist/csstree.esm";
3
+ //#region src/components/tailwind/utils/css/split-mixed-rule.ts
4
+ /**
5
+ * Split a rule into inlinable and non-inlinable parts. Caller must only pass rules
6
+ * for which isRuleInlinable(rule) is false. Returns clones so the original stylesheet is never mutated.
7
+ *
8
+ * @returns inlinablePart: rule with only inlinable block children, or null if none.
9
+ * nonInlinablePart: rule with only non-inlinable block children, or null if none.
10
+ */
11
+ function splitMixedRule(rule) {
12
+ if (rule.prelude !== null && find(rule.prelude, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null) return {
13
+ inlinablePart: null,
14
+ nonInlinablePart: clone(rule)
15
+ };
16
+ const ruleCloneInlinable = clone(rule);
17
+ const ruleCloneNonInlinable = clone(rule);
18
+ const inlinableParts = [];
19
+ const nonInlinableParts = [];
20
+ for (const part of ruleCloneInlinable.block.children.toArray()) if (isPartInlinable(part)) inlinableParts.push(part);
21
+ else nonInlinableParts.push(part);
22
+ return {
23
+ inlinablePart: inlinableParts.length > 0 ? {
24
+ ...ruleCloneInlinable,
25
+ block: {
26
+ type: "Block",
27
+ children: new List().fromArray(inlinableParts)
28
+ }
29
+ } : null,
30
+ nonInlinablePart: nonInlinableParts.length > 0 ? {
31
+ ...ruleCloneNonInlinable,
32
+ block: {
33
+ type: "Block",
34
+ children: new List().fromArray(nonInlinableParts)
35
+ }
36
+ } : null
37
+ };
38
+ }
39
+ //#endregion
40
+ export { splitMixedRule };
@@ -0,0 +1,52 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts
4
+ /**
5
+ * Tailwind v4 emits variant-stacking idioms like
6
+ * font-variant-numeric: var(--tw-ordinal,) var(--tw-slashed-zero,) tabular-nums var(--tw-numeric-fraction,)
7
+ * filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-invert,) ...
8
+ * where each var() has an empty fallback so missing variants collapse to nothing.
9
+ * Tailwind deliberately leaves these variant vars undefined until used, so they
10
+ * stay in the output here and produce unresolvable custom properties in email HTML
11
+ * (no email client supports CSS custom properties reliably). Per the CSS spec
12
+ * (https://www.w3.org/TR/css-variables-1/#using-variables) an empty fallback means
13
+ * "use empty string if the variable is undefined", which is exactly what we want.
14
+ *
15
+ * Scoped to the `--tw-` prefix so any user-authored empty-fallback var() refs
16
+ * are left untouched.
17
+ *
18
+ * Uses post-order traversal so an outer var(--tw-X, var(--tw-Y,)) collapses
19
+ * correctly after the inner var() has been removed.
20
+ */
21
+ function stripEmptyTailwindVars(node) {
22
+ (0, css_tree.walk)(node, {
23
+ visit: "Function",
24
+ leave(func, funcItem, funcList) {
25
+ if (func.name !== "var") return;
26
+ let variableName;
27
+ (0, css_tree.walk)(func, {
28
+ visit: "Identifier",
29
+ enter(identifier) {
30
+ variableName = identifier.name;
31
+ return this.break;
32
+ }
33
+ });
34
+ if (!variableName?.startsWith("--tw-")) return;
35
+ let sawComma = false;
36
+ let hasFallbackContent = false;
37
+ func.children.forEach((child) => {
38
+ if (!sawComma) {
39
+ if (child.type === "Operator" && child.value === ",") sawComma = true;
40
+ return;
41
+ }
42
+ let childValue = (0, css_tree.generate)(child).trim();
43
+ if (child.type === "Raw") childValue = childValue.replaceAll(/var\(--tw-[^,()]+,\s*\)/g, "").trim();
44
+ if (childValue.length > 0) hasFallbackContent = true;
45
+ });
46
+ if (!sawComma || hasFallbackContent) return;
47
+ funcList.remove(funcItem);
48
+ }
49
+ });
50
+ }
51
+ //#endregion
52
+ exports.stripEmptyTailwindVars = stripEmptyTailwindVars;
@@ -0,0 +1,51 @@
1
+ import { generate, walk } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/strip-empty-tailwind-vars.ts
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
+ function stripEmptyTailwindVars(node) {
21
+ walk(node, {
22
+ visit: "Function",
23
+ leave(func, funcItem, funcList) {
24
+ if (func.name !== "var") return;
25
+ let variableName;
26
+ walk(func, {
27
+ visit: "Identifier",
28
+ enter(identifier) {
29
+ variableName = identifier.name;
30
+ return this.break;
31
+ }
32
+ });
33
+ if (!variableName?.startsWith("--tw-")) return;
34
+ let sawComma = false;
35
+ let hasFallbackContent = false;
36
+ func.children.forEach((child) => {
37
+ if (!sawComma) {
38
+ if (child.type === "Operator" && child.value === ",") sawComma = true;
39
+ return;
40
+ }
41
+ let childValue = generate(child).trim();
42
+ if (child.type === "Raw") childValue = childValue.replaceAll(/var\(--tw-[^,()]+,\s*\)/g, "").trim();
43
+ if (childValue.length > 0) hasFallbackContent = true;
44
+ });
45
+ if (!sawComma || hasFallbackContent) return;
46
+ funcList.remove(funcItem);
47
+ }
48
+ });
49
+ }
50
+ //#endregion
51
+ export { stripEmptyTailwindVars };
@@ -0,0 +1,7 @@
1
+ //#region src/components/tailwind/utils/css/unwrap-value.ts
2
+ function unwrapValue(value) {
3
+ if (value.type === "Value" && value.children.size === 1) return value.children.first ?? value;
4
+ return value;
5
+ }
6
+ //#endregion
7
+ exports.unwrapValue = unwrapValue;
@@ -0,0 +1,7 @@
1
+ //#region src/components/tailwind/utils/css/unwrap-value.ts
2
+ function unwrapValue(value) {
3
+ if (value.type === "Value" && value.children.size === 1) return value.children.first ?? value;
4
+ return value;
5
+ }
6
+ //#endregion
7
+ export { unwrapValue };
@@ -0,0 +1,7 @@
1
+ const require_element_marker = require("../../../element-marker.cjs");
2
+ //#region src/components/tailwind/utils/react/is-component.ts
3
+ const isComponent = (element) => {
4
+ return (typeof element.type === "function" || element.type.render !== void 0) && !(require_element_marker.elementMarker in element.type);
5
+ };
6
+ //#endregion
7
+ exports.isComponent = isComponent;
@@ -0,0 +1,7 @@
1
+ import { elementMarker } from "../../../element-marker.mjs";
2
+ //#region src/components/tailwind/utils/react/is-component.ts
3
+ const isComponent = (element) => {
4
+ return (typeof element.type === "function" || element.type.render !== void 0) && !(elementMarker in element.type);
5
+ };
6
+ //#endregion
7
+ export { isComponent };
@@ -0,0 +1,32 @@
1
+ const require_runtime = require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_is_component = require("./is-component.cjs");
3
+ let react = require("react");
4
+ react = require_runtime.__toESM(react, 1);
5
+ //#region src/components/tailwind/utils/react/map-react-tree.ts
6
+ /**
7
+ * A function made for deep mapping a React tree from a node, even through its components.
8
+ * For all the components it finds, it renders them by directly calling them. This has a few issues
9
+ * with hooks, and the only solution is `renderAsync` here, which will probably be done in the future.
10
+ *
11
+ * @param process - The callback that will be called every time a new element has been reached.
12
+ *
13
+ * For components, this is going to be called, most of the time, two times. This is because the best
14
+ * approach is to process *both* before rendering the components (i.e. on the props.children of a component element)
15
+ * and after rendering them because the children themselves might have been modified in the component's
16
+ * rendering.
17
+ */
18
+ function mapReactTree(value, process) {
19
+ const mapped = react.default.Children.map(value, (node) => {
20
+ if (react.default.isValidElement(node)) {
21
+ const newProps = { ...node.props };
22
+ if (node.props.children && !require_is_component.isComponent(node)) newProps.children = mapReactTree(node.props.children, process);
23
+ const processed = process(react.default.cloneElement(node, newProps, newProps.children));
24
+ if (react.default.isValidElement(processed) && require_is_component.isComponent(processed)) return mapReactTree((typeof processed.type === "object" ? processed.type.render : processed.type)(processed.props), process);
25
+ return processed;
26
+ }
27
+ return process(node);
28
+ });
29
+ return mapped && mapped.length === 1 ? mapped[0] : mapped;
30
+ }
31
+ //#endregion
32
+ exports.mapReactTree = mapReactTree;