//// /// @group BEM /// /// @access public //// @use './validators'; @use './vars'; @use '../contexts'; /// /// Create a new state rule. /// /// @param {string} $state - First state name /// @param {list} $states - List of more state names /// /// @content /// /// @example scss - Using single is-state /// @include object('menu') { /// display: none; /// /// @include state('is', open') { /// display: block; /// } /// } /// /// // Generates: /// /// .o-menu { /// display: none; /// } /// /// .o-menu.is-open { /// display: block; /// } /// /// @example scss - Using multiple is-states /// @include object('menu') { /// display: none; /// /// @include state('is', open', 'visible') { /// display: block; /// } /// } /// /// // Generates: /// /// .o-menu { /// display: none; /// } /// /// .o-menu.is-open, /// .o-menu.is-visible { /// display: block; /// } /// @mixin state($prefix, $state, $states...) { $result: state($prefix, $state, $states...); $selector: nth($result, 1); $context: nth($result, 2); @include validators.validate( 'state', (prefix: $prefix, state: $state, states: $states), $selector, $context ); @include contexts.push(vars.$context-id, $context...); @at-root #{$selector} { @content; } @include contexts.pop(vars.$context-id); } /// /// Generate a new state. /// /// @return {list} A list with two items: 1. selector, 2. context or `null` /// /// @see {mixin} has /// @function state($prefix, $state, $states...) { $selector: (); $parts-data: (); @each $state in join($state, $states) { $sel: selector-parse('.#{$prefix}-#{$state}'); @if & { $sel: selector-append(&, $sel); } $selector: join($selector, $sel, comma); $parts-data: append( $parts-data, ( 'name': $state, 'selector': $sel ) ); } $context: 'state', ( 'parts': $parts-data, 'selector': $selector ); @return $selector $context; } /// /// Create a new has-state modifier. /// /// It's a shorthand for state('is', $state, $states...). /// @mixin is($state, $states...) { @include state('is', $state, $states...) { @content; } } /// /// Generate a new is-state modifier. Check the respective mixin documentation for more information. /// /// @return {list} A list with two items: 1. selector, 2. context or `null` /// /// @see {mixin} is /// @function is($state, $states...) { @return state('is', $state, $states...); } /// /// Create a new has-state modifier. /// /// It's a shorthand for state('has', $state, $states...). /// @mixin has($state, $states...) { @include state('has', $state, $states...) { @content; } } /// /// Generate a new has-state modifier. Check the respective mixin documentation for more information. /// /// @return {list} A list with two items: 1. selector, 2. context or `null` /// /// @see {mixin} has /// @function has($state, $states...) { @return state('has', $state, $states...); }