aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorVolpeon <git@volpeon.ink>2024-06-22 08:14:44 +0200
committerVolpeon <git@volpeon.ink>2024-06-22 08:14:44 +0200
commit828a12ffac60b2fb7e6b0931f610b7ca9f53ffc2 (patch)
tree3572fbd90d4e6c98f986b90f18681b13f49b598b /src
parentUpdate (diff)
downloadiro-sass-828a12ffac60b2fb7e6b0931f610b7ca9f53ffc2.tar.gz
iro-sass-828a12ffac60b2fb7e6b0931f610b7ca9f53ffc2.tar.bz2
iro-sass-828a12ffac60b2fb7e6b0931f610b7ca9f53ffc2.zip
Props: Support recursive var() if referring to subtree
Diffstat (limited to 'src')
-rw-r--r--src/_functions.scss71
-rw-r--r--src/_props.scss99
2 files changed, 92 insertions, 78 deletions
diff --git a/src/_functions.scss b/src/_functions.scss
index 9dd14b1..7d4a695 100644
--- a/src/_functions.scss
+++ b/src/_functions.scss
@@ -10,7 +10,10 @@
10//// 10////
11 11
12@use 'sass:map'; 12@use 'sass:map';
13@use 'sass:list';
13@use 'sass:math'; 14@use 'sass:math';
15@use 'sass:string';
16@use 'sass:meta';
14@use './vars'; 17@use './vars';
15 18
16/// 19///
@@ -23,10 +26,10 @@
23/// @return {string} A string with all instances of $search replaced with $replace 26/// @return {string} A string with all instances of $search replaced with $replace
24/// 27///
25@function str-replace($string, $search, $replace) { 28@function str-replace($string, $search, $replace) {
26 $index: str-index($string, $search); 29 $index: string.index($string, $search);
27 30
28 @if $index { 31 @if $index {
29 @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); 32 @return string.slice($string, 1, $index - 1) + $replace + str-replace(string.slice($string, $index + string.length($search)), $search, $replace);
30 } 33 }
31 34
32 @return $string; 35 @return $string;
@@ -44,9 +47,9 @@
44 $result: ''; 47 $result: '';
45 48
46 @each $item in $list { 49 @each $item in $list {
47 $result: $result + if(length($item) > 1, str-implode($item, $glue), $item); 50 $result: $result + if(list.length($item) > 1, str-implode($item, $glue), $item);
48 51
49 @if $item != nth($list, length($list)) { 52 @if $item != list.nth($list, list.length($list)) {
50 $result: $result + $glue; 53 $result: $result + $glue;
51 } 54 }
52 } 55 }
@@ -63,13 +66,13 @@
63/// 66///
64/// @return {list} A slice of the list 67/// @return {list} A slice of the list
65/// 68///
66@function list-slice($list, $start: 1, $end: length($list)) { 69@function list-slice($list, $start: 1, $end: list.length($list)) {
67 $result: (); 70 $result: ();
68 71
69 @if $end >= $start { 72 @if $end >= $start {
70 @for $i from $start through $end { 73 @for $i from $start through $end {
71 @if $i != 0 { 74 @if $i != 0 {
72 $result: append($result, nth($list, $i), list-separator($list)); 75 $result: list.append($result, list.nth($list, $i), list.separator($list));
73 } 76 }
74 } 77 }
75 } 78 }
@@ -86,11 +89,11 @@
86/// @return {list} A list with $value at the beginning, followed by the other items 89/// @return {list} A list with $value at the beginning, followed by the other items
87/// 90///
88@function list-prepend($list, $value) { 91@function list-prepend($list, $value) {
89 $result: append((), $value, list-separator($list)); 92 $result: list.append((), $value, list.separator($list));
90 93
91 @if length($list) > 0 { 94 @if list.length($list) > 0 {
92 @for $i from 1 through length($list) { 95 @for $i from 1 through list.length($list) {
93 $result: append($result, nth($list, $i), list-separator($list)); 96 $result: list.append($result, list.nth($list, $i), list.separator($list));
94 } 97 }
95 } 98 }
96 99
@@ -105,13 +108,13 @@
105/// @return {list} Teh reversed list 108/// @return {list} Teh reversed list
106/// 109///
107@function list-reverse($list) { 110@function list-reverse($list) {
108 @if length($list) == 0 { 111 @if list.length($list) == 0 {
109 @return $list; 112 @return $list;
110 } 113 }
111 114
112 $result: (); 115 $result: ();
113 @for $i from length($list) * -1 through -1 { 116 @for $i from list.length($list) * -1 through -1 {
114 $result: append($result, nth($list, abs($i))); 117 $result: list.append($result, list.nth($list, math.abs($i)));
115 } 118 }
116 @return $result; 119 @return $result;
117} 120}
@@ -126,11 +129,11 @@
126/// 129///
127/// @return {list} Sorted list 130/// @return {list} Sorted list
128/// 131///
129@function quicksort($l, $left: 1, $right: length($l)) { 132@function quicksort($l, $left: 1, $right: list.length($l)) {
130 @if $left < $right { 133 @if $left < $right {
131 $pvr: quicksort-partition($l, $left, $right); 134 $pvr: quicksort-partition($l, $left, $right);
132 $pivot: nth($pvr, 1); 135 $pivot: list.nth($pvr, 1);
133 $l: nth($pvr, 2); 136 $l: list.nth($pvr, 2);
134 $l: quicksort($l, $left, $pivot); 137 $l: quicksort($l, $left, $pivot);
135 $l: quicksort($l, $pivot + 1, $right); 138 $l: quicksort($l, $pivot + 1, $right);
136 } 139 }
@@ -145,30 +148,30 @@
145 $start: true; 148 $start: true;
146 $i: $left; 149 $i: $left;
147 $j: $right - 1; 150 $j: $right - 1;
148 $pivot: nth($l, $right); 151 $pivot: list.nth($l, $right);
149 152
150 @while ($i < $j) or $start { 153 @while ($i < $j) or $start {
151 @while (nth($l, $i) < $pivot) and ($i < $right - 1) { 154 @while (list.nth($l, $i) < $pivot) and ($i < $right - 1) {
152 $i: $i + 1; 155 $i: $i + 1;
153 } 156 }
154 157
155 @while (nth($l, $j)>= $pivot) and ($j > $left) { 158 @while (list.nth($l, $j)>= $pivot) and ($j > $left) {
156 $j: $j - 1; 159 $j: $j - 1;
157 } 160 }
158 161
159 @if $i < $j { 162 @if $i < $j {
160 $i-val: nth($l, $i); 163 $i-val: list.nth($l, $i);
161 $l: set-nth($l, $i, nth($l, $j)); 164 $l: list.set-nth($l, $i, list.nth($l, $j));
162 $l: set-nth($l, $j, $i-val); 165 $l: list.set-nth($l, $j, $i-val);
163 } 166 }
164 167
165 $start: false; 168 $start: false;
166 } 169 }
167 170
168 @if nth($l, $i) > $pivot { 171 @if list.nth($l, $i) > $pivot {
169 $i-val: nth($l, $i); 172 $i-val: list.nth($l, $i);
170 $l: set-nth($l, $i, nth($l, $right)); 173 $l: list.set-nth($l, $i, list.nth($l, $right));
171 $l: set-nth($l, $right, $i-val); 174 $l: list.set-nth($l, $right, $i-val);
172 } 175 }
173 176
174 @return $i $l; 177 @return $i $l;
@@ -185,10 +188,10 @@
185/// @return {any} Either the value assigned to $key or $default 188/// @return {any} Either the value assigned to $key or $default
186/// 189///
187@function map-get-default($map, $key, $keys...) { 190@function map-get-default($map, $key, $keys...) {
188 $default: nth($keys, length($keys)); 191 $default: list.nth($keys, list.length($keys));
189 $keys: list-slice($keys, 1, length($keys) - 1); 192 $keys: list-slice($keys, 1, list.length($keys) - 1);
190 193
191 @return if(map-has-key($map, $key, $keys...), map-get($map, $key, $keys...), $default); 194 @return if(map.has-key($map, $key, $keys...), map.get($map, $key, $keys...), $default);
192} 195}
193 196
194/// 197///
@@ -204,11 +207,11 @@
204 @each $key, $value in $map { 207 @each $key, $value in $map {
205 $value-str: ''; 208 $value-str: '';
206 209
207 @if type-of($value) == map { 210 @if meta.type-of($value) == map {
208 $value-str: '[ ' + map-print($value) + ' ]'; 211 $value-str: '[ ' + map-print($value) + ' ]';
209 } @else if type-of($value) == list { 212 } @else if meta.type-of($value) == list {
210 $value-str: '[ ' + str-implode($value, ', ') + ' ]'; 213 $value-str: '[ ' + str-implode($value, ', ') + ' ]';
211 } @else if type-of($value) == string { 214 } @else if meta.type-of($value) == string {
212 $value-str: '\'' + $value + '\''; 215 $value-str: '\'' + $value + '\'';
213 } @else { 216 } @else {
214 $value-str: $value; 217 $value-str: $value;
@@ -243,8 +246,8 @@
243 @if not $sel-match { 246 @if not $sel-match {
244 $suf-match: true; 247 $suf-match: true;
245 248
246 @for $i from 1 through length($suffix) { 249 @for $i from 1 through list.length($suffix) {
247 @if $suf-match and (nth($sel, -$i) != nth($suffix, -$i)) { 250 @if $suf-match and (list.nth($sel, -$i) != list.nth($suffix, -$i)) {
248 $suf-match: false; 251 $suf-match: false;
249 } 252 }
250 } 253 }
diff --git a/src/_props.scss b/src/_props.scss
index 1494203..14295bd 100644
--- a/src/_props.scss
+++ b/src/_props.scss
@@ -11,6 +11,9 @@
11//// 11////
12 12
13@use 'sass:map'; 13@use 'sass:map';
14@use 'sass:list';
15@use 'sass:string';
16@use 'sass:meta';
14@use './functions'; 17@use './functions';
15@use './contexts'; 18@use './contexts';
16 19
@@ -63,7 +66,7 @@ $namespace-context-id: 'namespace' !default;
63 $ns-key: get-ns-key(); 66 $ns-key: get-ns-key();
64 67
65 @if $ns-key != null { 68 @if $ns-key != null {
66 $key: append($ns-key, $key); 69 $key: list.append($ns-key, $key);
67 } @else { 70 } @else {
68 $key: ($key); 71 $key: ($key);
69 } 72 }
@@ -84,8 +87,8 @@ $namespace-context-id: 'namespace' !default;
84@function namespace() { 87@function namespace() {
85 $noop: contexts.assert-stack-must-contain($namespace-context-id, 'namespace'); 88 $noop: contexts.assert-stack-must-contain($namespace-context-id, 'namespace');
86 89
87 $data: nth(contexts.get($namespace-context-id, 'namespace'), 2); 90 $data: list.nth(contexts.get($namespace-context-id, 'namespace'), 2);
88 $name: map-get($data, 'name'); 91 $name: map.get($data, 'name');
89 92
90 @return $name; 93 @return $name;
91} 94}
@@ -126,15 +129,15 @@ $namespace-context-id: 'namespace' !default;
126 } 129 }
127 } 130 }
128 131
129 @if map-has-key($trees, $tree) { 132 @if map.has-key($trees, $tree) {
130 @if $merge { 133 @if $merge {
131 $map: map.deep-merge(map-get($trees, $tree), $map); 134 $map: map.deep-merge(map.get($trees, $tree), $map);
132 } @else { 135 } @else {
133 @error 'Property tree #{inspect($tree)} does already exist.'; 136 @error 'Property tree #{inspect($tree)} does already exist.';
134 } 137 }
135 } 138 }
136 139
137 $trees: map-merge($trees, ($tree: $map)) !global; 140 $trees: map.merge($trees, ($tree: $map)) !global;
138 141
139 @return null; 142 @return null;
140} 143}
@@ -156,11 +159,11 @@ $namespace-context-id: 'namespace' !default;
156/// @throw If the property tree does not exist 159/// @throw If the property tree does not exist
157/// 160///
158@function clear($tree: $default-tree) { 161@function clear($tree: $default-tree) {
159 @if not map-has-key($trees, $tree) { 162 @if not map.has-key($trees, $tree) {
160 @error 'Property tree "#{inspect($tree)}" does not exist.'; 163 @error 'Property tree "#{inspect($tree)}" does not exist.';
161 } 164 }
162 165
163 $trees: map-remove($trees, $tree) !global; 166 $trees: map.remove($trees, $tree) !global;
164 167
165 @return null; 168 @return null;
166} 169}
@@ -177,11 +180,11 @@ $namespace-context-id: 'namespace' !default;
177/// @throw If there was no match for $key and $default is null 180/// @throw If there was no match for $key and $default is null
178/// 181///
179@function get-static($key: (), $tree: $default-tree, $default: null, $global: false) { 182@function get-static($key: (), $tree: $default-tree, $default: null, $global: false) {
180 @if not map-has-key($trees, $tree) { 183 @if not map.has-key($trees, $tree) {
181 @error 'Unknown tree "#{$tree}".'; 184 @error 'Unknown tree "#{$tree}".';
182 } 185 }
183 186
184 $result: map-get($trees, $tree); 187 $result: map.get($trees, $tree);
185 188
186 @if not $global { 189 @if not $global {
187 $ns-key: get-ns-key(); 190 $ns-key: get-ns-key();
@@ -190,28 +193,28 @@ $namespace-context-id: 'namespace' !default;
190 $orig-key: $key; 193 $orig-key: $key;
191 $key: $ns-key; 194 $key: $ns-key;
192 195
193 @if type-of($orig-key) == list { 196 @if meta.type-of($orig-key) == list {
194 @each $subkey in $orig-key { 197 @each $subkey in $orig-key {
195 $key: append($key, $subkey); 198 $key: list.append($key, $subkey);
196 } 199 }
197 } @else { 200 } @else {
198 $key: append($key, $orig-key); 201 $key: list.append($key, $orig-key);
199 } 202 }
200 } 203 }
201 } 204 }
202 205
203 @if type-of($key) == list { 206 @if meta.type-of($key) == list {
204 $stop: false; 207 $stop: false;
205 208
206 @each $k in $key { 209 @each $k in $key {
207 @if not $stop and map-has-key($result, $k) { 210 @if not $stop and map.has-key($result, $k) {
208 $result: map-get($result, $k); 211 $result: map.get($result, $k);
209 212
210 @if type-of($result) == list and nth($result, 1) == 'iro-prop-ref' { 213 @if meta.type-of($result) == list and list.nth($result, 1) == 'iro-prop-ref' {
211 @if length($result) == 2 { 214 @if list.length($result) == 2 {
212 $result: get-static($tree: nth($result, 2), $global: true); 215 $result: get-static($tree: list.nth($result, 2), $global: true);
213 } @else { 216 } @else {
214 $result: get-static(nth($result, 3), nth($result, 2), $global: true); 217 $result: get-static(list.nth($result, 3), nth($result, 2), $global: true);
215 } 218 }
216 } 219 }
217 } @else { 220 } @else {
@@ -223,13 +226,13 @@ $namespace-context-id: 'namespace' !default;
223 $result: null; 226 $result: null;
224 } 227 }
225 } @else { 228 } @else {
226 $result: map-get($result, $key); 229 $result: map.get($result, $key);
227 230
228 @if type-of($result) == list and nth($result, 1) == 'iro-prop-ref' { 231 @if meta.type-of($result) == list and list.nth($result, 1) == 'iro-prop-ref' {
229 @if length($result) == 2 { 232 @if list.length($result) == 2 {
230 $result: get-static($tree: nth($result, 2), $global: true); 233 $result: get-static($tree: list.nth($result, 2), $global: true);
231 } @else { 234 } @else {
232 $result: get-static(nth($result, 3), nth($result, 2), $global: true); 235 $result: get-static(list.nth($result, 3), nth($result, 2), $global: true);
233 } 236 }
234 } 237 }
235 } 238 }
@@ -256,7 +259,15 @@ $namespace-context-id: 'namespace' !default;
256/// 259///
257@function get($key, $tree: $default-tree, $default: null, $global: false) { 260@function get($key, $tree: $default-tree, $default: null, $global: false) {
258 @if $tree != null { 261 @if $tree != null {
259 $noop: get-static($key, $tree, $default, $global); 262 $value: get-static($key, $tree, $default, $global);
263
264 @if meta.type-of($value) == map {
265 $result: ();
266 @each $k in map.keys($value) {
267 $result: map.set($result, $k, get(list.append($key, $k), $tree, $default, $global));
268 }
269 @return $result;
270 }
260 } 271 }
261 272
262 @if not $global { 273 @if not $global {
@@ -266,19 +277,19 @@ $namespace-context-id: 'namespace' !default;
266 $orig-key: $key; 277 $orig-key: $key;
267 $key: $ns-key; 278 $key: $ns-key;
268 279
269 @if type-of($orig-key) == list { 280 @if meta.type-of($orig-key) == list {
270 @each $subkey in $orig-key { 281 @each $subkey in $orig-key {
271 $key: append($key, $subkey); 282 $key: list.append($key, $subkey);
272 } 283 }
273 } @else { 284 } @else {
274 $key: append($key, $orig-key); 285 $key: list.append($key, $orig-key);
275 } 286 }
276 } 287 }
277 } 288 }
278 289
279 $native-var: ''; 290 $native-var: '';
280 291
281 @if type-of($key) == list { 292 @if meta.type-of($key) == list {
282 @each $subkey in $key { 293 @each $subkey in $key {
283 $native-var: $native-var + $subkey; 294 $native-var: $native-var + $subkey;
284 } 295 }
@@ -301,9 +312,9 @@ $namespace-context-id: 'namespace' !default;
301/// 312///
302@mixin assign($tree: $default-tree, $root: (), $skip: (), $prefix: $root, $global: false) { 313@mixin assign($tree: $default-tree, $root: (), $skip: (), $prefix: $root, $global: false) {
303 $map: get-static($root, $tree, $global: $global); 314 $map: get-static($root, $tree, $global: $global);
304 $map: map-remove($map, $skip...); 315 $map: map.remove($map, $skip...);
305 316
306 @if type-of($prefix) == list { 317 @if meta.type-of($prefix) == list {
307 $prefix: functions.str-implode($prefix); 318 $prefix: functions.str-implode($prefix);
308 } 319 }
309 320
@@ -324,19 +335,19 @@ $namespace-context-id: 'namespace' !default;
324@mixin assign-internal($map, $prefix: '', $ref-depth: $native-assign-max-depth) { 335@mixin assign-internal($map, $prefix: '', $ref-depth: $native-assign-max-depth) {
325 @each $key, $value in $map { 336 @each $key, $value in $map {
326 $rd: $ref-depth; 337 $rd: $ref-depth;
327 @if type-of($value) == list and length($value) > 0 and nth($value, 1) == 'iro-prop-ref' { 338 @if meta.type-of($value) == list and list.length($value) > 0 and list.nth($value, 1) == 'iro-prop-ref' {
328 @if $ref-depth != 0 { 339 @if $ref-depth != 0 {
329 $rd: $rd - 1; 340 $rd: $rd - 1;
330 @if length($value) == 2 { 341 @if list.length($value) == 2 {
331 $value: get-static($tree: nth($value, 2)); 342 $value: get-static($tree: list.nth($value, 2));
332 } @else { 343 } @else {
333 $value: get-static(nth($value, 3), nth($value, 2)); 344 $value: get-static(list.nth($value, 3), nth($value, 2));
334 } 345 }
335 } @else { 346 } @else {
336 $value: null; 347 $value: null;
337 } 348 }
338 } 349 }
339 @if type-of($value) != map and $value != () { 350 @if meta.type-of($value) != map and $value != () {
340 #{$prefix + $key}: #{$value}; 351 #{$prefix + $key}: #{$value};
341 } @else { 352 } @else {
342 @include assign-internal($value, $prefix + $key, $rd); 353 @include assign-internal($value, $prefix + $key, $rd);
@@ -351,11 +362,11 @@ $namespace-context-id: 'namespace' !default;
351/// 362///
352@function validate($map) { 363@function validate($map) {
353 @each $key, $value in $map { 364 @each $key, $value in $map {
354 @if str-index($key, '--') != 1 { 365 @if string.index($key, '--') != 1 {
355 @return false; 366 @return false;
356 } 367 }
357 368
358 @if type-of($value) == map { 369 @if meta.type-of($value) == map {
359 @if not validate($value) { 370 @if not validate($value) {
360 @return false; 371 @return false;
361 } 372 }
@@ -384,12 +395,12 @@ $namespace-context-id: 'namespace' !default;
384 $key: $ns-key; 395 $key: $ns-key;
385 396
386 @if $orig-key != null { 397 @if $orig-key != null {
387 @if type-of($orig-key) == list { 398 @if meta.type-of($orig-key) == list {
388 @each $subkey in $orig-key { 399 @each $subkey in $orig-key {
389 $key: append($key, $subkey); 400 $key: list.append($key, $subkey);
390 } 401 }
391 } @else { 402 } @else {
392 $key: append($key, $orig-key); 403 $key: list.append($key, $orig-key);
393 } 404 }
394 } 405 }
395 } 406 }
@@ -414,8 +425,8 @@ $namespace-context-id: 'namespace' !default;
414 @return null; 425 @return null;
415 } 426 }
416 427
417 $data: nth($ctx, 2); 428 $data: list.nth($ctx, 2);
418 $key: map-get($data, 'key'); 429 $key: map.get($data, 'key');
419 430
420 @return $key; 431 @return $key;
421} 432}