@@ -14,109 +14,170 @@ export const transformRule: UtilityRule = (parsed) => {
1414
1515export const scaleRule : UtilityRule = ( parsed ) => {
1616 if ( parsed . utility === 'scale' ) {
17- const scale = parsed . value ? Number ( parsed . value ) / 100 : 1
17+ if ( ! parsed . value ) return { transform : 'scale(1)' }
18+ // If arbitrary, use value as-is
19+ if ( parsed . arbitrary ) {
20+ return { transform : `scale(${ parsed . value } )` }
21+ }
22+ const scale = Number ( parsed . value ) / 100
1823 return { transform : `scale(${ scale } )` }
1924 }
2025 if ( parsed . utility === 'scale-x' ) {
21- const scale = parsed . value ? Number ( parsed . value ) / 100 : 1
26+ if ( ! parsed . value ) return { transform : 'scaleX(1)' }
27+ if ( parsed . arbitrary ) {
28+ return { transform : `scaleX(${ parsed . value } )` }
29+ }
30+ const scale = Number ( parsed . value ) / 100
2231 return { transform : `scaleX(${ scale } )` }
2332 }
2433 if ( parsed . utility === 'scale-y' ) {
25- const scale = parsed . value ? Number ( parsed . value ) / 100 : 1
34+ if ( ! parsed . value ) return { transform : 'scaleY(1)' }
35+ if ( parsed . arbitrary ) {
36+ return { transform : `scaleY(${ parsed . value } )` }
37+ }
38+ const scale = Number ( parsed . value ) / 100
2639 return { transform : `scaleY(${ scale } )` }
2740 }
2841 if ( parsed . utility === 'scale-z' ) {
29- const scale = parsed . value ? Number ( parsed . value ) / 100 : 1
42+ if ( ! parsed . value ) return { transform : 'scaleZ(1)' }
43+ if ( parsed . arbitrary ) {
44+ return { transform : `scaleZ(${ parsed . value } )` }
45+ }
46+ const scale = Number ( parsed . value ) / 100
3047 return { transform : `scaleZ(${ scale } )` }
3148 }
3249}
3350
3451export const rotateRule : UtilityRule = ( parsed ) => {
3552 if ( parsed . utility === 'rotate' && parsed . value ) {
36- return { transform : `rotate(${ parsed . value } deg)` }
53+ // If arbitrary or already has unit, use as-is, otherwise add deg
54+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
55+ ? parsed . value
56+ : `${ parsed . value } deg`
57+ return { transform : `rotate(${ value } )` }
3758 }
3859 if ( parsed . utility === 'rotate-x' && parsed . value ) {
39- return { transform : `rotateX(${ parsed . value } deg)` }
60+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
61+ ? parsed . value
62+ : `${ parsed . value } deg`
63+ return { transform : `rotateX(${ value } )` }
4064 }
4165 if ( parsed . utility === 'rotate-y' && parsed . value ) {
42- return { transform : `rotateY(${ parsed . value } deg)` }
66+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
67+ ? parsed . value
68+ : `${ parsed . value } deg`
69+ return { transform : `rotateY(${ value } )` }
4370 }
4471 if ( parsed . utility === 'rotate-z' && parsed . value ) {
45- return { transform : `rotateZ(${ parsed . value } deg)` }
72+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
73+ ? parsed . value
74+ : `${ parsed . value } deg`
75+ return { transform : `rotateZ(${ value } )` }
4676 }
4777}
4878
4979export const translateRule : UtilityRule = ( parsed , config ) => {
80+ const getTranslateValue = ( val : string ) : string => {
81+ // Handle fractions: 1/2 -> 50%, 1/3 -> 33.333333%, etc.
82+ if ( val . includes ( '/' ) ) {
83+ const [ num , denom ] = val . split ( '/' )
84+ const percentage = ( Number ( num ) / Number ( denom ) ) * 100
85+ return `${ percentage } %`
86+ }
87+ // Handle special keywords
88+ if ( val === 'full' ) return '100%'
89+ if ( val === 'half' ) return '50%'
90+ // Check spacing config
91+ return config . theme . spacing [ val ] || val
92+ }
93+
5094 if ( parsed . utility === 'translate-x' && parsed . value ) {
5195 let value : string
5296 if ( parsed . value . startsWith ( '-' ) ) {
5397 const positiveValue = parsed . value . slice ( 1 )
54- const spacing = config . theme . spacing [ positiveValue ]
55- value = spacing ? `-${ spacing } ` : parsed . value
98+ value = `-${ getTranslateValue ( positiveValue ) } `
5699 }
57100 else {
58- value = config . theme . spacing [ parsed . value ] || parsed . value
101+ value = getTranslateValue ( parsed . value )
59102 }
60103 return { transform : `translateX(${ value } )` }
61104 }
62105 if ( parsed . utility === 'translate-y' && parsed . value ) {
63106 let value : string
64107 if ( parsed . value . startsWith ( '-' ) ) {
65108 const positiveValue = parsed . value . slice ( 1 )
66- const spacing = config . theme . spacing [ positiveValue ]
67- value = spacing ? `-${ spacing } ` : parsed . value
109+ value = `-${ getTranslateValue ( positiveValue ) } `
68110 }
69111 else {
70- value = config . theme . spacing [ parsed . value ] || parsed . value
112+ value = getTranslateValue ( parsed . value )
71113 }
72114 return { transform : `translateY(${ value } )` }
73115 }
74116 if ( parsed . utility === 'translate-z' && parsed . value ) {
75117 let value : string
76118 if ( parsed . value . startsWith ( '-' ) ) {
77119 const positiveValue = parsed . value . slice ( 1 )
78- const spacing = config . theme . spacing [ positiveValue ]
79- value = spacing ? `-${ spacing } ` : parsed . value
120+ value = `-${ getTranslateValue ( positiveValue ) } `
80121 }
81122 else {
82- value = config . theme . spacing [ parsed . value ] || parsed . value
123+ value = getTranslateValue ( parsed . value )
83124 }
84125 return { transform : `translateZ(${ value } )` }
85126 }
86127}
87128
88129export const skewRule : UtilityRule = ( parsed ) => {
89130 if ( parsed . utility === 'skew-x' && parsed . value ) {
90- return { transform : `skewX(${ parsed . value } deg)` }
131+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
132+ ? parsed . value
133+ : `${ parsed . value } deg`
134+ return { transform : `skewX(${ value } )` }
91135 }
92136 if ( parsed . utility === 'skew-y' && parsed . value ) {
93- return { transform : `skewY(${ parsed . value } deg)` }
137+ const value = parsed . arbitrary || parsed . value . includes ( 'deg' ) || parsed . value . includes ( 'rad' ) || parsed . value . includes ( 'turn' )
138+ ? parsed . value
139+ : `${ parsed . value } deg`
140+ return { transform : `skewY(${ value } )` }
94141 }
95142}
96143
97144export const transformOriginRule : UtilityRule = ( parsed ) => {
98- const origins : Record < string , string > = {
99- 'origin-center' : 'center' ,
100- 'origin-top' : 'top' ,
101- 'origin-top-right' : 'top right' ,
102- 'origin-right' : 'right' ,
103- 'origin-bottom-right' : 'bottom right' ,
104- 'origin-bottom' : 'bottom' ,
105- 'origin-bottom-left' : 'bottom left' ,
106- 'origin-left' : 'left' ,
107- 'origin-top-left' : 'top left' ,
145+ if ( parsed . utility === 'origin' && parsed . value ) {
146+ // Handle arbitrary values with underscores as spaces
147+ if ( parsed . arbitrary ) {
148+ return { 'transform-origin' : parsed . value . replace ( / _ / g, ' ' ) }
149+ }
150+ // Handle predefined values
151+ const origins : Record < string , string > = {
152+ 'center' : 'center' ,
153+ 'top' : 'top' ,
154+ 'top-right' : 'top right' ,
155+ 'right' : 'right' ,
156+ 'bottom-right' : 'bottom right' ,
157+ 'bottom' : 'bottom' ,
158+ 'bottom-left' : 'bottom left' ,
159+ 'left' : 'left' ,
160+ 'top-left' : 'top left' ,
161+ }
162+ return origins [ parsed . value ] ? { 'transform-origin' : origins [ parsed . value ] } : undefined
108163 }
109- return origins [ parsed . raw ] ? { 'transform-origin' : origins [ parsed . raw ] } : undefined
164+ return undefined
110165}
111166
112167export const perspectiveRule : UtilityRule = ( parsed ) => {
113168 if ( parsed . utility === 'perspective' && parsed . value ) {
169+ // If value is 'none', use as-is
170+ if ( parsed . value === 'none' ) {
171+ return { perspective : 'none' }
172+ }
173+ // If arbitrary or already has unit, use as-is
174+ if ( parsed . arbitrary || parsed . value . includes ( 'px' ) || parsed . value . includes ( 'rem' ) || parsed . value . includes ( 'em' ) ) {
175+ return { perspective : parsed . value }
176+ }
177+ // Otherwise add px
114178 return { perspective : `${ parsed . value } px` }
115179 }
116- const values : Record < string , string > = {
117- 'perspective-none' : 'none' ,
118- }
119- return values [ parsed . raw ] ? { perspective : values [ parsed . raw ] } : undefined
180+ return undefined
120181}
121182
122183export const perspectiveOriginRule : UtilityRule = ( parsed ) => {
0 commit comments