|
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; |
| 87 | + @if null == $block { |
| 88 | + @error "Base-level rules cannot contain an element mixin"; |
| 89 | + } @else { |
| 90 | + $selects: &; |
| 91 | + $old-elems: nth($_BEM, 2); |
| 92 | + |
| 93 | + @if (null != $old-elems) { |
| 94 | + $selects: (); |
| 95 | + |
| 96 | + @each $old-select in & { |
| 97 | + @each $old-element in $old-elems { |
| 98 | + $old-bem: ".#{$namespace}-#{$block}#{$element-separator}#{$old-element}"; |
| 99 | + $old-len: length($old-select); |
| 100 | + |
| 101 | + @if nth($old-select, $old-len) == $old-bem { |
| 102 | + $selects: append($selects, set-nth($old-select, $old-len, ".#{$namespace}-#{$block}"), "comma", ); |
| 103 | + } @else { |
| 104 | + $selects: append($selects, $old-select, "comma", ); |
| 105 | + } |
91 | 106 | } |
92 | 107 | } |
93 | 108 | } |
94 | | - } @else { |
| 109 | + |
| 110 | + $lastBEM: $_BEM; |
| 111 | + $_BEM: ($block, $elements, null) !global; |
| 112 | + |
| 113 | + $parent: ".#{$namespace}-#{$block}"; |
| 114 | + $current: (); |
| 115 | + |
| 116 | + @each $element in $elements { |
| 117 | + $current: append( |
| 118 | + $current, |
| 119 | + bem-extend($selects, $parent, "#{$parent}#{$element-separator}#{$element}"), |
| 120 | + "comma", |
| 121 | + ); |
| 122 | + } |
| 123 | + |
95 | 124 | @at-root { |
96 | | - #{$currentSelector} { |
| 125 | + #{$current} { |
97 | 126 | @content; |
98 | 127 | } |
99 | 128 | } |
100 | | - } |
101 | | -} |
102 | | - |
103 | | -@mixin m($modifier) { |
104 | | - $selector: &; |
105 | | - $currentSelector: ""; |
106 | | - @each $unit in $modifier { |
107 | | - $currentSelector: #{$currentSelector + & + $modifier-separator + $unit + ","}; |
108 | | - } |
109 | 129 |
|
110 | | - @at-root { |
111 | | - #{$currentSelector} { |
112 | | - @content; |
113 | | - } |
| 130 | + $_BEM: $lastBEM !global; |
114 | 131 | } |
115 | 132 | } |
116 | 133 |
|
117 | | -@mixin configurable-m($modifier, $E-flag: false) { |
118 | | - $selector: &; |
119 | | - $interpolation: ''; |
| 134 | +@mixin m($modifiers) { |
| 135 | + $block: nth($_BEM, 1); |
120 | 136 |
|
121 | | - @if $E-flag { |
122 | | - $interpolation: $element-separator + $E-flag; |
123 | | - } |
| 137 | + @if null == $block { |
| 138 | + @error "Base-level rules cannot contain a modifier mixin"; |
| 139 | + } @else if null != nth($_BEM, 3) { |
| 140 | + @error "Modifier-level rules cannot contain another modifier mixin"; |
| 141 | + } @else { |
| 142 | + $elements: nth($_BEM, 2); |
124 | 143 |
|
125 | | - @at-root { |
126 | | - #{$selector} { |
127 | | - .#{$B+$interpolation+$modifier-separator+$modifier} { |
128 | | - @content; |
129 | | - } |
| 144 | + @if (null == $elements) { |
| 145 | + $elements: (null); |
130 | 146 | } |
131 | | - } |
132 | | -} |
133 | 147 |
|
134 | | -@mixin spec-selector($specSelector: '', $element: $E, $modifier: false, $block: $B) { |
135 | | - $modifierCombo: ''; |
| 148 | + $lastBEM: $_BEM; |
| 149 | + $_BEM: ($block, $elements, $modifiers) !global; |
136 | 150 |
|
137 | | - @if $modifier { |
138 | | - $modifierCombo: $modifier-separator + $modifier; |
139 | | - } |
| 151 | + @each $element in $elements { |
| 152 | + $parent: ".#{$namespace}-#{$block}"; |
140 | 153 |
|
141 | | - @at-root { |
142 | | - #{&}#{$specSelector}.#{$block+$element-separator+$element+$modifierCombo} { |
143 | | - @content; |
144 | | - } |
145 | | - } |
146 | | -} |
| 154 | + @if (null != $element) { |
| 155 | + $parent: "#{$parent}#{$element-separator}#{$element}"; |
| 156 | + } |
147 | 157 |
|
148 | | -@mixin meb($modifier: false, $element: $E, $block: $B) { |
149 | | - $selector: &; |
150 | | - $modifierCombo: ''; |
| 158 | + $current: (); |
151 | 159 |
|
152 | | - @if $modifier { |
153 | | - $modifierCombo: $modifier-separator + $modifier; |
154 | | - } |
| 160 | + @each $modifier in $modifiers { |
| 161 | + $current: append( |
| 162 | + $current, |
| 163 | + bem-extend(&, $parent, "#{$parent}#{$modifier-separator}#{$modifier}"), |
| 164 | + "comma", |
| 165 | + ); |
| 166 | + } |
155 | 167 |
|
156 | | - @at-root { |
157 | | - #{$selector} { |
158 | | - .#{$block+$element-separator+$element+$modifierCombo} { |
159 | | - @content; |
| 168 | + @at-root { |
| 169 | + #{$current} { |
| 170 | + @content; |
| 171 | + } |
160 | 172 | } |
161 | 173 | } |
| 174 | + |
| 175 | + $_BEM: $lastBEM !global; |
162 | 176 | } |
163 | 177 | } |
164 | 178 |
|
|
0 commit comments