@canonical/terrazzo-plugin-css 0.0.1

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.
Files changed (106) hide show
  1. package/README.md +49 -0
  2. package/dist/esm/artifact/classifyTier.js +7 -0
  3. package/dist/esm/artifact/classifyTier.js.map +1 -0
  4. package/dist/esm/artifact/index.js +5 -0
  5. package/dist/esm/artifact/index.js.map +1 -0
  6. package/dist/esm/artifact/makeArtifactToken.js +36 -0
  7. package/dist/esm/artifact/makeArtifactToken.js.map +1 -0
  8. package/dist/esm/artifact/makeDerivedArtifactToken.js +29 -0
  9. package/dist/esm/artifact/makeDerivedArtifactToken.js.map +1 -0
  10. package/dist/esm/artifact/serializeArtifact.js +4 -0
  11. package/dist/esm/artifact/serializeArtifact.js.map +1 -0
  12. package/dist/esm/css-ast/addDeclUnique.js +7 -0
  13. package/dist/esm/css-ast/addDeclUnique.js.map +1 -0
  14. package/dist/esm/css-ast/decl.js +4 -0
  15. package/dist/esm/css-ast/decl.js.map +1 -0
  16. package/dist/esm/css-ast/hasDecl.js +4 -0
  17. package/dist/esm/css-ast/hasDecl.js.map +1 -0
  18. package/dist/esm/css-ast/index.js +7 -0
  19. package/dist/esm/css-ast/index.js.map +1 -0
  20. package/dist/esm/css-ast/printNode.js +28 -0
  21. package/dist/esm/css-ast/printNode.js.map +1 -0
  22. package/dist/esm/css-ast/printRules.js +13 -0
  23. package/dist/esm/css-ast/printRules.js.map +1 -0
  24. package/dist/esm/css-ast/rule.js +4 -0
  25. package/dist/esm/css-ast/rule.js.map +1 -0
  26. package/dist/esm/index.js +14 -0
  27. package/dist/esm/index.js.map +1 -0
  28. package/dist/esm/layers/index.js +3 -0
  29. package/dist/esm/layers/index.js.map +1 -0
  30. package/dist/esm/layers/resolveLayerConfig.js +10 -0
  31. package/dist/esm/layers/resolveLayerConfig.js.map +1 -0
  32. package/dist/esm/layers/wrapInLayer.js +14 -0
  33. package/dist/esm/layers/wrapInLayer.js.map +1 -0
  34. package/dist/esm/light-dark/buildLightDarkDeclarations.js +14 -0
  35. package/dist/esm/light-dark/buildLightDarkDeclarations.js.map +1 -0
  36. package/dist/esm/light-dark/index.js +3 -0
  37. package/dist/esm/light-dark/index.js.map +1 -0
  38. package/dist/esm/light-dark/wrapLightDark.js +13 -0
  39. package/dist/esm/light-dark/wrapLightDark.js.map +1 -0
  40. package/dist/esm/modifiers/buildModifierContextCSS.js +11 -0
  41. package/dist/esm/modifiers/buildModifierContextCSS.js.map +1 -0
  42. package/dist/esm/modifiers/computeModifierContext.js +75 -0
  43. package/dist/esm/modifiers/computeModifierContext.js.map +1 -0
  44. package/dist/esm/modifiers/getAliasTarget.js +10 -0
  45. package/dist/esm/modifiers/getAliasTarget.js.map +1 -0
  46. package/dist/esm/modifiers/index.js +4 -0
  47. package/dist/esm/modifiers/index.js.map +1 -0
  48. package/dist/esm/naming.js +33 -0
  49. package/dist/esm/naming.js.map +1 -0
  50. package/dist/esm/plugin.js +916 -0
  51. package/dist/esm/plugin.js.map +1 -0
  52. package/dist/esm/types.js +8 -0
  53. package/dist/esm/types.js.map +1 -0
  54. package/dist/types/artifact/classifyTier.d.ts +10 -0
  55. package/dist/types/artifact/classifyTier.d.ts.map +1 -0
  56. package/dist/types/artifact/index.d.ts +5 -0
  57. package/dist/types/artifact/index.d.ts.map +1 -0
  58. package/dist/types/artifact/makeArtifactToken.d.ts +19 -0
  59. package/dist/types/artifact/makeArtifactToken.d.ts.map +1 -0
  60. package/dist/types/artifact/makeDerivedArtifactToken.d.ts +17 -0
  61. package/dist/types/artifact/makeDerivedArtifactToken.d.ts.map +1 -0
  62. package/dist/types/artifact/serializeArtifact.d.ts +6 -0
  63. package/dist/types/artifact/serializeArtifact.d.ts.map +1 -0
  64. package/dist/types/css-ast/addDeclUnique.d.ts +4 -0
  65. package/dist/types/css-ast/addDeclUnique.d.ts.map +1 -0
  66. package/dist/types/css-ast/decl.d.ts +4 -0
  67. package/dist/types/css-ast/decl.d.ts.map +1 -0
  68. package/dist/types/css-ast/hasDecl.d.ts +4 -0
  69. package/dist/types/css-ast/hasDecl.d.ts.map +1 -0
  70. package/dist/types/css-ast/index.d.ts +7 -0
  71. package/dist/types/css-ast/index.d.ts.map +1 -0
  72. package/dist/types/css-ast/printNode.d.ts +7 -0
  73. package/dist/types/css-ast/printNode.d.ts.map +1 -0
  74. package/dist/types/css-ast/printRules.d.ts +4 -0
  75. package/dist/types/css-ast/printRules.d.ts.map +1 -0
  76. package/dist/types/css-ast/rule.d.ts +4 -0
  77. package/dist/types/css-ast/rule.d.ts.map +1 -0
  78. package/dist/types/index.d.ts +15 -0
  79. package/dist/types/index.d.ts.map +1 -0
  80. package/dist/types/layers/index.d.ts +3 -0
  81. package/dist/types/layers/index.d.ts.map +1 -0
  82. package/dist/types/layers/resolveLayerConfig.d.ts +6 -0
  83. package/dist/types/layers/resolveLayerConfig.d.ts.map +1 -0
  84. package/dist/types/layers/wrapInLayer.d.ts +3 -0
  85. package/dist/types/layers/wrapInLayer.d.ts.map +1 -0
  86. package/dist/types/light-dark/buildLightDarkDeclarations.d.ts +3 -0
  87. package/dist/types/light-dark/buildLightDarkDeclarations.d.ts.map +1 -0
  88. package/dist/types/light-dark/index.d.ts +3 -0
  89. package/dist/types/light-dark/index.d.ts.map +1 -0
  90. package/dist/types/light-dark/wrapLightDark.d.ts +8 -0
  91. package/dist/types/light-dark/wrapLightDark.d.ts.map +1 -0
  92. package/dist/types/modifiers/buildModifierContextCSS.d.ts +3 -0
  93. package/dist/types/modifiers/buildModifierContextCSS.d.ts.map +1 -0
  94. package/dist/types/modifiers/computeModifierContext.d.ts +3 -0
  95. package/dist/types/modifiers/computeModifierContext.d.ts.map +1 -0
  96. package/dist/types/modifiers/getAliasTarget.d.ts +7 -0
  97. package/dist/types/modifiers/getAliasTarget.d.ts.map +1 -0
  98. package/dist/types/modifiers/index.d.ts +4 -0
  99. package/dist/types/modifiers/index.d.ts.map +1 -0
  100. package/dist/types/naming.d.ts +24 -0
  101. package/dist/types/naming.d.ts.map +1 -0
  102. package/dist/types/plugin.d.ts +73 -0
  103. package/dist/types/plugin.d.ts.map +1 -0
  104. package/dist/types/types.d.ts +223 -0
  105. package/dist/types/types.d.ts.map +1 -0
  106. package/package.json +31 -0
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # @canonical/terrazzo-plugin-css
2
+
3
+ Terrazzo CSS plugin for Canonical design tokens. Transforms DTCG token definitions into CSS custom properties.
4
+
5
+ ## Features
6
+
7
+ - CSS `light-dark()` colour mode output
8
+ - Modifier families (criticality, emphasis, importance, surface, typography)
9
+ - `@layer` ordering
10
+ - `@media` query scoping for mode variants
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ bun add -d @canonical/terrazzo-plugin-css
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Add the plugin to your `terrazzo.config.ts`:
21
+
22
+ ```ts
23
+ import { defineConfig } from "@terrazzo/cli";
24
+ import { canonicalPlugin } from "@canonical/terrazzo-plugin-css";
25
+
26
+ export default defineConfig({
27
+ tokens: ["./tokens/canonical/canonical.resolver.json"],
28
+ outDir: "./dist/",
29
+ plugins: [canonicalPlugin()],
30
+ });
31
+ ```
32
+
33
+ ## Configuration
34
+
35
+ `canonicalPlugin()` accepts an options object:
36
+
37
+ ```ts
38
+ canonicalPlugin({
39
+ tokensDir: "./tokens/canonical", // Base directory for token sources
40
+ });
41
+ ```
42
+
43
+ ## Development
44
+
45
+ ```bash
46
+ bun run build # Compile plugin (tsc)
47
+ bun run test # Run tests
48
+ bun run check # Lint + type check
49
+ ```
@@ -0,0 +1,7 @@
1
+ export default function classifyTier(_tokenId, setName) {
2
+ if (setName === "primitive") {
3
+ return "primitive";
4
+ }
5
+ return "semantic";
6
+ }
7
+ //# sourceMappingURL=classifyTier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifyTier.js","sourceRoot":"","sources":["../../../src/artifact/classifyTier.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,QAAgB,EAChB,OAA2B;IAE3B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC5B,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { default as classifyTier } from "./classifyTier.js";
2
+ export { default as makeArtifactToken } from "./makeArtifactToken.js";
3
+ export { default as makeDerivedArtifactToken } from "./makeDerivedArtifactToken.js";
4
+ export { default as serializeArtifact } from "./serializeArtifact.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/artifact/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,36 @@
1
+ export default function makeArtifactToken(params) {
2
+ const isPaired = params.valueLight !== undefined &&
3
+ params.valueDark !== undefined &&
4
+ params.valueLight !== params.valueDark;
5
+ const token = {
6
+ cssVar: params.cssVar,
7
+ id: params.id,
8
+ type: params.type,
9
+ tier: params.tier,
10
+ isPaired,
11
+ cssOutputFile: params.cssOutputFile,
12
+ };
13
+ if (params.description !== undefined) {
14
+ token.description = params.description;
15
+ }
16
+ if (params.declarations !== undefined && params.declarations.length > 0) {
17
+ token.declarations = params.declarations;
18
+ }
19
+ if (params.aliasChain !== undefined) {
20
+ token.aliasChain = params.aliasChain;
21
+ }
22
+ if (params.valueLight !== undefined) {
23
+ token.valueLight = params.valueLight;
24
+ }
25
+ if (params.valueDark !== undefined) {
26
+ token.valueDark = params.valueDark;
27
+ }
28
+ if (params.sourceFile !== undefined) {
29
+ token.sourceFile = params.sourceFile;
30
+ }
31
+ if (params.sourceLine !== undefined) {
32
+ token.sourceLine = params.sourceLine;
33
+ }
34
+ return token;
35
+ }
36
+ //# sourceMappingURL=makeArtifactToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeArtifactToken.js","sourceRoot":"","sources":["../../../src/artifact/makeArtifactToken.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,MAazC;IACC,MAAM,QAAQ,GACZ,MAAM,CAAC,UAAU,KAAK,SAAS;QAC/B,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,SAAS,CAAC;IAEzC,MAAM,KAAK,GAAkB;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ;QACR,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,29 @@
1
+ export default function makeDerivedArtifactToken(params) {
2
+ const isPaired = params.valueLight !== undefined &&
3
+ params.valueDark !== undefined &&
4
+ params.valueLight !== params.valueDark;
5
+ const token = {
6
+ cssVar: params.cssVar,
7
+ id: null,
8
+ type: params.type,
9
+ tier: params.tier,
10
+ isPaired,
11
+ cssOutputFile: params.cssOutputFile,
12
+ derivedFrom: params.derivedFrom,
13
+ derivation: params.derivation,
14
+ };
15
+ if (params.description !== undefined) {
16
+ token.description = params.description;
17
+ }
18
+ if (params.declarations !== undefined && params.declarations.length > 0) {
19
+ token.declarations = params.declarations;
20
+ }
21
+ if (params.valueLight !== undefined) {
22
+ token.valueLight = params.valueLight;
23
+ }
24
+ if (params.valueDark !== undefined) {
25
+ token.valueDark = params.valueDark;
26
+ }
27
+ return token;
28
+ }
29
+ //# sourceMappingURL=makeDerivedArtifactToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makeDerivedArtifactToken.js","sourceRoot":"","sources":["../../../src/artifact/makeDerivedArtifactToken.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,MAWhD;IACC,MAAM,QAAQ,GACZ,MAAM,CAAC,UAAU,KAAK,SAAS;QAC/B,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,SAAS,CAAC;IAEzC,MAAM,KAAK,GAAkB;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,QAAQ;QACR,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAC;IAEF,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC3C,CAAC;IACD,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACpC,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,4 @@
1
+ export default function serializeArtifact(artifact) {
2
+ return JSON.stringify(artifact, null, 2);
3
+ }
4
+ //# sourceMappingURL=serializeArtifact.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializeArtifact.js","sourceRoot":"","sources":["../../../src/artifact/serializeArtifact.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,QAAkB;IAC1D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import hasDecl from "./hasDecl.js";
2
+ export default function addDeclUnique(list, declaration) {
3
+ if (!hasDecl(list, declaration.property)) {
4
+ list.push(declaration);
5
+ }
6
+ }
7
+ //# sourceMappingURL=addDeclUnique.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addDeclUnique.js","sourceRoot":"","sources":["../../../src/css-ast/addDeclUnique.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,cAAc,CAAC;AAEnC,MAAM,CAAC,OAAO,UAAU,aAAa,CACnC,IAAe,EACf,WAA2B;IAE3B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export default function decl(property, value, comment) {
2
+ return { type: "Declaration", property, value, comment };
3
+ }
4
+ //# sourceMappingURL=decl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decl.js","sourceRoot":"","sources":["../../../src/css-ast/decl.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,IAAI,CAC1B,QAAgB,EAChB,KAAa,EACb,OAAgB;IAEhB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export default function hasDecl(list, property) {
2
+ return list.some((d) => d.type === "Declaration" && d.property === property);
3
+ }
4
+ //# sourceMappingURL=hasDecl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasDecl.js","sourceRoot":"","sources":["../../../src/css-ast/hasDecl.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,OAAO,CAAC,IAAe,EAAE,QAAgB;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { default as addDeclUnique } from "./addDeclUnique.js";
2
+ export { default as decl } from "./decl.js";
3
+ export { default as hasDecl } from "./hasDecl.js";
4
+ export { default as printNode } from "./printNode.js";
5
+ export { default as printRules } from "./printRules.js";
6
+ export { default as rule } from "./rule.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/css-ast/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,28 @@
1
+ export default function printNode(node, { indentChar, indentLv }) {
2
+ const indent = indentChar.repeat(indentLv);
3
+ if (node.type === "Declaration") {
4
+ let out = "";
5
+ if (node.comment) {
6
+ out += `${indent}/* ${node.comment} */\n`;
7
+ }
8
+ out += `${indent}${node.property}: ${node.value};\n`;
9
+ return out;
10
+ }
11
+ // Rule — skip if empty prelude or children
12
+ if (!node.prelude.length || !node.children.length) {
13
+ return "";
14
+ }
15
+ let childOutput = "";
16
+ for (const child of node.children) {
17
+ childOutput += printNode(child, { indentChar, indentLv: indentLv + 1 });
18
+ }
19
+ if (!childOutput.trim()) {
20
+ return "";
21
+ }
22
+ let out = "";
23
+ out += `${indent}${node.prelude.join(`,\n${indent}`)} {\n`;
24
+ out += childOutput;
25
+ out += `${indent}}\n`;
26
+ return out;
27
+ }
28
+ //# sourceMappingURL=printNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printNode.js","sourceRoot":"","sources":["../../../src/css-ast/printNode.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,IAAa,EACb,EAAE,UAAU,EAAE,QAAQ,EAA4C;IAElE,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,GAAG,IAAI,GAAG,MAAM,MAAM,IAAI,CAAC,OAAO,OAAO,CAAC;QAC5C,CAAC;QACD,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,KAAK,CAAC;QACrD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,2CAA2C;IAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,WAAW,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,MAAM,EAAE,CAAC,MAAM,CAAC;IAC3D,GAAG,IAAI,WAAW,CAAC;IACnB,GAAG,IAAI,GAAG,MAAM,KAAK,CAAC;IACtB,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ import printNode from "./printNode.js";
2
+ export default function printRules(nodes, opts = {}) {
3
+ const { indentChar = "\t", indentLv = 0 } = opts;
4
+ let output = "";
5
+ for (const node of nodes) {
6
+ if (output && node.type === "Rule") {
7
+ output += "\n";
8
+ }
9
+ output += printNode(node, { indentChar, indentLv });
10
+ }
11
+ return output.trimEnd();
12
+ }
13
+ //# sourceMappingURL=printRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"printRules.js","sourceRoot":"","sources":["../../../src/css-ast/printRules.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,MAAM,CAAC,OAAO,UAAU,UAAU,CAChC,KAAgB,EAChB,OAAqB,EAAE;IAEvB,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;IACjD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export default function rule(prelude, children = []) {
2
+ return { type: "Rule", prelude, children };
3
+ }
4
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../../src/css-ast/rule.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,UAAU,IAAI,CAC1B,OAAiB,EACjB,WAAsB,EAAE;IAExB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @canonical/terrazzo-plugin-css-v2
3
+ *
4
+ * Custom Terrazzo plugin for Canonical design tokens.
5
+ * Modifier contracts, light-dark pairing, layer wrapping, artifact emission.
6
+ */
7
+ export { classifyTier, makeArtifactToken, makeDerivedArtifactToken, serializeArtifact, } from "./artifact/index.js";
8
+ export { addDeclUnique, decl, hasDecl, printNode, printRules, rule, } from "./css-ast/index.js";
9
+ export { resolveLayerConfig, wrapInLayer } from "./layers/index.js";
10
+ export { buildLightDarkDeclarations, wrapLightDark, } from "./light-dark/index.js";
11
+ export { buildModifierContextCSS, computeModifierContext, getAliasTarget, } from "./modifiers/index.js";
12
+ export { prefixVar, tokenIdToCssVar } from "./naming.js";
13
+ export { canonicalPlugin } from "./plugin.js";
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,IAAI,EACJ,OAAO,EACP,SAAS,EACT,UAAU,EACV,IAAI,GACL,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,0BAA0B,EAC1B,aAAa,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,cAAc,GACf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as resolveLayerConfig } from "./resolveLayerConfig.js";
2
+ export { default as wrapInLayer } from "./wrapInLayer.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ const DEFAULT_LAYERS = {
2
+ tokens: "ds.tokens",
3
+ modifiers: "ds.modifiers",
4
+ surfaces: "ds.surfaces",
5
+ states: "ds.states",
6
+ };
7
+ export default function resolveLayerConfig(partial) {
8
+ return { ...DEFAULT_LAYERS, ...partial };
9
+ }
10
+ //# sourceMappingURL=resolveLayerConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveLayerConfig.js","sourceRoot":"","sources":["../../../src/layers/resolveLayerConfig.ts"],"names":[],"mappings":"AAKA,MAAM,cAAc,GAAwB;IAC1C,MAAM,EAAE,WAAW;IACnB,SAAS,EAAE,cAAc;IACzB,QAAQ,EAAE,aAAa;IACvB,MAAM,EAAE,WAAW;CACpB,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,kBAAkB,CACxC,OAAsC;IAEtC,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Wrap CSS nodes in an `@layer` rule. Returns nodes unwrapped if `layerName` is null.
3
+ *
4
+ * @example wrapInLayer("ds.tokens", [decl("--x", "1")]) => rule(["@layer ds.tokens"], [...])
5
+ * @example wrapInLayer(null, [decl("--x", "1")]) => [decl("--x", "1")]
6
+ */
7
+ import rule from "../css-ast/rule.js";
8
+ export default function wrapInLayer(layerName, children) {
9
+ if (layerName === null) {
10
+ return children;
11
+ }
12
+ return [rule([`@layer ${layerName}`], children)];
13
+ }
14
+ //# sourceMappingURL=wrapInLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapInLayer.js","sourceRoot":"","sources":["../../../src/layers/wrapInLayer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAGtC,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,SAAwB,EACxB,QAAmB;IAEnB,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Build paired `light-dark()` declarations from parallel light/dark token arrays.
3
+ *
4
+ * Matches tokens by CSS variable name, produces a `LightDarkPair[]`
5
+ * and generates CSS declaration nodes.
6
+ *
7
+ * @returns Array of CSS declaration nodes for the merged values.
8
+ */
9
+ import decl from "../css-ast/decl.js";
10
+ import wrapLightDark from "./wrapLightDark.js";
11
+ export default function buildLightDarkDeclarations(pairs) {
12
+ return pairs.map((pair) => decl(pair.property, wrapLightDark(pair.light, pair.dark)));
13
+ }
14
+ //# sourceMappingURL=buildLightDarkDeclarations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildLightDarkDeclarations.js","sourceRoot":"","sources":["../../../src/light-dark/buildLightDarkDeclarations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAEtC,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C,MAAM,CAAC,OAAO,UAAU,0BAA0B,CAChD,KAAsB;IAEtB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { default as buildLightDarkDeclarations } from "./buildLightDarkDeclarations.js";
2
+ export { default as wrapLightDark } from "./wrapLightDark.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/light-dark/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Wrap two values in `light-dark()`. Returns the plain value if both are identical.
3
+ *
4
+ * @example wrapLightDark("oklch(0.5 0.1 200)", "oklch(0.8 0.1 200)") => "light-dark(oklch(0.5 0.1 200), oklch(0.8 0.1 200))"
5
+ * @example wrapLightDark("#000", "#000") => "#000"
6
+ */
7
+ export default function wrapLightDark(light, dark) {
8
+ if (light === dark) {
9
+ return light;
10
+ }
11
+ return `light-dark(${light}, ${dark})`;
12
+ }
13
+ //# sourceMappingURL=wrapLightDark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wrapLightDark.js","sourceRoot":"","sources":["../../../src/light-dark/wrapLightDark.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY;IAC/D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,cAAc,KAAK,KAAK,IAAI,GAAG,CAAC;AACzC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Build CSS nodes for a modifier context (class selector + declarations).
3
+ */
4
+ import rule from "../css-ast/rule.js";
5
+ export default function buildModifierContextCSS(ctx) {
6
+ if (ctx.declarations.length === 0) {
7
+ return [];
8
+ }
9
+ return [rule([ctx.selector], ctx.declarations)];
10
+ }
11
+ //# sourceMappingURL=buildModifierContextCSS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildModifierContextCSS.js","sourceRoot":"","sources":["../../../src/modifiers/buildModifierContextCSS.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,IAAI,MAAM,oBAAoB,CAAC;AAGtC,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAC7C,GAAoB;IAEpB,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Compute modifier channel declarations for a single family context.
3
+ *
4
+ * Shadow detection uses THREE strategies (tried in order):
5
+ * 1. **Alias map** — if the token ID exists in `aliasMap`, the source file
6
+ * explicitly declares it as an override. This is the primary strategy
7
+ * because Terrazzo's resolver normalises `source.loc` to the resolver
8
+ * file URL and `destructiveMerge` can fail to override `$value` when
9
+ * the token structure uses `$root` at different nesting levels.
10
+ * 2. **Value comparison** — if `$value` differs between base and overlay
11
+ * (deep equality via JSON serialization).
12
+ * 3. **Source location comparison** — legacy fallback for unit tests that
13
+ * don't populate `$value` or `aliasMap`.
14
+ *
15
+ * Alias target resolution uses (in order):
16
+ * 1. `aliasMap` parameter (pre-built from modifier source files)
17
+ * 2. `getAliasTarget()` on the overlay token (DTCG `aliasOf` or `$extensions`)
18
+ * 3. Falls back to the token's own CSS variable (identity)
19
+ *
20
+ * @param family - Family name (e.g. "anticipation")
21
+ * @param context - Context name (e.g. "constructive")
22
+ * @param baseTokens - Base-resolution token map (from `resolver.apply({})`)
23
+ * @param overlayTokens - Context-resolution token map
24
+ * @param prefix - CSS variable prefix (default: "modifier"). Use "surface" for surface layers.
25
+ * @param aliasMap - Optional map of token ID -> alias target ID (from source files).
26
+ * @returns A `ModifierContext` with computed declarations.
27
+ */
28
+ import decl from "../css-ast/decl.js";
29
+ import { prefixVar, tokenIdToCssVar } from "../naming.js";
30
+ import getAliasTarget from "./getAliasTarget.js";
31
+ /**
32
+ * Detect whether an overlay token shadows its base counterpart.
33
+ *
34
+ * Uses value comparison when both tokens have `$value`, otherwise
35
+ * falls back to source location comparison for backward compatibility.
36
+ */
37
+ function isShadowedToken(base, overlay) {
38
+ // Primary: compare $value via JSON serialization
39
+ if (base.$value !== undefined && overlay.$value !== undefined) {
40
+ return JSON.stringify(base.$value) !== JSON.stringify(overlay.$value);
41
+ }
42
+ // Fallback: source location comparison (for unit tests)
43
+ if (base.source?.loc !== undefined || overlay.source?.loc !== undefined) {
44
+ return base.source?.loc !== overlay.source?.loc;
45
+ }
46
+ return false;
47
+ }
48
+ export default function computeModifierContext(family, context, baseTokens, overlayTokens, prefix = "modifier", aliasMap, selectorOverride) {
49
+ const declarations = [];
50
+ for (const [id, overlay] of Object.entries(overlayTokens)) {
51
+ const base = baseTokens[id];
52
+ if (!base) {
53
+ continue;
54
+ }
55
+ // Primary: alias map declares this token as explicitly overridden
56
+ const inAliasMap = aliasMap != null && id in aliasMap;
57
+ // Fallback: value or loc comparison for tokens not in alias map
58
+ const isShadowed = inAliasMap || isShadowedToken(base, overlay);
59
+ if (!isShadowed) {
60
+ continue;
61
+ }
62
+ const cssVar = tokenIdToCssVar(id);
63
+ const channelVar = prefixVar(cssVar, prefix);
64
+ const target = aliasMap?.[id] ?? getAliasTarget(overlay);
65
+ const aliasTarget = target ? tokenIdToCssVar(target) : cssVar;
66
+ declarations.push(decl(channelVar, `var(${aliasTarget})`));
67
+ }
68
+ return {
69
+ family,
70
+ context,
71
+ selector: selectorOverride ?? `.${context}`,
72
+ declarations,
73
+ };
74
+ }
75
+ //# sourceMappingURL=computeModifierContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computeModifierContext.js","sourceRoot":"","sources":["../../../src/modifiers/computeModifierContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,IAAI,MAAM,oBAAoB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,cAAc,MAAM,qBAAqB,CAAC;AAEjD;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAkB,EAAE,OAAqB;IAChE,iDAAiD;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,CAAC;IACD,wDAAwD;IACxD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,EAAE,CAAC;QACxE,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAC5C,MAAc,EACd,OAAe,EACf,UAAwC,EACxC,aAA2C,EAC3C,MAAM,GAAG,UAAU,EACnB,QAAiC,EACjC,gBAAyB;IAEzB,MAAM,YAAY,GAAG,EAAE,CAAC;IAExB,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ,CAAC;QACtD,gEAAgE;QAChE,MAAM,UAAU,GAAG,UAAU,IAAI,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC,EAAE,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC9D,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,WAAW,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,QAAQ,EAAE,gBAAgB,IAAI,IAAI,OAAO,EAAE;QAC3C,YAAY;KACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export default function getAliasTarget(token) {
2
+ if (token.aliasOf)
3
+ return token.aliasOf;
4
+ const ext = token.$extensions?.["com.canonical.modifier"];
5
+ if (ext && typeof ext === "object" && "aliasOf" in ext) {
6
+ return ext.aliasOf;
7
+ }
8
+ return undefined;
9
+ }
10
+ //# sourceMappingURL=getAliasTarget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAliasTarget.js","sourceRoot":"","sources":["../../../src/modifiers/getAliasTarget.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,KAAmB;IAEnB,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACxC,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,wBAAwB,CAAC,CAAC;IAC1D,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG,EAAE,CAAC;QACvD,OAAQ,GAA2B,CAAC,OAAO,CAAC;IAC9C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { default as buildModifierContextCSS } from "./buildModifierContextCSS.js";
2
+ export { default as computeModifierContext } from "./computeModifierContext.js";
3
+ export { default as getAliasTarget } from "./getAliasTarget.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modifiers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Token ID to CSS custom property name conversion.
3
+ *
4
+ * Dot-to-hyphen with camelCase preserved, `$root` stripped.
5
+ */
6
+ /**
7
+ * Convert a DTCG token ID to a CSS custom property name.
8
+ *
9
+ * Rules:
10
+ * 1. Strip the `.$root` terminal if present
11
+ * 2. Replace every `.` with `-`
12
+ * 3. Prepend `--`
13
+ *
14
+ * @example tokenIdToCssVar("color.foreground.primary.$root") => "--color-foreground-primary"
15
+ * @example tokenIdToCssVar("typography.heading.1.fontSize") => "--typography-heading-1-fontSize"
16
+ */
17
+ export function tokenIdToCssVar(id) {
18
+ let name = id;
19
+ // Strip terminal .$root (only when it is the last segment)
20
+ if (name.endsWith(".$root")) {
21
+ name = name.slice(0, -6);
22
+ }
23
+ return `--${name.replaceAll(".", "-")}`;
24
+ }
25
+ /**
26
+ * Add a channel prefix to a CSS variable name.
27
+ *
28
+ * @example prefixVar("--color-foreground-primary", "modifier") => "--modifier-color-foreground-primary"
29
+ */
30
+ export function prefixVar(cssVar, prefix) {
31
+ return `--${prefix}-${cssVar.slice(2)}`;
32
+ }
33
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,2DAA2D;IAC3D,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,MAAc;IACtD,OAAO,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC1C,CAAC"}