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 | } |
