react-email 6.7.0 → 6.8.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 (231) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  3. package/dist/cli/index.mjs +3 -2
  4. package/dist/components/body/body.cjs +39 -0
  5. package/dist/components/body/body.d.cts +7 -0
  6. package/dist/components/body/body.d.mts +7 -0
  7. package/dist/components/body/body.mjs +37 -0
  8. package/dist/components/body/index.d.cts +1 -0
  9. package/dist/components/body/index.d.mts +1 -0
  10. package/dist/components/body/margin-properties.cjs +30 -0
  11. package/dist/components/body/margin-properties.mjs +29 -0
  12. package/dist/components/button/button.cjs +64 -0
  13. package/dist/components/button/button.d.cts +13 -0
  14. package/dist/components/button/button.d.mts +13 -0
  15. package/dist/components/button/button.mjs +62 -0
  16. package/dist/components/button/index.d.cts +1 -0
  17. package/dist/components/button/index.d.mts +1 -0
  18. package/dist/components/button/utils/parse-padding.cjs +90 -0
  19. package/dist/components/button/utils/parse-padding.mjs +90 -0
  20. package/dist/components/button/utils/px-to-pt.cjs +4 -0
  21. package/dist/components/button/utils/px-to-pt.mjs +4 -0
  22. package/dist/components/code-block/code-block.cjs +79 -0
  23. package/dist/components/code-block/code-block.d.cts +20 -0
  24. package/dist/components/code-block/code-block.d.mts +20 -0
  25. package/dist/components/code-block/code-block.mjs +77 -0
  26. package/dist/components/code-block/index.d.cts +3 -0
  27. package/dist/components/code-block/index.d.mts +3 -0
  28. package/dist/components/code-block/languages-available.d.cts +4 -0
  29. package/dist/components/code-block/languages-available.d.mts +4 -0
  30. package/dist/components/code-block/prism.cjs +14564 -0
  31. package/dist/components/code-block/prism.mjs +14562 -0
  32. package/dist/components/code-block/themes.cjs +2578 -0
  33. package/dist/components/code-block/themes.d.cts +4877 -0
  34. package/dist/components/code-block/themes.d.mts +4877 -0
  35. package/dist/components/code-block/themes.mjs +2541 -0
  36. package/dist/components/code-inline/code-inline.cjs +43 -0
  37. package/dist/components/code-inline/code-inline.d.cts +12 -0
  38. package/dist/components/code-inline/code-inline.d.mts +12 -0
  39. package/dist/components/code-inline/code-inline.mjs +41 -0
  40. package/dist/components/code-inline/index.d.cts +1 -0
  41. package/dist/components/code-inline/index.d.mts +1 -0
  42. package/dist/components/column/column.cjs +19 -0
  43. package/dist/components/column/column.d.cts +7 -0
  44. package/dist/components/column/column.d.mts +7 -0
  45. package/dist/components/column/column.mjs +17 -0
  46. package/dist/components/column/index.d.cts +1 -0
  47. package/dist/components/column/index.d.mts +1 -0
  48. package/dist/components/container/container.cjs +42 -0
  49. package/dist/components/container/container.d.cts +7 -0
  50. package/dist/components/container/container.d.mts +7 -0
  51. package/dist/components/container/container.mjs +40 -0
  52. package/dist/components/container/index.d.cts +1 -0
  53. package/dist/components/container/index.d.mts +1 -0
  54. package/dist/components/element-marker.cjs +8 -0
  55. package/dist/components/element-marker.mjs +7 -0
  56. package/dist/components/font/font.cjs +22 -0
  57. package/dist/components/font/font.d.cts +26 -0
  58. package/dist/components/font/font.d.mts +26 -0
  59. package/dist/components/font/font.mjs +21 -0
  60. package/dist/components/font/index.d.cts +1 -0
  61. package/dist/components/font/index.d.mts +1 -0
  62. package/dist/components/head/head.cjs +20 -0
  63. package/dist/components/head/head.d.cts +7 -0
  64. package/dist/components/head/head.d.mts +7 -0
  65. package/dist/components/head/head.mjs +18 -0
  66. package/dist/components/head/index.d.cts +1 -0
  67. package/dist/components/head/index.d.mts +1 -0
  68. package/dist/components/heading/heading.cjs +30 -0
  69. package/dist/components/heading/heading.d.cts +22 -0
  70. package/dist/components/heading/heading.d.mts +22 -0
  71. package/dist/components/heading/heading.mjs +28 -0
  72. package/dist/components/heading/index.d.cts +1 -0
  73. package/dist/components/heading/index.d.mts +1 -0
  74. package/dist/components/heading/utils/as.d.cts +16 -0
  75. package/dist/components/heading/utils/as.d.mts +16 -0
  76. package/dist/components/heading/utils/spaces.cjs +24 -0
  77. package/dist/components/heading/utils/spaces.d.cts +14 -0
  78. package/dist/components/heading/utils/spaces.d.mts +14 -0
  79. package/dist/components/heading/utils/spaces.mjs +24 -0
  80. package/dist/components/hr/hr.cjs +21 -0
  81. package/dist/components/hr/hr.d.cts +7 -0
  82. package/dist/components/hr/hr.d.mts +7 -0
  83. package/dist/components/hr/hr.mjs +19 -0
  84. package/dist/components/hr/index.d.cts +1 -0
  85. package/dist/components/hr/index.d.mts +1 -0
  86. package/dist/components/html/html.cjs +15 -0
  87. package/dist/components/html/html.d.cts +7 -0
  88. package/dist/components/html/html.d.mts +7 -0
  89. package/dist/components/html/html.mjs +13 -0
  90. package/dist/components/html/index.d.cts +1 -0
  91. package/dist/components/html/index.d.mts +1 -0
  92. package/dist/components/img/img.cjs +25 -0
  93. package/dist/components/img/img.d.cts +7 -0
  94. package/dist/components/img/img.d.mts +7 -0
  95. package/dist/components/img/img.mjs +23 -0
  96. package/dist/components/img/index.d.cts +1 -0
  97. package/dist/components/img/index.d.mts +1 -0
  98. package/dist/components/index.d.cts +24 -0
  99. package/dist/components/index.d.mts +24 -0
  100. package/dist/components/link/index.d.cts +1 -0
  101. package/dist/components/link/index.d.mts +1 -0
  102. package/dist/components/link/link.cjs +21 -0
  103. package/dist/components/link/link.d.cts +7 -0
  104. package/dist/components/link/link.d.mts +7 -0
  105. package/dist/components/link/link.mjs +19 -0
  106. package/dist/components/markdown/index.d.cts +1 -0
  107. package/dist/components/markdown/index.d.mts +1 -0
  108. package/dist/components/markdown/markdown.cjs +101 -0
  109. package/dist/components/markdown/markdown.d.cts +16 -0
  110. package/dist/components/markdown/markdown.d.mts +16 -0
  111. package/dist/components/markdown/markdown.mjs +99 -0
  112. package/dist/components/markdown/styles.cjs +92 -0
  113. package/dist/components/markdown/styles.d.cts +31 -0
  114. package/dist/components/markdown/styles.d.mts +31 -0
  115. package/dist/components/markdown/styles.mjs +92 -0
  116. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.cjs +60 -0
  117. package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.mjs +60 -0
  118. package/dist/components/preview/index.d.cts +1 -0
  119. package/dist/components/preview/index.d.mts +1 -0
  120. package/dist/components/preview/preview.cjs +34 -0
  121. package/dist/components/preview/preview.d.cts +21 -0
  122. package/dist/components/preview/preview.d.mts +21 -0
  123. package/dist/components/preview/preview.mjs +31 -0
  124. package/dist/components/row/index.d.cts +1 -0
  125. package/dist/components/row/index.d.mts +1 -0
  126. package/dist/components/row/row.cjs +30 -0
  127. package/dist/components/row/row.d.cts +11 -0
  128. package/dist/components/row/row.d.mts +11 -0
  129. package/dist/components/row/row.mjs +28 -0
  130. package/dist/components/section/index.d.cts +1 -0
  131. package/dist/components/section/index.d.mts +1 -0
  132. package/dist/components/section/section.cjs +36 -0
  133. package/dist/components/section/section.d.cts +7 -0
  134. package/dist/components/section/section.d.mts +7 -0
  135. package/dist/components/section/section.mjs +34 -0
  136. package/dist/components/tailwind/hooks/use-suspended-promise.cjs +15 -0
  137. package/dist/components/tailwind/hooks/use-suspended-promise.mjs +15 -0
  138. package/dist/components/tailwind/index.d.cts +4 -0
  139. package/dist/components/tailwind/index.d.mts +4 -0
  140. package/dist/components/tailwind/inline-styles.cjs +11 -0
  141. package/dist/components/tailwind/inline-styles.d.cts +6 -0
  142. package/dist/components/tailwind/inline-styles.d.mts +6 -0
  143. package/dist/components/tailwind/inline-styles.mjs +11 -0
  144. package/dist/components/tailwind/sanitize-stylesheet.cjs +11 -0
  145. package/dist/components/tailwind/sanitize-stylesheet.d.cts +6 -0
  146. package/dist/components/tailwind/sanitize-stylesheet.d.mts +6 -0
  147. package/dist/components/tailwind/sanitize-stylesheet.mjs +11 -0
  148. package/dist/components/tailwind/tailwind.cjs +120 -0
  149. package/dist/components/tailwind/tailwind.d.cts +25 -0
  150. package/dist/components/tailwind/tailwind.d.mts +25 -0
  151. package/dist/components/tailwind/tailwind.mjs +117 -0
  152. package/dist/components/tailwind/utils/compatibility/get-react-property.cjs +10 -0
  153. package/dist/components/tailwind/utils/compatibility/get-react-property.mjs +10 -0
  154. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.cjs +26 -0
  155. package/dist/components/tailwind/utils/compatibility/sanitize-class-name.mjs +26 -0
  156. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.cjs +126 -0
  157. package/dist/components/tailwind/utils/css/downlevel-for-email-clients.mjs +125 -0
  158. package/dist/components/tailwind/utils/css/extract-rules-per-class.cjs +45 -0
  159. package/dist/components/tailwind/utils/css/extract-rules-per-class.mjs +44 -0
  160. package/dist/components/tailwind/utils/css/get-custom-properties.cjs +35 -0
  161. package/dist/components/tailwind/utils/css/get-custom-properties.mjs +34 -0
  162. package/dist/components/tailwind/utils/css/is-part-inlinable.cjs +10 -0
  163. package/dist/components/tailwind/utils/css/is-part-inlinable.mjs +9 -0
  164. package/dist/components/tailwind/utils/css/is-rule-inlinable.cjs +10 -0
  165. package/dist/components/tailwind/utils/css/is-rule-inlinable.mjs +9 -0
  166. package/dist/components/tailwind/utils/css/make-inline-styles-for.cjs +52 -0
  167. package/dist/components/tailwind/utils/css/make-inline-styles-for.mjs +51 -0
  168. package/dist/components/tailwind/utils/css/resolve-all-css-variables.cjs +89 -0
  169. package/dist/components/tailwind/utils/css/resolve-all-css-variables.mjs +88 -0
  170. package/dist/components/tailwind/utils/css/resolve-calc-expressions.cjs +92 -0
  171. package/dist/components/tailwind/utils/css/resolve-calc-expressions.mjs +91 -0
  172. package/dist/components/tailwind/utils/css/sanitize-declarations.cjs +310 -0
  173. package/dist/components/tailwind/utils/css/sanitize-declarations.mjs +309 -0
  174. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.cjs +46 -0
  175. package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.mjs +45 -0
  176. package/dist/components/tailwind/utils/css/split-mixed-rule.cjs +41 -0
  177. package/dist/components/tailwind/utils/css/split-mixed-rule.mjs +40 -0
  178. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.cjs +52 -0
  179. package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.mjs +51 -0
  180. package/dist/components/tailwind/utils/css/unwrap-value.cjs +7 -0
  181. package/dist/components/tailwind/utils/css/unwrap-value.mjs +7 -0
  182. package/dist/components/tailwind/utils/react/is-component.cjs +7 -0
  183. package/dist/components/tailwind/utils/react/is-component.mjs +7 -0
  184. package/dist/components/tailwind/utils/react/map-react-tree.cjs +32 -0
  185. package/dist/components/tailwind/utils/react/map-react-tree.mjs +30 -0
  186. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.cjs +37 -0
  187. package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.mjs +35 -0
  188. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.cjs +77 -0
  189. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.cts +19 -0
  190. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.mts +19 -0
  191. package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.mjs +76 -0
  192. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.cjs +901 -0
  193. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.mjs +901 -0
  194. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.cjs +398 -0
  195. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.mjs +398 -0
  196. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.cjs +467 -0
  197. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.mjs +467 -0
  198. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.cjs +6 -0
  199. package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.mjs +6 -0
  200. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.cjs +6 -0
  201. package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.mjs +6 -0
  202. package/dist/components/text/index.d.cts +1 -0
  203. package/dist/components/text/index.d.mts +1 -0
  204. package/dist/components/text/text.cjs +43 -0
  205. package/dist/components/text/text.d.cts +7 -0
  206. package/dist/components/text/text.d.mts +7 -0
  207. package/dist/components/text/text.mjs +41 -0
  208. package/dist/components/text/utils/compute-margins.cjs +62 -0
  209. package/dist/components/text/utils/compute-margins.mjs +62 -0
  210. package/dist/index.cjs +85 -40759
  211. package/dist/index.d.cts +24 -5132
  212. package/dist/index.d.mts +24 -5132
  213. package/dist/index.mjs +23 -40676
  214. package/package.json +5 -4
  215. package/src/components/body/body.tsx +2 -0
  216. package/src/components/button/button.tsx +2 -0
  217. package/src/components/code-block/code-block.tsx +2 -0
  218. package/src/components/code-inline/code-inline.tsx +2 -0
  219. package/src/components/column/column.tsx +2 -0
  220. package/src/components/container/container.tsx +2 -0
  221. package/src/components/element-marker.ts +5 -0
  222. package/src/components/heading/heading.tsx +2 -0
  223. package/src/components/hr/hr.tsx +2 -0
  224. package/src/components/img/img.tsx +2 -0
  225. package/src/components/link/link.tsx +2 -0
  226. package/src/components/preview/preview.tsx +2 -0
  227. package/src/components/row/row.tsx +2 -0
  228. package/src/components/section/section.tsx +2 -0
  229. package/src/components/tailwind/utils/react/is-component.ts +2 -32
  230. package/src/components/text/text.tsx +2 -0
  231. package/tsdown.config.ts +31 -34
@@ -0,0 +1,126 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/downlevel-for-email-clients.ts
4
+ /**
5
+ * Downlevels modern CSS features that email clients don't support,
6
+ * operating on a css-tree StyleSheet AST.
7
+ *
8
+ * 1. CSS Nesting: unnests @media rules from inside selectors
9
+ * `.sm_p-4{@media (min-width:40rem){padding:1rem!important}}`
10
+ * → `@media (min-width:40rem){.sm_p-4{padding:1rem!important}}`
11
+ *
12
+ * 2. Media Queries Level 4 range syntax → legacy min-width/max-width
13
+ * `(width>=40rem)` → `(min-width:40rem)`
14
+ *
15
+ * Gmail, Outlook, Yahoo, and most email clients don't support either feature.
16
+ * See: https://www.caniemail.com/features/css-at-media/
17
+ * https://www.caniemail.com/features/css-nesting/
18
+ */
19
+ /**
20
+ * Unnest @media at-rules from inside regular rules, and downlevel
21
+ * range media query syntax to legacy min-width/max-width.
22
+ *
23
+ * Mutates the stylesheet in place.
24
+ */
25
+ function downlevelForEmailClients(styleSheet) {
26
+ unnestMediaQueries(styleSheet);
27
+ downlevelRangeMediaQueries(styleSheet);
28
+ }
29
+ /**
30
+ * Walk the stylesheet and unnest any @media/@supports rules that are nested
31
+ * inside regular rules. For each, the parent Rule's selector wraps the
32
+ * at-rule's body.
33
+ *
34
+ * Before: `.sm_p-4 { @media (...) { padding: 1rem } }`
35
+ * After: `@media (...) { .sm_p-4 { padding: 1rem } }`
36
+ */
37
+ function unnestMediaQueries(styleSheet) {
38
+ const transforms = [];
39
+ (0, css_tree.walk)(styleSheet, {
40
+ visit: "Rule",
41
+ enter(rule, item, list) {
42
+ if (!rule.block || !item) return;
43
+ const nestedAtrules = [];
44
+ const remainingChildren = [];
45
+ rule.block.children.forEach((child) => {
46
+ if (child.type === "Atrule" && (child.name === "media" || child.name === "supports")) nestedAtrules.push(child);
47
+ else remainingChildren.push(child);
48
+ });
49
+ if (nestedAtrules.length > 0) transforms.push({
50
+ parentRule: rule,
51
+ parentItem: item,
52
+ parentList: list,
53
+ nestedAtrules,
54
+ remainingChildren
55
+ });
56
+ }
57
+ });
58
+ for (let i = transforms.length - 1; i >= 0; i--) {
59
+ const { parentRule, parentItem, parentList, nestedAtrules, remainingChildren } = transforms[i];
60
+ const replacements = new css_tree.List();
61
+ if (remainingChildren.length > 0) {
62
+ parentRule.block.children = new css_tree.List().fromArray(remainingChildren);
63
+ replacements.appendData(parentRule);
64
+ }
65
+ for (const atrule of nestedAtrules) {
66
+ const wrappedRule = {
67
+ type: "Rule",
68
+ prelude: (0, css_tree.clone)(parentRule.prelude),
69
+ block: {
70
+ type: "Block",
71
+ children: atrule.block ? atrule.block.children : new css_tree.List()
72
+ }
73
+ };
74
+ const newAtrule = {
75
+ type: "Atrule",
76
+ name: atrule.name,
77
+ prelude: atrule.prelude,
78
+ block: {
79
+ type: "Block",
80
+ children: new css_tree.List().fromArray([wrappedRule])
81
+ }
82
+ };
83
+ replacements.appendData(newAtrule);
84
+ }
85
+ parentList.replace(parentItem, replacements);
86
+ }
87
+ }
88
+ /**
89
+ * Walk all nodes and downlevel range syntax (`FeatureRange`) inside @media
90
+ * preludes to legacy `Feature` nodes (`min-width` / `max-width`).
91
+ */
92
+ function downlevelRangeMediaQueries(styleSheet) {
93
+ const replacements = [];
94
+ (0, css_tree.walk)(styleSheet, { enter(originalNode, item) {
95
+ const node = originalNode;
96
+ if (item && node.type === "FeatureRange") {
97
+ const replacement = downlevelFeatureRange(node);
98
+ if (replacement) replacements.push({
99
+ item,
100
+ replacement
101
+ });
102
+ }
103
+ } });
104
+ for (const { item, replacement } of replacements) item.data = replacement;
105
+ }
106
+ /**
107
+ * Convert a `FeatureRange` node to a `Feature` node (legacy min-/max- syntax).
108
+ *
109
+ * For `width >= 40rem`: left=Identifier("width"), leftComparison=">=", middle=Dimension("40","rem")
110
+ * Result: { type: "Feature", name: "min-width", value: Dimension("40","rem") }
111
+ */
112
+ function downlevelFeatureRange(range) {
113
+ if (range.left.type !== "Identifier") return null;
114
+ let prefix;
115
+ if (range.leftComparison === ">=" || range.leftComparison === ">") prefix = "min-";
116
+ else if (range.leftComparison === "<=" || range.leftComparison === "<") prefix = "max-";
117
+ else return null;
118
+ return {
119
+ type: "Feature",
120
+ kind: "media",
121
+ name: `${prefix}${range.left.name}`,
122
+ value: range.middle
123
+ };
124
+ }
125
+ //#endregion
126
+ exports.downlevelForEmailClients = downlevelForEmailClients;
@@ -0,0 +1,125 @@
1
+ import { List, clone, walk } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/downlevel-for-email-clients.ts
3
+ /**
4
+ * Downlevels modern CSS features that email clients don't support,
5
+ * operating on a css-tree StyleSheet AST.
6
+ *
7
+ * 1. CSS Nesting: unnests @media rules from inside selectors
8
+ * `.sm_p-4{@media (min-width:40rem){padding:1rem!important}}`
9
+ * → `@media (min-width:40rem){.sm_p-4{padding:1rem!important}}`
10
+ *
11
+ * 2. Media Queries Level 4 range syntax → legacy min-width/max-width
12
+ * `(width>=40rem)` → `(min-width:40rem)`
13
+ *
14
+ * Gmail, Outlook, Yahoo, and most email clients don't support either feature.
15
+ * See: https://www.caniemail.com/features/css-at-media/
16
+ * https://www.caniemail.com/features/css-nesting/
17
+ */
18
+ /**
19
+ * Unnest @media at-rules from inside regular rules, and downlevel
20
+ * range media query syntax to legacy min-width/max-width.
21
+ *
22
+ * Mutates the stylesheet in place.
23
+ */
24
+ function downlevelForEmailClients(styleSheet) {
25
+ unnestMediaQueries(styleSheet);
26
+ downlevelRangeMediaQueries(styleSheet);
27
+ }
28
+ /**
29
+ * Walk the stylesheet and unnest any @media/@supports rules that are nested
30
+ * inside regular rules. For each, the parent Rule's selector wraps the
31
+ * at-rule's body.
32
+ *
33
+ * Before: `.sm_p-4 { @media (...) { padding: 1rem } }`
34
+ * After: `@media (...) { .sm_p-4 { padding: 1rem } }`
35
+ */
36
+ function unnestMediaQueries(styleSheet) {
37
+ const transforms = [];
38
+ walk(styleSheet, {
39
+ visit: "Rule",
40
+ enter(rule, item, list) {
41
+ if (!rule.block || !item) return;
42
+ const nestedAtrules = [];
43
+ const remainingChildren = [];
44
+ rule.block.children.forEach((child) => {
45
+ if (child.type === "Atrule" && (child.name === "media" || child.name === "supports")) nestedAtrules.push(child);
46
+ else remainingChildren.push(child);
47
+ });
48
+ if (nestedAtrules.length > 0) transforms.push({
49
+ parentRule: rule,
50
+ parentItem: item,
51
+ parentList: list,
52
+ nestedAtrules,
53
+ remainingChildren
54
+ });
55
+ }
56
+ });
57
+ for (let i = transforms.length - 1; i >= 0; i--) {
58
+ const { parentRule, parentItem, parentList, nestedAtrules, remainingChildren } = transforms[i];
59
+ const replacements = new List();
60
+ if (remainingChildren.length > 0) {
61
+ parentRule.block.children = new List().fromArray(remainingChildren);
62
+ replacements.appendData(parentRule);
63
+ }
64
+ for (const atrule of nestedAtrules) {
65
+ const wrappedRule = {
66
+ type: "Rule",
67
+ prelude: clone(parentRule.prelude),
68
+ block: {
69
+ type: "Block",
70
+ children: atrule.block ? atrule.block.children : new List()
71
+ }
72
+ };
73
+ const newAtrule = {
74
+ type: "Atrule",
75
+ name: atrule.name,
76
+ prelude: atrule.prelude,
77
+ block: {
78
+ type: "Block",
79
+ children: new List().fromArray([wrappedRule])
80
+ }
81
+ };
82
+ replacements.appendData(newAtrule);
83
+ }
84
+ parentList.replace(parentItem, replacements);
85
+ }
86
+ }
87
+ /**
88
+ * Walk all nodes and downlevel range syntax (`FeatureRange`) inside @media
89
+ * preludes to legacy `Feature` nodes (`min-width` / `max-width`).
90
+ */
91
+ function downlevelRangeMediaQueries(styleSheet) {
92
+ const replacements = [];
93
+ walk(styleSheet, { enter(originalNode, item) {
94
+ const node = originalNode;
95
+ if (item && node.type === "FeatureRange") {
96
+ const replacement = downlevelFeatureRange(node);
97
+ if (replacement) replacements.push({
98
+ item,
99
+ replacement
100
+ });
101
+ }
102
+ } });
103
+ for (const { item, replacement } of replacements) item.data = replacement;
104
+ }
105
+ /**
106
+ * Convert a `FeatureRange` node to a `Feature` node (legacy min-/max- syntax).
107
+ *
108
+ * For `width >= 40rem`: left=Identifier("width"), leftComparison=">=", middle=Dimension("40","rem")
109
+ * Result: { type: "Feature", name: "min-width", value: Dimension("40","rem") }
110
+ */
111
+ function downlevelFeatureRange(range) {
112
+ if (range.left.type !== "Identifier") return null;
113
+ let prefix;
114
+ if (range.leftComparison === ">=" || range.leftComparison === ">") prefix = "min-";
115
+ else if (range.leftComparison === "<=" || range.leftComparison === "<") prefix = "max-";
116
+ else return null;
117
+ return {
118
+ type: "Feature",
119
+ kind: "media",
120
+ name: `${prefix}${range.left.name}`,
121
+ value: range.middle
122
+ };
123
+ }
124
+ //#endregion
125
+ export { downlevelForEmailClients };
@@ -0,0 +1,45 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_is_rule_inlinable = require("./is-rule-inlinable.cjs");
3
+ const require_split_mixed_rule = require("./split-mixed-rule.cjs");
4
+ let css_tree = require("css-tree");
5
+ //#region src/components/tailwind/utils/css/extract-rules-per-class.ts
6
+ function extractRulesPerClass(root, classes) {
7
+ const classSet = new Set(classes);
8
+ const inlinableRules = /* @__PURE__ */ new Map();
9
+ const nonInlinableRules = /* @__PURE__ */ new Map();
10
+ const appendRule = (map, className, rule) => {
11
+ const existing = map.get(className);
12
+ if (existing) existing.push(rule);
13
+ else map.set(className, [rule]);
14
+ };
15
+ (0, css_tree.walk)(root, {
16
+ visit: "Rule",
17
+ enter(rule) {
18
+ const firstSelector = rule.prelude.type === "SelectorList" ? rule.prelude.children.first : null;
19
+ if (firstSelector?.type === "Selector" && firstSelector.children.first?.type === "NestingSelector") return;
20
+ const selectorClasses = [];
21
+ (0, css_tree.walk)(rule.prelude, {
22
+ visit: "ClassSelector",
23
+ enter(classSelector) {
24
+ selectorClasses.push(css_tree.string.decode(classSelector.name));
25
+ }
26
+ });
27
+ if (require_is_rule_inlinable.isRuleInlinable(rule)) {
28
+ for (const className of selectorClasses) if (classSet.has(className)) appendRule(inlinableRules, className, rule);
29
+ } else {
30
+ const { inlinablePart, nonInlinablePart } = require_split_mixed_rule.splitMixedRule(rule);
31
+ for (const className of selectorClasses) {
32
+ if (!classSet.has(className)) continue;
33
+ if (inlinablePart) appendRule(inlinableRules, className, inlinablePart);
34
+ if (nonInlinablePart) appendRule(nonInlinableRules, className, nonInlinablePart);
35
+ }
36
+ }
37
+ }
38
+ });
39
+ return {
40
+ inlinable: inlinableRules,
41
+ nonInlinable: nonInlinableRules
42
+ };
43
+ }
44
+ //#endregion
45
+ exports.extractRulesPerClass = extractRulesPerClass;
@@ -0,0 +1,44 @@
1
+ import { isRuleInlinable } from "./is-rule-inlinable.mjs";
2
+ import { splitMixedRule } from "./split-mixed-rule.mjs";
3
+ import { string, walk } from "css-tree/dist/csstree.esm";
4
+ //#region src/components/tailwind/utils/css/extract-rules-per-class.ts
5
+ function extractRulesPerClass(root, classes) {
6
+ const classSet = new Set(classes);
7
+ const inlinableRules = /* @__PURE__ */ new Map();
8
+ const nonInlinableRules = /* @__PURE__ */ new Map();
9
+ const appendRule = (map, className, rule) => {
10
+ const existing = map.get(className);
11
+ if (existing) existing.push(rule);
12
+ else map.set(className, [rule]);
13
+ };
14
+ walk(root, {
15
+ visit: "Rule",
16
+ enter(rule) {
17
+ const firstSelector = rule.prelude.type === "SelectorList" ? rule.prelude.children.first : null;
18
+ if (firstSelector?.type === "Selector" && firstSelector.children.first?.type === "NestingSelector") return;
19
+ const selectorClasses = [];
20
+ walk(rule.prelude, {
21
+ visit: "ClassSelector",
22
+ enter(classSelector) {
23
+ selectorClasses.push(string.decode(classSelector.name));
24
+ }
25
+ });
26
+ if (isRuleInlinable(rule)) {
27
+ for (const className of selectorClasses) if (classSet.has(className)) appendRule(inlinableRules, className, rule);
28
+ } else {
29
+ const { inlinablePart, nonInlinablePart } = splitMixedRule(rule);
30
+ for (const className of selectorClasses) {
31
+ if (!classSet.has(className)) continue;
32
+ if (inlinablePart) appendRule(inlinableRules, className, inlinablePart);
33
+ if (nonInlinablePart) appendRule(nonInlinableRules, className, nonInlinablePart);
34
+ }
35
+ }
36
+ }
37
+ });
38
+ return {
39
+ inlinable: inlinableRules,
40
+ nonInlinable: nonInlinableRules
41
+ };
42
+ }
43
+ //#endregion
44
+ export { extractRulesPerClass };
@@ -0,0 +1,35 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/get-custom-properties.ts
4
+ function getCustomProperties(node) {
5
+ const customProperties = /* @__PURE__ */ new Map();
6
+ (0, css_tree.walk)(node, {
7
+ visit: "Atrule",
8
+ enter(atrule) {
9
+ if (atrule.name === "property" && atrule.prelude) {
10
+ const prelude = (0, css_tree.generate)(atrule.prelude);
11
+ if (prelude.startsWith("--")) {
12
+ let syntax;
13
+ let inherits;
14
+ let initialValue;
15
+ (0, css_tree.walk)(atrule, {
16
+ visit: "Declaration",
17
+ enter(declaration) {
18
+ if (declaration.property === "syntax") syntax = declaration;
19
+ if (declaration.property === "inherits") inherits = declaration;
20
+ if (declaration.property === "initial-value") initialValue = declaration;
21
+ }
22
+ });
23
+ customProperties.set(prelude, {
24
+ syntax,
25
+ inherits,
26
+ initialValue
27
+ });
28
+ }
29
+ }
30
+ }
31
+ });
32
+ return customProperties;
33
+ }
34
+ //#endregion
35
+ exports.getCustomProperties = getCustomProperties;
@@ -0,0 +1,34 @@
1
+ import { generate, walk } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/get-custom-properties.ts
3
+ function getCustomProperties(node) {
4
+ const customProperties = /* @__PURE__ */ new Map();
5
+ walk(node, {
6
+ visit: "Atrule",
7
+ enter(atrule) {
8
+ if (atrule.name === "property" && atrule.prelude) {
9
+ const prelude = generate(atrule.prelude);
10
+ if (prelude.startsWith("--")) {
11
+ let syntax;
12
+ let inherits;
13
+ let initialValue;
14
+ walk(atrule, {
15
+ visit: "Declaration",
16
+ enter(declaration) {
17
+ if (declaration.property === "syntax") syntax = declaration;
18
+ if (declaration.property === "inherits") inherits = declaration;
19
+ if (declaration.property === "initial-value") initialValue = declaration;
20
+ }
21
+ });
22
+ customProperties.set(prelude, {
23
+ syntax,
24
+ inherits,
25
+ initialValue
26
+ });
27
+ }
28
+ }
29
+ }
30
+ });
31
+ return customProperties;
32
+ }
33
+ //#endregion
34
+ export { getCustomProperties };
@@ -0,0 +1,10 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/is-part-inlinable.ts
4
+ function isPartInlinable(part) {
5
+ const hasAtRuleInside = (0, css_tree.find)(part, (node) => node.type === "Atrule") !== null;
6
+ const hasPseudoSelector = (0, css_tree.find)(part, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null;
7
+ return !hasAtRuleInside && !hasPseudoSelector;
8
+ }
9
+ //#endregion
10
+ exports.isPartInlinable = isPartInlinable;
@@ -0,0 +1,9 @@
1
+ import { find } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/is-part-inlinable.ts
3
+ function isPartInlinable(part) {
4
+ const hasAtRuleInside = find(part, (node) => node.type === "Atrule") !== null;
5
+ const hasPseudoSelector = find(part, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null;
6
+ return !hasAtRuleInside && !hasPseudoSelector;
7
+ }
8
+ //#endregion
9
+ export { isPartInlinable };
@@ -0,0 +1,10 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/is-rule-inlinable.ts
4
+ function isRuleInlinable(rule) {
5
+ const hasAtRuleInside = (0, css_tree.find)(rule, (node) => node.type === "Atrule") !== null;
6
+ const hasPseudoSelector = (0, css_tree.find)(rule, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null;
7
+ return !hasAtRuleInside && !hasPseudoSelector;
8
+ }
9
+ //#endregion
10
+ exports.isRuleInlinable = isRuleInlinable;
@@ -0,0 +1,9 @@
1
+ import { find } from "css-tree/dist/csstree.esm";
2
+ //#region src/components/tailwind/utils/css/is-rule-inlinable.ts
3
+ function isRuleInlinable(rule) {
4
+ const hasAtRuleInside = find(rule, (node) => node.type === "Atrule") !== null;
5
+ const hasPseudoSelector = find(rule, (node) => node.type === "PseudoClassSelector" || node.type === "PseudoElementSelector") !== null;
6
+ return !hasAtRuleInside && !hasPseudoSelector;
7
+ }
8
+ //#endregion
9
+ export { isRuleInlinable };
@@ -0,0 +1,52 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ const require_get_react_property = require("../compatibility/get-react-property.cjs");
3
+ const require_strip_empty_tailwind_vars = require("./strip-empty-tailwind-vars.cjs");
4
+ const require_unwrap_value = require("./unwrap-value.cjs");
5
+ let css_tree = require("css-tree");
6
+ //#region src/components/tailwind/utils/css/make-inline-styles-for.ts
7
+ function makeInlineStylesFor(inlinableRules, customProperties) {
8
+ const styles = {};
9
+ const localVariableDeclarations = /* @__PURE__ */ new Map();
10
+ for (const rule of inlinableRules) (0, css_tree.walk)(rule, {
11
+ visit: "Declaration",
12
+ enter(declaration) {
13
+ if (declaration.property.startsWith("--")) localVariableDeclarations.set(declaration.property, declaration);
14
+ }
15
+ });
16
+ for (const rule of inlinableRules) {
17
+ (0, css_tree.walk)(rule, {
18
+ visit: "Function",
19
+ enter(func, funcParentListItem) {
20
+ if (func.name === "var") {
21
+ let variableName;
22
+ (0, css_tree.walk)(func, {
23
+ visit: "Identifier",
24
+ enter(identifier) {
25
+ variableName = identifier.name;
26
+ return this.break;
27
+ }
28
+ });
29
+ if (variableName) {
30
+ const definition = localVariableDeclarations.get(variableName);
31
+ if (definition) funcParentListItem.data = require_unwrap_value.unwrapValue(definition.value);
32
+ else {
33
+ const customProperty = customProperties.get(variableName);
34
+ if (customProperty?.initialValue) funcParentListItem.data = require_unwrap_value.unwrapValue(customProperty.initialValue.value);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ });
40
+ (0, css_tree.walk)(rule, {
41
+ visit: "Declaration",
42
+ enter(declaration) {
43
+ if (declaration.property.startsWith("--")) return;
44
+ require_strip_empty_tailwind_vars.stripEmptyTailwindVars(declaration.value);
45
+ styles[require_get_react_property.getReactProperty(declaration.property)] = (0, css_tree.generate)(declaration.value).trim() + (declaration.important ? "!important" : "");
46
+ }
47
+ });
48
+ }
49
+ return styles;
50
+ }
51
+ //#endregion
52
+ exports.makeInlineStylesFor = makeInlineStylesFor;
@@ -0,0 +1,51 @@
1
+ import { getReactProperty } from "../compatibility/get-react-property.mjs";
2
+ import { stripEmptyTailwindVars } from "./strip-empty-tailwind-vars.mjs";
3
+ import { unwrapValue } from "./unwrap-value.mjs";
4
+ import { generate, walk } from "css-tree/dist/csstree.esm";
5
+ //#region src/components/tailwind/utils/css/make-inline-styles-for.ts
6
+ function makeInlineStylesFor(inlinableRules, customProperties) {
7
+ const styles = {};
8
+ const localVariableDeclarations = /* @__PURE__ */ new Map();
9
+ for (const rule of inlinableRules) walk(rule, {
10
+ visit: "Declaration",
11
+ enter(declaration) {
12
+ if (declaration.property.startsWith("--")) localVariableDeclarations.set(declaration.property, declaration);
13
+ }
14
+ });
15
+ for (const rule of inlinableRules) {
16
+ walk(rule, {
17
+ visit: "Function",
18
+ enter(func, funcParentListItem) {
19
+ if (func.name === "var") {
20
+ let variableName;
21
+ walk(func, {
22
+ visit: "Identifier",
23
+ enter(identifier) {
24
+ variableName = identifier.name;
25
+ return this.break;
26
+ }
27
+ });
28
+ if (variableName) {
29
+ const definition = localVariableDeclarations.get(variableName);
30
+ if (definition) funcParentListItem.data = unwrapValue(definition.value);
31
+ else {
32
+ const customProperty = customProperties.get(variableName);
33
+ if (customProperty?.initialValue) funcParentListItem.data = unwrapValue(customProperty.initialValue.value);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ });
39
+ walk(rule, {
40
+ visit: "Declaration",
41
+ enter(declaration) {
42
+ if (declaration.property.startsWith("--")) return;
43
+ stripEmptyTailwindVars(declaration.value);
44
+ styles[getReactProperty(declaration.property)] = generate(declaration.value).trim() + (declaration.important ? "!important" : "");
45
+ }
46
+ });
47
+ }
48
+ return styles;
49
+ }
50
+ //#endregion
51
+ export { makeInlineStylesFor };
@@ -0,0 +1,89 @@
1
+ require("../../../../_virtual/_rolldown/runtime.cjs");
2
+ let css_tree = require("css-tree");
3
+ //#region src/components/tailwind/utils/css/resolve-all-css-variables.ts
4
+ function doSelectorsIntersect(first, second) {
5
+ if ((0, css_tree.generate)(first) === (0, css_tree.generate)(second)) return true;
6
+ let hasSomeUniversal = false;
7
+ const walker = (node, _parentListItem, parentList) => {
8
+ if (hasSomeUniversal) return;
9
+ if (node.type === "PseudoClassSelector" && node.name === "root") hasSomeUniversal = true;
10
+ if (node.type === "TypeSelector" && node.name === "*" && parentList.size === 1) hasSomeUniversal = true;
11
+ };
12
+ (0, css_tree.walk)(first, walker);
13
+ (0, css_tree.walk)(second, walker);
14
+ if (hasSomeUniversal) return true;
15
+ return false;
16
+ }
17
+ function resolveAllCssVariables(node) {
18
+ const variableDefinitions = /* @__PURE__ */ new Set();
19
+ const variableUses = /* @__PURE__ */ new Set();
20
+ const path = [];
21
+ (0, css_tree.walk)(node, {
22
+ leave() {
23
+ path.shift();
24
+ },
25
+ enter(node) {
26
+ if (node.type === "Declaration") {
27
+ const declaration = node;
28
+ if (path.some((ancestor) => ancestor.type === "Atrule" && ancestor.name === "layer" && ancestor.prelude !== null && (0, css_tree.generate)(ancestor.prelude).includes("properties"))) {
29
+ path.unshift(node);
30
+ return;
31
+ }
32
+ if (/--[\S]+/.test(declaration.property)) variableDefinitions.add({
33
+ declaration,
34
+ path: [...path],
35
+ variableName: declaration.property,
36
+ definition: (0, css_tree.generate)(declaration.value)
37
+ });
38
+ else {
39
+ function parseVariableUsesFrom(node) {
40
+ (0, css_tree.walk)(node, {
41
+ visit: "Function",
42
+ enter(funcNode) {
43
+ if (funcNode.name === "var") {
44
+ const children = funcNode.children.toArray();
45
+ const name = (0, css_tree.generate)(children[0]);
46
+ const fallback = children[2] ? (0, css_tree.generate)(children[2]) : void 0;
47
+ variableUses.add({
48
+ declaration,
49
+ path: [...path],
50
+ fallback,
51
+ variableName: name,
52
+ raw: (0, css_tree.generate)(funcNode)
53
+ });
54
+ if (fallback?.includes("var(")) parseVariableUsesFrom((0, css_tree.parse)(fallback, { context: "value" }));
55
+ }
56
+ }
57
+ });
58
+ }
59
+ parseVariableUsesFrom(declaration.value);
60
+ }
61
+ }
62
+ path.unshift(node);
63
+ }
64
+ });
65
+ for (const use of variableUses) {
66
+ let hasReplaced = false;
67
+ for (const definition of variableDefinitions) {
68
+ if (use.variableName !== definition.variableName) continue;
69
+ if (use.path[0]?.type === "Block" && use.path[1]?.type === "Atrule" && use.path[2]?.type === "Block" && use.path[3]?.type === "Rule" && definition.path[0].type === "Block" && definition.path[1].type === "Rule" && doSelectorsIntersect(use.path[3].prelude, definition.path[1].prelude)) {
70
+ use.declaration.value = (0, css_tree.parse)((0, css_tree.generate)(use.declaration.value).replaceAll(use.raw, definition.definition), { context: "value" });
71
+ hasReplaced = true;
72
+ break;
73
+ }
74
+ if (use.path[0]?.type === "Block" && use.path[1]?.type === "Rule" && definition.path[0]?.type === "Block" && definition.path[1]?.type === "Rule" && doSelectorsIntersect(use.path[1].prelude, definition.path[1].prelude)) {
75
+ use.declaration.value = (0, css_tree.parse)((0, css_tree.generate)(use.declaration.value).replaceAll(use.raw, definition.definition), { context: "value" });
76
+ hasReplaced = true;
77
+ break;
78
+ }
79
+ if (use.path[0]?.type === "Block" && use.path[1]?.type === "Atrule" && use.path[2]?.type === "Block" && use.path[3]?.type === "Rule" && definition.path[0]?.type === "Block" && definition.path[1]?.type === "Atrule" && definition.path[2]?.type === "Block" && definition.path[3]?.type === "Rule" && use.path[1].name === definition.path[1].name && (use.path[1].prelude ? definition.path[1].prelude ? (0, css_tree.generate)(use.path[1].prelude) === (0, css_tree.generate)(definition.path[1].prelude) : false : definition.path[1].prelude === null) && doSelectorsIntersect(use.path[3].prelude, definition.path[3].prelude)) {
80
+ use.declaration.value = (0, css_tree.parse)((0, css_tree.generate)(use.declaration.value).replaceAll(use.raw, definition.definition), { context: "value" });
81
+ hasReplaced = true;
82
+ break;
83
+ }
84
+ }
85
+ if (!hasReplaced && use.fallback) use.declaration.value = (0, css_tree.parse)((0, css_tree.generate)(use.declaration.value).replaceAll(use.raw, use.fallback), { context: "value" });
86
+ }
87
+ }
88
+ //#endregion
89
+ exports.resolveAllCssVariables = resolveAllCssVariables;