diff options
Diffstat (limited to 'src/bem/_block.scss')
-rw-r--r-- | src/bem/_block.scss | 166 |
1 files changed, 86 insertions, 80 deletions
diff --git a/src/bem/_block.scss b/src/bem/_block.scss index d065891..49af04b 100644 --- a/src/bem/_block.scss +++ b/src/bem/_block.scss | |||
@@ -4,6 +4,12 @@ | |||
4 | /// @access public | 4 | /// @access public |
5 | //// | 5 | //// |
6 | 6 | ||
7 | @use './validators'; | ||
8 | @use './vars'; | ||
9 | @use './functions' as bemfunctions; | ||
10 | @use '../functions'; | ||
11 | @use '../contexts'; | ||
12 | |||
7 | /// | 13 | /// |
8 | /// Generate a new block. | 14 | /// Generate a new block. |
9 | /// | 15 | /// |
@@ -20,7 +26,7 @@ | |||
20 | /// @throw If the block is preceded by another block, element, modifier or suffix | 26 | /// @throw If the block is preceded by another block, element, modifier or suffix |
21 | /// | 27 | /// |
22 | /// @example scss - Creating a new block | 28 | /// @example scss - Creating a new block |
23 | /// @include iro-bem-block('something', 'component') { | 29 | /// @include block('something', 'component') { |
24 | /// /* some definitions */ | 30 | /// /* some definitions */ |
25 | /// } | 31 | /// } |
26 | /// | 32 | /// |
@@ -30,12 +36,12 @@ | |||
30 | /// /* some definitions */ | 36 | /// /* some definitions */ |
31 | /// } | 37 | /// } |
32 | /// | 38 | /// |
33 | @mixin iro-bem-block($name, $type: null) { | 39 | @mixin block($name, $type: null) { |
34 | $result: iro-bem-block($name, $type); | 40 | $result: block($name, $type); |
35 | $selector: nth($result, 1); | 41 | $selector: nth($result, 1); |
36 | $context: nth($result, 2); | 42 | $context: nth($result, 2); |
37 | 43 | ||
38 | @include iro-bem-validate( | 44 | @include validators.validate( |
39 | 'block', | 45 | 'block', |
40 | (name: $name, type: $type), | 46 | (name: $name, type: $type), |
41 | $selector, | 47 | $selector, |
@@ -43,16 +49,16 @@ | |||
43 | ); | 49 | ); |
44 | 50 | ||
45 | @if $type != null { | 51 | @if $type != null { |
46 | $iro-bem-blocks: append($iro-bem-blocks, $name + '_' + $type) !global; | 52 | vars.$blocks: append(vars.$blocks, $name + '_' + $type); |
47 | } @else { | 53 | } @else { |
48 | $iro-bem-blocks: append($iro-bem-blocks, $name) !global; | 54 | vars.$blocks: append(vars.$blocks, $name); |
49 | } | 55 | } |
50 | 56 | ||
51 | @include iro-context-push($iro-bem-context-id, $context...); | 57 | @include contexts.push(vars.$context-id, $context...); |
52 | @at-root #{$selector} { | 58 | @at-root #{$selector} { |
53 | @content; | 59 | @content; |
54 | } | 60 | } |
55 | @include iro-context-pop($iro-bem-context-id); | 61 | @include contexts.pop(vars.$context-id); |
56 | } | 62 | } |
57 | 63 | ||
58 | /// | 64 | /// |
@@ -60,21 +66,21 @@ | |||
60 | /// | 66 | /// |
61 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 67 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
62 | /// | 68 | /// |
63 | /// @see {mixin} iro-bem-block | 69 | /// @see {mixin} block |
64 | /// | 70 | /// |
65 | @function iro-bem-block($name, $type: null) { | 71 | @function block($name, $type: null) { |
66 | // | 72 | // |
67 | // Possible outcomes: | 73 | // Possible outcomes: |
68 | // - ({b,e,m,s}) block | 74 | // - ({b,e,m,s}) block |
69 | // | 75 | // |
70 | 76 | ||
71 | $noop: iro-context-assert-stack-count($iro-bem-context-id, $iro-bem-max-depth); | 77 | $noop: contexts.assert-stack-count(vars.$context-id, vars.$max-depth); |
72 | 78 | ||
73 | $selector: null; | 79 | $selector: null; |
74 | $base-selector: null; | 80 | $base-selector: null; |
75 | 81 | ||
76 | @if $type != null { | 82 | @if $type != null { |
77 | $namespace: map-get($iro-bem-namespaces, $type); | 83 | $namespace: map-get(vars.$namespaces, $type); |
78 | 84 | ||
79 | @if not $namespace { | 85 | @if not $namespace { |
80 | @error '"#{$type}" is not a valid type.'; | 86 | @error '"#{$type}" is not a valid type.'; |
@@ -85,7 +91,7 @@ | |||
85 | @if $type != 'theme' or & { | 91 | @if $type != 'theme' or & { |
86 | $selector: $base-selector; | 92 | $selector: $base-selector; |
87 | } @else if not & { | 93 | } @else if not & { |
88 | $selector: iro-bem-theme-selector($name); | 94 | $selector: bemfunctions.theme-selector($name); |
89 | } | 95 | } |
90 | } @else { | 96 | } @else { |
91 | $base-selector: selector-parse('.' + $name); | 97 | $base-selector: selector-parse('.' + $name); |
@@ -107,14 +113,14 @@ | |||
107 | } | 113 | } |
108 | 114 | ||
109 | /// | 115 | /// |
110 | /// Generate a new object block. It's a shorthand for iro-bem-block($name, 'object'). | 116 | /// Generate a new object block. It's a shorthand for block($name, 'object'). |
111 | /// | 117 | /// |
112 | /// @param {string} $name - Object block name | 118 | /// @param {string} $name - Object block name |
113 | /// | 119 | /// |
114 | /// @content | 120 | /// @content |
115 | /// | 121 | /// |
116 | @mixin iro-bem-object($name) { | 122 | @mixin object($name) { |
117 | @include iro-bem-block($name, 'object') { | 123 | @include block($name, 'object') { |
118 | @content; | 124 | @content; |
119 | } | 125 | } |
120 | } | 126 | } |
@@ -124,21 +130,21 @@ | |||
124 | /// | 130 | /// |
125 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 131 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
126 | /// | 132 | /// |
127 | /// @see {mixin} iro-bem-object | 133 | /// @see {mixin} object |
128 | /// | 134 | /// |
129 | @function iro-bem-object($name) { | 135 | @function object($name) { |
130 | @return iro-bem-block($name, 'object'); | 136 | @return block($name, 'object'); |
131 | } | 137 | } |
132 | 138 | ||
133 | /// | 139 | /// |
134 | /// Generate a new component block. It's a shorthand for iro-bem-block($name, 'component'). | 140 | /// Generate a new component block. It's a shorthand for block($name, 'component'). |
135 | /// | 141 | /// |
136 | /// @param {string} $name - Component block name | 142 | /// @param {string} $name - Component block name |
137 | /// | 143 | /// |
138 | /// @content | 144 | /// @content |
139 | /// | 145 | /// |
140 | @mixin iro-bem-component($name) { | 146 | @mixin component($name) { |
141 | @include iro-bem-block($name, 'component') { | 147 | @include block($name, 'component') { |
142 | @content; | 148 | @content; |
143 | } | 149 | } |
144 | } | 150 | } |
@@ -148,21 +154,21 @@ | |||
148 | /// | 154 | /// |
149 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 155 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
150 | /// | 156 | /// |
151 | /// @see {mixin} iro-bem-component | 157 | /// @see {mixin} component |
152 | /// | 158 | /// |
153 | @function iro-bem-component($name) { | 159 | @function component($name) { |
154 | @return iro-bem-block($name, 'component'); | 160 | @return block($name, 'component'); |
155 | } | 161 | } |
156 | 162 | ||
157 | /// | 163 | /// |
158 | /// Generate a new layout block. It's a shorthand for iro-bem-block($name, 'layout'). | 164 | /// Generate a new layout block. It's a shorthand for block($name, 'layout'). |
159 | /// | 165 | /// |
160 | /// @param {string} $name - Layout block name | 166 | /// @param {string} $name - Layout block name |
161 | /// | 167 | /// |
162 | /// @content | 168 | /// @content |
163 | /// | 169 | /// |
164 | @mixin iro-bem-layout($name) { | 170 | @mixin layout($name) { |
165 | @include iro-bem-block($name, 'layout') { | 171 | @include block($name, 'layout') { |
166 | @content; | 172 | @content; |
167 | } | 173 | } |
168 | } | 174 | } |
@@ -172,21 +178,21 @@ | |||
172 | /// | 178 | /// |
173 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 179 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
174 | /// | 180 | /// |
175 | /// @see {mixin} iro-bem-layout | 181 | /// @see {mixin} layout |
176 | /// | 182 | /// |
177 | @function iro-bem-layout($name) { | 183 | @function layout($name) { |
178 | @return iro-bem-block($name, 'layout'); | 184 | @return block($name, 'layout'); |
179 | } | 185 | } |
180 | 186 | ||
181 | /// | 187 | /// |
182 | /// Generate a new utility block. It's a shorthand for iro-bem-block($name, 'utility'). | 188 | /// Generate a new utility block. It's a shorthand for block($name, 'utility'). |
183 | /// | 189 | /// |
184 | /// @param {string} $name - Utility block name | 190 | /// @param {string} $name - Utility block name |
185 | /// | 191 | /// |
186 | /// @content | 192 | /// @content |
187 | /// | 193 | /// |
188 | @mixin iro-bem-utility($name) { | 194 | @mixin utility($name) { |
189 | @include iro-bem-block($name, 'utility') { | 195 | @include block($name, 'utility') { |
190 | @content; | 196 | @content; |
191 | } | 197 | } |
192 | } | 198 | } |
@@ -196,21 +202,21 @@ | |||
196 | /// | 202 | /// |
197 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 203 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
198 | /// | 204 | /// |
199 | /// @see {mixin} iro-bem-utility | 205 | /// @see {mixin} utility |
200 | /// | 206 | /// |
201 | @function iro-bem-utility($name) { | 207 | @function utility($name) { |
202 | @return iro-bem-block($name, 'utility'); | 208 | @return block($name, 'utility'); |
203 | } | 209 | } |
204 | 210 | ||
205 | /// | 211 | /// |
206 | /// Generate a new scope block. It's a shorthand for iro-bem-block($name, 'scope'). | 212 | /// Generate a new scope block. It's a shorthand for block($name, 'scope'). |
207 | /// | 213 | /// |
208 | /// @param {string} $name - Scope block name | 214 | /// @param {string} $name - Scope block name |
209 | /// | 215 | /// |
210 | /// @content | 216 | /// @content |
211 | /// | 217 | /// |
212 | @mixin iro-bem-scope($name) { | 218 | @mixin scope($name) { |
213 | @include iro-bem-block($name, 'scope') { | 219 | @include block($name, 'scope') { |
214 | @content; | 220 | @content; |
215 | } | 221 | } |
216 | } | 222 | } |
@@ -220,21 +226,21 @@ | |||
220 | /// | 226 | /// |
221 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 227 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
222 | /// | 228 | /// |
223 | /// @see {mixin} iro-bem-scope | 229 | /// @see {mixin} scope |
224 | /// | 230 | /// |
225 | @function iro-bem-scope($name) { | 231 | @function scope($name) { |
226 | @return iro-bem-block($name, 'scope'); | 232 | @return block($name, 'scope'); |
227 | } | 233 | } |
228 | 234 | ||
229 | /// | 235 | /// |
230 | /// Generate a new theme block. It's a shorthand for iro-bem-block($name, 'theme'). | 236 | /// Generate a new theme block. It's a shorthand for block($name, 'theme'). |
231 | /// | 237 | /// |
232 | /// @param {string} $name - Theme block name | 238 | /// @param {string} $name - Theme block name |
233 | /// | 239 | /// |
234 | /// @content | 240 | /// @content |
235 | /// | 241 | /// |
236 | @mixin iro-bem-theme($name) { | 242 | @mixin theme($name) { |
237 | @include iro-bem-block($name, 'theme') { | 243 | @include block($name, 'theme') { |
238 | @content; | 244 | @content; |
239 | } | 245 | } |
240 | } | 246 | } |
@@ -244,21 +250,21 @@ | |||
244 | /// | 250 | /// |
245 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 251 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
246 | /// | 252 | /// |
247 | /// @see {mixin} iro-bem-theme | 253 | /// @see {mixin} theme |
248 | /// | 254 | /// |
249 | @function iro-bem-theme($name) { | 255 | @function theme($name) { |
250 | @return iro-bem-block($name, 'theme'); | 256 | @return block($name, 'theme'); |
251 | } | 257 | } |
252 | 258 | ||
253 | /// | 259 | /// |
254 | /// Generate a new JS block. It's a shorthand for iro-bem-block($name, 'js'). | 260 | /// Generate a new JS block. It's a shorthand for block($name, 'js'). |
255 | /// | 261 | /// |
256 | /// @param {string} $name - JS block name | 262 | /// @param {string} $name - JS block name |
257 | /// | 263 | /// |
258 | /// @content | 264 | /// @content |
259 | /// | 265 | /// |
260 | @mixin iro-bem-js($name) { | 266 | @mixin js($name) { |
261 | @include iro-bem-block($name, 'js') { | 267 | @include block($name, 'js') { |
262 | @content; | 268 | @content; |
263 | } | 269 | } |
264 | } | 270 | } |
@@ -268,21 +274,21 @@ | |||
268 | /// | 274 | /// |
269 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 275 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
270 | /// | 276 | /// |
271 | /// @see {mixin} iro-bem-js | 277 | /// @see {mixin} js |
272 | /// | 278 | /// |
273 | @function iro-bem-js($name) { | 279 | @function js($name) { |
274 | @return iro-bem-block($name, 'js'); | 280 | @return block($name, 'js'); |
275 | } | 281 | } |
276 | 282 | ||
277 | /// | 283 | /// |
278 | /// Generate a new QA block. It's a shorthand for iro-bem-block($name, 'qa'). | 284 | /// Generate a new QA block. It's a shorthand for block($name, 'qa'). |
279 | /// | 285 | /// |
280 | /// @param {string} $name - QA block name | 286 | /// @param {string} $name - QA block name |
281 | /// | 287 | /// |
282 | /// @content | 288 | /// @content |
283 | /// | 289 | /// |
284 | @mixin iro-bem-qa($name) { | 290 | @mixin qa($name) { |
285 | @include iro-bem-block($name, 'qa') { | 291 | @include block($name, 'qa') { |
286 | @content; | 292 | @content; |
287 | } | 293 | } |
288 | } | 294 | } |
@@ -292,21 +298,21 @@ | |||
292 | /// | 298 | /// |
293 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 299 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
294 | /// | 300 | /// |
295 | /// @see {mixin} iro-bem-qa | 301 | /// @see {mixin} qa |
296 | /// | 302 | /// |
297 | @function iro-bem-qa($name) { | 303 | @function qa($name) { |
298 | @return iro-bem-block($name, 'qa'); | 304 | @return block($name, 'qa'); |
299 | } | 305 | } |
300 | 306 | ||
301 | /// | 307 | /// |
302 | /// Generate a new hack block. It's a shorthand for iro-bem-block($name, 'hack'). | 308 | /// Generate a new hack block. It's a shorthand for block($name, 'hack'). |
303 | /// | 309 | /// |
304 | /// @param {string} $name - Hack block name | 310 | /// @param {string} $name - Hack block name |
305 | /// | 311 | /// |
306 | /// @content | 312 | /// @content |
307 | /// | 313 | /// |
308 | @mixin iro-bem-hack($name) { | 314 | @mixin hack($name) { |
309 | @include iro-bem-block($name, 'hack') { | 315 | @include block($name, 'hack') { |
310 | @content; | 316 | @content; |
311 | } | 317 | } |
312 | } | 318 | } |
@@ -316,10 +322,10 @@ | |||
316 | /// | 322 | /// |
317 | /// @return {list} A list with two items: 1. selector, 2. context or `null` | 323 | /// @return {list} A list with two items: 1. selector, 2. context or `null` |
318 | /// | 324 | /// |
319 | /// @see {mixin} iro-bem-hack | 325 | /// @see {mixin} hack |
320 | /// | 326 | /// |
321 | @function iro-bem-hack($name) { | 327 | @function hack($name) { |
322 | @return iro-bem-block($name, 'hack'); | 328 | @return block($name, 'hack'); |
323 | } | 329 | } |
324 | 330 | ||
325 | /// | 331 | /// |
@@ -337,15 +343,15 @@ | |||
337 | /// @throw If a block doesn't exist | 343 | /// @throw If a block doesn't exist |
338 | /// | 344 | /// |
339 | /// @example scss - Successful assertion | 345 | /// @example scss - Successful assertion |
340 | /// @include iro-bem-component('someBlock') { | 346 | /// @include component('someBlock') { |
341 | /// /* some definitions */ | 347 | /// /* some definitions */ |
342 | /// } | 348 | /// } |
343 | /// | 349 | /// |
344 | /// @include iro-bem-component('anotherBlock') { | 350 | /// @include component('anotherBlock') { |
345 | /// /* some definitions */ | 351 | /// /* some definitions */ |
346 | /// | 352 | /// |
347 | /// @include iro-bem-element('elem') { | 353 | /// @include elem('elem') { |
348 | /// @include iro-bem-composed-of('someBlock' 'component'); | 354 | /// @include composed-of('someBlock' 'component'); |
349 | /// | 355 | /// |
350 | /// /* some definitions */ | 356 | /// /* some definitions */ |
351 | /// } | 357 | /// } |
@@ -354,37 +360,37 @@ | |||
354 | /// // Intended use: <div class="c-anotherBlock__elem c-someBlock">...</div> | 360 | /// // Intended use: <div class="c-anotherBlock__elem c-someBlock">...</div> |
355 | /// | 361 | /// |
356 | /// @example scss - Failing assertion | 362 | /// @example scss - Failing assertion |
357 | /// @include iro-bem-component('anotherBlock') { | 363 | /// @include component('anotherBlock') { |
358 | /// /* some definitions */ | 364 | /// /* some definitions */ |
359 | /// | 365 | /// |
360 | /// @include iro-bem-element('elem') { | 366 | /// @include elem('elem') { |
361 | /// @include iro-bem-composed-of('someBlock' 'component'); | 367 | /// @include composed-of('someBlock' 'component'); |
362 | /// | 368 | /// |
363 | /// /* some definitions */ | 369 | /// /* some definitions */ |
364 | /// } | 370 | /// } |
365 | /// } | 371 | /// } |
366 | /// | 372 | /// |
367 | /// @include iro-bem-component('someBlock') { | 373 | /// @include component('someBlock') { |
368 | /// /* some definitions */ | 374 | /// /* some definitions */ |
369 | /// } | 375 | /// } |
370 | /// | 376 | /// |
371 | /// // Compilation will fail because c-someBlock is defined after c-anotherBlock__elem | 377 | /// // Compilation will fail because c-someBlock is defined after c-anotherBlock__elem |
372 | /// | 378 | /// |
373 | @mixin iro-bem-composed-of($block, $blocks...) { | 379 | @mixin composed-of($block, $blocks...) { |
374 | @each $block in iro-list-prepend($blocks, $block) { | 380 | @each $block in functions.list-prepend($blocks, $block) { |
375 | @if type-of($block) == string { | 381 | @if type-of($block) == string { |
376 | @if not index($iro-bem-blocks, $block) { | 382 | @if not index(vars.$blocks, $block) { |
377 | @error 'Block "#{$block}" does not exist.'; | 383 | @error 'Block "#{$block}" does not exist.'; |
378 | } | 384 | } |
379 | } @else { | 385 | } @else { |
380 | $name: nth($block, 1); | 386 | $name: nth($block, 1); |
381 | $type: nth($block, 2); | 387 | $type: nth($block, 2); |
382 | 388 | ||
383 | @if not map-get($iro-bem-namespaces, $type) { | 389 | @if not map-get(vars.$namespaces, $type) { |
384 | @error '"#{$type}" is not a valid type.'; | 390 | @error '"#{$type}" is not a valid type.'; |
385 | } | 391 | } |
386 | 392 | ||
387 | @if not index($iro-bem-blocks, $name + '_' + $type) { | 393 | @if not index(vars.$blocks, $name + '_' + $type) { |
388 | @error 'Block "#{$name}" does not exist.'; | 394 | @error 'Block "#{$name}" does not exist.'; |
389 | } | 395 | } |
390 | } | 396 | } |