| @import "functions"; |
| |
| /// Triangle helper mixin |
| /// Modified from: http://blustemy.io/drawing-pure-css-arrows-with-mixins/ |
| /// https://css-tricks.com/snippets/sass/css-triangle-mixin/ |
| /// @param {Direction} $direction - Triangle direction, either `top`, `right`, `bottom` or `left` |
| /// @param {Color} $color [currentcolor] - Triangle color |
| /// @param {Length} $size [1em] - Triangle size |
| @mixin mdlext-arrow($direction: bottom, $base-width: 15px, $length: 10px, $color: inherit, $font-size: inherit) { |
| content: ''; |
| width: 0; |
| height: 0; |
| font-size: $font-size; |
| line-height: $font-size; |
| border-#{mdlext-opposite-direction($direction)}: $length solid $color; |
| border-#{mdlext-opposite-direction($direction)}-width: $length; |
| border-#{mdlext-opposite-direction($direction)}-style: solid; |
| border-#{mdlext-opposite-direction($direction)}-color: $color; |
| |
| $perpendicular-borders: ($base-width / 2) solid transparent; |
| |
| @if $direction == top or $direction == bottom { |
| border-left: $perpendicular-borders; |
| border-right: $perpendicular-borders; |
| } |
| @else if $direction == right or $direction == left { |
| border-bottom: $perpendicular-borders; |
| border-top: $perpendicular-borders; |
| } |
| } |
| |
| /// Hide element while making it readable for screen readers |
| /// Copied from HTML5Boilerplate: |
| /// https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css#L119-L133 |
| @mixin mdlext-visually-hidden() { |
| border: 0; |
| clip: rect(0 0 0 0); |
| height: 1px; |
| margin: -1px; |
| overflow: hidden; |
| padding: 0; |
| position: absolute; |
| width: 1px; |
| } |
| |
| |
| /// Toggle for aria-expanded attribute |
| /// |
| /// @author Leif Olsen |
| /// @param {Font} $font-family ['Material Icons'] - Font family |
| /// @param {Length} $font-size [24px] - Font size |
| /// @param {string} $icon ['+'] - icon to display when 'aria-expanded="false"' |
| /// @param {string} $icon-expanded ['-'] - icon to display when 'aria-expanded="true"' |
| /// @link https://github.com/google/material-design-icons Modified from '.material-icons' class |
| /// @param {Length} $icon-offset [0] - Icon offset |
| /// |
| /// @example - +/- toggle |
| /// .plus-minus { |
| /// @include mdlext-aria-expanded-toggle($font-family: inherit, $font-size: inherit); |
| /// } |
| /// <div aria-expanded="false"> |
| /// <i class="plus-minus"></i> |
| /// </div> |
| /// |
| /// @example - Material Icons, expand-more/expand_less |
| /// .more-less { |
| /// @include mdlext-aria-expanded-toggle($content: 'expand_more', $content-expanded: 'expand_less'); |
| /// } |
| /// <div aria-expanded="true"> |
| /// <i class="more-less"></i> |
| /// </div> |
| |
| @mixin mdlext-aria-expanded-toggle($font-family: 'Material Icons', $font-size: 24px, $icon: '+', $icon-expanded: '-', $icon-offset: 0) { |
| font-family: $font-family; |
| font-weight: inherit; |
| font-style: inherit; |
| font-size: $font-size; // Preferred icon size |
| display: inline-block; |
| width: 1em; |
| height: 1em; |
| line-height: 1; |
| text-transform: none; |
| letter-spacing: normal; |
| word-wrap: normal; |
| white-space: nowrap; |
| direction: ltr; |
| vertical-align: middle; |
| |
| // Support for all WebKit browsers. |
| -webkit-font-smoothing: antialiased; |
| -webkit-font-feature-settings: 'liga'; |
| |
| // Support for Safari and Chrome. |
| text-rendering: optimizeLegibility; |
| |
| // Support for Firefox. |
| -moz-osx-font-smoothing: grayscale; |
| |
| // Support for IE. |
| font-feature-settings: 'liga'; |
| |
| &::after { |
| content: $icon; |
| margin-left: $icon-offset; |
| } |
| |
| [aria-expanded='true'] > & { |
| &::after { |
| content: $icon-expanded; |
| margin-left: $icon-offset; |
| } |
| } |
| } |
| |
| |
| /// Keyframe mixin |
| /// Modified from: http://sassbreak.com/nested-keyframe-rules-sass/ |
| /// Modified from: http://sassbreak.com/sass-tools-and-snippets/ |
| /// |
| /// @example |
| /// |
| /// .some-element { |
| /// animation: 10s linear infinite; |
| /// |
| /// @include mdlext-animation-keyframes { |
| /// from { |
| /// background-position: 0% 0%; |
| /// } |
| /// to { |
| /// background-position: 114.2857% 0%; |
| /// } |
| /// } |
| /// } |
| |
| @mixin mdlext-animation-keyframes { |
| $animation-name: unique-id(); |
| animation-name: $animation-name; |
| |
| @keyframes #{$animation-name} { |
| @content; |
| } |
| } |
| |
| |
| /// Flexible title mixin |
| /// A flexible title consists of three regions, left, middle and right. |
| /// The left and right regions are optional and will typically contain state icons |
| /// or act as a toolbar. The middle region should contain the title text. |
| /// |
| /// @author Leif Olsen |
| /// @param {String} $class - class name |
| /// @gutter {Length} [8px] - horizontal spacing between title elements |
| /// |
| /// @example |
| /// |
| /// @include mdlext-flexible-title(my-title) { |
| /// overflow: hidden; |
| /// background-color: yellow; |
| /// &__text { |
| /// font-size: 20px; |
| /// letter-spacing: 0.02em; |
| /// font-weight: 400; |
| /// line-height: 1.1; |
| /// } |
| /// } |
| /// |
| /// <header class="my-title"> |
| /// <i class="material-icons" role="presentation" style="font-size: 28px;">info</i> |
| /// <h2 class="my-title__text">A title</h2> |
| /// <span class="my-title__spacer"></span> |
| /// <i class="mdlext-aria-expanded-more-less" role="presentation" style="font-size: 28px;"></i> |
| /// </header> |
| |
| @mixin mdlext-flexible-title($class, $gutter: 8px) { |
| .#{$class} { |
| box-sizing: border-box; |
| position: relative; |
| width: 100%; |
| display: flex; |
| align-self: stretch; |
| align-items: center; |
| margin: 0; |
| padding: 0 $gutter; |
| |
| &__text, |
| &__text > * { |
| white-space: nowrap; |
| overflow: hidden; |
| text-overflow: ellipsis; |
| } |
| |
| > * { |
| box-sizing: border-box; |
| margin: 0; |
| padding: 0 $gutter 0 0; |
| } |
| |
| > *:last-child { |
| padding-right: 0; |
| } |
| |
| // Used to align elements inside a header or drawer, by growing to fill |
| // remaining space. Commonly used for aligning elements to the right. |
| &__spacer { |
| flex: 1; |
| } |
| |
| @content; |
| } |
| } |
| |