eva-css-for-tailwind 1.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.
@@ -0,0 +1,121 @@
1
+ /** Intensity levels matching eva-css SCSS convention */
2
+ type Intensity = '__' | '_' | '' | '-';
3
+ /** Intensity levels for font-size (3 levels only, matching SCSS) */
4
+ type FontIntensity = '__' | '_' | '';
5
+ interface EvaYcodeConfig {
6
+ /** Spacing sizes in px from Figma tokens */
7
+ sizes: number[];
8
+ /** Font sizes in px from Figma tokens */
9
+ fontSizes: number[];
10
+ /** Reference screen width (default: 1440) */
11
+ screen?: number;
12
+ /** Spacing ratio multiplier — golden ratio (default: 1.61803398875) */
13
+ phi?: number;
14
+ /** Font ratio multiplier (default: 1.3) */
15
+ fontPhi?: number;
16
+ /** Min fluid factor for spacing (default: 0.5) */
17
+ min?: number;
18
+ /** Min fluid factor for fonts (default: 0.5 — matches SCSS where getMinRem uses module-level $min) */
19
+ fontMin?: number;
20
+ /** Max fluid factor (default: 1) */
21
+ max?: number;
22
+ /** Extreme intensity factor (default: 142.4) */
23
+ ez?: number;
24
+ /** Default intensity (default: '') */
25
+ defaultIntensity?: Intensity;
26
+ }
27
+ interface ResolvedConfig {
28
+ sizes: number[];
29
+ fontSizes: number[];
30
+ screen: number;
31
+ phi: number;
32
+ fontPhi: number;
33
+ min: number;
34
+ fontMin: number;
35
+ max: number;
36
+ ez: number;
37
+ defaultIntensity: Intensity;
38
+ }
39
+ /** Map of Tailwind prefix → CSS property for spacing/layout */
40
+ declare const PROPERTY_MAP: Record<string, string>;
41
+ /** Font property map — uses --fs-XX vars */
42
+ declare const FONT_PROPERTY_MAP: Record<string, string>;
43
+ /** All spacing intensity suffixes in order (most fluid → least fluid) */
44
+ declare const SPACING_INTENSITIES: Intensity[];
45
+ /** All font intensity suffixes in order (most fluid → least fluid) */
46
+ declare const FONT_INTENSITIES: FontIntensity[];
47
+ declare function resolveConfig(config: EvaYcodeConfig): ResolvedConfig;
48
+
49
+ /**
50
+ * eva-css-for-tailwind — API
51
+ *
52
+ * Modular API for eva-css fluid calculations.
53
+ * Each method is independent — compose as needed.
54
+ */
55
+
56
+ interface ParsedClass {
57
+ /** Original class string, e.g. "pt-[140px]" */
58
+ raw: string;
59
+ /** TW prefix, e.g. "pt" */
60
+ prefix: string;
61
+ /** CSS property, e.g. "padding-top" */
62
+ property: string;
63
+ /** Size in px, e.g. 140 */
64
+ size: number;
65
+ /** Original unit: "px" or "rem" */
66
+ unit: 'px' | 'rem';
67
+ /** "spacing" or "font" */
68
+ type: 'spacing' | 'font';
69
+ }
70
+ /**
71
+ * Parse a Tailwind arbitrary class into its components.
72
+ *
73
+ * @example
74
+ * parseClass('pt-[140px]')
75
+ * // → { raw: 'pt-[140px]', prefix: 'pt', property: 'padding-top', size: 140, unit: 'px', type: 'spacing' }
76
+ */
77
+ declare function parseClass(className: string): ParsedClass | null;
78
+ /**
79
+ * Generate a single clamp() value.
80
+ *
81
+ * @example
82
+ * generateClamp(32, 'spacing', '__')
83
+ * // → "clamp(0.5rem, 3.16vw - 1.11rem, 2.22rem)"
84
+ */
85
+ declare function generateClamp(sizePx: number, type: 'spacing' | 'font', intensity?: Intensity | FontIntensity, config?: Partial<EvaYcodeConfig>): string;
86
+ /**
87
+ * Generate :root CSS custom properties for all configured sizes.
88
+ * Always complete — these vars are used by the nocode UI.
89
+ *
90
+ * @example
91
+ * generateVars({ sizes: [16, 32], fontSizes: [16] })
92
+ * // → ":root { --16__: clamp(...); --16_: ...; --16: ...; --16-: ...; --fs-16__: ...; }"
93
+ */
94
+ declare function generateVars(config: EvaYcodeConfig): string;
95
+ /**
96
+ * Generate CSS overrides for specific Tailwind arbitrary classes.
97
+ * Each class gets its default + all intensity variants.
98
+ *
99
+ * @example
100
+ * generateClassOverrides(['p-[32px]', 'text-[48px]'])
101
+ * // → ".p-\\[32px\\] { padding: var(--32) }\n.p-\\[32px\\]__ { padding: var(--32__) }\n..."
102
+ */
103
+ declare function generateClassOverrides(classes: string[], config?: Partial<EvaYcodeConfig>): string;
104
+ /**
105
+ * Generate a TW4 @theme block mapping native utilities to eva vars.
106
+ * Use this if your project uses named utilities (p-32) instead of arbitrary values (p-[32px]).
107
+ *
108
+ * @example
109
+ * generateTheme({ sizes: [16, 32], fontSizes: [16] })
110
+ * // → "@theme { --spacing-16: var(--16); --spacing-32: var(--32); --font-size-16: var(--fs-16); }"
111
+ */
112
+ declare function generateTheme(config: EvaYcodeConfig): string;
113
+ /**
114
+ * Generate a complete CSS bridge — vars + theme + class overrides.
115
+ * Shortcut for CLI usage. For programmatic use, prefer individual methods.
116
+ */
117
+ declare function generateBridge(config: EvaYcodeConfig & {
118
+ classes?: string[];
119
+ }): string;
120
+
121
+ export { type EvaYcodeConfig, FONT_INTENSITIES, FONT_PROPERTY_MAP, type FontIntensity, type Intensity, PROPERTY_MAP, type ParsedClass, type ResolvedConfig, SPACING_INTENSITIES, generateBridge, generateClamp, generateClassOverrides, generateTheme, generateVars, parseClass, resolveConfig };
@@ -0,0 +1,121 @@
1
+ /** Intensity levels matching eva-css SCSS convention */
2
+ type Intensity = '__' | '_' | '' | '-';
3
+ /** Intensity levels for font-size (3 levels only, matching SCSS) */
4
+ type FontIntensity = '__' | '_' | '';
5
+ interface EvaYcodeConfig {
6
+ /** Spacing sizes in px from Figma tokens */
7
+ sizes: number[];
8
+ /** Font sizes in px from Figma tokens */
9
+ fontSizes: number[];
10
+ /** Reference screen width (default: 1440) */
11
+ screen?: number;
12
+ /** Spacing ratio multiplier — golden ratio (default: 1.61803398875) */
13
+ phi?: number;
14
+ /** Font ratio multiplier (default: 1.3) */
15
+ fontPhi?: number;
16
+ /** Min fluid factor for spacing (default: 0.5) */
17
+ min?: number;
18
+ /** Min fluid factor for fonts (default: 0.5 — matches SCSS where getMinRem uses module-level $min) */
19
+ fontMin?: number;
20
+ /** Max fluid factor (default: 1) */
21
+ max?: number;
22
+ /** Extreme intensity factor (default: 142.4) */
23
+ ez?: number;
24
+ /** Default intensity (default: '') */
25
+ defaultIntensity?: Intensity;
26
+ }
27
+ interface ResolvedConfig {
28
+ sizes: number[];
29
+ fontSizes: number[];
30
+ screen: number;
31
+ phi: number;
32
+ fontPhi: number;
33
+ min: number;
34
+ fontMin: number;
35
+ max: number;
36
+ ez: number;
37
+ defaultIntensity: Intensity;
38
+ }
39
+ /** Map of Tailwind prefix → CSS property for spacing/layout */
40
+ declare const PROPERTY_MAP: Record<string, string>;
41
+ /** Font property map — uses --fs-XX vars */
42
+ declare const FONT_PROPERTY_MAP: Record<string, string>;
43
+ /** All spacing intensity suffixes in order (most fluid → least fluid) */
44
+ declare const SPACING_INTENSITIES: Intensity[];
45
+ /** All font intensity suffixes in order (most fluid → least fluid) */
46
+ declare const FONT_INTENSITIES: FontIntensity[];
47
+ declare function resolveConfig(config: EvaYcodeConfig): ResolvedConfig;
48
+
49
+ /**
50
+ * eva-css-for-tailwind — API
51
+ *
52
+ * Modular API for eva-css fluid calculations.
53
+ * Each method is independent — compose as needed.
54
+ */
55
+
56
+ interface ParsedClass {
57
+ /** Original class string, e.g. "pt-[140px]" */
58
+ raw: string;
59
+ /** TW prefix, e.g. "pt" */
60
+ prefix: string;
61
+ /** CSS property, e.g. "padding-top" */
62
+ property: string;
63
+ /** Size in px, e.g. 140 */
64
+ size: number;
65
+ /** Original unit: "px" or "rem" */
66
+ unit: 'px' | 'rem';
67
+ /** "spacing" or "font" */
68
+ type: 'spacing' | 'font';
69
+ }
70
+ /**
71
+ * Parse a Tailwind arbitrary class into its components.
72
+ *
73
+ * @example
74
+ * parseClass('pt-[140px]')
75
+ * // → { raw: 'pt-[140px]', prefix: 'pt', property: 'padding-top', size: 140, unit: 'px', type: 'spacing' }
76
+ */
77
+ declare function parseClass(className: string): ParsedClass | null;
78
+ /**
79
+ * Generate a single clamp() value.
80
+ *
81
+ * @example
82
+ * generateClamp(32, 'spacing', '__')
83
+ * // → "clamp(0.5rem, 3.16vw - 1.11rem, 2.22rem)"
84
+ */
85
+ declare function generateClamp(sizePx: number, type: 'spacing' | 'font', intensity?: Intensity | FontIntensity, config?: Partial<EvaYcodeConfig>): string;
86
+ /**
87
+ * Generate :root CSS custom properties for all configured sizes.
88
+ * Always complete — these vars are used by the nocode UI.
89
+ *
90
+ * @example
91
+ * generateVars({ sizes: [16, 32], fontSizes: [16] })
92
+ * // → ":root { --16__: clamp(...); --16_: ...; --16: ...; --16-: ...; --fs-16__: ...; }"
93
+ */
94
+ declare function generateVars(config: EvaYcodeConfig): string;
95
+ /**
96
+ * Generate CSS overrides for specific Tailwind arbitrary classes.
97
+ * Each class gets its default + all intensity variants.
98
+ *
99
+ * @example
100
+ * generateClassOverrides(['p-[32px]', 'text-[48px]'])
101
+ * // → ".p-\\[32px\\] { padding: var(--32) }\n.p-\\[32px\\]__ { padding: var(--32__) }\n..."
102
+ */
103
+ declare function generateClassOverrides(classes: string[], config?: Partial<EvaYcodeConfig>): string;
104
+ /**
105
+ * Generate a TW4 @theme block mapping native utilities to eva vars.
106
+ * Use this if your project uses named utilities (p-32) instead of arbitrary values (p-[32px]).
107
+ *
108
+ * @example
109
+ * generateTheme({ sizes: [16, 32], fontSizes: [16] })
110
+ * // → "@theme { --spacing-16: var(--16); --spacing-32: var(--32); --font-size-16: var(--fs-16); }"
111
+ */
112
+ declare function generateTheme(config: EvaYcodeConfig): string;
113
+ /**
114
+ * Generate a complete CSS bridge — vars + theme + class overrides.
115
+ * Shortcut for CLI usage. For programmatic use, prefer individual methods.
116
+ */
117
+ declare function generateBridge(config: EvaYcodeConfig & {
118
+ classes?: string[];
119
+ }): string;
120
+
121
+ export { type EvaYcodeConfig, FONT_INTENSITIES, FONT_PROPERTY_MAP, type FontIntensity, type Intensity, PROPERTY_MAP, type ParsedClass, type ResolvedConfig, SPACING_INTENSITIES, generateBridge, generateClamp, generateClassOverrides, generateTheme, generateVars, parseClass, resolveConfig };
package/dist/index.js ADDED
@@ -0,0 +1,369 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ FONT_INTENSITIES: () => FONT_INTENSITIES,
24
+ FONT_PROPERTY_MAP: () => FONT_PROPERTY_MAP,
25
+ PROPERTY_MAP: () => PROPERTY_MAP,
26
+ SPACING_INTENSITIES: () => SPACING_INTENSITIES,
27
+ generateBridge: () => generateBridge,
28
+ generateClamp: () => generateClamp,
29
+ generateClassOverrides: () => generateClassOverrides,
30
+ generateTheme: () => generateTheme,
31
+ generateVars: () => generateVars,
32
+ parseClass: () => parseClass,
33
+ resolveConfig: () => resolveConfig
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+
37
+ // src/clamp.ts
38
+ function round2(n) {
39
+ return Math.round(n * 100) / 100;
40
+ }
41
+ function getPercent(size, screen, ratio = 100) {
42
+ return round2(size / screen * ratio);
43
+ }
44
+ function toRem(size) {
45
+ return size / 16;
46
+ }
47
+ function getMinRem(percent, min) {
48
+ return round2(percent * min);
49
+ }
50
+ function getMaxRem(percent, max) {
51
+ return round2(percent * max);
52
+ }
53
+ function getVW(percent) {
54
+ return round2(percent);
55
+ }
56
+ function getFinalMinDiv(size, ratio) {
57
+ return round2(size / ratio);
58
+ }
59
+ function getFinalMinMulti(size, ratio) {
60
+ return round2(size * ratio);
61
+ }
62
+ function vwLight(calcPercent, sizeRem) {
63
+ return {
64
+ vw: round2(getVW(calcPercent) / 4),
65
+ offset: round2(sizeRem / 1.33)
66
+ };
67
+ }
68
+ function vwMedium(calcPercent, sizeRem) {
69
+ return {
70
+ vw: round2(getVW(calcPercent) / 2),
71
+ offset: round2(sizeRem / 2)
72
+ };
73
+ }
74
+ function vwStrong(calcPercent, sizeRem) {
75
+ return {
76
+ vw: round2(getVW(calcPercent) / 1.33),
77
+ offset: round2(sizeRem / 4)
78
+ };
79
+ }
80
+ function vwExtrem(calcPercentEz, remMin) {
81
+ return {
82
+ vw: getVW(calcPercentEz),
83
+ offset: round2(-remMin)
84
+ };
85
+ }
86
+ function formatClamp(min, fluid, max) {
87
+ const minStr = `${round2(min)}rem`;
88
+ const maxStr = `${round2(max)}rem`;
89
+ const sign = fluid.offset >= 0 ? "+" : "-";
90
+ const absOffset = round2(Math.abs(fluid.offset));
91
+ const fluidStr = `${fluid.vw}vw ${sign} ${absOffset}rem`;
92
+ return `clamp(${minStr}, ${fluidStr}, ${maxStr})`;
93
+ }
94
+ function generateSpacingClamp(sizePx, screen, phi, min, max, ez, intensity) {
95
+ const calcPercent = getPercent(sizePx, screen);
96
+ const calcPercentEz = getPercent(sizePx, screen, ez);
97
+ const sizeRem = toRem(sizePx);
98
+ const remMin = getMinRem(calcPercent, min);
99
+ const remMax = getMaxRem(calcPercent, max);
100
+ switch (intensity) {
101
+ // __ = extreme (most fluid)
102
+ case "__": {
103
+ const fluid = vwExtrem(calcPercentEz, remMin);
104
+ return formatClamp(min, fluid, remMax);
105
+ }
106
+ // _ = strong
107
+ case "_": {
108
+ const finalMin = getFinalMinDiv(remMin, phi);
109
+ const fluid = vwStrong(calcPercent, sizeRem);
110
+ return formatClamp(finalMin, fluid, remMax);
111
+ }
112
+ // '' = normal (default)
113
+ case "": {
114
+ const fluid = vwMedium(calcPercent, sizeRem);
115
+ return formatClamp(remMin, fluid, remMax);
116
+ }
117
+ // - = light (least fluid)
118
+ case "-": {
119
+ const finalMin = getFinalMinMulti(remMin, phi);
120
+ const fluid = vwLight(calcPercent, sizeRem);
121
+ return formatClamp(finalMin, fluid, remMax);
122
+ }
123
+ }
124
+ }
125
+ function generateFontClamp(sizePx, screen, phi, min, max, intensity) {
126
+ const calcPercent = getPercent(sizePx, screen);
127
+ const sizeRem = toRem(sizePx);
128
+ const remMin = getMinRem(calcPercent, min);
129
+ const remMax = getMaxRem(calcPercent, max);
130
+ switch (intensity) {
131
+ // __ = most fluid (uses vw-strong + min/phi)
132
+ case "__": {
133
+ const finalMin = getFinalMinDiv(remMin, phi);
134
+ const fluid = vwStrong(calcPercent, sizeRem);
135
+ return formatClamp(finalMin, fluid, remMax);
136
+ }
137
+ // _ = medium (uses vw-medium + remMin)
138
+ case "_": {
139
+ const fluid = vwMedium(calcPercent, sizeRem);
140
+ return formatClamp(remMin, fluid, remMax);
141
+ }
142
+ // '' = least fluid (uses vw-light + min*phi)
143
+ case "": {
144
+ const finalMin = getFinalMinMulti(remMin, phi);
145
+ const fluid = vwLight(calcPercent, sizeRem);
146
+ return formatClamp(finalMin, fluid, remMax);
147
+ }
148
+ }
149
+ }
150
+
151
+ // src/types.ts
152
+ var PROPERTY_MAP = {
153
+ // Sizing
154
+ h: "height",
155
+ w: "width",
156
+ "min-h": "min-height",
157
+ "min-w": "min-width",
158
+ "max-w": "max-width",
159
+ "max-h": "max-height",
160
+ // Padding
161
+ p: "padding",
162
+ px: "padding-inline",
163
+ py: "padding-block",
164
+ pt: "padding-top",
165
+ pr: "padding-right",
166
+ pb: "padding-bottom",
167
+ pl: "padding-left",
168
+ // Margin
169
+ m: "margin",
170
+ mx: "margin-inline",
171
+ my: "margin-block",
172
+ mt: "margin-top",
173
+ mr: "margin-right",
174
+ mb: "margin-bottom",
175
+ ml: "margin-left",
176
+ // Layout
177
+ gap: "gap",
178
+ // Borders
179
+ rounded: "border-radius"
180
+ };
181
+ var FONT_PROPERTY_MAP = {
182
+ text: "font-size"
183
+ };
184
+ var SPACING_INTENSITIES = ["__", "_", "", "-"];
185
+ var FONT_INTENSITIES = ["__", "_", ""];
186
+ function resolveConfig(config) {
187
+ return {
188
+ sizes: config.sizes,
189
+ fontSizes: config.fontSizes,
190
+ screen: config.screen ?? 1440,
191
+ phi: config.phi ?? 1.61803398875,
192
+ fontPhi: config.fontPhi ?? 1.3,
193
+ min: config.min ?? 0.5,
194
+ fontMin: config.fontMin ?? 0.5,
195
+ max: config.max ?? 1,
196
+ ez: config.ez ?? 142.4,
197
+ defaultIntensity: config.defaultIntensity ?? ""
198
+ };
199
+ }
200
+
201
+ // src/generator.ts
202
+ function parseClass(className) {
203
+ const match = className.match(/^(.+)-\[(\d+(?:\.\d+)?)(px|rem)\]$/);
204
+ if (!match) return null;
205
+ const [, prefix, valueStr, unit] = match;
206
+ const value = parseFloat(valueStr);
207
+ if (prefix in FONT_PROPERTY_MAP) {
208
+ const sizePx = unit === "rem" ? value * 16 : value;
209
+ return {
210
+ raw: className,
211
+ prefix,
212
+ property: FONT_PROPERTY_MAP[prefix],
213
+ size: sizePx,
214
+ unit,
215
+ type: "font"
216
+ };
217
+ }
218
+ if (prefix in PROPERTY_MAP) {
219
+ const sizePx = unit === "rem" ? value * 16 : value;
220
+ return {
221
+ raw: className,
222
+ prefix,
223
+ property: PROPERTY_MAP[prefix],
224
+ size: sizePx,
225
+ unit,
226
+ type: "spacing"
227
+ };
228
+ }
229
+ return null;
230
+ }
231
+ function generateClamp(sizePx, type, intensity, config) {
232
+ const cfg = resolveConfig({
233
+ sizes: [],
234
+ fontSizes: [],
235
+ ...config
236
+ });
237
+ if (type === "font") {
238
+ return generateFontClamp(
239
+ sizePx,
240
+ cfg.screen,
241
+ cfg.fontPhi,
242
+ cfg.fontMin,
243
+ cfg.max,
244
+ intensity ?? ""
245
+ );
246
+ }
247
+ return generateSpacingClamp(
248
+ sizePx,
249
+ cfg.screen,
250
+ cfg.phi,
251
+ cfg.min,
252
+ cfg.max,
253
+ cfg.ez,
254
+ intensity ?? ""
255
+ );
256
+ }
257
+ function generateVars(config) {
258
+ const cfg = resolveConfig(config);
259
+ const lines = [":root {"];
260
+ for (const size of cfg.sizes) {
261
+ lines.push(` /* ---- ${size}px ---- */`);
262
+ for (const intensity of SPACING_INTENSITIES) {
263
+ const clamp = generateSpacingClamp(
264
+ size,
265
+ cfg.screen,
266
+ cfg.phi,
267
+ cfg.min,
268
+ cfg.max,
269
+ cfg.ez,
270
+ intensity
271
+ );
272
+ lines.push(` --${size}${intensity}: ${clamp};`);
273
+ }
274
+ lines.push("");
275
+ }
276
+ for (const size of cfg.fontSizes) {
277
+ lines.push(` /* ---- fs-${size}px ---- */`);
278
+ for (const intensity of FONT_INTENSITIES) {
279
+ const clamp = generateFontClamp(
280
+ size,
281
+ cfg.screen,
282
+ cfg.fontPhi,
283
+ cfg.fontMin,
284
+ cfg.max,
285
+ intensity
286
+ );
287
+ lines.push(` --fs-${size}${intensity}: ${clamp};`);
288
+ }
289
+ lines.push("");
290
+ }
291
+ lines.push("}");
292
+ return lines.join("\n");
293
+ }
294
+ function escapeTwClass(prefix, value, suffix) {
295
+ return `.${prefix}-\\[${value}\\]${suffix}`;
296
+ }
297
+ function generateClassOverrides(classes, config) {
298
+ const cfg = resolveConfig({ sizes: [], fontSizes: [], ...config });
299
+ const lines = [];
300
+ for (const cls of classes) {
301
+ const parsed = parseClass(cls);
302
+ if (!parsed) continue;
303
+ const valueStr = parsed.unit === "rem" ? `${parsed.size / 16}rem` : `${parsed.size}px`;
304
+ if (parsed.type === "font") {
305
+ for (const intensity of FONT_INTENSITIES) {
306
+ const varRef = `var(--fs-${parsed.size}${intensity})`;
307
+ const selector = escapeTwClass(parsed.prefix, valueStr, intensity);
308
+ lines.push(`${selector} { ${parsed.property}: ${varRef} }`);
309
+ }
310
+ } else {
311
+ for (const intensity of SPACING_INTENSITIES) {
312
+ const varRef = `var(--${parsed.size}${intensity})`;
313
+ const selector = escapeTwClass(parsed.prefix, valueStr, intensity);
314
+ lines.push(`${selector} { ${parsed.property}: ${varRef} }`);
315
+ }
316
+ }
317
+ lines.push("");
318
+ }
319
+ return lines.join("\n");
320
+ }
321
+ function generateTheme(config) {
322
+ const cfg = resolveConfig(config);
323
+ const lines = ["@theme {"];
324
+ for (const size of cfg.sizes) {
325
+ lines.push(` --spacing-${size}: var(--${size}${cfg.defaultIntensity});`);
326
+ }
327
+ if (cfg.sizes.length > 0 && cfg.fontSizes.length > 0) {
328
+ lines.push("");
329
+ }
330
+ const fontSuffix = cfg.defaultIntensity === "-" ? "" : cfg.defaultIntensity;
331
+ for (const size of cfg.fontSizes) {
332
+ lines.push(` --font-size-${size}: var(--fs-${size}${fontSuffix});`);
333
+ }
334
+ lines.push("}");
335
+ return lines.join("\n");
336
+ }
337
+ function generateBridge(config) {
338
+ const sections = [
339
+ "/* =============================================================",
340
+ " EVA CSS \u2014 Tailwind Fluid Bridge",
341
+ " Generated by eva-css-for-tailwind",
342
+ " ============================================================= */",
343
+ "",
344
+ generateVars(config)
345
+ ];
346
+ if (!config.classes) {
347
+ sections.push("");
348
+ sections.push(generateTheme(config));
349
+ }
350
+ if (config.classes && config.classes.length > 0) {
351
+ sections.push("");
352
+ sections.push(generateClassOverrides(config.classes, config));
353
+ }
354
+ return sections.join("\n");
355
+ }
356
+ // Annotate the CommonJS export names for ESM import in node:
357
+ 0 && (module.exports = {
358
+ FONT_INTENSITIES,
359
+ FONT_PROPERTY_MAP,
360
+ PROPERTY_MAP,
361
+ SPACING_INTENSITIES,
362
+ generateBridge,
363
+ generateClamp,
364
+ generateClassOverrides,
365
+ generateTheme,
366
+ generateVars,
367
+ parseClass,
368
+ resolveConfig
369
+ });