Skip to content

Commit 729efab

Browse files
committed
Round to tailwind values.
1 parent 71a8d8d commit 729efab

File tree

5 files changed

+115
-126
lines changed

5 files changed

+115
-126
lines changed

packages/backend/src/tailwind/builderImpl/tailwindBorder.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,16 @@ export const tailwindBorderRadius = (node: SceneNode): string => {
5858
}
5959

6060
const getRadius = (radius: number) => {
61-
if (radius > 24) {
62-
// special case. If height is 90 and cornerRadius is 45, it is full.
63-
return `-[${sliceNum(radius)}px]`;
64-
} else {
65-
return pxToBorderRadius(radius);
61+
// if (radius > 24) {
62+
// // special case. If height is 90 and cornerRadius is 45, it is full.
63+
// return `[${sliceNum(radius)}px]`;
64+
// } else {
65+
const r = pxToBorderRadius(radius);
66+
if (r) {
67+
return `-${r}`;
6668
}
69+
return "";
70+
// }
6771
};
6872

6973
const radius = getCommonRadius(node);

packages/backend/src/tailwind/conversionTables.ts

Lines changed: 81 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { sliceNum } from "../common/numToAutoFixed";
2+
import { localTailwindSettings } from "./tailwindMain";
23

34
export const nearestValue = (goal: number, array: Array<number>): number => {
45
return array.reduce((prev, curr) => {
@@ -27,65 +28,36 @@ export const exactValue = (
2728
* Therefore, a conversion is necessary. Rem = Pixel / 16.abs
2829
* Then, find in the corresponding table the closest value.
2930
*/
30-
const pixelToTailwindValue = (
31+
const pxToRemToTailwind = (
3132
value: number,
3233
conversionMap: Record<number, string>
3334
): string => {
34-
return conversionMap[
35-
nearestValue(
36-
value / 16,
37-
Object.keys(conversionMap).map((d) => +d)
38-
)
39-
];
40-
};
35+
const keys = Object.keys(conversionMap).map((d) => +d);
36+
const convertedValue = exactValue(value / 16, keys);
4137

42-
const pixelToTailwindRemExact = (
43-
value: number,
44-
conversionMap: Record<number, string>
45-
): string | null => {
46-
const exactValueFound = Object.entries(conversionMap).find(
47-
([_, remValue]) => +remValue === value
48-
);
38+
if (convertedValue) {
39+
return conversionMap[convertedValue];
40+
} else if (localTailwindSettings.roundTailwind) {
41+
return conversionMap[nearestValue(value / 16, keys)];
42+
}
4943

50-
return exactValueFound ? exactValueFound[0] : null;
44+
return `[${sliceNum(value)}px]`;
5145
};
5246

53-
const pixelToTailwindPxExact = (
47+
const pxToTailwind = (
5448
value: number,
5549
conversionMap: Record<number, string>
5650
): string | null => {
57-
const convertedValue = exactValue(
58-
value,
59-
Object.keys(conversionMap).map((d) => +d)
60-
);
51+
const keys = Object.keys(conversionMap).map((d) => +d);
52+
const convertedValue = exactValue(value, keys);
6153

62-
if (!convertedValue) {
63-
return null;
54+
if (convertedValue) {
55+
return conversionMap[convertedValue];
56+
} else if (localTailwindSettings.roundTailwind) {
57+
return conversionMap[nearestValue(value, keys)];
6458
}
6559

66-
return conversionMap[convertedValue];
67-
};
68-
69-
const mapLetterSpacing: Record<number, string> = {
70-
"-0.05": "tighter",
71-
"-0.025": "tight",
72-
// 0: "normal",
73-
0.025: "wide",
74-
0.05: "wider",
75-
0.1: "widest",
76-
};
77-
78-
const mapLineHeight: Record<number, string> = {
79-
0.75: "3",
80-
1: "none",
81-
1.25: "tight",
82-
1.375: "snug",
83-
1.5: "normal",
84-
1.625: "relaxed",
85-
2: "loose",
86-
1.75: "7",
87-
2.25: "9",
88-
2.5: "10",
60+
return `[${sliceNum(value)}px]`;
8961
};
9062

9163
const mapFontSize: Record<number, string> = {
@@ -129,40 +101,41 @@ const mapBlur: Record<number, string> = {
129101
};
130102

131103
const mapWidthHeightSize: Record<number, string> = {
132-
// 0: "0",
133-
0.5: "2",
134-
1: "4",
135-
1.5: "6",
136-
2: "8",
137-
2.5: "10",
138-
3: "12",
139-
3.5: "14",
140-
4: "16",
141-
5: "20",
142-
6: "24",
143-
7: "28",
144-
8: "32",
145-
9: "36",
146-
10: "40",
147-
11: "44",
148-
12: "48",
149-
14: "56",
150-
16: "64",
151-
20: "80",
152-
24: "96",
153-
28: "112",
154-
32: "128",
155-
36: "144",
156-
40: "160",
157-
44: "176",
158-
48: "192",
159-
52: "208",
160-
56: "224",
161-
60: "240",
162-
64: "256",
163-
72: "288",
164-
80: "320",
165-
96: "384",
104+
// '0: 0',
105+
1: "px",
106+
2: "0.5",
107+
4: "1",
108+
6: "1.5",
109+
8: "2",
110+
10: "2.5",
111+
12: "3",
112+
14: "3.5",
113+
16: "4",
114+
20: "5",
115+
24: "6",
116+
28: "7",
117+
32: "8",
118+
36: "9",
119+
40: "10",
120+
44: "11",
121+
48: "12",
122+
56: "14",
123+
64: "16",
124+
80: "20",
125+
96: "24",
126+
112: "28",
127+
128: "32",
128+
144: "36",
129+
160: "40",
130+
176: "44",
131+
192: "48",
132+
208: "52",
133+
224: "56",
134+
240: "60",
135+
256: "64",
136+
288: "72",
137+
320: "80",
138+
384: "96",
166139
};
167140

168141
export const opacityValues = [
@@ -172,23 +145,45 @@ export const opacityValues = [
172145
export const nearestOpacity = (nodeOpacity: number): number =>
173146
nearestValue(nodeOpacity * 100, opacityValues);
174147

148+
const mapLetterSpacing: Record<number, string> = {
149+
"-0.05": "tighter",
150+
"-0.025": "tight",
151+
// 0: "normal",
152+
0.025: "wide",
153+
0.05: "wider",
154+
0.1: "widest",
155+
};
156+
175157
export const pxToLetterSpacing = (value: number): string =>
176-
pixelToTailwindValue(value, mapLetterSpacing);
158+
pxToRemToTailwind(value, mapLetterSpacing);
159+
160+
const mapLineHeight: Record<number, string> = {
161+
0.75: "3",
162+
1: "none",
163+
1.25: "tight",
164+
1.375: "snug",
165+
1.5: "normal",
166+
1.625: "relaxed",
167+
2: "loose",
168+
1.75: "7",
169+
2.25: "9",
170+
2.5: "10",
171+
};
177172

178173
export const pxToLineHeight = (value: number): string =>
179-
pixelToTailwindValue(value, mapLineHeight);
174+
pxToRemToTailwind(value, mapLineHeight);
180175

181176
export const pxToFontSize = (value: number): string =>
182-
pixelToTailwindValue(value, mapFontSize);
177+
pxToRemToTailwind(value, mapFontSize);
183178

184179
export const pxToBorderRadius = (value: number): string =>
185-
pixelToTailwindValue(value, mapBorderRadius);
180+
pxToRemToTailwind(value, mapBorderRadius);
186181

187182
export const pxToBlur = (value: number): string | null =>
188-
pixelToTailwindPxExact(value, mapBlur);
183+
pxToTailwind(value, mapBlur);
189184

190185
export const pxToLayoutSize = (value: number): string => {
191-
const tailwindValue = pixelToTailwindRemExact(value, mapWidthHeightSize);
186+
const tailwindValue = pxToTailwind(value, mapWidthHeightSize);
192187
if (tailwindValue) {
193188
return tailwindValue;
194189
}

packages/backend/src/tailwind/tailwindMain.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { PluginSettings } from "../code";
77
import { tailwindAutoLayoutProps } from "./builderImpl/tailwindAutoLayout";
88
import { commonSortChildrenWhenInferredAutoLayout } from "../common/commonChildrenOrder";
99

10-
let localSettings: PluginSettings;
10+
export let localTailwindSettings: PluginSettings;
1111

1212
let previousExecutionCache: { style: string; text: string }[];
1313

@@ -17,10 +17,10 @@ export const tailwindMain = (
1717
sceneNode: Array<SceneNode>,
1818
settings: PluginSettings
1919
): string => {
20-
localSettings = settings;
20+
localTailwindSettings = settings;
2121
previousExecutionCache = [];
2222

23-
let result = tailwindWidgetGenerator(sceneNode, localSettings.jsx);
23+
let result = tailwindWidgetGenerator(sceneNode, localTailwindSettings.jsx);
2424

2525
// remove the initial \n that is made in Container.
2626
if (result.length > 0 && result.startsWith("\n")) {
@@ -82,7 +82,7 @@ const tailwindGroup = (node: GroupNode, isJsx: boolean = false): string => {
8282

8383
const vectorIfExists = tailwindVector(
8484
node,
85-
localSettings.layerName,
85+
localTailwindSettings.layerName,
8686
"",
8787
isJsx
8888
);
@@ -91,12 +91,12 @@ const tailwindGroup = (node: GroupNode, isJsx: boolean = false): string => {
9191
// this needs to be called after CustomNode because widthHeight depends on it
9292
const builder = new TailwindDefaultBuilder(
9393
node,
94-
localSettings.layerName,
94+
localTailwindSettings.layerName,
9595
isJsx
9696
)
9797
.blend(node)
98-
.size(node, localSettings.optimizeLayout)
99-
.position(node, localSettings.optimizeLayout);
98+
.size(node, localTailwindSettings.optimizeLayout)
99+
.position(node, localTailwindSettings.optimizeLayout);
100100

101101
if (builder.attributes || builder.style) {
102102
const attr = builder.build("");
@@ -112,10 +112,10 @@ const tailwindGroup = (node: GroupNode, isJsx: boolean = false): string => {
112112
export const tailwindText = (node: TextNode, isJsx: boolean): string => {
113113
let layoutBuilder = new TailwindTextBuilder(
114114
node,
115-
localSettings.layerName,
115+
localTailwindSettings.layerName,
116116
isJsx
117117
)
118-
.commonPositionStyles(node, localSettings.optimizeLayout)
118+
.commonPositionStyles(node, localTailwindSettings.optimizeLayout)
119119
.textAlign(node);
120120

121121
const styledHtml = layoutBuilder.getTextSegments(node.id);
@@ -141,7 +141,7 @@ const tailwindFrame = (
141141
const childrenStr = tailwindWidgetGenerator(
142142
commonSortChildrenWhenInferredAutoLayout(
143143
node,
144-
localSettings.optimizeLayout
144+
localTailwindSettings.optimizeLayout
145145
),
146146
isJsx
147147
);
@@ -150,7 +150,7 @@ const tailwindFrame = (
150150
const rowColumn = tailwindAutoLayoutProps(node, node);
151151
return tailwindContainer(node, childrenStr, rowColumn, isJsx);
152152
} else {
153-
if (localSettings.optimizeLayout && node.inferredAutoLayout !== null) {
153+
if (localTailwindSettings.optimizeLayout && node.inferredAutoLayout !== null) {
154154
const rowColumn = tailwindAutoLayoutProps(node, node.inferredAutoLayout);
155155
return tailwindContainer(node, childrenStr, rowColumn, isJsx);
156156
}
@@ -181,8 +181,8 @@ export const tailwindContainer = (
181181
return children;
182182
}
183183

184-
let builder = new TailwindDefaultBuilder(node, localSettings.layerName, isJsx)
185-
.commonPositionStyles(node, localSettings.optimizeLayout)
184+
let builder = new TailwindDefaultBuilder(node, localTailwindSettings.layerName, isJsx)
185+
.commonPositionStyles(node, localTailwindSettings.optimizeLayout)
186186
.commonShapeStyles(node);
187187

188188
if (builder.attributes || additionalAttr) {
@@ -221,10 +221,10 @@ export const tailwindContainer = (
221221
export const tailwindLine = (node: LineNode, isJsx: boolean): string => {
222222
const builder = new TailwindDefaultBuilder(
223223
node,
224-
localSettings.layerName,
224+
localTailwindSettings.layerName,
225225
isJsx
226226
)
227-
.commonPositionStyles(node, localSettings.optimizeLayout)
227+
.commonPositionStyles(node, localTailwindSettings.optimizeLayout)
228228
.commonShapeStyles(node);
229229

230230
return `\n<div${builder.build()}></div>`;
@@ -234,11 +234,11 @@ export const tailwindSection = (node: SectionNode, isJsx: boolean): string => {
234234
const childrenStr = tailwindWidgetGenerator(node.children, isJsx);
235235
const builder = new TailwindDefaultBuilder(
236236
node,
237-
localSettings.layerName,
237+
localTailwindSettings.layerName,
238238
isJsx
239239
)
240-
.size(node, localSettings.optimizeLayout)
241-
.position(node, localSettings.optimizeLayout)
240+
.size(node, localTailwindSettings.optimizeLayout)
241+
.position(node, localTailwindSettings.optimizeLayout)
242242
.customColor(node.fills, "bg");
243243

244244
if (childrenStr) {

packages/backend/src/tailwind/tailwindTextBuilder.ts

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,11 @@ import {
44
commonLineHeight,
55
} from "../common/commonTextHeightSpacing";
66
import { tailwindColorFromFills } from "./builderImpl/tailwindColor";
7-
import { pxToLetterSpacing, pxToLineHeight } from "./conversionTables";
7+
import {
8+
pxToFontSize,
9+
pxToLetterSpacing,
10+
pxToLineHeight,
11+
} from "./conversionTables";
812
import { TailwindDefaultBuilder } from "./tailwindDefaultBuilder";
913

1014
export class TailwindTextBuilder extends TailwindDefaultBuilder {
@@ -55,22 +59,8 @@ export class TailwindTextBuilder extends TailwindDefaultBuilder {
5559
return tailwindColorFromFills(fills, "text");
5660
};
5761

58-
getTailwindLetterSpacingStyle = (letterSpacing: any) => {
59-
// Convert letterSpacing to the appropriate Tailwind CSS class.
60-
// This can be based on your project's configuration and letterSpacing scale.
61-
// For example, suppose your project uses the default Tailwind CSS letterSpacing scale:
62-
if (letterSpacing.unit === "PIXELS") {
63-
return `tracking-${letterSpacing.value}px`;
64-
} else {
65-
return `tracking-${letterSpacing.value * 100}%`;
66-
}
67-
};
68-
6962
fontSize = (fontSize: number) => {
70-
// Convert fontSize to the appropriate Tailwind CSS class.
71-
// This can be based on your project's configuration and fontSize scale.
72-
// For example, suppose your project uses the default Tailwind CSS fontSize scale:
73-
return `text-[${fontSize}px]`;
63+
return `text-${pxToFontSize(fontSize)}`;
7464
};
7565

7666
fontWeight = (fontWeight: number): string => {

0 commit comments

Comments
 (0)