@@ -52,27 +52,69 @@ $enable-rfs: true !default;
5252// Cache $rfs-base-value unit
5353$rfs-base-value-unit : unit ($rfs-base-value );
5454
55+ @function divide ($dividend , $divisor , $precision : 10 ) {
56+ $sign : if ($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0 , 1 , -1 );
57+ $dividend : abs ($dividend );
58+ $divisor : abs ($divisor );
59+ @if $dividend == 0 {
60+ @return 0 ;
61+ }
62+ @if $divisor == 0 {
63+ @error " Cannot divide by 0" ;
64+ }
65+ $remainder : $dividend ;
66+ $result : 0 ;
67+ $factor : 10 ;
68+ @while ($remainder > 0 and $precision >= 0 ) {
69+ $quotient : 0 ;
70+ @while ($remainder >= $divisor ) {
71+ $remainder : $remainder - $divisor ;
72+ $quotient : $quotient + 1 ;
73+ }
74+ $result : $result * 10 + $quotient ;
75+ $factor : $factor * .1 ;
76+ $remainder : $remainder * 10 ;
77+ $precision : $precision - 1 ;
78+ @if ($precision < 0 and $remainder >= $divisor * 5 ) {
79+ $result : $result + 1 ;
80+ }
81+ }
82+ $result : $result * $factor * $sign ;
83+ $dividend-unit : unit ($dividend );
84+ $divisor-unit : unit ($divisor );
85+ $unit-map : (
86+ " px" : 1px ,
87+ " rem" : 1rem ,
88+ " em" : 1em ,
89+ " %" : 1%
90+ );
91+ @if ($dividend-unit != $divisor-unit and map-has-key ($unit-map , $dividend-unit )) {
92+ $result : $result * map-get ($unit-map , $dividend-unit );
93+ }
94+ @return $result ;
95+ }
96+
5597// Remove px-unit from $rfs-base-value for calculations
5698@if $rfs-base-value-unit == px {
57- $rfs-base-value : $rfs-base-value / ( $rfs-base-value * 0 + 1 );
99+ $rfs-base-value : divide ( $rfs-base-value , $rfs-base-value * 0 + 1 );
58100}
59101@else if $rfs-base-value-unit == rem {
60- $rfs-base-value : $rfs-base-value / ($rfs-base-value * 0 + 1 / $rfs-rem-value );
102+ $rfs-base-value : divide ( $rfs-base-value , divide ($rfs-base-value * 0 + 1 , $rfs-rem-value ) );
61103}
62104
63105// Cache $rfs-breakpoint unit to prevent multiple calls
64106$rfs-breakpoint-unit-cache : unit ($rfs-breakpoint );
65107
66108// Remove unit from $rfs-breakpoint for calculations
67109@if $rfs-breakpoint-unit-cache == px {
68- $rfs-breakpoint : $rfs-breakpoint / ( $rfs-breakpoint * 0 + 1 );
110+ $rfs-breakpoint : divide ( $rfs-breakpoint , $rfs-breakpoint * 0 + 1 );
69111}
70112@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == " em" {
71- $rfs-breakpoint : $rfs-breakpoint / ($rfs-breakpoint * 0 + 1 / $rfs-rem-value );
113+ $rfs-breakpoint : divide ( $rfs-breakpoint , divide ($rfs-breakpoint * 0 + 1 , $rfs-rem-value ) );
72114}
73115
74116// Calculate the media query value
75- $rfs-mq-value : if ($rfs-breakpoint-unit == px , #{$rfs-breakpoint } px , #{$rfs-breakpoint / $rfs-rem-value }#{$rfs-breakpoint-unit } );
117+ $rfs-mq-value : if ($rfs-breakpoint-unit == px , #{$rfs-breakpoint } px , #{divide ( $rfs-breakpoint , $rfs-rem-value ) }#{$rfs-breakpoint-unit } );
76118$rfs-mq-property-width : if ($rfs-mode == max-media-query , max-width , min-width );
77119$rfs-mq-property-height : if ($rfs-mode == max-media-query , max-height , min-height );
78120
@@ -164,11 +206,11 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
164206
165207 @if $unit == px {
166208 // Convert to rem if needed
167- $val : $val + ' ' + if ($rfs-unit == rem , #{$value / ( $value * 0 + $rfs-rem-value )} rem , $value );
209+ $val : $val + ' ' + if ($rfs-unit == rem , #{divide ( $value , $value * 0 + $rfs-rem-value )} rem , $value );
168210 }
169211 @else if $unit == rem {
170212 // Convert to px if needed
171- $val : $val + ' ' + if ($rfs-unit == px , #{$value / ( $value * 0 + 1 ) * $rfs-rem-value } px , $value );
213+ $val : $val + ' ' + if ($rfs-unit == px , #{divide ( $value , $value * 0 + 1 ) * $rfs-rem-value } px , $value );
172214 }
173215 @else {
174216 // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value
@@ -205,21 +247,21 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
205247
206248 @else {
207249 // Remove unit from $value for calculations
208- $value : $value / ( $value * 0 + if ($unit == px , 1 , 1 / $rfs-rem-value ));
250+ $value : divide ( $value , $value * 0 + if ($unit == px , 1 , divide ( 1 , $rfs-rem-value ) ));
209251
210252 // Only add the media query if the value is greater than the minimum value
211253 @if abs ($value ) <= $rfs-base-value or not $enable-rfs {
212- $val : $val + ' ' + if ($rfs-unit == rem , #{$value / $rfs-rem-value } rem , #{$value } px );
254+ $val : $val + ' ' + if ($rfs-unit == rem , #{divide ( $value , $rfs-rem-value ) } rem , #{$value } px );
213255 }
214256 @else {
215257 // Calculate the minimum value
216- $value-min : $rfs-base-value + (abs ($value ) - $rfs-base-value ) / $rfs-factor ;
258+ $value-min : $rfs-base-value + divide (abs ($value ) - $rfs-base-value , $rfs-factor ) ;
217259
218260 // Calculate difference between $value and the minimum value
219261 $value-diff : abs ($value ) - $value-min ;
220262
221263 // Base value formatting
222- $min-width : if ($rfs-unit == rem , #{$value-min / $rfs-rem-value } rem , #{$value-min } px );
264+ $min-width : if ($rfs-unit == rem , #{divide ( $value-min , $rfs-rem-value ) } rem , #{$value-min } px );
223265
224266 // Use negative value if needed
225267 $min-width : if ($value < 0 , - $min-width , $min-width );
@@ -228,7 +270,7 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
228270 $variable-unit : if ($rfs-two-dimensional , vmin , vw );
229271
230272 // Calculate the variable width between 0 and $rfs-breakpoint
231- $variable-width : #{$value-diff * 100 / $rfs-breakpoint }#{$variable-unit } ;
273+ $variable-width : #{divide ( $value-diff * 100 , $rfs-breakpoint ) }#{$variable-unit } ;
232274
233275 // Return the calculated value
234276 $val : $val + ' calc(' + $min-width + if ($value < 0 , ' - ' , ' + ' ) + $variable-width + ' )' ;
0 commit comments