Skip to main content

encre_css/plugins/transform/
mod.rs

1//! Transform utilities
2pub mod perspective;
3pub mod perspective_origin;
4pub mod rotate;
5pub mod scale;
6pub mod skew;
7pub mod transform_origin;
8pub mod transform_type;
9pub mod translate;
10
11// TODO(in tailwind v4.3): use transform functions in the `--en-translate/rotate/skew` variables,
12// not in the whole `transform` property
13const CSS_TRANSFORM: &str = "transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));";
14
15#[cfg(test)]
16mod tests {
17    use crate::{generate, utils::testing::base_config};
18
19    use pretty_assertions::assert_eq;
20
21    #[test]
22    fn perspective() {
23        assert_eq!(
24            generate(["perspective-distant"], &base_config()),
25            ".perspective-distant {
26  perspective: 1200px;
27}"
28        );
29        assert_eq!(
30            generate(["perspective-[0.1rem]"], &base_config()),
31            r".perspective-\[0\.1rem\] {
32  perspective: 0.1rem;
33}"
34        );
35    }
36
37    #[test]
38    fn perspective_origin() {
39        assert_eq!(
40            generate(["perspective-origin-top-left"], &base_config()),
41            ".perspective-origin-top-left {
42  perspective-origin: top left;
43}"
44        );
45        assert_eq!(
46            generate(["perspective-origin-[0.1rem_center]"], &base_config()),
47            r".perspective-origin-\[0\.1rem_center\] {
48  perspective-origin: 0.1rem center;
49}"
50        );
51    }
52
53    #[test]
54    fn rotate() {
55        assert_eq!(generate(["rotate-20"], &base_config()), ".rotate-20 {
56  --en-rotate-x: 20deg;
57  --en-rotate-y: 20deg;
58  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
59}");
60        assert_eq!(
61            generate(["rotate-[1.25turn]"], &base_config()),
62            r".rotate-\[1\.25turn\] {
63  --en-rotate-x: 1.25turn;
64  --en-rotate-y: 1.25turn;
65  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
66}"
67        );
68
69        assert_eq!(generate(["rotate-x-20"], &base_config()), ".rotate-x-20 {
70  --en-rotate-x: 20deg;
71  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
72}");
73        assert_eq!(
74            generate(["rotate-x-[1.25turn]"], &base_config()),
75            r".rotate-x-\[1\.25turn\] {
76  --en-rotate-x: 1.25turn;
77  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
78}"
79        );
80
81        assert_eq!(generate(["rotate-y-20"], &base_config()), ".rotate-y-20 {
82  --en-rotate-y: 20deg;
83  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
84}");
85        assert_eq!(
86            generate(["rotate-y-[1.25turn]"], &base_config()),
87            r".rotate-y-\[1\.25turn\] {
88  --en-rotate-y: 1.25turn;
89  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
90}"
91        );
92
93        assert_eq!(generate(["rotate-z-20"], &base_config()), ".rotate-z-20 {
94  --en-rotate-z: 20deg;
95  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
96}");
97        assert_eq!(
98            generate(["rotate-z-[1.25turn]"], &base_config()),
99            r".rotate-z-\[1\.25turn\] {
100  --en-rotate-z: 1.25turn;
101  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
102}"
103        );
104    }
105
106    #[test]
107    fn scale() {
108        assert_eq!(generate(["scale-150"], &base_config()), ".scale-150 {
109  --en-scale-x: 1.5;
110  --en-scale-y: 1.5;
111  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
112}");
113        assert_eq!(generate(["scale-x-20"], &base_config()), ".scale-x-20 {
114  --en-scale-x: 0.2;
115  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
116}");
117        assert_eq!(generate(["scale-y-45"], &base_config()), ".scale-y-45 {
118  --en-scale-y: 0.45;
119  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
120}");
121        assert_eq!(
122            generate(["scale-y-[88.42%]"], &base_config()),
123            r".scale-y-\[88\.42\%\] {
124  --en-scale-y: 88.42%;
125  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
126}"
127        );
128        assert_eq!(generate(["scale-z-45"], &base_config()), ".scale-z-45 {
129  --en-scale-z: 0.45;
130  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
131}");
132    }
133
134    #[test]
135    fn skew() {
136        assert_eq!(generate(["skew-x-20"], &base_config()), ".skew-x-20 {
137  --en-skew-x: 20deg;
138  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
139}");
140        assert_eq!(generate(["skew-y-20"], &base_config()), ".skew-y-20 {
141  --en-skew-y: 20deg;
142  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
143}");
144        assert_eq!(
145            generate(["skew-x-[1.25turn]"], &base_config()),
146            r".skew-x-\[1\.25turn\] {
147  --en-skew-x: 1.25turn;
148  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
149}"
150        );
151        assert_eq!(
152            generate(["skew-y-[1.25turn]"], &base_config()),
153            r".skew-y-\[1\.25turn\] {
154  --en-skew-y: 1.25turn;
155  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
156}"
157        );
158    }
159
160    #[test]
161    fn translate() {
162        assert_eq!(generate(["translate-x-20"], &base_config()), ".translate-x-20 {
163  --en-translate-x: 5rem;
164  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
165}");
166        assert_eq!(generate(["-translate-x-full"], &base_config()), ".-translate-x-full {
167  --en-translate-x: -100%;
168  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
169}");
170        assert_eq!(generate(["-translate-x-20"], &base_config()), ".-translate-x-20 {
171  --en-translate-x: -5rem;
172  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
173}");
174        assert_eq!(generate(["translate-x-auto"], &base_config()), ".translate-x-auto {
175  --en-translate-x: auto;
176  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
177}");
178        assert_eq!(
179            generate(["translate-x-[1.25%]"], &base_config()),
180            r".translate-x-\[1\.25\%\] {
181  --en-translate-x: 1.25%;
182  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
183}"
184        );
185
186        assert_eq!(generate(["translate-y-20"], &base_config()), ".translate-y-20 {
187  --en-translate-y: 5rem;
188  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
189}");
190        assert_eq!(generate(["-translate-y-full"], &base_config()), ".-translate-y-full {
191  --en-translate-y: -100%;
192  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
193}");
194        assert_eq!(generate(["-translate-y-20"], &base_config()), ".-translate-y-20 {
195  --en-translate-y: -5rem;
196  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
197}");
198        assert_eq!(generate(["translate-y-auto"], &base_config()), ".translate-y-auto {
199  --en-translate-y: auto;
200  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
201}");
202        assert_eq!(
203            generate(["translate-y-[1.25%]"], &base_config()),
204            r".translate-y-\[1\.25\%\] {
205  --en-translate-y: 1.25%;
206  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
207}"
208        );
209
210        assert_eq!(generate(["translate-z-20"], &base_config()), ".translate-z-20 {
211  --en-translate-z: 5rem;
212  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
213}");
214        assert_eq!(generate(["-translate-z-full"], &base_config()), ".-translate-z-full {
215  --en-translate-z: -100%;
216  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
217}");
218        assert_eq!(generate(["-translate-z-20"], &base_config()), ".-translate-z-20 {
219  --en-translate-z: -5rem;
220  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
221}");
222        assert_eq!(generate(["translate-z-auto"], &base_config()), ".translate-z-auto {
223  --en-translate-z: auto;
224  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
225}");
226        assert_eq!(
227            generate(["translate-z-[1.25%]"], &base_config()),
228            r".translate-z-\[1\.25\%\] {
229  --en-translate-z: 1.25%;
230  transform: translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
231}"
232        );
233    }
234
235    #[test]
236    fn transform_origin() {
237        assert_eq!(
238            generate(["origin-center"], &base_config()),
239            ".origin-center {
240  transform-origin: center;
241}"
242        );
243        assert_eq!(
244            generate(["origin-top-left"], &base_config()),
245            ".origin-top-left {
246  transform-origin: top left;
247}"
248        );
249        assert_eq!(
250            generate(["origin-[bottom_right_60px]"], &base_config()),
251            r".origin-\[bottom_right_60px\] {
252  transform-origin: bottom right 60px;
253}"
254        );
255        assert_eq!(
256            generate(["origin-[-100%_40%]"], &base_config()),
257            r".origin-\[-100\%_40\%\] {
258  transform-origin: -100% 40%;
259}"
260        );
261    }
262
263    #[test]
264    fn transform_type() {
265        assert_eq!(generate(["transform-gpu"], &base_config()), ".transform-gpu {
266  transform: translateZ(0) translate3d(var(--en-translate-x), var(--en-translate-y), var(--en-translate-z)) rotateX(var(--en-rotate-x)) rotateY(var(--en-rotate-y)) rotateZ(var(--en-rotate-z)) skewX(var(--en-skew-x)) skewY(var(--en-skew-y)) scale3d(var(--en-scale-x), var(--en-scale-y), var(--en-scale-z));
267}");
268        assert_eq!(
269            generate(["transform-none"], &base_config()),
270            ".transform-none {
271  transform: none;
272}"
273        );
274    }
275}