diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/_functions.scss | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/_functions.scss b/src/_functions.scss index 7d4a695..8a1a613 100644 --- a/src/_functions.scss +++ b/src/_functions.scss | |||
@@ -16,6 +16,26 @@ | |||
16 | @use 'sass:meta'; | 16 | @use 'sass:meta'; |
17 | @use './vars'; | 17 | @use './vars'; |
18 | 18 | ||
19 | $numbers: ('0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9); | ||
20 | |||
21 | $units: ( | ||
22 | 'px': 1px, | ||
23 | 'cm': 1cm, | ||
24 | 'mm': 1mm, | ||
25 | '%': 1%, | ||
26 | 'ch': 1ch, | ||
27 | 'pc': 1pc, | ||
28 | 'in': 1in, | ||
29 | 'em': 1em, | ||
30 | 'rem': 1rem, | ||
31 | 'pt': 1pt, | ||
32 | 'ex': 1ex, | ||
33 | 'vw': 1vw, | ||
34 | 'vh': 1vh, | ||
35 | 'vmin': 1vmin, | ||
36 | 'vmax': 1vmax | ||
37 | ); | ||
38 | |||
19 | /// | 39 | /// |
20 | /// Replace a substring with a new string. | 40 | /// Replace a substring with a new string. |
21 | /// | 41 | /// |
@@ -290,6 +310,61 @@ | |||
290 | @return math.div($size, $base) * 1rem; | 310 | @return math.div($size, $base) * 1rem; |
291 | } | 311 | } |
292 | 312 | ||
313 | /// | ||
314 | /// Casts a string into a number | ||
315 | /// | ||
316 | /// @param {string|number} $value | ||
317 | /// | ||
318 | /// @return {number} | ||
319 | /// | ||
320 | @function to-number($value) { | ||
321 | @if meta.type-of($value) == 'number' { | ||
322 | @return $value; | ||
323 | } | ||
324 | @if meta.type-of($value) != 'string' { | ||
325 | @error 'Value for `to-number` should be a number or a string.'; | ||
326 | } | ||
327 | |||
328 | $result: 0; | ||
329 | $digits: 0; | ||
330 | $minus: string.slice($value, 1, 1) == '-'; | ||
331 | |||
332 | @for $i from if($minus, 2, 1) through string.length($value) { | ||
333 | $character: string.slice($value, $i, $i); | ||
334 | |||
335 | @if not list.index(map.keys($numbers), $character) or $character == '.' { | ||
336 | @return to-length(if($minus, -$result, $result), string.slice($value, $i)) | ||
337 | } | ||
338 | |||
339 | @if $character == '.' { | ||
340 | $digits: 1; | ||
341 | } @else if $digits == 0 { | ||
342 | $result: $result * 10 + map.get($numbers, $character); | ||
343 | } @else { | ||
344 | $digits: $digits * 10; | ||
345 | $result: $result + math.div(map.get($numbers, $character), $digits); | ||
346 | } | ||
347 | } | ||
348 | |||
349 | @return if($minus, -$result, $result); | ||
350 | } | ||
351 | |||
352 | /// | ||
353 | /// Add $unit to $value | ||
354 | /// | ||
355 | /// @param {number} $value - Value to add unit to | ||
356 | /// @param {string} $unit - String representation of the unit | ||
357 | /// | ||
358 | /// @return {number} $value expressed in $unit | ||
359 | /// | ||
360 | @function to-length($value, $unit) { | ||
361 | @if not list.index(map.keys($units), $unit) { | ||
362 | @error 'Invalid unit `#{$unit}`.'; | ||
363 | } | ||
364 | |||
365 | @return $value * map.get($units, $unit); | ||
366 | } | ||
367 | |||
293 | /// | 368 | /// |
294 | /// A mixin with the sole purpose of letting you use temporary variables without polluting the global namespace. | 369 | /// A mixin with the sole purpose of letting you use temporary variables without polluting the global namespace. |
295 | /// | 370 | /// |