tailwind_rs_core/utilities/
grid.rs

1//! Grid utilities for tailwind-rs
2//!
3//! This module provides utilities for CSS Grid layout including grid template columns,
4//! grid template rows, grid column span, grid row span, grid auto flow, and gap utilities.
5
6use crate::classes::ClassBuilder;
7use serde::{Deserialize, Serialize};
8use std::fmt;
9
10/// Grid template columns values
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
12pub enum GridTemplateColumns {
13    /// None columns
14    None,
15    /// Subgrid columns
16    Subgrid,
17    /// Auto columns
18    Auto,
19    /// 1 column
20    One,
21    /// 2 columns
22    Two,
23    /// 3 columns
24    Three,
25    /// 4 columns
26    Four,
27    /// 5 columns
28    Five,
29    /// 6 columns
30    Six,
31    /// 7 columns
32    Seven,
33    /// 8 columns
34    Eight,
35    /// 9 columns
36    Nine,
37    /// 10 columns
38    Ten,
39    /// 11 columns
40    Eleven,
41    /// 12 columns
42    Twelve,
43}
44
45/// Grid template rows values
46#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
47pub enum GridTemplateRows {
48    /// None rows
49    None,
50    /// Subgrid rows
51    Subgrid,
52    /// Auto rows
53    Auto,
54    /// 1 row
55    One,
56    /// 2 rows
57    Two,
58    /// 3 rows
59    Three,
60    /// 4 rows
61    Four,
62    /// 5 rows
63    Five,
64    /// 6 rows
65    Six,
66}
67
68/// Grid column span values
69#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
70pub enum GridColumnSpan {
71    /// Auto span
72    Auto,
73    /// Span 1
74    One,
75    /// Span 2
76    Two,
77    /// Span 3
78    Three,
79    /// Span 4
80    Four,
81    /// Span 5
82    Five,
83    /// Span 6
84    Six,
85    /// Span 7
86    Seven,
87    /// Span 8
88    Eight,
89    /// Span 9
90    Nine,
91    /// Span 10
92    Ten,
93    /// Span 11
94    Eleven,
95    /// Span 12
96    Twelve,
97    /// Full span
98    Full,
99}
100
101/// Grid row span values
102#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
103pub enum GridRowSpan {
104    /// Auto span
105    Auto,
106    /// Span 1
107    One,
108    /// Span 2
109    Two,
110    /// Span 3
111    Three,
112    /// Span 4
113    Four,
114    /// Span 5
115    Five,
116    /// Span 6
117    Six,
118    /// Full span
119    Full,
120}
121
122/// Grid column start values
123#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
124pub enum GridColumnStart {
125    /// Auto start
126    Auto,
127    /// Start 1
128    One,
129    /// Start 2
130    Two,
131    /// Start 3
132    Three,
133    /// Start 4
134    Four,
135    /// Start 5
136    Five,
137    /// Start 6
138    Six,
139    /// Start 7
140    Seven,
141    /// Start 8
142    Eight,
143    /// Start 9
144    Nine,
145    /// Start 10
146    Ten,
147    /// Start 11
148    Eleven,
149    /// Start 12
150    Twelve,
151    /// Start 13
152    Thirteen,
153}
154
155/// Grid row start values
156#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
157pub enum GridRowStart {
158    /// Auto start
159    Auto,
160    /// Start 1
161    One,
162    /// Start 2
163    Two,
164    /// Start 3
165    Three,
166    /// Start 4
167    Four,
168    /// Start 5
169    Five,
170    /// Start 6
171    Six,
172    /// Start 7
173    Seven,
174}
175
176/// Grid column end values
177#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
178pub enum GridColumnEnd {
179    /// Auto end
180    Auto,
181    /// End 1
182    One,
183    /// End 2
184    Two,
185    /// End 3
186    Three,
187    /// End 4
188    Four,
189    /// End 5
190    Five,
191    /// End 6
192    Six,
193    /// End 7
194    Seven,
195    /// End 8
196    Eight,
197    /// End 9
198    Nine,
199    /// End 10
200    Ten,
201    /// End 11
202    Eleven,
203    /// End 12
204    Twelve,
205    /// End 13
206    Thirteen,
207}
208
209/// Grid row end values
210#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
211pub enum GridRowEnd {
212    /// Auto end
213    Auto,
214    /// End 1
215    One,
216    /// End 2
217    Two,
218    /// End 3
219    Three,
220    /// End 4
221    Four,
222    /// End 5
223    Five,
224    /// End 6
225    Six,
226    /// End 7
227    Seven,
228}
229
230/// Grid auto flow values
231#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
232pub enum GridAutoFlow {
233    /// Row auto flow
234    Row,
235    /// Column auto flow
236    Column,
237    /// Dense row auto flow
238    Dense,
239    /// Dense column auto flow
240    DenseColumn,
241}
242
243/// Grid auto columns values
244#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
245pub enum GridAutoColumns {
246    /// Auto columns
247    Auto,
248    /// Min columns
249    Min,
250    /// Max columns
251    Max,
252    /// Fr columns
253    Fr,
254}
255
256/// Grid auto rows values
257#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
258pub enum GridAutoRows {
259    /// Auto rows
260    Auto,
261    /// Min rows
262    Min,
263    /// Max rows
264    Max,
265    /// Fr rows
266    Fr,
267}
268
269impl GridTemplateColumns {
270    pub fn to_class_name(&self) -> String {
271        match self {
272            GridTemplateColumns::None => "none".to_string(),
273            GridTemplateColumns::Subgrid => "subgrid".to_string(),
274            GridTemplateColumns::Auto => "auto".to_string(),
275            GridTemplateColumns::One => "1".to_string(),
276            GridTemplateColumns::Two => "2".to_string(),
277            GridTemplateColumns::Three => "3".to_string(),
278            GridTemplateColumns::Four => "4".to_string(),
279            GridTemplateColumns::Five => "5".to_string(),
280            GridTemplateColumns::Six => "6".to_string(),
281            GridTemplateColumns::Seven => "7".to_string(),
282            GridTemplateColumns::Eight => "8".to_string(),
283            GridTemplateColumns::Nine => "9".to_string(),
284            GridTemplateColumns::Ten => "10".to_string(),
285            GridTemplateColumns::Eleven => "11".to_string(),
286            GridTemplateColumns::Twelve => "12".to_string(),
287        }
288    }
289    
290    pub fn to_css_value(&self) -> String {
291        match self {
292            GridTemplateColumns::None => "none".to_string(),
293            GridTemplateColumns::Subgrid => "subgrid".to_string(),
294            GridTemplateColumns::Auto => "repeat(auto-fit, minmax(0, 1fr))".to_string(),
295            GridTemplateColumns::One => "repeat(1, minmax(0, 1fr))".to_string(),
296            GridTemplateColumns::Two => "repeat(2, minmax(0, 1fr))".to_string(),
297            GridTemplateColumns::Three => "repeat(3, minmax(0, 1fr))".to_string(),
298            GridTemplateColumns::Four => "repeat(4, minmax(0, 1fr))".to_string(),
299            GridTemplateColumns::Five => "repeat(5, minmax(0, 1fr))".to_string(),
300            GridTemplateColumns::Six => "repeat(6, minmax(0, 1fr))".to_string(),
301            GridTemplateColumns::Seven => "repeat(7, minmax(0, 1fr))".to_string(),
302            GridTemplateColumns::Eight => "repeat(8, minmax(0, 1fr))".to_string(),
303            GridTemplateColumns::Nine => "repeat(9, minmax(0, 1fr))".to_string(),
304            GridTemplateColumns::Ten => "repeat(10, minmax(0, 1fr))".to_string(),
305            GridTemplateColumns::Eleven => "repeat(11, minmax(0, 1fr))".to_string(),
306            GridTemplateColumns::Twelve => "repeat(12, minmax(0, 1fr))".to_string(),
307        }
308    }
309}
310
311impl GridTemplateRows {
312    pub fn to_class_name(&self) -> String {
313        match self {
314            GridTemplateRows::None => "none".to_string(),
315            GridTemplateRows::Subgrid => "subgrid".to_string(),
316            GridTemplateRows::Auto => "auto".to_string(),
317            GridTemplateRows::One => "1".to_string(),
318            GridTemplateRows::Two => "2".to_string(),
319            GridTemplateRows::Three => "3".to_string(),
320            GridTemplateRows::Four => "4".to_string(),
321            GridTemplateRows::Five => "5".to_string(),
322            GridTemplateRows::Six => "6".to_string(),
323        }
324    }
325    
326    pub fn to_css_value(&self) -> String {
327        match self {
328            GridTemplateRows::None => "none".to_string(),
329            GridTemplateRows::Subgrid => "subgrid".to_string(),
330            GridTemplateRows::Auto => "repeat(auto-fit, minmax(0, 1fr))".to_string(),
331            GridTemplateRows::One => "repeat(1, minmax(0, 1fr))".to_string(),
332            GridTemplateRows::Two => "repeat(2, minmax(0, 1fr))".to_string(),
333            GridTemplateRows::Three => "repeat(3, minmax(0, 1fr))".to_string(),
334            GridTemplateRows::Four => "repeat(4, minmax(0, 1fr))".to_string(),
335            GridTemplateRows::Five => "repeat(5, minmax(0, 1fr))".to_string(),
336            GridTemplateRows::Six => "repeat(6, minmax(0, 1fr))".to_string(),
337        }
338    }
339}
340
341impl GridColumnSpan {
342    pub fn to_class_name(&self) -> String {
343        match self {
344            GridColumnSpan::Auto => "auto".to_string(),
345            GridColumnSpan::One => "1".to_string(),
346            GridColumnSpan::Two => "2".to_string(),
347            GridColumnSpan::Three => "3".to_string(),
348            GridColumnSpan::Four => "4".to_string(),
349            GridColumnSpan::Five => "5".to_string(),
350            GridColumnSpan::Six => "6".to_string(),
351            GridColumnSpan::Seven => "7".to_string(),
352            GridColumnSpan::Eight => "8".to_string(),
353            GridColumnSpan::Nine => "9".to_string(),
354            GridColumnSpan::Ten => "10".to_string(),
355            GridColumnSpan::Eleven => "11".to_string(),
356            GridColumnSpan::Twelve => "12".to_string(),
357            GridColumnSpan::Full => "full".to_string(),
358        }
359    }
360    
361    pub fn to_css_value(&self) -> String {
362        match self {
363            GridColumnSpan::Auto => "auto".to_string(),
364            GridColumnSpan::One => "span 1 / span 1".to_string(),
365            GridColumnSpan::Two => "span 2 / span 2".to_string(),
366            GridColumnSpan::Three => "span 3 / span 3".to_string(),
367            GridColumnSpan::Four => "span 4 / span 4".to_string(),
368            GridColumnSpan::Five => "span 5 / span 5".to_string(),
369            GridColumnSpan::Six => "span 6 / span 6".to_string(),
370            GridColumnSpan::Seven => "span 7 / span 7".to_string(),
371            GridColumnSpan::Eight => "span 8 / span 8".to_string(),
372            GridColumnSpan::Nine => "span 9 / span 9".to_string(),
373            GridColumnSpan::Ten => "span 10 / span 10".to_string(),
374            GridColumnSpan::Eleven => "span 11 / span 11".to_string(),
375            GridColumnSpan::Twelve => "span 12 / span 12".to_string(),
376            GridColumnSpan::Full => "1 / -1".to_string(),
377        }
378    }
379}
380
381impl GridRowSpan {
382    pub fn to_class_name(&self) -> String {
383        match self {
384            GridRowSpan::Auto => "auto".to_string(),
385            GridRowSpan::One => "1".to_string(),
386            GridRowSpan::Two => "2".to_string(),
387            GridRowSpan::Three => "3".to_string(),
388            GridRowSpan::Four => "4".to_string(),
389            GridRowSpan::Five => "5".to_string(),
390            GridRowSpan::Six => "6".to_string(),
391            GridRowSpan::Full => "full".to_string(),
392        }
393    }
394    
395    pub fn to_css_value(&self) -> String {
396        match self {
397            GridRowSpan::Auto => "auto".to_string(),
398            GridRowSpan::One => "span 1 / span 1".to_string(),
399            GridRowSpan::Two => "span 2 / span 2".to_string(),
400            GridRowSpan::Three => "span 3 / span 3".to_string(),
401            GridRowSpan::Four => "span 4 / span 4".to_string(),
402            GridRowSpan::Five => "span 5 / span 5".to_string(),
403            GridRowSpan::Six => "span 6 / span 6".to_string(),
404            GridRowSpan::Full => "1 / -1".to_string(),
405        }
406    }
407}
408
409impl GridColumnStart {
410    pub fn to_class_name(&self) -> String {
411        match self {
412            GridColumnStart::Auto => "auto".to_string(),
413            GridColumnStart::One => "1".to_string(),
414            GridColumnStart::Two => "2".to_string(),
415            GridColumnStart::Three => "3".to_string(),
416            GridColumnStart::Four => "4".to_string(),
417            GridColumnStart::Five => "5".to_string(),
418            GridColumnStart::Six => "6".to_string(),
419            GridColumnStart::Seven => "7".to_string(),
420            GridColumnStart::Eight => "8".to_string(),
421            GridColumnStart::Nine => "9".to_string(),
422            GridColumnStart::Ten => "10".to_string(),
423            GridColumnStart::Eleven => "11".to_string(),
424            GridColumnStart::Twelve => "12".to_string(),
425            GridColumnStart::Thirteen => "13".to_string(),
426        }
427    }
428    
429    pub fn to_css_value(&self) -> String {
430        match self {
431            GridColumnStart::Auto => "auto".to_string(),
432            GridColumnStart::One => "1".to_string(),
433            GridColumnStart::Two => "2".to_string(),
434            GridColumnStart::Three => "3".to_string(),
435            GridColumnStart::Four => "4".to_string(),
436            GridColumnStart::Five => "5".to_string(),
437            GridColumnStart::Six => "6".to_string(),
438            GridColumnStart::Seven => "7".to_string(),
439            GridColumnStart::Eight => "8".to_string(),
440            GridColumnStart::Nine => "9".to_string(),
441            GridColumnStart::Ten => "10".to_string(),
442            GridColumnStart::Eleven => "11".to_string(),
443            GridColumnStart::Twelve => "12".to_string(),
444            GridColumnStart::Thirteen => "13".to_string(),
445        }
446    }
447}
448
449impl GridRowStart {
450    pub fn to_class_name(&self) -> String {
451        match self {
452            GridRowStart::Auto => "auto".to_string(),
453            GridRowStart::One => "1".to_string(),
454            GridRowStart::Two => "2".to_string(),
455            GridRowStart::Three => "3".to_string(),
456            GridRowStart::Four => "4".to_string(),
457            GridRowStart::Five => "5".to_string(),
458            GridRowStart::Six => "6".to_string(),
459            GridRowStart::Seven => "7".to_string(),
460        }
461    }
462    
463    pub fn to_css_value(&self) -> String {
464        match self {
465            GridRowStart::Auto => "auto".to_string(),
466            GridRowStart::One => "1".to_string(),
467            GridRowStart::Two => "2".to_string(),
468            GridRowStart::Three => "3".to_string(),
469            GridRowStart::Four => "4".to_string(),
470            GridRowStart::Five => "5".to_string(),
471            GridRowStart::Six => "6".to_string(),
472            GridRowStart::Seven => "7".to_string(),
473        }
474    }
475}
476
477impl GridColumnEnd {
478    pub fn to_class_name(&self) -> String {
479        match self {
480            GridColumnEnd::Auto => "auto".to_string(),
481            GridColumnEnd::One => "1".to_string(),
482            GridColumnEnd::Two => "2".to_string(),
483            GridColumnEnd::Three => "3".to_string(),
484            GridColumnEnd::Four => "4".to_string(),
485            GridColumnEnd::Five => "5".to_string(),
486            GridColumnEnd::Six => "6".to_string(),
487            GridColumnEnd::Seven => "7".to_string(),
488            GridColumnEnd::Eight => "8".to_string(),
489            GridColumnEnd::Nine => "9".to_string(),
490            GridColumnEnd::Ten => "10".to_string(),
491            GridColumnEnd::Eleven => "11".to_string(),
492            GridColumnEnd::Twelve => "12".to_string(),
493            GridColumnEnd::Thirteen => "13".to_string(),
494        }
495    }
496    
497    pub fn to_css_value(&self) -> String {
498        match self {
499            GridColumnEnd::Auto => "auto".to_string(),
500            GridColumnEnd::One => "1".to_string(),
501            GridColumnEnd::Two => "2".to_string(),
502            GridColumnEnd::Three => "3".to_string(),
503            GridColumnEnd::Four => "4".to_string(),
504            GridColumnEnd::Five => "5".to_string(),
505            GridColumnEnd::Six => "6".to_string(),
506            GridColumnEnd::Seven => "7".to_string(),
507            GridColumnEnd::Eight => "8".to_string(),
508            GridColumnEnd::Nine => "9".to_string(),
509            GridColumnEnd::Ten => "10".to_string(),
510            GridColumnEnd::Eleven => "11".to_string(),
511            GridColumnEnd::Twelve => "12".to_string(),
512            GridColumnEnd::Thirteen => "13".to_string(),
513        }
514    }
515}
516
517impl GridRowEnd {
518    pub fn to_class_name(&self) -> String {
519        match self {
520            GridRowEnd::Auto => "auto".to_string(),
521            GridRowEnd::One => "1".to_string(),
522            GridRowEnd::Two => "2".to_string(),
523            GridRowEnd::Three => "3".to_string(),
524            GridRowEnd::Four => "4".to_string(),
525            GridRowEnd::Five => "5".to_string(),
526            GridRowEnd::Six => "6".to_string(),
527            GridRowEnd::Seven => "7".to_string(),
528        }
529    }
530    
531    pub fn to_css_value(&self) -> String {
532        match self {
533            GridRowEnd::Auto => "auto".to_string(),
534            GridRowEnd::One => "1".to_string(),
535            GridRowEnd::Two => "2".to_string(),
536            GridRowEnd::Three => "3".to_string(),
537            GridRowEnd::Four => "4".to_string(),
538            GridRowEnd::Five => "5".to_string(),
539            GridRowEnd::Six => "6".to_string(),
540            GridRowEnd::Seven => "7".to_string(),
541        }
542    }
543}
544
545impl GridAutoFlow {
546    pub fn to_class_name(&self) -> String {
547        match self {
548            GridAutoFlow::Row => "row".to_string(),
549            GridAutoFlow::Column => "col".to_string(),
550            GridAutoFlow::Dense => "dense".to_string(),
551            GridAutoFlow::DenseColumn => "col-dense".to_string(),
552        }
553    }
554    
555    pub fn to_css_value(&self) -> String {
556        match self {
557            GridAutoFlow::Row => "row".to_string(),
558            GridAutoFlow::Column => "column".to_string(),
559            GridAutoFlow::Dense => "row dense".to_string(),
560            GridAutoFlow::DenseColumn => "column dense".to_string(),
561        }
562    }
563}
564
565impl GridAutoColumns {
566    pub fn to_class_name(&self) -> String {
567        match self {
568            GridAutoColumns::Auto => "auto".to_string(),
569            GridAutoColumns::Min => "min".to_string(),
570            GridAutoColumns::Max => "max".to_string(),
571            GridAutoColumns::Fr => "fr".to_string(),
572        }
573    }
574    
575    pub fn to_css_value(&self) -> String {
576        match self {
577            GridAutoColumns::Auto => "auto".to_string(),
578            GridAutoColumns::Min => "min-content".to_string(),
579            GridAutoColumns::Max => "max-content".to_string(),
580            GridAutoColumns::Fr => "minmax(0, 1fr)".to_string(),
581        }
582    }
583}
584
585impl GridAutoRows {
586    pub fn to_class_name(&self) -> String {
587        match self {
588            GridAutoRows::Auto => "auto".to_string(),
589            GridAutoRows::Min => "min".to_string(),
590            GridAutoRows::Max => "max".to_string(),
591            GridAutoRows::Fr => "fr".to_string(),
592        }
593    }
594    
595    pub fn to_css_value(&self) -> String {
596        match self {
597            GridAutoRows::Auto => "auto".to_string(),
598            GridAutoRows::Min => "min-content".to_string(),
599            GridAutoRows::Max => "max-content".to_string(),
600            GridAutoRows::Fr => "minmax(0, 1fr)".to_string(),
601        }
602    }
603}
604
605impl fmt::Display for GridTemplateColumns {
606    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
607        write!(f, "{}", self.to_class_name())
608    }
609}
610
611impl fmt::Display for GridTemplateRows {
612    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
613        write!(f, "{}", self.to_class_name())
614    }
615}
616
617impl fmt::Display for GridColumnSpan {
618    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
619        write!(f, "{}", self.to_class_name())
620    }
621}
622
623impl fmt::Display for GridRowSpan {
624    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
625        write!(f, "{}", self.to_class_name())
626    }
627}
628
629impl fmt::Display for GridColumnStart {
630    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
631        write!(f, "{}", self.to_class_name())
632    }
633}
634
635impl fmt::Display for GridRowStart {
636    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
637        write!(f, "{}", self.to_class_name())
638    }
639}
640
641impl fmt::Display for GridColumnEnd {
642    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
643        write!(f, "{}", self.to_class_name())
644    }
645}
646
647impl fmt::Display for GridRowEnd {
648    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
649        write!(f, "{}", self.to_class_name())
650    }
651}
652
653impl fmt::Display for GridAutoFlow {
654    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
655        write!(f, "{}", self.to_class_name())
656    }
657}
658
659impl fmt::Display for GridAutoColumns {
660    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
661        write!(f, "{}", self.to_class_name())
662    }
663}
664
665impl fmt::Display for GridAutoRows {
666    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
667        write!(f, "{}", self.to_class_name())
668    }
669}
670
671/// Trait for adding grid template columns utilities to a class builder
672pub trait GridTemplateColumnsUtilities {
673    fn grid_template_columns(self, columns: GridTemplateColumns) -> Self;
674}
675
676impl GridTemplateColumnsUtilities for ClassBuilder {
677    fn grid_template_columns(self, columns: GridTemplateColumns) -> Self {
678        self.class(format!("grid-cols-{}", columns.to_class_name()))
679    }
680}
681
682/// Trait for adding grid template rows utilities to a class builder
683pub trait GridTemplateRowsUtilities {
684    fn grid_template_rows(self, rows: GridTemplateRows) -> Self;
685}
686
687impl GridTemplateRowsUtilities for ClassBuilder {
688    fn grid_template_rows(self, rows: GridTemplateRows) -> Self {
689        self.class(format!("grid-rows-{}", rows.to_class_name()))
690    }
691}
692
693/// Trait for adding grid column span utilities to a class builder
694pub trait GridColumnSpanUtilities {
695    fn grid_column_span(self, span: GridColumnSpan) -> Self;
696}
697
698impl GridColumnSpanUtilities for ClassBuilder {
699    fn grid_column_span(self, span: GridColumnSpan) -> Self {
700        self.class(format!("col-span-{}", span.to_class_name()))
701    }
702}
703
704/// Trait for adding grid row span utilities to a class builder
705pub trait GridRowSpanUtilities {
706    fn grid_row_span(self, span: GridRowSpan) -> Self;
707}
708
709impl GridRowSpanUtilities for ClassBuilder {
710    fn grid_row_span(self, span: GridRowSpan) -> Self {
711        self.class(format!("row-span-{}", span.to_class_name()))
712    }
713}
714
715/// Trait for adding grid column start utilities to a class builder
716pub trait GridColumnStartUtilities {
717    fn grid_column_start(self, start: GridColumnStart) -> Self;
718}
719
720impl GridColumnStartUtilities for ClassBuilder {
721    fn grid_column_start(self, start: GridColumnStart) -> Self {
722        self.class(format!("col-start-{}", start.to_class_name()))
723    }
724}
725
726/// Trait for adding grid row start utilities to a class builder
727pub trait GridRowStartUtilities {
728    fn grid_row_start(self, start: GridRowStart) -> Self;
729}
730
731impl GridRowStartUtilities for ClassBuilder {
732    fn grid_row_start(self, start: GridRowStart) -> Self {
733        self.class(format!("row-start-{}", start.to_class_name()))
734    }
735}
736
737/// Trait for adding grid column end utilities to a class builder
738pub trait GridColumnEndUtilities {
739    fn grid_column_end(self, end: GridColumnEnd) -> Self;
740}
741
742impl GridColumnEndUtilities for ClassBuilder {
743    fn grid_column_end(self, end: GridColumnEnd) -> Self {
744        self.class(format!("col-end-{}", end.to_class_name()))
745    }
746}
747
748/// Trait for adding grid row end utilities to a class builder
749pub trait GridRowEndUtilities {
750    fn grid_row_end(self, end: GridRowEnd) -> Self;
751}
752
753impl GridRowEndUtilities for ClassBuilder {
754    fn grid_row_end(self, end: GridRowEnd) -> Self {
755        self.class(format!("row-end-{}", end.to_class_name()))
756    }
757}
758
759/// Trait for adding grid auto flow utilities to a class builder
760pub trait GridAutoFlowUtilities {
761    fn grid_auto_flow(self, flow: GridAutoFlow) -> Self;
762}
763
764impl GridAutoFlowUtilities for ClassBuilder {
765    fn grid_auto_flow(self, flow: GridAutoFlow) -> Self {
766        self.class(format!("grid-flow-{}", flow.to_class_name()))
767    }
768}
769
770/// Trait for adding grid auto columns utilities to a class builder
771pub trait GridAutoColumnsUtilities {
772    fn grid_auto_columns(self, columns: GridAutoColumns) -> Self;
773}
774
775impl GridAutoColumnsUtilities for ClassBuilder {
776    fn grid_auto_columns(self, columns: GridAutoColumns) -> Self {
777        self.class(format!("auto-cols-{}", columns.to_class_name()))
778    }
779}
780
781/// Trait for adding grid auto rows utilities to a class builder
782pub trait GridAutoRowsUtilities {
783    fn grid_auto_rows(self, rows: GridAutoRows) -> Self;
784}
785
786impl GridAutoRowsUtilities for ClassBuilder {
787    fn grid_auto_rows(self, rows: GridAutoRows) -> Self {
788        self.class(format!("auto-rows-{}", rows.to_class_name()))
789    }
790}
791
792#[cfg(test)]
793mod tests {
794    use super::*;
795    
796    #[test]
797    fn test_grid_template_columns_utilities() {
798        let classes = ClassBuilder::new()
799            .grid_template_columns(GridTemplateColumns::None)
800            .grid_template_columns(GridTemplateColumns::Auto)
801            .grid_template_columns(GridTemplateColumns::One)
802            .grid_template_columns(GridTemplateColumns::Two)
803            .grid_template_columns(GridTemplateColumns::Three)
804            .grid_template_columns(GridTemplateColumns::Twelve)
805            .build();
806        
807        let css_classes = classes.to_css_classes();
808        assert!(css_classes.contains("grid-cols-none"));
809        assert!(css_classes.contains("grid-cols-auto"));
810        assert!(css_classes.contains("grid-cols-1"));
811        assert!(css_classes.contains("grid-cols-2"));
812        assert!(css_classes.contains("grid-cols-3"));
813        assert!(css_classes.contains("grid-cols-12"));
814    }
815    
816    #[test]
817    fn test_grid_template_rows_utilities() {
818        let classes = ClassBuilder::new()
819            .grid_template_rows(GridTemplateRows::None)
820            .grid_template_rows(GridTemplateRows::Auto)
821            .grid_template_rows(GridTemplateRows::One)
822            .grid_template_rows(GridTemplateRows::Two)
823            .grid_template_rows(GridTemplateRows::Three)
824            .grid_template_rows(GridTemplateRows::Six)
825            .build();
826        
827        let css_classes = classes.to_css_classes();
828        assert!(css_classes.contains("grid-rows-none"));
829        assert!(css_classes.contains("grid-rows-auto"));
830        assert!(css_classes.contains("grid-rows-1"));
831        assert!(css_classes.contains("grid-rows-2"));
832        assert!(css_classes.contains("grid-rows-3"));
833        assert!(css_classes.contains("grid-rows-6"));
834    }
835    
836    #[test]
837    fn test_grid_column_span_utilities() {
838        let classes = ClassBuilder::new()
839            .grid_column_span(GridColumnSpan::Auto)
840            .grid_column_span(GridColumnSpan::One)
841            .grid_column_span(GridColumnSpan::Two)
842            .grid_column_span(GridColumnSpan::Three)
843            .grid_column_span(GridColumnSpan::Twelve)
844            .grid_column_span(GridColumnSpan::Full)
845            .build();
846        
847        let css_classes = classes.to_css_classes();
848        assert!(css_classes.contains("col-span-auto"));
849        assert!(css_classes.contains("col-span-1"));
850        assert!(css_classes.contains("col-span-2"));
851        assert!(css_classes.contains("col-span-3"));
852        assert!(css_classes.contains("col-span-12"));
853        assert!(css_classes.contains("col-span-full"));
854    }
855    
856    #[test]
857    fn test_grid_row_span_utilities() {
858        let classes = ClassBuilder::new()
859            .grid_row_span(GridRowSpan::Auto)
860            .grid_row_span(GridRowSpan::One)
861            .grid_row_span(GridRowSpan::Two)
862            .grid_row_span(GridRowSpan::Three)
863            .grid_row_span(GridRowSpan::Six)
864            .grid_row_span(GridRowSpan::Full)
865            .build();
866        
867        let css_classes = classes.to_css_classes();
868        assert!(css_classes.contains("row-span-auto"));
869        assert!(css_classes.contains("row-span-1"));
870        assert!(css_classes.contains("row-span-2"));
871        assert!(css_classes.contains("row-span-3"));
872        assert!(css_classes.contains("row-span-6"));
873        assert!(css_classes.contains("row-span-full"));
874    }
875    
876    #[test]
877    fn test_grid_column_start_utilities() {
878        let classes = ClassBuilder::new()
879            .grid_column_start(GridColumnStart::Auto)
880            .grid_column_start(GridColumnStart::One)
881            .grid_column_start(GridColumnStart::Two)
882            .grid_column_start(GridColumnStart::Three)
883            .grid_column_start(GridColumnStart::Twelve)
884            .grid_column_start(GridColumnStart::Thirteen)
885            .build();
886        
887        let css_classes = classes.to_css_classes();
888        assert!(css_classes.contains("col-start-auto"));
889        assert!(css_classes.contains("col-start-1"));
890        assert!(css_classes.contains("col-start-2"));
891        assert!(css_classes.contains("col-start-3"));
892        assert!(css_classes.contains("col-start-12"));
893        assert!(css_classes.contains("col-start-13"));
894    }
895    
896    #[test]
897    fn test_grid_row_start_utilities() {
898        let classes = ClassBuilder::new()
899            .grid_row_start(GridRowStart::Auto)
900            .grid_row_start(GridRowStart::One)
901            .grid_row_start(GridRowStart::Two)
902            .grid_row_start(GridRowStart::Three)
903            .grid_row_start(GridRowStart::Six)
904            .grid_row_start(GridRowStart::Seven)
905            .build();
906        
907        let css_classes = classes.to_css_classes();
908        assert!(css_classes.contains("row-start-auto"));
909        assert!(css_classes.contains("row-start-1"));
910        assert!(css_classes.contains("row-start-2"));
911        assert!(css_classes.contains("row-start-3"));
912        assert!(css_classes.contains("row-start-6"));
913        assert!(css_classes.contains("row-start-7"));
914    }
915    
916    #[test]
917    fn test_grid_column_end_utilities() {
918        let classes = ClassBuilder::new()
919            .grid_column_end(GridColumnEnd::Auto)
920            .grid_column_end(GridColumnEnd::One)
921            .grid_column_end(GridColumnEnd::Two)
922            .grid_column_end(GridColumnEnd::Three)
923            .grid_column_end(GridColumnEnd::Twelve)
924            .grid_column_end(GridColumnEnd::Thirteen)
925            .build();
926        
927        let css_classes = classes.to_css_classes();
928        assert!(css_classes.contains("col-end-auto"));
929        assert!(css_classes.contains("col-end-1"));
930        assert!(css_classes.contains("col-end-2"));
931        assert!(css_classes.contains("col-end-3"));
932        assert!(css_classes.contains("col-end-12"));
933        assert!(css_classes.contains("col-end-13"));
934    }
935    
936    #[test]
937    fn test_grid_row_end_utilities() {
938        let classes = ClassBuilder::new()
939            .grid_row_end(GridRowEnd::Auto)
940            .grid_row_end(GridRowEnd::One)
941            .grid_row_end(GridRowEnd::Two)
942            .grid_row_end(GridRowEnd::Three)
943            .grid_row_end(GridRowEnd::Six)
944            .grid_row_end(GridRowEnd::Seven)
945            .build();
946        
947        let css_classes = classes.to_css_classes();
948        assert!(css_classes.contains("row-end-auto"));
949        assert!(css_classes.contains("row-end-1"));
950        assert!(css_classes.contains("row-end-2"));
951        assert!(css_classes.contains("row-end-3"));
952        assert!(css_classes.contains("row-end-6"));
953        assert!(css_classes.contains("row-end-7"));
954    }
955    
956    #[test]
957    fn test_grid_auto_flow_utilities() {
958        let classes = ClassBuilder::new()
959            .grid_auto_flow(GridAutoFlow::Row)
960            .grid_auto_flow(GridAutoFlow::Column)
961            .grid_auto_flow(GridAutoFlow::Dense)
962            .grid_auto_flow(GridAutoFlow::DenseColumn)
963            .build();
964        
965        let css_classes = classes.to_css_classes();
966        assert!(css_classes.contains("grid-flow-row"));
967        assert!(css_classes.contains("grid-flow-col"));
968        assert!(css_classes.contains("grid-flow-dense"));
969        assert!(css_classes.contains("grid-flow-col-dense"));
970    }
971    
972    #[test]
973    fn test_grid_auto_columns_utilities() {
974        let classes = ClassBuilder::new()
975            .grid_auto_columns(GridAutoColumns::Auto)
976            .grid_auto_columns(GridAutoColumns::Min)
977            .grid_auto_columns(GridAutoColumns::Max)
978            .grid_auto_columns(GridAutoColumns::Fr)
979            .build();
980        
981        let css_classes = classes.to_css_classes();
982        assert!(css_classes.contains("auto-cols-auto"));
983        assert!(css_classes.contains("auto-cols-min"));
984        assert!(css_classes.contains("auto-cols-max"));
985        assert!(css_classes.contains("auto-cols-fr"));
986    }
987    
988    #[test]
989    fn test_grid_auto_rows_utilities() {
990        let classes = ClassBuilder::new()
991            .grid_auto_rows(GridAutoRows::Auto)
992            .grid_auto_rows(GridAutoRows::Min)
993            .grid_auto_rows(GridAutoRows::Max)
994            .grid_auto_rows(GridAutoRows::Fr)
995            .build();
996        
997        let css_classes = classes.to_css_classes();
998        assert!(css_classes.contains("auto-rows-auto"));
999        assert!(css_classes.contains("auto-rows-min"));
1000        assert!(css_classes.contains("auto-rows-max"));
1001        assert!(css_classes.contains("auto-rows-fr"));
1002    }
1003    
1004    #[test]
1005    fn test_complex_grid_combination() {
1006        let classes = ClassBuilder::new()
1007            .grid_template_columns(GridTemplateColumns::Three)
1008            .grid_template_rows(GridTemplateRows::Two)
1009            .grid_column_span(GridColumnSpan::Two)
1010            .grid_row_span(GridRowSpan::One)
1011            .grid_column_start(GridColumnStart::One)
1012            .grid_row_start(GridRowStart::One)
1013            .grid_column_end(GridColumnEnd::Three)
1014            .grid_row_end(GridRowEnd::Two)
1015            .grid_auto_flow(GridAutoFlow::Row)
1016            .grid_auto_columns(GridAutoColumns::Auto)
1017            .grid_auto_rows(GridAutoRows::Auto)
1018            .build();
1019        
1020        let css_classes = classes.to_css_classes();
1021        assert!(css_classes.contains("grid-cols-3"));
1022        assert!(css_classes.contains("grid-rows-2"));
1023        assert!(css_classes.contains("col-span-2"));
1024        assert!(css_classes.contains("row-span-1"));
1025        assert!(css_classes.contains("col-start-1"));
1026        assert!(css_classes.contains("row-start-1"));
1027        assert!(css_classes.contains("col-end-3"));
1028        assert!(css_classes.contains("row-end-2"));
1029        assert!(css_classes.contains("grid-flow-row"));
1030        assert!(css_classes.contains("auto-cols-auto"));
1031        assert!(css_classes.contains("auto-rows-auto"));
1032    }
1033}