diff options
Diffstat (limited to 'src/_contexts.scss')
-rw-r--r-- | src/_contexts.scss | 217 |
1 files changed, 110 insertions, 107 deletions
diff --git a/src/_contexts.scss b/src/_contexts.scss index 7ffbb4e..ed376a2 100644 --- a/src/_contexts.scss +++ b/src/_contexts.scss | |||
@@ -15,6 +15,9 @@ | |||
15 | /// @access public | 15 | /// @access public |
16 | //// | 16 | //// |
17 | 17 | ||
18 | @use 'sass:list'; | ||
19 | @use 'sass:map'; | ||
20 | @use 'sass:meta'; | ||
18 | @use './functions'; | 21 | @use './functions'; |
19 | 22 | ||
20 | /// | 23 | /// |
@@ -34,7 +37,7 @@ $stacks: (); | |||
34 | /// @throw If context stack already exists | 37 | /// @throw If context stack already exists |
35 | /// | 38 | /// |
36 | @mixin create($stack-id) { | 39 | @mixin create($stack-id) { |
37 | $noop: create($stack-id); | 40 | $noop: create($stack-id); |
38 | } | 41 | } |
39 | 42 | ||
40 | /// | 43 | /// |
@@ -43,13 +46,13 @@ $stacks: (); | |||
43 | /// @param {string} $stack-id - ID of context stack | 46 | /// @param {string} $stack-id - ID of context stack |
44 | /// | 47 | /// |
45 | @function create($stack-id) { | 48 | @function create($stack-id) { |
46 | @if map-has-key($stacks, $stack-id) { | 49 | @if map.has-key($stacks, $stack-id) { |
47 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 50 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
48 | } | 51 | } |
49 | 52 | ||
50 | $stacks: map-merge($stacks, ($stack-id: ())) !global; | 53 | $stacks: map.merge($stacks, ($stack-id: ())) !global; |
51 | 54 | ||
52 | @return null; | 55 | @return null; |
53 | } | 56 | } |
54 | 57 | ||
55 | /// | 58 | /// |
@@ -58,7 +61,7 @@ $stacks: (); | |||
58 | /// @param {string} $stack-id - ID of context stack | 61 | /// @param {string} $stack-id - ID of context stack |
59 | /// | 62 | /// |
60 | @mixin clear($stack-id) { | 63 | @mixin clear($stack-id) { |
61 | $noop: clear($stack-id); | 64 | $noop: clear($stack-id); |
62 | } | 65 | } |
63 | 66 | ||
64 | /// | 67 | /// |
@@ -67,14 +70,14 @@ $stacks: (); | |||
67 | /// @param {string} $stack-id - ID of context stack | 70 | /// @param {string} $stack-id - ID of context stack |
68 | /// | 71 | /// |
69 | @function clear($stack-id) { | 72 | @function clear($stack-id) { |
70 | @if not map-has-key($stacks, $stack-id) { | 73 | @if not map.has-key($stacks, $stack-id) { |
71 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 74 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
72 | } | 75 | } |
73 | 76 | ||
74 | $context-stack: (); | 77 | $context-stack: (); |
75 | $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global; | 78 | $stacks: map.merge($stacks, ($stack-id: $context-stack)) !global; |
76 | 79 | ||
77 | @return null; | 80 | @return null; |
78 | } | 81 | } |
79 | 82 | ||
80 | /// | 83 | /// |
@@ -83,7 +86,7 @@ $stacks: (); | |||
83 | /// @param {string} $stack-id - ID of context stack | 86 | /// @param {string} $stack-id - ID of context stack |
84 | /// | 87 | /// |
85 | @mixin delete($stack-id) { | 88 | @mixin delete($stack-id) { |
86 | $noop: delete($stack-id); | 89 | $noop: delete($stack-id); |
87 | } | 90 | } |
88 | 91 | ||
89 | /// | 92 | /// |
@@ -92,13 +95,13 @@ $stacks: (); | |||
92 | /// @param {string} $stack-id - ID of context stack | 95 | /// @param {string} $stack-id - ID of context stack |
93 | /// | 96 | /// |
94 | @function delete($stack-id) { | 97 | @function delete($stack-id) { |
95 | @if not map-has-key($stacks, $stack-id) { | 98 | @if not map.has-key($stacks, $stack-id) { |
96 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 99 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
97 | } | 100 | } |
98 | 101 | ||
99 | $stacks: map-remove($stacks, $stack-id) !global; | 102 | $stacks: map.remove($stacks, $stack-id) !global; |
100 | 103 | ||
101 | @return null; | 104 | @return null; |
102 | } | 105 | } |
103 | 106 | ||
104 | /// | 107 | /// |
@@ -109,7 +112,7 @@ $stacks: (); | |||
109 | /// @param {any} $data [()] - Data that belongs to the context | 112 | /// @param {any} $data [()] - Data that belongs to the context |
110 | /// | 113 | /// |
111 | @mixin push($stack-id, $id, $data: ()) { | 114 | @mixin push($stack-id, $id, $data: ()) { |
112 | $noop: push($stack-id, $id, $data); | 115 | $noop: push($stack-id, $id, $data); |
113 | } | 116 | } |
114 | 117 | ||
115 | /// | 118 | /// |
@@ -122,16 +125,16 @@ $stacks: (); | |||
122 | /// @return {list} A list with two items: 1 = context id, 2 = context data | 125 | /// @return {list} A list with two items: 1 = context id, 2 = context data |
123 | /// | 126 | /// |
124 | @function push($stack-id, $id, $data: ()) { | 127 | @function push($stack-id, $id, $data: ()) { |
125 | @if not map-has-key($stacks, $stack-id) { | 128 | @if not map.has-key($stacks, $stack-id) { |
126 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 129 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
127 | } | 130 | } |
128 | 131 | ||
129 | $context: $id $data; | 132 | $context: $id $data; |
130 | $context-stack: map-get($stacks, $stack-id); | 133 | $context-stack: map.get($stacks, $stack-id); |
131 | $context-stack: append($context-stack, $context); | 134 | $context-stack: list.append($context-stack, $context); |
132 | $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global; | 135 | $stacks: map.merge($stacks, ($stack-id: $context-stack)) !global; |
133 | 136 | ||
134 | @return $context; | 137 | @return $context; |
135 | } | 138 | } |
136 | 139 | ||
137 | /// | 140 | /// |
@@ -142,7 +145,7 @@ $stacks: (); | |||
142 | /// @throw If context stack doesn't exist | 145 | /// @throw If context stack doesn't exist |
143 | /// | 146 | /// |
144 | @mixin pop($stack-id) { | 147 | @mixin pop($stack-id) { |
145 | $noop: pop($stack-id); | 148 | $noop: pop($stack-id); |
146 | } | 149 | } |
147 | 150 | ||
148 | /// | 151 | /// |
@@ -153,27 +156,27 @@ $stacks: (); | |||
153 | /// @return {list} A list with two items: 1 = context id, 2 = context data | 156 | /// @return {list} A list with two items: 1 = context id, 2 = context data |
154 | /// | 157 | /// |
155 | @function pop($stack-id) { | 158 | @function pop($stack-id) { |
156 | @if not map-has-key($stacks, $stack-id) { | 159 | @if not map.has-key($stacks, $stack-id) { |
157 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 160 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
158 | } | 161 | } |
159 | 162 | ||
160 | $context-stack: map-get($stacks, $stack-id); | 163 | $context-stack: map.get($stacks, $stack-id); |
161 | 164 | ||
162 | @if length($context-stack) == 0 { | 165 | @if list.length($context-stack) == 0 { |
163 | @error 'Context stack "#{inspect($stack-id)}" is already empty.'; | 166 | @error 'Context stack "#{inspect($stack-id)}" is already empty.'; |
164 | } | 167 | } |
165 | 168 | ||
166 | $popped-context: nth($context-stack, -1); | 169 | $popped-context: list.nth($context-stack, -1); |
167 | 170 | ||
168 | @if length($context-stack) == 1 { | 171 | @if list.length($context-stack) == 1 { |
169 | $context-stack: (); | 172 | $context-stack: (); |
170 | } @else { | 173 | } @else { |
171 | $context-stack: functions.list-slice($context-stack, 1, length($context-stack) - 1); | 174 | $context-stack: functions.list-slice($context-stack, 1, list.length($context-stack) - 1); |
172 | } | 175 | } |
173 | 176 | ||
174 | $stacks: map-merge($stacks, ($stack-id: $context-stack)) !global; | 177 | $stacks: map.merge($stacks, ($stack-id: $context-stack)) !global; |
175 | 178 | ||
176 | @return $popped-context; | 179 | @return $popped-context; |
177 | } | 180 | } |
178 | 181 | ||
179 | /// | 182 | /// |
@@ -186,15 +189,15 @@ $stacks: (); | |||
186 | /// @throw If assertion fails | 189 | /// @throw If assertion fails |
187 | /// | 190 | /// |
188 | @function assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) { | 191 | @function assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) { |
189 | @if not contains($stack-id, $context-ids, $check-head-only) { | 192 | @if not contains($stack-id, $context-ids, $check-head-only) { |
190 | @error 'Must be called inside of contexts "#{inspect($context-ids)}".'; | 193 | @error 'Must be called inside of contexts "#{inspect($context-ids)}".'; |
191 | } | 194 | } |
192 | 195 | ||
193 | @return null; | 196 | @return null; |
194 | } | 197 | } |
195 | 198 | ||
196 | @mixin assert-stack-must-contain($stack-id, $context-ids, $check-head-only: false) { | 199 | @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); | 200 | $noop: assert-stack-must-contain($stack-id, $context-ids, $check-head-only); |
198 | } | 201 | } |
199 | 202 | ||
200 | /// | 203 | /// |
@@ -207,15 +210,15 @@ $stacks: (); | |||
207 | /// @throw If assertion fails | 210 | /// @throw If assertion fails |
208 | /// | 211 | /// |
209 | @function assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) { | 212 | @function assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) { |
210 | @if contains($stack-id, $context-ids, $check-head-only) { | 213 | @if contains($stack-id, $context-ids, $check-head-only) { |
211 | @error 'Must not be called inside of contexts "#{inspect($context-ids)}".'; | 214 | @error 'Must not be called inside of contexts "#{inspect($context-ids)}".'; |
212 | } | 215 | } |
213 | 216 | ||
214 | @return null; | 217 | @return null; |
215 | } | 218 | } |
216 | 219 | ||
217 | @mixin assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only: false) { | 220 | @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); | 221 | $noop: assert-stack-must-not-contain($stack-id, $context-ids, $check-head-only); |
219 | } | 222 | } |
220 | 223 | ||
221 | /// | 224 | /// |
@@ -228,29 +231,29 @@ $stacks: (); | |||
228 | /// @return {bool} `true` if the context stack contains one of the context IDs, otherwise `false` | 231 | /// @return {bool} `true` if the context stack contains one of the context IDs, otherwise `false` |
229 | /// | 232 | /// |
230 | @function contains($stack-id, $context-ids, $check-head-only: false) { | 233 | @function contains($stack-id, $context-ids, $check-head-only: false) { |
231 | @if not map-has-key($stacks, $stack-id) { | 234 | @if not map.has-key($stacks, $stack-id) { |
232 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 235 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
233 | } | 236 | } |
234 | 237 | ||
235 | $context-stack: map-get($stacks, $stack-id); | 238 | $context-stack: map.get($stacks, $stack-id); |
236 | 239 | ||
237 | @if length($context-stack) == 0 { | 240 | @if list.length($context-stack) == 0 { |
238 | @return false; | 241 | @return false; |
239 | } | 242 | } |
240 | 243 | ||
241 | $end-idx: if($check-head-only, length($context-stack), 1); | 244 | $end-idx: if($check-head-only, list.length($context-stack), 1); |
242 | 245 | ||
243 | @for $i from length($context-stack) through $end-idx { | 246 | @for $i from list.length($context-stack) through $end-idx { |
244 | $context: nth($context-stack, $i); | 247 | $context: list.nth($context-stack, $i); |
245 | 248 | ||
246 | @each $chk-context in $context-ids { | 249 | @each $chk-context in $context-ids { |
247 | @if nth($context, 1) == $chk-context { | 250 | @if list.nth($context, 1) == $chk-context { |
248 | @return true; | 251 | @return true; |
249 | } | 252 | } |
250 | } | 253 | } |
251 | } | 254 | } |
252 | 255 | ||
253 | @return false; | 256 | @return false; |
254 | } | 257 | } |
255 | 258 | ||
256 | /// | 259 | /// |
@@ -262,15 +265,15 @@ $stacks: (); | |||
262 | /// @throw If assertion fails | 265 | /// @throw If assertion fails |
263 | /// | 266 | /// |
264 | @function assert-stack-count($stack-id, $max-count) { | 267 | @function assert-stack-count($stack-id, $max-count) { |
265 | @if count($stack-id) > $max-count { | 268 | @if count($stack-id) > $max-count { |
266 | @error 'Maximum context count "#{inspect($max-count)}" exceeded.'; | 269 | @error 'Maximum context count "#{inspect($max-count)}" exceeded.'; |
267 | } | 270 | } |
268 | 271 | ||
269 | @return null; | 272 | @return null; |
270 | } | 273 | } |
271 | 274 | ||
272 | @mixin assert-stack-count($stack-id, $max-count) { | 275 | @mixin assert-stack-count($stack-id, $max-count) { |
273 | $noop: assert-stack-count($stack-id, $max-count); | 276 | $noop: assert-stack-count($stack-id, $max-count); |
274 | } | 277 | } |
275 | 278 | ||
276 | /// | 279 | /// |
@@ -281,13 +284,13 @@ $stacks: (); | |||
281 | /// @return {number} The number of contexts | 284 | /// @return {number} The number of contexts |
282 | /// | 285 | /// |
283 | @function count($stack-id) { | 286 | @function count($stack-id) { |
284 | @if not map-has-key($stacks, $stack-id) { | 287 | @if not map.has-key($stacks, $stack-id) { |
285 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 288 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
286 | } | 289 | } |
287 | 290 | ||
288 | $context-stack: map-get($stacks, $stack-id); | 291 | $context-stack: map.get($stacks, $stack-id); |
289 | 292 | ||
290 | @return length($context-stack); | 293 | @return list.length($context-stack); |
291 | } | 294 | } |
292 | 295 | ||
293 | /// | 296 | /// |
@@ -299,37 +302,37 @@ $stacks: (); | |||
299 | /// @return {list} Null if no match was found, otherwise a list with two items: 1. context ID, 2. context data. | 302 | /// @return {list} Null if no match was found, otherwise a list with two items: 1. context ID, 2. context data. |
300 | /// | 303 | /// |
301 | @function get($stack-id, $type-or-level: null) { | 304 | @function get($stack-id, $type-or-level: null) { |
302 | @if not map-has-key($stacks, $stack-id) { | 305 | @if not map.has-key($stacks, $stack-id) { |
303 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; | 306 | @error 'Context stack "#{inspect($stack-id)}" does not exist.'; |
304 | } | 307 | } |
305 | 308 | ||
306 | $context-stack: map-get($stacks, $stack-id); | 309 | $context-stack: map.get($stacks, $stack-id); |
307 | 310 | ||
308 | @if length($context-stack) == 0 { | 311 | @if list.length($context-stack) == 0 { |
309 | @return null; | 312 | @return null; |
310 | } | 313 | } |
311 | 314 | ||
312 | @if type-of($type-or-level) == number { | 315 | @if meta.type-of($type-or-level) == number { |
313 | $context: nth($context-stack, -$type-or-level); | 316 | $context: list.nth($context-stack, -$type-or-level); |
314 | 317 | ||
315 | @return $context; | 318 | @return $context; |
316 | } @else { | 319 | } @else { |
317 | @for $i from -1 through -(length($context-stack)) { | 320 | @for $i from -1 through -(list.length($context-stack)) { |
318 | $context: nth($context-stack, $i); | 321 | $context: list.nth($context-stack, $i); |
319 | 322 | ||
320 | @if type-of($type-or-level) == list { | 323 | @if meta.type-of($type-or-level) == list { |
321 | @for $j from 1 through length($type-or-level) { | 324 | @for $j from 1 through list.length($type-or-level) { |
322 | $ctx: nth($type-or-level, $j); | 325 | $ctx: list.nth($type-or-level, $j); |
323 | 326 | ||
324 | @if nth($context, 1) == $ctx { | 327 | @if list.nth($context, 1) == $ctx { |
325 | @return $context; | 328 | @return $context; |
326 | } | 329 | } |
327 | } | 330 | } |
328 | } @else if nth($context, 1) == $type-or-level { | 331 | } @else if list.nth($context, 1) == $type-or-level { |
329 | @return $context; | 332 | @return $context; |
330 | } | 333 | } |
331 | } | 334 | } |
332 | } | 335 | } |
333 | 336 | ||
334 | @return null; | 337 | @return null; |
335 | } | 338 | } |