@mp3wizard/figma-console-mcp 1.27.2 → 1.29.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.
- package/README.md +21 -12
- package/dist/apps/design-system-dashboard/mcp-app.html +78 -78
- package/dist/apps/token-browser/mcp-app.html +60 -59
- package/dist/cloudflare/core/design-system-tools.js +1 -1
- package/dist/cloudflare/core/figma-api.js +19 -0
- package/dist/cloudflare/core/library-tools.js +580 -0
- package/dist/cloudflare/core/tokens/alias-resolver.js +37 -0
- package/dist/cloudflare/core/tokens/formatters/json.js +185 -5
- package/dist/cloudflare/core/tokens/formatters/scss.js +251 -3
- package/dist/cloudflare/core/tokens/formatters/stubs.js +6 -4
- package/dist/cloudflare/core/tokens/formatters/style-dictionary-v3.js +206 -3
- package/dist/cloudflare/core/tokens/formatters/tailwind-v3.js +236 -3
- package/dist/cloudflare/core/tokens/formatters/tailwind-v4.js +329 -3
- package/dist/cloudflare/core/tokens/formatters/tokens-studio.js +249 -3
- package/dist/cloudflare/core/tokens/formatters/ts-module.js +197 -3
- package/dist/cloudflare/core/tokens/index.js +1 -1
- package/dist/cloudflare/core/tokens/parsers/stubs.js +13 -6
- package/dist/cloudflare/core/tokens-tools.js +12 -2
- package/dist/cloudflare/index.js +15 -7
- package/dist/core/design-system-tools.d.ts +50 -0
- package/dist/core/design-system-tools.d.ts.map +1 -1
- package/dist/core/design-system-tools.js +1 -1
- package/dist/core/design-system-tools.js.map +1 -1
- package/dist/core/figma-api.d.ts +15 -0
- package/dist/core/figma-api.d.ts.map +1 -1
- package/dist/core/figma-api.js +19 -0
- package/dist/core/figma-api.js.map +1 -1
- package/dist/core/library-tools.d.ts +17 -0
- package/dist/core/library-tools.d.ts.map +1 -0
- package/dist/core/library-tools.js +581 -0
- package/dist/core/library-tools.js.map +1 -0
- package/dist/core/tokens/alias-resolver.d.ts +15 -0
- package/dist/core/tokens/alias-resolver.d.ts.map +1 -1
- package/dist/core/tokens/alias-resolver.js +37 -0
- package/dist/core/tokens/alias-resolver.js.map +1 -1
- package/dist/core/tokens/formatters/json.d.ts +34 -2
- package/dist/core/tokens/formatters/json.d.ts.map +1 -1
- package/dist/core/tokens/formatters/json.js +185 -5
- package/dist/core/tokens/formatters/json.js.map +1 -1
- package/dist/core/tokens/formatters/scss.d.ts +23 -1
- package/dist/core/tokens/formatters/scss.d.ts.map +1 -1
- package/dist/core/tokens/formatters/scss.js +251 -3
- package/dist/core/tokens/formatters/scss.js.map +1 -1
- package/dist/core/tokens/formatters/stubs.d.ts +3 -3
- package/dist/core/tokens/formatters/stubs.d.ts.map +1 -1
- package/dist/core/tokens/formatters/stubs.js +6 -4
- package/dist/core/tokens/formatters/stubs.js.map +1 -1
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts +42 -1
- package/dist/core/tokens/formatters/style-dictionary-v3.d.ts.map +1 -1
- package/dist/core/tokens/formatters/style-dictionary-v3.js +206 -3
- package/dist/core/tokens/formatters/style-dictionary-v3.js.map +1 -1
- package/dist/core/tokens/formatters/tailwind-v3.d.ts +34 -1
- package/dist/core/tokens/formatters/tailwind-v3.d.ts.map +1 -1
- package/dist/core/tokens/formatters/tailwind-v3.js +236 -3
- package/dist/core/tokens/formatters/tailwind-v3.js.map +1 -1
- package/dist/core/tokens/formatters/tailwind-v4.d.ts +38 -1
- package/dist/core/tokens/formatters/tailwind-v4.d.ts.map +1 -1
- package/dist/core/tokens/formatters/tailwind-v4.js +329 -3
- package/dist/core/tokens/formatters/tailwind-v4.js.map +1 -1
- package/dist/core/tokens/formatters/tokens-studio.d.ts +41 -1
- package/dist/core/tokens/formatters/tokens-studio.d.ts.map +1 -1
- package/dist/core/tokens/formatters/tokens-studio.js +249 -3
- package/dist/core/tokens/formatters/tokens-studio.js.map +1 -1
- package/dist/core/tokens/formatters/ts-module.d.ts +32 -1
- package/dist/core/tokens/formatters/ts-module.d.ts.map +1 -1
- package/dist/core/tokens/formatters/ts-module.js +197 -3
- package/dist/core/tokens/formatters/ts-module.js.map +1 -1
- package/dist/core/tokens/index.d.ts +1 -1
- package/dist/core/tokens/index.d.ts.map +1 -1
- package/dist/core/tokens/index.js +1 -1
- package/dist/core/tokens/index.js.map +1 -1
- package/dist/core/tokens/parsers/stubs.d.ts +9 -5
- package/dist/core/tokens/parsers/stubs.d.ts.map +1 -1
- package/dist/core/tokens/parsers/stubs.js +13 -6
- package/dist/core/tokens/parsers/stubs.js.map +1 -1
- package/dist/core/tokens-tools.d.ts.map +1 -1
- package/dist/core/tokens-tools.js +12 -2
- package/dist/core/tokens-tools.js.map +1 -1
- package/dist/local.d.ts.map +1 -1
- package/dist/local.js +6 -0
- package/dist/local.js.map +1 -1
- package/figma-desktop-bridge/code.js +1 -1
- package/package.json +18 -3
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Shared NotImplementedError used by formatter stubs.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Shared NotImplementedError used by formatter stubs. Most formatters are
|
|
3
|
+
* implemented end-to-end as of v1.28.0; this stub remains for niche targets
|
|
4
|
+
* (e.g. Less) that haven't drawn enough demand to warrant implementation.
|
|
5
5
|
*/
|
|
6
6
|
export class FormatterNotImplementedError extends Error {
|
|
7
7
|
constructor(formatName) {
|
|
8
|
-
super(`[figma-console-mcp] The ${formatName} formatter is
|
|
8
|
+
super(`[figma-console-mcp] The ${formatName} formatter is not implemented. ` +
|
|
9
|
+
`Currently supported formatters: dtcg, css-vars, tailwind-v4, tailwind-v3, scss, ts-module, json-flat, json-nested, style-dictionary-v3, tokens-studio. ` +
|
|
10
|
+
`If you need ${formatName} support, open an issue with your use case so we can prioritize it.`);
|
|
9
11
|
this.name = "FormatterNotImplementedError";
|
|
10
12
|
}
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stubs.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/stubs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,UAAkB;QAC5B,KAAK,CACH,2BAA2B,UAAU,
|
|
1
|
+
{"version":3,"file":"stubs.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/stubs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,UAAkB;QAC5B,KAAK,CACH,2BAA2B,UAAU,iCAAiC;YACpE,yJAAyJ;YACzJ,eAAe,UAAU,qEAAqE,CACjG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF"}
|
|
@@ -1,4 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Style Dictionary v3 source-format JSON formatter.
|
|
3
|
+
*
|
|
4
|
+
* SD v3 uses bare `value` / `type` fields (no `$` prefix, that's the DTCG
|
|
5
|
+
* convention SD v4 adopted). Output is structurally similar to DTCG but
|
|
6
|
+
* without the dollar signs, and groups have no special meta — just
|
|
7
|
+
* nested objects.
|
|
8
|
+
*
|
|
9
|
+
* Output shape:
|
|
10
|
+
*
|
|
11
|
+
* {
|
|
12
|
+
* "color": {
|
|
13
|
+
* "primary": {
|
|
14
|
+
* "value": "#4085F2",
|
|
15
|
+
* "type": "color",
|
|
16
|
+
* "comment": "Primary brand color"
|
|
17
|
+
* },
|
|
18
|
+
* "brand": {
|
|
19
|
+
* "blue": { "value": "#0066FF", "type": "color" }
|
|
20
|
+
* }
|
|
21
|
+
* },
|
|
22
|
+
* "spacing": {
|
|
23
|
+
* "md": { "value": "16px", "type": "size" }
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* SD v3 type names differ slightly from DTCG:
|
|
28
|
+
*
|
|
29
|
+
* DTCG type → SD v3 type
|
|
30
|
+
* ----------------------------
|
|
31
|
+
* dimension → size (or spacing for spacing tokens)
|
|
32
|
+
* color → color
|
|
33
|
+
* fontFamily → string
|
|
34
|
+
* fontWeight → number
|
|
35
|
+
*
|
|
36
|
+
* Aliases use SD v3's `{path.to.token}` syntax (same as DTCG, which copied
|
|
37
|
+
* it from SD).
|
|
38
|
+
*
|
|
39
|
+
* For back-compat with cbds-components / blocks / czi-edu / eddie-design-system
|
|
40
|
+
* which still use SD v3's bare-key source format.
|
|
41
|
+
*/
|
|
1
42
|
import type { TokenDocument } from "../types.js";
|
|
2
43
|
import type { FormatOptions, FormatResult } from "./index.js";
|
|
3
|
-
export declare function formatStyleDictionaryV3(
|
|
44
|
+
export declare function formatStyleDictionaryV3(doc: TokenDocument, opts: FormatOptions): FormatResult;
|
|
4
45
|
//# sourceMappingURL=style-dictionary-v3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-dictionary-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/style-dictionary-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"style-dictionary-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/style-dictionary-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EAAS,aAAa,EAAwB,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,aAAa,GAClB,YAAY,CA2Cd"}
|
|
@@ -1,5 +1,208 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Style Dictionary v3 source-format JSON formatter.
|
|
3
|
+
*
|
|
4
|
+
* SD v3 uses bare `value` / `type` fields (no `$` prefix, that's the DTCG
|
|
5
|
+
* convention SD v4 adopted). Output is structurally similar to DTCG but
|
|
6
|
+
* without the dollar signs, and groups have no special meta — just
|
|
7
|
+
* nested objects.
|
|
8
|
+
*
|
|
9
|
+
* Output shape:
|
|
10
|
+
*
|
|
11
|
+
* {
|
|
12
|
+
* "color": {
|
|
13
|
+
* "primary": {
|
|
14
|
+
* "value": "#4085F2",
|
|
15
|
+
* "type": "color",
|
|
16
|
+
* "comment": "Primary brand color"
|
|
17
|
+
* },
|
|
18
|
+
* "brand": {
|
|
19
|
+
* "blue": { "value": "#0066FF", "type": "color" }
|
|
20
|
+
* }
|
|
21
|
+
* },
|
|
22
|
+
* "spacing": {
|
|
23
|
+
* "md": { "value": "16px", "type": "size" }
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*
|
|
27
|
+
* SD v3 type names differ slightly from DTCG:
|
|
28
|
+
*
|
|
29
|
+
* DTCG type → SD v3 type
|
|
30
|
+
* ----------------------------
|
|
31
|
+
* dimension → size (or spacing for spacing tokens)
|
|
32
|
+
* color → color
|
|
33
|
+
* fontFamily → string
|
|
34
|
+
* fontWeight → number
|
|
35
|
+
*
|
|
36
|
+
* Aliases use SD v3's `{path.to.token}` syntax (same as DTCG, which copied
|
|
37
|
+
* it from SD).
|
|
38
|
+
*
|
|
39
|
+
* For back-compat with cbds-components / blocks / czi-edu / eddie-design-system
|
|
40
|
+
* which still use SD v3's bare-key source format.
|
|
41
|
+
*/
|
|
42
|
+
export function formatStyleDictionaryV3(doc, opts) {
|
|
43
|
+
const warnings = [];
|
|
44
|
+
const files = [];
|
|
45
|
+
const splitByMode = opts.target.splitByMode ?? false;
|
|
46
|
+
const splitByCollection = opts.target.splitByCollection ?? false;
|
|
47
|
+
if (splitByMode && splitByCollection) {
|
|
48
|
+
for (const set of doc.sets) {
|
|
49
|
+
for (const mode of set.modes) {
|
|
50
|
+
files.push({
|
|
51
|
+
path: filenameFor(opts, set, mode),
|
|
52
|
+
content: renderSdJson([set], [mode], warnings),
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (splitByMode) {
|
|
58
|
+
const allModes = new Set();
|
|
59
|
+
for (const set of doc.sets)
|
|
60
|
+
for (const m of set.modes)
|
|
61
|
+
allModes.add(m);
|
|
62
|
+
for (const mode of allModes) {
|
|
63
|
+
const sets = doc.sets.filter((s) => s.modes.includes(mode));
|
|
64
|
+
files.push({
|
|
65
|
+
path: filenameFor(opts, undefined, mode),
|
|
66
|
+
content: renderSdJson(sets, [mode], warnings),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (splitByCollection) {
|
|
71
|
+
for (const set of doc.sets) {
|
|
72
|
+
files.push({
|
|
73
|
+
path: filenameFor(opts, set),
|
|
74
|
+
content: renderSdJson([set], set.modes, warnings),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const allModes = new Set();
|
|
80
|
+
for (const set of doc.sets)
|
|
81
|
+
for (const m of set.modes)
|
|
82
|
+
allModes.add(m);
|
|
83
|
+
files.push({
|
|
84
|
+
path: filenameFor(opts),
|
|
85
|
+
content: renderSdJson(doc.sets, [...allModes], warnings),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
return { files, warnings };
|
|
89
|
+
}
|
|
90
|
+
function filenameFor(opts, set, mode) {
|
|
91
|
+
if (opts.target.filename)
|
|
92
|
+
return opts.target.filename;
|
|
93
|
+
const parts = [];
|
|
94
|
+
if (set)
|
|
95
|
+
parts.push(slugify(set.name));
|
|
96
|
+
if (mode)
|
|
97
|
+
parts.push(slugify(mode));
|
|
98
|
+
if (parts.length === 0)
|
|
99
|
+
parts.push("tokens");
|
|
100
|
+
return `${parts.join(".")}.sd.json`;
|
|
101
|
+
}
|
|
102
|
+
function slugify(s) {
|
|
103
|
+
return s
|
|
104
|
+
.trim()
|
|
105
|
+
.toLowerCase()
|
|
106
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
107
|
+
.replace(/^-+|-+$/g, "");
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Map DTCG type names to SD v3 conventions.
|
|
111
|
+
*/
|
|
112
|
+
function sdTypeFor(token) {
|
|
113
|
+
const lower = token.path[0]?.toLowerCase() ?? "";
|
|
114
|
+
if (token.type === "dimension") {
|
|
115
|
+
if (lower.startsWith("spacing") || lower === "space")
|
|
116
|
+
return "spacing";
|
|
117
|
+
return "size";
|
|
118
|
+
}
|
|
119
|
+
if (token.type === "color")
|
|
120
|
+
return "color";
|
|
121
|
+
if (token.type === "fontFamily")
|
|
122
|
+
return "string";
|
|
123
|
+
if (token.type === "fontWeight")
|
|
124
|
+
return "number";
|
|
125
|
+
if (token.type === "duration")
|
|
126
|
+
return "time";
|
|
127
|
+
if (token.type === "number")
|
|
128
|
+
return "number";
|
|
129
|
+
if (token.type === "string")
|
|
130
|
+
return "string";
|
|
131
|
+
if (token.type === "boolean")
|
|
132
|
+
return "boolean";
|
|
133
|
+
// Composites / less-common types: pass through.
|
|
134
|
+
return token.type;
|
|
135
|
+
}
|
|
136
|
+
function renderSdJson(sets, modes, warnings) {
|
|
137
|
+
const tree = {};
|
|
138
|
+
const primaryMode = pickPrimaryMode(modes);
|
|
139
|
+
for (const set of sets) {
|
|
140
|
+
for (const token of set.tokens) {
|
|
141
|
+
// Filter to modes the file is supposed to cover.
|
|
142
|
+
const usableModes = modes.filter((m) => token.values[m]);
|
|
143
|
+
if (usableModes.length === 0)
|
|
144
|
+
continue;
|
|
145
|
+
// SD v3 has no native multi-mode encoding, so we pick the primary
|
|
146
|
+
// mode's value. If splitByMode is being used (single mode in this
|
|
147
|
+
// file), that primary will match the file's mode. Otherwise, the
|
|
148
|
+
// chosen primary is the first available.
|
|
149
|
+
const valueMode = usableModes.includes(primaryMode)
|
|
150
|
+
? primaryMode
|
|
151
|
+
: usableModes[0];
|
|
152
|
+
const tokenValue = token.values[valueMode];
|
|
153
|
+
const sdValue = sdValueFor(tokenValue, token, warnings);
|
|
154
|
+
if (sdValue === undefined)
|
|
155
|
+
continue;
|
|
156
|
+
// Walk the path, creating nested groups.
|
|
157
|
+
let cursor = tree;
|
|
158
|
+
for (let i = 0; i < token.path.length - 1; i++) {
|
|
159
|
+
const segment = token.path[i];
|
|
160
|
+
if (!cursor[segment] || typeof cursor[segment] !== "object") {
|
|
161
|
+
cursor[segment] = {};
|
|
162
|
+
}
|
|
163
|
+
cursor = cursor[segment];
|
|
164
|
+
}
|
|
165
|
+
const leafKey = token.path[token.path.length - 1];
|
|
166
|
+
const leaf = {
|
|
167
|
+
value: sdValue,
|
|
168
|
+
type: sdTypeFor(token),
|
|
169
|
+
};
|
|
170
|
+
if (token.description)
|
|
171
|
+
leaf.comment = token.description;
|
|
172
|
+
cursor[leafKey] = leaf;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return JSON.stringify(sortKeys(tree), null, 2) + "\n";
|
|
176
|
+
}
|
|
177
|
+
function pickPrimaryMode(modes) {
|
|
178
|
+
return modes.find((m) => /^(default|light|value)$/i.test(m)) ?? modes[0];
|
|
179
|
+
}
|
|
180
|
+
function sdValueFor(value, token, warnings) {
|
|
181
|
+
if (value.reference) {
|
|
182
|
+
const bare = value.reference.replace(/^\{|\}$/g, "");
|
|
183
|
+
if (bare.startsWith("__library:") || bare === "unknown") {
|
|
184
|
+
warnings.push(`Skipped ${token.path.join(".")} in Style Dictionary v3 — cross-library alias unresolved.`);
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
// SD v3 uses the same `{path.to.token}` alias syntax as DTCG.
|
|
188
|
+
return `{${bare}}`;
|
|
189
|
+
}
|
|
190
|
+
if (value.literal === undefined || value.literal === null)
|
|
191
|
+
return undefined;
|
|
192
|
+
if (typeof value.literal === "number" && token.type === "dimension") {
|
|
193
|
+
return `${value.literal}px`;
|
|
194
|
+
}
|
|
195
|
+
return value.literal;
|
|
196
|
+
}
|
|
197
|
+
function sortKeys(node) {
|
|
198
|
+
if (node === null || typeof node !== "object" || Array.isArray(node)) {
|
|
199
|
+
return node;
|
|
200
|
+
}
|
|
201
|
+
const obj = node;
|
|
202
|
+
const sorted = {};
|
|
203
|
+
const keys = Object.keys(obj).sort();
|
|
204
|
+
for (const k of keys)
|
|
205
|
+
sorted[k] = sortKeys(obj[k]);
|
|
206
|
+
return sorted;
|
|
4
207
|
}
|
|
5
208
|
//# sourceMappingURL=style-dictionary-v3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style-dictionary-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/style-dictionary-v3.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style-dictionary-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/style-dictionary-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAKH,MAAM,UAAU,uBAAuB,CACrC,GAAkB,EAClB,IAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAA0B,EAAE,CAAC;IAExC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,KAAK,CAAC;IACrD,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;IAEjE,IAAI,WAAW,IAAI,iBAAiB,EAAE,CAAC;QACrC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC;oBACT,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC;oBAClC,OAAO,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;iBAC/C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,WAAW,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5D,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;gBACxC,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;aAC9C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,iBAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC5B,OAAO,EAAE,YAAY,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC;aAClD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,QAAQ,CAAC;SACzD,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAClB,IAAmB,EACnB,GAAc,EACd,IAAa;IAEb,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC;SACL,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,KAAY;IAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACvE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC7C,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,gDAAgD;IAChD,OAAO,KAAK,CAAC,IAAI,CAAC;AACpB,CAAC;AAED,SAAS,YAAY,CACnB,IAAgB,EAChB,KAAe,EACf,QAAkB;IAElB,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAE3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,iDAAiD;YACjD,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAEvC,kEAAkE;YAClE,kEAAkE;YAClE,iEAAiE;YACjE,yCAAyC;YACzC,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACjD,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YACnB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAE3C,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,IAAI,OAAO,KAAK,SAAS;gBAAE,SAAS;YAEpC,yCAAyC;YACzC,IAAI,MAAM,GAAG,IAAI,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC5D,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACvB,CAAC;gBACD,MAAM,GAAG,MAAM,CAAC,OAAO,CAA4B,CAAC;YACtD,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClD,MAAM,IAAI,GAA4B;gBACpC,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC;aACvB,CAAC;YACF,IAAI,KAAK,CAAC,WAAW;gBAAE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC;YACxD,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,UAAU,CACjB,KAAiB,EACjB,KAAY,EACZ,QAAkB;IAElB,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QACrD,IAAI,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CACX,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAC3F,CAAC;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,8DAA8D;QAC9D,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5E,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,SAAS,QAAQ,CAAI,IAAO;IAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAY,CAAC,CAAC;IAC9D,OAAO,MAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind v3 config formatter.
|
|
3
|
+
*
|
|
4
|
+
* Output shape:
|
|
5
|
+
*
|
|
6
|
+
* // tailwind.tokens.js
|
|
7
|
+
* module.exports = {
|
|
8
|
+
* colors: {
|
|
9
|
+
* primary: "#4085F2",
|
|
10
|
+
* brand: { primary: "#FF00AA" }
|
|
11
|
+
* },
|
|
12
|
+
* spacing: {
|
|
13
|
+
* md: "16px"
|
|
14
|
+
* }
|
|
15
|
+
* };
|
|
16
|
+
*
|
|
17
|
+
* Designed to be spread into `tailwind.config.js`:
|
|
18
|
+
*
|
|
19
|
+
* const tokens = require('./src/styles/generated/tailwind.tokens.js');
|
|
20
|
+
* module.exports = { theme: { extend: tokens } };
|
|
21
|
+
*
|
|
22
|
+
* Token-to-namespace mapping mirrors Tailwind v3's theme keys:
|
|
23
|
+
*
|
|
24
|
+
* color/* → colors.*
|
|
25
|
+
* spacing/* → spacing.*
|
|
26
|
+
* font/* → fontFamily.*
|
|
27
|
+
* text/* → fontSize.*
|
|
28
|
+
* radius/* → borderRadius.*
|
|
29
|
+
*
|
|
30
|
+
* Multi-mode tokens flatten to the primary mode (Tailwind v3 doesn't have
|
|
31
|
+
* a native multi-mode model — dark-mode variants come from `tailwindcss`'s
|
|
32
|
+
* `darkMode: 'class'` + separate CSS variable files).
|
|
33
|
+
*/
|
|
1
34
|
import type { TokenDocument } from "../types.js";
|
|
2
35
|
import type { FormatOptions, FormatResult } from "./index.js";
|
|
3
|
-
export declare function formatTailwindV3(
|
|
36
|
+
export declare function formatTailwindV3(doc: TokenDocument, opts: FormatOptions): FormatResult;
|
|
4
37
|
//# sourceMappingURL=tailwind-v3.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tailwind-v3.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAS,aAAa,EAAwB,MAAM,aAAa,CAAC;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,aAAa,GAClB,YAAY,CA4Bd"}
|
|
@@ -1,5 +1,238 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind v3 config formatter.
|
|
3
|
+
*
|
|
4
|
+
* Output shape:
|
|
5
|
+
*
|
|
6
|
+
* // tailwind.tokens.js
|
|
7
|
+
* module.exports = {
|
|
8
|
+
* colors: {
|
|
9
|
+
* primary: "#4085F2",
|
|
10
|
+
* brand: { primary: "#FF00AA" }
|
|
11
|
+
* },
|
|
12
|
+
* spacing: {
|
|
13
|
+
* md: "16px"
|
|
14
|
+
* }
|
|
15
|
+
* };
|
|
16
|
+
*
|
|
17
|
+
* Designed to be spread into `tailwind.config.js`:
|
|
18
|
+
*
|
|
19
|
+
* const tokens = require('./src/styles/generated/tailwind.tokens.js');
|
|
20
|
+
* module.exports = { theme: { extend: tokens } };
|
|
21
|
+
*
|
|
22
|
+
* Token-to-namespace mapping mirrors Tailwind v3's theme keys:
|
|
23
|
+
*
|
|
24
|
+
* color/* → colors.*
|
|
25
|
+
* spacing/* → spacing.*
|
|
26
|
+
* font/* → fontFamily.*
|
|
27
|
+
* text/* → fontSize.*
|
|
28
|
+
* radius/* → borderRadius.*
|
|
29
|
+
*
|
|
30
|
+
* Multi-mode tokens flatten to the primary mode (Tailwind v3 doesn't have
|
|
31
|
+
* a native multi-mode model — dark-mode variants come from `tailwindcss`'s
|
|
32
|
+
* `darkMode: 'class'` + separate CSS variable files).
|
|
33
|
+
*/
|
|
34
|
+
import { buildTokenIndex, resolveAliasChain } from "../alias-resolver.js";
|
|
35
|
+
export function formatTailwindV3(doc, opts) {
|
|
36
|
+
const warnings = [];
|
|
37
|
+
const files = [];
|
|
38
|
+
const splitByCollection = opts.target.splitByCollection ?? false;
|
|
39
|
+
// Tailwind v3 config is consumed by Tailwind's build step, which needs
|
|
40
|
+
// literal values — no runtime alias resolution. Build a full-document
|
|
41
|
+
// token index so we can resolve alias chains at export time. Even when
|
|
42
|
+
// splitByCollection writes one file per set, aliases may target tokens
|
|
43
|
+
// in OTHER sets (e.g. semantic → primitives) so the index must span
|
|
44
|
+
// every set, not just the file's own.
|
|
45
|
+
const tokenIndex = buildTokenIndex(doc);
|
|
46
|
+
if (splitByCollection) {
|
|
47
|
+
for (const set of doc.sets) {
|
|
48
|
+
files.push({
|
|
49
|
+
path: filenameFor(opts, set),
|
|
50
|
+
content: renderConfigFile([set], opts, tokenIndex, warnings),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
files.push({
|
|
56
|
+
path: filenameFor(opts),
|
|
57
|
+
content: renderConfigFile(doc.sets, opts, tokenIndex, warnings),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return { files, warnings };
|
|
61
|
+
}
|
|
62
|
+
function filenameFor(opts, set) {
|
|
63
|
+
if (opts.target.filename)
|
|
64
|
+
return opts.target.filename;
|
|
65
|
+
if (set)
|
|
66
|
+
return `${slugify(set.name)}.tailwind.tokens.js`;
|
|
67
|
+
return "tailwind.tokens.js";
|
|
68
|
+
}
|
|
69
|
+
function slugify(s) {
|
|
70
|
+
return s
|
|
71
|
+
.trim()
|
|
72
|
+
.toLowerCase()
|
|
73
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
74
|
+
.replace(/^-+|-+$/g, "");
|
|
75
|
+
}
|
|
76
|
+
function jsKey(segment) {
|
|
77
|
+
if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(segment))
|
|
78
|
+
return segment;
|
|
79
|
+
return JSON.stringify(segment);
|
|
80
|
+
}
|
|
81
|
+
function renderConfigFile(sets, opts, tokenIndex, warnings) {
|
|
82
|
+
const lines = [];
|
|
83
|
+
lines.push("/**");
|
|
84
|
+
lines.push(" * Generated by figma-console-mcp — do not edit by hand.");
|
|
85
|
+
lines.push(" * Spread this into your tailwind.config.js theme.extend block:");
|
|
86
|
+
lines.push(" *");
|
|
87
|
+
lines.push(" * const tokens = require('./path/to/this-file');");
|
|
88
|
+
lines.push(" * module.exports = { theme: { extend: tokens } };");
|
|
89
|
+
lines.push(" */");
|
|
90
|
+
lines.push("");
|
|
91
|
+
// Group tokens by Tailwind theme namespace.
|
|
92
|
+
const namespaces = {};
|
|
93
|
+
for (const set of sets) {
|
|
94
|
+
const primaryMode = pickPrimaryMode(set.modes);
|
|
95
|
+
for (const token of set.tokens) {
|
|
96
|
+
const value = token.values[primaryMode];
|
|
97
|
+
if (!value)
|
|
98
|
+
continue;
|
|
99
|
+
const formattedValue = formatTokenValue(value, token, primaryMode, tokenIndex, warnings);
|
|
100
|
+
if (formattedValue === null)
|
|
101
|
+
continue;
|
|
102
|
+
const { namespace, subPath } = mapToNamespace(token);
|
|
103
|
+
if (!namespaces[namespace])
|
|
104
|
+
namespaces[namespace] = {};
|
|
105
|
+
writeIntoTree(namespaces[namespace], subPath, formattedValue);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
lines.push("module.exports = {");
|
|
109
|
+
const namespaceEntries = Object.entries(namespaces).sort(([a], [b]) => a.localeCompare(b));
|
|
110
|
+
for (let i = 0; i < namespaceEntries.length; i++) {
|
|
111
|
+
const [ns, tree] = namespaceEntries[i];
|
|
112
|
+
lines.push(` ${jsKey(ns)}: ${renderTree(tree, 1)}${i < namespaceEntries.length - 1 ? "," : ""}`);
|
|
113
|
+
}
|
|
114
|
+
lines.push("};");
|
|
115
|
+
lines.push("");
|
|
116
|
+
return lines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
function pickPrimaryMode(modes) {
|
|
119
|
+
return modes.find((m) => /^(default|light|value)$/i.test(m)) ?? modes[0];
|
|
120
|
+
}
|
|
121
|
+
function mapToNamespace(token) {
|
|
122
|
+
const slug = token.path.map(slugify);
|
|
123
|
+
if (slug.length === 0)
|
|
124
|
+
return { namespace: "extend", subPath: [] };
|
|
125
|
+
// First-segment aliases that should be re-namespaced to Tailwind theme keys.
|
|
126
|
+
const NAMESPACE_MAP = {
|
|
127
|
+
color: "colors",
|
|
128
|
+
colors: "colors",
|
|
129
|
+
spacing: "spacing",
|
|
130
|
+
space: "spacing",
|
|
131
|
+
radius: "borderRadius",
|
|
132
|
+
"border-radius": "borderRadius",
|
|
133
|
+
rounded: "borderRadius",
|
|
134
|
+
font: "fontFamily",
|
|
135
|
+
"font-family": "fontFamily",
|
|
136
|
+
text: "fontSize",
|
|
137
|
+
"font-size": "fontSize",
|
|
138
|
+
"font-weight": "fontWeight",
|
|
139
|
+
shadow: "boxShadow",
|
|
140
|
+
"box-shadow": "boxShadow",
|
|
141
|
+
opacity: "opacity",
|
|
142
|
+
"z-index": "zIndex",
|
|
143
|
+
"line-height": "lineHeight",
|
|
144
|
+
leading: "lineHeight",
|
|
145
|
+
tracking: "letterSpacing",
|
|
146
|
+
"letter-spacing": "letterSpacing",
|
|
147
|
+
};
|
|
148
|
+
if (NAMESPACE_MAP[slug[0]]) {
|
|
149
|
+
return { namespace: NAMESPACE_MAP[slug[0]], subPath: slug.slice(1) };
|
|
150
|
+
}
|
|
151
|
+
// Heuristic by type when no first-segment match.
|
|
152
|
+
if (token.type === "color")
|
|
153
|
+
return { namespace: "colors", subPath: slug };
|
|
154
|
+
if (token.type === "dimension")
|
|
155
|
+
return { namespace: "spacing", subPath: slug };
|
|
156
|
+
if (token.type === "fontFamily")
|
|
157
|
+
return { namespace: "fontFamily", subPath: slug };
|
|
158
|
+
if (token.type === "fontWeight")
|
|
159
|
+
return { namespace: "fontWeight", subPath: slug };
|
|
160
|
+
// Anything else: dump under extend.{path}
|
|
161
|
+
return { namespace: "extend", subPath: slug };
|
|
162
|
+
}
|
|
163
|
+
function writeIntoTree(tree, path, value) {
|
|
164
|
+
if (path.length === 0)
|
|
165
|
+
return;
|
|
166
|
+
let cursor = tree;
|
|
167
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
168
|
+
const segment = path[i];
|
|
169
|
+
const next = cursor[segment];
|
|
170
|
+
if (!next || typeof next === "string") {
|
|
171
|
+
const newNode = {};
|
|
172
|
+
cursor[segment] = newNode;
|
|
173
|
+
cursor = newNode;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
cursor = next;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const leafKey = path[path.length - 1];
|
|
180
|
+
cursor[leafKey] = value;
|
|
181
|
+
}
|
|
182
|
+
function renderTree(tree, indent) {
|
|
183
|
+
const ind = " ".repeat(indent);
|
|
184
|
+
const innerInd = " ".repeat(indent + 1);
|
|
185
|
+
const entries = [];
|
|
186
|
+
const sortedKeys = Object.keys(tree).sort();
|
|
187
|
+
for (const key of sortedKeys) {
|
|
188
|
+
const value = tree[key];
|
|
189
|
+
const k = jsKey(key);
|
|
190
|
+
if (typeof value === "string") {
|
|
191
|
+
entries.push(`${innerInd}${k}: ${value}`);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
entries.push(`${innerInd}${k}: ${renderTree(value, indent + 1)}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (entries.length === 0)
|
|
198
|
+
return "{}";
|
|
199
|
+
return `{\n${entries.join(",\n")},\n${ind}}`;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Format a token value as a JavaScript literal (quoted string for most
|
|
203
|
+
* things). Resolves alias chains to their literal target value via the
|
|
204
|
+
* document-wide token index — Tailwind v3 config is read at Tailwind's
|
|
205
|
+
* build time and needs concrete values (no runtime cascade).
|
|
206
|
+
*
|
|
207
|
+
* Returns null only for cross-library aliases or genuinely empty values,
|
|
208
|
+
* after emitting a warning explaining what got skipped.
|
|
209
|
+
*/
|
|
210
|
+
function formatTokenValue(value, token, mode, tokenIndex, warnings) {
|
|
211
|
+
let effective = value;
|
|
212
|
+
if (value.reference) {
|
|
213
|
+
effective = resolveAliasChain(value, mode, tokenIndex);
|
|
214
|
+
if (!effective) {
|
|
215
|
+
const bare = value.reference.replace(/^\{|\}$/g, "");
|
|
216
|
+
const reason = bare.startsWith("__library:") || bare === "unknown"
|
|
217
|
+
? "cross-library alias"
|
|
218
|
+
: "alias target not found in any set";
|
|
219
|
+
warnings.push(`Skipped ${token.path.join(".")} in Tailwind v3 — ${reason}: ${value.reference}.`);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (!effective || effective.literal === undefined || effective.literal === null) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
if (typeof effective.literal === "number") {
|
|
227
|
+
if (token.type === "dimension")
|
|
228
|
+
return JSON.stringify(`${effective.literal}px`);
|
|
229
|
+
return String(effective.literal);
|
|
230
|
+
}
|
|
231
|
+
if (typeof effective.literal === "string")
|
|
232
|
+
return JSON.stringify(effective.literal);
|
|
233
|
+
if (typeof effective.literal === "boolean")
|
|
234
|
+
return String(effective.literal);
|
|
235
|
+
// Composite: emit as JSON object literal
|
|
236
|
+
return JSON.stringify(effective.literal);
|
|
4
237
|
}
|
|
5
238
|
//# sourceMappingURL=tailwind-v3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v3.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tailwind-v3.js","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v3.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG1E,MAAM,UAAU,gBAAgB,CAC9B,GAAkB,EAClB,IAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAA0B,EAAE,CAAC;IAExC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;IACjE,uEAAuE;IACvE,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IACvE,oEAAoE;IACpE,sCAAsC;IACtC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,iBAAiB,EAAE,CAAC;QACtB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC;gBAC5B,OAAO,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;SAChE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,GAAc;IACtD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IACtD,IAAI,GAAG;QAAE,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;IAC1D,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,OAAO,CAAC;SACL,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,KAAK,CAAC,OAAe;IAC5B,IAAI,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAMD,SAAS,gBAAgB,CACvB,IAAgB,EAChB,IAAmB,EACnB,UAA8B,EAC9B,QAAkB;IAElB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACvE,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IACnE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,4CAA4C;IAC5C,MAAM,UAAU,GAA2B,EAAE,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YACxC,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,cAAc,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YACzF,IAAI,cAAc,KAAK,IAAI;gBAAE,SAAS;YACtC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBAAE,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YACvD,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACpG,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,cAAc,CAAC,KAAY;IAIlC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAEnE,6EAA6E;IAC7E,MAAM,aAAa,GAA2B;QAC5C,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,cAAc;QACtB,eAAe,EAAE,cAAc;QAC/B,OAAO,EAAE,cAAc;QACvB,IAAI,EAAE,YAAY;QAClB,aAAa,EAAE,YAAY;QAC3B,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;QAC3B,MAAM,EAAE,WAAW;QACnB,YAAY,EAAE,WAAW;QACzB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,QAAQ;QACnB,aAAa,EAAE,YAAY;QAC3B,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,eAAe;QACzB,gBAAgB,EAAE,eAAe;KAClC,CAAC;IAEF,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,iDAAiD;IACjD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC/E,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnF,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnF,0CAA0C;IAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,IAAc,EAAE,KAAa;IAChE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC9B,IAAI,MAAM,GAAW,IAAI,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,OAAO,GAAW,EAAE,CAAC;YAC3B,MAAM,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;YAC1B,MAAM,GAAG,OAAO,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,MAAc;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,KAAK,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CACvB,KAAiB,EACjB,KAAY,EACZ,IAAY,EACZ,UAA8B,EAC9B,QAAkB;IAElB,IAAI,SAAS,GAAsB,KAAK,CAAC;IACzC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,IAAI,KAAK,SAAS;gBAChE,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,mCAAmC,CAAC;YACxC,QAAQ,CAAC,IAAI,CACX,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,MAAM,KAAK,KAAK,CAAC,SAAS,GAAG,CAClF,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC,OAAO,IAAI,CAAC,CAAC;QAChF,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpF,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC7E,yCAAyC;IACzC,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -1,4 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tailwind v4 `@theme` block formatter.
|
|
3
|
+
*
|
|
4
|
+
* Tailwind v4 introduced CSS-first configuration: instead of a JS
|
|
5
|
+
* `tailwind.config.js`, you write tokens directly into your CSS with an
|
|
6
|
+
* `@theme inline { ... }` block. Tailwind processes that block to generate
|
|
7
|
+
* utility classes (`bg-primary`, `text-foreground`, etc.) at build time.
|
|
8
|
+
*
|
|
9
|
+
* Output shape:
|
|
10
|
+
*
|
|
11
|
+
* @theme inline {
|
|
12
|
+
* --color-primary: #4085F2;
|
|
13
|
+
* --spacing-md: 16px;
|
|
14
|
+
* --font-family-sans: "Inter", sans-serif;
|
|
15
|
+
* }
|
|
16
|
+
*
|
|
17
|
+
* .dark {
|
|
18
|
+
* --color-primary: #5599FF;
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* Token-to-Tailwind-namespace mapping follows the canonical Tailwind v4
|
|
22
|
+
* convention (see https://tailwindcss.com/docs/theme):
|
|
23
|
+
*
|
|
24
|
+
* color/* → --color-* (maps to bg-*, text-*, border-*, etc.)
|
|
25
|
+
* spacing/* → --spacing-*
|
|
26
|
+
* radius/* → --radius-* (maps to rounded-*)
|
|
27
|
+
* font/* → --font-* (font-family namespace)
|
|
28
|
+
* text/* → --text-* (font-size namespace)
|
|
29
|
+
* font-weight/* → --font-weight-*
|
|
30
|
+
* tracking/* → --tracking-*
|
|
31
|
+
* leading/* → --leading-*
|
|
32
|
+
* shadow/* → --shadow-*
|
|
33
|
+
*
|
|
34
|
+
* Tokens that don't fit a known Tailwind namespace get emitted with their
|
|
35
|
+
* path verbatim (with prefix if configured). They're still valid CSS vars
|
|
36
|
+
* — they just don't generate Tailwind utility classes.
|
|
37
|
+
*/
|
|
1
38
|
import type { TokenDocument } from "../types.js";
|
|
2
39
|
import type { FormatOptions, FormatResult } from "./index.js";
|
|
3
|
-
export declare function formatTailwindV4(
|
|
40
|
+
export declare function formatTailwindV4(doc: TokenDocument, opts: FormatOptions): FormatResult;
|
|
4
41
|
//# sourceMappingURL=tailwind-v4.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tailwind-v4.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v4.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"tailwind-v4.d.ts","sourceRoot":"","sources":["../../../../src/core/tokens/formatters/tailwind-v4.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EAAS,aAAa,EAAwB,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE9D,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,aAAa,GAClB,YAAY,CAiDd"}
|