|
67 | 67 |
|
68 | 68 | /* BEM |
69 | 69 | -------------------------- */ |
| 70 | + |
| 71 | +$_BEM: (null, null, null); |
| 72 | + |
70 | 73 | @mixin b($block) { |
71 | | - $B: $namespace+'-'+$block !global; |
| 74 | + $lastBEM: $_BEM; |
| 75 | + $_BEM: ($block, null, null) !global; |
72 | 76 |
|
73 | | - .#{$B} { |
| 77 | + .#{$namespace}-#{$block} { |
74 | 78 | @content; |
75 | 79 | } |
| 80 | + |
| 81 | + $_BEM: $lastBEM !global; |
76 | 82 | } |
77 | 83 |
|
78 | | -@mixin e($element) { |
79 | | - $E: $element !global; |
80 | | - $selector: &; |
81 | | - $currentSelector: ""; |
82 | | - @each $unit in $element { |
83 | | - $currentSelector: #{$currentSelector + "." + $B + $element-separator + $unit + ","}; |
84 | | - } |
| 84 | +@mixin e($elements) { |
| 85 | + $block: nth($_BEM, 1); |
85 | 86 |
|
86 | | - @if hitAllSpecialNestRule($selector) { |
87 | | - @at-root { |
88 | | - #{$selector} { |
89 | | - #{$currentSelector} { |
90 | | - @content; |
91 | | - } |
92 | | - } |
93 | | - } |
| 87 | + @if null == $block { |
| 88 | + @error "Base-level rules cannot contain an element mixin"; |
94 | 89 | } @else { |
95 | | - @at-root { |
96 | | - #{$currentSelector} { |
97 | | - @content; |
98 | | - } |
99 | | - } |
100 | | - } |
101 | | -} |
| 90 | + $selects: &; |
102 | 91 |
|
103 | | -@mixin m($modifier) { |
104 | | - $selector: &; |
105 | | - $currentSelector: ""; |
106 | | - @each $unit in $modifier { |
107 | | - $currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","}; |
108 | | - } |
| 92 | + @if (null != nth($_BEM, 2)) { |
| 93 | + $selects: (); |
109 | 94 |
|
110 | | - @at-root { |
111 | | - #{$currentSelector} { |
112 | | - @content; |
| 95 | + @each $old-select in & { |
| 96 | + $selects: append($selects, set-nth($old-select, length($old-select), ".#{$namespace}-#{$block}"), "comma") |
| 97 | + } |
113 | 98 | } |
114 | | - } |
115 | | -} |
116 | 99 |
|
117 | | -@mixin configurable-m($modifier, $E-flag: false) { |
118 | | - $selector: &; |
119 | | - $interpolation: ''; |
| 100 | + $lastBEM: $_BEM; |
| 101 | + $_BEM: ($block, $elements, null) !global; |
120 | 102 |
|
121 | | - @if $E-flag { |
122 | | - $interpolation: $element-separator + $E-flag; |
123 | | - } |
| 103 | + $parent: ".#{$namespace}-#{$block}"; |
| 104 | + $current: (); |
124 | 105 |
|
125 | | - @at-root { |
126 | | - #{$selector} { |
127 | | - .#{$B+$interpolation+$modifier-separator+$modifier} { |
| 106 | + @each $element in $elements { |
| 107 | + $current: append( |
| 108 | + $current, |
| 109 | + bem-extend($selects, $parent, "#{$parent}#{$element-separator}#{$element}"), |
| 110 | + "comma", |
| 111 | + ); |
| 112 | + } |
| 113 | + |
| 114 | + @at-root { |
| 115 | + #{$current} { |
128 | 116 | @content; |
129 | 117 | } |
130 | 118 | } |
| 119 | + |
| 120 | + $_BEM: $lastBEM !global; |
131 | 121 | } |
132 | 122 | } |
133 | 123 |
|
134 | | -@mixin spec-selector($specSelector: '', $element: $E, $modifier: false, $block: $B) { |
135 | | - $modifierCombo: ''; |
| 124 | +@mixin m($modifiers) { |
| 125 | + $block: nth($_BEM, 1); |
136 | 126 |
|
137 | | - @if $modifier { |
138 | | - $modifierCombo: $modifier-separator + $modifier; |
139 | | - } |
| 127 | + @if null == $block { |
| 128 | + @error "Base-level rules cannot contain a modifier mixin"; |
| 129 | + } @else if null != nth($_BEM, 3) { |
| 130 | + @error "Modifier-level rules cannot contain another modifier mixin"; |
| 131 | + } @else { |
| 132 | + $elements: nth($_BEM, 2); |
140 | 133 |
|
141 | | - @at-root { |
142 | | - #{&}#{$specSelector}.#{$block+$element-separator+$element+$modifierCombo} { |
143 | | - @content; |
| 134 | + @if (null == $elements) { |
| 135 | + $elements: (null); |
144 | 136 | } |
145 | | - } |
146 | | -} |
147 | 137 |
|
148 | | -@mixin meb($modifier: false, $element: $E, $block: $B) { |
149 | | - $selector: &; |
150 | | - $modifierCombo: ''; |
| 138 | + $lastBEM: $_BEM; |
| 139 | + $_BEM: ($block, $elements, $modifiers) !global; |
151 | 140 |
|
152 | | - @if $modifier { |
153 | | - $modifierCombo: $modifier-separator + $modifier; |
154 | | - } |
| 141 | + @each $element in $elements { |
| 142 | + $parent: ".#{$namespace}-#{$block}"; |
155 | 143 |
|
156 | | - @at-root { |
157 | | - #{$selector} { |
158 | | - .#{$block+$element-separator+$element+$modifierCombo} { |
159 | | - @content; |
| 144 | + @if (null != $element) { |
| 145 | + $parent: "#{$parent}#{$element-separator}#{$element}"; |
| 146 | + } |
| 147 | + |
| 148 | + $current: (); |
| 149 | + |
| 150 | + @each $modifier in $modifiers { |
| 151 | + $current: append( |
| 152 | + $current, |
| 153 | + bem-extend(&, $parent, "#{$parent}#{$modifier-separator}#{$modifier}"), |
| 154 | + "comma", |
| 155 | + ); |
| 156 | + } |
| 157 | + |
| 158 | + @at-root { |
| 159 | + #{$current} { |
| 160 | + @content; |
| 161 | + } |
160 | 162 | } |
161 | 163 | } |
| 164 | + |
| 165 | + $_BEM: $lastBEM !global; |
162 | 166 | } |
163 | 167 | } |
164 | 168 |
|
|
0 commit comments