Spaces:
Sleeping
Sleeping
// vendor.scss v1.0 | @ajlkn | MIT licensed */ | |
// Vars. | |
/// Vendor prefixes. | |
/// @var {list} | |
$vendor-prefixes: ( | |
'-moz-', | |
'-webkit-', | |
'-ms-', | |
'' | |
); | |
/// Properties that should be vendorized. | |
/// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org | |
/// @var {list} | |
$vendor-properties: ( | |
// Animation. | |
'animation', | |
'animation-delay', | |
'animation-direction', | |
'animation-duration', | |
'animation-fill-mode', | |
'animation-iteration-count', | |
'animation-name', | |
'animation-play-state', | |
'animation-timing-function', | |
// Appearance. | |
'appearance', | |
// Backdrop filter. | |
'backdrop-filter', | |
// Background image options. | |
'background-clip', | |
'background-origin', | |
'background-size', | |
// Box sizing. | |
'box-sizing', | |
// Clip path. | |
'clip-path', | |
// Filter effects. | |
'filter', | |
// Flexbox. | |
'align-content', | |
'align-items', | |
'align-self', | |
'flex', | |
'flex-basis', | |
'flex-direction', | |
'flex-flow', | |
'flex-grow', | |
'flex-shrink', | |
'flex-wrap', | |
'justify-content', | |
'order', | |
// Font feature. | |
'font-feature-settings', | |
'font-language-override', | |
'font-variant-ligatures', | |
// Font kerning. | |
'font-kerning', | |
// Fragmented borders and backgrounds. | |
'box-decoration-break', | |
// Grid layout. | |
'grid-column', | |
'grid-column-align', | |
'grid-column-end', | |
'grid-column-start', | |
'grid-row', | |
'grid-row-align', | |
'grid-row-end', | |
'grid-row-start', | |
'grid-template-columns', | |
'grid-template-rows', | |
// Hyphens. | |
'hyphens', | |
'word-break', | |
// Masks. | |
'mask', | |
'mask-border', | |
'mask-border-outset', | |
'mask-border-repeat', | |
'mask-border-slice', | |
'mask-border-source', | |
'mask-border-width', | |
'mask-clip', | |
'mask-composite', | |
'mask-image', | |
'mask-origin', | |
'mask-position', | |
'mask-repeat', | |
'mask-size', | |
// Multicolumn. | |
'break-after', | |
'break-before', | |
'break-inside', | |
'column-count', | |
'column-fill', | |
'column-gap', | |
'column-rule', | |
'column-rule-color', | |
'column-rule-style', | |
'column-rule-width', | |
'column-span', | |
'column-width', | |
'columns', | |
// Object fit. | |
'object-fit', | |
'object-position', | |
// Regions. | |
'flow-from', | |
'flow-into', | |
'region-fragment', | |
// Scroll snap points. | |
'scroll-snap-coordinate', | |
'scroll-snap-destination', | |
'scroll-snap-points-x', | |
'scroll-snap-points-y', | |
'scroll-snap-type', | |
// Shapes. | |
'shape-image-threshold', | |
'shape-margin', | |
'shape-outside', | |
// Tab size. | |
'tab-size', | |
// Text align last. | |
'text-align-last', | |
// Text decoration. | |
'text-decoration-color', | |
'text-decoration-line', | |
'text-decoration-skip', | |
'text-decoration-style', | |
// Text emphasis. | |
'text-emphasis', | |
'text-emphasis-color', | |
'text-emphasis-position', | |
'text-emphasis-style', | |
// Text size adjust. | |
'text-size-adjust', | |
// Text spacing. | |
'text-spacing', | |
// Transform. | |
'transform', | |
'transform-origin', | |
// Transform 3D. | |
'backface-visibility', | |
'perspective', | |
'perspective-origin', | |
'transform-style', | |
// Transition. | |
'transition', | |
'transition-delay', | |
'transition-duration', | |
'transition-property', | |
'transition-timing-function', | |
// Unicode bidi. | |
'unicode-bidi', | |
// User select. | |
'user-select', | |
// Writing mode. | |
'writing-mode', | |
); | |
/// Values that should be vendorized. | |
/// Data via caniuse.com, github.com/postcss/autoprefixer, and developer.mozilla.org | |
/// @var {list} | |
$vendor-values: ( | |
// Cross fade. | |
'cross-fade', | |
// Element function. | |
'element', | |
// Filter function. | |
'filter', | |
// Flexbox. | |
'flex', | |
'inline-flex', | |
// Grab cursors. | |
'grab', | |
'grabbing', | |
// Gradients. | |
'linear-gradient', | |
'repeating-linear-gradient', | |
'radial-gradient', | |
'repeating-radial-gradient', | |
// Grid layout. | |
'grid', | |
'inline-grid', | |
// Image set. | |
'image-set', | |
// Intrinsic width. | |
'max-content', | |
'min-content', | |
'fit-content', | |
'fill', | |
'fill-available', | |
'stretch', | |
// Sticky position. | |
'sticky', | |
// Transform. | |
'transform', | |
// Zoom cursors. | |
'zoom-in', | |
'zoom-out', | |
); | |
// Functions. | |
/// Removes a specific item from a list. | |
/// @author Hugo Giraudel | |
/// @param {list} $list List. | |
/// @param {integer} $index Index. | |
/// @return {list} Updated list. | |
@function remove-nth($list, $index) { | |
$result: null; | |
@if type-of($index) != number { | |
@warn "$index: #{quote($index)} is not a number for `remove-nth`."; | |
} | |
@else if $index == 0 { | |
@warn "List index 0 must be a non-zero integer for `remove-nth`."; | |
} | |
@else if abs($index) > length($list) { | |
@warn "List index is #{$index} but list is only #{length($list)} item long for `remove-nth`."; | |
} | |
@else { | |
$result: (); | |
$index: if($index < 0, length($list) + $index + 1, $index); | |
@for $i from 1 through length($list) { | |
@if $i != $index { | |
$result: append($result, nth($list, $i)); | |
} | |
} | |
} | |
@return $result; | |
} | |
/// Replaces a substring within another string. | |
/// @author Hugo Giraudel | |
/// @param {string} $string String. | |
/// @param {string} $search Substring. | |
/// @param {string} $replace Replacement. | |
/// @return {string} Updated string. | |
@function str-replace($string, $search, $replace: '') { | |
$index: str-index($string, $search); | |
@if $index { | |
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); | |
} | |
@return $string; | |
} | |
/// Replaces a substring within each string in a list. | |
/// @param {list} $strings List of strings. | |
/// @param {string} $search Substring. | |
/// @param {string} $replace Replacement. | |
/// @return {list} Updated list of strings. | |
@function str-replace-all($strings, $search, $replace: '') { | |
@each $string in $strings { | |
$strings: set-nth($strings, index($strings, $string), str-replace($string, $search, $replace)); | |
} | |
@return $strings; | |
} | |
// Mixins. | |
/// Wraps @content in vendorized keyframe blocks. | |
/// @param {string} $name Name. | |
@mixin keyframes($name) { | |
@-moz-keyframes #{$name} { @content; } | |
@-webkit-keyframes #{$name} { @content; } | |
@-ms-keyframes #{$name} { @content; } | |
@keyframes #{$name} { @content; } | |
} | |
/// Vendorizes a declaration's property and/or value(s). | |
/// @param {string} $property Property. | |
/// @param {mixed} $value String/list of value(s). | |
@mixin vendor($property, $value) { | |
// Determine if property should expand. | |
$expandProperty: index($vendor-properties, $property); | |
// Determine if value should expand (and if so, add '-prefix-' placeholder). | |
$expandValue: false; | |
@each $x in $value { | |
@each $y in $vendor-values { | |
@if $y == str-slice($x, 1, str-length($y)) { | |
$value: set-nth($value, index($value, $x), '-prefix-' + $x); | |
$expandValue: true; | |
} | |
} | |
} | |
// Expand property? | |
@if $expandProperty { | |
@each $vendor in $vendor-prefixes { | |
#{$vendor}#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; | |
} | |
} | |
// Expand just the value? | |
@elseif $expandValue { | |
@each $vendor in $vendor-prefixes { | |
#{$property}: #{str-replace-all($value, '-prefix-', $vendor)}; | |
} | |
} | |
// Neither? Treat them as a normal declaration. | |
@else { | |
#{$property}: #{$value}; | |
} | |
} |