From 8dec3d0a3430baa583c1c7050648ee37132acddc Mon Sep 17 00:00:00 2001 From: Mark Otto Date: Sun, 25 Jul 2021 10:19:02 -0700 Subject: [PATCH] Replace Sass division with multiplication and custom divide() function Fixes #34353. Co-Authored-By: Slaven Tomac --- scss/_card.scss | 10 +++--- scss/_carousel.scss | 4 +-- scss/_custom-forms.scss | 12 +++---- scss/_forms.scss | 8 ++--- scss/_functions.scss | 44 ++++++++++++++++++++++- scss/_images.scss | 2 +- scss/_jumbotron.scss | 2 +- scss/_modal.scss | 4 +-- scss/_popover.scss | 18 +++++----- scss/_tooltip.scss | 8 ++--- scss/_variables.scss | 14 ++++---- scss/mixins/_forms.scss | 2 +- scss/mixins/_grid-framework.scss | 4 +-- scss/mixins/_grid.scss | 22 ++++++------ scss/utilities/_embed.scss | 2 +- site/assets/scss/_component-examples.scss | 6 ++-- site/assets/scss/_masthead.scss | 2 +- site/assets/scss/_skippy.scss | 4 +-- 18 files changed, 105 insertions(+), 63 deletions(-) diff --git a/scss/_card.scss b/scss/_card.scss index faaa75ef7f..a974163f82 100644 --- a/scss/_card.scss +++ b/scss/_card.scss @@ -58,7 +58,7 @@ } .card-subtitle { - margin-top: -$card-spacer-y / 2; + margin-top: -$card-spacer-y * .5; margin-bottom: 0; } @@ -109,15 +109,15 @@ // .card-header-tabs { - margin-right: -$card-spacer-x / 2; + margin-right: -$card-spacer-x * .5; margin-bottom: -$card-spacer-y; - margin-left: -$card-spacer-x / 2; + margin-left: -$card-spacer-x * .5; border-bottom: 0; } .card-header-pills { - margin-right: -$card-spacer-x / 2; - margin-left: -$card-spacer-x / 2; + margin-right: -$card-spacer-x * .5; + margin-left: -$card-spacer-x * .5; } // Card image diff --git a/scss/_carousel.scss b/scss/_carousel.scss index 28f1e17d14..25aaf5873f 100644 --- a/scss/_carousel.scss +++ b/scss/_carousel.scss @@ -189,9 +189,9 @@ .carousel-caption { position: absolute; - right: (100% - $carousel-caption-width) / 2; + right: (100% - $carousel-caption-width) * .5; bottom: 20px; - left: (100% - $carousel-caption-width) / 2; + left: (100% - $carousel-caption-width) * .5; z-index: 10; padding-top: 20px; padding-bottom: 20px; diff --git a/scss/_custom-forms.scss b/scss/_custom-forms.scss index 06725ff364..b3db8c48fa 100644 --- a/scss/_custom-forms.scss +++ b/scss/_custom-forms.scss @@ -26,7 +26,7 @@ left: 0; z-index: -1; // Put the input behind the label so it doesn't overlay text width: $custom-control-indicator-size; - height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2; + height: ($font-size-base * $line-height-base + $custom-control-indicator-size) * .5; opacity: 0; &:checked ~ .custom-control-label::before { @@ -83,7 +83,7 @@ // Background-color and (when enabled) gradient &::before { position: absolute; - top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2; + top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5; left: -($custom-control-gutter + $custom-control-indicator-size); display: block; width: $custom-control-indicator-size; @@ -98,7 +98,7 @@ // Foreground (icon) &::after { position: absolute; - top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2; + top: ($font-size-base * $line-height-base - $custom-control-indicator-size) * .5; left: -($custom-control-gutter + $custom-control-indicator-size); display: block; width: $custom-control-indicator-size; @@ -186,7 +186,7 @@ } &::after { - top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2); + top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) * .5, $custom-control-indicator-border-width * 2); left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2); width: $custom-switch-indicator-size; height: $custom-switch-indicator-size; @@ -406,7 +406,7 @@ &::-webkit-slider-thumb { width: $custom-range-thumb-width; height: $custom-range-thumb-height; - margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific + margin-top: ($custom-range-track-height - $custom-range-thumb-height) * .5; // Webkit specific @include gradient-bg($custom-range-thumb-bg); border: $custom-range-thumb-border; @include border-radius($custom-range-thumb-border-radius); @@ -481,7 +481,7 @@ cursor: $custom-range-track-cursor; background-color: transparent; border-color: transparent; - border-width: $custom-range-thumb-height / 2; + border-width: $custom-range-thumb-height * .5; @include box-shadow($custom-range-track-box-shadow); } diff --git a/scss/_forms.scss b/scss/_forms.scss index a2494ceafd..cde466327b 100644 --- a/scss/_forms.scss +++ b/scss/_forms.scss @@ -199,13 +199,13 @@ textarea.form-control { .form-row { display: flex; flex-wrap: wrap; - margin-right: -$form-grid-gutter-width / 2; - margin-left: -$form-grid-gutter-width / 2; + margin-right: -$form-grid-gutter-width * .5; + margin-left: -$form-grid-gutter-width * .5; > .col, > [class*="col-"] { - padding-right: $form-grid-gutter-width / 2; - padding-left: $form-grid-gutter-width / 2; + padding-right: $form-grid-gutter-width * .5; + padding-left: $form-grid-gutter-width * .5; } } diff --git a/scss/_functions.scss b/scss/_functions.scss index 8abc31164e..f940fb430a 100644 --- a/scss/_functions.scss +++ b/scss/_functions.scss @@ -75,7 +75,7 @@ $g: green($color); $b: blue($color); - $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000; + $yiq: (($r * 299) + ($g * 587) + ($b * 114)) * .001; @if ($yiq >= $yiq-contrasted-threshold) { @return $dark; @@ -158,3 +158,45 @@ @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2); } + +@function divide($dividend, $divisor, $precision: 10) { + $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1); + $dividend: abs($dividend); + $divisor: abs($divisor); + @if $dividend == 0 { + @return 0; + } + @if $divisor == 0 { + @error "Cannot divide by 0"; + } + $remainder: $dividend; + $result: 0; + $factor: 10; + @while ($remainder > 0 and $precision >= 0) { + $quotient: 0; + @while ($remainder >= $divisor) { + $remainder: $remainder - $divisor; + $quotient: $quotient + 1; + } + $result: $result * 10 + $quotient; + $factor: $factor * .1; + $remainder: $remainder * 10; + $precision: $precision - 1; + @if ($precision < 0 and $remainder >= $divisor * 5) { + $result: $result + 1; + } + } + $result: $result * $factor * $sign; + $dividend-unit: unit($dividend); + $divisor-unit: unit($divisor); + $unit-map: ( + "px": 1px, + "rem": 1rem, + "em": 1em, + "%": 1% + ); + @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) { + $result: $result * map-get($unit-map, $dividend-unit); + } + @return $result; +} diff --git a/scss/_images.scss b/scss/_images.scss index b11b45a37b..3d6a1014c4 100644 --- a/scss/_images.scss +++ b/scss/_images.scss @@ -32,7 +32,7 @@ } .figure-img { - margin-bottom: $spacer / 2; + margin-bottom: $spacer * .5; line-height: 1; } diff --git a/scss/_jumbotron.scss b/scss/_jumbotron.scss index bcd7dcad99..2c617edb59 100644 --- a/scss/_jumbotron.scss +++ b/scss/_jumbotron.scss @@ -1,5 +1,5 @@ .jumbotron { - padding: $jumbotron-padding ($jumbotron-padding / 2); + padding: $jumbotron-padding ($jumbotron-padding * .5); margin-bottom: $jumbotron-padding; color: $jumbotron-color; background-color: $jumbotron-bg; diff --git a/scss/_modal.scss b/scss/_modal.scss index e43c70fbb4..4d01788d70 100644 --- a/scss/_modal.scss +++ b/scss/_modal.scss @@ -175,7 +175,7 @@ flex-wrap: wrap; align-items: center; // vertically center justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items - padding: $modal-inner-padding - $modal-footer-margin-between / 2; + padding: $modal-inner-padding - $modal-footer-margin-between * .5; border-top: $modal-footer-border-width solid $modal-footer-border-color; @include border-bottom-radius($modal-content-inner-border-radius); @@ -183,7 +183,7 @@ // This solution is far from ideal because of the universal selector usage, // but is needed to fix https://github.com/twbs/bootstrap/issues/24800 > * { - margin: $modal-footer-margin-between / 2; + margin: $modal-footer-margin-between * .5; } } diff --git a/scss/_popover.scss b/scss/_popover.scss index 0ad76af3ee..c7106a809d 100644 --- a/scss/_popover.scss +++ b/scss/_popover.scss @@ -43,13 +43,13 @@ &::before { bottom: 0; - border-width: $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: $popover-arrow-height ($popover-arrow-width * .5) 0; border-top-color: $popover-arrow-outer-color; } &::after { bottom: $popover-border-width; - border-width: $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: $popover-arrow-height ($popover-arrow-width * .5) 0; border-top-color: $popover-arrow-color; } } @@ -66,13 +66,13 @@ &::before { left: 0; - border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0; border-right-color: $popover-arrow-outer-color; } &::after { left: $popover-border-width; - border-width: ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2) 0; + border-width: ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5) 0; border-right-color: $popover-arrow-color; } } @@ -86,13 +86,13 @@ &::before { top: 0; - border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2); + border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5); border-bottom-color: $popover-arrow-outer-color; } &::after { top: $popover-border-width; - border-width: 0 ($popover-arrow-width / 2) $popover-arrow-height ($popover-arrow-width / 2); + border-width: 0 ($popover-arrow-width * .5) $popover-arrow-height ($popover-arrow-width * .5); border-bottom-color: $popover-arrow-color; } } @@ -104,7 +104,7 @@ left: 50%; display: block; width: $popover-arrow-width; - margin-left: -$popover-arrow-width / 2; + margin-left: -$popover-arrow-width * .5; content: ""; border-bottom: $popover-border-width solid $popover-header-bg; } @@ -121,13 +121,13 @@ &::before { right: 0; - border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height; + border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height; border-left-color: $popover-arrow-outer-color; } &::after { right: $popover-border-width; - border-width: ($popover-arrow-width / 2) 0 ($popover-arrow-width / 2) $popover-arrow-height; + border-width: ($popover-arrow-width * .5) 0 ($popover-arrow-width * .5) $popover-arrow-height; border-left-color: $popover-arrow-color; } } diff --git a/scss/_tooltip.scss b/scss/_tooltip.scss index 6b3aa62dd6..6771b4eb4f 100644 --- a/scss/_tooltip.scss +++ b/scss/_tooltip.scss @@ -37,7 +37,7 @@ &::before { top: 0; - border-width: $tooltip-arrow-height ($tooltip-arrow-width / 2) 0; + border-width: $tooltip-arrow-height ($tooltip-arrow-width * .5) 0; border-top-color: $tooltip-arrow-color; } } @@ -53,7 +53,7 @@ &::before { right: 0; - border-width: ($tooltip-arrow-width / 2) $tooltip-arrow-height ($tooltip-arrow-width / 2) 0; + border-width: ($tooltip-arrow-width * .5) $tooltip-arrow-height ($tooltip-arrow-width * .5) 0; border-right-color: $tooltip-arrow-color; } } @@ -67,7 +67,7 @@ &::before { bottom: 0; - border-width: 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height; + border-width: 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height; border-bottom-color: $tooltip-arrow-color; } } @@ -83,7 +83,7 @@ &::before { left: 0; - border-width: ($tooltip-arrow-width / 2) 0 ($tooltip-arrow-width / 2) $tooltip-arrow-height; + border-width: ($tooltip-arrow-width * .5) 0 ($tooltip-arrow-width * .5) $tooltip-arrow-height; border-left-color: $tooltip-arrow-color; } } diff --git a/scss/_variables.scss b/scss/_variables.scss index 705b521215..7d8fb3b3bf 100644 --- a/scss/_variables.scss +++ b/scss/_variables.scss @@ -299,7 +299,7 @@ $h4-font-size: $font-size-base * 1.5 !default; $h5-font-size: $font-size-base * 1.25 !default; $h6-font-size: $font-size-base !default; -$headings-margin-bottom: $spacer / 2 !default; +$headings-margin-bottom: $spacer * .5 !default; $headings-font-family: null !default; $headings-font-weight: 500 !default; $headings-line-height: 1.2 !default; @@ -495,7 +495,7 @@ $input-height-border: $input-border-width * 2 !default; $input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default; $input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default; -$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y / 2) !default; +$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default; $input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default; $input-height-sm: add($input-line-height-sm * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default; @@ -565,7 +565,7 @@ $custom-radio-indicator-border-radius: 50% !default; $custom-radio-indicator-icon-checked: url("data:image/svg+xml,") !default; $custom-switch-width: $custom-control-indicator-size * 1.75 !default; -$custom-switch-indicator-border-radius: $custom-control-indicator-size / 2 !default; +$custom-switch-indicator-border-radius: $custom-control-indicator-size * .5 !default; $custom-switch-indicator-size: subtract($custom-control-indicator-size, $custom-control-indicator-border-width * 4) !default; $custom-select-padding-y: $input-padding-y !default; @@ -710,12 +710,12 @@ $nav-pills-link-active-color: $component-active-color !default; $nav-pills-link-active-bg: $component-active-bg !default; $nav-divider-color: $gray-200 !default; -$nav-divider-margin-y: $spacer / 2 !default; +$nav-divider-margin-y: $spacer * .5 !default; // Navbar -$navbar-padding-y: $spacer / 2 !default; +$navbar-padding-y: $spacer * .5 !default; $navbar-padding-x: $spacer !default; $navbar-nav-link-padding-x: .5rem !default; @@ -724,7 +724,7 @@ $navbar-brand-font-size: $font-size-lg !default; // Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link $nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default; $navbar-brand-height: $navbar-brand-font-size * $line-height-base !default; -$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) / 2 !default; +$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default; $navbar-toggler-padding-y: .25rem !default; $navbar-toggler-padding-x: .75rem !default; @@ -845,7 +845,7 @@ $card-bg: $white !default; $card-img-overlay-padding: 1.25rem !default; -$card-group-margin: $grid-gutter-width / 2 !default; +$card-group-margin: $grid-gutter-width * .5 !default; $card-deck-margin: $card-group-margin !default; $card-columns-count: 3 !default; diff --git a/scss/mixins/_forms.scss b/scss/mixins/_forms.scss index 234c6b431a..b8847cc80d 100644 --- a/scss/mixins/_forms.scss +++ b/scss/mixins/_forms.scss @@ -69,7 +69,7 @@ // Align tooltip to form elements .form-row > .col > &, .form-row > [class*="col-"] > & { - left: $form-grid-gutter-width / 2; + left: $form-grid-gutter-width * .5; } } diff --git a/scss/mixins/_grid-framework.scss b/scss/mixins/_grid-framework.scss index 6fc8e85612..ef32917530 100644 --- a/scss/mixins/_grid-framework.scss +++ b/scss/mixins/_grid-framework.scss @@ -8,8 +8,8 @@ %grid-column { position: relative; width: 100%; - padding-right: $gutter / 2; - padding-left: $gutter / 2; + padding-right: $gutter * .5; + padding-left: $gutter * .5; } @each $breakpoint in map-keys($breakpoints) { diff --git a/scss/mixins/_grid.scss b/scss/mixins/_grid.scss index 19babc09fb..0eb09910d1 100644 --- a/scss/mixins/_grid.scss +++ b/scss/mixins/_grid.scss @@ -4,8 +4,8 @@ @mixin make-container($gutter: $grid-gutter-width) { width: 100%; - padding-right: $gutter / 2; - padding-left: $gutter / 2; + padding-right: $gutter * .5; + padding-left: $gutter * .5; margin-right: auto; margin-left: auto; } @@ -13,8 +13,8 @@ @mixin make-row($gutter: $grid-gutter-width) { display: flex; flex-wrap: wrap; - margin-right: -$gutter / 2; - margin-left: -$gutter / 2; + margin-right: -$gutter * .5; + margin-left: -$gutter * .5; } // For each breakpoint, define the maximum width of the container in a media query @@ -33,16 +33,16 @@ // always setting `width: 100%;`. This works because we use `flex` values // later on to override this initial width. width: 100%; - padding-right: $gutter / 2; - padding-left: $gutter / 2; + padding-right: $gutter * .5; + padding-left: $gutter * .5; } @mixin make-col($size, $columns: $grid-columns) { - flex: 0 0 percentage($size / $columns); + flex: 0 0 percentage(divide($size, $columns)); // Add a `max-width` to ensure content within each column does not blow out // the width of the column. Applies to IE10+ and Firefox. Chrome and Safari // do not appear to require this. - max-width: percentage($size / $columns); + max-width: percentage(divide($size, $columns)); } @mixin make-col-auto() { @@ -52,7 +52,7 @@ } @mixin make-col-offset($size, $columns: $grid-columns) { - $num: $size / $columns; + $num: divide($size, $columns); margin-left: if($num == 0, 0, percentage($num)); } @@ -63,7 +63,7 @@ // style grid. @mixin row-cols($count) { > * { - flex: 0 0 100% / $count; - max-width: 100% / $count; + flex: 0 0 divide(100%, $count); + max-width: divide(100%, $count); } } diff --git a/scss/utilities/_embed.scss b/scss/utilities/_embed.scss index 4497ac0400..e37465e408 100644 --- a/scss/utilities/_embed.scss +++ b/scss/utilities/_embed.scss @@ -33,7 +33,7 @@ .embed-responsive-#{$embed-responsive-aspect-ratio-x}by#{$embed-responsive-aspect-ratio-y} { &::before { - padding-top: percentage($embed-responsive-aspect-ratio-y / $embed-responsive-aspect-ratio-x); + padding-top: percentage(divide($embed-responsive-aspect-ratio-y, $embed-responsive-aspect-ratio-x)); } } } diff --git a/site/assets/scss/_component-examples.scss b/site/assets/scss/_component-examples.scss index 89c52208f4..68856059b0 100644 --- a/site/assets/scss/_component-examples.scss +++ b/site/assets/scss/_component-examples.scss @@ -88,7 +88,7 @@ .bd-example { position: relative; padding: 1rem; - margin: 1rem (-$grid-gutter-width / 2) 0; + margin: 1rem (-$grid-gutter-width * .5) 0; border: solid $gray-100; border-width: .2rem 0 0; @include clearfix(); @@ -350,8 +350,8 @@ } .bd-content .highlight { - margin-right: (-$grid-gutter-width / 2); - margin-left: (-$grid-gutter-width / 2); + margin-right: (-$grid-gutter-width * .5); + margin-left: (-$grid-gutter-width * .5); @include media-breakpoint-up(sm) { margin-right: 0; diff --git a/site/assets/scss/_masthead.scss b/site/assets/scss/_masthead.scss index 6a13562e33..c16aa0138c 100644 --- a/site/assets/scss/_masthead.scss +++ b/site/assets/scss/_masthead.scss @@ -2,7 +2,7 @@ .bd-masthead { position: relative; - padding: 3rem ($grid-gutter-width / 2); + padding: 3rem ($grid-gutter-width * .5); background: linear-gradient(to right bottom, lighten($bd-purple-light, 16%) 50%, #fff 50%); h1 { diff --git a/site/assets/scss/_skippy.scss b/site/assets/scss/_skippy.scss index 894db70db4..125f44c841 100644 --- a/site/assets/scss/_skippy.scss +++ b/site/assets/scss/_skippy.scss @@ -11,8 +11,8 @@ position: static !important; width: auto !important; height: auto !important; - padding: $spacer / 2 !important; - margin: $spacer / 4 !important; + padding: $spacer * .5 !important; + margin: $spacer * .25 !important; overflow: visible !important; clip: auto !important; white-space: normal !important; -- 2.47.2