aboutsummaryrefslogtreecommitdiffstats
path: root/src/_contexts.scss
diff options
context:
space:
mode:
Diffstat (limited to 'src/_contexts.scss')
-rw-r--r--src/_contexts.scss114
1 files changed, 67 insertions, 47 deletions
diff --git a/src/_contexts.scss b/src/_contexts.scss
index 9fe0e8c..8542056 100644
--- a/src/_contexts.scss
+++ b/src/_contexts.scss
@@ -5,16 +5,18 @@
5/// It's an essential part for the BEM-related mixins. 5/// It's an essential part for the BEM-related mixins.
6/// 6///
7/// If you want to create a new context, the easiest pattern is to create a new mixin and wrap 7/// If you want to create a new context, the easiest pattern is to create a new mixin and wrap
8/// the @content between a pair of iro-context-push and iro-context-pop. 8/// the @content between a pair of push and pop.
9/// From within the @content, you can access the context's data with iro-context-get. 9/// From within the @content, you can access the context's data with get.
10/// To make the compilation fail if a certain nesting order is violated, use 10/// To make the compilation fail if a certain nesting order is violated, use
11/// iro-context-assert-stack-must-contain and iro-context-assert-stack-must-not-contain. 11/// assert-stack-must-contain and assert-stack-must-not-contain.
12/// 12///
13/// @group Contexts 13/// @group Contexts
14/// 14///
15/// @access public 15/// @access public
16//// 16////
17 17
18@use './functions';
19
18/// 20///
19/// Map of all context stacks. 21/// Map of all context stacks.
20/// 22///
@@ -22,7 +24,7 @@
22/// 24///
23/// @access private 25/// @access private
24/// 26///
25$iro-context-stacks: (); 27$stacks: ();
26 28
27/// 29///
28/// Create a new context stack. 30/// Create a new context stack.
@@ -31,8 +33,8 @@ $iro-context-stacks: ();
31/// 33///
32/// @throw If context stack already exists 34/// @throw If context stack already exists
33/// 35///
34@mixin iro-context-stack-create($stack-id) { 36@mixin create($stack-id) {
35 $noop: iro-context-stack-create($stack-id); 37 $noop: create($stack-id);
36} 38}
37 39
38/// 40///
@@ -40,12 +42,12 @@ $iro-context-stacks: ();
40/// 42///
41/// @param {string} $stack-id - ID of context stack 43/// @param {string} $stack-id - ID of context stack
42/// 44///
43@function iro-context-stack-create($stack-id) { 45@function create($stack-id) {
44 @if map-has-key($iro-context-stacks, $stack-id) { 46 @if map-has-key($stacks, $stack-id) {
45 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 47 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
46 } 48 }
47 49
48 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: ())) !global; 50 $stacks: map-merge($stacks, ($stack-id: ())) !global;
49 51
50 @return null; 52 @return null;
51} 53}
@@ -55,8 +57,8 @@ $iro-context-stacks: ();
55/// 57///
56/// @param {string} $stack-id - ID of context stack 58/// @param {string} $stack-id - ID of context stack
57/// 59///
58@mixin iro-context-stack-clear($stack-id) { 60@mixin clear($stack-id) {
59 $noop: iro-context-stack-clear($stack-id); 61 $noop: clear($stack-id);
60} 62}
61 63
62/// 64///
@@ -64,13 +66,13 @@ $iro-context-stacks: ();
64/// 66///
65/// @param {string} $stack-id - ID of context stack 67/// @param {string} $stack-id - ID of context stack
66/// 68///
67@function iro-context-stack-clear($stack-id) { 69@function clear($stack-id) {
68 @if not map-has-key($iro-context-stacks, $stack-id) { 70 @if not map-has-key($stacks, $stack-id) {
69 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 71 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
70 } 72 }
71 73
72 $context-stack: (); 74 $context-stack: ();
73 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global; 75 $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global;
74 76
75 @return null; 77 @return null;
76} 78}
@@ -80,8 +82,8 @@ $iro-context-stacks: ();
80/// 82///
81/// @param {string} $stack-id - ID of context stack 83/// @param {string} $stack-id - ID of context stack
82/// 84///
83@mixin iro-context-stack-delete($stack-id) { 85@mixin delete($stack-id) {
84 $noop: iro-context-stack-delete($stack-id); 86 $noop: delete($stack-id);
85} 87}
86 88
87/// 89///
@@ -89,12 +91,12 @@ $iro-context-stacks: ();
89/// 91///
90/// @param {string} $stack-id - ID of context stack 92/// @param {string} $stack-id - ID of context stack
91/// 93///
92@function iro-context-stack-delete($stack-id) { 94@function delete($stack-id) {
93 @if not map-has-key($iro-context-stacks, $stack-id) { 95 @if not map-has-key($stacks, $stack-id) {
94 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 96 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
95 } 97 }
96 98
97 $iro-context-stacks: map-remove($iro-context-stacks, $stack-id) !global; 99 $stacks: map-remove($stacks, $stack-id) !global;
98 100
99 @return null; 101 @return null;
100} 102}
@@ -106,8 +108,8 @@ $iro-context-stacks: ();
106/// @param {string} $id - ID of new context 108/// @param {string} $id - ID of new context
107/// @param {any} $data [()] - Data that belongs to the context 109/// @param {any} $data [()] - Data that belongs to the context
108/// 110///
109@mixin iro-context-push($stack-id, $id, $data: ()) { 111@mixin push($stack-id, $id, $data: ()) {
110 $noop: iro-context-push($stack-id, $id, $data); 112 $noop: push($stack-id, $id, $data);
111} 113}
112 114
113/// 115///
@@ -119,15 +121,15 @@ $iro-context-stacks: ();
119/// 121///
120/// @return {list} A list with two items: 1 = context id, 2 = context data 122/// @return {list} A list with two items: 1 = context id, 2 = context data
121/// 123///
122@function iro-context-push($stack-id, $id, $data: ()) { 124@function push($stack-id, $id, $data: ()) {
123 @if not map-has-key($iro-context-stacks, $stack-id) { 125 @if not map-has-key($stacks, $stack-id) {
124 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 126 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
125 } 127 }
126 128
127 $context: $id $data; 129 $context: $id $data;
128 $context-stack: map-get($iro-context-stacks, $stack-id); 130 $context-stack: map-get($stacks, $stack-id);
129 $context-stack: append($context-stack, $context); 131 $context-stack: append($context-stack, $context);
130 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global; 132 $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global;
131 133
132 @return $context; 134 @return $context;
133} 135}
@@ -139,8 +141,8 @@ $iro-context-stacks: ();
139/// 141///
140/// @throw If context stack doesn't exist 142/// @throw If context stack doesn't exist
141/// 143///
142@mixin iro-context-pop($stack-id) { 144@mixin pop($stack-id) {
143 $noop: iro-context-pop($stack-id); 145 $noop: pop($stack-id);
144} 146}
145 147
146/// 148///
@@ -150,12 +152,12 @@ $iro-context-stacks: ();
150/// 152///
151/// @return {list} A list with two items: 1 = context id, 2 = context data 153/// @return {list} A list with two items: 1 = context id, 2 = context data
152/// 154///
153@function iro-context-pop($stack-id) { 155@function pop($stack-id) {
154 @if not map-has-key($iro-context-stacks, $stack-id) { 156 @if not map-has-key($stacks, $stack-id) {
155 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 157 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
156 } 158 }
157 159
158 $context-stack: map-get($iro-context-stacks, $stack-id); 160 $context-stack: map-get($stacks, $stack-id);
159 161
160 @if length($context-stack) == 0 { 162 @if length($context-stack) == 0 {
161 @error 'Context stack "#{inspect($stack-id)}" is already empty.'; 163 @error 'Context stack "#{inspect($stack-id)}" is already empty.';
@@ -166,10 +168,10 @@ $iro-context-stacks: ();
166 @if length($context-stack) == 1 { 168 @if length($context-stack) == 1 {
167 $context-stack: (); 169 $context-stack: ();
168 } @else { 170 } @else {
169 $context-stack: iro-list-slice($context-stack, 1, length($context-stack) - 1); 171 $context-stack: functions.list-slice($context-stack, 1, length($context-stack) - 1);
170 } 172 }
171 173
172 $iro-context-stacks: map-merge($iro-context-stacks, ($stack-id: $context-stack)) !global; 174 $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global;
173 175
174 @return $popped-context; 176 @return $popped-context;
175} 177}
@@ -183,10 +185,16 @@ $iro-context-stacks: ();
183/// 185///
184/// @throw If assertion fails 186/// @throw If assertion fails
185/// 187///
186@mixin iro-context-assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) { 188@function assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) {
187 @if not iro-context-stack-contains($stack-id, $context-ids, $check-head-only) { 189 @if not contains($stack-id, $context-ids, $check-head-only) {
188 @error 'Must be called inside of contexts "#{inspect($context-ids)}".'; 190 @error 'Must be called inside of contexts "#{inspect($context-ids)}".';
189 } 191 }
192
193 @return null;
194}
195
196@mixin assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) {
197 $noop: assert-stack-must-contain($stack-id, $context-ids, $check-head-only)
190} 198}
191 199
192/// 200///
@@ -198,10 +206,16 @@ $iro-context-stacks: ();
198/// 206///
199/// @throw If assertion fails 207/// @throw If assertion fails
200/// 208///
201@mixin iro-context-assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) { 209@function assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) {
202 @if iro-context-stack-contains($stack-id, $context-ids, $check-head-only) { 210 @if contains($stack-id, $context-ids, $check-head-only) {
203 @error 'Must not be called inside of contexts "#{inspect($context-ids)}".'; 211 @error 'Must not be called inside of contexts "#{inspect($context-ids)}".';
204 } 212 }
213
214 @return null;
215}
216
217@mixin assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) {
218 $noop: assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only);
205} 219}
206 220
207/// 221///
@@ -213,12 +227,12 @@ $iro-context-stacks: ();
213/// 227///
214/// @return {bool} `true` if the context stack contains one of the context IDs, otherwise `false` 228/// @return {bool} `true` if the context stack contains one of the context IDs, otherwise `false`
215/// 229///
216@function iro-context-stack-contains($stack-id, $context-ids, $check-head-only: false) { 230@function contains($stack-id, $context-ids, $check-head-only: false) {
217 @if not map-has-key($iro-context-stacks, $stack-id) { 231 @if not map-has-key($stacks, $stack-id) {
218 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 232 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
219 } 233 }
220 234
221 $context-stack: map-get($iro-context-stacks, $stack-id); 235 $context-stack: map-get($stacks, $stack-id);
222 236
223 @if length($context-stack) == 0 { 237 @if length($context-stack) == 0 {
224 @return false; 238 @return false;
@@ -247,10 +261,16 @@ $iro-context-stacks: ();
247/// 261///
248/// @throw If assertion fails 262/// @throw If assertion fails
249/// 263///
250@mixin iro-context-assert-stack-count($stack-id, $max-count) { 264@function assert-stack-count($stack-id, $max-count) {
251 @if iro-context-stack-count($stack-id) > $max-count { 265 @if count($stack-id) > $max-count {
252 @error 'Maximum context count "#{inspect($max-count)}" exceeded.'; 266 @error 'Maximum context count "#{inspect($max-count)}" exceeded.';
253 } 267 }
268
269 @return null;
270}
271
272@mixin assert-stack-count($stack-id, $max-count) {
273 $noop: assert-stack-count($stack-id, $max-count);
254} 274}
255 275
256/// 276///
@@ -260,12 +280,12 @@ $iro-context-stacks: ();
260/// 280///
261/// @return {number} The number of contexts 281/// @return {number} The number of contexts
262/// 282///
263@function iro-context-stack-count($stack-id) { 283@function count($stack-id) {
264 @if not map-has-key($iro-context-stacks, $stack-id) { 284 @if not map-has-key($stacks, $stack-id) {
265 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 285 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
266 } 286 }
267 287
268 $context-stack: map-get($iro-context-stacks, $stack-id); 288 $context-stack: map-get($stacks, $stack-id);
269 289
270 @return length($context-stack); 290 @return length($context-stack);
271} 291}
@@ -278,12 +298,12 @@ $iro-context-stacks: ();
278/// 298///
279/// @return {list} Null if no match was found, otherwise a list with two items: 1. context ID, 2. context data. 299/// @return {list} Null if no match was found, otherwise a list with two items: 1. context ID, 2. context data.
280/// 300///
281@function iro-context-get($stack-id, $type-or-level: null) { 301@function get($stack-id, $type-or-level: null) {
282 @if not map-has-key($iro-context-stacks, $stack-id) { 302 @if not map-has-key($stacks, $stack-id) {
283 @error 'Context stack "#{inspect($stack-id)}" does not exist.'; 303 @error 'Context stack "#{inspect($stack-id)}" does not exist.';
284 } 304 }
285 305
286 $context-stack: map-get($iro-context-stacks, $stack-id); 306 $context-stack: map-get($stacks, $stack-id);
287 307
288 @if length($context-stack) == 0 { 308 @if length($context-stack) == 0 {
289 @return null; 309 @return null;