@terrazzo/plugin-css 2.0.0-beta.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +59 -41
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -32,6 +32,10 @@
|
|
|
32
32
|
|
|
33
33
|
- Thanks [@drwpow](https://github.com/drwpow)! - Improve extended typography property CSS generation
|
|
34
34
|
|
|
35
|
+
- Correctness: don’t cache transforms from a previous plugin-css run, which could yield correct or unexpected output.
|
|
36
|
+
|
|
37
|
+
- [#691](https://github.com/terrazzoapp/terrazzo/pull/691) [`58fa6a7`](https://github.com/terrazzoapp/terrazzo/commit/58fa6a785e734a088dc0178232867e24b249bb78) Thanks [@jackholden](https://github.com/jackholden)! - correct stale descriptions when multiple CSS plugins are used
|
|
38
|
+
|
|
35
39
|
## 0.10.4
|
|
36
40
|
|
|
37
41
|
### Patch Changes
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TransformCSSValueOptions } from "@terrazzo/token-tools/css";
|
|
1
2
|
import { CachedWildcardMatcher } from "@terrazzo/token-tools";
|
|
2
3
|
import { BuildHookOptions, Logger, Plugin, TokenNormalized, TokenTransformed, TransformHookOptions } from "@terrazzo/parser";
|
|
3
4
|
|
|
@@ -42,9 +43,7 @@ interface CSSPluginOptions {
|
|
|
42
43
|
/** Control the final CSS variable name */
|
|
43
44
|
variableName?: (token: TokenNormalized) => string;
|
|
44
45
|
/** Override certain token values */
|
|
45
|
-
transform?: (token: TokenNormalized,
|
|
46
|
-
|
|
47
|
-
mode?: string) => TokenTransformed['value'] | undefined | null;
|
|
46
|
+
transform?: (token: TokenNormalized, options: TransformCSSValueOptions) => TokenTransformed['value'] | undefined | null;
|
|
48
47
|
/** Generate utility CSS from groups */
|
|
49
48
|
utility?: Partial<Record<UtilityCSSGroup, string[]>>;
|
|
50
49
|
/**
|
|
@@ -60,13 +59,17 @@ interface CSSPluginOptions {
|
|
|
60
59
|
}
|
|
61
60
|
interface Permutation<T extends Record<string, string> = Record<string, string>> {
|
|
62
61
|
/** Generate the final CSS string, wrapping content in the selector(s) of your choice. */
|
|
63
|
-
prepare(
|
|
62
|
+
prepare(contents: string): string;
|
|
64
63
|
/** Input for this permutation. */
|
|
65
64
|
input: T;
|
|
66
65
|
/** Provide token(s) to include (Note: not including tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */
|
|
67
66
|
include?: string[];
|
|
68
67
|
/** Provide token(s) to exclude (Note: excluding tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */
|
|
69
68
|
exclude?: string[];
|
|
69
|
+
/**
|
|
70
|
+
* Custom transform for this permutation
|
|
71
|
+
*/
|
|
72
|
+
transform?: (token: TokenNormalized, options: TransformCSSValueOptions) => TokenTransformed['value'] | undefined | null;
|
|
70
73
|
}
|
|
71
74
|
interface ModeSelector {
|
|
72
75
|
/** The name of the mode to match */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/transform.ts","../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/lib.ts","../src/build.ts","../src/transform.ts","../src/index.ts"],"mappings":";;;;;KAKY,eAAA;AAAA,KAEA,gBAAA;AAAA,cAEC,WAAA;AAAA,cAEA,SAAA;AAAA,cAIA,WAAA;AAAA,UAII,gBAAA;EAZL;;;;EAiBV,QAAA;EAfW;EAiBX,OAAA;;EAEA,OAAA;EAnBsB;AAExB;;;;EAuBE,YAAA;EAnBW;;;;;AAIb;EAsBE,UAAA;;;;EAIA,YAAA,GAAe,WAAA;EAUN;;;;EALT,aAAA,GAAgB,YAAA;EASN;EAPV,YAAA,IAAgB,KAAA,EAAO,eAAA;EAON;EALjB,SAAA,IACE,KAAA,EAAO,eAAA,EACP,OAAA,EAAS,wBAAA,KACN,gBAAA;EA/BL;EAiCA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,eAAA;EAzBzB;;;;EA8BA,SAAA;EAdgB;;;;EAmBhB,SAAA;AAAA;AAAA,UAGe,WAAA,WAAsB,MAAA,mBAAyB,MAAA;EAhBnD;EAkBX,OAAA,CAAQ,QAAA;EAjBH;EAmBL,KAAA,EAAO,CAAA;EAjBG;EAmBV,OAAA;EAnByB;EAqBzB,OAAA;EAXA;;;EAeA,SAAA,IACE,KAAA,EAAO,eAAA,EACP,OAAA,EAAS,wBAAA,KACN,gBAAA;AAAA;AAAA,UAGU,YAAA;EAlBsB;EAoBrC,IAAA;EAhBO;EAkBP,MAAA;EARW;EAUX,SAAA;EATqB;EAWrB,MAAA;AAAA;AAAA,UAIe,cAAA;EACf,IAAA;EACA,QAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,UAGe,OAAA;EACf,IAAA;EACA,OAAA;EACA,QAAA,GAAW,OAAA,GAAU,cAAA;AAAA;;;;;;AAtBvB;;;;;;;;iBAsCgB,UAAA,CACd,KAAA,GAAQ,OAAA,GAAU,cAAA;EAChB,UAAA;EAAmB;AAAA;EAAkB,UAAA;EAAqB,QAAA;AAAA;;iBAa9C,SAAA,CACd,IAAA,EAAM,OAAA,GAAU,cAAA;EACd,UAAA;EAAY;AAAA;EAAc,UAAA;EAAoB,QAAA;AAAA;;;UCrHjC,kBAAA;EACf,MAAA,EAAQ,MAAA;EACR,OAAA,EAAS,gBAAA;EACT,OAAA,EAAS,gBAAA;EACT,aAAA,EAAe,gBAAA;EACf,aAAA,EAAe,gBAAA;EACf,YAAA,EAAc,gBAAA;EACd,OAAA,EAAS,gBAAA;EACT,YAAA;EACA,UAAA,EAAY,gBAAA;AAAA;;;UCjCG,gBAAA;EACf,SAAA,EAAW,oBAAA;EACX,OAAA,EAAS,gBAAA;AAAA;;;iBCiBa,SAAA,CAAU,OAAA,GAAU,gBAAA,GAAmB,MAAA"}
|
package/dist/index.js
CHANGED
|
@@ -278,6 +278,13 @@ function generateUtilityCSS(groups, tokens, { logger }) {
|
|
|
278
278
|
//#region src/build.ts
|
|
279
279
|
const P3_MQ = "@media (color-gamut: p3)";
|
|
280
280
|
const REC2020_MQ = "@media (color-gamut: rec2020)";
|
|
281
|
+
/**
|
|
282
|
+
* Get description from metadata with fallback to token.$description
|
|
283
|
+
* Preserves the descriptions and alias descriptions.
|
|
284
|
+
*/
|
|
285
|
+
function getDescription(token) {
|
|
286
|
+
return token.meta?.["plugin-css"]?.description ?? token.token.$description;
|
|
287
|
+
}
|
|
281
288
|
function buildCSS({ logger, getTransforms, include: userInclude, exclude: userExclude, utility, permutations, modeSelectors, baseSelector, baseScheme }) {
|
|
282
289
|
const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;
|
|
283
290
|
const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;
|
|
@@ -312,20 +319,20 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
312
319
|
id: token.token.aliasedBy,
|
|
313
320
|
input: p.input
|
|
314
321
|
}) : [];
|
|
315
|
-
if (token.type === "SINGLE_VALUE") addDeclUnique(root, decl(localID, token.value, token
|
|
322
|
+
if (token.type === "SINGLE_VALUE") addDeclUnique(root, decl(localID, token.value, getDescription(token)));
|
|
316
323
|
else if (token.value.srgb && token.value.p3 && token.value.rec2020) {
|
|
317
|
-
addDeclUnique(root, decl(localID, token.value.srgb, token
|
|
324
|
+
addDeclUnique(root, decl(localID, token.value.srgb, getDescription(token)));
|
|
318
325
|
if (token.value.p3 !== token.value.srgb) {
|
|
319
|
-
addDeclUnique(hdrColors.p3, decl(localID, token.value.p3, token
|
|
320
|
-
addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020, token
|
|
326
|
+
addDeclUnique(hdrColors.p3, decl(localID, token.value.p3, getDescription(token)));
|
|
327
|
+
addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020, getDescription(token)));
|
|
321
328
|
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") {
|
|
322
329
|
const aliasID = makeCSSVar(alias.localID);
|
|
323
|
-
addDeclUnique(hdrColors.p3, decl(aliasID, alias.value, alias
|
|
324
|
-
addDeclUnique(hdrColors.rec2020, decl(aliasID, alias.value, alias
|
|
330
|
+
addDeclUnique(hdrColors.p3, decl(aliasID, alias.value, getDescription(alias)));
|
|
331
|
+
addDeclUnique(hdrColors.rec2020, decl(aliasID, alias.value, getDescription(alias)));
|
|
325
332
|
}
|
|
326
333
|
}
|
|
327
334
|
} else {
|
|
328
|
-
for (const [name, subValue] of Object.entries(token.value)) addDeclUnique(root, decl(`${localID}-${name}`, subValue, token
|
|
335
|
+
for (const [name, subValue] of Object.entries(token.value)) addDeclUnique(root, decl(`${localID}-${name}`, subValue, getDescription(token)));
|
|
329
336
|
const shorthand = generateShorthand({
|
|
330
337
|
token: {
|
|
331
338
|
...token.token,
|
|
@@ -333,11 +340,11 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
333
340
|
},
|
|
334
341
|
localID
|
|
335
342
|
});
|
|
336
|
-
if (shorthand) addDeclUnique(root, decl(localID, shorthand, token
|
|
343
|
+
if (shorthand) addDeclUnique(root, decl(localID, shorthand, getDescription(token)));
|
|
337
344
|
}
|
|
338
345
|
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") {
|
|
339
346
|
if (!includeToken(alias.id)) continue;
|
|
340
|
-
addDeclUnique(root, decl(alias.localID, alias.value, token
|
|
347
|
+
addDeclUnique(root, decl(alias.localID, alias.value, getDescription(token)));
|
|
341
348
|
}
|
|
342
349
|
}
|
|
343
350
|
const indentRules = getIndentFromPrepare(p.prepare);
|
|
@@ -381,21 +388,21 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
381
388
|
format: FORMAT_ID,
|
|
382
389
|
id: token.token.aliasedBy
|
|
383
390
|
}) : [];
|
|
384
|
-
if (token.type === "SINGLE_VALUE") addDeclUnique(rootRule.children, decl(localID, token.value, token
|
|
391
|
+
if (token.type === "SINGLE_VALUE") addDeclUnique(rootRule.children, decl(localID, token.value, getDescription(token)));
|
|
385
392
|
else if (token.value.srgb && token.value.p3 && token.value.rec2020) {
|
|
386
|
-
addDeclUnique(rootRule.children, decl(localID, token.value.srgb, token
|
|
393
|
+
addDeclUnique(rootRule.children, decl(localID, token.value.srgb, getDescription(token)));
|
|
387
394
|
if (token.value.p3 !== token.value.srgb) {
|
|
388
|
-
addDeclUnique(p3Rule.children, decl(localID, token.value.p3, token
|
|
389
|
-
addDeclUnique(rec2020Rule.children, decl(localID, token.value.rec2020, token
|
|
395
|
+
addDeclUnique(p3Rule.children, decl(localID, token.value.p3, getDescription(token)));
|
|
396
|
+
addDeclUnique(rec2020Rule.children, decl(localID, token.value.rec2020, getDescription(token)));
|
|
390
397
|
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") {
|
|
391
|
-
addDeclUnique(p3Rule.children, decl(alias.localID, alias.value,
|
|
392
|
-
addDeclUnique(rec2020Rule.children, decl(alias.localID, alias.value,
|
|
398
|
+
addDeclUnique(p3Rule.children, decl(alias.localID, alias.value, getDescription(alias)));
|
|
399
|
+
addDeclUnique(rec2020Rule.children, decl(alias.localID, alias.value, getDescription(alias)));
|
|
393
400
|
}
|
|
394
401
|
}
|
|
395
402
|
} else if (token.type === "MULTI_VALUE") {
|
|
396
403
|
for (const [name, value] of Object.entries(token.value)) {
|
|
397
404
|
const property = name === "." ? localID : [localID, name].join("-");
|
|
398
|
-
addDeclUnique(rootRule.children, decl(property, value, token
|
|
405
|
+
addDeclUnique(rootRule.children, decl(property, value, getDescription(token)));
|
|
399
406
|
}
|
|
400
407
|
const shorthand = generateShorthand({
|
|
401
408
|
token: {
|
|
@@ -404,7 +411,7 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
404
411
|
},
|
|
405
412
|
localID
|
|
406
413
|
});
|
|
407
|
-
if (shorthand) addDeclUnique(rootRule.children, decl(token.localID ?? token.token.id, shorthand, token
|
|
414
|
+
if (shorthand) addDeclUnique(rootRule.children, decl(token.localID ?? token.token.id, shorthand, getDescription(token)));
|
|
408
415
|
}
|
|
409
416
|
}
|
|
410
417
|
output += printRules(rules);
|
|
@@ -428,16 +435,16 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
428
435
|
format: FORMAT_ID,
|
|
429
436
|
id: token.token.aliasedBy
|
|
430
437
|
}) : [];
|
|
431
|
-
if (token.type === "SINGLE_VALUE") addDeclUnique(modeRule.children, decl(localID, token.value, token
|
|
438
|
+
if (token.type === "SINGLE_VALUE") addDeclUnique(modeRule.children, decl(localID, token.value, getDescription(token)));
|
|
432
439
|
else if (token.value.srgb && token.value.p3 && token.value.rec2020) {
|
|
433
|
-
addDeclUnique(modeRule.children, decl(localID, token.value.srgb, token
|
|
440
|
+
addDeclUnique(modeRule.children, decl(localID, token.value.srgb, getDescription(token)));
|
|
434
441
|
if (token.value.p3 !== token.value.srgb) {
|
|
435
|
-
addDeclUnique(hdrColors.p3, decl(localID, token.value.p3, token
|
|
436
|
-
addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020, token
|
|
437
|
-
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") for (const gamut of ["p3", "rec2020"]) addDeclUnique(hdrColors[gamut], decl(alias.localID, alias.value,
|
|
442
|
+
addDeclUnique(hdrColors.p3, decl(localID, token.value.p3, getDescription(token)));
|
|
443
|
+
addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020, getDescription(token)));
|
|
444
|
+
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") for (const gamut of ["p3", "rec2020"]) addDeclUnique(hdrColors[gamut], decl(alias.localID, alias.value, getDescription(alias)));
|
|
438
445
|
}
|
|
439
446
|
} else {
|
|
440
|
-
for (const [name, subValue] of Object.entries(token.value)) addDeclUnique(modeRule.children, decl(`${localID}-${name}`, subValue, token
|
|
447
|
+
for (const [name, subValue] of Object.entries(token.value)) addDeclUnique(modeRule.children, decl(`${localID}-${name}`, subValue, getDescription(token)));
|
|
441
448
|
const shorthand = generateShorthand({
|
|
442
449
|
token: {
|
|
443
450
|
...token.token,
|
|
@@ -445,9 +452,9 @@ function buildCSS({ logger, getTransforms, include: userInclude, exclude: userEx
|
|
|
445
452
|
},
|
|
446
453
|
localID
|
|
447
454
|
});
|
|
448
|
-
if (shorthand) addDeclUnique(modeRule.children, decl(localID, shorthand, token
|
|
455
|
+
if (shorthand) addDeclUnique(modeRule.children, decl(localID, shorthand, getDescription(token)));
|
|
449
456
|
}
|
|
450
|
-
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") addDeclUnique(modeRule.children, decl(alias.localID, alias.value, token
|
|
457
|
+
for (const alias of aliasTokens) if (alias.localID && typeof alias.value === "string") addDeclUnique(modeRule.children, decl(alias.localID, alias.value, getDescription(token)));
|
|
451
458
|
}
|
|
452
459
|
if (output) output += "\n\n";
|
|
453
460
|
output += printRules([
|
|
@@ -485,11 +492,12 @@ function transformCSS({ transform: { context: { logger }, resolver, setTransform
|
|
|
485
492
|
const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;
|
|
486
493
|
const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;
|
|
487
494
|
if (Array.isArray(permutations)) {
|
|
488
|
-
let defaultPermutationI = permutations.findIndex((p) => !Object.keys(p).length);
|
|
495
|
+
let defaultPermutationI = permutations.findIndex((p) => !Object.keys(p.input ?? {}).length);
|
|
489
496
|
if (defaultPermutationI === -1) defaultPermutationI = 0;
|
|
490
497
|
for (let i = 0; i < permutations.length; i++) {
|
|
491
498
|
const p = permutations[i];
|
|
492
|
-
const
|
|
499
|
+
const inputRaw = p.input;
|
|
500
|
+
const input = !Object.keys(inputRaw ?? {}).length ? JSON.parse(resolver.getPermutationID(inputRaw ?? {})) : inputRaw;
|
|
493
501
|
const pInclude = p.include ? cachedMatcher.tokenIDMatch(p.include) : () => true;
|
|
494
502
|
const pExclude = p.exclude ? cachedMatcher.tokenIDMatch(p.exclude) : () => false;
|
|
495
503
|
const includeToken = (tokenId) => {
|
|
@@ -499,11 +507,13 @@ function transformCSS({ transform: { context: { logger }, resolver, setTransform
|
|
|
499
507
|
const tokens = resolver.apply(input);
|
|
500
508
|
for (const token of Object.values(tokens)) {
|
|
501
509
|
if (!includeToken(token.id)) continue;
|
|
502
|
-
const
|
|
510
|
+
const options = {
|
|
503
511
|
tokensSet: tokens,
|
|
504
512
|
transformAlias,
|
|
505
|
-
color: { legacyHex }
|
|
506
|
-
|
|
513
|
+
color: { legacyHex },
|
|
514
|
+
permutation: input
|
|
515
|
+
};
|
|
516
|
+
const value = p.transform?.(token, options) ?? customTransform?.(token, options) ?? transformCSSValue(token, options);
|
|
507
517
|
if (value) {
|
|
508
518
|
const localID = transformName(token);
|
|
509
519
|
setTransform(token.id, {
|
|
@@ -511,14 +521,20 @@ function transformCSS({ transform: { context: { logger }, resolver, setTransform
|
|
|
511
521
|
value,
|
|
512
522
|
localID,
|
|
513
523
|
input,
|
|
514
|
-
meta: {
|
|
524
|
+
meta: {
|
|
525
|
+
"plugin-css": { description: token.$description },
|
|
526
|
+
"token-listing": { name: localID }
|
|
527
|
+
}
|
|
515
528
|
});
|
|
516
529
|
if (defaultPermutationI === i) setTransform(token.id, {
|
|
517
530
|
format: FORMAT_ID,
|
|
518
531
|
value,
|
|
519
532
|
localID,
|
|
520
533
|
mode: ".",
|
|
521
|
-
meta: {
|
|
534
|
+
meta: {
|
|
535
|
+
"plugin-css": { description: token.$description },
|
|
536
|
+
"token-listing": { name: localID }
|
|
537
|
+
}
|
|
522
538
|
});
|
|
523
539
|
}
|
|
524
540
|
}
|
|
@@ -537,14 +553,17 @@ function transformCSS({ transform: { context: { logger }, resolver, setTransform
|
|
|
537
553
|
for (const token of Object.values(baseTokens)) {
|
|
538
554
|
if (!include(token.id) || exclude(token.id)) continue;
|
|
539
555
|
for (const mode of Object.keys(token.mode)) {
|
|
540
|
-
const
|
|
556
|
+
const tokenArgs = {
|
|
541
557
|
...token,
|
|
542
558
|
...token.mode[mode]
|
|
543
|
-
}
|
|
559
|
+
};
|
|
560
|
+
const options = {
|
|
544
561
|
tokensSet: baseTokens,
|
|
545
562
|
transformAlias,
|
|
546
|
-
color: { legacyHex }
|
|
547
|
-
|
|
563
|
+
color: { legacyHex },
|
|
564
|
+
permutation: { tzMode: "." }
|
|
565
|
+
};
|
|
566
|
+
const value = customTransform?.(tokenArgs, options) ?? transformCSSValue(tokenArgs, options);
|
|
548
567
|
if (value) {
|
|
549
568
|
const localID = transformName(token);
|
|
550
569
|
setTransform(token.id, {
|
|
@@ -552,7 +571,10 @@ function transformCSS({ transform: { context: { logger }, resolver, setTransform
|
|
|
552
571
|
localID,
|
|
553
572
|
value,
|
|
554
573
|
mode,
|
|
555
|
-
meta: {
|
|
574
|
+
meta: {
|
|
575
|
+
"plugin-css": { description: token.$description },
|
|
576
|
+
"token-listing": { name: localID }
|
|
577
|
+
}
|
|
556
578
|
});
|
|
557
579
|
}
|
|
558
580
|
}
|
|
@@ -575,10 +597,6 @@ function cssPlugin(options) {
|
|
|
575
597
|
});
|
|
576
598
|
},
|
|
577
599
|
async transform(transformOptions) {
|
|
578
|
-
if (transformOptions.getTransforms({
|
|
579
|
-
format: FORMAT_ID,
|
|
580
|
-
id: "*"
|
|
581
|
-
}).length) return;
|
|
582
600
|
transformCSS({
|
|
583
601
|
transform: transformOptions,
|
|
584
602
|
options: options ?? {}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/lib.ts","../src/utility-css.ts","../src/build.ts","../src/transform.ts","../src/index.ts"],"sourcesContent":["import type { TokenNormalized, TokenTransformed } from '@terrazzo/parser';\nimport { CachedWildcardMatcher } from '@terrazzo/token-tools';\n\nexport type UtilityCSSGroup = 'bg' | 'border' | 'font' | 'layout' | 'shadow' | 'text';\n\nexport type UtilityCSSPrefix = 'bg' | 'border' | 'font' | 'gap' | 'm' | 'p' | 'shadow' | 'text';\n\nexport const PLUGIN_NAME = '@terrazzo/plugin-css';\n\nexport const FORMAT_ID = 'css';\n\nexport const cachedMatcher = new CachedWildcardMatcher();\n\nexport const FILE_PREFIX = `/* -------------------------------------------\n * Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n * ------------------------------------------- */`;\n\nexport interface CSSPluginOptions {\n /**\n * Where to output CSS\n * @default \"index.css\"\n */\n filename?: string;\n /** Glob patterns to filter tokens in output */\n include?: string[];\n /** Glob patterns to exclude tokens from output */\n exclude?: string[];\n /**\n * Set the base selector, like \":root\" or \":host\".\n * @deprecated use permutations instead.\n * @default \":root\"\n */\n baseSelector?: string;\n /**\n * Set the color-scheme CSS property for `baseSelector`.\n * @deprecated use permutations instead.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme\n * @example \"light dark\"\n */\n baseScheme?: string;\n /**\n * Build resolver contexts into media queries\n */\n permutations?: Permutation[];\n /**\n * Define mode selectors as media queries or CSS classes\n * @deprecated Migrate to permutations\n */\n modeSelectors?: ModeSelector[];\n /** Control the final CSS variable name */\n variableName?: (token: TokenNormalized) => string;\n /** Override certain token values */\n transform?: (\n token: TokenNormalized,\n /** @deprecated */\n mode?: string,\n ) => TokenTransformed['value'] | undefined | null;\n /** Generate utility CSS from groups */\n utility?: Partial<Record<UtilityCSSGroup, string[]>>;\n /**\n * Output colors as hex-6/hex-8 instead of color() function\n * @default false\n */\n legacyHex?: boolean;\n /**\n * Skip generating any `.css` files (useful if you are consuming values in your own plugin and don’t need any `.css` files written to disk).\n * @default false\n */\n skipBuild?: boolean;\n}\n\nexport interface Permutation<T extends Record<string, string> = Record<string, string>> {\n /** Generate the final CSS string, wrapping content in the selector(s) of your choice. */\n prepare(css: string): string;\n /** Input for this permutation. */\n input: T;\n /** Provide token(s) to include (Note: not including tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */\n include?: string[];\n /** Provide token(s) to exclude (Note: excluding tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */\n exclude?: string[];\n}\n\nexport interface ModeSelector {\n /** The name of the mode to match */\n mode: string;\n /** Provide token IDs to match. Globs are allowed (e.g: `[\"color.*\", \"shadow.dark\"]`) */\n tokens?: string[];\n /** Provide CSS selectors to generate. (e.g.: `[\"@media (prefers-color-scheme: dark)\", \"[data-color-theme='dark']\"]` ) */\n selectors: string[];\n /** Set the color-scheme CSS property for this mode (e.g.: \"light\", \"dark\", \"light dark\") */\n scheme?: string;\n}\n\n// Simple AST types loosely-inspired by csstree.\nexport interface CSSDeclaration {\n type: 'Declaration';\n property: string;\n value: string;\n comment?: string;\n}\n\nexport interface CSSRule {\n type: 'Rule';\n prelude: string[];\n children: (CSSRule | CSSDeclaration)[];\n}\n\n/**\n * Convert CSSRules into a formatted, indented CSS string.\n * The reason we’re using this homemade version instead of something like css-tree is:\n *\n * 1. css-tree doesn’t support comments :(\n * 2. we are only generating PARTIALS, not full CSS (the user controls the\n * wrapper). So with a proper AST, we’d be hacking it a little anyway because\n * we never really have a true, valid, finalized document.\n * 3. we want @terrazzo/plugin-css to run in the browser AND be lean (i.e. don’t\n * load Prettier or 25MB of wasm).\n * 4. we only have to deal with a small subset of CSS—this doesn’t have to be robust\n * by any means (even future additions won’t push the limits of the spec).\n */\nexport function printRules(\n nodes: (CSSRule | CSSDeclaration)[],\n { indentChar = ' ', indentLv = 0 }: { indentChar?: string; indentLv?: number } = {},\n): string {\n let output = '';\n for (const node of nodes) {\n if (output && node.type === 'Rule') {\n output += '\\n';\n }\n output += printNode(node, { indentChar, indentLv });\n }\n return output.trim();\n}\n\n/** Internal printer for individual nodes */\nexport function printNode(\n node: CSSRule | CSSDeclaration,\n { indentChar, indentLv }: { indentChar: string; indentLv: number },\n): string {\n let output = '';\n\n const indent = indentChar.repeat(indentLv);\n\n if (node.type === 'Declaration') {\n if (node.comment) {\n output += `${indent}/* ${node.comment} */\\n`;\n }\n output += `${indent}${node.property}: ${node.value};\\n`;\n return output;\n }\n\n if (!node.prelude.length || !node.children.length) {\n return output;\n }\n\n // legacy behavior: mediaQueryWithDecls should be removed in 3.0. This\n // was originally introduced in modeSelectors, but it generates unexpected CSS.\n const mediaQueryWithDecls = node.children.some((s) => s.type === 'Declaration')\n ? node.prelude.find((s) => s.startsWith('@'))\n : undefined;\n if (mediaQueryWithDecls) {\n const nonMedia = node.prelude.filter((s) => s !== mediaQueryWithDecls);\n output += `${indent}${mediaQueryWithDecls} {\\n`;\n output += printNode(rule([':root'], node.children), { indentChar, indentLv: indentLv + 1 });\n output += `${indent}}\\n\\n`;\n output += printNode(rule(nonMedia, node.children), { indentChar, indentLv });\n return output;\n }\n\n // Note: nested rules may eventually resolve to no declarations. This prevents that by rendering children first before the wrapper.\n let childOutput = '';\n for (const child of node.children) {\n childOutput += printNode(child, { indentChar, indentLv: indentLv + 1 });\n }\n childOutput = childOutput.trim();\n if (!childOutput) {\n return output;\n }\n output += `${indent}${node.prelude.join(', ')} {\\n`;\n output += `${indentChar.repeat(indentLv + 1)}${childOutput}\\n`;\n output += `${indent}}\\n`;\n return output;\n}\n\n/** Infer indentation preferences from a user-defined wrapping method. */\nexport function getIndentFromPrepare(prepare: (css: string) => string): { indentChar: string; indentLv: number } {\n const str = '//css//'; // this is a string that’s invalid CSS that wouldn’t be in the fn itself\n const output = prepare(str).replace(/\\/\\*.*\\*\\//g, ''); // strip comments because we don’t need them\n let indentChar = ' ';\n let indentLv = 0;\n let lineStartChar = 0;\n for (let i = 0; i < output.length; i++) {\n if (output[i] === '{') {\n lineStartChar = i + 1;\n indentLv++;\n } else if (output[i] === '}') {\n indentLv--;\n } else if (output[i] === '\\n') {\n lineStartChar = i + 1;\n } else if (output[i] === str[0] && output.slice(i).startsWith(str)) {\n indentChar = output.slice(lineStartChar, i);\n indentChar = indentChar.slice(0, Math.floor(indentChar.length / indentLv));\n break;\n }\n }\n return {\n indentChar: indentChar || ' ', // fall back to 2 spaces rather than no indentation\n indentLv,\n };\n}\n\n/** Syntactic sugar over Rule boilerplate */\nexport function rule(prelude: CSSRule['prelude'], children: CSSRule['children'] = []): CSSRule {\n return { type: 'Rule', prelude, children };\n}\n\n/** Syntactic sugar over Declaration boilerplate */\nexport function decl(\n property: CSSDeclaration['property'],\n value: CSSDeclaration['value'],\n comment?: CSSDeclaration['comment'],\n): CSSDeclaration {\n return { type: 'Declaration', property, value, comment };\n}\n\n/** Does a node list contain a root-level declaration with this property? */\nexport function hasDecl(list: (CSSRule | CSSDeclaration)[], property: string): boolean {\n return list.some((d) => d.type === 'Declaration' && d.property === property);\n}\n\n/** Add a declaration only if it’s unique (note: CSS, by design, allows duplication—it’s how fallbacks happen. Only use this if fallbacks aren’t needed. */\nexport function addDeclUnique(list: (CSSRule | CSSDeclaration)[], declaration: CSSDeclaration): void {\n if (!hasDecl(list, declaration.property)) {\n list.push(declaration);\n }\n}\n","import type { Logger, TokenTransformed } from '@terrazzo/parser';\nimport { CachedWildcardMatcher, kebabCase } from '@terrazzo/token-tools';\nimport { makeCSSVar } from '@terrazzo/token-tools/css';\nimport { type CSSRule, decl, PLUGIN_NAME, rule, type UtilityCSSGroup, type UtilityCSSPrefix } from './lib.js';\n\n// micro-optimization: precompile all RegExs (which can be known) because dynamic compilation is a waste of resources\nconst GROUP_REGEX: Record<UtilityCSSPrefix, RegExp> = {\n bg: /(^bg-|-bg-)/,\n border: /(^border-|-border-)/,\n font: /(^font-|-font-)/,\n gap: /(^gap-|-gap-)/,\n m: /(^margin-|-margin-|)/,\n p: /(^padding-|-padding-|)/,\n shadow: /(^shadow-|-shadow-)/,\n text: /(^text-|-text-)/,\n};\n\n/** Make CSS class name from transformed token */\nfunction makePrelude(token: TokenTransformed, prefix: UtilityCSSPrefix, subgroup?: string): CSSRule['prelude'] {\n return [`.${prefix}${subgroup || ''}-${kebabCase(token.token.id).replace(GROUP_REGEX[prefix], '')}`];\n}\n\nfunction makeVarValue(token: TokenTransformed): string {\n return makeCSSVar(token.localID ?? token.token.id, { wrapVar: true });\n}\n\nconst utilityMatcher = new CachedWildcardMatcher();\n\nexport default function generateUtilityCSS(\n groups: Partial<Record<UtilityCSSGroup, string[]>>,\n tokens: TokenTransformed[],\n { logger }: { logger: Logger },\n): CSSRule[] {\n const root: CSSRule[] = [];\n const groupEntries = Object.entries(groups);\n groupEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [group, selectors] of groupEntries) {\n const selectorMatcher = utilityMatcher.match(selectors);\n const matchingTokens = tokens.filter((token) => selectorMatcher(token.token.id));\n if (!matchingTokens.length) {\n logger.warn({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `utility group \"${group}\" matched 0 tokens: ${JSON.stringify(selectors)}`,\n });\n break;\n }\n switch (group) {\n case 'bg': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'bg');\n switch (token.token.$type) {\n case 'color': {\n root.push(rule(prelude, [decl('background-color', makeVarValue(token))]));\n break;\n }\n case 'gradient': {\n const value = decl(\n 'background-image',\n `linear-gradient(${makeCSSVar(token.localID ?? token.token.id, { wrapVar: true })})`,\n );\n root.push(rule(prelude, [value]));\n }\n }\n }\n break;\n }\n case 'border': {\n // ALL generic properties must come before specific properties\n for (const token of matchingTokens) {\n const property = {\n border: 'border',\n color: 'border-color',\n dimension: 'border-width',\n strokeStyle: 'border-style',\n }[token.token.$type as string];\n if (property) {\n root.push(rule(makePrelude(token, 'border'), [decl(property, makeVarValue(token))]));\n }\n }\n // specific properties\n for (const token of matchingTokens) {\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const property = {\n border: `border-${side}`,\n color: `border-${side}-color`,\n dimension: `border-${side}-width`,\n strokeStyle: `border-${side}-style`,\n }[token.token.$type as string];\n if (property) {\n root.push(rule(makePrelude(token, 'border', `-${side}`), [decl(property, makeVarValue(token))]));\n }\n }\n }\n break;\n }\n case 'font': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'font');\n if (token.token.$type === 'typography' && token.type === 'MULTI_VALUE') {\n const value = Object.keys(token.value).map((property) =>\n decl(property, makeCSSVar(`${token.localID ?? token.token.id}-${property}`, { wrapVar: true })),\n );\n root.push(rule(prelude, value));\n } else {\n const property = {\n dimension: 'font-size',\n fontFamily: 'font-family',\n fontWeight: 'font-weight',\n }[token.token.$type as string];\n if (property) {\n root.push(rule(prelude, [decl(property, makeVarValue(token))]));\n }\n }\n }\n break;\n }\n case 'layout': {\n const filteredTokens = matchingTokens.filter((t) => t.token.$type === 'dimension'); // only dimension tokens here\n // gap\n // ALL generic properties (gap) must come before specific properties (column-gap)\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap'), [decl('gap', makeVarValue(token))]));\n }\n // specific properties\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap', '-col'), [decl('column-gap', makeVarValue(token))]));\n }\n // specific properties\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap', '-row'), [decl('row-gap', makeVarValue(token))]));\n }\n\n // margin/padding\n for (const prefix of ['m', 'p'] as const) {\n const property = prefix === 'm' ? 'margin' : 'padding';\n // note: ALL generic properties (margin: [value]) MUST come before specific properties (margin-top: [value])\n // this is why we loop through all tokens so many times\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, prefix, 'a'), [decl(property, makeVarValue(token))]));\n }\n for (const token of filteredTokens) {\n const value = makeVarValue(token);\n root.push(\n rule(makePrelude(token, prefix, 'x'), [\n decl(`${property}-inline`, value),\n decl(`${property}-left`, value),\n decl(`${property}-right`, value),\n ]),\n rule(makePrelude(token, prefix, 'y'), [\n decl(`${property}-block`, value),\n decl(`${property}-bottom`, value),\n decl(`${property}-top`, value),\n ]),\n );\n }\n for (const side of ['top', 'right', 'bottom', 'left']) {\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, prefix, side[0]), [decl(`${property}-${side}`, makeVarValue(token))]));\n }\n }\n for (const token of filteredTokens) {\n const value = makeVarValue(token);\n root.push(\n rule(makePrelude(token, prefix, 'bs'), [decl(`${property}-block-start`, value)]),\n rule(makePrelude(token, prefix, 'be'), [decl(`${property}-block-end`, value)]),\n rule(makePrelude(token, prefix, 'is'), [decl(`${property}-inline-start`, value)]),\n rule(makePrelude(token, prefix, 'ie'), [decl(`${property}-inline-end`, value)]),\n );\n }\n }\n break;\n }\n case 'shadow': {\n for (const token of matchingTokens) {\n if (token.token.$type === 'shadow') {\n root.push(rule(makePrelude(token, 'shadow'), [decl('box-shadow', makeVarValue(token))]));\n }\n }\n break;\n }\n case 'text': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'text');\n const value = makeVarValue(token);\n switch (token.token.$type) {\n case 'color': {\n root.push(rule(prelude, [decl('color', value)]));\n break;\n }\n case 'gradient': {\n root.push(\n rule(prelude, [\n decl('background', `-webkit-linear-gradient(${value})`),\n decl('-webkit-background-clip', 'text'),\n decl('-webkit-text-fill-color', 'transparent'),\n ]),\n );\n break;\n }\n }\n }\n break;\n }\n default: {\n logger.warn({ group: 'plugin', label: PLUGIN_NAME, message: `unknown utility CSS group \"${group}\", ignoring` });\n break;\n }\n }\n }\n\n return root;\n}\n","import type { BuildHookOptions, Logger } from '@terrazzo/parser';\nimport { generateShorthand, makeCSSVar } from '@terrazzo/token-tools/css';\nimport {\n addDeclUnique,\n type CSSDeclaration,\n type CSSPluginOptions,\n type CSSRule,\n cachedMatcher,\n decl,\n FORMAT_ID,\n getIndentFromPrepare,\n PLUGIN_NAME,\n printRules,\n rule,\n} from './lib.js';\nimport generateUtilityCSS from './utility-css.js';\n\nconst P3_MQ = '@media (color-gamut: p3)';\nconst REC2020_MQ = '@media (color-gamut: rec2020)';\n\nexport interface BuildFormatOptions {\n logger: Logger;\n include: CSSPluginOptions['include'];\n exclude: CSSPluginOptions['exclude'];\n getTransforms: BuildHookOptions['getTransforms'];\n modeSelectors: CSSPluginOptions['modeSelectors'];\n permutations: CSSPluginOptions['permutations'];\n utility: CSSPluginOptions['utility'];\n baseSelector: string;\n baseScheme: CSSPluginOptions['baseScheme'];\n}\n\nexport default function buildCSS({\n logger,\n getTransforms,\n include: userInclude,\n exclude: userExclude,\n utility,\n permutations,\n modeSelectors,\n baseSelector,\n baseScheme,\n}: BuildFormatOptions): string {\n const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;\n const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;\n if (permutations?.length) {\n let output = '';\n\n for (const p of permutations) {\n if (typeof p.prepare !== 'function') {\n logger.error({ group: 'plugin', label: PLUGIN_NAME, message: 'prepare(css) must be a function!' });\n }\n\n const tokens = getTransforms({ format: FORMAT_ID, input: p.input });\n if (!tokens.length) {\n continue;\n }\n\n const root: (CSSRule | CSSDeclaration)[] = [];\n const hdrColors = {\n p3: [] as CSSDeclaration[],\n rec2020: [] as CSSDeclaration[],\n };\n\n const pInclude = p.include ? cachedMatcher.tokenIDMatch(p.include) : () => true;\n const pExclude = p.exclude ? cachedMatcher.tokenIDMatch(p.exclude) : () => false;\n\n const includeToken = (tokenId: string): boolean => {\n return include(tokenId) && pInclude(tokenId) && !exclude(tokenId) && !pExclude(tokenId);\n };\n\n for (const token of tokens) {\n if (!includeToken(token.id)) {\n continue;\n }\n const localID = makeCSSVar(token.localID ?? token.token.id);\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy, input: p.input })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(root, decl(localID, token.value, token.token.$description));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(root, decl(localID, token.value.srgb!, token.token.$description));\n\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(hdrColors.p3, decl(localID, token.value.p3!, token.token.$description));\n addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020!, token.token.$description));\n\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n const aliasID = makeCSSVar(alias.localID);\n addDeclUnique(hdrColors.p3, decl(aliasID, alias.value, alias.token.$description));\n addDeclUnique(hdrColors.rec2020, decl(aliasID, alias.value, alias.token.$description));\n }\n }\n }\n }\n\n // multi-value token\n else {\n for (const [name, subValue] of Object.entries(token.value)) {\n const subValueID = `${localID}-${name}`;\n addDeclUnique(root, decl(subValueID, subValue, token.token.$description));\n }\n // Note: always generate shorthand AFTER other declarations\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(root, decl(localID, shorthand, token.token.$description));\n }\n }\n\n // redeclare aliases so they have the correct scope\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n if (!includeToken(alias.id)) {\n continue;\n }\n addDeclUnique(root, decl(alias.localID, alias.value, token.token.$description));\n }\n }\n }\n\n const indentRules = getIndentFromPrepare(p.prepare);\n if (output) {\n output += '\\n';\n }\n output += `${p.prepare(printRules(root, indentRules))}\\n`;\n\n // declare P3 and Rec2020 gamuts, if needed\n for (const gamut of ['p3', 'rec2020'] as const) {\n if (hdrColors[gamut].length) {\n output += `\\n@media (color-gamut: ${gamut}) {\\n`;\n output += indentRules.indentChar;\n output += p\n .prepare(printRules(hdrColors[gamut], indentRules))\n .replace(/\\n(?!\\n)/g, `\\n${indentRules.indentChar}`); // indent every line an extra level\n output += '\\n}\\n';\n }\n }\n }\n\n // add utility CSS\n if (utility && Object.keys(utility).length) {\n if (output) {\n output += '\\n';\n }\n output += printRules(\n generateUtilityCSS(utility, getTransforms({ format: FORMAT_ID, input: permutations[0]?.input ?? {} }), {\n logger,\n }),\n );\n }\n\n return output;\n }\n\n // legacy plugin (will be deprecated in 3.0)\n let output = '';\n const rootTokens = getTransforms({ format: FORMAT_ID, mode: '.' });\n if (rootTokens.length) {\n const rules: CSSRule[] = [\n rule([baseSelector], []),\n rule([P3_MQ], [rule([baseSelector])]),\n rule([REC2020_MQ], [rule([baseSelector])]),\n ];\n\n const rootRule = rules[0]!;\n const p3Rule = rules[1]!.children[0] as CSSRule;\n const rec2020Rule = rules[2]!.children[0] as CSSRule;\n\n // add base color-scheme declaration first if configured\n // (must be before other properties to ensure it appears first in output)\n if (baseScheme) {\n rootRule.children.unshift(decl('color-scheme', baseScheme));\n }\n\n for (const token of rootTokens) {\n // handle exclude (if any)\n if (!include(token.token.id) || exclude(token.token.id)) {\n continue;\n }\n\n const localID = token.localID ?? token.token.id;\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(rootRule.children, decl(localID, token.value, token.token.$description));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(rootRule.children, decl(localID, token.value.srgb!, token.token.$description));\n\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(p3Rule.children, decl(localID, token.value.p3!, token.token.$description));\n addDeclUnique(rec2020Rule.children, decl(localID, token.value.rec2020!, token.token.$description));\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n addDeclUnique(p3Rule.children, decl(alias.localID, alias.value, token.token.$description));\n addDeclUnique(rec2020Rule.children, decl(alias.localID, alias.value, token.token.$description));\n }\n }\n }\n }\n\n // multi-value token\n else if (token.type === 'MULTI_VALUE') {\n for (const [name, value] of Object.entries(token.value)) {\n const property = name === '.' ? localID : [localID, name].join('-');\n addDeclUnique(rootRule.children, decl(property, value, token.token.$description));\n }\n // Note: always place shorthand after other values\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(rootRule.children, decl(token.localID ?? token.token.id, shorthand, token.token.$description));\n }\n }\n }\n\n output += printRules(rules);\n }\n\n // legacy modeSelectors\n // Delete this behavior in 3.0.\n // This code is intentionally left-alone as a separate code path so it behaves as it did with 0.x.\n for (const selector of modeSelectors ?? []) {\n const selectorTokens = getTransforms({ format: FORMAT_ID, id: selector.tokens, mode: selector.mode });\n if (!selectorTokens.length) {\n continue;\n }\n\n const modeRule: CSSRule = rule(selector.selectors);\n\n // add color-scheme declaration first if configured for this mode\n // (must be before other properties to ensure it appears first in output)\n if (selector.scheme) {\n modeRule.children.unshift(decl('color-scheme', selector.scheme));\n }\n const hdrColors = {\n p3: [] as CSSDeclaration[],\n rec2020: [] as CSSDeclaration[],\n };\n for (const token of selectorTokens) {\n const localID = token.localID ?? token.token.id;\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(modeRule.children, decl(localID, token.value, token.token.$description));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(modeRule.children, decl(localID, token.value.srgb!, token.token.$description));\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(hdrColors.p3, decl(localID, token.value.p3!, token.token.$description));\n addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020!, token.token.$description));\n\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n for (const gamut of ['p3', 'rec2020'] as const) {\n addDeclUnique(hdrColors[gamut], decl(alias.localID, alias.value, token.token.$description));\n }\n }\n }\n }\n }\n\n // multi-value token\n else {\n for (const [name, subValue] of Object.entries(token.value)) {\n addDeclUnique(modeRule.children, decl(`${localID}-${name}`, subValue, token.token.$description));\n }\n // Note: always generate shorthand after other declarations\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(modeRule.children, decl(localID, shorthand, token.token.$description));\n }\n }\n\n // redeclare aliases so they have the correct scope\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n addDeclUnique(modeRule.children, decl(alias.localID, alias.value, token.token.$description));\n }\n }\n }\n\n if (output) {\n output += '\\n\\n';\n }\n output += printRules([\n modeRule,\n rule([P3_MQ], [rule(selector.selectors, hdrColors.p3)]),\n rule([REC2020_MQ], [rule(selector.selectors, hdrColors.rec2020)]),\n ]);\n }\n\n // add utility CSS\n if (utility && Object.keys(utility).length) {\n if (output) {\n output += '\\n\\n';\n }\n output += printRules(generateUtilityCSS(utility, getTransforms({ format: FORMAT_ID, mode: '.' }), { logger }));\n }\n\n return output;\n}\n","import type { TokenNormalized, TransformHookOptions } from '@terrazzo/parser';\nimport { makeCSSVar, transformCSSValue } from '@terrazzo/token-tools/css';\nimport { type CSSPluginOptions, cachedMatcher, FORMAT_ID, PLUGIN_NAME } from './lib.js';\n\nexport interface TransformOptions {\n transform: TransformHookOptions;\n options: CSSPluginOptions;\n}\n\nexport default function transformCSS({\n transform: {\n context: { logger },\n resolver,\n setTransform,\n tokens: baseTokens,\n },\n options: {\n permutations,\n include: userInclude,\n exclude: userExclude,\n legacyHex,\n transform: customTransform,\n variableName,\n },\n}: TransformOptions) {\n function transformName(token: TokenNormalized) {\n const customName = variableName?.(token);\n if (customName !== undefined) {\n if (typeof customName !== 'string') {\n logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `variableName() must return a string; received ${customName}`,\n });\n }\n return customName;\n }\n return makeCSSVar(token.id);\n }\n const transformAlias = (token: TokenNormalized) => `var(${transformName(token)})`;\n\n const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;\n const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;\n\n // permutations\n if (Array.isArray(permutations)) {\n // For backwards-compat, if this resolver allows a “default” input,\n // also duplicate the token in the global space. This plays nicer with\n // plugins that haven’t upgraded to resolvers yet.\n // If there is no “default” permutation, then take the first one\n let defaultPermutationI = permutations.findIndex((p) => !Object.keys(p).length);\n if (defaultPermutationI === -1) {\n defaultPermutationI = 0;\n }\n\n for (let i = 0; i < permutations.length; i++) {\n const p = permutations[i]!;\n const input = p.input;\n const pInclude = p.include ? cachedMatcher.tokenIDMatch(p.include) : () => true;\n const pExclude = p.exclude ? cachedMatcher.tokenIDMatch(p.exclude) : () => false;\n\n const includeToken = (tokenId: string): boolean => {\n return include(tokenId) && pInclude(tokenId) && !exclude(tokenId) && !pExclude(tokenId);\n };\n // Note: if we throw an error here without specifying the input, a user may\n // find it impossible to debug the issue\n try {\n const tokens = resolver.apply(input);\n for (const token of Object.values(tokens)) {\n if (!includeToken(token.id)) {\n continue;\n }\n const value =\n customTransform?.(token) ??\n transformCSSValue(token, { tokensSet: tokens, transformAlias, color: { legacyHex } });\n if (value) {\n const localID = transformName(token);\n setTransform(token.id, {\n format: FORMAT_ID,\n value,\n localID,\n input,\n // TODO: plugin-css shouldn’t set metadata for plugin-token-listing; move this there\n meta: { 'token-listing': { name: localID } },\n });\n\n // If this is the default permutation, also duplicate to the default mode.\n // Be sure to only do this for ONE permutation! Otherwise output would break.\n if (defaultPermutationI === i) {\n setTransform(token.id, {\n format: FORMAT_ID,\n value,\n localID,\n mode: '.',\n // TODO: plugin-css shouldn’t set metadata for plugin-token-listing; move this there\n meta: { 'token-listing': { name: localID } },\n });\n }\n }\n }\n } catch (err) {\n logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `There was an error trying to apply input ${resolver.getPermutationID(input)}.`,\n continueOnError: true, // throw below\n });\n throw err; // note: this is most likely a nicely-formatted message from another logger instance; just pass it through\n }\n }\n\n return;\n }\n\n // modes (legacy)\n for (const token of Object.values(baseTokens)) {\n if (!include(token.id) || exclude(token.id)) {\n continue;\n }\n for (const mode of Object.keys(token.mode)) {\n const value =\n customTransform?.(token, '.') ??\n transformCSSValue(\n { ...token, ...(token.mode[mode] as any) },\n { tokensSet: baseTokens, transformAlias, color: { legacyHex } },\n );\n if (value) {\n const localID = transformName(token);\n setTransform(token.id, {\n format: FORMAT_ID,\n localID,\n value,\n mode,\n // TODO: plugin-css shouldn’t set metadata for plugin-token-listing; move this there\n meta: { 'token-listing': { name: localID } },\n });\n }\n }\n }\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport buildCSS from './build.js';\nimport { type CSSPluginOptions, FILE_PREFIX, FORMAT_ID, PLUGIN_NAME } from './lib.js';\nimport transformCSS from './transform.js';\n\nexport * from './build.js';\nexport {\n type CSSDeclaration,\n type CSSPluginOptions,\n type CSSRule,\n FILE_PREFIX,\n FORMAT_ID,\n type ModeSelector,\n type Permutation,\n PLUGIN_NAME,\n printNode,\n printRules,\n type UtilityCSSGroup,\n type UtilityCSSPrefix,\n} from './lib.js';\nexport * from './transform.js';\nexport * from './utility-css.js';\n\nexport default function cssPlugin(options?: CSSPluginOptions): Plugin {\n const { utility, skipBuild, baseScheme } = options ?? {};\n\n const filename = options?.filename ?? (options as any)?.fileName ?? 'index.css';\n const baseSelector = options?.baseSelector ?? ':root';\n\n return {\n name: PLUGIN_NAME,\n config(_config, context) {\n if (options?.permutations && (options?.modeSelectors || options?.baseSelector || options?.baseScheme)) {\n context.logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: 'Permutations option is incompatible with modeSelectors, baseSelector, and baseScheme.',\n });\n }\n },\n async transform(transformOptions) {\n // skip work if another .css plugin has already run\n const cssTokens = transformOptions.getTransforms({ format: FORMAT_ID, id: '*' });\n if (cssTokens.length) {\n return;\n }\n transformCSS({ transform: transformOptions, options: options ?? {} });\n },\n async build({ getTransforms, outputFile, context }) {\n if (skipBuild === true) {\n return;\n }\n\n let contents = `${FILE_PREFIX}\\n\\n`;\n contents += buildCSS({\n include: options?.include,\n exclude: options?.exclude,\n getTransforms,\n permutations: options?.permutations,\n modeSelectors: options?.modeSelectors,\n utility,\n baseSelector,\n baseScheme,\n logger: context.logger,\n });\n outputFile(filename, contents.replace(/\\n*$/, '\\n'));\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/lib.ts","../src/utility-css.ts","../src/build.ts","../src/transform.ts","../src/index.ts"],"sourcesContent":["import type { TokenNormalized, TokenTransformed } from '@terrazzo/parser';\nimport { CachedWildcardMatcher } from '@terrazzo/token-tools';\n\nimport type { TransformCSSValueOptions } from '@terrazzo/token-tools/css';\n\nexport type UtilityCSSGroup = 'bg' | 'border' | 'font' | 'layout' | 'shadow' | 'text';\n\nexport type UtilityCSSPrefix = 'bg' | 'border' | 'font' | 'gap' | 'm' | 'p' | 'shadow' | 'text';\n\nexport const PLUGIN_NAME = '@terrazzo/plugin-css';\n\nexport const FORMAT_ID = 'css';\n\nexport const cachedMatcher = new CachedWildcardMatcher();\n\nexport const FILE_PREFIX = `/* -------------------------------------------\n * Autogenerated by ⛋ Terrazzo. DO NOT EDIT!\n * ------------------------------------------- */`;\n\nexport interface CSSPluginOptions {\n /**\n * Where to output CSS\n * @default \"index.css\"\n */\n filename?: string;\n /** Glob patterns to filter tokens in output */\n include?: string[];\n /** Glob patterns to exclude tokens from output */\n exclude?: string[];\n /**\n * Set the base selector, like \":root\" or \":host\".\n * @deprecated use permutations instead.\n * @default \":root\"\n */\n baseSelector?: string;\n /**\n * Set the color-scheme CSS property for `baseSelector`.\n * @deprecated use permutations instead.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/color-scheme\n * @example \"light dark\"\n */\n baseScheme?: string;\n /**\n * Build resolver contexts into media queries\n */\n permutations?: Permutation[];\n /**\n * Define mode selectors as media queries or CSS classes\n * @deprecated Migrate to permutations\n */\n modeSelectors?: ModeSelector[];\n /** Control the final CSS variable name */\n variableName?: (token: TokenNormalized) => string;\n /** Override certain token values */\n transform?: (\n token: TokenNormalized,\n options: TransformCSSValueOptions,\n ) => TokenTransformed['value'] | undefined | null;\n /** Generate utility CSS from groups */\n utility?: Partial<Record<UtilityCSSGroup, string[]>>;\n /**\n * Output colors as hex-6/hex-8 instead of color() function\n * @default false\n */\n legacyHex?: boolean;\n /**\n * Skip generating any `.css` files (useful if you are consuming values in your own plugin and don’t need any `.css` files written to disk).\n * @default false\n */\n skipBuild?: boolean;\n}\n\nexport interface Permutation<T extends Record<string, string> = Record<string, string>> {\n /** Generate the final CSS string, wrapping content in the selector(s) of your choice. */\n prepare(contents: string): string;\n /** Input for this permutation. */\n input: T;\n /** Provide token(s) to include (Note: not including tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */\n include?: string[];\n /** Provide token(s) to exclude (Note: excluding tokens that are used as aliases for other tokens could cause visual bugs in generated CSS) */\n exclude?: string[];\n /**\n * Custom transform for this permutation\n */\n transform?: (\n token: TokenNormalized,\n options: TransformCSSValueOptions,\n ) => TokenTransformed['value'] | undefined | null;\n}\n\nexport interface ModeSelector {\n /** The name of the mode to match */\n mode: string;\n /** Provide token IDs to match. Globs are allowed (e.g: `[\"color.*\", \"shadow.dark\"]`) */\n tokens?: string[];\n /** Provide CSS selectors to generate. (e.g.: `[\"@media (prefers-color-scheme: dark)\", \"[data-color-theme='dark']\"]` ) */\n selectors: string[];\n /** Set the color-scheme CSS property for this mode (e.g.: \"light\", \"dark\", \"light dark\") */\n scheme?: string;\n}\n\n// Simple AST types loosely-inspired by csstree.\nexport interface CSSDeclaration {\n type: 'Declaration';\n property: string;\n value: string;\n comment?: string;\n}\n\nexport interface CSSRule {\n type: 'Rule';\n prelude: string[];\n children: (CSSRule | CSSDeclaration)[];\n}\n\n/**\n * Convert CSSRules into a formatted, indented CSS string.\n * The reason we’re using this homemade version instead of something like css-tree is:\n *\n * 1. css-tree doesn’t support comments :(\n * 2. we are only generating PARTIALS, not full CSS (the user controls the\n * wrapper). So with a proper AST, we’d be hacking it a little anyway because\n * we never really have a true, valid, finalized document.\n * 3. we want @terrazzo/plugin-css to run in the browser AND be lean (i.e. don’t\n * load Prettier or 25MB of wasm).\n * 4. we only have to deal with a small subset of CSS—this doesn’t have to be robust\n * by any means (even future additions won’t push the limits of the spec).\n */\nexport function printRules(\n nodes: (CSSRule | CSSDeclaration)[],\n { indentChar = ' ', indentLv = 0 }: { indentChar?: string; indentLv?: number } = {},\n): string {\n let output = '';\n for (const node of nodes) {\n if (output && node.type === 'Rule') {\n output += '\\n';\n }\n output += printNode(node, { indentChar, indentLv });\n }\n return output.trim();\n}\n\n/** Internal printer for individual nodes */\nexport function printNode(\n node: CSSRule | CSSDeclaration,\n { indentChar, indentLv }: { indentChar: string; indentLv: number },\n): string {\n let output = '';\n\n const indent = indentChar.repeat(indentLv);\n\n if (node.type === 'Declaration') {\n if (node.comment) {\n output += `${indent}/* ${node.comment} */\\n`;\n }\n output += `${indent}${node.property}: ${node.value};\\n`;\n return output;\n }\n\n if (!node.prelude.length || !node.children.length) {\n return output;\n }\n\n // legacy behavior: mediaQueryWithDecls should be removed in 3.0. This\n // was originally introduced in modeSelectors, but it generates unexpected CSS.\n const mediaQueryWithDecls = node.children.some((s) => s.type === 'Declaration')\n ? node.prelude.find((s) => s.startsWith('@'))\n : undefined;\n if (mediaQueryWithDecls) {\n const nonMedia = node.prelude.filter((s) => s !== mediaQueryWithDecls);\n output += `${indent}${mediaQueryWithDecls} {\\n`;\n output += printNode(rule([':root'], node.children), { indentChar, indentLv: indentLv + 1 });\n output += `${indent}}\\n\\n`;\n output += printNode(rule(nonMedia, node.children), { indentChar, indentLv });\n return output;\n }\n\n // Note: nested rules may eventually resolve to no declarations. This prevents that by rendering children first before the wrapper.\n let childOutput = '';\n for (const child of node.children) {\n childOutput += printNode(child, { indentChar, indentLv: indentLv + 1 });\n }\n childOutput = childOutput.trim();\n if (!childOutput) {\n return output;\n }\n output += `${indent}${node.prelude.join(', ')} {\\n`;\n output += `${indentChar.repeat(indentLv + 1)}${childOutput}\\n`;\n output += `${indent}}\\n`;\n return output;\n}\n\n/** Infer indentation preferences from a user-defined wrapping method. */\nexport function getIndentFromPrepare(prepare: Permutation['prepare']): { indentChar: string; indentLv: number } {\n const str = '//css//'; // this is a string that’s invalid CSS that wouldn’t be in the fn itself\n const output = prepare(str).replace(/\\/\\*.*\\*\\//g, ''); // strip comments because we don’t need them\n let indentChar = ' ';\n let indentLv = 0;\n let lineStartChar = 0;\n for (let i = 0; i < output.length; i++) {\n if (output[i] === '{') {\n lineStartChar = i + 1;\n indentLv++;\n } else if (output[i] === '}') {\n indentLv--;\n } else if (output[i] === '\\n') {\n lineStartChar = i + 1;\n } else if (output[i] === str[0] && output.slice(i).startsWith(str)) {\n indentChar = output.slice(lineStartChar, i);\n indentChar = indentChar.slice(0, Math.floor(indentChar.length / indentLv));\n break;\n }\n }\n return {\n indentChar: indentChar || ' ', // fall back to 2 spaces rather than no indentation\n indentLv,\n };\n}\n\n/** Syntactic sugar over Rule boilerplate */\nexport function rule(prelude: CSSRule['prelude'], children: CSSRule['children'] = []): CSSRule {\n return { type: 'Rule', prelude, children };\n}\n\n/** Syntactic sugar over Declaration boilerplate */\nexport function decl(\n property: CSSDeclaration['property'],\n value: CSSDeclaration['value'],\n comment?: CSSDeclaration['comment'],\n): CSSDeclaration {\n return { type: 'Declaration', property, value, comment };\n}\n\n/** Does a node list contain a root-level declaration with this property? */\nexport function hasDecl(list: (CSSRule | CSSDeclaration)[], property: string): boolean {\n return list.some((d) => d.type === 'Declaration' && d.property === property);\n}\n\n/** Add a declaration only if it’s unique (note: CSS, by design, allows duplication—it’s how fallbacks happen. Only use this if fallbacks aren’t needed. */\nexport function addDeclUnique(list: (CSSRule | CSSDeclaration)[], declaration: CSSDeclaration): void {\n if (!hasDecl(list, declaration.property)) {\n list.push(declaration);\n }\n}\n","import type { Logger, TokenTransformed } from '@terrazzo/parser';\nimport { CachedWildcardMatcher, kebabCase } from '@terrazzo/token-tools';\nimport { makeCSSVar } from '@terrazzo/token-tools/css';\nimport { type CSSRule, decl, PLUGIN_NAME, rule, type UtilityCSSGroup, type UtilityCSSPrefix } from './lib.js';\n\n// micro-optimization: precompile all RegExs (which can be known) because dynamic compilation is a waste of resources\nconst GROUP_REGEX: Record<UtilityCSSPrefix, RegExp> = {\n bg: /(^bg-|-bg-)/,\n border: /(^border-|-border-)/,\n font: /(^font-|-font-)/,\n gap: /(^gap-|-gap-)/,\n m: /(^margin-|-margin-|)/,\n p: /(^padding-|-padding-|)/,\n shadow: /(^shadow-|-shadow-)/,\n text: /(^text-|-text-)/,\n};\n\n/** Make CSS class name from transformed token */\nfunction makePrelude(token: TokenTransformed, prefix: UtilityCSSPrefix, subgroup?: string): CSSRule['prelude'] {\n return [`.${prefix}${subgroup || ''}-${kebabCase(token.token.id).replace(GROUP_REGEX[prefix], '')}`];\n}\n\nfunction makeVarValue(token: TokenTransformed): string {\n return makeCSSVar(token.localID ?? token.token.id, { wrapVar: true });\n}\n\nconst utilityMatcher = new CachedWildcardMatcher();\n\nexport default function generateUtilityCSS(\n groups: Partial<Record<UtilityCSSGroup, string[]>>,\n tokens: TokenTransformed[],\n { logger }: { logger: Logger },\n): CSSRule[] {\n const root: CSSRule[] = [];\n const groupEntries = Object.entries(groups);\n groupEntries.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [group, selectors] of groupEntries) {\n const selectorMatcher = utilityMatcher.match(selectors);\n const matchingTokens = tokens.filter((token) => selectorMatcher(token.token.id));\n if (!matchingTokens.length) {\n logger.warn({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `utility group \"${group}\" matched 0 tokens: ${JSON.stringify(selectors)}`,\n });\n break;\n }\n switch (group) {\n case 'bg': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'bg');\n switch (token.token.$type) {\n case 'color': {\n root.push(rule(prelude, [decl('background-color', makeVarValue(token))]));\n break;\n }\n case 'gradient': {\n const value = decl(\n 'background-image',\n `linear-gradient(${makeCSSVar(token.localID ?? token.token.id, { wrapVar: true })})`,\n );\n root.push(rule(prelude, [value]));\n }\n }\n }\n break;\n }\n case 'border': {\n // ALL generic properties must come before specific properties\n for (const token of matchingTokens) {\n const property = {\n border: 'border',\n color: 'border-color',\n dimension: 'border-width',\n strokeStyle: 'border-style',\n }[token.token.$type as string];\n if (property) {\n root.push(rule(makePrelude(token, 'border'), [decl(property, makeVarValue(token))]));\n }\n }\n // specific properties\n for (const token of matchingTokens) {\n for (const side of ['top', 'right', 'bottom', 'left']) {\n const property = {\n border: `border-${side}`,\n color: `border-${side}-color`,\n dimension: `border-${side}-width`,\n strokeStyle: `border-${side}-style`,\n }[token.token.$type as string];\n if (property) {\n root.push(rule(makePrelude(token, 'border', `-${side}`), [decl(property, makeVarValue(token))]));\n }\n }\n }\n break;\n }\n case 'font': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'font');\n if (token.token.$type === 'typography' && token.type === 'MULTI_VALUE') {\n const value = Object.keys(token.value).map((property) =>\n decl(property, makeCSSVar(`${token.localID ?? token.token.id}-${property}`, { wrapVar: true })),\n );\n root.push(rule(prelude, value));\n } else {\n const property = {\n dimension: 'font-size',\n fontFamily: 'font-family',\n fontWeight: 'font-weight',\n }[token.token.$type as string];\n if (property) {\n root.push(rule(prelude, [decl(property, makeVarValue(token))]));\n }\n }\n }\n break;\n }\n case 'layout': {\n const filteredTokens = matchingTokens.filter((t) => t.token.$type === 'dimension'); // only dimension tokens here\n // gap\n // ALL generic properties (gap) must come before specific properties (column-gap)\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap'), [decl('gap', makeVarValue(token))]));\n }\n // specific properties\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap', '-col'), [decl('column-gap', makeVarValue(token))]));\n }\n // specific properties\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, 'gap', '-row'), [decl('row-gap', makeVarValue(token))]));\n }\n\n // margin/padding\n for (const prefix of ['m', 'p'] as const) {\n const property = prefix === 'm' ? 'margin' : 'padding';\n // note: ALL generic properties (margin: [value]) MUST come before specific properties (margin-top: [value])\n // this is why we loop through all tokens so many times\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, prefix, 'a'), [decl(property, makeVarValue(token))]));\n }\n for (const token of filteredTokens) {\n const value = makeVarValue(token);\n root.push(\n rule(makePrelude(token, prefix, 'x'), [\n decl(`${property}-inline`, value),\n decl(`${property}-left`, value),\n decl(`${property}-right`, value),\n ]),\n rule(makePrelude(token, prefix, 'y'), [\n decl(`${property}-block`, value),\n decl(`${property}-bottom`, value),\n decl(`${property}-top`, value),\n ]),\n );\n }\n for (const side of ['top', 'right', 'bottom', 'left']) {\n for (const token of filteredTokens) {\n root.push(rule(makePrelude(token, prefix, side[0]), [decl(`${property}-${side}`, makeVarValue(token))]));\n }\n }\n for (const token of filteredTokens) {\n const value = makeVarValue(token);\n root.push(\n rule(makePrelude(token, prefix, 'bs'), [decl(`${property}-block-start`, value)]),\n rule(makePrelude(token, prefix, 'be'), [decl(`${property}-block-end`, value)]),\n rule(makePrelude(token, prefix, 'is'), [decl(`${property}-inline-start`, value)]),\n rule(makePrelude(token, prefix, 'ie'), [decl(`${property}-inline-end`, value)]),\n );\n }\n }\n break;\n }\n case 'shadow': {\n for (const token of matchingTokens) {\n if (token.token.$type === 'shadow') {\n root.push(rule(makePrelude(token, 'shadow'), [decl('box-shadow', makeVarValue(token))]));\n }\n }\n break;\n }\n case 'text': {\n for (const token of matchingTokens) {\n const prelude = makePrelude(token, 'text');\n const value = makeVarValue(token);\n switch (token.token.$type) {\n case 'color': {\n root.push(rule(prelude, [decl('color', value)]));\n break;\n }\n case 'gradient': {\n root.push(\n rule(prelude, [\n decl('background', `-webkit-linear-gradient(${value})`),\n decl('-webkit-background-clip', 'text'),\n decl('-webkit-text-fill-color', 'transparent'),\n ]),\n );\n break;\n }\n }\n }\n break;\n }\n default: {\n logger.warn({ group: 'plugin', label: PLUGIN_NAME, message: `unknown utility CSS group \"${group}\", ignoring` });\n break;\n }\n }\n }\n\n return root;\n}\n","import type { BuildHookOptions, Logger } from '@terrazzo/parser';\nimport { generateShorthand, makeCSSVar } from '@terrazzo/token-tools/css';\nimport {\n addDeclUnique,\n type CSSDeclaration,\n type CSSPluginOptions,\n type CSSRule,\n cachedMatcher,\n decl,\n FORMAT_ID,\n getIndentFromPrepare,\n PLUGIN_NAME,\n printRules,\n rule,\n} from './lib.js';\nimport generateUtilityCSS from './utility-css.js';\n\nconst P3_MQ = '@media (color-gamut: p3)';\nconst REC2020_MQ = '@media (color-gamut: rec2020)';\n\n/**\n * Get description from metadata with fallback to token.$description\n * Preserves the descriptions and alias descriptions.\n */\nfunction getDescription(token: any): string | undefined {\n return token.meta?.['plugin-css']?.description ?? token.token.$description;\n}\n\nexport interface BuildFormatOptions {\n logger: Logger;\n include: CSSPluginOptions['include'];\n exclude: CSSPluginOptions['exclude'];\n getTransforms: BuildHookOptions['getTransforms'];\n modeSelectors: CSSPluginOptions['modeSelectors'];\n permutations: CSSPluginOptions['permutations'];\n utility: CSSPluginOptions['utility'];\n baseSelector: string;\n baseScheme: CSSPluginOptions['baseScheme'];\n}\n\nexport default function buildCSS({\n logger,\n getTransforms,\n include: userInclude,\n exclude: userExclude,\n utility,\n permutations,\n modeSelectors,\n baseSelector,\n baseScheme,\n}: BuildFormatOptions): string {\n const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;\n const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;\n if (permutations?.length) {\n let output = '';\n\n for (const p of permutations) {\n if (typeof p.prepare !== 'function') {\n logger.error({ group: 'plugin', label: PLUGIN_NAME, message: 'prepare(css) must be a function!' });\n }\n\n const tokens = getTransforms({ format: FORMAT_ID, input: p.input });\n if (!tokens.length) {\n continue;\n }\n\n const root: (CSSRule | CSSDeclaration)[] = [];\n const hdrColors = {\n p3: [] as CSSDeclaration[],\n rec2020: [] as CSSDeclaration[],\n };\n\n const pInclude = p.include ? cachedMatcher.tokenIDMatch(p.include) : () => true;\n const pExclude = p.exclude ? cachedMatcher.tokenIDMatch(p.exclude) : () => false;\n\n const includeToken = (tokenId: string): boolean => {\n return include(tokenId) && pInclude(tokenId) && !exclude(tokenId) && !pExclude(tokenId);\n };\n\n for (const token of tokens) {\n if (!includeToken(token.id)) {\n continue;\n }\n const localID = makeCSSVar(token.localID ?? token.token.id);\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy, input: p.input })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(root, decl(localID, token.value, getDescription(token)));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(root, decl(localID, token.value.srgb!, getDescription(token)));\n\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(hdrColors.p3, decl(localID, token.value.p3!, getDescription(token)));\n addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020!, getDescription(token)));\n\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n const aliasID = makeCSSVar(alias.localID);\n addDeclUnique(hdrColors.p3, decl(aliasID, alias.value, getDescription(alias)));\n addDeclUnique(hdrColors.rec2020, decl(aliasID, alias.value, getDescription(alias)));\n }\n }\n }\n }\n\n // multi-value token\n else {\n for (const [name, subValue] of Object.entries(token.value)) {\n const subValueID = `${localID}-${name}`;\n addDeclUnique(root, decl(subValueID, subValue, getDescription(token)));\n }\n // Note: always generate shorthand AFTER other declarations\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(root, decl(localID, shorthand, getDescription(token)));\n }\n }\n\n // redeclare aliases so they have the correct scope\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n if (!includeToken(alias.id)) {\n continue;\n }\n addDeclUnique(root, decl(alias.localID, alias.value, getDescription(token)));\n }\n }\n }\n\n const indentRules = getIndentFromPrepare(p.prepare);\n if (output) {\n output += '\\n';\n }\n output += `${p.prepare(printRules(root, indentRules))}\\n`;\n\n // declare P3 and Rec2020 gamuts, if needed\n for (const gamut of ['p3', 'rec2020'] as const) {\n if (hdrColors[gamut].length) {\n output += `\\n@media (color-gamut: ${gamut}) {\\n`;\n output += indentRules.indentChar;\n output += p\n .prepare(printRules(hdrColors[gamut], indentRules))\n .replace(/\\n(?!\\n)/g, `\\n${indentRules.indentChar}`); // indent every line an extra level\n output += '\\n}\\n';\n }\n }\n }\n\n // add utility CSS\n if (utility && Object.keys(utility).length) {\n if (output) {\n output += '\\n';\n }\n output += printRules(\n generateUtilityCSS(utility, getTransforms({ format: FORMAT_ID, input: permutations[0]?.input ?? {} }), {\n logger,\n }),\n );\n }\n\n return output;\n }\n\n // legacy plugin (will be deprecated in 3.0)\n let output = '';\n const rootTokens = getTransforms({ format: FORMAT_ID, mode: '.' });\n if (rootTokens.length) {\n const rules: CSSRule[] = [\n rule([baseSelector], []),\n rule([P3_MQ], [rule([baseSelector])]),\n rule([REC2020_MQ], [rule([baseSelector])]),\n ];\n\n const rootRule = rules[0]!;\n const p3Rule = rules[1]!.children[0] as CSSRule;\n const rec2020Rule = rules[2]!.children[0] as CSSRule;\n\n // add base color-scheme declaration first if configured\n // (must be before other properties to ensure it appears first in output)\n if (baseScheme) {\n rootRule.children.unshift(decl('color-scheme', baseScheme));\n }\n\n for (const token of rootTokens) {\n // handle exclude (if any)\n if (!include(token.token.id) || exclude(token.token.id)) {\n continue;\n }\n\n const localID = token.localID ?? token.token.id;\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(rootRule.children, decl(localID, token.value, getDescription(token)));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(rootRule.children, decl(localID, token.value.srgb!, getDescription(token)));\n\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(p3Rule.children, decl(localID, token.value.p3!, getDescription(token)));\n addDeclUnique(rec2020Rule.children, decl(localID, token.value.rec2020!, getDescription(token)));\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n addDeclUnique(p3Rule.children, decl(alias.localID, alias.value, getDescription(alias)));\n addDeclUnique(rec2020Rule.children, decl(alias.localID, alias.value, getDescription(alias)));\n }\n }\n }\n }\n\n // multi-value token\n else if (token.type === 'MULTI_VALUE') {\n for (const [name, value] of Object.entries(token.value)) {\n const property = name === '.' ? localID : [localID, name].join('-');\n addDeclUnique(rootRule.children, decl(property, value, getDescription(token)));\n }\n // Note: always place shorthand after other values\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(rootRule.children, decl(token.localID ?? token.token.id, shorthand, getDescription(token)));\n }\n }\n }\n\n output += printRules(rules);\n }\n\n // legacy modeSelectors\n // Delete this behavior in 3.0.\n // This code is intentionally left-alone as a separate code path so it behaves as it did with 0.x.\n for (const selector of modeSelectors ?? []) {\n const selectorTokens = getTransforms({ format: FORMAT_ID, id: selector.tokens, mode: selector.mode });\n if (!selectorTokens.length) {\n continue;\n }\n\n const modeRule: CSSRule = rule(selector.selectors);\n\n // add color-scheme declaration first if configured for this mode\n // (must be before other properties to ensure it appears first in output)\n if (selector.scheme) {\n modeRule.children.unshift(decl('color-scheme', selector.scheme));\n }\n const hdrColors = {\n p3: [] as CSSDeclaration[],\n rec2020: [] as CSSDeclaration[],\n };\n for (const token of selectorTokens) {\n const localID = token.localID ?? token.token.id;\n const aliasTokens = token.token.aliasedBy?.length\n ? getTransforms({ format: FORMAT_ID, id: token.token.aliasedBy })\n : [];\n\n // single-value token\n if (token.type === 'SINGLE_VALUE') {\n addDeclUnique(modeRule.children, decl(localID, token.value, getDescription(token)));\n }\n\n // multi-value token (wide gamut color)\n else if (token.value.srgb && token.value.p3 && token.value.rec2020) {\n addDeclUnique(modeRule.children, decl(localID, token.value.srgb!, getDescription(token)));\n if (token.value.p3 !== token.value.srgb) {\n addDeclUnique(hdrColors.p3, decl(localID, token.value.p3!, getDescription(token)));\n addDeclUnique(hdrColors.rec2020, decl(localID, token.value.rec2020!, getDescription(token)));\n\n // handle aliases within color gamut media queries\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n for (const gamut of ['p3', 'rec2020'] as const) {\n addDeclUnique(hdrColors[gamut], decl(alias.localID, alias.value, getDescription(alias)));\n }\n }\n }\n }\n }\n\n // multi-value token\n else {\n for (const [name, subValue] of Object.entries(token.value)) {\n addDeclUnique(modeRule.children, decl(`${localID}-${name}`, subValue, getDescription(token)));\n }\n // Note: always generate shorthand after other declarations\n const shorthand = generateShorthand({ token: { ...token.token, $value: token.value as any }, localID });\n if (shorthand) {\n addDeclUnique(modeRule.children, decl(localID, shorthand, getDescription(token)));\n }\n }\n\n // redeclare aliases so they have the correct scope\n for (const alias of aliasTokens) {\n if (alias.localID && typeof alias.value === 'string') {\n addDeclUnique(modeRule.children, decl(alias.localID, alias.value, getDescription(token)));\n }\n }\n }\n\n if (output) {\n output += '\\n\\n';\n }\n output += printRules([\n modeRule,\n rule([P3_MQ], [rule(selector.selectors, hdrColors.p3)]),\n rule([REC2020_MQ], [rule(selector.selectors, hdrColors.rec2020)]),\n ]);\n }\n\n // add utility CSS\n if (utility && Object.keys(utility).length) {\n if (output) {\n output += '\\n\\n';\n }\n output += printRules(generateUtilityCSS(utility, getTransforms({ format: FORMAT_ID, mode: '.' }), { logger }));\n }\n\n return output;\n}\n","import type { TokenNormalized, TransformHookOptions } from '@terrazzo/parser';\nimport { makeCSSVar, type TransformCSSValueOptions, transformCSSValue } from '@terrazzo/token-tools/css';\nimport { type CSSPluginOptions, cachedMatcher, FORMAT_ID, PLUGIN_NAME } from './lib.js';\n\nexport interface TransformOptions {\n transform: TransformHookOptions;\n options: CSSPluginOptions;\n}\n\nexport default function transformCSS({\n transform: {\n context: { logger },\n resolver,\n setTransform,\n tokens: baseTokens,\n },\n options: {\n permutations,\n include: userInclude,\n exclude: userExclude,\n legacyHex,\n transform: customTransform,\n variableName,\n },\n}: TransformOptions) {\n function transformName(token: TokenNormalized) {\n const customName = variableName?.(token);\n if (customName !== undefined) {\n if (typeof customName !== 'string') {\n logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `variableName() must return a string; received ${customName}`,\n });\n }\n return customName;\n }\n return makeCSSVar(token.id);\n }\n const transformAlias = (token: TokenNormalized) => `var(${transformName(token)})`;\n\n const include = userInclude ? cachedMatcher.tokenIDMatch(userInclude) : () => true;\n const exclude = userExclude ? cachedMatcher.tokenIDMatch(userExclude) : () => false;\n\n // permutations\n if (Array.isArray(permutations)) {\n // For backwards-compat, if this resolver allows a “default” input,\n // also duplicate the token in the global space. This plays nicer with\n // plugins that haven’t upgraded to resolvers yet.\n // If there is no “default” permutation, then take the first one\n let defaultPermutationI = permutations.findIndex((p) => !Object.keys(p.input ?? {}).length);\n if (defaultPermutationI === -1) {\n defaultPermutationI = 0;\n }\n\n for (let i = 0; i < permutations.length; i++) {\n const p = permutations[i]!;\n const inputRaw = p.input;\n const input = !Object.keys(inputRaw ?? {}).length\n ? (JSON.parse(resolver.getPermutationID(inputRaw ?? {})) as Record<string, string>)\n : inputRaw;\n\n const pInclude = p.include ? cachedMatcher.tokenIDMatch(p.include) : () => true;\n const pExclude = p.exclude ? cachedMatcher.tokenIDMatch(p.exclude) : () => false;\n\n const includeToken = (tokenId: string): boolean => {\n return include(tokenId) && pInclude(tokenId) && !exclude(tokenId) && !pExclude(tokenId);\n };\n // Note: if we throw an error here without specifying the input, a user may\n // find it impossible to debug the issue\n try {\n const tokens = resolver.apply(input);\n for (const token of Object.values(tokens)) {\n if (!includeToken(token.id)) {\n continue;\n }\n const options: TransformCSSValueOptions = {\n tokensSet: tokens,\n transformAlias,\n color: { legacyHex },\n permutation: input,\n };\n const value =\n p.transform?.(token, options) ?? customTransform?.(token, options) ?? transformCSSValue(token, options);\n if (value) {\n const localID = transformName(token);\n setTransform(token.id, {\n format: FORMAT_ID,\n value,\n localID,\n input,\n // Store description in metadata for plugin-css to access later\n meta: {\n 'plugin-css': {\n description: token.$description,\n },\n 'token-listing': { name: localID },\n },\n });\n\n // If this is the default permutation, also duplicate to the default mode.\n // Be sure to only do this for ONE permutation! Otherwise output would break.\n if (defaultPermutationI === i) {\n setTransform(token.id, {\n format: FORMAT_ID,\n value,\n localID,\n mode: '.',\n // Store description in metadata for plugin-css to access later\n meta: {\n 'plugin-css': {\n description: token.$description,\n },\n 'token-listing': { name: localID },\n },\n });\n }\n }\n }\n } catch (err) {\n logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: `There was an error trying to apply input ${resolver.getPermutationID(input)}.`,\n continueOnError: true, // throw below\n });\n throw err; // note: this is most likely a nicely-formatted message from another logger instance; just pass it through\n }\n }\n\n return;\n }\n\n // modes (legacy)\n for (const token of Object.values(baseTokens)) {\n if (!include(token.id) || exclude(token.id)) {\n continue;\n }\n for (const mode of Object.keys(token.mode)) {\n const tokenArgs: TokenNormalized = { ...token, ...(token.mode[mode] as any) };\n const options: TransformCSSValueOptions = {\n tokensSet: baseTokens,\n transformAlias,\n color: { legacyHex },\n permutation: { tzMode: '.' },\n };\n const value = customTransform?.(tokenArgs, options) ?? transformCSSValue(tokenArgs, options);\n if (value) {\n const localID = transformName(token);\n setTransform(token.id, {\n format: FORMAT_ID,\n localID,\n value,\n mode,\n // TODO: plugin-css shouldn’t set metadata for plugin-token-listing; move this there\n meta: {\n 'plugin-css': {\n description: token.$description,\n },\n 'token-listing': { name: localID },\n },\n });\n }\n }\n }\n}\n","import type { Plugin } from '@terrazzo/parser';\nimport buildCSS from './build.js';\nimport { type CSSPluginOptions, FILE_PREFIX, PLUGIN_NAME } from './lib.js';\nimport transformCSS from './transform.js';\n\nexport * from './build.js';\nexport {\n type CSSDeclaration,\n type CSSPluginOptions,\n type CSSRule,\n FILE_PREFIX,\n FORMAT_ID,\n type ModeSelector,\n type Permutation,\n PLUGIN_NAME,\n printNode,\n printRules,\n type UtilityCSSGroup,\n type UtilityCSSPrefix,\n} from './lib.js';\nexport * from './transform.js';\nexport * from './utility-css.js';\n\nexport default function cssPlugin(options?: CSSPluginOptions): Plugin {\n const { utility, skipBuild, baseScheme } = options ?? {};\n\n const filename = options?.filename ?? (options as any)?.fileName ?? 'index.css';\n const baseSelector = options?.baseSelector ?? ':root';\n\n return {\n name: PLUGIN_NAME,\n config(_config, context) {\n if (options?.permutations && (options?.modeSelectors || options?.baseSelector || options?.baseScheme)) {\n context.logger.error({\n group: 'plugin',\n label: PLUGIN_NAME,\n message: 'Permutations option is incompatible with modeSelectors, baseSelector, and baseScheme.',\n });\n }\n },\n async transform(transformOptions) {\n transformCSS({ transform: transformOptions, options: options ?? {} });\n },\n async build({ getTransforms, outputFile, context }) {\n if (skipBuild === true) {\n return;\n }\n\n let contents = `${FILE_PREFIX}\\n\\n`;\n contents += buildCSS({\n include: options?.include,\n exclude: options?.exclude,\n getTransforms,\n permutations: options?.permutations,\n modeSelectors: options?.modeSelectors,\n utility,\n baseSelector,\n baseScheme,\n logger: context.logger,\n });\n outputFile(filename, contents.replace(/\\n*$/, '\\n'));\n },\n };\n}\n"],"mappings":";;;;AASA,MAAa,cAAc;AAE3B,MAAa,YAAY;AAEzB,MAAa,gBAAgB,IAAI,uBAAuB;AAExD,MAAa,cAAc;;;;;;;;;;;;;;;;AAiH3B,SAAgB,WACd,OACA,EAAE,aAAa,MAAM,WAAW,MAAkD,EAAE,EAC5E;CACR,IAAI,SAAS;AACb,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,UAAU,KAAK,SAAS,OAC1B,WAAU;AAEZ,YAAU,UAAU,MAAM;GAAE;GAAY;GAAU,CAAC;;AAErD,QAAO,OAAO,MAAM;;;AAItB,SAAgB,UACd,MACA,EAAE,YAAY,YACN;CACR,IAAI,SAAS;CAEb,MAAM,SAAS,WAAW,OAAO,SAAS;AAE1C,KAAI,KAAK,SAAS,eAAe;AAC/B,MAAI,KAAK,QACP,WAAU,GAAG,OAAO,KAAK,KAAK,QAAQ;AAExC,YAAU,GAAG,SAAS,KAAK,SAAS,IAAI,KAAK,MAAM;AACnD,SAAO;;AAGT,KAAI,CAAC,KAAK,QAAQ,UAAU,CAAC,KAAK,SAAS,OACzC,QAAO;CAKT,MAAM,sBAAsB,KAAK,SAAS,MAAM,MAAM,EAAE,SAAS,cAAc,GAC3E,KAAK,QAAQ,MAAM,MAAM,EAAE,WAAW,IAAI,CAAC,GAC3C;AACJ,KAAI,qBAAqB;EACvB,MAAM,WAAW,KAAK,QAAQ,QAAQ,MAAM,MAAM,oBAAoB;AACtE,YAAU,GAAG,SAAS,oBAAoB;AAC1C,YAAU,UAAU,KAAK,CAAC,QAAQ,EAAE,KAAK,SAAS,EAAE;GAAE;GAAY,UAAU,WAAW;GAAG,CAAC;AAC3F,YAAU,GAAG,OAAO;AACpB,YAAU,UAAU,KAAK,UAAU,KAAK,SAAS,EAAE;GAAE;GAAY;GAAU,CAAC;AAC5E,SAAO;;CAIT,IAAI,cAAc;AAClB,MAAK,MAAM,SAAS,KAAK,SACvB,gBAAe,UAAU,OAAO;EAAE;EAAY,UAAU,WAAW;EAAG,CAAC;AAEzE,eAAc,YAAY,MAAM;AAChC,KAAI,CAAC,YACH,QAAO;AAET,WAAU,GAAG,SAAS,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC9C,WAAU,GAAG,WAAW,OAAO,WAAW,EAAE,GAAG,YAAY;AAC3D,WAAU,GAAG,OAAO;AACpB,QAAO;;;AAIT,SAAgB,qBAAqB,SAA2E;CAC9G,MAAM,MAAM;CACZ,MAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ,eAAe,GAAG;CACtD,IAAI,aAAa;CACjB,IAAI,WAAW;CACf,IAAI,gBAAgB;AACpB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,IACjC,KAAI,OAAO,OAAO,KAAK;AACrB,kBAAgB,IAAI;AACpB;YACS,OAAO,OAAO,IACvB;UACS,OAAO,OAAO,KACvB,iBAAgB,IAAI;UACX,OAAO,OAAO,IAAI,MAAM,OAAO,MAAM,EAAE,CAAC,WAAW,IAAI,EAAE;AAClE,eAAa,OAAO,MAAM,eAAe,EAAE;AAC3C,eAAa,WAAW,MAAM,GAAG,KAAK,MAAM,WAAW,SAAS,SAAS,CAAC;AAC1E;;AAGJ,QAAO;EACL,YAAY,cAAc;EAC1B;EACD;;;AAIH,SAAgB,KAAK,SAA6B,WAAgC,EAAE,EAAW;AAC7F,QAAO;EAAE,MAAM;EAAQ;EAAS;EAAU;;;AAI5C,SAAgB,KACd,UACA,OACA,SACgB;AAChB,QAAO;EAAE,MAAM;EAAe;EAAU;EAAO;EAAS;;;AAI1D,SAAgB,QAAQ,MAAoC,UAA2B;AACrF,QAAO,KAAK,MAAM,MAAM,EAAE,SAAS,iBAAiB,EAAE,aAAa,SAAS;;;AAI9E,SAAgB,cAAc,MAAoC,aAAmC;AACnG,KAAI,CAAC,QAAQ,MAAM,YAAY,SAAS,CACtC,MAAK,KAAK,YAAY;;;;;AC3O1B,MAAM,cAAgD;CACpD,IAAI;CACJ,QAAQ;CACR,MAAM;CACN,KAAK;CACL,GAAG;CACH,GAAG;CACH,QAAQ;CACR,MAAM;CACP;;AAGD,SAAS,YAAY,OAAyB,QAA0B,UAAuC;AAC7G,QAAO,CAAC,IAAI,SAAS,YAAY,GAAG,GAAG,UAAU,MAAM,MAAM,GAAG,CAAC,QAAQ,YAAY,SAAS,GAAG,GAAG;;AAGtG,SAAS,aAAa,OAAiC;AACrD,QAAO,WAAW,MAAM,WAAW,MAAM,MAAM,IAAI,EAAE,SAAS,MAAM,CAAC;;AAGvE,MAAM,iBAAiB,IAAI,uBAAuB;AAElD,SAAwB,mBACtB,QACA,QACA,EAAE,UACS;CACX,MAAM,OAAkB,EAAE;CAC1B,MAAM,eAAe,OAAO,QAAQ,OAAO;AAC3C,cAAa,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,GAAG,CAAC;AAErD,MAAK,MAAM,CAAC,OAAO,cAAc,cAAc;EAC7C,MAAM,kBAAkB,eAAe,MAAM,UAAU;EACvD,MAAM,iBAAiB,OAAO,QAAQ,UAAU,gBAAgB,MAAM,MAAM,GAAG,CAAC;AAChF,MAAI,CAAC,eAAe,QAAQ;AAC1B,UAAO,KAAK;IACV,OAAO;IACP,OAAO;IACP,SAAS,kBAAkB,MAAM,sBAAsB,KAAK,UAAU,UAAU;IACjF,CAAC;AACF;;AAEF,UAAQ,OAAR;GACE,KAAK;AACH,SAAK,MAAM,SAAS,gBAAgB;KAClC,MAAM,UAAU,YAAY,OAAO,KAAK;AACxC,aAAQ,MAAM,MAAM,OAApB;MACE,KAAK;AACH,YAAK,KAAK,KAAK,SAAS,CAAC,KAAK,oBAAoB,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AACzE;MAEF,KAAK,YAAY;OACf,MAAM,QAAQ,KACZ,oBACA,mBAAmB,WAAW,MAAM,WAAW,MAAM,MAAM,IAAI,EAAE,SAAS,MAAM,CAAC,CAAC,GACnF;AACD,YAAK,KAAK,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC;;;;AAIvC;GAEF,KAAK;AAEH,SAAK,MAAM,SAAS,gBAAgB;KAClC,MAAM,WAAW;MACf,QAAQ;MACR,OAAO;MACP,WAAW;MACX,aAAa;MACd,CAAC,MAAM,MAAM;AACd,SAAI,SACF,MAAK,KAAK,KAAK,YAAY,OAAO,SAAS,EAAE,CAAC,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;;AAIxF,SAAK,MAAM,SAAS,eAClB,MAAK,MAAM,QAAQ;KAAC;KAAO;KAAS;KAAU;KAAO,EAAE;KACrD,MAAM,WAAW;MACf,QAAQ,UAAU;MAClB,OAAO,UAAU,KAAK;MACtB,WAAW,UAAU,KAAK;MAC1B,aAAa,UAAU,KAAK;MAC7B,CAAC,MAAM,MAAM;AACd,SAAI,SACF,MAAK,KAAK,KAAK,YAAY,OAAO,UAAU,IAAI,OAAO,EAAE,CAAC,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;;AAItG;GAEF,KAAK;AACH,SAAK,MAAM,SAAS,gBAAgB;KAClC,MAAM,UAAU,YAAY,OAAO,OAAO;AAC1C,SAAI,MAAM,MAAM,UAAU,gBAAgB,MAAM,SAAS,eAAe;MACtE,MAAM,QAAQ,OAAO,KAAK,MAAM,MAAM,CAAC,KAAK,aAC1C,KAAK,UAAU,WAAW,GAAG,MAAM,WAAW,MAAM,MAAM,GAAG,GAAG,YAAY,EAAE,SAAS,MAAM,CAAC,CAAC,CAChG;AACD,WAAK,KAAK,KAAK,SAAS,MAAM,CAAC;YAC1B;MACL,MAAM,WAAW;OACf,WAAW;OACX,YAAY;OACZ,YAAY;OACb,CAAC,MAAM,MAAM;AACd,UAAI,SACF,MAAK,KAAK,KAAK,SAAS,CAAC,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;;;AAIrE;GAEF,KAAK,UAAU;IACb,MAAM,iBAAiB,eAAe,QAAQ,MAAM,EAAE,MAAM,UAAU,YAAY;AAGlF,SAAK,MAAM,SAAS,eAClB,MAAK,KAAK,KAAK,YAAY,OAAO,MAAM,EAAE,CAAC,KAAK,OAAO,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAGhF,SAAK,MAAM,SAAS,eAClB,MAAK,KAAK,KAAK,YAAY,OAAO,OAAO,OAAO,EAAE,CAAC,KAAK,cAAc,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAG/F,SAAK,MAAM,SAAS,eAClB,MAAK,KAAK,KAAK,YAAY,OAAO,OAAO,OAAO,EAAE,CAAC,KAAK,WAAW,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAI5F,SAAK,MAAM,UAAU,CAAC,KAAK,IAAI,EAAW;KACxC,MAAM,WAAW,WAAW,MAAM,WAAW;AAG7C,UAAK,MAAM,SAAS,eAClB,MAAK,KAAK,KAAK,YAAY,OAAO,QAAQ,IAAI,EAAE,CAAC,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAEzF,UAAK,MAAM,SAAS,gBAAgB;MAClC,MAAM,QAAQ,aAAa,MAAM;AACjC,WAAK,KACH,KAAK,YAAY,OAAO,QAAQ,IAAI,EAAE;OACpC,KAAK,GAAG,SAAS,UAAU,MAAM;OACjC,KAAK,GAAG,SAAS,QAAQ,MAAM;OAC/B,KAAK,GAAG,SAAS,SAAS,MAAM;OACjC,CAAC,EACF,KAAK,YAAY,OAAO,QAAQ,IAAI,EAAE;OACpC,KAAK,GAAG,SAAS,SAAS,MAAM;OAChC,KAAK,GAAG,SAAS,UAAU,MAAM;OACjC,KAAK,GAAG,SAAS,OAAO,MAAM;OAC/B,CAAC,CACH;;AAEH,UAAK,MAAM,QAAQ;MAAC;MAAO;MAAS;MAAU;MAAO,CACnD,MAAK,MAAM,SAAS,eAClB,MAAK,KAAK,KAAK,YAAY,OAAO,QAAQ,KAAK,GAAG,EAAE,CAAC,KAAK,GAAG,SAAS,GAAG,QAAQ,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAG5G,UAAK,MAAM,SAAS,gBAAgB;MAClC,MAAM,QAAQ,aAAa,MAAM;AACjC,WAAK,KACH,KAAK,YAAY,OAAO,QAAQ,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS,eAAe,MAAM,CAAC,CAAC,EAChF,KAAK,YAAY,OAAO,QAAQ,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS,aAAa,MAAM,CAAC,CAAC,EAC9E,KAAK,YAAY,OAAO,QAAQ,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS,gBAAgB,MAAM,CAAC,CAAC,EACjF,KAAK,YAAY,OAAO,QAAQ,KAAK,EAAE,CAAC,KAAK,GAAG,SAAS,cAAc,MAAM,CAAC,CAAC,CAChF;;;AAGL;;GAEF,KAAK;AACH,SAAK,MAAM,SAAS,eAClB,KAAI,MAAM,MAAM,UAAU,SACxB,MAAK,KAAK,KAAK,YAAY,OAAO,SAAS,EAAE,CAAC,KAAK,cAAc,aAAa,MAAM,CAAC,CAAC,CAAC,CAAC;AAG5F;GAEF,KAAK;AACH,SAAK,MAAM,SAAS,gBAAgB;KAClC,MAAM,UAAU,YAAY,OAAO,OAAO;KAC1C,MAAM,QAAQ,aAAa,MAAM;AACjC,aAAQ,MAAM,MAAM,OAApB;MACE,KAAK;AACH,YAAK,KAAK,KAAK,SAAS,CAAC,KAAK,SAAS,MAAM,CAAC,CAAC,CAAC;AAChD;MAEF,KAAK;AACH,YAAK,KACH,KAAK,SAAS;QACZ,KAAK,cAAc,2BAA2B,MAAM,GAAG;QACvD,KAAK,2BAA2B,OAAO;QACvC,KAAK,2BAA2B,cAAc;QAC/C,CAAC,CACH;AACD;;;AAIN;GAEF;AACE,WAAO,KAAK;KAAE,OAAO;KAAU,OAAO;KAAa,SAAS,8BAA8B,MAAM;KAAc,CAAC;AAC/G;;;AAKN,QAAO;;;;;ACnMT,MAAM,QAAQ;AACd,MAAM,aAAa;;;;;AAMnB,SAAS,eAAe,OAAgC;AACtD,QAAO,MAAM,OAAO,eAAe,eAAe,MAAM,MAAM;;AAehE,SAAwB,SAAS,EAC/B,QACA,eACA,SAAS,aACT,SAAS,aACT,SACA,cACA,eACA,cACA,cAC6B;CAC7B,MAAM,UAAU,cAAc,cAAc,aAAa,YAAY,SAAS;CAC9E,MAAM,UAAU,cAAc,cAAc,aAAa,YAAY,SAAS;AAC9E,KAAI,cAAc,QAAQ;EACxB,IAAI,SAAS;AAEb,OAAK,MAAM,KAAK,cAAc;AAC5B,OAAI,OAAO,EAAE,YAAY,WACvB,QAAO,MAAM;IAAE,OAAO;IAAU,OAAO;IAAa,SAAS;IAAoC,CAAC;GAGpG,MAAM,SAAS,cAAc;IAAE,QAAQ;IAAW,OAAO,EAAE;IAAO,CAAC;AACnE,OAAI,CAAC,OAAO,OACV;GAGF,MAAM,OAAqC,EAAE;GAC7C,MAAM,YAAY;IAChB,IAAI,EAAE;IACN,SAAS,EAAE;IACZ;GAED,MAAM,WAAW,EAAE,UAAU,cAAc,aAAa,EAAE,QAAQ,SAAS;GAC3E,MAAM,WAAW,EAAE,UAAU,cAAc,aAAa,EAAE,QAAQ,SAAS;GAE3E,MAAM,gBAAgB,YAA6B;AACjD,WAAO,QAAQ,QAAQ,IAAI,SAAS,QAAQ,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,SAAS,QAAQ;;AAGzF,QAAK,MAAM,SAAS,QAAQ;AAC1B,QAAI,CAAC,aAAa,MAAM,GAAG,CACzB;IAEF,MAAM,UAAU,WAAW,MAAM,WAAW,MAAM,MAAM,GAAG;IAC3D,MAAM,cAAc,MAAM,MAAM,WAAW,SACvC,cAAc;KAAE,QAAQ;KAAW,IAAI,MAAM,MAAM;KAAW,OAAO,EAAE;KAAO,CAAC,GAC/E,EAAE;AAGN,QAAI,MAAM,SAAS,eACjB,eAAc,MAAM,KAAK,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;aAI/D,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS;AAClE,mBAAc,MAAM,KAAK,SAAS,MAAM,MAAM,MAAO,eAAe,MAAM,CAAC,CAAC;AAE5E,SAAI,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;AACvC,oBAAc,UAAU,IAAI,KAAK,SAAS,MAAM,MAAM,IAAK,eAAe,MAAM,CAAC,CAAC;AAClF,oBAAc,UAAU,SAAS,KAAK,SAAS,MAAM,MAAM,SAAU,eAAe,MAAM,CAAC,CAAC;AAG5F,WAAK,MAAM,SAAS,YAClB,KAAI,MAAM,WAAW,OAAO,MAAM,UAAU,UAAU;OACpD,MAAM,UAAU,WAAW,MAAM,QAAQ;AACzC,qBAAc,UAAU,IAAI,KAAK,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;AAC9E,qBAAc,UAAU,SAAS,KAAK,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;;;WAOtF;AACH,UAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,MAAM,MAAM,CAExD,eAAc,MAAM,KADD,GAAG,QAAQ,GAAG,QACI,UAAU,eAAe,MAAM,CAAC,CAAC;KAGxE,MAAM,YAAY,kBAAkB;MAAE,OAAO;OAAE,GAAG,MAAM;OAAO,QAAQ,MAAM;OAAc;MAAE;MAAS,CAAC;AACvG,SAAI,UACF,eAAc,MAAM,KAAK,SAAS,WAAW,eAAe,MAAM,CAAC,CAAC;;AAKxE,SAAK,MAAM,SAAS,YAClB,KAAI,MAAM,WAAW,OAAO,MAAM,UAAU,UAAU;AACpD,SAAI,CAAC,aAAa,MAAM,GAAG,CACzB;AAEF,mBAAc,MAAM,KAAK,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;;;GAKlF,MAAM,cAAc,qBAAqB,EAAE,QAAQ;AACnD,OAAI,OACF,WAAU;AAEZ,aAAU,GAAG,EAAE,QAAQ,WAAW,MAAM,YAAY,CAAC,CAAC;AAGtD,QAAK,MAAM,SAAS,CAAC,MAAM,UAAU,CACnC,KAAI,UAAU,OAAO,QAAQ;AAC3B,cAAU,0BAA0B,MAAM;AAC1C,cAAU,YAAY;AACtB,cAAU,EACP,QAAQ,WAAW,UAAU,QAAQ,YAAY,CAAC,CAClD,QAAQ,aAAa,KAAK,YAAY,aAAa;AACtD,cAAU;;;AAMhB,MAAI,WAAW,OAAO,KAAK,QAAQ,CAAC,QAAQ;AAC1C,OAAI,OACF,WAAU;AAEZ,aAAU,WACR,mBAAmB,SAAS,cAAc;IAAE,QAAQ;IAAW,OAAO,aAAa,IAAI,SAAS,EAAE;IAAE,CAAC,EAAE,EACrG,QACD,CAAC,CACH;;AAGH,SAAO;;CAIT,IAAI,SAAS;CACb,MAAM,aAAa,cAAc;EAAE,QAAQ;EAAW,MAAM;EAAK,CAAC;AAClE,KAAI,WAAW,QAAQ;EACrB,MAAM,QAAmB;GACvB,KAAK,CAAC,aAAa,EAAE,EAAE,CAAC;GACxB,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;GACrC,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;GAC3C;EAED,MAAM,WAAW,MAAM;EACvB,MAAM,SAAS,MAAM,GAAI,SAAS;EAClC,MAAM,cAAc,MAAM,GAAI,SAAS;AAIvC,MAAI,WACF,UAAS,SAAS,QAAQ,KAAK,gBAAgB,WAAW,CAAC;AAG7D,OAAK,MAAM,SAAS,YAAY;AAE9B,OAAI,CAAC,QAAQ,MAAM,MAAM,GAAG,IAAI,QAAQ,MAAM,MAAM,GAAG,CACrD;GAGF,MAAM,UAAU,MAAM,WAAW,MAAM,MAAM;GAC7C,MAAM,cAAc,MAAM,MAAM,WAAW,SACvC,cAAc;IAAE,QAAQ;IAAW,IAAI,MAAM,MAAM;IAAW,CAAC,GAC/D,EAAE;AAGN,OAAI,MAAM,SAAS,eACjB,eAAc,SAAS,UAAU,KAAK,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;YAI5E,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS;AAClE,kBAAc,SAAS,UAAU,KAAK,SAAS,MAAM,MAAM,MAAO,eAAe,MAAM,CAAC,CAAC;AAEzF,QAAI,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;AACvC,mBAAc,OAAO,UAAU,KAAK,SAAS,MAAM,MAAM,IAAK,eAAe,MAAM,CAAC,CAAC;AACrF,mBAAc,YAAY,UAAU,KAAK,SAAS,MAAM,MAAM,SAAU,eAAe,MAAM,CAAC,CAAC;AAE/F,UAAK,MAAM,SAAS,YAClB,KAAI,MAAM,WAAW,OAAO,MAAM,UAAU,UAAU;AACpD,oBAAc,OAAO,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;AACvF,oBAAc,YAAY,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;;;cAO3F,MAAM,SAAS,eAAe;AACrC,SAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,MAAM,MAAM,EAAE;KACvD,MAAM,WAAW,SAAS,MAAM,UAAU,CAAC,SAAS,KAAK,CAAC,KAAK,IAAI;AACnE,mBAAc,SAAS,UAAU,KAAK,UAAU,OAAO,eAAe,MAAM,CAAC,CAAC;;IAGhF,MAAM,YAAY,kBAAkB;KAAE,OAAO;MAAE,GAAG,MAAM;MAAO,QAAQ,MAAM;MAAc;KAAE;KAAS,CAAC;AACvG,QAAI,UACF,eAAc,SAAS,UAAU,KAAK,MAAM,WAAW,MAAM,MAAM,IAAI,WAAW,eAAe,MAAM,CAAC,CAAC;;;AAK/G,YAAU,WAAW,MAAM;;AAM7B,MAAK,MAAM,YAAY,iBAAiB,EAAE,EAAE;EAC1C,MAAM,iBAAiB,cAAc;GAAE,QAAQ;GAAW,IAAI,SAAS;GAAQ,MAAM,SAAS;GAAM,CAAC;AACrG,MAAI,CAAC,eAAe,OAClB;EAGF,MAAM,WAAoB,KAAK,SAAS,UAAU;AAIlD,MAAI,SAAS,OACX,UAAS,SAAS,QAAQ,KAAK,gBAAgB,SAAS,OAAO,CAAC;EAElE,MAAM,YAAY;GAChB,IAAI,EAAE;GACN,SAAS,EAAE;GACZ;AACD,OAAK,MAAM,SAAS,gBAAgB;GAClC,MAAM,UAAU,MAAM,WAAW,MAAM,MAAM;GAC7C,MAAM,cAAc,MAAM,MAAM,WAAW,SACvC,cAAc;IAAE,QAAQ;IAAW,IAAI,MAAM,MAAM;IAAW,CAAC,GAC/D,EAAE;AAGN,OAAI,MAAM,SAAS,eACjB,eAAc,SAAS,UAAU,KAAK,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;YAI5E,MAAM,MAAM,QAAQ,MAAM,MAAM,MAAM,MAAM,MAAM,SAAS;AAClE,kBAAc,SAAS,UAAU,KAAK,SAAS,MAAM,MAAM,MAAO,eAAe,MAAM,CAAC,CAAC;AACzF,QAAI,MAAM,MAAM,OAAO,MAAM,MAAM,MAAM;AACvC,mBAAc,UAAU,IAAI,KAAK,SAAS,MAAM,MAAM,IAAK,eAAe,MAAM,CAAC,CAAC;AAClF,mBAAc,UAAU,SAAS,KAAK,SAAS,MAAM,MAAM,SAAU,eAAe,MAAM,CAAC,CAAC;AAG5F,UAAK,MAAM,SAAS,YAClB,KAAI,MAAM,WAAW,OAAO,MAAM,UAAU,SAC1C,MAAK,MAAM,SAAS,CAAC,MAAM,UAAU,CACnC,eAAc,UAAU,QAAQ,KAAK,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;;UAQ7F;AACH,SAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,MAAM,MAAM,CACxD,eAAc,SAAS,UAAU,KAAK,GAAG,QAAQ,GAAG,QAAQ,UAAU,eAAe,MAAM,CAAC,CAAC;IAG/F,MAAM,YAAY,kBAAkB;KAAE,OAAO;MAAE,GAAG,MAAM;MAAO,QAAQ,MAAM;MAAc;KAAE;KAAS,CAAC;AACvG,QAAI,UACF,eAAc,SAAS,UAAU,KAAK,SAAS,WAAW,eAAe,MAAM,CAAC,CAAC;;AAKrF,QAAK,MAAM,SAAS,YAClB,KAAI,MAAM,WAAW,OAAO,MAAM,UAAU,SAC1C,eAAc,SAAS,UAAU,KAAK,MAAM,SAAS,MAAM,OAAO,eAAe,MAAM,CAAC,CAAC;;AAK/F,MAAI,OACF,WAAU;AAEZ,YAAU,WAAW;GACnB;GACA,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,WAAW,UAAU,GAAG,CAAC,CAAC;GACvD,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,SAAS,WAAW,UAAU,QAAQ,CAAC,CAAC;GAClE,CAAC;;AAIJ,KAAI,WAAW,OAAO,KAAK,QAAQ,CAAC,QAAQ;AAC1C,MAAI,OACF,WAAU;AAEZ,YAAU,WAAW,mBAAmB,SAAS,cAAc;GAAE,QAAQ;GAAW,MAAM;GAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;;AAGhH,QAAO;;;;;AC9TT,SAAwB,aAAa,EACnC,WAAW,EACT,SAAS,EAAE,UACX,UACA,cACA,QAAQ,cAEV,SAAS,EACP,cACA,SAAS,aACT,SAAS,aACT,WACA,WAAW,iBACX,kBAEiB;CACnB,SAAS,cAAc,OAAwB;EAC7C,MAAM,aAAa,eAAe,MAAM;AACxC,MAAI,eAAe,QAAW;AAC5B,OAAI,OAAO,eAAe,SACxB,QAAO,MAAM;IACX,OAAO;IACP,OAAO;IACP,SAAS,iDAAiD;IAC3D,CAAC;AAEJ,UAAO;;AAET,SAAO,WAAW,MAAM,GAAG;;CAE7B,MAAM,kBAAkB,UAA2B,OAAO,cAAc,MAAM,CAAC;CAE/E,MAAM,UAAU,cAAc,cAAc,aAAa,YAAY,SAAS;CAC9E,MAAM,UAAU,cAAc,cAAc,aAAa,YAAY,SAAS;AAG9E,KAAI,MAAM,QAAQ,aAAa,EAAE;EAK/B,IAAI,sBAAsB,aAAa,WAAW,MAAM,CAAC,OAAO,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,OAAO;AAC3F,MAAI,wBAAwB,GAC1B,uBAAsB;AAGxB,OAAK,IAAI,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK;GAC5C,MAAM,IAAI,aAAa;GACvB,MAAM,WAAW,EAAE;GACnB,MAAM,QAAQ,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC,CAAC,SACtC,KAAK,MAAM,SAAS,iBAAiB,YAAY,EAAE,CAAC,CAAC,GACtD;GAEJ,MAAM,WAAW,EAAE,UAAU,cAAc,aAAa,EAAE,QAAQ,SAAS;GAC3E,MAAM,WAAW,EAAE,UAAU,cAAc,aAAa,EAAE,QAAQ,SAAS;GAE3E,MAAM,gBAAgB,YAA6B;AACjD,WAAO,QAAQ,QAAQ,IAAI,SAAS,QAAQ,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,SAAS,QAAQ;;AAIzF,OAAI;IACF,MAAM,SAAS,SAAS,MAAM,MAAM;AACpC,SAAK,MAAM,SAAS,OAAO,OAAO,OAAO,EAAE;AACzC,SAAI,CAAC,aAAa,MAAM,GAAG,CACzB;KAEF,MAAM,UAAoC;MACxC,WAAW;MACX;MACA,OAAO,EAAE,WAAW;MACpB,aAAa;MACd;KACD,MAAM,QACJ,EAAE,YAAY,OAAO,QAAQ,IAAI,kBAAkB,OAAO,QAAQ,IAAI,kBAAkB,OAAO,QAAQ;AACzG,SAAI,OAAO;MACT,MAAM,UAAU,cAAc,MAAM;AACpC,mBAAa,MAAM,IAAI;OACrB,QAAQ;OACR;OACA;OACA;OAEA,MAAM;QACJ,cAAc,EACZ,aAAa,MAAM,cACpB;QACD,iBAAiB,EAAE,MAAM,SAAS;QACnC;OACF,CAAC;AAIF,UAAI,wBAAwB,EAC1B,cAAa,MAAM,IAAI;OACrB,QAAQ;OACR;OACA;OACA,MAAM;OAEN,MAAM;QACJ,cAAc,EACZ,aAAa,MAAM,cACpB;QACD,iBAAiB,EAAE,MAAM,SAAS;QACnC;OACF,CAAC;;;YAID,KAAK;AACZ,WAAO,MAAM;KACX,OAAO;KACP,OAAO;KACP,SAAS,4CAA4C,SAAS,iBAAiB,MAAM,CAAC;KACtF,iBAAiB;KAClB,CAAC;AACF,UAAM;;;AAIV;;AAIF,MAAK,MAAM,SAAS,OAAO,OAAO,WAAW,EAAE;AAC7C,MAAI,CAAC,QAAQ,MAAM,GAAG,IAAI,QAAQ,MAAM,GAAG,CACzC;AAEF,OAAK,MAAM,QAAQ,OAAO,KAAK,MAAM,KAAK,EAAE;GAC1C,MAAM,YAA6B;IAAE,GAAG;IAAO,GAAI,MAAM,KAAK;IAAe;GAC7E,MAAM,UAAoC;IACxC,WAAW;IACX;IACA,OAAO,EAAE,WAAW;IACpB,aAAa,EAAE,QAAQ,KAAK;IAC7B;GACD,MAAM,QAAQ,kBAAkB,WAAW,QAAQ,IAAI,kBAAkB,WAAW,QAAQ;AAC5F,OAAI,OAAO;IACT,MAAM,UAAU,cAAc,MAAM;AACpC,iBAAa,MAAM,IAAI;KACrB,QAAQ;KACR;KACA;KACA;KAEA,MAAM;MACJ,cAAc,EACZ,aAAa,MAAM,cACpB;MACD,iBAAiB,EAAE,MAAM,SAAS;MACnC;KACF,CAAC;;;;;;;;AC1IV,SAAwB,UAAU,SAAoC;CACpE,MAAM,EAAE,SAAS,WAAW,eAAe,WAAW,EAAE;CAExD,MAAM,WAAW,SAAS,YAAa,SAAiB,YAAY;CACpE,MAAM,eAAe,SAAS,gBAAgB;AAE9C,QAAO;EACL,MAAM;EACN,OAAO,SAAS,SAAS;AACvB,OAAI,SAAS,iBAAiB,SAAS,iBAAiB,SAAS,gBAAgB,SAAS,YACxF,SAAQ,OAAO,MAAM;IACnB,OAAO;IACP,OAAO;IACP,SAAS;IACV,CAAC;;EAGN,MAAM,UAAU,kBAAkB;AAChC,gBAAa;IAAE,WAAW;IAAkB,SAAS,WAAW,EAAE;IAAE,CAAC;;EAEvE,MAAM,MAAM,EAAE,eAAe,YAAY,WAAW;AAClD,OAAI,cAAc,KAChB;GAGF,IAAI,WAAW,GAAG,YAAY;AAC9B,eAAY,SAAS;IACnB,SAAS,SAAS;IAClB,SAAS,SAAS;IAClB;IACA,cAAc,SAAS;IACvB,eAAe,SAAS;IACxB;IACA;IACA;IACA,QAAQ,QAAQ;IACjB,CAAC;AACF,cAAW,UAAU,SAAS,QAAQ,QAAQ,KAAK,CAAC;;EAEvD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@terrazzo/plugin-css",
|
|
3
|
-
"version": "2.0.0
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Convert DTCG design tokens JSON into CSS variables for use in any web application or native app with webview.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -27,16 +27,16 @@
|
|
|
27
27
|
"directory": "./packages/plugin-css/"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
|
-
"@terrazzo/cli": "^2.0.0
|
|
31
|
-
"@terrazzo/parser": "^2.0.0
|
|
30
|
+
"@terrazzo/cli": "^2.0.0",
|
|
31
|
+
"@terrazzo/parser": "^2.0.0"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@terrazzo/token-tools": "^2.0.0
|
|
34
|
+
"@terrazzo/token-tools": "^2.0.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"dtcg-examples": "^1.0.3",
|
|
38
|
-
"@terrazzo/
|
|
39
|
-
"@terrazzo/
|
|
38
|
+
"@terrazzo/cli": "^2.0.0",
|
|
39
|
+
"@terrazzo/parser": "^2.0.0"
|
|
40
40
|
},
|
|
41
41
|
"scripts": {
|
|
42
42
|
"build": "rolldown -c && attw --profile esm-only --pack .",
|