react-email 6.6.9 → 6.8.0
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.
- package/CHANGELOG.md +23 -0
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cli/index.mjs +12 -11
- package/dist/components/body/body.cjs +39 -0
- package/dist/components/body/body.d.cts +7 -0
- package/dist/components/body/body.d.mts +7 -0
- package/dist/components/body/body.mjs +37 -0
- package/dist/components/body/index.d.cts +1 -0
- package/dist/components/body/index.d.mts +1 -0
- package/dist/components/body/margin-properties.cjs +30 -0
- package/dist/components/body/margin-properties.mjs +29 -0
- package/dist/components/button/button.cjs +64 -0
- package/dist/components/button/button.d.cts +13 -0
- package/dist/components/button/button.d.mts +13 -0
- package/dist/components/button/button.mjs +62 -0
- package/dist/components/button/index.d.cts +1 -0
- package/dist/components/button/index.d.mts +1 -0
- package/dist/components/button/utils/parse-padding.cjs +90 -0
- package/dist/components/button/utils/parse-padding.mjs +90 -0
- package/dist/components/button/utils/px-to-pt.cjs +4 -0
- package/dist/components/button/utils/px-to-pt.mjs +4 -0
- package/dist/components/code-block/code-block.cjs +79 -0
- package/dist/components/code-block/code-block.d.cts +20 -0
- package/dist/components/code-block/code-block.d.mts +20 -0
- package/dist/components/code-block/code-block.mjs +77 -0
- package/dist/components/code-block/index.d.cts +3 -0
- package/dist/components/code-block/index.d.mts +3 -0
- package/dist/components/code-block/languages-available.d.cts +4 -0
- package/dist/components/code-block/languages-available.d.mts +4 -0
- package/dist/components/code-block/prism.cjs +14564 -0
- package/dist/components/code-block/prism.mjs +14562 -0
- package/dist/components/code-block/themes.cjs +2578 -0
- package/dist/components/code-block/themes.d.cts +4877 -0
- package/dist/components/code-block/themes.d.mts +4877 -0
- package/dist/components/code-block/themes.mjs +2541 -0
- package/dist/components/code-inline/code-inline.cjs +43 -0
- package/dist/components/code-inline/code-inline.d.cts +12 -0
- package/dist/components/code-inline/code-inline.d.mts +12 -0
- package/dist/components/code-inline/code-inline.mjs +41 -0
- package/dist/components/code-inline/index.d.cts +1 -0
- package/dist/components/code-inline/index.d.mts +1 -0
- package/dist/components/column/column.cjs +19 -0
- package/dist/components/column/column.d.cts +7 -0
- package/dist/components/column/column.d.mts +7 -0
- package/dist/components/column/column.mjs +17 -0
- package/dist/components/column/index.d.cts +1 -0
- package/dist/components/column/index.d.mts +1 -0
- package/dist/components/container/container.cjs +42 -0
- package/dist/components/container/container.d.cts +7 -0
- package/dist/components/container/container.d.mts +7 -0
- package/dist/components/container/container.mjs +40 -0
- package/dist/components/container/index.d.cts +1 -0
- package/dist/components/container/index.d.mts +1 -0
- package/dist/components/element-marker.cjs +8 -0
- package/dist/components/element-marker.mjs +7 -0
- package/dist/components/font/font.cjs +22 -0
- package/dist/components/font/font.d.cts +26 -0
- package/dist/components/font/font.d.mts +26 -0
- package/dist/components/font/font.mjs +21 -0
- package/dist/components/font/index.d.cts +1 -0
- package/dist/components/font/index.d.mts +1 -0
- package/dist/components/head/head.cjs +20 -0
- package/dist/components/head/head.d.cts +7 -0
- package/dist/components/head/head.d.mts +7 -0
- package/dist/components/head/head.mjs +18 -0
- package/dist/components/head/index.d.cts +1 -0
- package/dist/components/head/index.d.mts +1 -0
- package/dist/components/heading/heading.cjs +30 -0
- package/dist/components/heading/heading.d.cts +22 -0
- package/dist/components/heading/heading.d.mts +22 -0
- package/dist/components/heading/heading.mjs +28 -0
- package/dist/components/heading/index.d.cts +1 -0
- package/dist/components/heading/index.d.mts +1 -0
- package/dist/components/heading/utils/as.d.cts +16 -0
- package/dist/components/heading/utils/as.d.mts +16 -0
- package/dist/components/heading/utils/spaces.cjs +24 -0
- package/dist/components/heading/utils/spaces.d.cts +14 -0
- package/dist/components/heading/utils/spaces.d.mts +14 -0
- package/dist/components/heading/utils/spaces.mjs +24 -0
- package/dist/components/hr/hr.cjs +21 -0
- package/dist/components/hr/hr.d.cts +7 -0
- package/dist/components/hr/hr.d.mts +7 -0
- package/dist/components/hr/hr.mjs +19 -0
- package/dist/components/hr/index.d.cts +1 -0
- package/dist/components/hr/index.d.mts +1 -0
- package/dist/components/html/html.cjs +15 -0
- package/dist/components/html/html.d.cts +7 -0
- package/dist/components/html/html.d.mts +7 -0
- package/dist/components/html/html.mjs +13 -0
- package/dist/components/html/index.d.cts +1 -0
- package/dist/components/html/index.d.mts +1 -0
- package/dist/components/img/img.cjs +25 -0
- package/dist/components/img/img.d.cts +7 -0
- package/dist/components/img/img.d.mts +7 -0
- package/dist/components/img/img.mjs +23 -0
- package/dist/components/img/index.d.cts +1 -0
- package/dist/components/img/index.d.mts +1 -0
- package/dist/components/index.d.cts +24 -0
- package/dist/components/index.d.mts +24 -0
- package/dist/components/link/index.d.cts +1 -0
- package/dist/components/link/index.d.mts +1 -0
- package/dist/components/link/link.cjs +21 -0
- package/dist/components/link/link.d.cts +7 -0
- package/dist/components/link/link.d.mts +7 -0
- package/dist/components/link/link.mjs +19 -0
- package/dist/components/markdown/index.d.cts +1 -0
- package/dist/components/markdown/index.d.mts +1 -0
- package/dist/components/markdown/markdown.cjs +101 -0
- package/dist/components/markdown/markdown.d.cts +16 -0
- package/dist/components/markdown/markdown.d.mts +16 -0
- package/dist/components/markdown/markdown.mjs +99 -0
- package/dist/components/markdown/styles.cjs +92 -0
- package/dist/components/markdown/styles.d.cts +31 -0
- package/dist/components/markdown/styles.d.mts +31 -0
- package/dist/components/markdown/styles.mjs +92 -0
- package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.cjs +60 -0
- package/dist/components/markdown/utils/parse-css-in-js-to-inline-css.mjs +60 -0
- package/dist/components/preview/index.d.cts +1 -0
- package/dist/components/preview/index.d.mts +1 -0
- package/dist/components/preview/preview.cjs +34 -0
- package/dist/components/preview/preview.d.cts +21 -0
- package/dist/components/preview/preview.d.mts +21 -0
- package/dist/components/preview/preview.mjs +31 -0
- package/dist/components/row/index.d.cts +1 -0
- package/dist/components/row/index.d.mts +1 -0
- package/dist/components/row/row.cjs +30 -0
- package/dist/components/row/row.d.cts +11 -0
- package/dist/components/row/row.d.mts +11 -0
- package/dist/components/row/row.mjs +28 -0
- package/dist/components/section/index.d.cts +1 -0
- package/dist/components/section/index.d.mts +1 -0
- package/dist/components/section/section.cjs +36 -0
- package/dist/components/section/section.d.cts +7 -0
- package/dist/components/section/section.d.mts +7 -0
- package/dist/components/section/section.mjs +34 -0
- package/dist/components/tailwind/hooks/use-suspended-promise.cjs +15 -0
- package/dist/components/tailwind/hooks/use-suspended-promise.mjs +15 -0
- package/dist/components/tailwind/index.d.cts +4 -0
- package/dist/components/tailwind/index.d.mts +4 -0
- package/dist/components/tailwind/inline-styles.cjs +11 -0
- package/dist/components/tailwind/inline-styles.d.cts +6 -0
- package/dist/components/tailwind/inline-styles.d.mts +6 -0
- package/dist/components/tailwind/inline-styles.mjs +11 -0
- package/dist/components/tailwind/sanitize-stylesheet.cjs +11 -0
- package/dist/components/tailwind/sanitize-stylesheet.d.cts +6 -0
- package/dist/components/tailwind/sanitize-stylesheet.d.mts +6 -0
- package/dist/components/tailwind/sanitize-stylesheet.mjs +11 -0
- package/dist/components/tailwind/tailwind.cjs +120 -0
- package/dist/components/tailwind/tailwind.d.cts +25 -0
- package/dist/components/tailwind/tailwind.d.mts +25 -0
- package/dist/components/tailwind/tailwind.mjs +117 -0
- package/dist/components/tailwind/utils/compatibility/get-react-property.cjs +10 -0
- package/dist/components/tailwind/utils/compatibility/get-react-property.mjs +10 -0
- package/dist/components/tailwind/utils/compatibility/sanitize-class-name.cjs +26 -0
- package/dist/components/tailwind/utils/compatibility/sanitize-class-name.mjs +26 -0
- package/dist/components/tailwind/utils/css/downlevel-for-email-clients.cjs +126 -0
- package/dist/components/tailwind/utils/css/downlevel-for-email-clients.mjs +125 -0
- package/dist/components/tailwind/utils/css/extract-rules-per-class.cjs +45 -0
- package/dist/components/tailwind/utils/css/extract-rules-per-class.mjs +44 -0
- package/dist/components/tailwind/utils/css/get-custom-properties.cjs +35 -0
- package/dist/components/tailwind/utils/css/get-custom-properties.mjs +34 -0
- package/dist/components/tailwind/utils/css/is-part-inlinable.cjs +10 -0
- package/dist/components/tailwind/utils/css/is-part-inlinable.mjs +9 -0
- package/dist/components/tailwind/utils/css/is-rule-inlinable.cjs +10 -0
- package/dist/components/tailwind/utils/css/is-rule-inlinable.mjs +9 -0
- package/dist/components/tailwind/utils/css/make-inline-styles-for.cjs +52 -0
- package/dist/components/tailwind/utils/css/make-inline-styles-for.mjs +51 -0
- package/dist/components/tailwind/utils/css/resolve-all-css-variables.cjs +89 -0
- package/dist/components/tailwind/utils/css/resolve-all-css-variables.mjs +88 -0
- package/dist/components/tailwind/utils/css/resolve-calc-expressions.cjs +92 -0
- package/dist/components/tailwind/utils/css/resolve-calc-expressions.mjs +91 -0
- package/dist/components/tailwind/utils/css/sanitize-declarations.cjs +310 -0
- package/dist/components/tailwind/utils/css/sanitize-declarations.mjs +309 -0
- package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.cjs +46 -0
- package/dist/components/tailwind/utils/css/sanitize-non-inlinable-rules.mjs +45 -0
- package/dist/components/tailwind/utils/css/split-mixed-rule.cjs +41 -0
- package/dist/components/tailwind/utils/css/split-mixed-rule.mjs +40 -0
- package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.cjs +52 -0
- package/dist/components/tailwind/utils/css/strip-empty-tailwind-vars.mjs +51 -0
- package/dist/components/tailwind/utils/css/unwrap-value.cjs +7 -0
- package/dist/components/tailwind/utils/css/unwrap-value.mjs +7 -0
- package/dist/components/tailwind/utils/react/is-component.cjs +7 -0
- package/dist/components/tailwind/utils/react/is-component.mjs +7 -0
- package/dist/components/tailwind/utils/react/map-react-tree.cjs +32 -0
- package/dist/components/tailwind/utils/react/map-react-tree.mjs +30 -0
- package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.cjs +37 -0
- package/dist/components/tailwind/utils/tailwindcss/clone-element-with-inlined-styles.mjs +35 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.cjs +77 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.cts +19 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.d.mts +19 -0
- package/dist/components/tailwind/utils/tailwindcss/setup-tailwind.mjs +76 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.cjs +901 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/index.mjs +901 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.cjs +398 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/preflight.mjs +398 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.cjs +467 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/theme.mjs +467 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.cjs +6 -0
- package/dist/components/tailwind/utils/tailwindcss/tailwind-stylesheets/utilities.mjs +6 -0
- package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.cjs +6 -0
- package/dist/components/tailwind/utils/text/from-dash-case-to-camel-case.mjs +6 -0
- package/dist/components/text/index.d.cts +1 -0
- package/dist/components/text/index.d.mts +1 -0
- package/dist/components/text/text.cjs +43 -0
- package/dist/components/text/text.d.cts +7 -0
- package/dist/components/text/text.d.mts +7 -0
- package/dist/components/text/text.mjs +41 -0
- package/dist/components/text/utils/compute-margins.cjs +62 -0
- package/dist/components/text/utils/compute-margins.mjs +62 -0
- package/dist/index.cjs +85 -40759
- package/dist/index.d.cts +24 -5132
- package/dist/index.d.mts +24 -5132
- package/dist/index.mjs +23 -40676
- package/package.json +7 -6
- package/src/components/body/body.tsx +2 -0
- package/src/components/button/button.tsx +2 -0
- package/src/components/code-block/code-block.tsx +2 -0
- package/src/components/code-inline/code-inline.tsx +2 -0
- package/src/components/column/column.tsx +2 -0
- package/src/components/container/container.tsx +2 -0
- package/src/components/element-marker.ts +5 -0
- package/src/components/heading/heading.tsx +2 -0
- package/src/components/hr/hr.tsx +2 -0
- package/src/components/img/img.tsx +2 -0
- package/src/components/link/link.tsx +2 -0
- package/src/components/preview/preview.tsx +2 -0
- package/src/components/row/row.tsx +2 -0
- package/src/components/section/section.tsx +2 -0
- package/src/components/tailwind/utils/react/is-component.ts +2 -32
- package/src/components/text/text.tsx +2 -0
- 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;
|