encre_css/plugins/layout/
mod.rs1pub mod aspect_ratio;
3pub mod box_decoration_break;
4pub mod box_sizing;
5pub mod break_after;
6pub mod break_before;
7pub mod break_inside;
8pub mod clear;
9pub mod columns;
10pub mod container;
11pub mod display;
12pub mod floats;
13pub mod isolation;
14pub mod object_fit;
15pub mod object_position;
16pub mod overflow;
17pub mod overscroll_behavior;
18pub mod placement;
19pub mod position;
20pub mod visibility;
21pub mod z_index;
22pub mod at_container;
23
24#[cfg(test)]
25mod tests {
26 use crate::{generate, utils::testing::base_config};
27
28 use pretty_assertions::assert_eq;
29
30 #[test]
31 fn aspect_ratio() {
32 assert_eq!(
33 generate(["aspect-auto"], &base_config()),
34 ".aspect-auto {
35 aspect-ratio: auto;
36}"
37 );
38 assert_eq!(
39 generate(["aspect-video"], &base_config()),
40 ".aspect-video {
41 aspect-ratio: 16 / 9;
42}"
43 );
44 }
45
46 #[test]
47 fn box_decoration_break() {
48 assert_eq!(
49 generate(["box-decoration-clone"], &base_config()),
50 ".box-decoration-clone {
51 box-decoration-break: clone;
52}"
53 );
54 }
55
56 #[test]
57 fn box_sizing() {
58 assert_eq!(
59 generate(["box-content"], &base_config()),
60 ".box-content {
61 box-sizing: content-box;
62}"
63 );
64 }
65
66 #[test]
67 fn break_after() {
68 assert_eq!(
69 generate(["break-after-all"], &base_config()),
70 ".break-after-all {
71 break-after: all;
72}"
73 );
74 assert_eq!(
75 generate(["break-after-avoid-page"], &base_config()),
76 ".break-after-avoid-page {
77 break-after: avoid-page;
78}"
79 );
80 assert_eq!(
81 generate(["break-after-column"], &base_config()),
82 ".break-after-column {
83 break-after: column;
84}"
85 );
86 }
87
88 #[test]
89 fn break_before() {
90 assert_eq!(
91 generate(["break-before-all"], &base_config()),
92 ".break-before-all {
93 break-before: all;
94}"
95 );
96 assert_eq!(
97 generate(["break-before-avoid-page"], &base_config()),
98 ".break-before-avoid-page {
99 break-before: avoid-page;
100}"
101 );
102 assert_eq!(
103 generate(["break-before-column"], &base_config()),
104 ".break-before-column {
105 break-before: column;
106}"
107 );
108 }
109
110 #[test]
111 fn break_inside() {
112 assert_eq!(
113 generate(["break-inside-auto"], &base_config()),
114 ".break-inside-auto {
115 break-inside: auto;
116}"
117 );
118 assert_eq!(
119 generate(["break-inside-avoid-page"], &base_config()),
120 ".break-inside-avoid-page {
121 break-inside: avoid-page;
122}"
123 );
124 }
125
126 #[test]
127 fn clear() {
128 assert_eq!(
129 generate(["clear-both"], &base_config()),
130 ".clear-both {
131 clear: both;
132}"
133 );
134
135 assert_eq!(
136 generate(["clear-start"], &base_config()),
137 ".clear-start {
138 clear: inline-start;
139}"
140 );
141
142 assert_eq!(
143 generate(["clear-end"], &base_config()),
144 ".clear-end {
145 clear: inline-end;
146}"
147 );
148 }
149
150 #[test]
151 fn columns() {
152 assert_eq!(
153 generate(["columns-md"], &base_config()),
154 ".columns-md {
155 columns: 28rem;
156}"
157 );
158 assert_eq!(
159 generate(["columns-4"], &base_config()),
160 ".columns-4 {
161 columns: 4;
162}"
163 );
164 }
165
166 #[test]
167 fn container() {
168 assert_eq!(
169 generate(["container"], &base_config()),
170 ".container {
171 width: 100%;
172}
173
174@media (width >= 40rem) {
175 .container {
176 max-width: 40rem;
177 }
178}
179
180@media (width >= 48rem) {
181 .container {
182 max-width: 48rem;
183 }
184}
185
186@media (width >= 64rem) {
187 .container {
188 max-width: 64rem;
189 }
190}
191
192@media (width >= 80rem) {
193 .container {
194 max-width: 80rem;
195 }
196}
197
198@media (width >= 96rem) {
199 .container {
200 max-width: 96rem;
201 }
202}"
203 );
204 }
205
206 #[test]
207 fn display() {
208 assert_eq!(
209 generate(["inline-flex"], &base_config()),
210 ".inline-flex {
211 display: inline-flex;
212}"
213 );
214 assert_eq!(
215 generate(["hidden"], &base_config()),
216 ".hidden {
217 display: none;
218}"
219 );
220 }
221
222 #[test]
223 fn floats() {
224 assert_eq!(
225 generate(["float-right"], &base_config()),
226 ".float-right {
227 float: right;
228}"
229 );
230
231 assert_eq!(
232 generate(["float-start"], &base_config()),
233 ".float-start {
234 float: inline-start;
235}"
236 );
237
238 assert_eq!(
239 generate(["float-end"], &base_config()),
240 ".float-end {
241 float: inline-end;
242}"
243 );
244 }
245
246 #[test]
247 fn isolation() {
248 assert_eq!(
249 generate(["isolate"], &base_config()),
250 ".isolate {
251 isolation: isolate;
252}"
253 );
254 assert_eq!(
255 generate(["isolation-auto"], &base_config()),
256 ".isolation-auto {
257 isolation: auto;
258}"
259 );
260 }
261
262 #[test]
263 fn object_fit() {
264 assert_eq!(
265 generate(["object-contain"], &base_config()),
266 ".object-contain {
267 object-fit: contain;
268}"
269 );
270 assert_eq!(
271 generate(["object-scale-down"], &base_config()),
272 ".object-scale-down {
273 object-fit: scale-down;
274}"
275 );
276 }
277
278 #[test]
279 fn object_position() {
280 assert_eq!(
281 generate(["object-bottom"], &base_config()),
282 ".object-bottom {
283 object-position: bottom;
284}"
285 );
286 assert_eq!(
287 generate(["object-top-left"], &base_config()),
288 ".object-top-left {
289 object-position: top left;
290}"
291 );
292 assert_eq!(
293 generate(["object-[center_bottom]"], &base_config()),
294 r".object-\[center_bottom\] {
295 object-position: center bottom;
296}"
297 );
298 }
299
300 #[test]
301 fn overflow() {
302 assert_eq!(
303 generate(["overflow-hidden"], &base_config()),
304 ".overflow-hidden {
305 overflow: hidden;
306}"
307 );
308 assert_eq!(
309 generate(["overflow-y-scroll"], &base_config()),
310 ".overflow-y-scroll {
311 overflow-y: scroll;
312}"
313 );
314 }
315
316 #[test]
317 fn overscroll_behavior() {
318 assert_eq!(
319 generate(["overscroll-auto"], &base_config()),
320 ".overscroll-auto {
321 overscroll-behavior: auto;
322}"
323 );
324 assert_eq!(
325 generate(["overscroll-y-none"], &base_config()),
326 ".overscroll-y-none {
327 overscroll-behavior-y: none;
328}"
329 );
330 }
331
332 #[test]
333 fn placement() {
334 assert_eq!(
335 generate(["top-12"], &base_config()),
336 ".top-12 {
337 top: 3rem;
338}"
339 );
340 assert_eq!(
341 generate(["top-[1px]"], &base_config()),
342 r".top-\[1px\] {
343 top: 1px;
344}"
345 );
346 assert_eq!(
347 generate(["left-auto"], &base_config()),
348 ".left-auto {
349 left: auto;
350}"
351 );
352 assert_eq!(
353 generate(["right-full"], &base_config()),
354 ".right-full {
355 right: 100%;
356}"
357 );
358 assert_eq!(
359 generate(["inset-2"], &base_config()),
360 ".inset-2 {
361 inset: 0.5rem;
362}"
363 );
364 assert_eq!(
365 generate(["-top-full"], &base_config()),
366 ".-top-full {
367 top: -100%;
368}"
369 );
370 assert_eq!(
371 generate(["-left-20"], &base_config()),
372 ".-left-20 {
373 left: -5rem;
374}"
375 );
376 assert_eq!(
377 generate(["right-[20%]"], &base_config()),
378 r".right-\[20\%\] {
379 right: 20%;
380}"
381 );
382 assert_eq!(
383 generate(["inset-[20px]"], &base_config()),
384 r".inset-\[20px\] {
385 inset: 20px;
386}"
387 );
388 assert_eq!(
389 generate(["inset-y-[10em]"], &base_config()),
390 r".inset-y-\[10em\] {
391 inset-block: 10em;
392}"
393 );
394 }
395
396 #[test]
397 fn position() {
398 assert_eq!(
399 generate(["relative"], &base_config()),
400 ".relative {
401 position: relative;
402}"
403 );
404 }
405
406 #[test]
407 fn visibility() {
408 assert_eq!(
409 generate(["visible"], &base_config()),
410 ".visible {
411 visibility: visible;
412}"
413 );
414 assert_eq!(
415 generate(["invisible"], &base_config()),
416 ".invisible {
417 visibility: hidden;
418}"
419 );
420 }
421
422 #[test]
423 fn z_index() {
424 assert_eq!(
425 generate(["z-22"], &base_config()),
426 ".z-22 {
427 z-index: 22;
428}"
429 );
430 }
431
432 #[test]
433 fn at_container() {
434 assert_eq!(
435 generate(["@container @container-[size_scroll-state] @md:bg-red-300"], &base_config()),
436 r".\@container {
437 container-type: inline-size;
438}
439
440.\@container-\[size_scroll-state\] {
441 container-type: size scroll-state;
442}
443
444@container (width >= 28rem) {
445 .\@md\:bg-red-300 {
446 background-color: oklch(80.8% .114 19.571);
447 }
448}"
449 );
450 }
451}