html, body, ul, ol margin: 0 padding: 0 @import reset body font: 100% Helvetica, sans-serif background-color: #efefef $font-stack: Helvetica, sans-serif $primary-color: #333 body font: 100% $font-stack color: $primary-color .container width: 100% article[role="main"] float: left width: 600px / 960px * 100% %message-shared border: 1px solid #ccc padding: 10px color: #333 .message @extend %message-shared .success @extend %message-shared border-color: green =transform($property) -webkit-transform: $property -ms-transform: $property transform: $property .box +transform(rotate(30deg)) // This comment won't be included in the CSS. This is also commented out. #a /* But this comment will, except in compressed mode. /* It can also contain interpolation: 1 + 1 = #{1 + 1} 1 + 1 = #{1 + 1} 1 + 1 = #{1 + 1} #a // But this comment will, except in compressed mode. // It can also contain interpolation: 1 + 1 = #{1 + 1} 1 + 1 = #{1 + 1} 1 + 1 = #{1 + 1} #a /*! This comment will be included even in compressed mode. #a /**/ p .sans font: Helvetica, /* Inline comments must be closed. */ sans-serif p .sans font/*comment*/: Helvetica, /* Inline comments must be closed. */ sans-serif // comment /// Computes an exponent. /// /// @param {number} $base /// The number to multiply by itself. /// @param {integer (unitless)} $exponent /// The number of `$base`s to multiply together. /// @return {number} `$base` to the power of `$exponent`. @function pow($base, $exponent) $result: 1 @for $_ from 1 through $exponent $result: $result * $base @return $result $roboto-font-path: "../fonts/roboto" @font-face // This is parsed as a normal function call that takes a quoted string. src: url("#{$roboto-font-path}/Roboto-Thin.woff2") format("woff2") src: url($roboto-font-path + "/Roboto-Light.woff2") format("woff2") src: url(#{$roboto-font-path}/Roboto-Regular.woff2) format("woff2") font-family: "Roboto" font-weight: 100 .logo $width: 800px width: $width position: absolute left: calc(50% - #{$width / 2}) top: 0 $padding: 12px .post // Since these max() calls don't use any Sass features other than // interpolation, they're compiled to CSS max() calls. padding-left: max(#{$padding}, env(safe-area-inset-left)) padding-right: max(#{$padding}, env(safe-area-inset-right)) .sidebar // Since these refer to a Sass variable without interpolation, they call // Sass's built-in max() function. padding-left: max($padding, 20px) padding-right: max($padding, 20px) .circle $size: 100px width: $size height: $size border-radius: $size / 2 @mixin prefix($property, $value, $prefixes) @each $prefix in $prefixes -#{$prefix}-#{$property}: $value #{$property}: $value .gray @include prefix(filter, grayscale(50%), moz webkit) .enlarge font-size: 14px transition: property: font-size duration: 4s delay: 2s &:hover font-size: 36px .info-page margin: auto bottom: 10px top: 2px $rounded-corners: false .button border: 1px solid black border-radius: if($rounded-corners, 5px, null) $primary: #81899b $accent: #ab2e $warn: #dfa612aa :root --primary: #{$primary} --accent: #{$accent} --warn: #{$warn} // Even though this looks like a Sass variable, it's valid CSS so it's not // evaluated. --consumed-by-js: $primary $font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto $font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas :root --font-family-sans-serif: #{inspect($font-family-sans-serif)} --font-family-monospace: #{inspect($font-family-monospace)} .alert // The parent selector can be used to add pseudo-classes to the outer // selector. &:hover font-weight: bold // It can also be used to style the outer selector in a certain context, such // as a body set to use a right-to-left language. [dir=rtl] & margin-left: 0 margin-right: 10px // You can even use it as an argument to pseudo-class selectors. :not(&) opacity: 0.8 @mixin unify-parent($child) @at-root #{selector-unify(&, $child)} @content .wrapper .field @include unify-parent("input") @mixin app-background($color) #{if(&, '&.app-background', '.app-background')} background-color: $color color: rgba(#fff, 0.75) @include app-background(#036) .sidebar @include app-background(#c6538c) .accordion max-width: 600px margin: 4rem auto &__copy display: none padding: 1rem 1.5rem 2rem 1.5rem line-height: 1.6 font-size: 14px &--open display: block .alert:hover, %strong-alert font-weight: bold %strong-alert:hover color: red %toolbelt box-sizing: border-box border-top: 1px rgba(#000, .12) solid &:hover border: 2px rgba(#000, .5) solid .action-buttons @extend %toolbelt color: #4285f4 $border-dark: rgba($base-color, 0.88) $black: #000 !default $border-radius: 0.25rem !default $box-shadow: 0 0.5rem 1rem rgba($black, 0.15) !default $box-shadow: 0 0.5rem 1rem rgba($black, blue($black)) !default $border-radius: 0.1rem @import 'library' $global-variable: global value // This would fail, because $local-variable isn't in scope: // local: $local-variable $theme-colors: ("success": #28a745, "info": #17a2b8, "warning": #ffc107) .alert // Instead of $theme-color-#{warning} background-color: map-get($theme-colors, "warning") @mixin corner-icon($name, $top-or-bottom, $left-or-right) .icon-#{$name} background-image: url("/icons/#{$name}.svg") position: absolute #{$top-or-bottom}: 0 #{$left-or-right}: 0 @include corner-icon("mail", top, right) @mixin inline-animation($duration) $name: inline-#{unique-id()} @keyframes #{$name} @content animation-name: $name animation-duration: $duration animation-iteration-count: infinite .pulse @include inline-animation(2s) from background-color: yellow to background-color: red .example unquoted: #{"string"} & & padding: bottom: 0 left: 0 // style.sass @import 'foundation/code', 'foundation/lists' @import "theme.css" @import "http://fonts.googleapis.com/css?family=Droid+Sans" @import url(theme) @import "landscape" screen and (orientation: landscape) @mixin google-font($family) @import url("http://fonts.googleapis.com/css?family=#{$family}") @include google-font("Droid Sans") @mixin horizontal-list @include reset-list li display: inline-block margin: left: -2px right: 2em nav ul @include horizontal-list @mixin rtl($property, $ltr-value, $rtl-value) #{$property}: $ltr-value [dir=rtl] & #{$property}: $rtl-value .sidebar @include rtl(float, left, right) @mixin replace-text($image, $x: 50%, $y: 50%) text-indent: -99999em overflow: hidden text-align: left background: image: $image repeat: no-repeat position: $x $y .mail-icon @include replace-text(url("/images/mail.svg"), 0) @include order(150px, "input.name", "input.address", "input.zip") @mixin syntax-colors($args...) @debug keywords($args) // (string: #080, comment: #800, $variable: $60b) @each $name, $color in keywords($args) pre span.stx-#{$name} color: $color @include syntax-colors($string: #080, $comment: #800, $variable: #60b) @mixin media($types...) @each $type in $types @media #{$type} @content($type) @include media(screen, print) using ($type) h1 font-size: 40px @if $type == print font-family: Calluna =reset-list margin: 0 padding: 0 list-style: none =horizontal-list +reset-list li display: inline-block margin: left: -2px right: 2em nav ul +horizontal-list @function pow($base, $exponent) $result: 1 @for $_ from 1 through $exponent $result: $result * $base @return $result .sidebar float: left margin-left: pow(4, 3) * 1px @function sum($numbers...) $sum: 0 @each $number in $numbers $sum: $sum + $number @return $sum .micro width: sum(50px, 30px, 100px) @function str-insert($string, $insert, $index) // Avoid making new strings if we don't need to. @if str-length($string) == 0 @return $insert $before: str-slice($string, 0, $index) $after: str-slice($string, $index) @return $before + $insert + $after .error border: 1px #f00 background-color: #fdd &--serious @extend .error border-width: 3px @mixin reflexive-position($property, $value) @if $property != left and $property != right @error "Property #{$property} must be either left or right." $left-value: if($property == right, initial, $value) $right-value: if($property == right, $value, initial) left: $left-value right: $right-value [dir=rtl] & left: $right-value right: $left-value $known-prefixes: webkit, moz, ms, o @mixin prefix($property, $value, $prefixes) @each $prefix in $prefixes @if not index($known-prefixes, $prefix) @warn "Unknown prefix #{$prefix}." -#{$prefix}-#{$property}: $value #{$property}: $value .tilt // Oops, we typo'd "webkit" as "wekbit"! @include prefix(transform, rotate(15deg), wekbit ms) @mixin inset-divider-offset($offset, $padding) $divider-offset: (2 * $padding) + $offset @debug "divider offset: #{$divider-offset}" margin-left: $divider-offset width: calc(100% - #{$divider-offset}) @mixin unify-parent($child) @at-root #{selector-unify(&, $child)} @content .square-av @include avatar(100px, $circle: false) .circle-av @include avatar(100px, $circle: true) @mixin theme-colors($light-theme: true) @if $light-theme background-color: $light-background color: $light-text @else background-color: $dark-background color: $dark-text .banner @include theme-colors($light-theme: true) body.dark & @include theme-colors($light-theme: false) @mixin triangle($size, $color, $direction) height: 0 width: 0 border-color: transparent border-style: solid border-width: $size / 2 @if $direction == up border-bottom-color: $color @else if $direction == right border-left-color: $color @else if $direction == down border-top-color: $color @else if $direction == left border-right-color: $color @else @error "Unknown direction #{$direction}." @each $size in $sizes .icon-#{$size} font-size: $size height: $size width: $size $icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f") @each $name, $glyph in $icons .icon-#{$name}:before display: inline-block font-family: "Icon Font" content: $glyph $icons: "eye" "\f112" 12px, "start" "\f12e" 16px, "stop" "\f12f" 10px @each $name, $glyph, $size in $icons .icon-#{$name}:before display: inline-block font-family: "Icon Font" content: $glyph font-size: $size @for $i from 1 through 3 ul:nth-child(3n + #{$i}) background-color: lighten($base-color, $i * 5%) /// Divides `$value` by `$ratio` until it's below `$base`. @function scale-below($value, $base, $ratio: 1.618) @while $value > $base $value: $value / $ratio @return $value @namespace svg url(http://www.w3.org/2000/svg) @font-face font-family: "Open Sans" src: url("/fonts/OpenSans-Regular-webfont.woff2") format("woff2") @counter-style thumbs system: cyclic symbols: "\1F44D" @mixin sticky-position position: fixed @supports (position: sticky) position: sticky @media (hover: hover) .button:hover border: 2px solid black @media (color) border-color: #036 @keyframes slide-in from margin-left: 100% width: 300% 70% margin-left: 90% width: 150% to margin-left: 0% width: 100% @debug 100 // 100 @debug 0.8 // 0.8 @debug 16px // 16px @debug 5px * 2px // 10px*px (read "square pixels") @debug 5.2e3 // 5200 @debug 6e-2 // 0.06 @debug 4px * 6px // 24px*px (read "square pixels") @debug 5px / 2s // 2.5px/s (read "pixels per second") @debug 5px * 30deg / 2s / 24em // 3.125px*deg/s*em // (read "pixel-degrees per second-em") $degrees-per-second: 20deg/1s @debug $degrees-per-second // 20deg/s @debug 1 / $degrees-per-second // 0.05s/deg $transition-speed: 1s/50px @debug unquote(".widget:hover") // .widget:hover @debug quote(bold) // "bold" @debug 0.012345678912345 // 0.0123456789 @debug 0.01234567891 == 0.01234567899 // true @debug 1.00000000009 // 1 @debug 0.99999999991 // 1 @debug "\"" // '"' @debug \.widget // \.widget @debug "\a" // "\a" (a string containing only a newline) @debug "line1\a line2" // "line1\a line2" (foo and bar are separated by a newline) @debug "Nat + Liz \1F46D" // "Nat + Liz 👭" @debug "Helvetica Neue" // "Helvetica Neue" @debug "C:\\Program Files" // "C:\\Program Files" @debug "\"Don't Fear the Reaper\"" // "\"Don't Fear the Reaper\"" @debug "line1\a line2" // "line1\a line2" $roboto-variant: "Mono" @debug "Roboto #{$roboto-variant}" // "Roboto Mono" @debug bold // bold @debug -webkit-flex // -webkit-flex @debug --123 // --123 $prefix: ms @debug -#{$prefix}-flex // -ms-flex @debug \1F46D // 👭 @debug \21 // \! @debug \7Fx // \7f x @debug str-length(\7Fx) // 5 @debug str-index("Helvetica Neue", "Helvetica") // 1 @debug str-index("Helvetica Neue", "Neue") // 11 @debug str-slice("Roboto Mono", -4) // "Mono" @debug #f2ece4 // #f2ece4 @debug #b37399aa // rgba(179, 115, 153, 67%) @debug midnightblue // #191970 @debug rgb(204, 102, 153) // #c69 @debug rgba(107, 113, 127, 0.8) // rgba(107, 113, 127, 0.8) @debug hsl(228, 7%, 86%) // #dadbdf @debug hsla(20, 20%, 85%, 0.7) // rgb(225, 215, 210, 0.7) $venus: #998099 @debug scale-color($venus, $lightness: +15%) // #a893a8 @debug mix($venus, midnightblue) // #594d85 @debug nth(10px 12px 16px, 2) // 12px @debug nth([line1, line2, line3], -1) // line3 $prefixes-by-browser: ("firefox": moz, "safari": webkit, "ie": ms) @function prefixes-for-browsers($browsers) $prefixes: () @each $browser in $browsers $prefixes: append($prefixes, map-get($prefixes-by-browser, $browser)) @return $prefixes @debug prefixes-for-browsers("firefox" "ie") // moz ms @mixin syntax-colors($args...) @debug keywords($args) // (string: #080, comment: #800, $variable: $60b) @each $name, $color in keywords($args) pre span.stx-#{$name} color: $color @include syntax-colors($string: #080, $comment: #800, $variable: #60b); $font-weights: ("regular": 400, "medium": 500, "bold": 700) @debug map-get($font-weights, "medium") // 500 @debug map-get($font-weights, "extra-bold") // null $icons: ("eye": "\f112", "start": "\f12e", "stop": "\f12f") @each $name, $glyph in $icons .icon-#{$name}:before display: inline-block font-family: "Icon Font" content: $glyph $prefixes-by-browser: ("firefox": moz, "safari": webkit, "ie": ms) @mixin add-browser-prefix($browser, $prefix) $prefixes-by-browser: map-merge($prefixes-by-browser, ($browser: $prefix)) @include add-browser-prefix("opera", o) @debug $prefixes-by-browser // ("firefox": moz, "safari": webkit, "ie": ms, "opera": o) @debug 1px == 2px // false @debug 1px == 1px // true @debug 10px < 3px // false @debug comparable(100px, 3in) // true @debug str-index("Helvetica Neue", "Roboto") // null @debug map-get(("large": 20px), "small") // null @debug & // null $fonts: ("serif": "Helvetica Neue", "monospace": "Consolas") h3 font: 18px bold map-get($fonts, "sans") $fonts: ("serif": "Helvetica Neue", "monospace": "Consolas") h3 font: size: 18px weight: bold family: map-get($fonts, "sans") copy of $list with all elements for which $condition returns `true` /// removed. @function remove-where($list, $condition) $new-list: () $separator: list-separator($list) @each $element in $list @if not call($condition, $element) $new-list: append($new-list, $element, $separator: $separator) @return $new-list $fonts: Tahoma, Geneva, "Helvetica Neue", Helvetica, Arial, sans-serif content @function contains-helvetica($string) @return str-index($string, "Helvetica") font-family: remove-where($fonts, get-function("contains-helvetica")) @debug 1px == 1px // true @debug 1px != 1em // true @debug 1 != 1px // true @debug 96px == 1in // true @debug "Helvetica" == Helvetica // true @debug "Helvetica" != "Arial" // true @debug hsl(34, 35%, 92.1%) == #f2ece4 // true @debug rgba(179, 115, 153, 0.5) != rgba(179, 115, 153, 0.8) // true @debug (5px 7px 10px) == (5px 7px 10px) // true @debug (5px 7px 10px) != (10px 14px 20px) // true @debug (5px 7px 10px) != (5px, 7px, 10px) // true @debug (5px 7px 10px) != [5px 7px 10px] // true $theme: ("venus": #998099, "nebula": #d2e1dd) @debug $theme == ("venus": #998099, "nebula": #d2e1dd) // true @debug $theme != ("venus": #998099, "iron": #dadbdf) // true @debug true == true // true @debug true != false // true @debug null != false // true @debug get-function("rgba") == get-function("rgba") // true @debug get-function("rgba") != get-function("hsla") // true @debug 10s + 15s // 25s @debug 1in - 10px // 0.8958333333in @debug 5px * 3px // 15px*px @debug (12px/4px) // 3 @debug 1in % 9px // 0.0625in @debug 15px / 30px // 15px/30px @debug (10px + 5px) / 30px // 0.5 $result: 15px / 30px @debug $result // 0.5 @function fifteen-divided-by-thirty() @return 15px / 30px @debug fifteen-divided-by-thirty() // 0.5 @debug (15px/30px) // 0.5 @debug (bold 15px/30px sans-serif) // bold 15px/30px sans-serif @debug 15px/30px + 1 // 1.5 @debug 4px * 6px // 24px*px (read "square pixels") @debug 5px / 2s // 2.5px/s (read "pixels per second") @debug 5px * 30deg / 2s / 24em // 3.125px*deg/s*em // (read "pixel-degrees per second-em") $degrees-per-second: 20deg/1s @debug $degrees-per-second // 20deg/s @debug 1 / $degrees-per-second // 0.05s/deg @debug 100 > 50 // true @debug 10px < 17px // true @debug 96px >= 1in // true @debug 1000ms <= 1s // true @debug "Helvetica" + " Neue" // "Helvetica Neue" @debug sans- + serif // sans-serif @debug #{10px + 5px} / 30px // 15px/30px @debug sans - serif // sans-serif @debug "Elapsed time: " + 10s // "Elapsed time: 10s"; @debug true + " is a boolean value" // "true is a boolean value"; @debug / 15px // /15px @debug - moz // -moz @debug not true // false @debug not false // true @debug true and true // true @debug true and false // false @debug true or false // true @debug false or false // false @debug var(--main-bg-color) // var(--main-bg-color) $primary: #f2ece4 $accent: #e1d7d2 @debug radial-gradient($primary, $accent) // radial-gradient(#f2ece4, #e1d7d2) @debug str-index("Helvetica Neue", "Helvetica") // 1 @debug str-index("Helvetica Neue", "Neue") // 11 @debug comparable(2px, 1px) // true @debug comparable(100px, 3em) // false @debug comparable(10cm, 3mm) // true @debug append(10px 20px, 30px) // 10px 20px 30px @debug append((blue, red), green) // blue, red, green @debug append(10px 20px, 30px 40px) // 10px 20px (30px 40px) @debug append(10px, 20px, $separator: comma) // 10px, 20px @debug append((blue, red), green, $separator: space) // blue red green @mixin syntax-colors($args...) @debug keywords($args) // (string: #080, comment: #800, $variable: $60b) @each $name, $color in keywords($args) pre span.stx-#{$name} color: $color @include syntax-colors($string: #080, $comment: #800, $variable: #60b); $font-weights: ("regular": 400, "medium": 500, "bold": 700) @debug map-values($font-weights) // 400, 500, 700 .icon-#{$name} position: absolute #{$top-or-bottom}: 0 -#{$prefix}-#{$property}: $value .icon-#{$name} position: absolute #{$top-or-bottom}: 0 -#{$prefix}-#{$property}-image: $value