2022-03-16 13:28:26 +00:00
/ * *
* Imported ionic mixins for SCSS
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* Extracted from
* https : / / github . com / ionic-team / ionic-framework / blob / master / core / src / themes / ionic . mixins . scss
* /
@mixin input-cover () {
@include position ( 0 , null , null , 0 ) ;
@include margin ( 0 ) ;
position : absolute ;
width : 100 % ;
height : 100 % ;
border : 0 ;
background : transparent ;
cursor : pointer ;
appearance : none ;
outline : none ;
& : : -moz-focus-inner {
border : 0 ;
}
}
@mixin visually-hidden () {
position : absolute ;
top : 0 ;
left : 0 ;
right : 0 ;
bottom : 0 ;
width : 100 % ;
height : 100 % ;
margin : 0 ;
padding : 0 ;
border : 0 ;
outline : 0 ;
clip : rect ( 0 0 0 0 ) ;
opacity : 0 ;
overflow : hidden ;
-webkit-appearance : none ;
-moz-appearance : none ;
}
@mixin text-inherit () {
font-family : inherit ;
font-size : inherit ;
font-style : inherit ;
font-weight : inherit ;
letter-spacing : inherit ;
text-decoration : inherit ;
text-indent : inherit ;
text-overflow : inherit ;
text-transform : inherit ;
text-align : inherit ;
white-space : inherit ;
color : inherit ;
}
@mixin button-state () {
@include position ( 0 , 0 , 0 , 0 ) ;
position : absolute ;
content : " " ;
opacity : 0 ;
}
// Font smoothing
// --------------------------------------------------
@mixin font-smoothing () {
-moz-osx-font-smoothing : grayscale ;
-webkit-font-smoothing : antialiased ;
}
// Get the key from a map based on the index
@function index-to-key ( $map , $index ) {
$keys : map-keys ( $map ) ;
@return nth ( $keys , $index ) ;
}
// Breakpoint Mixins
// ---------------------------------------------------------------------------------
// Breakpoint viewport sizes and media queries.
//
// Breakpoints are defined as a map of (name: minimum width), order from small to large:
//
// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)
//
// The map defined in the `$screen-breakpoints` global variable is used as the `$breakpoints` argument by default.
// ---------------------------------------------------------------------------------
// Minimum breakpoint width. Null for the smallest (first) breakpoint.
//
// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// 576px
@function breakpoint-min ( $name , $breakpoints : $screen-breakpoints ) {
$min : map-get ( $breakpoints , $name ) ;
@return if ( $name != index-to-key ( $breakpoints , 1 ) , $min , null ) ;
}
// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.
// Useful for making responsive utilities.
//
// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// "" (Returns a blank string)
// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// "-sm"
@function breakpoint-infix ( $name , $breakpoints : $screen-breakpoints ) {
@return if ( breakpoint-min ( $name , $breakpoints ) == null , " " , " - #{ $name } " ) ;
}
// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.
// Makes the @content apply to the given breakpoint and wider.
@mixin media-breakpoint-up ( $name , $breakpoints : $screen-breakpoints ) {
$min : breakpoint-min ( $name , $breakpoints ) ;
@if $min {
@media ( min-width : $min ) {
@content ;
}
} @else {
@content ;
}
}
// Name of the next breakpoint, or null for the last breakpoint.
//
// >> breakpoint-next(sm)
// md
// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// md
// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))
// md
@function breakpoint-next ( $name , $breakpoints : $screen-breakpoints , $breakpoint-names : map-keys ( $breakpoints )) {
$n : index ( $breakpoint-names , $name ) ;
@return if ( $n < length ( $breakpoint-names ) , nth ( $breakpoint-names , $n + 1 ) , null ) ;
}
// Maximum breakpoint width. Null for the smallest (first) breakpoint.
// The maximum value is reduced by 0.02px to work around the limitations of
// `min-` and `max-` prefixes and viewports with fractional widths.
//
// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max
// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari. // Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.
// See https://bugs.webkit.org/show_bug.cgi?id=178261 // See https://bugs.webkit.org/show_bug.cgi?id=178261
//
// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))
// 767.98px
@function breakpoint-max ( $name , $breakpoints : $screen-breakpoints ) {
$max : map-get ( $breakpoints , $name ) ;
@return if ( $max and $max > 0 , $max - .02 , null ) ;
}
// Media of at most the maximum breakpoint width. No query for the largest breakpoint.
// Makes the @content apply to the given breakpoint and narrower.
@mixin media-breakpoint-down ( $name , $breakpoints : $screen-breakpoints ) {
$max : breakpoint-max ( $name , $breakpoints ) ;
@if $max {
@media ( max-width : $max ) {
@content ;
}
} @else {
@content ;
}
}
// Text Direction - ltr / rtl
//
// CSS defaults to use the ltr css, and adds [dir=rtl] selectors
// to override ltr defaults.
// ----------------------------------------------------------
@mixin multi-dir () {
@content ;
// $root: #{&};
// @at-root [dir] {
// #{$root} {
// @content;
// }
// }
}
@mixin rtl () {
$root : #{ & } ;
2023-09-15 13:35:35 +00:00
$rootSplit : str-split ( $root , " , " ) ;
$selectors : #{ add-root-selector ( $root , " [dir=rtl] " ) } ;
$selectorsSplit : str-split ( $selectors , " , " ) ;
$hostContextSelectors : () ;
$restSelectors : () ;
$dirSelectors : () ;
// Selectors must be split into individual selectors in case the browser
// doesn't support a specific selector.
// For example, Firefox and Safari doesn't support `:host-context()`.
// If an invalid selector is used, then the entire group of selectors
// will be ignored.
// @link https://www.w3.org/TR/selectors-3/#grouping
@each $selector in $selectorsSplit {
// Group the selectors back into a single selector to optimize the output.
@if str-index ( $selector , " :host-context " ) {
$hostContextSelectors : append ( $hostContextSelectors , $selector , comma ) ;
} @else {
// Group the selectors back into a single selector to optimize the output.
$restSelectors : append ( $restSelectors , $selector , comma ) ;
}
}
// Supported by Chrome.
@if length ( $hostContextSelectors ) > 0 {
@at-root #{ $hostContextSelectors } {
@content ;
}
2022-03-16 13:28:26 +00:00
}
2023-09-15 13:35:35 +00:00
// Supported by all browsers.
@if length ( $restSelectors ) > 0 {
@at-root #{ $restSelectors } {
@content ;
}
}
// If browser can support `:dir()`, then add the `:dir()` selectors.
// @supports selector(:dir(rtl)) { // @ IMPOTANT NOTE: This has been removed because selector function is not supported in current SCSS
// Adding :dir() in case the browser doesn't support `:host-context()` and does support `:dir()`.
// `:host-context()` is added:
// - through the `add-root-selector()` function.
// - first so that it takes precedence over `:dir()`.
// For example,
// - Firefox doesn't support `:host-context()`, but does support `:dir()`.
// - Safari doesn't support `:host-context()`, but Safari 16.4+ supports `:dir()`
// @link https://webkit.org/blog/13966/webkit-features-in-safari-16-4/
@each $selector in $rootSplit {
$dirSelector : " #{ $selector } :dir(rtl) " ;
// Group the selectors back into a single selector to optimize the output.
$dirSelectors : append ( $dirSelectors , $dirSelector , comma ) ;
}
// Supported by Firefox.
@if length ( $dirSelectors ) > 0 {
@at-root #{ $dirSelectors } {
@content ;
}
}
//}
2022-03-16 13:28:26 +00:00
}
@mixin ltr () {
@content ;
}
// SVG Background Image Mixin
// @param {string} $svg
// ----------------------------------------------------------
@mixin svg-background-image ( $svg , $flip-rtl : false ) {
$url : url-encode ( $svg ) ;
$viewBox : str-split ( str-extract ( $svg , " viewBox=' " , " ' " ) , " " ) ;
@if $flip-rtl != true or $viewBox == null {
@include multi-dir () {
background-image : url( "data:image/svg+xml;charset=utf-8, #{ $url } " ) ;
}
} @else {
$transform : " transform='translate( #{ nth ( $viewBox , 3 ) } , 0) scale(-1, 1)' " ;
$flipped-url : $svg ;
$flipped-url : str-replace ( $flipped-url , " <path " , " <path #{ $transform } " ) ;
$flipped-url : str-replace ( $flipped-url , " <line " , " <line #{ $transform } " ) ;
$flipped-url : str-replace ( $flipped-url , " <polygon " , " <polygon #{ $transform } " ) ;
$flipped-url : url-encode ( $flipped-url ) ;
@include ltr () {
background-image : url( "data:image/svg+xml;charset=utf-8, #{ $url } " ) ;
}
@include rtl () {
background-image : url( "data:image/svg+xml;charset=utf-8, #{ $flipped-url } " ) ;
}
}
}
// Add property horizontal
// @param {string} $start
// @param {string} $end
// ----------------------------------------------------------
@mixin property-horizontal ( $prop , $start , $end : $start ) {
@if $start == 0 and $end == 0 {
#{ $prop } -left : $start ;
#{ $prop } -right : $end ;
} @else {
2023-09-15 13:35:35 +00:00
-webkit-#{$prop}-start : $start ;
#{ $prop } -inline-start : $start ;
-webkit-#{$prop}-end : $end ;
#{ $prop } -inline-end : $end ;
2022-03-16 13:28:26 +00:00
}
}
// Add property for all directions
// @param {string} $prop
// @param {string} $top
// @param {string} $end
// @param {string} $bottom
// @param {string} $start
// @param {boolean} $content include content or use default
// ----------------------------------------------------------
@mixin property ( $prop , $top , $end : $top , $bottom : $top , $start : $end ) {
@include property-horizontal ( $prop , $start , $end ) ;
#{ $prop } -top : $top ;
#{ $prop } -bottom : $bottom ;
}
// Add padding horizontal
// @param {string} $start
// @param {string} $end
// ----------------------------------------------------------
@mixin padding-horizontal ( $start , $end : $start ) {
@include property-horizontal ( padding , $start , $end ) ;
}
// Add padding for all directions
// @param {string} $top
// @param {string} $end
// @param {string} $bottom
// @param {string} $start
// ----------------------------------------------------------
@mixin padding ( $top , $end : $top , $bottom : $top , $start : $end ) {
@include property ( padding , $top , $end , $bottom , $start ) ;
}
// Add margin horizontal
// @param {string} $start
// @param {string} $end
// ----------------------------------------------------------
@mixin margin-horizontal ( $start , $end : $start ) {
@include property-horizontal ( margin , $start , $end ) ;
}
// Add margin for all directions
// @param {string} $top
// @param {string} $end
// @param {string} $bottom
// @param {string} $start
// ----------------------------------------------------------
@mixin margin ( $top , $end : $top , $bottom : $top , $start : $end ) {
@include property ( margin , $top , $end , $bottom , $start ) ;
}
// Add position horizontal
// @param {string} $start - amount to position start
// @param {string} $end - amount to left: 0; end
// ----------------------------------------------------------
@mixin position-horizontal ( $start : null , $end : null ) {
@if $start == $end {
@include multi-dir () {
left : $start ;
right : $end ;
}
} @else {
2023-09-15 13:35:35 +00:00
@at-root {
@supports ( inset-inline-start : 0 ) {
& {
inset-inline-start : $start ;
inset-inline-end : $end ;
}
}
2022-03-16 13:28:26 +00:00
}
2023-09-15 13:35:35 +00:00
// TODO FW-3766
@at-root {
@supports not ( inset-inline-start : 0 ) {
& {
@include ltr () {
left : $start ;
right : $end ;
}
@include rtl () {
left : unset ;
right : unset ;
left : $end ;
right : $start ;
}
}
}
2022-03-16 13:28:26 +00:00
}
}
}
// Add position for all directions
// @param {string} $top
// @param {string} $end
// @param {string} $bottom
// @param {string} $start
// ----------------------------------------------------------
@mixin position ( $top : null , $end : null , $bottom : null , $start : null ) {
@include position-horizontal ( $start , $end ) ;
top : $top ;
bottom : $bottom ;
}
// Add border for all directions
// @param {string} $top
// @param {string} $end
// @param {string} $bottom
// @param {string} $start
// ----------------------------------------------------------
@mixin border ( $top , $end : $top , $bottom : $top , $start : $end ) {
@include property ( border , $top , $end , $bottom , $start ) ;
}
// Add border radius for all directions
// @param {string} $top-start
// @param {string} $top-end
// @param {string} $bottom-end
// @param {string} $bottom-start
// ----------------------------------------------------------
@mixin border-radius ( $top-start , $top-end : $top-start , $bottom-end : $top-start , $bottom-start : $top-end ) {
@if $top-start == $top-end and $top-start == $bottom-end and $top-start == $bottom-start {
@include multi-dir () {
border-radius : $top-start ;
}
} @else {
@include ltr () {
border-top-left-radius : $top-start ;
border-top-right-radius : $top-end ;
border-bottom-right-radius : $bottom-end ;
border-bottom-left-radius : $bottom-start ;
}
@include rtl () {
border-top-left-radius : $top-end ;
border-top-right-radius : $top-start ;
border-bottom-right-radius : $bottom-start ;
border-bottom-left-radius : $bottom-end ;
}
}
}
// Add direction for all directions
// @param {string} $dir - Direction on LTR
@mixin direction ( $dir ) {
$other-dir : null ;
@if $dir == ltr {
$other-dir : rtl ;
} @else {
$other-dir : ltr ;
}
@include ltr () {
direction : $dir ;
}
@include rtl () {
direction : $other-dir ;
}
}
// Add float for all directions
// @param {string} $side
// @param {string} $decorator - !important
@mixin float ( $side , $decorator : null ) {
@if $side == start {
@include ltr () {
float : left $decorator ;
}
@include rtl () {
float : right $decorator ;
}
} @else if $side == end {
@include ltr () {
float : right $decorator ;
}
@include rtl () {
float : left $decorator ;
}
} @else {
@include multi-dir () {
float : $side $decorator ;
}
}
}
@mixin background-position ( $horizontal , $horizontal-amount : null , $vertical : null , $vertical-amount : null ) {
@if $horizontal == start or $horizontal == end {
$horizontal-ltr : null ;
$horizontal-rtl : null ;
@if $horizontal == start {
$horizontal-ltr : left ;
$horizontal-rtl : right ;
} @else {
$horizontal-ltr : right ;
$horizontal-rtl : left ;
}
@include ltr () {
background-position : $horizontal-ltr $horizontal-amount $vertical $vertical-amount ;
}
@include rtl () {
background-position : $horizontal-rtl $horizontal-amount $vertical $vertical-amount ;
}
} @else {
@include multi-dir () {
background-position : $horizontal $horizontal-amount $vertical $vertical-amount ;
}
}
}
@mixin transform-origin ( $x-axis , $y-axis : null ) {
@if $x-axis == start {
@include ltr () {
transform-origin : left $y-axis ;
}
@include rtl () {
transform-origin : right $y-axis ;
}
} @else if $x-axis == end {
@include ltr () {
transform-origin : right $y-axis ;
}
@include rtl () {
transform-origin : left $y-axis ;
}
} @else if $x-axis == left or $x-axis == right {
@include multi-dir () {
transform-origin : $x-axis $y-axis ;
}
} @else {
@include ltr () {
transform-origin : $x-axis $y-axis ;
}
@include rtl () {
transform-origin : calc ( 100 % - #{ $x-axis } ) $y-axis ;
}
}
}
// Add transform for all directions
// @param {string} $transforms - comma separated list of transforms
@mixin transform ( $transforms ... ) {
$extra : null ;
$x : null ;
$ltr-translate : null ;
$rtl-translate : null ;
@each $transform in $transforms {
@if ( str-index ( $transform , translate3d )) {
$transform : str-replace ( $transform , ' translate3d( ' ) ;
$transform : str-replace ( $transform , ' ) ' ) ;
$coordinates : str-split ( $transform , ' , ' ) ;
$x : nth ( $coordinates , 1 ) ;
$y : nth ( $coordinates , 2 ) ;
$z : nth ( $coordinates , 3 ) ;
$ltr-translate : translate3d ( $x , $y , $z ) ;
$rtl-translate : translate3d ( calc ( - 1 * #{ $x } ) , $y , $z ) ;
} @else {
@if $extra == null {
$extra : $transform ;
} @else {
$extra : $extra $transform ;
}
}
}
@if $x == ' 0 ' or $x == null {
@include multi-dir () {
transform : $ltr-translate $extra ;
}
} @else {
@include ltr () {
transform : $ltr-translate $extra ;
}
@include rtl () {
transform : $rtl-translate $extra ;
}
}
}