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    use crate::utilities::spacing::GapUtilities;
796    
797    #[test]
798    fn test_grid_template_columns_utilities() {
799        let classes = ClassBuilder::new()
800            .grid_template_columns(GridTemplateColumns::None)
801            .grid_template_columns(GridTemplateColumns::Auto)
802            .grid_template_columns(GridTemplateColumns::One)
803            .grid_template_columns(GridTemplateColumns::Two)
804            .grid_template_columns(GridTemplateColumns::Three)
805            .grid_template_columns(GridTemplateColumns::Twelve)
806            .build();
807        
808        let css_classes = classes.to_css_classes();
809        assert!(css_classes.contains("grid-cols-none"));
810        assert!(css_classes.contains("grid-cols-auto"));
811        assert!(css_classes.contains("grid-cols-1"));
812        assert!(css_classes.contains("grid-cols-2"));
813        assert!(css_classes.contains("grid-cols-3"));
814        assert!(css_classes.contains("grid-cols-12"));
815    }
816    
817    #[test]
818    fn test_grid_template_rows_utilities() {
819        let classes = ClassBuilder::new()
820            .grid_template_rows(GridTemplateRows::None)
821            .grid_template_rows(GridTemplateRows::Auto)
822            .grid_template_rows(GridTemplateRows::One)
823            .grid_template_rows(GridTemplateRows::Two)
824            .grid_template_rows(GridTemplateRows::Three)
825            .grid_template_rows(GridTemplateRows::Six)
826            .build();
827        
828        let css_classes = classes.to_css_classes();
829        assert!(css_classes.contains("grid-rows-none"));
830        assert!(css_classes.contains("grid-rows-auto"));
831        assert!(css_classes.contains("grid-rows-1"));
832        assert!(css_classes.contains("grid-rows-2"));
833        assert!(css_classes.contains("grid-rows-3"));
834        assert!(css_classes.contains("grid-rows-6"));
835    }
836    
837    #[test]
838    fn test_grid_column_span_utilities() {
839        let classes = ClassBuilder::new()
840            .grid_column_span(GridColumnSpan::Auto)
841            .grid_column_span(GridColumnSpan::One)
842            .grid_column_span(GridColumnSpan::Two)
843            .grid_column_span(GridColumnSpan::Three)
844            .grid_column_span(GridColumnSpan::Twelve)
845            .grid_column_span(GridColumnSpan::Full)
846            .build();
847        
848        let css_classes = classes.to_css_classes();
849        assert!(css_classes.contains("col-span-auto"));
850        assert!(css_classes.contains("col-span-1"));
851        assert!(css_classes.contains("col-span-2"));
852        assert!(css_classes.contains("col-span-3"));
853        assert!(css_classes.contains("col-span-12"));
854        assert!(css_classes.contains("col-span-full"));
855    }
856    
857    #[test]
858    fn test_grid_row_span_utilities() {
859        let classes = ClassBuilder::new()
860            .grid_row_span(GridRowSpan::Auto)
861            .grid_row_span(GridRowSpan::One)
862            .grid_row_span(GridRowSpan::Two)
863            .grid_row_span(GridRowSpan::Three)
864            .grid_row_span(GridRowSpan::Six)
865            .grid_row_span(GridRowSpan::Full)
866            .build();
867        
868        let css_classes = classes.to_css_classes();
869        assert!(css_classes.contains("row-span-auto"));
870        assert!(css_classes.contains("row-span-1"));
871        assert!(css_classes.contains("row-span-2"));
872        assert!(css_classes.contains("row-span-3"));
873        assert!(css_classes.contains("row-span-6"));
874        assert!(css_classes.contains("row-span-full"));
875    }
876    
877    #[test]
878    fn test_grid_column_start_utilities() {
879        let classes = ClassBuilder::new()
880            .grid_column_start(GridColumnStart::Auto)
881            .grid_column_start(GridColumnStart::One)
882            .grid_column_start(GridColumnStart::Two)
883            .grid_column_start(GridColumnStart::Three)
884            .grid_column_start(GridColumnStart::Twelve)
885            .grid_column_start(GridColumnStart::Thirteen)
886            .build();
887        
888        let css_classes = classes.to_css_classes();
889        assert!(css_classes.contains("col-start-auto"));
890        assert!(css_classes.contains("col-start-1"));
891        assert!(css_classes.contains("col-start-2"));
892        assert!(css_classes.contains("col-start-3"));
893        assert!(css_classes.contains("col-start-12"));
894        assert!(css_classes.contains("col-start-13"));
895    }
896    
897    #[test]
898    fn test_grid_row_start_utilities() {
899        let classes = ClassBuilder::new()
900            .grid_row_start(GridRowStart::Auto)
901            .grid_row_start(GridRowStart::One)
902            .grid_row_start(GridRowStart::Two)
903            .grid_row_start(GridRowStart::Three)
904            .grid_row_start(GridRowStart::Six)
905            .grid_row_start(GridRowStart::Seven)
906            .build();
907        
908        let css_classes = classes.to_css_classes();
909        assert!(css_classes.contains("row-start-auto"));
910        assert!(css_classes.contains("row-start-1"));
911        assert!(css_classes.contains("row-start-2"));
912        assert!(css_classes.contains("row-start-3"));
913        assert!(css_classes.contains("row-start-6"));
914        assert!(css_classes.contains("row-start-7"));
915    }
916    
917    #[test]
918    fn test_grid_column_end_utilities() {
919        let classes = ClassBuilder::new()
920            .grid_column_end(GridColumnEnd::Auto)
921            .grid_column_end(GridColumnEnd::One)
922            .grid_column_end(GridColumnEnd::Two)
923            .grid_column_end(GridColumnEnd::Three)
924            .grid_column_end(GridColumnEnd::Twelve)
925            .grid_column_end(GridColumnEnd::Thirteen)
926            .build();
927        
928        let css_classes = classes.to_css_classes();
929        assert!(css_classes.contains("col-end-auto"));
930        assert!(css_classes.contains("col-end-1"));
931        assert!(css_classes.contains("col-end-2"));
932        assert!(css_classes.contains("col-end-3"));
933        assert!(css_classes.contains("col-end-12"));
934        assert!(css_classes.contains("col-end-13"));
935    }
936    
937    #[test]
938    fn test_grid_row_end_utilities() {
939        let classes = ClassBuilder::new()
940            .grid_row_end(GridRowEnd::Auto)
941            .grid_row_end(GridRowEnd::One)
942            .grid_row_end(GridRowEnd::Two)
943            .grid_row_end(GridRowEnd::Three)
944            .grid_row_end(GridRowEnd::Six)
945            .grid_row_end(GridRowEnd::Seven)
946            .build();
947        
948        let css_classes = classes.to_css_classes();
949        assert!(css_classes.contains("row-end-auto"));
950        assert!(css_classes.contains("row-end-1"));
951        assert!(css_classes.contains("row-end-2"));
952        assert!(css_classes.contains("row-end-3"));
953        assert!(css_classes.contains("row-end-6"));
954        assert!(css_classes.contains("row-end-7"));
955    }
956    
957    #[test]
958    fn test_grid_auto_flow_utilities() {
959        let classes = ClassBuilder::new()
960            .grid_auto_flow(GridAutoFlow::Row)
961            .grid_auto_flow(GridAutoFlow::Column)
962            .grid_auto_flow(GridAutoFlow::Dense)
963            .grid_auto_flow(GridAutoFlow::DenseColumn)
964            .build();
965        
966        let css_classes = classes.to_css_classes();
967        assert!(css_classes.contains("grid-flow-row"));
968        assert!(css_classes.contains("grid-flow-col"));
969        assert!(css_classes.contains("grid-flow-dense"));
970        assert!(css_classes.contains("grid-flow-col-dense"));
971    }
972    
973    #[test]
974    fn test_grid_auto_columns_utilities() {
975        let classes = ClassBuilder::new()
976            .grid_auto_columns(GridAutoColumns::Auto)
977            .grid_auto_columns(GridAutoColumns::Min)
978            .grid_auto_columns(GridAutoColumns::Max)
979            .grid_auto_columns(GridAutoColumns::Fr)
980            .build();
981        
982        let css_classes = classes.to_css_classes();
983        assert!(css_classes.contains("auto-cols-auto"));
984        assert!(css_classes.contains("auto-cols-min"));
985        assert!(css_classes.contains("auto-cols-max"));
986        assert!(css_classes.contains("auto-cols-fr"));
987    }
988    
989    #[test]
990    fn test_grid_auto_rows_utilities() {
991        let classes = ClassBuilder::new()
992            .grid_auto_rows(GridAutoRows::Auto)
993            .grid_auto_rows(GridAutoRows::Min)
994            .grid_auto_rows(GridAutoRows::Max)
995            .grid_auto_rows(GridAutoRows::Fr)
996            .build();
997        
998        let css_classes = classes.to_css_classes();
999        assert!(css_classes.contains("auto-rows-auto"));
1000        assert!(css_classes.contains("auto-rows-min"));
1001        assert!(css_classes.contains("auto-rows-max"));
1002        assert!(css_classes.contains("auto-rows-fr"));
1003    }
1004    
1005    #[test]
1006    fn test_complex_grid_combination() {
1007        let classes = ClassBuilder::new()
1008            .grid_template_columns(GridTemplateColumns::Three)
1009            .grid_template_rows(GridTemplateRows::Two)
1010            .grid_column_span(GridColumnSpan::Two)
1011            .grid_row_span(GridRowSpan::One)
1012            .grid_column_start(GridColumnStart::One)
1013            .grid_row_start(GridRowStart::One)
1014            .grid_column_end(GridColumnEnd::Three)
1015            .grid_row_end(GridRowEnd::Two)
1016            .grid_auto_flow(GridAutoFlow::Row)
1017            .grid_auto_columns(GridAutoColumns::Auto)
1018            .grid_auto_rows(GridAutoRows::Auto)
1019            .build();
1020        
1021        let css_classes = classes.to_css_classes();
1022        assert!(css_classes.contains("grid-cols-3"));
1023        assert!(css_classes.contains("grid-rows-2"));
1024        assert!(css_classes.contains("col-span-2"));
1025        assert!(css_classes.contains("row-span-1"));
1026        assert!(css_classes.contains("col-start-1"));
1027        assert!(css_classes.contains("row-start-1"));
1028        assert!(css_classes.contains("col-end-3"));
1029        assert!(css_classes.contains("row-end-2"));
1030        assert!(css_classes.contains("grid-flow-row"));
1031        assert!(css_classes.contains("auto-cols-auto"));
1032        assert!(css_classes.contains("auto-rows-auto"));
1033    }
1034    
1035    /// Test that all Week 6 grid utilities are implemented
1036    #[test]
1037    fn test_week6_grid_utilities() {
1038        // Test all Week 6 grid utilities
1039        let classes = ClassBuilder::new()
1040            // Grid Template
1041            .grid_template_columns(GridTemplateColumns::One)
1042            .grid_template_columns(GridTemplateColumns::Twelve)
1043            .grid_template_columns(GridTemplateColumns::None)
1044            .grid_template_rows(GridTemplateRows::One)
1045            .grid_template_rows(GridTemplateRows::Six)
1046            .grid_template_rows(GridTemplateRows::None)
1047            .grid_column_span(GridColumnSpan::Auto)
1048            .grid_column_span(GridColumnSpan::One)
1049            .grid_column_span(GridColumnSpan::Twelve)
1050            .grid_column_span(GridColumnSpan::Full)
1051            .grid_row_span(GridRowSpan::Auto)
1052            .grid_row_span(GridRowSpan::One)
1053            .grid_row_span(GridRowSpan::Six)
1054            .grid_row_span(GridRowSpan::Full)
1055            // Grid Gap & Alignment
1056            .gap(crate::utilities::spacing::SpacingValue::Zero)
1057            .gap(crate::utilities::spacing::SpacingValue::Integer(4))
1058            .gap_x(crate::utilities::spacing::SpacingValue::Integer(2))
1059            .gap_y(crate::utilities::spacing::SpacingValue::Integer(6))
1060            .build();
1061        
1062        let css_classes = classes.to_css_classes();
1063        
1064        // Grid Template
1065        assert!(css_classes.contains("grid-cols-1"));
1066        assert!(css_classes.contains("grid-cols-12"));
1067        assert!(css_classes.contains("grid-cols-none"));
1068        assert!(css_classes.contains("grid-rows-1"));
1069        assert!(css_classes.contains("grid-rows-6"));
1070        assert!(css_classes.contains("grid-rows-none"));
1071        assert!(css_classes.contains("col-span-auto"));
1072        assert!(css_classes.contains("col-span-1"));
1073        assert!(css_classes.contains("col-span-12"));
1074        assert!(css_classes.contains("col-span-full"));
1075        assert!(css_classes.contains("row-span-auto"));
1076        assert!(css_classes.contains("row-span-1"));
1077        assert!(css_classes.contains("row-span-6"));
1078        assert!(css_classes.contains("row-span-full"));
1079        
1080        // Grid Gap & Alignment
1081        assert!(css_classes.contains("gap-0"));
1082        assert!(css_classes.contains("gap-4"));
1083        assert!(css_classes.contains("gap-x-2"));
1084        assert!(css_classes.contains("gap-y-6"));
1085    }
1086
1087    #[test]
1088    fn test_grid_template_columns_class_names() {
1089        assert_eq!(GridTemplateColumns::None.to_class_name(), "none");
1090        assert_eq!(GridTemplateColumns::Subgrid.to_class_name(), "subgrid");
1091        assert_eq!(GridTemplateColumns::Auto.to_class_name(), "auto");
1092        assert_eq!(GridTemplateColumns::One.to_class_name(), "1");
1093        assert_eq!(GridTemplateColumns::Two.to_class_name(), "2");
1094        assert_eq!(GridTemplateColumns::Three.to_class_name(), "3");
1095        assert_eq!(GridTemplateColumns::Four.to_class_name(), "4");
1096        assert_eq!(GridTemplateColumns::Five.to_class_name(), "5");
1097        assert_eq!(GridTemplateColumns::Six.to_class_name(), "6");
1098        assert_eq!(GridTemplateColumns::Seven.to_class_name(), "7");
1099        assert_eq!(GridTemplateColumns::Eight.to_class_name(), "8");
1100        assert_eq!(GridTemplateColumns::Nine.to_class_name(), "9");
1101        assert_eq!(GridTemplateColumns::Ten.to_class_name(), "10");
1102        assert_eq!(GridTemplateColumns::Eleven.to_class_name(), "11");
1103        assert_eq!(GridTemplateColumns::Twelve.to_class_name(), "12");
1104    }
1105
1106    #[test]
1107    fn test_grid_template_columns_css_values() {
1108        assert_eq!(GridTemplateColumns::None.to_css_value(), "none");
1109        assert_eq!(GridTemplateColumns::Subgrid.to_css_value(), "subgrid");
1110        assert_eq!(GridTemplateColumns::Auto.to_css_value(), "repeat(auto-fit, minmax(0, 1fr))");
1111        assert_eq!(GridTemplateColumns::One.to_css_value(), "repeat(1, minmax(0, 1fr))");
1112        assert_eq!(GridTemplateColumns::Two.to_css_value(), "repeat(2, minmax(0, 1fr))");
1113        assert_eq!(GridTemplateColumns::Three.to_css_value(), "repeat(3, minmax(0, 1fr))");
1114        assert_eq!(GridTemplateColumns::Four.to_css_value(), "repeat(4, minmax(0, 1fr))");
1115        assert_eq!(GridTemplateColumns::Five.to_css_value(), "repeat(5, minmax(0, 1fr))");
1116        assert_eq!(GridTemplateColumns::Six.to_css_value(), "repeat(6, minmax(0, 1fr))");
1117        assert_eq!(GridTemplateColumns::Seven.to_css_value(), "repeat(7, minmax(0, 1fr))");
1118        assert_eq!(GridTemplateColumns::Eight.to_css_value(), "repeat(8, minmax(0, 1fr))");
1119        assert_eq!(GridTemplateColumns::Nine.to_css_value(), "repeat(9, minmax(0, 1fr))");
1120        assert_eq!(GridTemplateColumns::Ten.to_css_value(), "repeat(10, minmax(0, 1fr))");
1121        assert_eq!(GridTemplateColumns::Eleven.to_css_value(), "repeat(11, minmax(0, 1fr))");
1122        assert_eq!(GridTemplateColumns::Twelve.to_css_value(), "repeat(12, minmax(0, 1fr))");
1123    }
1124
1125    #[test]
1126    fn test_grid_template_rows_class_names() {
1127        assert_eq!(GridTemplateRows::None.to_class_name(), "none");
1128        assert_eq!(GridTemplateRows::Subgrid.to_class_name(), "subgrid");
1129        assert_eq!(GridTemplateRows::Auto.to_class_name(), "auto");
1130        assert_eq!(GridTemplateRows::One.to_class_name(), "1");
1131        assert_eq!(GridTemplateRows::Two.to_class_name(), "2");
1132        assert_eq!(GridTemplateRows::Three.to_class_name(), "3");
1133        assert_eq!(GridTemplateRows::Four.to_class_name(), "4");
1134        assert_eq!(GridTemplateRows::Five.to_class_name(), "5");
1135        assert_eq!(GridTemplateRows::Six.to_class_name(), "6");
1136    }
1137
1138    #[test]
1139    fn test_grid_template_rows_css_values() {
1140        assert_eq!(GridTemplateRows::None.to_css_value(), "none");
1141        assert_eq!(GridTemplateRows::Subgrid.to_css_value(), "subgrid");
1142        assert_eq!(GridTemplateRows::Auto.to_css_value(), "repeat(auto-fit, minmax(0, 1fr))");
1143        assert_eq!(GridTemplateRows::One.to_css_value(), "repeat(1, minmax(0, 1fr))");
1144        assert_eq!(GridTemplateRows::Two.to_css_value(), "repeat(2, minmax(0, 1fr))");
1145        assert_eq!(GridTemplateRows::Three.to_css_value(), "repeat(3, minmax(0, 1fr))");
1146        assert_eq!(GridTemplateRows::Four.to_css_value(), "repeat(4, minmax(0, 1fr))");
1147        assert_eq!(GridTemplateRows::Five.to_css_value(), "repeat(5, minmax(0, 1fr))");
1148        assert_eq!(GridTemplateRows::Six.to_css_value(), "repeat(6, minmax(0, 1fr))");
1149    }
1150
1151    #[test]
1152    fn test_grid_column_span_class_names() {
1153        assert_eq!(GridColumnSpan::Auto.to_class_name(), "auto");
1154        assert_eq!(GridColumnSpan::One.to_class_name(), "1");
1155        assert_eq!(GridColumnSpan::Two.to_class_name(), "2");
1156        assert_eq!(GridColumnSpan::Three.to_class_name(), "3");
1157        assert_eq!(GridColumnSpan::Four.to_class_name(), "4");
1158        assert_eq!(GridColumnSpan::Five.to_class_name(), "5");
1159        assert_eq!(GridColumnSpan::Six.to_class_name(), "6");
1160        assert_eq!(GridColumnSpan::Seven.to_class_name(), "7");
1161        assert_eq!(GridColumnSpan::Eight.to_class_name(), "8");
1162        assert_eq!(GridColumnSpan::Nine.to_class_name(), "9");
1163        assert_eq!(GridColumnSpan::Ten.to_class_name(), "10");
1164        assert_eq!(GridColumnSpan::Eleven.to_class_name(), "11");
1165        assert_eq!(GridColumnSpan::Twelve.to_class_name(), "12");
1166        assert_eq!(GridColumnSpan::Full.to_class_name(), "full");
1167    }
1168
1169    #[test]
1170    fn test_grid_column_span_css_values() {
1171        assert_eq!(GridColumnSpan::Auto.to_css_value(), "auto");
1172        assert_eq!(GridColumnSpan::One.to_css_value(), "span 1 / span 1");
1173        assert_eq!(GridColumnSpan::Two.to_css_value(), "span 2 / span 2");
1174        assert_eq!(GridColumnSpan::Three.to_css_value(), "span 3 / span 3");
1175        assert_eq!(GridColumnSpan::Four.to_css_value(), "span 4 / span 4");
1176        assert_eq!(GridColumnSpan::Five.to_css_value(), "span 5 / span 5");
1177        assert_eq!(GridColumnSpan::Six.to_css_value(), "span 6 / span 6");
1178        assert_eq!(GridColumnSpan::Seven.to_css_value(), "span 7 / span 7");
1179        assert_eq!(GridColumnSpan::Eight.to_css_value(), "span 8 / span 8");
1180        assert_eq!(GridColumnSpan::Nine.to_css_value(), "span 9 / span 9");
1181        assert_eq!(GridColumnSpan::Ten.to_css_value(), "span 10 / span 10");
1182        assert_eq!(GridColumnSpan::Eleven.to_css_value(), "span 11 / span 11");
1183        assert_eq!(GridColumnSpan::Twelve.to_css_value(), "span 12 / span 12");
1184        assert_eq!(GridColumnSpan::Full.to_css_value(), "1 / -1");
1185    }
1186
1187    #[test]
1188    fn test_grid_row_span_class_names() {
1189        assert_eq!(GridRowSpan::Auto.to_class_name(), "auto");
1190        assert_eq!(GridRowSpan::One.to_class_name(), "1");
1191        assert_eq!(GridRowSpan::Two.to_class_name(), "2");
1192        assert_eq!(GridRowSpan::Three.to_class_name(), "3");
1193        assert_eq!(GridRowSpan::Four.to_class_name(), "4");
1194        assert_eq!(GridRowSpan::Five.to_class_name(), "5");
1195        assert_eq!(GridRowSpan::Six.to_class_name(), "6");
1196        assert_eq!(GridRowSpan::Full.to_class_name(), "full");
1197    }
1198
1199    #[test]
1200    fn test_grid_row_span_css_values() {
1201        assert_eq!(GridRowSpan::Auto.to_css_value(), "auto");
1202        assert_eq!(GridRowSpan::One.to_css_value(), "span 1 / span 1");
1203        assert_eq!(GridRowSpan::Two.to_css_value(), "span 2 / span 2");
1204        assert_eq!(GridRowSpan::Three.to_css_value(), "span 3 / span 3");
1205        assert_eq!(GridRowSpan::Four.to_css_value(), "span 4 / span 4");
1206        assert_eq!(GridRowSpan::Five.to_css_value(), "span 5 / span 5");
1207        assert_eq!(GridRowSpan::Six.to_css_value(), "span 6 / span 6");
1208        assert_eq!(GridRowSpan::Full.to_css_value(), "1 / -1");
1209    }
1210
1211    #[test]
1212    fn test_grid_column_start_class_names() {
1213        assert_eq!(GridColumnStart::Auto.to_class_name(), "auto");
1214        assert_eq!(GridColumnStart::One.to_class_name(), "1");
1215        assert_eq!(GridColumnStart::Two.to_class_name(), "2");
1216        assert_eq!(GridColumnStart::Three.to_class_name(), "3");
1217        assert_eq!(GridColumnStart::Four.to_class_name(), "4");
1218        assert_eq!(GridColumnStart::Five.to_class_name(), "5");
1219        assert_eq!(GridColumnStart::Six.to_class_name(), "6");
1220        assert_eq!(GridColumnStart::Seven.to_class_name(), "7");
1221        assert_eq!(GridColumnStart::Eight.to_class_name(), "8");
1222        assert_eq!(GridColumnStart::Nine.to_class_name(), "9");
1223        assert_eq!(GridColumnStart::Ten.to_class_name(), "10");
1224        assert_eq!(GridColumnStart::Eleven.to_class_name(), "11");
1225        assert_eq!(GridColumnStart::Twelve.to_class_name(), "12");
1226        assert_eq!(GridColumnStart::Thirteen.to_class_name(), "13");
1227    }
1228
1229    #[test]
1230    fn test_grid_column_start_css_values() {
1231        assert_eq!(GridColumnStart::Auto.to_css_value(), "auto");
1232        assert_eq!(GridColumnStart::One.to_css_value(), "1");
1233        assert_eq!(GridColumnStart::Two.to_css_value(), "2");
1234        assert_eq!(GridColumnStart::Three.to_css_value(), "3");
1235        assert_eq!(GridColumnStart::Four.to_css_value(), "4");
1236        assert_eq!(GridColumnStart::Five.to_css_value(), "5");
1237        assert_eq!(GridColumnStart::Six.to_css_value(), "6");
1238        assert_eq!(GridColumnStart::Seven.to_css_value(), "7");
1239        assert_eq!(GridColumnStart::Eight.to_css_value(), "8");
1240        assert_eq!(GridColumnStart::Nine.to_css_value(), "9");
1241        assert_eq!(GridColumnStart::Ten.to_css_value(), "10");
1242        assert_eq!(GridColumnStart::Eleven.to_css_value(), "11");
1243        assert_eq!(GridColumnStart::Twelve.to_css_value(), "12");
1244        assert_eq!(GridColumnStart::Thirteen.to_css_value(), "13");
1245    }
1246
1247    #[test]
1248    fn test_grid_row_start_class_names() {
1249        assert_eq!(GridRowStart::Auto.to_class_name(), "auto");
1250        assert_eq!(GridRowStart::One.to_class_name(), "1");
1251        assert_eq!(GridRowStart::Two.to_class_name(), "2");
1252        assert_eq!(GridRowStart::Three.to_class_name(), "3");
1253        assert_eq!(GridRowStart::Four.to_class_name(), "4");
1254        assert_eq!(GridRowStart::Five.to_class_name(), "5");
1255        assert_eq!(GridRowStart::Six.to_class_name(), "6");
1256        assert_eq!(GridRowStart::Seven.to_class_name(), "7");
1257    }
1258
1259    #[test]
1260    fn test_grid_row_start_css_values() {
1261        assert_eq!(GridRowStart::Auto.to_css_value(), "auto");
1262        assert_eq!(GridRowStart::One.to_css_value(), "1");
1263        assert_eq!(GridRowStart::Two.to_css_value(), "2");
1264        assert_eq!(GridRowStart::Three.to_css_value(), "3");
1265        assert_eq!(GridRowStart::Four.to_css_value(), "4");
1266        assert_eq!(GridRowStart::Five.to_css_value(), "5");
1267        assert_eq!(GridRowStart::Six.to_css_value(), "6");
1268        assert_eq!(GridRowStart::Seven.to_css_value(), "7");
1269    }
1270
1271    #[test]
1272    fn test_grid_column_end_class_names() {
1273        assert_eq!(GridColumnEnd::Auto.to_class_name(), "auto");
1274        assert_eq!(GridColumnEnd::One.to_class_name(), "1");
1275        assert_eq!(GridColumnEnd::Two.to_class_name(), "2");
1276        assert_eq!(GridColumnEnd::Three.to_class_name(), "3");
1277        assert_eq!(GridColumnEnd::Four.to_class_name(), "4");
1278        assert_eq!(GridColumnEnd::Five.to_class_name(), "5");
1279        assert_eq!(GridColumnEnd::Six.to_class_name(), "6");
1280        assert_eq!(GridColumnEnd::Seven.to_class_name(), "7");
1281        assert_eq!(GridColumnEnd::Eight.to_class_name(), "8");
1282        assert_eq!(GridColumnEnd::Nine.to_class_name(), "9");
1283        assert_eq!(GridColumnEnd::Ten.to_class_name(), "10");
1284        assert_eq!(GridColumnEnd::Eleven.to_class_name(), "11");
1285        assert_eq!(GridColumnEnd::Twelve.to_class_name(), "12");
1286        assert_eq!(GridColumnEnd::Thirteen.to_class_name(), "13");
1287    }
1288
1289    #[test]
1290    fn test_grid_column_end_css_values() {
1291        assert_eq!(GridColumnEnd::Auto.to_css_value(), "auto");
1292        assert_eq!(GridColumnEnd::One.to_css_value(), "1");
1293        assert_eq!(GridColumnEnd::Two.to_css_value(), "2");
1294        assert_eq!(GridColumnEnd::Three.to_css_value(), "3");
1295        assert_eq!(GridColumnEnd::Four.to_css_value(), "4");
1296        assert_eq!(GridColumnEnd::Five.to_css_value(), "5");
1297        assert_eq!(GridColumnEnd::Six.to_css_value(), "6");
1298        assert_eq!(GridColumnEnd::Seven.to_css_value(), "7");
1299        assert_eq!(GridColumnEnd::Eight.to_css_value(), "8");
1300        assert_eq!(GridColumnEnd::Nine.to_css_value(), "9");
1301        assert_eq!(GridColumnEnd::Ten.to_css_value(), "10");
1302        assert_eq!(GridColumnEnd::Eleven.to_css_value(), "11");
1303        assert_eq!(GridColumnEnd::Twelve.to_css_value(), "12");
1304        assert_eq!(GridColumnEnd::Thirteen.to_css_value(), "13");
1305    }
1306
1307    #[test]
1308    fn test_grid_row_end_class_names() {
1309        assert_eq!(GridRowEnd::Auto.to_class_name(), "auto");
1310        assert_eq!(GridRowEnd::One.to_class_name(), "1");
1311        assert_eq!(GridRowEnd::Two.to_class_name(), "2");
1312        assert_eq!(GridRowEnd::Three.to_class_name(), "3");
1313        assert_eq!(GridRowEnd::Four.to_class_name(), "4");
1314        assert_eq!(GridRowEnd::Five.to_class_name(), "5");
1315        assert_eq!(GridRowEnd::Six.to_class_name(), "6");
1316        assert_eq!(GridRowEnd::Seven.to_class_name(), "7");
1317    }
1318
1319    #[test]
1320    fn test_grid_row_end_css_values() {
1321        assert_eq!(GridRowEnd::Auto.to_css_value(), "auto");
1322        assert_eq!(GridRowEnd::One.to_css_value(), "1");
1323        assert_eq!(GridRowEnd::Two.to_css_value(), "2");
1324        assert_eq!(GridRowEnd::Three.to_css_value(), "3");
1325        assert_eq!(GridRowEnd::Four.to_css_value(), "4");
1326        assert_eq!(GridRowEnd::Five.to_css_value(), "5");
1327        assert_eq!(GridRowEnd::Six.to_css_value(), "6");
1328        assert_eq!(GridRowEnd::Seven.to_css_value(), "7");
1329    }
1330
1331    #[test]
1332    fn test_grid_auto_flow_class_names() {
1333        assert_eq!(GridAutoFlow::Row.to_class_name(), "row");
1334        assert_eq!(GridAutoFlow::Column.to_class_name(), "col");
1335        assert_eq!(GridAutoFlow::Dense.to_class_name(), "dense");
1336        assert_eq!(GridAutoFlow::DenseColumn.to_class_name(), "col-dense");
1337    }
1338
1339    #[test]
1340    fn test_grid_auto_flow_css_values() {
1341        assert_eq!(GridAutoFlow::Row.to_css_value(), "row");
1342        assert_eq!(GridAutoFlow::Column.to_css_value(), "column");
1343        assert_eq!(GridAutoFlow::Dense.to_css_value(), "row dense");
1344        assert_eq!(GridAutoFlow::DenseColumn.to_css_value(), "column dense");
1345    }
1346
1347    #[test]
1348    fn test_grid_auto_columns_class_names() {
1349        assert_eq!(GridAutoColumns::Auto.to_class_name(), "auto");
1350        assert_eq!(GridAutoColumns::Min.to_class_name(), "min");
1351        assert_eq!(GridAutoColumns::Max.to_class_name(), "max");
1352        assert_eq!(GridAutoColumns::Fr.to_class_name(), "fr");
1353    }
1354
1355    #[test]
1356    fn test_grid_auto_columns_css_values() {
1357        assert_eq!(GridAutoColumns::Auto.to_css_value(), "auto");
1358        assert_eq!(GridAutoColumns::Min.to_css_value(), "min-content");
1359        assert_eq!(GridAutoColumns::Max.to_css_value(), "max-content");
1360        assert_eq!(GridAutoColumns::Fr.to_css_value(), "minmax(0, 1fr)");
1361    }
1362
1363    #[test]
1364    fn test_grid_auto_rows_class_names() {
1365        assert_eq!(GridAutoRows::Auto.to_class_name(), "auto");
1366        assert_eq!(GridAutoRows::Min.to_class_name(), "min");
1367        assert_eq!(GridAutoRows::Max.to_class_name(), "max");
1368        assert_eq!(GridAutoRows::Fr.to_class_name(), "fr");
1369    }
1370
1371    #[test]
1372    fn test_grid_auto_rows_css_values() {
1373        assert_eq!(GridAutoRows::Auto.to_css_value(), "auto");
1374        assert_eq!(GridAutoRows::Min.to_css_value(), "min-content");
1375        assert_eq!(GridAutoRows::Max.to_css_value(), "max-content");
1376        assert_eq!(GridAutoRows::Fr.to_css_value(), "minmax(0, 1fr)");
1377    }
1378
1379    #[test]
1380    fn test_grid_serialization() {
1381        // Test GridTemplateColumns serialization
1382        let columns = GridTemplateColumns::Three;
1383        let serialized = serde_json::to_string(&columns).unwrap();
1384        let deserialized: GridTemplateColumns = serde_json::from_str(&serialized).unwrap();
1385        assert_eq!(columns, deserialized);
1386
1387        // Test GridColumnSpan serialization
1388        let span = GridColumnSpan::Full;
1389        let serialized = serde_json::to_string(&span).unwrap();
1390        let deserialized: GridColumnSpan = serde_json::from_str(&serialized).unwrap();
1391        assert_eq!(span, deserialized);
1392
1393        // Test GridAutoFlow serialization
1394        let flow = GridAutoFlow::Dense;
1395        let serialized = serde_json::to_string(&flow).unwrap();
1396        let deserialized: GridAutoFlow = serde_json::from_str(&serialized).unwrap();
1397        assert_eq!(flow, deserialized);
1398    }
1399
1400    #[test]
1401    fn test_grid_equality_and_hash() {
1402        // Test GridTemplateColumns equality
1403        assert_eq!(GridTemplateColumns::Three, GridTemplateColumns::Three);
1404        assert_ne!(GridTemplateColumns::Three, GridTemplateColumns::Four);
1405
1406        // Test GridColumnSpan equality
1407        assert_eq!(GridColumnSpan::Full, GridColumnSpan::Full);
1408        assert_ne!(GridColumnSpan::Full, GridColumnSpan::Auto);
1409
1410        // Test GridAutoFlow equality
1411        assert_eq!(GridAutoFlow::Row, GridAutoFlow::Row);
1412        assert_ne!(GridAutoFlow::Row, GridAutoFlow::Column);
1413
1414        // Test hash consistency
1415        use std::collections::HashMap;
1416        let mut map = HashMap::new();
1417        map.insert(GridTemplateColumns::Three, "three");
1418        map.insert(GridTemplateColumns::Four, "four");
1419        assert_eq!(map.get(&GridTemplateColumns::Three), Some(&"three"));
1420        assert_eq!(map.get(&GridTemplateColumns::Four), Some(&"four"));
1421    }
1422
1423    #[test]
1424    fn test_comprehensive_grid_utilities() {
1425        let classes = ClassBuilder::new()
1426            .grid_template_columns(GridTemplateColumns::Three)
1427            .grid_template_rows(GridTemplateRows::Two)
1428            .grid_column_span(GridColumnSpan::Two)
1429            .grid_row_span(GridRowSpan::One)
1430            .grid_column_start(GridColumnStart::One)
1431            .grid_row_start(GridRowStart::One)
1432            .grid_column_end(GridColumnEnd::Three)
1433            .grid_row_end(GridRowEnd::Two)
1434            .grid_auto_flow(GridAutoFlow::Row)
1435            .grid_auto_columns(GridAutoColumns::Auto)
1436            .grid_auto_rows(GridAutoRows::Auto)
1437            .build();
1438
1439        let css_classes = classes.to_css_classes();
1440        assert!(css_classes.contains("grid-cols-3"));
1441        assert!(css_classes.contains("grid-rows-2"));
1442        assert!(css_classes.contains("col-span-2"));
1443        assert!(css_classes.contains("row-span-1"));
1444        assert!(css_classes.contains("col-start-1"));
1445        assert!(css_classes.contains("row-start-1"));
1446        assert!(css_classes.contains("col-end-3"));
1447        assert!(css_classes.contains("row-end-2"));
1448        assert!(css_classes.contains("grid-flow-row"));
1449        assert!(css_classes.contains("auto-cols-auto"));
1450        assert!(css_classes.contains("auto-rows-auto"));
1451    }
1452}