@@ -52,27 +52,69 @@ $enable-rfs: true !default;
52
52
// Cache $rfs-base-value unit
53
53
$rfs-base-value-unit : unit ($rfs-base-value );
54
54
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
+
55
97
// Remove px-unit from $rfs-base-value for calculations
56
98
@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 );
58
100
}
59
101
@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 ) );
61
103
}
62
104
63
105
// Cache $rfs-breakpoint unit to prevent multiple calls
64
106
$rfs-breakpoint-unit-cache : unit ($rfs-breakpoint );
65
107
66
108
// Remove unit from $rfs-breakpoint for calculations
67
109
@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 );
69
111
}
70
112
@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 ) );
72
114
}
73
115
74
116
// 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 } );
76
118
$rfs-mq-property-width : if ($rfs-mode == max-media-query , max-width , min-width );
77
119
$rfs-mq-property-height : if ($rfs-mode == max-media-query , max-height , min-height );
78
120
@@ -164,11 +206,11 @@ $rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height
164
206
165
207
@if $unit == px {
166
208
// 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 );
168
210
}
169
211
@else if $unit == rem {
170
212
// 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 );
172
214
}
173
215
@else {
174
216
// 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
205
247
206
248
@else {
207
249
// 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 ) ));
209
251
210
252
// Only add the media query if the value is greater than the minimum value
211
253
@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 );
213
255
}
214
256
@else {
215
257
// 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 ) ;
217
259
218
260
// Calculate difference between $value and the minimum value
219
261
$value-diff : abs ($value ) - $value-min ;
220
262
221
263
// 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 );
223
265
224
266
// Use negative value if needed
225
267
$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
228
270
$variable-unit : if ($rfs-two-dimensional , vmin , vw );
229
271
230
272
// 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 } ;
232
274
233
275
// Return the calculated value
234
276
$val : $val + ' calc(' + $min-width + if ($value < 0 , ' - ' , ' + ' ) + $variable-width + ' )' ;
0 commit comments