// stylelint-disable declaration-property-value-blacklist // Stylus RFS mixin // // Automated font-resizing // // See https://github.com/twbs/rfs // Configuration // Base font size $rfs-base-font-size ?= 1.25rem $rfs-font-size-unit ?= rem // Breakpoint at where font-size starts decreasing if screen width is smaller $rfs-breakpoint ?= 1200px $rfs-breakpoint-unit ?= px // Resize font-size based on screen height and width $rfs-two-dimensional ?= false // Factor of decrease $rfs-factor ?= 10 // Generate enable or disable classes. Possibilities: false, "enable" or "disable" $rfs-class ?= false // 1 rem = $rfs-rem-value px $rfs-rem-value ?= 16 // Safari iframe resize bug: https://github.com/twbs/rfs/issues/14 $rfs-safari-iframe-resize-bug-fix ?= false // Disable RFS by setting $enable-responsive-font-sizes to false $enable-responsive-font-sizes ?= true // Cache $rfs-base-font-size unit $rfs-base-font-size-unit = unit($rfs-base-font-size) // Remove px-unit from $rfs-base-font-size for calculations if $rfs-base-font-size-unit == "px" $rfs-base-font-size = unit($rfs-base-font-size, "") else if $rfs-base-font-size-unit == "rem" $rfs-base-font-size = unit($rfs-base-font-size * $rfs-rem-value, "") // Cache $rfs-breakpoint unit to prevent multiple calls $rfs-breakpoint-unit-cache = unit($rfs-breakpoint) // Remove unit from $rfs-breakpoint for calculations if $rfs-breakpoint-unit-cache == "px" $rfs-breakpoint = unit($rfs-breakpoint, "") else if $rfs-breakpoint-unit-cache == "rem" or $rfs-breakpoint-unit-cache == "em" $rfs-breakpoint = unit($rfs-breakpoint * $rfs-rem-value, "") // Responsive font-size mixin rfs($fs, $important = false) $rfs-suffix = "%s" % () if type-of($fs) == "unit" $fs-unit = unit($fs) // Add !important suffix if needed if $important $rfs-suffix = !important // If $fs is not a number (like inherit) or $fs has a unit (not px or rem, like 1.5em) or $ is 0, just print the value if type-of($fs) != "unit" or ($fs-unit != "" and $fs-unit != "px" and $fs-unit != "rem") or $fs == 0 font-size: "%s%s" % ($fs $rfs-suffix) else // Variables for storing static and fluid rescaling $rfs-static = null $rfs-fluid = null // Remove px-unit from $fs for calculations if $fs-unit == px $fs = unit($fs, "") else if $fs-unit == rem $fs = unit($fs * $rfs-rem-value, "") // Set default font-size. if $rfs-font-size-unit == rem $rfs-static = "%s%s" % (unit(($fs / $rfs-rem-value), rem) $rfs-suffix) else if $rfs-font-size-unit == px $rfs-static = "%s%s" % (unit($fs, px) $rfs-suffix) else error("`$rfs-font-size-unit` is not a valid unit for $rfs-font-size-unit. Use `px` or `rem`.") if type-of($rfs-factor) != "unit" or $rfs-factor < 1 error("`$rfs-factor` is not a valid $rfs-factor, it must be greater or equal to 1.") // Only add media query if font-size is bigger as the minimum font-size // If $rfs-factor == 1, no rescaling will take place if $fs > $rfs-base-font-size and $rfs-factor != 1 and $enable-responsive-font-sizes $min-width = null $variable-unit = null // Calculate minimum font-size for given font-size $fs-min = $rfs-base-font-size + ($fs - $rfs-base-font-size) / $rfs-factor // Calculate difference between given font-size and minimum font-size for given font-size $fs-diff = $fs - $fs-min // Base font-size formatting // No need to check if the unit is valid, because we did that before if $rfs-font-size-unit == rem $min-width = unit($fs-min / $rfs-rem-value, rem) else $min-width = unit($fs-min, px) // If two-dimensional, use smallest of screen width and height if $rfs-two-dimensional $variable-unit = vmin else $variable-unit = vw // Calculate the variable width between 0 and $rfs-breakpoint $variable-width = "%s%s" % ($fs-diff * 100 / $rfs-breakpoint $variable-unit) // Set the calculated font-size $rfs-fluid = "calc(%s + %s)%s" % ($min-width $variable-width $rfs-suffix) // Rendering if $rfs-fluid == null // Only render static font-size if no fluid font-size is available font-size: $rfs-static else $mq-value = null // RFS breakpoint formatting if $rfs-breakpoint-unit == em or $rfs-breakpoint-unit == rem $mq-value = unit($rfs-breakpoint / $rfs-rem-value, $rfs-breakpoint-unit) else if $rfs-breakpoint-unit == px $mq-value = unit($rfs-breakpoint, px) else error("`$rfs-breakpoint-unit` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.") if $rfs-class == "disable" // Adding an extra class increases specificity, // which prevents the media query to override the font size &, .disable-responsive-font-size &, &.disable-responsive-font-size font-size: $rfs-static else font-size: $rfs-static if $rfs-two-dimensional @media (max-width: $mq-value), (max-height: $mq-value) if $rfs-class == "enable" .enable-responsive-font-size &, &.enable-responsive-font-size font-size: $rfs-fluid else font-size: $rfs-fluid if $rfs-safari-iframe-resize-bug-fix // stylelint-disable-next-line length-zero-no-unit min-width: 0vw else @media (max-width: $mq-value) if $rfs-class == "enable" .enable-responsive-font-size &, &.enable-responsive-font-size font-size: $rfs-fluid else font-size: $rfs-fluid if $rfs-safari-iframe-resize-bug-fix // stylelint-disable-next-line length-zero-no-unit min-width: 0vw // The responsive-font-size mixin uses RFS to rescale font sizes responsive-font-size($fs, $important = false) rfs($fs, $important)