From 41619321d9256782706645b1aac8f8c986d01999 Mon Sep 17 00:00:00 2001 From: xufeng Date: Sun, 10 Apr 2022 20:47:53 +0800 Subject: [PATCH] feat: add use recongize feat --- manifest.json | 3 +- public/code.js | 5596 +++++++++++++++++++++++++ public/code.js.map | 1 + public/index.html | 7628 ++++++++++++++++++++++++++++++++++ src/code.ts | 7 +- src/common/recognizeUI.ts | 50 + src/common/traversalUtils.ts | 62 + src/tailwind/tailwindMain.ts | 52 +- src/ui/ScreenTailwind.svelte | 11 +- 9 files changed, 13390 insertions(+), 20 deletions(-) create mode 100644 public/code.js create mode 100644 public/code.js.map create mode 100644 public/index.html create mode 100644 src/common/recognizeUI.ts create mode 100644 src/common/traversalUtils.ts diff --git a/manifest.json b/manifest.json index 0a36d6fa..6aa299bc 100644 --- a/manifest.json +++ b/manifest.json @@ -3,5 +3,6 @@ "id": "842128343887142055", "api": "1.0.0", "main": "public/code.js", - "ui": "public/index.html" + "ui": "public/index.html", + "editorType":["figma"] } diff --git a/public/code.js b/public/code.js new file mode 100644 index 00000000..11c169f7 --- /dev/null +++ b/public/code.js @@ -0,0 +1,5596 @@ +'use strict'; + +const nearestValue = (goal, array) => { + return array.reduce(function (prev, curr) { + return Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev; + }); +}; +/** + * convert pixel values to Tailwind attributes. + * by default, Tailwind uses rem, while Figma uses px. + * Therefore, a conversion is necessary. Rem = Pixel / 16.abs + * Then, find in the corresponding table the closest value. + */ +const pixelToTailwindValue = (value, conversionMap) => { + return conversionMap[nearestValue(value / 16, Object.keys(conversionMap).map((d) => +d))]; +}; +const mapLetterSpacing = { + "-0.05": "tighter", + "-0.025": "tight", + // 0: "normal", + 0.025: "wide", + 0.05: "wider", + 0.1: "widest", +}; +const mapLineHeight = { + 0.75: "3", + 1: "none", + 1.25: "tight", + 1.375: "snug", + 1.5: "normal", + 1.625: "relaxed", + 2: "loose", + 1.75: "7", + 2.25: "9", + 2.5: "10", +}; +const mapFontSize = { + 0.75: "xs", + 0.875: "sm", + 1: "base", + 1.125: "lg", + 1.25: "xl", + 1.5: "2xl", + 1.875: "3xl", + 2.25: "4xl", + 3: "5xl", + 3.75: "6xl", + 4.5: "7xl", + 6: "8xl", + 8: "9xl", +}; +const mapBorderRadius = { + // 0: "none", + 0.125: "-sm", + 0.25: "", + 0.375: "-md", + 0.5: "-lg", + 0.75: "-xl", + 1.0: "-2xl", + 1.5: "-3xl", + 10: "-full", +}; +const mapWidthHeightSize = { + // 0: "0", + 0.125: "0.5", + 0.25: "1", + 0.375: "1.5", + 0.5: "2", + 0.625: "2.5", + 0.75: "3", + 0.875: "3.5", + 1: "4", + 1.25: "5", + 1.5: "6", + 1.75: "7", + 2: "8", + 2.25: "9", + 2.5: "10", + 2.75: "11", + 3: "12", + 3.5: "14", + 4: "16", + 5: "20", + 6: "24", + 7: "28", + 8: "32", + 9: "36", + 10: "40", + 11: "44", + 12: "48", + 13: "52", + 14: "56", + 15: "60", + 16: "64", + 18: "72", + 20: "80", + 24: "96", +}; +const opacityValues = [ + 0, + 5, + 10, + 20, + 25, + 30, + 40, + 50, + 60, + 70, + 75, + 80, + 90, + 95, +]; +const nearestOpacity = (nodeOpacity) => nearestValue(nodeOpacity * 100, opacityValues); +const pxToLetterSpacing = (value) => pixelToTailwindValue(value, mapLetterSpacing); +const pxToLineHeight = (value) => pixelToTailwindValue(value, mapLineHeight); +const pxToFontSize = (value) => pixelToTailwindValue(value, mapFontSize); +const pxToBorderRadius = (value) => pixelToTailwindValue(value, mapBorderRadius); +const pxToLayoutSize = (value) => pixelToTailwindValue(value, mapWidthHeightSize); + +// https://github.com/dtao/nearest-color converted to ESM and Typescript +// It was sligtly modified to support Typescript better. +// It was also slighly simplified because many parts weren't being used. +/** + * Defines an available color. + * + * @typedef {Object} ColorSpec + * @property {string=} name A name for the color, e.g., 'red' + * @property {string} source The hex-based color string, e.g., '#FF0' + * @property {RGB} rgb The {@link RGB} color values + */ +/** + * Describes a matched color. + * + * @typedef {Object} ColorMatch + * @property {string} name The name of the matched color, e.g., 'red' + * @property {string} value The hex-based color string, e.g., '#FF0' + * @property {RGB} rgb The {@link RGB} color values. + */ +/** + * Provides the RGB breakdown of a color. + * + * @typedef {Object} RGB + * @property {number} r The red component, from 0 to 255 + * @property {number} g The green component, from 0 to 255 + * @property {number} b The blue component, from 0 to 255 + */ +/** + * Gets the nearest color, from the given list of {@link ColorSpec} objects + * (which defaults to {@link nearestColor.DEFAULT_COLORS}). + * + * Probably you wouldn't call this method directly. Instead you'd get a custom + * color matcher by calling {@link nearestColor.from}. + * + * @public + * @param {RGB|string} needle Either an {@link RGB} color or a hex-based + * string representing one, e.g., '#FF0' + * @param {Array.=} colors An optional list of available colors + * (defaults to {@link nearestColor.DEFAULT_COLORS}) + * @return {ColorMatch|string} If the colors in the provided list had names, + * then a {@link ColorMatch} object with the name and (hex) value of the + * nearest color from the list. Otherwise, simply the hex value. + * + * @example + * nearestColor({ r: 200, g: 50, b: 50 }); // => '#f00' + * nearestColor('#f11'); // => '#f00' + * nearestColor('#f88'); // => '#f80' + * nearestColor('#ffe'); // => '#ff0' + * nearestColor('#efe'); // => '#ff0' + * nearestColor('#abc'); // => '#808' + * nearestColor('red'); // => '#f00' + * nearestColor('foo'); // => throws + */ +function nearestColor(needle, colors) { + needle = parseColor(needle); + let distanceSq, minDistanceSq = Infinity, rgb, value; + for (let i = 0; i < colors.length; ++i) { + rgb = colors[i].rgb; + distanceSq = + Math.pow(needle.r - rgb.r, 2) + + Math.pow(needle.g - rgb.g, 2) + + Math.pow(needle.b - rgb.b, 2); + if (distanceSq < minDistanceSq) { + minDistanceSq = distanceSq; + value = colors[i]; + } + } + // @ts-ignore this is always not null + return value.source; +} +/** + * Given either an array or object of colors, returns an array of + * {@link ColorSpec} objects (with {@link RGB} values). + * + * @private + * @param {Array.|Object} colors An array of hex-based color strings, or + * an object mapping color *names* to hex values. + * @return {Array.} An array of {@link ColorSpec} objects + * representing the same colors passed in. + */ +function mapColors(colors) { + return colors.map((color) => createColorSpec(color)); +} +/** + * Provides a matcher to find the nearest color based on the provided list of + * available colors. + * + * @public + * @param {Array.|Object} availableColors An array of hex-based color + * strings, or an object mapping color *names* to hex values. + * @return {function(string):ColorMatch|string} A function with the same + * behavior as {@link nearestColor}, but with the list of colors + * predefined. + * + * @example + * var colors = { + * 'maroon': '#800', + * 'light yellow': { r: 255, g: 255, b: 51 }, + * 'pale blue': '#def', + * 'white': 'fff' + * }; + * + * var bgColors = [ + * '#eee', + * '#444' + * ]; + * + * var invalidColors = { + * 'invalid': 'foo' + * }; + * + * var getColor = nearestColor.from(colors); + * var getBGColor = getColor.from(bgColors); + * var getAnyColor = nearestColor.from(colors).or(bgColors); + * + * getColor('ffe'); + * // => { name: 'white', value: 'fff', rgb: { r: 255, g: 255, b: 255 }, distance: 17} + * + * getColor('#f00'); + * // => { name: 'maroon', value: '#800', rgb: { r: 136, g: 0, b: 0 }, distance: 119} + * + * getColor('#ff0'); + * // => { name: 'light yellow', value: '#ffff33', rgb: { r: 255, g: 255, b: 51 }, distance: 51} + * + * getBGColor('#fff'); // => '#eee' + * getBGColor('#000'); // => '#444' + * + * getAnyColor('#f00'); + * // => { name: 'maroon', value: '#800', rgb: { r: 136, g: 0, b: 0 }, distance: 119} + * + * getAnyColor('#888'); // => '#444' + * + * nearestColor.from(invalidColors); // => throws + */ +const nearestColorFrom = (availableColors) => { + const colors = mapColors(availableColors); + return (hex) => nearestColor(hex, colors); +}; +/** + * Parses a color from a string. + * + * @private + * @param {RGB|string} source + * @return {RGB} + * + * @example + * parseColor({ r: 3, g: 22, b: 111 }); // => { r: 3, g: 22, b: 111 } + * parseColor('#f00'); // => { r: 255, g: 0, b: 0 } + * parseColor('#04fbc8'); // => { r: 4, g: 251, b: 200 } + * parseColor('#FF0'); // => { r: 255, g: 255, b: 0 } + * parseColor('rgb(3, 10, 100)'); // => { r: 3, g: 10, b: 100 } + * parseColor('rgb(50%, 0%, 50%)'); // => { r: 128, g: 0, b: 128 } + * parseColor('aqua'); // => { r: 0, g: 255, b: 255 } + * parseColor('fff'); // => { r: 255, g: 255, b: 255 } + * parseColor('foo'); // => throws + */ +function parseColor(source) { + let red, green, blue; + if (typeof source === "object") { + return source; + } + let hexMatchArr = source.match(/^#?((?:[0-9a-f]{3}){1,2})$/i); + if (hexMatchArr) { + const hexMatch = hexMatchArr[1]; + if (hexMatch.length === 3) { + hexMatchArr = [ + hexMatch.charAt(0) + hexMatch.charAt(0), + hexMatch.charAt(1) + hexMatch.charAt(1), + hexMatch.charAt(2) + hexMatch.charAt(2), + ]; + } + else { + hexMatchArr = [ + hexMatch.substring(0, 2), + hexMatch.substring(2, 4), + hexMatch.substring(4, 6), + ]; + } + red = parseInt(hexMatchArr[0], 16); + green = parseInt(hexMatchArr[1], 16); + blue = parseInt(hexMatchArr[2], 16); + return { r: red, g: green, b: blue }; + } + throw Error('"' + source + '" is not a valid color'); +} +// export function createColorSpec(input: string | RGB, name: string): ColorSpec; +// // it can actually return a ColorMatch, but let's ignore that for simplicity +// // in this app, it is never going to return ColorMatch because the input is hex instead of red +// export function from( +// availableColors: Array | Object +// ): (attr: string) => string; +/** + * Creates a {@link ColorSpec} from either a string or an {@link RGB}. + * + * @private + * @param {string|RGB} input + * @param {string=} name + * @return {ColorSpec} + * + * @example + * createColorSpec('#800'); // => { + * source: '#800', + * rgb: { r: 136, g: 0, b: 0 } + * } + * + * createColorSpec('#800', 'maroon'); // => { + * name: 'maroon', + * source: '#800', + * rgb: { r: 136, g: 0, b: 0 } + * } + */ +function createColorSpec(input) { + return { + source: input, + rgb: parseColor(input), + }; +} + +/** + * Retrieve the first visible color that is being used by the layer, in case there are more than one. + */ +const retrieveTopFill = (fills) => { + if (fills && fills !== figma.mixed && fills.length > 0) { + // on Figma, the top layer is always at the last position + // reverse, then try to find the first layer that is visible, if any. + return [...fills].reverse().find((d) => d.visible !== false); + } +}; + +const rgbTo6hex = (color) => { + const hex = ((color.r * 255) | (1 << 8)).toString(16).slice(1) + + ((color.g * 255) | (1 << 8)).toString(16).slice(1) + + ((color.b * 255) | (1 << 8)).toString(16).slice(1); + return hex; +}; +const rgbTo8hex = (color, alpha) => { + // when color is RGBA, alpha is set automatically + // when color is RGB, alpha need to be set manually (default: 1.0) + const hex = ((alpha * 255) | (1 << 8)).toString(16).slice(1) + + ((color.r * 255) | (1 << 8)).toString(16).slice(1) + + ((color.g * 255) | (1 << 8)).toString(16).slice(1) + + ((color.b * 255) | (1 << 8)).toString(16).slice(1); + return hex; +}; +const gradientAngle = (fill) => { + // Thanks Gleb and Liam for helping! + const decomposed = decomposeRelativeTransform(fill.gradientTransform[0], fill.gradientTransform[1]); + return (decomposed.rotation * 180) / Math.PI; +}; +// from https://math.stackexchange.com/a/2888105 +const decomposeRelativeTransform = (t1, t2) => { + const a = t1[0]; + const b = t1[1]; + const c = t1[2]; + const d = t2[0]; + const e = t2[1]; + const f = t2[2]; + const delta = a * d - b * c; + const result = { + translation: [e, f], + rotation: 0, + scale: [0, 0], + skew: [0, 0], + }; + // Apply the QR-like decomposition. + if (a !== 0 || b !== 0) { + const r = Math.sqrt(a * a + b * b); + result.rotation = b > 0 ? Math.acos(a / r) : -Math.acos(a / r); + result.scale = [r, delta / r]; + result.skew = [Math.atan((a * c + b * d) / (r * r)), 0]; + } + // these are not currently being used. + // else if (c != 0 || d != 0) { + // const s = Math.sqrt(c * c + d * d); + // result.rotation = + // Math.PI / 2 - (d > 0 ? Math.acos(-c / s) : -Math.acos(c / s)); + // result.scale = [delta / s, s]; + // result.skew = [0, Math.atan((a * c + b * d) / (s * s))]; + // } else { + // // a = b = c = d = 0 + // } + return result; +}; + +// retrieve the SOLID color for tailwind +const tailwindColorFromFills = (fills, kind) => { + // kind can be text, bg, border... + // [when testing] fills can be undefined + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + // don't set text color when color is black (default) and opacity is 100% + return tailwindSolidColor(fill, kind); + } + return ""; +}; +const tailwindSolidColor = (fill, kind) => { + var _a; + // don't set text color when color is black (default) and opacity is 100% + if (kind === "text" && + fill.color.r === 0.0 && + fill.color.g === 0.0 && + fill.color.b === 0.0 && + fill.opacity === 1.0) { + return ""; + } + const opacity = (_a = fill.opacity) !== null && _a !== void 0 ? _a : 1.0; + // example: text-opacity-50 + // ignore the 100. If opacity was changed, let it be visible. + const opacityProp = opacity !== 1.0 ? `${kind}-opacity-${nearestOpacity(opacity)} ` : ""; + // example: text-red-500 + const colorProp = `${kind}-${getTailwindFromFigmaRGB(fill.color)} `; + // if fill isn't visible, it shouldn't be painted. + return `${colorProp}${opacityProp}`; +}; +/** + * https://tailwindcss.com/docs/box-shadow/ + * example: shadow + */ +const tailwindGradientFromFills = (fills) => { + // [when testing] node.effects can be undefined + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "GRADIENT_LINEAR") { + return tailwindGradient(fill); + } + return ""; +}; +const tailwindGradient = (fill) => { + const direction = gradientDirection$2(gradientAngle(fill)); + if (fill.gradientStops.length === 1) { + const fromColor = getTailwindFromFigmaRGB(fill.gradientStops[0].color); + return `${direction} from-${fromColor} `; + } + else if (fill.gradientStops.length === 2) { + const fromColor = getTailwindFromFigmaRGB(fill.gradientStops[0].color); + const toColor = getTailwindFromFigmaRGB(fill.gradientStops[1].color); + return `${direction} from-${fromColor} to-${toColor} `; + } + else { + const fromColor = getTailwindFromFigmaRGB(fill.gradientStops[0].color); + // middle (second color) + const viaColor = getTailwindFromFigmaRGB(fill.gradientStops[1].color); + // last + const toColor = getTailwindFromFigmaRGB(fill.gradientStops[fill.gradientStops.length - 1].color); + return `${direction} from-${fromColor} via-${viaColor} to-${toColor} `; + } +}; +const gradientDirection$2 = (angle) => { + switch (nearestValue(angle, [-180, -135, -90, -45, 0, 45, 90, 135, 180])) { + case 0: + return "bg-gradient-to-r"; + case 45: + return "bg-gradient-to-br"; + case 90: + return "bg-gradient-to-b"; + case 135: + return "bg-gradient-to-bl"; + case -45: + return "bg-gradient-to-tr"; + case -90: + return "bg-gradient-to-t"; + case -135: + return "bg-gradient-to-tl"; + default: + // 180 and -180 + return "bg-gradient-to-l"; + } +}; +// Basic Tailwind Colors +const tailwindColors = { + "#000000": "black", + "#ffffff": "white", + "#fdf2f8": "pink-50", + "#fce7f3": "pink-100", + "#fbcfe8": "pink-200", + "#f9a8d4": "pink-300", + "#f472b6": "pink-400", + "#ec4899": "pink-500", + "#db2777": "pink-600", + "#be185d": "pink-700", + "#9d174d": "pink-800", + "#831843": "pink-900", + "#f5f3ff": "purple-50", + "#ede9fe": "purple-100", + "#ddd6fe": "purple-200", + "#c4b5fd": "purple-300", + "#a78bfa": "purple-400", + "#8b5cf6": "purple-500", + "#7c3aed": "purple-600", + "#6d28d9": "purple-700", + "#5b21b6": "purple-800", + "#4c1d95": "purple-900", + "#eef2ff": "indigo-50", + "#e0e7ff": "indigo-100", + "#c7d2fe": "indigo-200", + "#a5b4fc": "indigo-300", + "#818cf8": "indigo-400", + "#6366f1": "indigo-500", + "#4f46e5": "indigo-600", + "#4338ca": "indigo-700", + "#3730a3": "indigo-800", + "#312e81": "indigo-900", + "#eff6ff": "blue-50", + "#dbeafe": "blue-100", + "#bfdbfe": "blue-200", + "#93c5fd": "blue-300", + "#60a5fa": "blue-400", + "#3b82f6": "blue-500", + "#2563eb": "blue-600", + "#1d4ed8": "blue-700", + "#1e40af": "blue-800", + "#1e3a8a": "blue-900", + "#ecfdf5": "green-50", + "#d1fae5": "green-100", + "#a7f3d0": "green-200", + "#6ee7b7": "green-300", + "#34d399": "green-400", + "#10b981": "green-500", + "#059669": "green-600", + "#047857": "green-700", + "#065f46": "green-800", + "#064e3b": "green-900", + "#fffbeb": "yellow-50", + "#fef3c7": "yellow-100", + "#fde68a": "yellow-200", + "#fcd34d": "yellow-300", + "#fbbf24": "yellow-400", + "#f59e0b": "yellow-500", + "#d97706": "yellow-600", + "#b45309": "yellow-700", + "#92400e": "yellow-800", + "#78350f": "yellow-900", + "#fef2f2": "red-50", + "#fee2e2": "red-100", + "#fecaca": "red-200", + "#fca5a5": "red-300", + "#f87171": "red-400", + "#ef4444": "red-500", + "#dc2626": "red-600", + "#b91c1c": "red-700", + "#991b1b": "red-800", + "#7f1d1d": "red-900", + "#f9fafb": "gray-50", + "#f3f4f6": "gray-100", + "#e5e7eb": "gray-200", + "#d1d5db": "gray-300", + "#9ca3af": "gray-400", + "#6b7280": "gray-500", + "#4b5563": "gray-600", + "#374151": "gray-700", + "#1f2937": "gray-800", + "#111827": "gray-900", +}; +const tailwindNearestColor = nearestColorFrom(Object.keys(tailwindColors)); +// figma uses r,g,b in [0, 1], while nearestColor uses it in [0, 255] +const getTailwindFromFigmaRGB = (color) => { + const colorMultiplied = { + r: color.r * 255, + g: color.g * 255, + b: color.b * 255, + }; + return tailwindColors[tailwindNearestColor(colorMultiplied)]; +}; + +const commonLineHeight = (node) => { + if (node.lineHeight !== figma.mixed && + node.lineHeight.unit !== "AUTO" && + Math.round(node.lineHeight.value) !== 0) { + if (node.lineHeight.unit === "PIXELS") { + return node.lineHeight.value; + } + else { + if (node.fontSize !== figma.mixed) { + // based on tests, using Inter font with varied sizes and weights, this works. + // example: 24 * 20 / 100 = 4.8px, which is correct visually. + return (node.fontSize * node.lineHeight.value) / 100; + } + } + } + return 0; +}; +const commonLetterSpacing = (node) => { + if (node.letterSpacing !== figma.mixed && + Math.round(node.letterSpacing.value) !== 0) { + if (node.letterSpacing.unit === "PIXELS") { + return node.letterSpacing.value; + } + else { + if (node.fontSize !== figma.mixed) { + // read [commonLineHeight] comment to understand what is going on here. + return (node.fontSize * node.letterSpacing.value) / 100; + } + } + } + return 0; +}; + +/** + * https://tailwindcss.com/docs/box-shadow/ + * example: shadow + */ +const tailwindShadow = (node) => { + // [when testing] node.effects can be undefined + if (node.effects && node.effects.length > 0) { + const dropShadow = node.effects.filter((d) => d.type === "DROP_SHADOW" && d.visible !== false); + let boxShadow = ""; + // simple shadow from tailwind + if (dropShadow.length > 0) { + boxShadow = "shadow "; + } + const innerShadow = node.effects.filter((d) => d.type === "INNER_SHADOW") + .length > 0 + ? "shadow-inner " + : ""; + return boxShadow + innerShadow; + // todo customize the shadow + // TODO layer blur, shadow-outline + } + return ""; +}; + +/** + * https://tailwindcss.com/docs/opacity/ + * default is [0, 25, 50, 75, 100], but '100' will be ignored: + * if opacity was changed, let it be visible. Therefore, 98% => 75 + * node.opacity is between [0, 1]; output will be [0, 100] + */ +const tailwindOpacity = (node) => { + // [when testing] node.opacity can be undefined + if (node.opacity !== undefined && node.opacity !== 1) { + return `opacity-${nearestOpacity(node.opacity)} `; + } + return ""; +}; +/** + * https://tailwindcss.com/docs/visibility/ + * example: invisible + */ +const tailwindVisibility = (node) => { + // [when testing] node.visible can be undefined + // When something is invisible in Figma, it isn't gone. Groups can make use of it. + // Therefore, instead of changing the visibility (which causes bugs in nested divs), + // this plugin is going to ignore color and stroke + if (node.visible !== undefined && !node.visible) { + return "invisible "; + } + return ""; +}; +/** + * https://tailwindcss.com/docs/rotate/ + * default is [-180, -90, -45, 0, 45, 90, 180], but '0' will be ignored: + * if rotation was changed, let it be perceived. Therefore, 1 => 45 + */ +const tailwindRotation = (node) => { + // that's how you convert angles to clockwise radians: angle * -pi/180 + // using 3.14159 as Pi for enough precision and to avoid importing math lib. + if (node.rotation !== undefined && Math.round(node.rotation) !== 0) { + const allowedValues = [ + -180, + -90, + -45, + -12, + -6, + -3, + -2, + -1, + 1, + 2, + 3, + 6, + 12, + 45, + 90, + 180, + ]; + let nearest = nearestValue(node.rotation, allowedValues); + let minusIfNegative = ""; + if (nearest < 0) { + minusIfNegative = "-"; + nearest = -nearest; + } + return `transform ${minusIfNegative}rotate-${nearest} `; + } + return ""; +}; + +/** + * https://tailwindcss.com/docs/border-width/ + * example: border-2 + */ +const tailwindBorderWidth = (node) => { + // [node.strokeWeight] can have a value even when there are no strokes + // [when testing] node.effects can be undefined + if (node.strokes && node.strokes.length > 0 && node.strokeWeight > 0) { + const allowedValues = [1, 2, 4, 8]; + const nearest = nearestValue(node.strokeWeight, allowedValues); + if (nearest === 1) { + // special case + return "border "; + } + else { + return `border-${nearest} `; + } + } + return ""; +}; +/** + * https://tailwindcss.com/docs/border-radius/ + * example: rounded-sm + * example: rounded-tr-lg + */ +const tailwindBorderRadius = (node) => { + if (node.type === "ELLIPSE") { + return "rounded-full "; + } + else if ((!("cornerRadius" in node) && !("topLeftRadius" in node)) || + (node.cornerRadius === figma.mixed && node.topLeftRadius === undefined) || + node.cornerRadius === 0) { + // the second condition is used on tests. On Figma, topLeftRadius is never undefined. + // ignore when 0, undefined or non existent + return ""; + } + let comp = ""; + if (node.cornerRadius !== figma.mixed) { + if (node.cornerRadius >= node.height / 2) { + // special case. If height is 90 and cornerRadius is 45, it is full. + comp += "rounded-full "; + } + else { + comp += `rounded${pxToBorderRadius(node.cornerRadius)} `; + } + } + else { + // todo optimize for tr/tl/br/bl instead of t/r/l/b + if (node.topLeftRadius !== 0) { + comp += `rounded-tl${pxToBorderRadius(node.topLeftRadius)} `; + } + if (node.topRightRadius !== 0) { + comp += `rounded-tr${pxToBorderRadius(node.topRightRadius)} `; + } + if (node.bottomLeftRadius !== 0) { + comp += `rounded-bl${pxToBorderRadius(node.bottomLeftRadius)} `; + } + if (node.bottomRightRadius !== 0) { + comp += `rounded-br${pxToBorderRadius(node.bottomRightRadius)} `; + } + } + return comp; +}; + +/** + * In Figma, Groups have absolute position while Frames have relative. + * This is a helper to retrieve the node.parent.x without worries. + * Usually, after this is called, node.x - parentX is done to solve that scenario. + * + * Input is expected to be node.parent. + */ +const parentCoordinates = (node) => { + const parentX = "layoutMode" in node ? 0 : node.x; + const parentY = "layoutMode" in node ? 0 : node.y; + return [parentX, parentY]; +}; + +const commonPosition = (node) => { + // if node is same size as height, position is not necessary + var _a, _b, _c, _d; + // detect if Frame's width is same as Child when Frame has Padding. + // warning: this may return true even when false, if size is same, but position is different. However, it would be an unexpected layout. + let hPadding = 0; + let vPadding = 0; + if (node.parent && "layoutMode" in node.parent) { + hPadding = ((_a = node.parent.paddingLeft) !== null && _a !== void 0 ? _a : 0) + ((_b = node.parent.paddingRight) !== null && _b !== void 0 ? _b : 0); + vPadding = ((_c = node.parent.paddingTop) !== null && _c !== void 0 ? _c : 0) + ((_d = node.parent.paddingBottom) !== null && _d !== void 0 ? _d : 0); + } + if (!node.parent || + (node.width === node.parent.width - hPadding && + node.height === node.parent.height - vPadding)) { + return ""; + } + // position is absolute, parent is relative + // return "absolute inset-0 m-auto "; + const [parentX, parentY] = parentCoordinates(node.parent); + // if view is too small, anything will be detected; this is necessary to reduce the tolerance. + let threshold = 8; + if (node.width < 16 || node.height < 16) { + threshold = 1; + } + // < 4 is a threshold. If === is used, there can be rounding errors (28.002 !== 28) + const centerX = Math.abs(2 * (node.x - parentX) + node.width - node.parent.width) < + threshold; + const centerY = Math.abs(2 * (node.y - parentY) + node.height - node.parent.height) < + threshold; + const minX = node.x - parentX < threshold; + const minY = node.y - parentY < threshold; + const maxX = node.parent.width - (node.x - parentX + node.width) < threshold; + const maxY = node.parent.height - (node.y - parentY + node.height) < threshold; + // this needs to be on top, because Tailwind is incompatible with Center, so this will give preference. + if (minX && minY) { + // x left, y top + return "TopStart"; + } + else if (minX && maxY) { + // x left, y bottom + return "BottomStart"; + } + else if (maxX && minY) { + // x right, y top + return "TopEnd"; + } + else if (maxX && maxY) { + // x right, y bottom + return "BottomEnd"; + } + if (centerX && centerY) { + return "Center"; + } + if (centerX) { + if (minY) { + // x center, y top + return "TopCenter"; + } + if (maxY) { + // x center, y bottom + return "BottomCenter"; + } + } + else if (centerY) { + if (minX) { + // x left, y center + return "CenterStart"; + } + if (maxX) { + // x right, y center + return "CenterEnd"; + } + } + return "Absolute"; +}; + +const tailwindPosition = (node, parentId = "", hasFixedSize = false) => { + // don't add position to the first (highest) node in the tree + if (!node.parent || parentId === node.parent.id) { + return ""; + } + // Group + if (node.parent.isRelative === true) { + // position is absolute, needs to be relative + return retrieveAbsolutePos$1(node, hasFixedSize); + } + return ""; +}; +const retrieveAbsolutePos$1 = (node, hasFixedSize) => { + // everything related to Center requires a defined width and height. Therefore, we use hasFixedSize. + switch (commonPosition(node)) { + case "": + return ""; + case "Absolute": + return "absoluteManualLayout"; + case "TopCenter": + if (hasFixedSize) { + return "absolute inset-x-0 top-0 mx-auto "; + } + return "absoluteManualLayout"; + case "CenterStart": + if (hasFixedSize) { + return "absolute inset-y-0 left-0 my-auto "; + } + return "absoluteManualLayout"; + case "Center": + if (hasFixedSize) { + return "absolute m-auto inset-0 "; + } + return "absoluteManualLayout"; + case "CenterEnd": + if (hasFixedSize) { + return "absolute inset-y-0 right-0 my-auto "; + } + return "absoluteManualLayout"; + case "BottomCenter": + if (hasFixedSize) { + return "absolute inset-x-0 bottom-0 mx-auto "; + } + return "absoluteManualLayout"; + case "TopStart": + return "absolute left-0 top-0 "; + case "TopEnd": + return "absolute right-0 top-0 "; + case "BottomStart": + return "absolute left-0 bottom-0 "; + case "BottomEnd": + return "absolute right-0 bottom-0 "; + } +}; + +const nodeWidthHeight = (node, allowRelative) => { + /// WIDTH AND HEIGHT + var _a; + // if parent is a page, width can't get past w-64, therefore let it be free + // if (node.parent?.type === "PAGE" && node.width > 256) { + // return ""; + // } + if (node.layoutAlign === "STRETCH" && node.layoutGrow === 1) { + return { + width: "full", + height: "full", + }; + } + const [nodeWidth, nodeHeight] = getNodeSizeWithStrokes(node); + let propWidth = nodeWidth; + let propHeight = nodeHeight; + if (node.parent && "layoutMode" in node.parent) { + // Stretch means the opposite direction + if (node.layoutAlign === "STRETCH") { + switch (node.parent.layoutMode) { + case "HORIZONTAL": + propHeight = "full"; + break; + case "VERTICAL": + propWidth = "full"; + break; + } + } + // Grow means the same direction + if (node.layoutGrow === 1) { + if (node.parent.layoutMode === "HORIZONTAL") { + propWidth = "full"; + } + else { + propHeight = "full"; + } + } + } + // avoid relative width when parent is relative (therefore, child is probably absolute, which doesn't work nice) + // ignore for root layer + // todo should this be kept this way? The issue is w-full which doesn't work well with absolute position. + if (allowRelative && ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.isRelative) !== true) { + // don't calculate again if it was already calculated + if (propWidth !== "full") { + const rW = calculateResponsiveWH(node, nodeWidth, "x"); + if (rW) { + propWidth = rW; + } + } + if (propHeight !== "full") { + const rH = calculateResponsiveWH(node, nodeHeight, "y"); + if (rH && node.parent) { + propHeight = rH; + } + } + } + // when any child has a relative width and parent is HORIZONTAL, + // parent must have a defined width, which wouldn't otherwise. + // todo check if the performance impact of this is worth it. + // const hasRelativeChildW = + // allowRelative && + // "children" in node && + // node.children.find((d) => + // calculateResponsiveWH(d, getNodeSizeWithStrokes(d)[0], "x") + // ) !== undefined; + // when the child has the same size as the parent, don't set the size of the parent (twice) + if ("children" in node && node.children && node.children.length === 1) { + const child = node.children[0]; + // detect if Frame's width is same as Child when Frame has Padding. + let hPadding = 0; + let vPadding = 0; + if ("layoutMode" in node) { + hPadding = node.paddingLeft + node.paddingRight; + vPadding = node.paddingTop + node.paddingBottom; + } + // set them independently, in case w is equal but h isn't + if (child.width === nodeWidth - hPadding) ; + if (child.height === nodeHeight - vPadding) ; + } + if ("layoutMode" in node) { + if ((node.layoutMode === "HORIZONTAL" && + node.counterAxisSizingMode === "AUTO") || + (node.layoutMode === "VERTICAL" && node.primaryAxisSizingMode === "AUTO")) { + propHeight = null; + } + if ((node.layoutMode === "VERTICAL" && + node.counterAxisSizingMode === "AUTO") || + (node.layoutMode === "HORIZONTAL" && + node.primaryAxisSizingMode === "AUTO")) { + propWidth = null; + } + } + // On Tailwind, do not let the size be larger than 384. + if (allowRelative) { + if ((node.type !== "RECTANGLE" && nodeHeight > 384) || + childLargerThanMaxSize(node, "y")) { + propHeight = null; + } + else if ((node.type !== "RECTANGLE" && nodeWidth > 384) || + childLargerThanMaxSize(node, "x")) { + propWidth = null; + } + } + if ("layoutMode" in node && node.layoutMode !== "NONE") { + // there is an edge case: frame with no children, layoutMode !== NONE and counterAxis = AUTO, but: + // in [altConversions] it is already solved: Frame without children becomes a Rectangle. + switch (node.layoutMode) { + case "HORIZONTAL": + return { + width: node.primaryAxisSizingMode === "FIXED" ? propWidth : null, + height: node.counterAxisSizingMode === "FIXED" ? propHeight : null, + }; + case "VERTICAL": + return { + width: node.counterAxisSizingMode === "FIXED" ? propWidth : null, + height: node.primaryAxisSizingMode === "FIXED" ? propHeight : null, + }; + } + } + else { + return { + width: propWidth, + height: propHeight, + }; + } +}; +// makes the view size bigger when there is a stroke +const getNodeSizeWithStrokes = (node) => { + let nodeHeight = node.height; + let nodeWidth = node.width; + // tailwind doesn't support OUTSIDE or CENTER, only INSIDE. + // Therefore, to give the same feeling, the height and width will be slighly increased. + // node.strokes.lenght is necessary because [strokeWeight] can exist even without strokes. + if ("strokes" in node && node.strokes && node.strokes.length) { + if (node.strokeAlign === "OUTSIDE") { + nodeHeight += node.strokeWeight * 2; + nodeWidth += node.strokeWeight * 2; + } + else if (node.strokeAlign === "CENTER") { + nodeHeight += node.strokeWeight; + nodeWidth += node.strokeWeight; + } + } + if ("children" in node) { + // if any children has an OUTSIDE or CENTER stroke and, with that stroke, + // the child gets a size bigger than parent, adjust parent to be larger + node.children.forEach((d) => { + var _a; + if ("strokeWeight" in d && ((_a = d.strokes) === null || _a === void 0 ? void 0 : _a.length) > 0) { + if (d.strokeAlign === "OUTSIDE") { + if (nodeWidth < d.width + d.strokeWeight * 2) { + nodeWidth += d.strokeWeight * 2; + } + if (nodeHeight < d.height + d.strokeWeight * 2) { + nodeHeight += d.strokeWeight * 2; + } + } + else if (d.strokeAlign === "CENTER") { + if (nodeWidth < d.width + d.strokeWeight) { + nodeWidth += d.strokeWeight; + } + if (nodeHeight < d.height + d.strokeWeight) { + nodeHeight += d.strokeWeight; + } + } + } + }); + } + return [nodeWidth, nodeHeight]; +}; +const childLargerThanMaxSize = (node, axis) => { + if ("children" in node && node.children.length > 0) { + const widthHeight = axis === "x" ? "width" : "height"; + const lastChild = node.children[node.children.length - 1]; + const maxLen = lastChild[axis] + lastChild[widthHeight] - node.children[0][axis]; + return maxLen > 384; + } + return false; +}; +const calculateResponsiveWH = (node, nodeWidthHeight, axis) => { + let returnValue = ""; + if (nodeWidthHeight > 384 || childLargerThanMaxSize(node, axis)) { + returnValue = "full"; + } + if (!node.parent) { + return returnValue; + } + let parentWidthHeight; + if ("layoutMode" in node.parent && node.parent.layoutMode !== "NONE") { + if (axis === "x") { + // subtract padding from the layout width, so it can be full when compared with parent. + parentWidthHeight = + node.parent.width - node.parent.paddingLeft - node.parent.paddingRight; + } + else { + // subtract padding from the layout height, so it can be full when compared with parent. + parentWidthHeight = + node.parent.height - node.parent.paddingTop - node.parent.paddingBottom; + } + } + else { + parentWidthHeight = axis === "x" ? node.parent.width : node.parent.height; + } + // 0.01 of tolerance is enough for 5% of diff, i.e.: 804 / 400 + const dividedWidth = nodeWidthHeight / parentWidthHeight; + const calculateResp = (div, str) => { + if (Math.abs(dividedWidth - div) < 0.01) { + returnValue = str; + return true; + } + return false; + }; + // they will try to set the value, and if false keep calculating + const checkList = [ + [1, "full"], + [1 / 2, "1/2"], + [1 / 3, "1/3"], + [2 / 3, "2/3"], + [1 / 4, "1/4"], + [3 / 4, "3/4"], + [1 / 5, "1/5"], + [1 / 6, "1/6"], + [5 / 6, "5/6"], + ]; + // exit the for when result is found. + let resultFound = false; + for (let i = 0; i < checkList.length && !resultFound; i++) { + const [div, resp] = checkList[i]; + resultFound = calculateResp(div, resp); + } + // todo this was commented because it is almost never used. Should it be uncommented? + // if (!resultFound && isWidthFull(node, nodeWidth, parentWidth)) { + // propWidth = "full"; + // } + return returnValue; +}; +// set the width to max if the view is near the corner +// export const isWidthFull = ( +// node: AltSceneNode, +// nodeWidth: number, +// parentWidth: number +// ): boolean => { +// // check if initial and final positions are within a magic number (currently 32) +// // this will only be reached when parent is FRAME, so node.parent.x is always 0. +// const betweenValueMargins = +// node.x <= magicMargin && parentWidth - (node.x + nodeWidth) <= magicMargin; +// // check if total width is at least 80% of the parent. This number is also a magic number and has worked fine so far. +// const betweenPercentMargins = nodeWidth / parentWidth >= 0.8; +// if (betweenValueMargins && betweenPercentMargins) { +// return true; +// } +// return false; +// }; + +// this is necessary to avoid a height of 4.999999523162842. +const numToAutoFixed = (num) => { + return num.toFixed(2).replace(/\.00$/, ""); +}; + +const formatWithJSX = (property, isJsx, value) => { + // convert font-size to fontSize. + const jsx_property = property + .split("-") + .map((d, i) => (i > 0 ? d.charAt(0).toUpperCase() + d.slice(1) : d)) + .join(""); + if (typeof value === "number") { + if (isJsx) { + return `${jsx_property}: ${numToAutoFixed(value)}, `; + } + else { + return `${property}: ${numToAutoFixed(value)}px; `; + } + } + else { + if (isJsx) { + return `${jsx_property}: '${value}', `; + } + else { + return `${property}: ${value}; `; + } + } +}; + +const tailwindSizePartial = (node) => { + const size = nodeWidthHeight(node, true); + let w = ""; + if (typeof size.width === "number") { + w += `w-${pxToLayoutSize(size.width)} `; + } + else if (typeof size.width === "string") { + if (size.width === "full" && + node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "HORIZONTAL") { + w += `flex-1 `; + } + else { + w += `w-${size.width} `; + } + } + let h = ""; + // console.log("sizeResults is ", sizeResult, node); + if (typeof size.height === "number") { + h = `h-${pxToLayoutSize(size.height)} `; + } + else if (typeof size.height === "string") { + if (size.height === "full" && + node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "VERTICAL") { + h += `flex-1 `; + } + else { + h += `h-${size.height} `; + } + } + return [w, h]; +}; +/** + * https://www.w3schools.com/css/css_dimension.asp + */ +const htmlSizeForTailwind = (node, isJSX) => { + return htmlSizePartialForTailwind(node, isJSX).join(""); +}; +const htmlSizePartialForTailwind = (node, isJSX) => { + return [ + formatWithJSX("width", isJSX, node.width), + formatWithJSX("height", isJSX, node.height), + ]; +}; + +/** + * Add padding if necessary. + * Padding is currently only valid for auto layout. + * Padding can have values even when AutoLayout is off + */ +const commonPadding = (node) => { + var _a, _b, _c, _d; + if ("layoutMode" in node && node.layoutMode !== "NONE") { + // round the numbers to avoid 5 being different than 5.00001 + // fix it if undefined (in tests) + node.paddingLeft = Math.round((_a = node.paddingLeft) !== null && _a !== void 0 ? _a : 0); + node.paddingRight = Math.round((_b = node.paddingRight) !== null && _b !== void 0 ? _b : 0); + node.paddingTop = Math.round((_c = node.paddingTop) !== null && _c !== void 0 ? _c : 0); + node.paddingBottom = Math.round((_d = node.paddingBottom) !== null && _d !== void 0 ? _d : 0); + const arr = { + horizontal: 0, + vertical: 0, + left: 0, + right: 0, + top: 0, + bottom: 0, + }; + if (node.paddingLeft > 0 && + node.paddingLeft === node.paddingRight && + node.paddingLeft === node.paddingBottom && + node.paddingTop === node.paddingBottom) { + return { all: node.paddingLeft }; + } + else if (node.paddingLeft > 0 && node.paddingLeft === node.paddingRight) { + // horizontal padding + vertical + individual paddings + arr.horizontal = node.paddingLeft; + if (node.paddingTop > 0 && node.paddingTop === node.paddingBottom) { + arr.vertical = node.paddingTop; + } + else { + if (node.paddingTop > 0) { + arr.top = node.paddingTop; + } + if (node.paddingBottom > 0) { + arr.bottom = node.paddingBottom; + } + } + } + else if (node.paddingTop > 0 && node.paddingTop === node.paddingBottom) { + // vertical padding + individual paddings + arr.vertical = node.paddingBottom; + if (node.paddingLeft > 0) { + arr.left = node.paddingLeft; + } + if (node.paddingRight > 0) { + arr.right = node.paddingRight; + } + } + else { + // individual paddings + if (node.paddingLeft > 0) { + arr.left = node.paddingLeft; + } + if (node.paddingRight > 0) { + arr.right = node.paddingRight; + } + if (node.paddingTop > 0) { + arr.top = node.paddingTop; + } + if (node.paddingBottom > 0) { + arr.bottom = node.paddingBottom; + } + } + return arr; + } + return null; +}; + +/** + * https://tailwindcss.com/docs/margin/ + * example: px-2 py-8 + */ +const tailwindPadding = (node) => { + const padding = commonPadding(node); + if (!padding) { + return ""; + } + if ("all" in padding) { + return `p-${pxToLayoutSize(padding.all)} `; + } + let comp = ""; + // horizontal and vertical, as the default AutoLayout + if (padding.horizontal) { + comp += `px-${pxToLayoutSize(padding.horizontal)} `; + } + if (padding.vertical) { + comp += `py-${pxToLayoutSize(padding.vertical)} `; + } + // if left and right exists, verify if they are the same after [pxToLayoutSize] conversion. + if (padding.left && padding.right) { + const left = pxToLayoutSize(padding.left); + const right = pxToLayoutSize(padding.right); + if (left === right) { + comp += `px-${left} `; + } + else { + comp += `pl-${left} pr-${right} `; + } + } + else if (padding.left) { + comp += `pl-${pxToLayoutSize(padding.left)} `; + } + else if (padding.right) { + comp += `pr-${pxToLayoutSize(padding.right)} `; + } + // if top and bottom exists, verify if they are the same after [pxToLayoutSize] conversion. + if (padding.top && padding.bottom) { + const top = pxToLayoutSize(padding.top); + const bottom = pxToLayoutSize(padding.bottom); + if (top === bottom) { + comp += `py-${top} `; + } + else { + comp += `pt-${top} pb-${bottom} `; + } + } + else if (padding.top) { + comp += `pt-${pxToLayoutSize(padding.top)} `; + } + else if (padding.bottom) { + comp += `pb-${pxToLayoutSize(padding.bottom)} `; + } + return comp; +}; + +class TailwindDefaultBuilder { + constructor(node, showLayerName, optIsJSX) { + this.attributes = ""; + this.styleSeparator = ""; + this.name = ""; + this.hasFixedSize = false; + this.isJSX = optIsJSX; + this.styleSeparator = this.isJSX ? "," : ";"; + this.style = ""; + this.visible = node.visible; + if (showLayerName) { + this.name = node.name.replace(" ", "") + " "; + } + } + blend(node) { + this.attributes += tailwindVisibility(node); + this.attributes += tailwindRotation(node); + this.attributes += tailwindOpacity(node); + return this; + } + border(node) { + this.attributes += tailwindBorderWidth(node); + this.attributes += tailwindBorderRadius(node); + this.customColor(node.strokes, "border"); + return this; + } + position(node, parentId, isRelative = false) { + const position = tailwindPosition(node, parentId, this.hasFixedSize); + if (position === "absoluteManualLayout" && node.parent) { + // tailwind can't deal with absolute layouts. + const [parentX, parentY] = parentCoordinates(node.parent); + const left = node.x - parentX; + const top = node.y - parentY; + this.style += formatWithJSX("left", this.isJSX, left); + this.style += formatWithJSX("top", this.isJSX, top); + if (!isRelative) { + this.attributes += "absolute "; + } + } + else { + this.attributes += position; + } + return this; + } + /** + * https://tailwindcss.com/docs/text-color/ + * example: text-blue-500 + * example: text-opacity-25 + * example: bg-blue-500 + */ + customColor(paint, kind) { + // visible is true or undefinied (tests) + if (this.visible !== false) { + let gradient = ""; + if (kind === "bg") { + gradient = tailwindGradientFromFills(paint); + } + if (gradient) { + this.attributes += gradient; + } + else { + this.attributes += tailwindColorFromFills(paint, kind); + } + } + return this; + } + /** + * https://tailwindcss.com/docs/box-shadow/ + * example: shadow + */ + shadow(node) { + this.attributes += tailwindShadow(node); + return this; + } + // must be called before Position, because of the hasFixedSize attribute. + widthHeight(node) { + // if current element is relative (therefore, children are absolute) + // or current element is one of the absoltue children and has a width or height > w/h-64 + var _a; + if ("isRelative" in node && node.isRelative === true) { + this.style += htmlSizeForTailwind(node, this.isJSX); + } + else if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.isRelative) === true || + node.width > 384 || + node.height > 384) { + // to avoid mixing html and tailwind sizing too much, only use html sizing when absolutely necessary. + // therefore, if only one attribute is larger than 256, only use the html size in there. + const [tailwindWidth, tailwindHeight] = tailwindSizePartial(node); + const [htmlWidth, htmlHeight] = htmlSizePartialForTailwind(node, this.isJSX); + // when textAutoResize is NONE or WIDTH_AND_HEIGHT, it has a defined width. + if (node.type !== "TEXT" || node.textAutoResize !== "WIDTH_AND_HEIGHT") { + if (node.width > 384) { + this.style += htmlWidth; + } + else { + this.attributes += tailwindWidth; + } + this.hasFixedSize = htmlWidth !== ""; + } + // when textAutoResize is NONE has a defined height. + if (node.type !== "TEXT" || node.textAutoResize === "NONE") { + if (node.width > 384) { + this.style += htmlHeight; + } + else { + this.attributes += tailwindHeight; + } + this.hasFixedSize = htmlHeight !== ""; + } + } + else { + const partial = tailwindSizePartial(node); + // Width + if (node.type !== "TEXT" || node.textAutoResize !== "WIDTH_AND_HEIGHT") { + this.attributes += partial[0]; + } + // Height + if (node.type !== "TEXT" || node.textAutoResize === "NONE") { + this.attributes += partial[1]; + } + this.hasFixedSize = partial[0] !== "" && partial[1] !== ""; + } + return this; + } + autoLayoutPadding(node) { + this.attributes += tailwindPadding(node); + return this; + } + removeTrailingSpace() { + if (this.attributes.length > 0 && this.attributes.slice(-1) === " ") { + this.attributes = this.attributes.slice(0, -1); + } + if (this.style.length > 0 && this.style.slice(-1) === " ") { + this.style = this.style.slice(0, -1); + } + return this; + } + build(additionalAttr = "") { + this.attributes = this.name + additionalAttr + this.attributes; + this.removeTrailingSpace(); + if (this.style) { + if (this.isJSX) { + this.style = ` style={{${this.style}}}`; + } + else { + this.style = ` style="${this.style}"`; + } + } + if (!this.attributes && !this.style) { + return ""; + } + const classOrClassName = this.isJSX ? "className" : "class"; + return ` ${classOrClassName}="${this.attributes}"${this.style}`; + } + reset() { + this.attributes = ""; + } +} + +class TailwindTextBuilder extends TailwindDefaultBuilder { + constructor(node, showLayerName, optIsJSX) { + super(node, showLayerName, optIsJSX); + } + // must be called before Position method + textAutoSize(node) { + if (node.textAutoResize === "NONE") { + // going to be used for position + this.hasFixedSize = true; + } + this.widthHeight(node); + return this; + } + // todo fontFamily + // fontFamily(node: AltTextNode): this { + // return this; + // } + /** + * https://tailwindcss.com/docs/font-size/ + * example: text-md + */ + fontSize(node) { + // example: text-md + if (node.fontSize !== figma.mixed) { + const value = pxToFontSize(node.fontSize); + this.attributes += `text-${value} `; + } + return this; + } + /** + * https://tailwindcss.com/docs/font-style/ + * example: font-extrabold + * example: italic + */ + fontStyle(node) { + if (node.fontName !== figma.mixed) { + const lowercaseStyle = node.fontName.style.toLowerCase(); + if (lowercaseStyle.match("italic")) { + this.attributes += "italic "; + } + if (lowercaseStyle.match("regular")) { + // ignore the font-style when regular (default) + return this; + } + const value = node.fontName.style + .replace("italic", "") + .replace(" ", "") + .toLowerCase(); + this.attributes += `font-${value} `; + } + return this; + } + /** + * https://tailwindcss.com/docs/letter-spacing/ + * example: tracking-widest + */ + letterSpacing(node) { + const letterSpacing = commonLetterSpacing(node); + if (letterSpacing > 0) { + const value = pxToLetterSpacing(letterSpacing); + this.attributes += `tracking-${value} `; + } + return this; + } + /** + * https://tailwindcss.com/docs/line-height/ + * example: leading-3 + */ + lineHeight(node) { + const lineHeight = commonLineHeight(node); + if (lineHeight > 0) { + const value = pxToLineHeight(lineHeight); + this.attributes += `leading-${value} `; + } + return this; + } + /** + * https://tailwindcss.com/docs/text-align/ + * example: text-justify + */ + textAlign(node) { + // if alignHorizontal is LEFT, don't do anything because that is native + // only undefined in testing + if (node.textAlignHorizontal && node.textAlignHorizontal !== "LEFT") { + // todo when node.textAutoResize === "WIDTH_AND_HEIGHT" and there is no \n in the text, this can be ignored. + switch (node.textAlignHorizontal) { + case "CENTER": + this.attributes += `text-center `; + break; + case "RIGHT": + this.attributes += `text-right `; + break; + case "JUSTIFIED": + this.attributes += `text-justify `; + break; + } + } + return this; + } + /** + * https://tailwindcss.com/docs/text-transform/ + * example: uppercase + */ + textTransform(node) { + if (node.textCase === "LOWER") { + this.attributes += "lowercase "; + } + else if (node.textCase === "TITLE") { + this.attributes += "capitalize "; + } + else if (node.textCase === "UPPER") { + this.attributes += "uppercase "; + } + else if (node.textCase === "ORIGINAL") ; + return this; + } + /** + * https://tailwindcss.com/docs/text-decoration/ + * example: underline + */ + textDecoration(node) { + if (node.textDecoration === "UNDERLINE") { + this.attributes += "underline "; + } + else if (node.textDecoration === "STRIKETHROUGH") { + this.attributes += "line-through "; + } + return this; + } + reset() { + this.attributes = ""; + } +} + +// Convert generic named weights to numbers, which is the way tailwind understands +const convertFontWeight = (weight) => { + // change extra-light to extralight + weight = weight.replace(" ", "").replace("-", "").toLowerCase(); + switch (weight) { + case "thin": + return "100"; + case "extralight": + return "200"; + case "light": + return "300"; + case "regular": + return "400"; + case "medium": + return "500"; + case "semibold": + return "600"; + case "bold": + return "700"; + case "extrabold": + return "800"; + case "heavy": + return "800"; + case "black": + return "900"; + default: + return null; + } +}; + +const retrieveTailwindText = (sceneNode) => { + // convert to AltNode and then flatten it. Conversion is necessary because of [tailwindText] + const selectedText = deepFlatten$1(sceneNode); + const textStr = []; + selectedText.forEach((node) => { + var _a, _b; + if (node.type === "TEXT") { + const attr = new TailwindTextBuilder(node, false, false) + .blend(node) + .position(node, (_b = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "") + .textAutoSize(node) + .fontSize(node) + .fontStyle(node) + .letterSpacing(node) + .lineHeight(node) + .textDecoration(node) + .textAlign(node) + .customColor(node.fills, "text") + .textTransform(node) + .removeTrailingSpace(); + const splittedChars = node.characters.split("\n"); + const charsWithLineBreak = splittedChars.length > 1 + ? node.characters.split("\n").join("
") + : node.characters; + const black = { + r: 0, + g: 0, + b: 0, + }; + let contrastBlack = 21; + const fill = retrieveTopFill(node.fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + contrastBlack = calculateContrastRatio$1(fill.color, black); + } + textStr.push({ + name: node.name, + attr: attr.attributes, + full: `

${charsWithLineBreak}

`, + style: style(node), + contrastBlack: contrastBlack, + }); + } + }); + // retrieve only unique texts (attr + name) + // from https://stackoverflow.com/a/18923480/4418073 + const unique = {}; + const distinct = []; + textStr.forEach(function (x) { + if (!unique[x.attr + x.name]) { + distinct.push(x); + unique[x.attr + x.name] = true; + } + }); + return distinct; +}; +const style = (node) => { + let comp = ""; + if (node.fontName !== figma.mixed) { + const lowercaseStyle = node.fontName.style.toLowerCase(); + if (lowercaseStyle.match("italic")) { + comp += "font-style: italic; "; + } + const value = node.fontName.style + .replace("italic", "") + .replace(" ", "") + .toLowerCase(); + const weight = convertFontWeight(value); + if (weight) { + comp += `font-weight: ${weight}; `; + } + } + if (node.fontSize !== figma.mixed) { + comp += `font-size: ${Math.min(node.fontSize, 24)}; `; + } + const color = convertColor(node.fills); + if (color) { + comp += `color: ${color}; `; + } + return comp; +}; +function deepFlatten$1(arr) { + let result = []; + arr.forEach((d) => { + if ("children" in d) { + result = result.concat(deepFlatten$1([...d.children])); + } + else { + if (d.type === "TEXT") { + result.push(d); + } + } + }); + return result; +} +const convertColor = (fills) => { + // kind can be text, bg, border... + // [when testing] fills can be undefined + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + return tailwindNearestColor(rgbTo6hex(fill.color)); + } + return undefined; +}; +// from https://dev.to/alvaromontoro/building-your-own-color-contrast-checker-4j7o +function calculateContrastRatio$1(color1, color2) { + const color1luminance = luminance$1(color1); + const color2luminance = luminance$1(color2); + const contrast = color1luminance > color2luminance + ? (color2luminance + 0.05) / (color1luminance + 0.05) + : (color1luminance + 0.05) / (color2luminance + 0.05); + return 1 / contrast; +} +function luminance$1(color) { + const a = [color.r * 255, color.g * 255, color.b * 255].map(function (v) { + v /= 255; + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; +} + +/** + * Retrieve the SOLID color for SwiftUI when existent, otherwise "" + */ +const swiftuiColorFromFills = (fills) => { + var _a; + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + // todo maybe ignore text color when it is black? + // opacity should only be null on set, not on get. But better be prevented. + const opacity = (_a = fill.opacity) !== null && _a !== void 0 ? _a : 1.0; + return swiftuiColor(fill.color, opacity); + } + else if ((fill === null || fill === void 0 ? void 0 : fill.type) === "GRADIENT_LINEAR") { + return swiftuiGradient(fill); + } + else if ((fill === null || fill === void 0 ? void 0 : fill.type) === "IMAGE") { + // placeholder for the image. Apparently SwiftUI doesn't support Image.network(...). + return swiftuiColor({ + r: 0.5, + g: 0.23, + b: 0.27, + }, 0.5); + } + return ""; +}; +const swiftuiGradient = (fill) => { + const direction = gradientDirection$1(gradientAngle(fill)); + const colors = fill.gradientStops + .map((d) => { + return swiftuiColor(d.color, d.color.a); + }) + .join(", "); + return `LinearGradient(gradient: Gradient(colors: [${colors}]), ${direction})`; +}; +const gradientDirection$1 = (angle) => { + switch (nearestValue(angle, [-180, -135, -90, -45, 0, 45, 90, 135, 180])) { + case 0: + return "startPoint: .leading, endPoint: .trailing"; + case 45: + return "startPoint: .topLeading, endPoint: .bottomTrailing"; + case 90: + return "startPoint: .top, endPoint: .bottom"; + case 135: + return "startPoint: .topTrailing, endPoint: .bottomLeading"; + case -45: + return "startPoint: .bottomLeading, endPoint: .topTrailing"; + case -90: + return "startPoint: .bottom, endPoint: .top"; + case -135: + return "startPoint: .bottomTrailing, endPoint: .topLeading"; + default: + // 180 and -180 + return "startPoint: .trailing, endPoint: .leading"; + } +}; +const swiftuiColor = (color, opacity) => { + // Using Color.black.opacity() is not reccomended, as per: + // https://stackoverflow.com/a/56824114/4418073 + // Therefore, only use Color.black/white when opacity is 1. + if (color.r + color.g + color.b === 0 && opacity === 1) { + return "Color.black"; + } + if (color.r + color.g + color.b === 3 && opacity === 1) { + return "Color.white"; + } + const r = "red: " + numToAutoFixed(color.r); + const g = "green: " + numToAutoFixed(color.g); + const b = "blue: " + numToAutoFixed(color.b); + const opacityAttr = opacity !== 1.0 ? `, opacity: ${numToAutoFixed(opacity)}` : ""; + return `Color(${r}, ${g}, ${b}${opacityAttr})`; +}; + +/** + * Retrieve the SOLID color for Flutter when existent, otherwise "" + */ +const flutterColorFromFills = (fills) => { + var _a; + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + // todo maybe ignore text color when it is black? + const opacity = (_a = fill.opacity) !== null && _a !== void 0 ? _a : 1.0; + return `color: ${flutterColor(fill.color, opacity)},`; + } + return ""; +}; +const flutterBoxDecorationColor = (fills) => { + var _a; + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + const opacity = (_a = fill.opacity) !== null && _a !== void 0 ? _a : 1.0; + return `\ncolor: ${flutterColor(fill.color, opacity)},`; + } + else if ((fill === null || fill === void 0 ? void 0 : fill.type) === "GRADIENT_LINEAR") { + return `\ngradient: ${flutterGradient(fill)},`; + } + return ""; +}; +const flutterGradient = (fill) => { + const direction = gradientDirection(gradientAngle(fill)); + const colors = fill.gradientStops + .map((d) => { + return flutterColor(d.color, d.color.a); + }) + .join(", "); + return `LinearGradient(${direction}, colors: [${colors}], )`; +}; +const gradientDirection = (angle) => { + switch (nearestValue(angle, [-180, -135, -90, -45, 0, 45, 90, 135, 180])) { + case 0: + return "begin: Alignment.centerLeft, end: Alignment.centerRight"; + case 45: + return "begin: Alignment.topLeft, end: Alignment.bottomRight"; + case 90: + return "begin: Alignment.topCenter, end: Alignment.bottomCenter"; + case 135: + return "begin: Alignment.topRight, end: Alignment.bottomLeft"; + case -45: + return "begin: Alignment.bottomLeft, end: Alignment.topRight"; + case -90: + return "begin: Alignment.bottomCenter, end: Alignment.topCenter"; + case -135: + return "begin: Alignment.bottomRight, end: Alignment.topLeft"; + default: + // 180 and -180 + return "begin: Alignment.centerRight, end: Alignment.centerLeft"; + } +}; +const flutterColor = (color, opacity) => { + // todo use Colors.black.opacity() + if (color.r + color.g + color.b === 0 && opacity === 1) { + return "Colors.black"; + } + if (color.r + color.g + color.b === 3 && opacity === 1) { + return "Colors.white"; + } + return `Color(0x${rgbTo8hex(color, opacity)})`; +}; + +// retrieve the SOLID color on HTML +const htmlColorFromFills = (fills) => { + // kind can be text, bg, border... + // [when testing] fills can be undefined + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "SOLID") { + // if fill isn't visible, it shouldn't be painted. + return htmlColor(fill.color, fill.opacity); + } + return ""; +}; +const htmlColor = (color, alpha = 1) => { + const r = numToAutoFixed(color.r * 255); + const g = numToAutoFixed(color.g * 255); + const b = numToAutoFixed(color.b * 255); + const a = numToAutoFixed(alpha !== null && alpha !== void 0 ? alpha : 1); + if (color.r === 1 && color.g === 1 && color.b === 1 && alpha === 1) { + return "white"; + } + if (color.r === 0 && color.g === 0 && color.b === 0 && alpha === 1) { + return "black"; + } + return `rgba(${r}, ${g}, ${b}, ${a})`; +}; +const htmlGradientFromFills = (fills) => { + const fill = retrieveTopFill(fills); + if ((fill === null || fill === void 0 ? void 0 : fill.type) === "GRADIENT_LINEAR") { + return htmlGradient(fill); + } + return ""; +}; +// This was separated from htmlGradient because it is going to be used in the plugin UI and it wants all gradients, not only the top one. +const htmlGradient = (fill) => { + // add 90 to be correct in HTML. + const angle = (gradientAngle(fill) + 90).toFixed(0); + const mappedFill = fill.gradientStops + .map((d) => { + // only add position to fractional + const position = d.position > 0 && d.position < 1 + ? " " + (100 * d.position).toFixed(0) + "%" + : ""; + return `${htmlColor(d.color, d.color.a)}${position}`; + }) + .join(", "); + return `linear-gradient(${angle}deg, ${mappedFill})`; +}; + +class AltRectangleNode { + constructor() { + this.type = "RECTANGLE"; + } +} +class AltEllipseNode { + constructor() { + this.type = "ELLIPSE"; + } +} +class AltFrameNode { + constructor() { + this.type = "FRAME"; + } +} +class AltGroupNode { + constructor() { + this.type = "GROUP"; + } +} +class AltTextNode { + constructor() { + this.type = "TEXT"; + } +} +// // DOCUMENT +// class AltDocumentNode { +// type = "DOCUMENT"; +// children = []; +// } +// // PAGE +// class AltPageNode { +// type = "PAGE"; +// children = []; +// _selection: Array = []; +// get selection() { +// return this._selection || []; +// } +// set selection(value) { +// this._selection = value; +// } +// } + +/** + * Large (Default) + * https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/ + */ +const swiftuiFontMatcher = (node) => { + if (node.fontSize === figma.mixed) { + return ""; + } + if (node.fontSize <= 11) { + return ".caption2"; + } + else if (node.fontSize <= 12) { + return ".caption"; + } + else if (node.fontSize <= 13) { + return ".footnote"; + } + else if (node.fontSize <= 15) { + return ".subheadline"; + } + else if (node.fontSize <= 16) { + return ".callout"; + } + else if (node.fontSize <= 17) { + return ".body"; + } + else if (node.fontSize <= 20) { + return ".title3"; + } + else if (node.fontSize <= 22) { + return ".title2"; + } + else if (node.fontSize <= 28) { + return ".title"; + } + else { + return ".largeTitle"; + } +}; +/** + * nine weights — from Ultralight to Black + * https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/ + */ +const swiftuiWeightMatcher = (weight) => { + // yes, "ultraLight" and "semibold" are correct. + switch (weight) { + case "100": + return ".ultraLight"; + case "200": + return ".thin"; + case "300": + return ".light"; + case "400": + return ".regular"; + case "500": + return ".medium"; + case "600": + return ".semibold"; + case "700": + return ".bold"; + case "800": + return ".heavy"; + case "900": + return ".black"; + } +}; + +const swiftuiShadow = (node) => { + if (!node.effects || node.effects.length === 0) { + return ""; + } + const dropShadow = node.effects.filter((d) => d.type === "DROP_SHADOW" && d.visible !== false); + if (dropShadow.length === 0) { + return ""; + } + // retrieve first shadow. + const shadow = dropShadow[0]; + let comp = ""; + const color = shadow.color; + // set color when not black with 0.25 of opacity, which is the Figma default. Round the alpha now to avoid rounding issues. + const a = numToAutoFixed(color.a); + if (color.r + color.g + color.b === 0 && a !== "0.25") { + const r = numToAutoFixed(color.r); + const g = numToAutoFixed(color.g); + const b = numToAutoFixed(color.b); + comp += `color: Color(red: ${r}, green: ${g}, blue: ${b}, opacity: ${a}), `; + } + comp += `radius: ${numToAutoFixed(shadow.radius)}`; + if (shadow.offset.x !== shadow.offset.y) { + const x = shadow.offset.x > 0 ? `x: ${numToAutoFixed(shadow.offset.x)}` : ""; + const y = shadow.offset.y > 0 ? `y: ${numToAutoFixed(shadow.offset.y)}` : ""; + // add initial comma since this is an optional paramater and radius must come first. + comp += ", "; + if (x && y) { + comp += `${x}, ${y}`; + } + else { + // no comma in the middle, since only one of them will be valid + comp += `${x}${y}`; + } + } + return `\n.shadow(${comp})`; +}; +const swiftuiBlur = (node) => { + if (!node.effects || node.effects.length === 0) { + return ""; + } + const layerBlur = node.effects.filter((d) => d.type === "LAYER_BLUR" && d.visible !== false); + if (layerBlur.length === 0) { + return ""; + } + // retrieve first blur. + const blur = layerBlur[0].radius; + return `\n.blur(radius: ${numToAutoFixed(blur)})`; +}; + +/** + * Generate border or an overlay with stroke. + * In Flutter and Tailwind, setting the border sets for both fill and stroke. Not in SwiftUI. + * This method, therefore, only serves for the stroke/border and not for roundness of the layer behind. + * Also, it only works when there is a fill. When there isn't, [swiftuiShapeStroke] should be used. + * + * @param node with hopefully a fill object in [node.strokes]. + * @returns a string with overlay, when there node has a corner radius, or just border. If no color is found in node.strokes, return "". + */ +const swiftuiBorder = (node) => { + if (node.type === "GROUP" || !node.strokes || node.strokes.length === 0) { + return ""; + } + const propStrokeColor = swiftuiColorFromFills(node.strokes); + const lW = numToAutoFixed(node.strokeWeight); + const fill = retrieveTopFill(node.fills); + if (propStrokeColor && node.strokeWeight) { + const roundRect = swiftuiRoundedRectangle(node); + if (roundRect) { + return `\n.overlay(${roundRect}.stroke(${propStrokeColor}, lineWidth: ${lW}))`; + } + else if (node.type === "RECTANGLE" && !fill) { + // this scenario was taken care already by [swiftuiShapeStroke] + return ""; + } + if (node.type === "ELLIPSE" && fill) { + // add overlay, to not loose the current fill + return `\n.overlay(Ellipse().stroke(${propStrokeColor}, lineWidth: ${lW}))`; + } + else if (node.type === "ELLIPSE" && !fill) { + // this scenario was taken care already by [swiftuiShapeStroke] + return ""; + } + // border can be put before or after frame() + return `\n.border(${propStrokeColor}, width: ${lW})`; + } + return ""; +}; +// .stroke() must be called near the shape declaration, but .overlay() must be called after frame(). +// Stroke and Border were split. This method deals with stroke, and the other one with overlay. +const swiftuiShapeStroke = (node) => { + if (node.type === "GROUP" || !node.strokes || node.strokes.length === 0) { + return ""; + } + const propStrokeColor = swiftuiColorFromFills(node.strokes); + const lW = numToAutoFixed(node.strokeWeight); + if (propStrokeColor && node.strokeWeight) { + const fill = retrieveTopFill(node.fills); + // only add stroke when there isn't a fill set. + if (node.type === "ELLIPSE" && !fill) { + return `\n.stroke(${propStrokeColor}, lineWidth: ${lW})`; + } + const roundRect = swiftuiRoundedRectangle(node); + if (!roundRect && node.type === "RECTANGLE" && !fill) { + return `\n.stroke(${propStrokeColor}, lineWidth: ${lW})`; + } + } + return ""; +}; +/** + * Produce a Rectangle with border radius. + * The reason this was extracted into its own method is for reusability in [swiftuiBorder], + * where a RoundedRectangle is needed again to be part of the overlay. + * + * @param node with cornerRadius and topLeftRadius properties. + * @returns a string with RoundedRectangle, if node has a corner larger than zero; else "". + */ +const swiftuiCornerRadius = (node) => { + if ("cornerRadius" in node && + node.cornerRadius !== figma.mixed && + node.cornerRadius > 0) { + return numToAutoFixed(node.cornerRadius); + } + else { + if (!("topLeftRadius" in node)) { + return ""; + } + // SwiftUI doesn't support individual corner radius, so get the largest one + const maxBorder = Math.max(node.topLeftRadius, node.topRightRadius, node.bottomLeftRadius, node.bottomRightRadius); + if (maxBorder > 0) { + return numToAutoFixed(maxBorder); + } + } + return ""; +}; +/** + * Produce a Rectangle with border radius. + * The reason this was extracted into its own method is for reusability in [swiftuiBorder], + * where a RoundedRectangle is needed again to be part of the overlay. + * + * @param node with cornerRadius and topLeftRadius properties. + * @returns a string with RoundedRectangle, if node has a corner larger than zero; else "". + */ +const swiftuiRoundedRectangle = (node) => { + const corner = swiftuiCornerRadius(node); + if (corner) { + return `RoundedRectangle(cornerRadius: ${corner})`; + } + return ""; +}; + +// Add padding if necessary! +// This must happen before Stack or after the Positioned, but not before. +const swiftuiPadding = (node) => { + if (!("layoutMode" in node)) { + return ""; + } + const padding = commonPadding(node); + if (!padding) { + return ""; + } + if ("all" in padding) { + return `\n.padding(${numToAutoFixed(padding.all)})`; + } + let comp = ""; + // horizontal and vertical, as the default AutoLayout + if (padding.horizontal) { + comp += `\n.padding(.horizontal, ${numToAutoFixed(padding.horizontal)})`; + } + if (padding.vertical) { + comp += `\n.padding(.vertical, ${numToAutoFixed(padding.vertical)})`; + } + // if left and right exists, verify if they are the same after [pxToLayoutSize] conversion. + if (padding.left) { + comp += `\n.padding(.leading, ${numToAutoFixed(padding.left)})`; + } + if (padding.right) { + comp += `\n.padding(.trailing, ${numToAutoFixed(padding.right)})`; + } + if (padding.top) { + comp += `\n.padding(.top, ${numToAutoFixed(padding.top)})`; + } + if (padding.bottom) { + comp += `\n.padding(.bottom, ${numToAutoFixed(padding.bottom)})`; + } + return comp; +}; + +const swiftuiSize = (node) => { + const size = nodeWidthHeight(node, false); + // if width is set as maxWidth, height must also be set as maxHeight (not height) + const shouldExtend = size.height === "full" || size.width === "full"; + // this cast will always be true, since nodeWidthHeight was called with false to relative. + let propWidth = ""; + if (typeof size.width === "number") { + const w = numToAutoFixed(size.width); + if (shouldExtend) { + propWidth = `maxWidth: ${w}`; + } + else { + propWidth = `width: ${w}`; + } + } + else if (size.width === "full") { + propWidth = `maxWidth: .infinity`; + } + let propHeight = ""; + if (typeof size.height === "number") { + const h = numToAutoFixed(size.height); + if (shouldExtend) { + propHeight = `maxHeight: ${h}`; + } + else { + propHeight = `height: ${h}`; + } + } + else if (size.height === "full") { + propHeight = `maxHeight: .infinity`; + } + return [propWidth, propHeight]; +}; + +const swiftuiPosition = (node, parentId = "") => { + // avoid adding Positioned() when parent is not a Stack(), which can happen at the beggining + if (!node.parent || parentId === node.parent.id) { + return ""; + } + // check if view is in a stack. Group and Frames must have more than 1 element + if (node.parent.isRelative === true) { + const [parentX, parentY] = parentCoordinates(node.parent); + const parentCenterX = parentX + node.parent.width / 2; + const parentCenterY = parentY + node.parent.height / 2; + const pointX = node.x - parentX + node.width / 2; + const pointY = node.y - parentY + node.height / 2; + // verify if items are centered, with a small threshold. + // use abs because they can be negative. + if (Math.abs(parentCenterX - pointX) < 2 && + Math.abs(parentCenterY - pointY) < 2) { + return ""; + } + else { + const x = numToAutoFixed(pointX - parentCenterX); + const y = numToAutoFixed(pointY - parentCenterY); + return `\n.offset(x: ${x}, y: ${y})`; + } + } + return ""; +}; + +/** + * https://developer.apple.com/documentation/swiftui/view/opacity(_:) + */ +const swiftuiOpacity = (node) => { + if (node.opacity !== undefined && node.opacity !== 1) { + return `\n.opacity(${numToAutoFixed(node.opacity)})`; + } + return ""; +}; +/** + * https://developer.apple.com/documentation/swiftui/view/hidden() + */ +const swiftuiVisibility = (node) => { + // [when testing] node.visible can be undefined + if (node.visible !== undefined && node.visible === false) { + return `\n.hidden()`; + } + return ""; +}; +/** + * https://developer.apple.com/documentation/swiftui/modifiedcontent/rotationeffect(_:anchor:) + */ +const swiftuiRotation = (node) => { + if (node.rotation !== undefined && Math.round(node.rotation) !== 0) { + return `.rotationEffect(.degrees(${numToAutoFixed(node.rotation)}))`; + } + return ""; +}; +/** + * https://developer.apple.com/documentation/swiftui/blendmode + */ +const swiftuiBlendMode = (node) => { + const fromBlendEnum = blendModeEnum(node); + if (fromBlendEnum) { + return `\n.blendMode(${fromBlendEnum})`; + } + return ""; +}; +const blendModeEnum = (node) => { + switch (node.blendMode) { + case "COLOR": + return ".color"; + case "COLOR_BURN": + return ".colorBurn"; + case "COLOR_DODGE": + return ".colorDodge"; + case "DIFFERENCE": + return ".difference"; + case "EXCLUSION": + return ".exclusion"; + case "HARD_LIGHT": + return ".hardLight"; + case "HUE": + return ".hue"; + case "LIGHTEN": + return ".lighten"; + case "LUMINOSITY": + return ".luminosity"; + case "MULTIPLY": + return ".multiply"; + case "OVERLAY": + return ".overlay"; + case "SATURATION": + return ".saturation"; + case "SCREEN": + return ".screen"; + case "SOFT_LIGHT": + return ".softLight"; + default: + // PASS_THROUGH, NORMAL, LINEAR_DODGE + return ""; + } +}; + +class SwiftuiDefaultBuilder { + constructor() { + this.modifiers = ""; + } + blend(node) { + this.modifiers += swiftuiVisibility(node); + this.modifiers += swiftuiRotation(node); + this.modifiers += swiftuiOpacity(node); + this.modifiers += swiftuiBlendMode(node); + return this; + } + position(node, parentId) { + this.modifiers += swiftuiPosition(node, parentId); + return this; + } + shapeBorder(node) { + this.modifiers += swiftuiShapeStroke(node); + return this; + } + layerBorder(node) { + this.modifiers += swiftuiBorder(node); + return this; + } + shapeBackground(node) { + if (node.type !== "ELLIPSE" && node.type !== "RECTANGLE") { + return this; + } + const fillColor = swiftuiColorFromFills(node.fills); + if (fillColor) { + this.modifiers += `\n.fill(${fillColor})`; + } + return this; + } + layerBackground(node) { + if (node.type !== "FRAME") { + return this; + } + const fillColor = swiftuiColorFromFills(node.fills); + if (fillColor) { + this.modifiers += `\n.background(${fillColor})`; + } + // add corner to the background. It needs to come after the Background, and since we already in the if, let's add it here. + const corner = swiftuiCornerRadius(node); + // it seems this is necessary even in RoundedRectangle + if (corner) { + this.modifiers += `\n.cornerRadius(${corner})`; + } + return this; + } + effects(node) { + if (node.type === "GROUP") { + return this; + } + this.modifiers += swiftuiBlur(node); + this.modifiers += swiftuiShadow(node); + return this; + } + widthHeight(node) { + const [propWidth, propHeight] = swiftuiSize(node); + if (propWidth || propHeight) { + // add comma if propWidth and propHeight both exists + const comma = propWidth && propHeight ? ", " : ""; + this.modifiers += `\n.frame(${propWidth}${comma}${propHeight})`; + } + return this; + } + autoLayoutPadding(node) { + this.modifiers += swiftuiPadding(node); + return this; + } + build() { + return this.modifiers; + } +} + +class SwiftuiTextBuilder extends SwiftuiDefaultBuilder { + constructor() { + super(...arguments); + this.textStyle = (node) => { + // for some reason this must be set before the multilineTextAlignment + if (node.fontName !== figma.mixed) { + const fontWeight = convertFontWeight(node.fontName.style); + if (fontWeight && fontWeight !== "400") { + const weight = swiftuiWeightMatcher(fontWeight); + this.modifiers += `\n.fontWeight(${weight})`; + } + } + // https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/typography/ + const retrievedFont = swiftuiFontMatcher(node); + if (retrievedFont) { + this.modifiers += `\n.font(${retrievedFont})`; + } + // todo might be a good idea to calculate the width based on the font size and check if view is really multi-line + if (node.textAutoResize !== "WIDTH_AND_HEIGHT") { + // it can be confusing, but multilineTextAlignment is always set to left by default. + if (node.textAlignHorizontal === "CENTER") { + this.modifiers += `\n.multilineTextAlignment(.center)`; + } + else if (node.textAlignHorizontal === "RIGHT") { + this.modifiers += `\n.multilineTextAlignment(.trailing)`; + } + } + return this; + }; + this.letterSpacing = (node) => { + const letterSpacing = commonLetterSpacing(node); + if (letterSpacing > 0) { + this.modifiers += `\n.tracking(${numToAutoFixed(letterSpacing)})`; + } + return this; + }; + // the difference between kerning and tracking is that tracking spaces everything, kerning keeps lignatures, + // Figma spaces everything, so we are going to use tracking. + this.lineHeight = (node) => { + const letterHeight = commonLineHeight(node); + if (letterHeight > 0) { + this.modifiers += `\n.lineSpacing(${numToAutoFixed(letterHeight)})`; + } + return this; + }; + this.wrapTextAutoResize = (node) => { + const [propWidth, propHeight] = swiftuiSize(node); + let comp = ""; + if (node.textAutoResize !== "WIDTH_AND_HEIGHT") { + comp += propWidth; + } + if (node.textAutoResize === "NONE") { + // if it is NONE, it isn't WIDTH_AND_HEIGHT, which means the comma must be added. + comp += ", "; + comp += propHeight; + } + if (comp.length > 0) { + const align = this.textAlignment(node); + return `\n.frame(${comp}${align})`; + } + return ""; + }; + // SwiftUI has two alignments for Text, when it is a single line and when it is multiline. This one is for single line. + this.textAlignment = (node) => { + let hAlign = ""; + if (node.textAlignHorizontal === "LEFT") { + hAlign = "leading"; + } + else if (node.textAlignHorizontal === "RIGHT") { + hAlign = "trailing"; + } + let vAlign = ""; + if (node.textAlignVertical === "TOP") { + vAlign = "top"; + } + else if (node.textAlignVertical === "BOTTOM") { + vAlign = "bottom"; + } + if (hAlign && !vAlign) { + // result should be leading or trailing + return `, alignment: .${hAlign}`; + } + else if (!hAlign && vAlign) { + // result should be top or bottom + return `, alignment: .${vAlign}`; + } + else if (hAlign && vAlign) { + // make the first char from hAlign uppercase + const hAlignUpper = hAlign.charAt(0).toUpperCase() + hAlign.slice(1); + // result should be topLeading, topTrailing, bottomLeading or bottomTrailing + return `, alignment: .${vAlign}${hAlignUpper}`; + } + // when they are centered + return ""; + }; + } + reset() { + this.modifiers = ""; + } + textAutoSize(node) { + this.modifiers += this.wrapTextAutoResize(node); + return this; + } + textDecoration(node) { + // https://developer.apple.com/documentation/swiftui/text/underline(_:color:) + if (node.textDecoration === "UNDERLINE") { + this.modifiers += "\n.underline()"; + } + // https://developer.apple.com/documentation/swiftui/text/strikethrough(_:color:) + if (node.textDecoration === "STRIKETHROUGH") { + this.modifiers += "\n.strikethrough()"; + } + // https://developer.apple.com/documentation/swiftui/text/italic() + if (node.fontName !== figma.mixed && + node.fontName.style.toLowerCase().match("italic")) { + this.modifiers += "\n.italic()"; + } + return this; + } +} + +// From https://github.com/sindresorhus/indent-string +const indentString = (str, indentLevel = 1) => { + // const options = { + // includeEmptyLines: false, + // }; + // const regex = options.includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + const regex = /^(?!\s*$)/gm; + return str.replace(regex, " ".repeat(indentLevel * 4)); +}; + +let parentId$4 = ""; +const swiftuiMain = (sceneNode, parentIdSrc = "") => { + parentId$4 = parentIdSrc; + let result = swiftuiWidgetGenerator(sceneNode, 0); + // remove the initial \n that is made in Container. + if (result.length > 0 && result.slice(0, 1) === "\n") { + result = result.slice(1, result.length); + } + return result; +}; +const swiftuiWidgetGenerator = (sceneNode, indentLevel) => { + let comp = ""; + // filter non visible nodes. This is necessary at this step because conversion already happened. + const visibleSceneNode = sceneNode.filter((d) => d.visible !== false); + const sceneLen = visibleSceneNode.length; + visibleSceneNode.forEach((node, index) => { + if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { + comp += swiftuiContainer(node, indentLevel); + } + else if (node.type === "GROUP") { + comp += swiftuiGroup(node, indentLevel); + } + else if (node.type === "FRAME") { + comp += swiftuiFrame(node, indentLevel); + } + else if (node.type === "TEXT") { + comp += swiftuiText(node, indentLevel); + } + // don't add a newline at last element. + if (index < sceneLen - 1) { + comp += "\n"; + } + }); + return comp; +}; +// properties named propSomething always take care of "," +// sometimes a property might not exist, so it doesn't add "," +const swiftuiContainer = (node, indentLevel, children = "") => { + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + if (node.width <= 0 || node.height <= 0) { + return children; + } + const modifiers = new SwiftuiDefaultBuilder() + .shapeBackground(node) + .shapeBorder(node) + .blend(node) + .autoLayoutPadding(node) + .position(node, parentId$4) + .widthHeight(node) + .layerBackground(node) + .layerBorder(node) + .effects(node) + .build(); + let kind = ""; + if (node.type === "RECTANGLE" || (!children && node.type === "FRAME")) { + // return a different kind of Rectangle when cornerRadius exists + const roundedRect = swiftuiRoundedRectangle(node); + if (roundedRect) { + kind = roundedRect; + } + else { + kind = "Rectangle()"; + } + } + else if (node.type === "ELLIPSE") { + kind = "Ellipse()"; + } + else { + kind = children; + } + // only add the newline when result is not empty + const result = (children !== kind ? "\n" : "") + kind + modifiers; + return indentString(result, indentLevel); +}; +const swiftuiGroup = (node, indentLevel) => { + return swiftuiContainer(node, indentLevel, `\nZStack {${widgetGeneratorWithLimits(node, indentLevel)}\n}`); +}; +const swiftuiText = (node, indentLevel) => { + const builder = new SwiftuiTextBuilder(); + let text = node.characters; + if (node.textCase === "LOWER") { + text = text.toLowerCase(); + } + else if (node.textCase === "UPPER") { + text = text.toUpperCase(); + } + const splittedChars = text.split("\n"); + const charsWithLineBreak = splittedChars.length > 1 ? splittedChars.join("\\n") : text; + const modifier = builder + .textDecoration(node) + .textStyle(node) + .textAutoSize(node) + .letterSpacing(node) + .lineHeight(node) + .blend(node) + .layerBackground(node) + .position(node, parentId$4) + .build(); + const result = `\nText("${charsWithLineBreak}")${modifier}`; + return indentString(result, indentLevel); +}; +const swiftuiFrame = (node, indentLevel) => { + // when there is a single children, indent should be zero; [swiftuiContainer] will already assign it. + const updatedIndentLevel = node.children.length === 1 ? 0 : indentLevel + 1; + const children = widgetGeneratorWithLimits(node, updatedIndentLevel); + // if there is only one child, there is no need for a HStack of VStack. + if (node.children.length === 1) { + return swiftuiContainer(node, indentLevel, children); + // return swiftuiContainer(node, rowColumn); + } + else if (node.layoutMode !== "NONE") { + const rowColumn = wrapInDirectionalStack(node, children); + return swiftuiContainer(node, indentLevel, rowColumn); + } + else { + // node.layoutMode === "NONE" && node.children.length > 1 + // children needs to be absolute + return swiftuiContainer(node, indentLevel, `\nZStack {${children}\n}`); + } +}; +const wrapInDirectionalStack = (node, children) => { + const rowOrColumn = node.layoutMode === "HORIZONTAL" ? "HStack" : "VStack"; + // retrieve the align based on the most frequent position of children + // SwiftUI doesn't allow the children to be set individually. And there are different align properties for HStack and VStack. + let layoutAlign = ""; + const mostFreq = node.counterAxisAlignItems; + if (node.layoutMode === "VERTICAL") { + if (mostFreq === "MIN") { + layoutAlign = "alignment: .leading"; + } + else if (mostFreq === "MAX") { + layoutAlign = "alignment: .trailing"; + } + } + else { + if (mostFreq === "MIN") { + layoutAlign = "alignment: .top"; + } + else if (mostFreq === "MAX") { + layoutAlign = "alignment: .bottom"; + } + } + // only add comma and a space if layoutAlign has a value + const comma = layoutAlign ? ", " : ""; + // default spacing for SwiftUI is 16. + const spacing = Math.round(node.itemSpacing) !== 16 + ? `${comma}spacing: ${numToAutoFixed(node.itemSpacing)}` + : ""; + return `\n${rowOrColumn}(${layoutAlign}${spacing}) {${children}\n}`; +}; +// https://stackoverflow.com/a/20762713 +const mostFrequent = (arr) => { + return arr + .sort((a, b) => arr.filter((v) => v === a).length - arr.filter((v) => v === b).length) + .pop(); +}; +// todo should the plugin manually Group items? Ideally, it would detect the similarities and allow a ForEach. +const widgetGeneratorWithLimits = (node, indentLevel) => { + if (node.children.length < 10) { + // standard way + return swiftuiWidgetGenerator(node.children, indentLevel); + } + const chunk = 10; + let strBuilder = ""; + const slicedChildren = node.children.slice(0, 100); + // I believe no one should have more than 100 items in a single nesting level. If you do, please email me. + if (node.children.length > 100) { + strBuilder += `\n// SwiftUI has a 10 item limit in Stacks. By grouping them, it can grow even more. +// It seems, however, that you have more than 100 items at the same level. Wow! +// This is not yet supported; Limiting to the first 100 items...`; + } + // split node.children in arrays of 10, so that it can be Grouped. I feel so guilty of allowing this. + for (let i = 0, j = slicedChildren.length; i < j; i += chunk) { + const chunkChildren = slicedChildren.slice(i, i + chunk); + const strChildren = swiftuiWidgetGenerator(chunkChildren, indentLevel); + strBuilder += `\nGroup {${strChildren}\n}`; + } + return strBuilder; +}; + +const convertGroupToFrame = (node) => { + const newNode = new AltFrameNode(); + newNode.id = node.id; + newNode.name = node.name; + newNode.x = node.x; + newNode.y = node.y; + newNode.width = node.width; + newNode.height = node.height; + newNode.rotation = node.rotation; + newNode.fills = []; + newNode.strokes = []; + newNode.effects = []; + newNode.cornerRadius = 0; + newNode.layoutMode = "NONE"; + newNode.counterAxisSizingMode = "AUTO"; + newNode.primaryAxisSizingMode = "AUTO"; + newNode.primaryAxisAlignItems = "CENTER"; + newNode.primaryAxisAlignItems = "CENTER"; + newNode.clipsContent = false; + newNode.layoutGrids = []; + newNode.gridStyleId = ""; + newNode.guides = []; + newNode.parent = node.parent; + // update the children's x and y position. Modify the 'original' node, then pass them. + updateChildrenXY(node); + newNode.children = node.children; + newNode.children.forEach((d) => { + // update the parent of each child + d.parent = newNode; + }); + // don't need to take care of newNode.parent.children because method is recursive. + // .children =... calls convertGroupToFrame() which returns the correct node + return newNode; +}; +/** + * Update all children's X and Y value from a Group. + * Group uses relative values, while Frame use absolute. So child.x - group.x = child.x on Frames. + * This isn't recursive, because it is going to run from the inner-most to outer-most element. Therefore, it would calculate wrongly otherwise. + * + * This must be called with a GroupNode. Param accepts anything because of the recurison. + * Result of a Group with x,y = (250, 250) and child at (260, 260) must be child at (10, 10) + */ +const updateChildrenXY = (node) => { + // the second condition is necessary, so it can convert the root + if (node.type === "GROUP") { + node.children.forEach((d) => { + d.x = d.x - node.x; + d.y = d.y - node.y; + updateChildrenXY(d); + }); + return node; + } + else { + return node; + } +}; + +/** + * Add AutoLayout attributes if layout has items aligned (either vertically or horizontally). + * To make the calculation, the average position of every child, ordered, needs to pass a threshold. + * If it fails for both X and Y axis, there is no AutoLayout and return it unchanged. + * If it finds, add the correct attributes. When original node is a Group, + * convert it to Frame before adding the attributes. Group doesn't have AutoLayout properties. + */ +const convertToAutoLayout = (node) => { + // only go inside when AutoLayout is not already set. + if (("layoutMode" in node && + node.layoutMode === "NONE" && + node.children.length > 0) || + node.type === "GROUP") { + const [orderedChildren, direction, itemSpacing] = reorderChildrenIfAligned(node.children); + node.children = orderedChildren; + if (direction === "NONE" && node.children.length > 1) { + node.isRelative = true; + } + if (direction === "NONE" && node.children.length !== 1) { + // catches when children is 0 or children is larger than 1 + return node; + } + // if node is a group, convert to frame + if (node.type === "GROUP") { + node = convertGroupToFrame(node); + } + if (direction === "NONE" && node.children.length === 1) { + // Add fake AutoLayout when there is a single item. This is done for the Padding. + node.layoutMode = "HORIZONTAL"; + } + else { + node.layoutMode = direction; + } + node.itemSpacing = itemSpacing > 0 ? itemSpacing : 0; + const padding = detectAutoLayoutPadding(node); + node.paddingTop = Math.max(padding.top, 0); + node.paddingBottom = Math.max(padding.bottom, 0); + node.paddingLeft = Math.max(padding.left, 0); + node.paddingRight = Math.max(padding.right, 0); + // set children to INHERIT or STRETCH + node.children.map((d) => { + // @ts-ignore current node can't be AltGroupNode because it was converted into AltFrameNode + layoutAlignInChild(d, node); + }); + const allChildrenDirection = node.children.map((d) => + // @ts-ignore current node can't be AltGroupNode because it was converted into AltFrameNode + primaryAxisDirection(d, node)); + const primaryDirection = allChildrenDirection.map((d) => d.primary); + const counterDirection = allChildrenDirection.map((d) => d.counter); + // @ts-ignore it is never going to be undefined. + node.primaryAxisAlignItems = mostFrequent(primaryDirection); + // @ts-ignore it is never going to be undefined. + node.counterAxisAlignItems = mostFrequent(counterDirection); + node.counterAxisSizingMode = "FIXED"; + node.primaryAxisSizingMode = "FIXED"; + } + return node; +}; +/** + * Standard average calculation. Length must be > 0 + */ +const average = (arr) => arr.reduce((p, c) => p + c, 0) / arr.length; +/** + * Check the average of children positions against this threshold; + * This allows a small tolerance, which is useful when items are slightly overlayed. + * If you set this lower, layouts will get more responsive but with less visual fidelity. + */ +const threshold = -2; +/** + * Verify if children are sorted by their relative position and return them sorted, if identified. + */ +const reorderChildrenIfAligned = (children) => { + if (children.length === 1) { + return [[...children], "NONE", 0]; + } + const updateChildren = [...children]; + const [visit, avg] = shouldVisit(updateChildren); + // check against a threshold + if (visit === "VERTICAL") { + // if all elements are horizontally aligned + return [updateChildren.sort((a, b) => a.y - b.y), "VERTICAL", avg]; + } + else { + if (visit === "HORIZONTAL") { + // if all elements are vertically aligned + return [updateChildren.sort((a, b) => a.x - b.x), "HORIZONTAL", avg]; + } + } + return [updateChildren, "NONE", 0]; +}; +/** + * Checks if layout is horizontally or vertically aligned. + * First verify if all items are vertically aligned in Y axis (spacing > 0), then for X axis, then the average for Y and finally the average for X. + * If no correspondence is found, returns "NONE". + * In a previous version, it used a "standard deviation", but "average" performed better. + */ +const shouldVisit = (children) => { + const intervalY = calculateInterval(children, "y"); + const intervalX = calculateInterval(children, "x"); + const avgX = average(intervalX); + const avgY = average(intervalY); + if (!intervalY.every((d) => d >= threshold)) { + if (!intervalX.every((d) => d >= threshold)) { + if (avgY <= threshold) { + if (avgX <= threshold) { + return ["NONE", 0]; + } + return ["HORIZONTAL", avgX]; + } + return ["VERTICAL", avgY]; + } + return ["HORIZONTAL", avgX]; + } + return ["VERTICAL", avgY]; +}; +// todo improve this method to try harder. Idea: maybe use k-means or hierarchical cluster? +/** + * This function calculates the distance (interval) between items. + * Example: for [item]--8--[item]--8--[item], the result is [8, 8] + */ +const calculateInterval = (children, xOrY) => { + const hOrW = xOrY === "x" ? "width" : "height"; + // sort children based on X or Y values + const sorted = [...children].sort((a, b) => a[xOrY] - b[xOrY]); + // calculate the distance between values (either vertically or horizontally) + const interval = []; + for (let i = 0; i < sorted.length - 1; i++) { + interval.push(sorted[i + 1][xOrY] - (sorted[i][xOrY] + sorted[i][hOrW])); + } + return interval; +}; +/** + * Calculate the Padding. + * This is very verbose, but also more performant than calculating them independently. + */ +const detectAutoLayoutPadding = (node) => { + // this need to be run before VERTICAL or HORIZONTAL + if (node.children.length === 1) { + // left padding is first element's y value + const left = node.children[0].x; + const right = node.width - (node.children[0].x + node.children[0].width); + const top = node.children[0].y; + const bottom = node.height - (node.children[0].y + node.children[0].height); + // return the smallest padding in each axis + return { + left: left, + right: right, + top: top, + bottom: bottom, + }; + } + else if (node.layoutMode === "VERTICAL") { + // top padding is first element's y value + const top = node.children[0].y; + // bottom padding is node height - last position + last height + const last = node.children[node.children.length - 1]; + const bottom = node.height - (last.y + last.height); + // the closest value to the left border + const left = Math.min(...node.children.map((d) => d.x)); + // similar to [bottom] calculation, but using height and getting the minimum + const right = Math.min(...node.children.map((d) => node.width - (d.width + d.x))); + // return the smallest padding in each axis + return { + left: left, + right: right, + top: top, + bottom: bottom, + }; + } + else { + // node.layoutMode === "HORIZONTAL" + // left padding is first element's y value + const left = node.children[0].x; + // right padding is node width - last position + last width + const last = node.children[node.children.length - 1]; + const right = node.width - (last.x + last.width); + // the closest value to the top border + const top = Math.min(...node.children.map((d) => d.y)); + // similar to [right] calculation, but using height and getting the minimum + const bottom = Math.min(...node.children.map((d) => node.height - (d.height + d.y))); + // return the smallest padding in each axis + return { + left: left, + right: right, + top: top, + bottom: bottom, + }; + } +}; +/** + * Detect if children stretch or inherit. + */ +const layoutAlignInChild = (node, parentNode) => { + const sameWidth = node.width - 2 > + parentNode.width - parentNode.paddingLeft - parentNode.paddingRight; + const sameHeight = node.height - 2 > + parentNode.height - parentNode.paddingTop - parentNode.paddingBottom; + if (parentNode.layoutMode === "VERTICAL") { + node.layoutAlign = sameWidth ? "STRETCH" : "INHERIT"; + } + else { + node.layoutAlign = sameHeight ? "STRETCH" : "INHERIT"; + } + // with custom AutoLayout, this is never going to be 1. + node.layoutGrow = 0; +}; +const primaryAxisDirection = (node, parentNode) => { + // parentNode.layoutMode can't be NONE. + const nodeCenteredPosX = node.x + node.width / 2; + const parentCenteredPosX = parentNode.width / 2; + const centerXPosition = nodeCenteredPosX - parentCenteredPosX; + const nodeCenteredPosY = node.y + node.height / 2; + const parentCenteredPosY = parentNode.height / 2; + const centerYPosition = nodeCenteredPosY - parentCenteredPosY; + if (parentNode.layoutMode === "VERTICAL") { + return { + primary: getPaddingDirection(centerYPosition), + counter: getPaddingDirection(centerXPosition), + }; + } + else { + return { + primary: getPaddingDirection(centerXPosition), + counter: getPaddingDirection(centerYPosition), + }; + } +}; +const getPaddingDirection = (position) => { + // allow a small threshold + if (position < -4) { + return "MIN"; + } + else if (position > 4) { + return "MAX"; + } + else { + return "CENTER"; + } +}; + +/** + * Identify all nodes that are inside Rectangles and transform those Rectangles into Frames containing those nodes. + */ +const convertNodesOnRectangle = (node) => { + if (node.children.length < 2) { + return node; + } + if (!node.id) { + throw new Error("Node is missing an id! This error should only happen in tests."); + } + const colliding = retrieveCollidingItems(node.children); + const parentsKeys = Object.keys(colliding); + // start with all children. This is going to be filtered. + let updatedChildren = [...node.children]; + parentsKeys.forEach((key) => { + // dangerous cast, but this is always true + const parentNode = node.children.find((d) => d.id === key); + // retrieve the position. Key should always be at the left side, so even when other items are removed, the index is kept the same. + const indexPosition = updatedChildren.findIndex((d) => d.id === key); + // filter the children to remove those that are being modified + updatedChildren = updatedChildren.filter((d) => !colliding[key].map((dd) => dd.id).includes(d.id) && key !== d.id); + const frameNode = convertRectangleToFrame(parentNode); + // todo when the soon-to-be-parent is larger than its parent, things get weird. Happens, for example, when a large image is used in the background. Should this be handled or is this something user should never do? + frameNode.children = [...colliding[key]]; + colliding[key].forEach((d) => { + d.parent = frameNode; + d.x = d.x - frameNode.x; + d.y = d.y - frameNode.y; + }); + // try to convert the children to AutoLayout, and insert back at updatedChildren. + updatedChildren.splice(indexPosition, 0, convertToAutoLayout(frameNode)); + }); + if (updatedChildren.length > 0) { + node.children = updatedChildren; + } + // convert the resulting node to AutoLayout. + node = convertToAutoLayout(node); + return node; +}; +const convertRectangleToFrame = (rect) => { + // if a Rect with elements inside were identified, extract this Rect + // outer methods are going to use it. + const frameNode = new AltFrameNode(); + frameNode.parent = rect.parent; + frameNode.width = rect.width; + frameNode.height = rect.height; + frameNode.x = rect.x; + frameNode.y = rect.y; + frameNode.rotation = rect.rotation; + frameNode.layoutMode = "NONE"; + // opacity should be ignored, else it will affect children + // when invisible, add the layer but don't fill it; he designer might use invisible layers for alignment. + // visible can be undefined in tests + if (rect.visible !== false) { + frameNode.fills = rect.fills; + frameNode.fillStyleId = rect.fillStyleId; + frameNode.strokes = rect.strokes; + frameNode.strokeStyleId = rect.strokeStyleId; + frameNode.effects = rect.effects; + frameNode.effectStyleId = rect.effectStyleId; + } + // inner Rectangle shall get a FIXED size + frameNode.counterAxisAlignItems = "MIN"; + frameNode.counterAxisSizingMode = "FIXED"; + frameNode.primaryAxisAlignItems = "MIN"; + frameNode.primaryAxisSizingMode = "FIXED"; + frameNode.strokeAlign = rect.strokeAlign; + frameNode.strokeCap = rect.strokeCap; + frameNode.strokeJoin = rect.strokeJoin; + frameNode.strokeMiterLimit = rect.strokeMiterLimit; + frameNode.strokeWeight = rect.strokeWeight; + frameNode.cornerRadius = rect.cornerRadius; + frameNode.cornerSmoothing = rect.cornerSmoothing; + frameNode.topLeftRadius = rect.topLeftRadius; + frameNode.topRightRadius = rect.topRightRadius; + frameNode.bottomLeftRadius = rect.bottomLeftRadius; + frameNode.bottomRightRadius = rect.bottomRightRadius; + frameNode.id = rect.id; + frameNode.name = rect.name; + return frameNode; +}; +/** + * Iterate over each Rectangle and check if it has any child on top. + * This is O(n^2), but is optimized to only do j=i+1 until length, and avoid repeated entries. + * A Node can only have a single parent. The order is defined by layer order. + */ +const retrieveCollidingItems = (children) => { + const used = {}; + const groups = {}; + for (let i = 0; i < children.length - 1; i++) { + const item1 = children[i]; + // ignore items that are not Rectangles + if (item1.type !== "RECTANGLE") { + continue; + } + for (let j = i + 1; j < children.length; j++) { + const item2 = children[j]; + if (!used[item2.id] && + item1.x <= item2.x && + item1.y <= item2.y && + item1.x + item1.width >= item2.x + item2.width && + item1.y + item1.height >= item2.y + item2.height) { + if (!groups[item1.id]) { + groups[item1.id] = [item2]; + } + else { + groups[item1.id].push(item2); + } + used[item2.id] = true; + } + } + } + return groups; +}; + +const frameNodeToAlt = (node, altParent = null) => { + if (node.children.length === 0) { + // if it has no children, convert frame to rectangle + return frameToRectangleNode(node, altParent); + } + const altNode = new AltFrameNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertDefaultShape(altNode, node); + convertFrame(altNode, node); + convertCorner(altNode, node); + convertRectangleCorner(altNode, node); + altNode.children = convertIntoAltNodes(node.children, altNode); + return convertToAutoLayout(convertNodesOnRectangle(altNode)); +}; +// auto convert Frame to Rectangle when Frame has no Children +const frameToRectangleNode = (node, altParent) => { + const newNode = new AltRectangleNode(); + newNode.id = node.id; + newNode.name = node.name; + if (altParent) { + newNode.parent = altParent; + } + convertDefaultShape(newNode, node); + convertRectangleCorner(newNode, node); + convertCorner(newNode, node); + return newNode; +}; +const convertIntoAltNodes = (sceneNode, altParent = null) => { + const mapped = sceneNode.map((node) => { + if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { + let altNode; + if (node.type === "RECTANGLE") { + altNode = new AltRectangleNode(); + convertRectangleCorner(altNode, node); + } + else { + altNode = new AltEllipseNode(); + } + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertDefaultShape(altNode, node); + convertCorner(altNode, node); + return altNode; + } + else if (node.type === "LINE") { + const altNode = new AltRectangleNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertDefaultShape(altNode, node); + // Lines have a height of zero, but they must have a height, so add 1. + altNode.height = 1; + // Let them be CENTER, since on Lines this property is ignored. + altNode.strokeAlign = "CENTER"; + // Remove 1 since it now has a height of 1. It won't be visually perfect, but will be almost. + altNode.strokeWeight = altNode.strokeWeight - 1; + return altNode; + } + else if (node.type === "FRAME" || + node.type === "INSTANCE" || + node.type === "COMPONENT") { + const iconToRect = iconToRectangle(node, altParent); + if (iconToRect != null) { + return iconToRect; + } + return frameNodeToAlt(node, altParent); + } + else if (node.type === "GROUP") { + if (node.children.length === 1 && node.visible !== false) { + // if Group is visible and has only one child, Group should disappear. + // there will be a single value anyway. + return convertIntoAltNodes(node.children, altParent)[0]; + } + const iconToRect = iconToRectangle(node, altParent); + if (iconToRect != null) { + return iconToRect; + } + const altNode = new AltGroupNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertLayout(altNode, node); + convertBlend(altNode, node); + altNode.children = convertIntoAltNodes(node.children, altNode); + // try to find big rect and regardless of that result, also try to convert to autolayout. + // There is a big chance this will be returned as a Frame + // also, Group will always have at least 2 children. + return convertNodesOnRectangle(altNode); + } + else if (node.type === "TEXT") { + const altNode = new AltTextNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertDefaultShape(altNode, node); + convertIntoAltText(altNode, node); + return altNode; + } + else if (node.type === "VECTOR") { + const altNode = new AltRectangleNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertDefaultShape(altNode, node); + // Vector support is still missing. Meanwhile, add placeholder. + altNode.cornerRadius = 8; + if (altNode.fills === figma.mixed || altNode.fills.length === 0) { + // Use rose[400] from Tailwind 2 when Vector has no color. + altNode.fills = [ + { + type: "SOLID", + color: { + r: 0.5, + g: 0.23, + b: 0.27, + }, + visible: true, + opacity: 0.5, + blendMode: "NORMAL", + }, + ]; + } + return altNode; + } + return null; + }); + return mapped.filter(notEmpty); +}; +const iconToRectangle = (node, altParent) => { + if (node.children.every((d) => d.type === "VECTOR")) { + const altNode = new AltRectangleNode(); + altNode.id = node.id; + altNode.name = node.name; + if (altParent) { + altNode.parent = altParent; + } + convertBlend(altNode, node); + // width, x, y + convertLayout(altNode, node); + // Vector support is still missing. Meanwhile, add placeholder. + altNode.cornerRadius = 8; + altNode.strokes = []; + altNode.strokeWeight = 0; + altNode.strokeMiterLimit = 0; + altNode.strokeAlign = "CENTER"; + altNode.strokeCap = "NONE"; + altNode.strokeJoin = "BEVEL"; + altNode.dashPattern = []; + altNode.fillStyleId = ""; + altNode.strokeStyleId = ""; + altNode.fills = [ + { + type: "IMAGE", + imageHash: "", + scaleMode: "FIT", + visible: true, + opacity: 0.5, + blendMode: "NORMAL", + }, + ]; + return altNode; + } + return null; +}; +const convertLayout = (altNode, node) => { + // Get the correct X/Y position when rotation is applied. + // This won't guarantee a perfect position, since we would still + // need to calculate the offset based on node width/height to compensate, + // which we are not currently doing. However, this is a lot better than nothing and will help LineNode. + if (node.rotation !== undefined && Math.round(node.rotation) !== 0) { + const boundingRect = getBoundingRect(node); + altNode.x = boundingRect.x; + altNode.y = boundingRect.y; + } + else { + altNode.x = node.x; + altNode.y = node.y; + } + altNode.width = node.width; + altNode.height = node.height; + altNode.rotation = node.rotation; + altNode.layoutAlign = node.layoutAlign; + altNode.layoutGrow = node.layoutGrow; +}; +const convertFrame = (altNode, node) => { + altNode.layoutMode = node.layoutMode; + altNode.primaryAxisSizingMode = node.primaryAxisSizingMode; + altNode.counterAxisSizingMode = node.counterAxisSizingMode; + // Fix this: https://stackoverflow.com/questions/57859754/flexbox-space-between-but-center-if-one-element + // It affects HTML, Tailwind, Flutter and possibly SwiftUI. So, let's be consistent. + if (node.primaryAxisAlignItems === "SPACE_BETWEEN" && + node.children.length === 1) { + altNode.primaryAxisAlignItems = "CENTER"; + } + else { + altNode.primaryAxisAlignItems = node.primaryAxisAlignItems; + } + altNode.counterAxisAlignItems = node.counterAxisAlignItems; + altNode.paddingLeft = node.paddingLeft; + altNode.paddingRight = node.paddingRight; + altNode.paddingTop = node.paddingTop; + altNode.paddingBottom = node.paddingBottom; + altNode.itemSpacing = node.itemSpacing; + altNode.layoutGrids = node.layoutGrids; + altNode.gridStyleId = node.gridStyleId; + altNode.clipsContent = node.clipsContent; + altNode.guides = node.guides; +}; +const convertGeometry = (altNode, node) => { + altNode.fills = node.fills; + altNode.strokes = node.strokes; + altNode.strokeWeight = node.strokeWeight; + altNode.strokeMiterLimit = node.strokeMiterLimit; + altNode.strokeAlign = node.strokeAlign; + altNode.strokeCap = node.strokeCap; + altNode.strokeJoin = node.strokeJoin; + altNode.dashPattern = node.dashPattern; + altNode.fillStyleId = node.fillStyleId; + altNode.strokeStyleId = node.strokeStyleId; +}; +const convertBlend = (altNode, node) => { + altNode.opacity = node.opacity; + altNode.blendMode = node.blendMode; + altNode.isMask = node.isMask; + altNode.effects = node.effects; + altNode.effectStyleId = node.effectStyleId; + altNode.visible = node.visible; +}; +const convertDefaultShape = (altNode, node) => { + // opacity, visible + convertBlend(altNode, node); + // fills, strokes + convertGeometry(altNode, node); + // width, x, y + convertLayout(altNode, node); +}; +const convertCorner = (altNode, node) => { + altNode.cornerRadius = node.cornerRadius; + altNode.cornerSmoothing = node.cornerSmoothing; +}; +const convertRectangleCorner = (altNode, node) => { + altNode.topLeftRadius = node.topLeftRadius; + altNode.topRightRadius = node.topRightRadius; + altNode.bottomLeftRadius = node.bottomLeftRadius; + altNode.bottomRightRadius = node.bottomRightRadius; +}; +const convertIntoAltText = (altNode, node) => { + altNode.textAlignHorizontal = node.textAlignHorizontal; + altNode.textAlignVertical = node.textAlignVertical; + altNode.paragraphIndent = node.paragraphIndent; + altNode.paragraphSpacing = node.paragraphSpacing; + altNode.fontSize = node.fontSize; + altNode.fontName = node.fontName; + altNode.textCase = node.textCase; + altNode.textDecoration = node.textDecoration; + altNode.letterSpacing = node.letterSpacing; + altNode.textAutoResize = node.textAutoResize; + altNode.characters = node.characters; + altNode.lineHeight = node.lineHeight; +}; +function notEmpty(value) { + return value !== null && value !== undefined; +} +const applyMatrixToPoint = (matrix, point) => { + return [ + point[0] * matrix[0][0] + point[1] * matrix[0][1] + matrix[0][2], + point[0] * matrix[1][0] + point[1] * matrix[1][1] + matrix[1][2], + ]; +}; +/** + * this function return a bounding rect for an nodes + */ +// x/y absolute coordinates +// height/width +// x2/y2 bottom right coordinates +const getBoundingRect = (node) => { + const halfHeight = node.height / 2; + const halfWidth = node.width / 2; + const [[c0, s0, x], [s1, c1, y]] = node.absoluteTransform; + const matrix = [ + [c0, s0, x + halfWidth * c0 + halfHeight * s0], + [s1, c1, y + halfWidth * s1 + halfHeight * c1], + ]; + // the coordinates of the corners of the rectangle + const XY = { + x: [1, -1, 1, -1], + y: [1, -1, -1, 1], + }; + // fill in + for (let i = 0; i <= 3; i++) { + const a = applyMatrixToPoint(matrix, [ + XY.x[i] * halfWidth, + XY.y[i] * halfHeight, + ]); + XY.x[i] = a[0]; + XY.y[i] = a[1]; + } + XY.x.sort((a, b) => a - b); + XY.y.sort((a, b) => a - b); + return { + x: XY.x[0], + y: XY.y[0], + }; +}; + +// from https://dev.to/alvaromontoro/building-your-own-color-contrast-checker-4j7o +const calculateContrastRatio = (color1, color2) => { + const color1luminance = luminance(color1); + const color2luminance = luminance(color2); + const contrast = color1luminance > color2luminance + ? (color2luminance + 0.05) / (color1luminance + 0.05) + : (color1luminance + 0.05) / (color2luminance + 0.05); + return 1 / contrast; +}; +function luminance(color) { + const a = [color.r * 255, color.g * 255, color.b * 255].map(function (v) { + v /= 255; + return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; +} +const deepFlatten = (arr) => { + let result = []; + arr.forEach((d) => { + if ("children" in d) { + result.push(d); + result = result.concat(deepFlatten(d.children)); + } + else { + result.push(d); + } + }); + return result; +}; + +const retrieveGenericSolidUIColors = (sceneNode, framework) => { + const selectedChildren = deepFlatten(sceneNode); + const colorStr = []; + // collect all fills and strokes SOLID colors + selectedChildren.forEach((d) => { + if ("fills" in d) { + const fills = convertSolidColor(d.fills, framework, d.type); + if (fills) { + colorStr.push(...fills); + } + } + if ("strokes" in d) { + const strokes = convertSolidColor(d.strokes, framework, d.type); + if (strokes) { + colorStr.push(...strokes); + } + } + }); + // retrieve only unique colors + // from https://stackoverflow.com/a/18923480/4418073 + const unique = {}; + const distinct = []; + colorStr.forEach(function (x) { + if (!unique[x.hex]) { + distinct.push(x); + unique[x.hex] = true; + } + }); + return distinct.sort((a, b) => a.hex.localeCompare(b.hex)); +}; +const convertSolidColor = (fills, framework, nodeType) => { + // shortcut to be used for calculateContrastRatio. + const black = { + r: 0, + g: 0, + b: 0, + }; + const white = { + r: 1, + g: 1, + b: 1, + }; + if (fills && fills !== figma.mixed && fills.length > 0) { + return fills + .map((fill) => { + var _a; + if (fill.type === "SOLID") { + let exported = ""; + const opacity = (_a = fill.opacity) !== null && _a !== void 0 ? _a : 1.0; + if (framework === "flutter") { + exported = flutterColor(fill.color, opacity); + return { + hex: rgbTo6hex(fill.color), + colorName: "", + exported: exported, + contrastBlack: calculateContrastRatio(fill.color, black), + contrastWhite: calculateContrastRatio(fill.color, white), + }; + } + else if (framework === "html") { + exported = htmlColor(fill.color, opacity); + } + else if (framework === "tailwind") { + const kind = nodeType === "TEXT" ? "text" : "bg"; + exported = tailwindSolidColor(fill, kind); + const hex = rgbTo6hex(fill.color); + const hexNearestColor = tailwindNearestColor(hex); + // special case since each color has a name. + return { + hex: hex, + colorName: tailwindColors[hexNearestColor], + exported: exported, + contrastBlack: 0, + contrastWhite: 0, + }; + } + else if (framework === "swiftui") { + exported = swiftuiColor(fill.color, opacity); + } + return { + hex: rgbTo6hex(fill.color), + colorName: "", + exported: exported, + contrastBlack: 0, + contrastWhite: 0, + }; + } + }) + .filter(notEmpty); + } + return null; +}; +const retrieveGenericLinearGradients = (sceneNode, framework) => { + const selectedChildren = deepFlatten(sceneNode); + const colorStr = []; + // collect all Linear Gradient colors from fills and strokes + selectedChildren.forEach((d) => { + if ("fills" in d) { + const fills = convertGradient(d.fills, framework); + if (fills) { + colorStr.push(...fills); + } + } + if ("strokes" in d) { + const strokes = convertGradient(d.strokes, framework); + if (strokes) { + colorStr.push(...strokes); + } + } + }); + // retrieve only unique colors + // from https://stackoverflow.com/a/18923480/4418073 + const unique = {}; + const distinct = []; + colorStr.forEach(function (x) { + if (!unique[x.css]) { + distinct.push(x); + unique[x.css] = true; + } + }); + return distinct; +}; +const convertGradient = (fills, framework) => { + // kind can be text, bg, border... + // [when testing] fills can be undefined + if (fills && fills !== figma.mixed && fills.length > 0) { + return fills + .map((fill) => { + if (fill.type === "GRADIENT_LINEAR") { + let exported = ""; + switch (framework) { + case "flutter": + exported = flutterGradient(fill); + break; + case "html": + exported = htmlGradient(fill); + break; + case "tailwind": + exported = tailwindGradient(fill); + break; + case "swiftui": + exported = swiftuiGradient(fill); + break; + } + return { + css: htmlGradient(fill), + exported: exported, + }; + } + }) + .filter(notEmpty); + } + return null; +}; + +const htmlSize = (node, isJSX) => { + return htmlSizePartial(node, isJSX).join(""); +}; +const htmlSizePartial = (node, isJsx) => { + const size = nodeWidthHeight(node, false); + let w = ""; + if (typeof size.width === "number") { + w += formatWithJSX("width", isJsx, size.width); + } + else if (size.width === "full") { + if (node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "HORIZONTAL") { + w += formatWithJSX("flex", isJsx, "1 1 0%"); + } + else { + w += formatWithJSX("width", isJsx, "100%"); + } + } + let h = ""; + if (typeof size.height === "number") { + h += formatWithJSX("height", isJsx, size.height); + } + else if (typeof size.height === "string") { + if (node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "VERTICAL") { + h += formatWithJSX("flex", isJsx, "1 1 0%"); + } + else { + h += formatWithJSX("height", isJsx, "100%"); + } + } + return [w, h]; +}; + +const htmlTextSize = (node, isJsx) => { + const [width, height] = htmlSizePartial(node, isJsx); + let comp = ""; + if (node.textAutoResize !== "WIDTH_AND_HEIGHT") { + comp += width; + } + if (node.textAutoResize === "NONE") { + comp += height; + } + return comp; +}; + +/** + * https://tailwindcss.com/docs/box-shadow/ + * example: shadow + */ +const htmlShadow = (node) => { + // [when testing] node.effects can be undefined + if (node.effects && node.effects.length > 0) { + const dropShadow = node.effects.filter((d) => (d.type === "DROP_SHADOW" || d.type === "INNER_SHADOW") && + d.visible !== false); + // simple shadow from tailwind + if (dropShadow.length > 0) { + const shadow = dropShadow[0]; + const x = shadow.offset.x; + const y = shadow.offset.y; + const color = htmlColor(shadow.color, shadow.color.a); + const blur = shadow.radius; + const spread = shadow.spread ? `${shadow.spread}px ` : ""; + const inner = shadow.type === "INNER_SHADOW" ? " inset" : ""; + return `${x}px ${y}px ${blur}px ${spread}${color}${inner}`; + } + } + return ""; +}; + +/** + * https://tailwindcss.com/docs/opacity/ + * default is [0, 25, 50, 75, 100], but '100' will be ignored: + * if opacity was changed, let it be visible. Therefore, 98% => 75 + * node.opacity is between [0, 1]; output will be [0, 100] + */ +const htmlOpacity = (node, isJsx) => { + // [when testing] node.opacity can be undefined + if (node.opacity !== undefined && node.opacity !== 1) { + // formatWithJSX is not called here because opacity unit doesn't end in px. + if (isJsx) { + return `opacity: ${numToAutoFixed(node.opacity)}, `; + } + else { + return `opacity: ${numToAutoFixed(node.opacity)}; `; + } + } + return ""; +}; +/** + * https://tailwindcss.com/docs/visibility/ + * example: invisible + */ +const htmlVisibility = (node, isJsx) => { + // [when testing] node.visible can be undefined + // When something is invisible in Figma, it isn't gone. Groups can make use of it. + // Therefore, instead of changing the visibility (which causes bugs in nested divs), + // this plugin is going to ignore color and stroke + if (node.visible !== undefined && !node.visible) { + return formatWithJSX("visibility", isJsx, "hidden"); + } + return ""; +}; +/** + * https://tailwindcss.com/docs/rotate/ + * default is [-180, -90, -45, 0, 45, 90, 180], but '0' will be ignored: + * if rotation was changed, let it be perceived. Therefore, 1 => 45 + */ +const htmlRotation = (node, isJsx) => { + // that's how you convert angles to clockwise radians: angle * -pi/180 + // using 3.14159 as Pi for enough precision and to avoid importing math lib. + if (node.rotation !== undefined && Math.round(node.rotation) !== 0) { + return formatWithJSX("transform", isJsx, `rotate(${numToAutoFixed(node.rotation)}deg)`); + } + return ""; +}; + +const htmlPosition = (node, parentId = "") => { + // don't add position to the first (highest) node in the tree + if (!node.parent || parentId === node.parent.id) { + return ""; + } + // Group + if (node.parent.isRelative === true) { + // position is absolute, needs to be relative + return "absoluteManualLayout"; + } + return ""; +}; + +/** + * https://tailwindcss.com/docs/margin/ + * example: px-2 py-8 + */ +const htmlPadding = (node, isJsx) => { + const padding = commonPadding(node); + if (padding === null) { + return ""; + } + if ("all" in padding) { + return formatWithJSX("padding", isJsx, padding.all); + } + let comp = ""; + // horizontal and vertical, as the default AutoLayout + if (padding.horizontal) { + comp += formatWithJSX("padding-left", isJsx, padding.horizontal); + comp += formatWithJSX("padding-right", isJsx, padding.horizontal); + } + if (padding.vertical) { + comp += formatWithJSX("padding-top", isJsx, padding.vertical); + comp += formatWithJSX("padding-bottom", isJsx, padding.vertical); + } + if (padding.top) { + comp += formatWithJSX("padding-top", isJsx, padding.top); + } + if (padding.bottom) { + comp += formatWithJSX("padding-bottom", isJsx, padding.bottom); + } + if (padding.left) { + comp += formatWithJSX("padding-left", isJsx, padding.left); + } + if (padding.right) { + comp += formatWithJSX("padding-right", isJsx, padding.right); + } + // todo use REM + return comp; +}; + +/** + * https://tailwindcss.com/docs/border-radius/ + * example: rounded-sm + * example: rounded-tr-lg + */ +const htmlBorderRadius = (node, isJsx) => { + if (node.type === "ELLIPSE") { + return formatWithJSX("border-radius", isJsx, 9999); + } + else if ((!("cornerRadius" in node) && !("topLeftRadius" in node)) || + (node.cornerRadius === figma.mixed && node.topLeftRadius === undefined) || + node.cornerRadius === 0) { + // the second condition is used on tests. On Figma, topLeftRadius is never undefined. + // ignore when 0, undefined or non existent + return ""; + } + let comp = ""; + if (node.cornerRadius !== figma.mixed) { + comp += formatWithJSX("border-radius", isJsx, node.cornerRadius); + } + else { + // todo optimize for tr/tl/br/bl instead of t/r/l/b + if (node.topLeftRadius !== 0) { + comp += formatWithJSX("border-top-left-radius", isJsx, node.topLeftRadius); + } + if (node.topRightRadius !== 0) { + comp += formatWithJSX("border-top-right-radius", isJsx, node.topRightRadius); + } + if (node.bottomLeftRadius !== 0) { + comp += formatWithJSX("border-bottom-left-radius", isJsx, node.bottomLeftRadius); + } + if (node.bottomRightRadius !== 0) { + comp += formatWithJSX("border-bottom-right-radius", isJsx, node.bottomRightRadius); + } + } + return comp; +}; + +class HtmlDefaultBuilder { + constructor(node, showLayerName, optIsJSX) { + this.name = ""; + this.hasFixedSize = false; + this.retrieveFill = (paintArray) => { + // visible is true or undefinied (tests) + if (this.visible !== false) { + const gradient = htmlGradientFromFills(paintArray); + if (gradient) { + return { prop: gradient, kind: "gradient" }; + } + else { + const color = htmlColorFromFills(paintArray); + if (color) { + return { prop: color, kind: "solid" }; + } + } + } + return { prop: "", kind: "none" }; + }; + this.isJSX = optIsJSX; + this.style = ""; + this.visible = node.visible; + if (showLayerName) { + this.name = node.name.replace(" ", ""); + } + } + blend(node) { + this.style += htmlVisibility(node, this.isJSX); + this.style += htmlRotation(node, this.isJSX); + this.style += htmlOpacity(node, this.isJSX); + return this; + } + border(node) { + // add border-radius: 10, for example. + this.style += htmlBorderRadius(node, this.isJSX); + // add border: 10px solid, for example. + if (node.strokes && node.strokes.length > 0 && node.strokeWeight > 0) { + const fill = this.retrieveFill(node.strokes); + const weight = node.strokeWeight; + if (node.dashPattern.length > 0) { + this.style += formatWithJSX("border-style", this.isJSX, "dotted"); + } + else { + this.style += formatWithJSX("border-style", this.isJSX, "solid"); + } + this.style += formatWithJSX("border-width", this.isJSX, weight); + this.style += formatWithJSX("border-style", this.isJSX, "solid"); + if (fill.kind === "gradient") { + // Gradient requires these. + this.style += formatWithJSX("border-image-slice", this.isJSX, 1); + this.style += formatWithJSX("border-image-source", this.isJSX, fill.prop); + } + else { + this.style += formatWithJSX("border-color", this.isJSX, fill.prop); + } + } + return this; + } + position(node, parentId, isRelative = false) { + const position = htmlPosition(node, parentId); + if (position === "absoluteManualLayout" && node.parent) { + // tailwind can't deal with absolute layouts. + const [parentX, parentY] = parentCoordinates(node.parent); + const left = node.x - parentX; + const top = node.y - parentY; + this.style += formatWithJSX("left", this.isJSX, left); + this.style += formatWithJSX("top", this.isJSX, top); + if (isRelative === false) { + this.style += formatWithJSX("position", this.isJSX, "absolute"); + } + } + else { + this.style += position; + } + return this; + } + customColor(paintArray, property) { + const fill = this.retrieveFill(paintArray); + if (fill.kind === "solid") { + // When text, solid must be outputted as 'color'. + const prop = property === "text" ? "color" : property; + this.style += formatWithJSX(prop, this.isJSX, fill.prop); + } + else if (fill.kind === "gradient") { + if (property === "background-color") { + this.style += formatWithJSX("background-image", this.isJSX, fill.prop); + } + else if (property === "text") { + this.style += formatWithJSX("background", this.isJSX, fill.prop); + this.style += formatWithJSX("-webkit-background-clip", this.isJSX, "text"); + this.style += formatWithJSX("-webkit-text-fill-color", this.isJSX, "transparent"); + } + } + return this; + } + shadow(node) { + const shadow = htmlShadow(node); + if (shadow) { + this.style += formatWithJSX("box-shadow", this.isJSX, htmlShadow(node)); + } + return this; + } + // must be called before Position, because of the hasFixedSize attribute. + widthHeight(node) { + // if current element is relative (therefore, children are absolute) + // or current element is one of the absoltue children and has a width or height > w/h-64 + if ("isRelative" in node && node.isRelative === true) { + this.style += htmlSize(node, this.isJSX); + } + else { + const partial = htmlSizePartial(node, this.isJSX); + this.hasFixedSize = partial[0] !== "" && partial[1] !== ""; + this.style += partial.join(""); + } + return this; + } + autoLayoutPadding(node) { + this.style += htmlPadding(node, this.isJSX); + return this; + } + removeTrailingSpace() { + if (this.style.length > 0 && this.style.slice(-1) === " ") { + this.style = this.style.slice(0, -1); + } + return this; + } + build(additionalStyle = "") { + this.style += additionalStyle; + this.removeTrailingSpace(); + if (this.style) { + if (this.isJSX) { + this.style = ` style={{${this.style}}}`; + } + else { + this.style = ` style="${this.style}"`; + } + } + if (this.name.length > 0) { + const classOrClassName = this.isJSX ? "className" : "class"; + return ` ${classOrClassName}="${this.name}"${this.style}`; + } + else { + return this.style; + } + } +} + +class HtmlTextBuilder extends HtmlDefaultBuilder { + constructor(node, showLayerName, optIsJSX) { + super(node, showLayerName, optIsJSX); + } + // must be called before Position method + textAutoSize(node) { + if (node.textAutoResize === "NONE") { + // going to be used for position + this.hasFixedSize = true; + } + this.style += htmlTextSize(node, this.isJSX); + return this; + } + // todo fontFamily + // fontFamily(node: AltTextNode): this { + // return this; + // } + /** + * https://tailwindcss.com/docs/font-size/ + * example: text-md + */ + fontSize(node, isUI = false) { + // example: text-md + if (node.fontSize !== figma.mixed) { + // special limit when used in UI. + const value = isUI ? Math.min(node.fontSize, 24) : node.fontSize; + this.style += formatWithJSX("font-size", this.isJSX, value); + } + return this; + } + /** + * https://tailwindcss.com/docs/font-style/ + * example: font-extrabold + * example: italic + */ + fontStyle(node) { + if (node.fontName !== figma.mixed) { + const lowercaseStyle = node.fontName.style.toLowerCase(); + if (lowercaseStyle.match("italic")) { + this.style += formatWithJSX("font-style", this.isJSX, "italic"); + } + if (lowercaseStyle.match("regular")) { + // ignore the font-style when regular (default) + return this; + } + const value = node.fontName.style + .replace("italic", "") + .replace(" ", "") + .toLowerCase(); + const weight = convertFontWeight(value); + if (weight !== null && weight !== "400") { + this.style += formatWithJSX("font-weight", this.isJSX, weight); + } + } + return this; + } + /** + * https://tailwindcss.com/docs/letter-spacing/ + * example: tracking-widest + */ + letterSpacing(node) { + const letterSpacing = commonLetterSpacing(node); + if (letterSpacing > 0) { + this.style += formatWithJSX("letter-spacing", this.isJSX, letterSpacing); + } + return this; + } + /** + * Since Figma is built on top of HTML + CSS, lineHeight properties are easy to map. + */ + lineHeight(node) { + if (node.lineHeight !== figma.mixed) { + switch (node.lineHeight.unit) { + case "AUTO": + this.style += formatWithJSX("line-height", this.isJSX, "100%"); + break; + case "PERCENT": + this.style += formatWithJSX("line-height", this.isJSX, `${numToAutoFixed(node.lineHeight.value)}%`); + break; + case "PIXELS": + this.style += formatWithJSX("line-height", this.isJSX, node.lineHeight.value); + break; + } + } + return this; + } + /** + * https://tailwindcss.com/docs/text-align/ + * example: text-justify + */ + textAlign(node) { + // if alignHorizontal is LEFT, don't do anything because that is native + // only undefined in testing + if (node.textAlignHorizontal && node.textAlignHorizontal !== "LEFT") { + // todo when node.textAutoResize === "WIDTH_AND_HEIGHT" and there is no \n in the text, this can be ignored. + switch (node.textAlignHorizontal) { + case "CENTER": + this.style += formatWithJSX("text-align", this.isJSX, "center"); + break; + case "RIGHT": + this.style += formatWithJSX("text-align", this.isJSX, "right"); + break; + case "JUSTIFIED": + this.style += formatWithJSX("text-align", this.isJSX, "justify"); + break; + } + } + return this; + } + /** + * https://tailwindcss.com/docs/text-transform/ + * example: uppercase + */ + textTransform(node) { + if (node.textCase === "LOWER") { + this.style += formatWithJSX("text-transform", this.isJSX, "lowercase"); + } + else if (node.textCase === "TITLE") { + this.style += formatWithJSX("text-transform", this.isJSX, "capitalize"); + } + else if (node.textCase === "UPPER") { + this.style += formatWithJSX("text-transform", this.isJSX, "uppercase"); + } + else if (node.textCase === "ORIGINAL") ; + return this; + } + /** + * https://tailwindcss.com/docs/text-decoration/ + * example: underline + */ + textDecoration(node) { + if (node.textDecoration === "UNDERLINE") { + this.style += formatWithJSX("text-decoration", this.isJSX, "underline"); + } + else if (node.textDecoration === "STRIKETHROUGH") { + this.style += formatWithJSX("text-decoration", this.isJSX, "line-through"); + } + return this; + } +} + +let parentId$3 = ""; +let showLayerName$1 = false; +const htmlMain = (sceneNode, parentIdSrc = "", isJsx = false, layerName = false) => { + parentId$3 = parentIdSrc; + showLayerName$1 = layerName; + let result = htmlWidgetGenerator(sceneNode, isJsx); + // remove the initial \n that is made in Container. + if (result.length > 0 && result.slice(0, 1) === "\n") { + result = result.slice(1, result.length); + } + return result; +}; +// todo lint idea: replace BorderRadius.only(topleft: 8, topRight: 8) with BorderRadius.horizontal(8) +const htmlWidgetGenerator = (sceneNode, isJsx) => { + let comp = ""; + // filter non visible nodes. This is necessary at this step because conversion already happened. + const visibleSceneNode = sceneNode.filter((d) => d.visible !== false); + const sceneLen = visibleSceneNode.length; + visibleSceneNode.forEach((node, index) => { + if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { + comp += htmlContainer(node, "", "", isJsx); + } + else if (node.type === "GROUP") { + comp += htmlGroup(node, isJsx); + } + else if (node.type === "FRAME") { + comp += htmlFrame(node, isJsx); + } + else if (node.type === "TEXT") { + comp += htmlText(node, false, isJsx); + } + comp += addSpacingIfNeeded$1(node, index, sceneLen, isJsx); + // todo support Line + }); + return comp; +}; +const htmlGroup = (node, isJsx = false) => { + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + // also ignore if there are no children inside, which makes no sense + if (node.width <= 0 || node.height <= 0 || node.children.length === 0) { + return ""; + } + // const vectorIfExists = tailwindVector(node, isJsx); + // if (vectorIfExists) return vectorIfExists; + // this needs to be called after CustomNode because widthHeight depends on it + const builder = new HtmlDefaultBuilder(node, showLayerName$1, isJsx) + .blend(node) + .widthHeight(node) + .position(node, parentId$3); + if (builder.style) { + const attr = builder.build(formatWithJSX("position", isJsx, "relative")); + const generator = htmlWidgetGenerator(node.children, isJsx); + return `\n${indentString(generator)}\n`; + } + return htmlWidgetGenerator(node.children, isJsx); +}; +// this was split from htmlText to help the UI part, where the style is needed (without

). +const htmlBuilder = (node, isJsx, isUI = false) => { + const builderResult = new HtmlTextBuilder(node, showLayerName$1, isJsx) + .blend(node) + .textAutoSize(node) + .position(node, parentId$3) + // todo fontFamily (via node.fontName !== figma.mixed ? `fontFamily: ${node.fontName.family}`) + // todo font smoothing + .fontSize(node, isUI) + .fontStyle(node) + .letterSpacing(node) + .lineHeight(node) + .textDecoration(node) + // todo text lists (
  • ) + .textAlign(node) + .customColor(node.fills, "text") + .textTransform(node); + const splittedChars = node.characters.split("\n"); + const charsWithLineBreak = splittedChars.length > 1 + ? node.characters.split("\n").join("
    ") + : node.characters; + return [builderResult, charsWithLineBreak]; +}; +const htmlText = (node, isInput = false, isJsx) => { + // follow the website order, to make it easier + const [builder, charsWithLineBreak] = htmlBuilder(node, isJsx); + if (isInput) { + return [builder.style, charsWithLineBreak]; + } + else { + return `\n${charsWithLineBreak}

    `; + } +}; +const htmlFrame = (node, isJsx = false) => { + // const vectorIfExists = tailwindVector(node, isJsx); + // if (vectorIfExists) return vectorIfExists; + var _a; + if (node.children.length === 1 && + node.children[0].type === "TEXT" && + ((_a = node === null || node === void 0 ? void 0 : node.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().match("input"))) { + const isInput = true; + const [attr, char] = htmlText(node.children[0], isInput, isJsx); + return htmlContainer(node, ` placeholder="${char}"`, attr, isJsx, isInput); + } + const childrenStr = htmlWidgetGenerator(node.children, isJsx); + if (node.layoutMode !== "NONE") { + const rowColumn = rowColumnProps$1(node, isJsx); + return htmlContainer(node, childrenStr, rowColumn, isJsx); + } + else { + // node.layoutMode === "NONE" && node.children.length > 1 + // children needs to be absolute + return htmlContainer(node, childrenStr, formatWithJSX("position", isJsx, "relative"), isJsx, false, false); + } +}; +// properties named propSomething always take care of "," +// sometimes a property might not exist, so it doesn't add "," +const htmlContainer = (node, children, additionalStyle = "", isJsx, isInput = false, isRelative = false) => { + var _a; + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + if (node.width <= 0 || node.height <= 0) { + return children; + } + const builder = new HtmlDefaultBuilder(node, showLayerName$1, isJsx) + .blend(node) + .widthHeight(node) + .autoLayoutPadding(node) + .position(node, parentId$3, isRelative) + .customColor(node.fills, "background-color") + // TODO image and gradient support (tailwind does not support gradients) + .shadow(node) + .border(node); + if (isInput) { + return `\n${children}`; + } + if (builder.style || additionalStyle) { + const build = builder.build(additionalStyle); + let tag = "div"; + let src = ""; + console.log("with ", node.name, "fill", retrieveTopFill(node.fills)); + if (((_a = retrieveTopFill(node.fills)) === null || _a === void 0 ? void 0 : _a.type) === "IMAGE") { + tag = "img"; + src = ` src="https://via.placeholder.com/${node.width}x${node.height}"`; + } + if (children) { + return `\n<${tag}${build}${src}>${indentString(children)}\n`; + } + else { + return `\n<${tag}${build}${src}/>`; + } + } + return children; +}; +const rowColumnProps$1 = (node, isJsx) => { + // ROW or COLUMN + // ignore current node when it has only one child and it has the same size + if (node.children.length === 1 && + node.children[0].width === node.width && + node.children[0].height === node.height) { + return ""; + } + // [optimization] + // flex, by default, has flex-row. Therefore, it can be omitted. + const rowOrColumn = node.layoutMode === "HORIZONTAL" + ? formatWithJSX("flex-direction", isJsx, "row") + : formatWithJSX("flex-direction", isJsx, "column"); + // special case when there is only one children; need to position correctly in Flex. + // let justify = "justify-center"; + // if (node.children.length === 1) { + // const nodeCenteredPosX = node.children[0].x + node.children[0].width / 2; + // const parentCenteredPosX = node.width / 2; + // const marginX = nodeCenteredPosX - parentCenteredPosX; + // // allow a small threshold + // if (marginX < -4) { + // justify = "justify-start"; + // } else if (marginX > 4) { + // justify = "justify-end"; + // } + // } + let primaryAlign; + switch (node.primaryAxisAlignItems) { + case "MIN": + primaryAlign = "flex-start"; + break; + case "CENTER": + primaryAlign = "center"; + break; + case "MAX": + primaryAlign = "flex-end"; + break; + case "SPACE_BETWEEN": + primaryAlign = "space-between"; + break; + } + primaryAlign = formatWithJSX("justify-content", isJsx, primaryAlign); + // [optimization] + // when all children are STRETCH and layout is Vertical, align won't matter. Otherwise, center it. + let counterAlign; + switch (node.counterAxisAlignItems) { + case "MIN": + counterAlign = "flex-start"; + break; + case "CENTER": + counterAlign = "center"; + break; + case "MAX": + counterAlign = "flex-end"; + break; + } + counterAlign = formatWithJSX("align-items", isJsx, counterAlign); + // if parent is a Frame with AutoLayout set to Vertical, the current node should expand + let flex = node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === node.layoutMode + ? "flex" + : "inline-flex"; + flex = formatWithJSX("display", isJsx, flex); + return `${flex}${rowOrColumn}${counterAlign}${primaryAlign}`; +}; +const addSpacingIfNeeded$1 = (node, index, len, isJsx) => { + var _a; + // Ignore this when SPACE_BETWEEN is set. + if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === "FRAME" && + node.parent.layoutMode !== "NONE" && + node.parent.primaryAxisAlignItems !== "SPACE_BETWEEN") { + // check if itemSpacing is set and if it isn't the last value. + // Don't add at the last value. In Figma, itemSpacing CAN be negative; here it can't. + if (node.parent.itemSpacing > 0 && index < len - 1) { + const wh = node.parent.layoutMode === "HORIZONTAL" ? "width" : "height"; + // don't show the layer name in these separators. + const style = new HtmlDefaultBuilder(node, false, isJsx).build(formatWithJSX(wh, isJsx, node.parent.itemSpacing)); + return `\n`; + } + } + return ""; +}; + +var componentName; +(function (componentName) { + componentName[componentName["input"] = 0] = "input"; + componentName[componentName["button"] = 1] = "button"; + componentName[componentName["checkbox"] = 2] = "checkbox"; + componentName[componentName["avatar"] = 3] = "avatar"; + componentName[componentName["radio"] = 4] = "radio"; + componentName[componentName["select"] = 5] = "select"; + componentName[componentName["Alert"] = 6] = "Alert"; + componentName[componentName["list"] = 7] = "list"; + componentName[componentName["background"] = 8] = "background"; +})(componentName || (componentName = {})); +const isUI = (name) => { + console.log('isUI' + name); + return Object.values(componentName).includes(name); +}; +const recognizeAntdUI = (name, text) => { + console.log(name); + switch (name) { + case 'input': return ``; + case 'button': return ``; + case 'checkbox': return `${text}`; + case 'list': return ` + Header} + footer={
    Footer
    } + bordered + dataSource={['item1','item2','item3']} + renderItem={item => ( + + [ITEM] {item} + + )} + /> + `; + case 'avatar': return `${text}`; + case 'Alert': return ''; + case 'radio': return `${text}`; + case 'select': return ` + + `; + default: return text; + } +}; + +const nodesTraverserGenerator = (nodes) => { + // return a traverser for modify particular type nodes + return { + nodes, + traverseFirstLayer(type, method, ...args) { + // traverse first layer only + function traverse(node) { + if (node.type === type) { + method(node, ...args); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseAllNodes(method, ...args) { + function traverse(node) { + method(node, ...args); + if (node.type === 'FRAME' || node.type === 'GROUP') { + node.children.forEach(child => traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseNodesAndSkip(type, method, ...args) { + function traverse(node) { + const typeReg = new RegExp(type); + if (!typeReg.exec(node.type)) { + method(node, ...args); + } + if (node.type === 'FRAME' || node.type === 'GROUP') { + node.children.forEach(child => traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseNodes(type, method, ...args) { + function traverse(node) { + const typeReg = new RegExp(type); + if (typeReg.exec(node.type)) { + method(node, ...args); + } + if (node.type === 'FRAME' || node.type === 'GROUP' || node.type === 'INSTANCE') { + node.children.forEach(child => traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + } + }; +}; + +let parentId$2 = ""; +let showLayerName = false; +const tailwindMain = (sceneNode, parentIdSrc = "", isJsx = false, layerName = false, recognize = false) => { + parentId$2 = parentIdSrc; + showLayerName = layerName; + console.log(recognize); + let result = tailwindWidgetGenerator(sceneNode, isJsx, recognize); + // remove the initial \n that is made in Container. + if (result.length > 0 && result.slice(0, 1) === "\n") { + result = result.slice(1, result.length); + } + return result; +}; +// todo lint idea: replace BorderRadius.only(topleft: 8, topRight: 8) with BorderRadius.horizontal(8) +const tailwindWidgetGenerator = (sceneNode, isJsx, recognize) => { + let comp = ""; + // filter non visible nodes. This is necessary at this step because conversion already happened. + const visibleSceneNode = sceneNode.filter((d) => d.visible !== false); + visibleSceneNode.forEach((node) => { + console.log(node.name, node.type); + if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { + comp += tailwindContainer(node, "", "", { isRelative: false, isInput: false }, isJsx); + } + else if (node.type === "GROUP") { + comp += tailwindGroup(node, isJsx, recognize); + } + else if (node.type === "FRAME") { + comp += tailwindFrame(node, isJsx, recognize); + } + else if (node.type === "TEXT") { + comp += tailwindText(node, false, isJsx); + } + // todo support Line + }); + return comp; +}; +const tailwindGroup = (node, isJsx = false, recognize) => { + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + // also ignore if there are no children inside, which makes no sense + if (node.width <= 0 || node.height <= 0 || node.children.length === 0) { + return ""; + } + // this needs to be called after CustomNode because widthHeight depends on it + const builder = new TailwindDefaultBuilder(node, showLayerName, isJsx) + .blend(node) + .widthHeight(node) + .position(node, parentId$2); + if (builder.attributes || builder.style) { + const attr = builder.build("relative "); + if (recognize && isUI(node.name)) { + const nodesTraverse = nodesTraverserGenerator(Array.isArray(node) ? node : [node]); + let text = ''; + const getText = (node) => { + text = node.characters; + }; + nodesTraverse.traverseNodes("TEXT", getText); + return recognizeAntdUI(node.name, text); + } + const generator = tailwindWidgetGenerator(node.children, isJsx, recognize); + return `\n${indentString(generator)}\n`; + } + return tailwindWidgetGenerator(node.children, isJsx, recognize); +}; +const tailwindText = (node, isInput, isJsx) => { + // follow the website order, to make it easier + const builderResult = new TailwindTextBuilder(node, showLayerName, isJsx) + .blend(node) + .textAutoSize(node) + .position(node, parentId$2) + // todo fontFamily (via node.fontName !== figma.mixed ? `fontFamily: ${node.fontName.family}`) + // todo font smoothing + .fontSize(node) + .fontStyle(node) + .letterSpacing(node) + .lineHeight(node) + .textDecoration(node) + // todo text lists (
  • ) + .textAlign(node) + .customColor(node.fills, "text") + .textTransform(node); + const splittedChars = node.characters.split("\n"); + const charsWithLineBreak = splittedChars.length > 1 + ? node.characters.split("\n").join("
    ") + : node.characters; + if (isInput) { + return [builderResult.attributes, charsWithLineBreak]; + } + else { + return `\n${charsWithLineBreak}

    `; + } +}; +const tailwindFrame = (node, isJsx, recognize) => { + // const vectorIfExists = tailwindVector(node, isJsx); + // if (vectorIfExists) return vectorIfExists; + var _a; + if (recognize && isUI(node.name)) { + const nodesTraverse = nodesTraverserGenerator(Array.isArray(node) ? node : [node]); + let text = ''; + const getText = (node) => { + text = node.characters; + }; + nodesTraverse.traverseNodes("TEXT", getText); + return recognizeAntdUI(node.name, text); + } + if (node.children.length === 1 && + node.children[0].type === "TEXT" && + ((_a = node === null || node === void 0 ? void 0 : node.name) === null || _a === void 0 ? void 0 : _a.toLowerCase().match("input"))) { + const [attr, char] = tailwindText(node.children[0], true, isJsx); + return tailwindContainer(node, ` placeholder="${char}"`, attr, { isRelative: false, isInput: true }, isJsx); + } + const childrenStr = tailwindWidgetGenerator(node.children, isJsx, recognize); + if (node.layoutMode !== "NONE") { + const rowColumn = rowColumnProps(node); + return tailwindContainer(node, childrenStr, rowColumn, { isRelative: false, isInput: false }, isJsx); + } + else { + // node.layoutMode === "NONE" && node.children.length > 1 + // children needs to be absolute + return tailwindContainer(node, childrenStr, "relative ", { isRelative: true, isInput: false }, isJsx); + } +}; +// properties named propSomething always take care of "," +// sometimes a property might not exist, so it doesn't add "," +const tailwindContainer = (node, children, additionalAttr, attr, isJsx) => { + var _a; + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + if (node.width <= 0 || node.height <= 0) { + return children; + } + const builder = new TailwindDefaultBuilder(node, showLayerName, isJsx) + .blend(node) + .widthHeight(node) + .autoLayoutPadding(node) + .position(node, parentId$2, attr.isRelative) + .customColor(node.fills, "bg") + // TODO image and gradient support (tailwind does not support gradients) + .shadow(node) + .border(node); + if (attr.isInput) { + // children before the > is not a typo. + return `\n`; + } + if (builder.attributes || additionalAttr) { + const build = builder.build(additionalAttr); + // image fill and no children -- let's emit an + let tag = "div"; + let src = ""; + if (((_a = retrieveTopFill(node.fills)) === null || _a === void 0 ? void 0 : _a.type) === "IMAGE") { + tag = "img"; + src = ` src="https://via.placeholder.com/${node.width}x${node.height}"`; + } + if (children) { + return `\n<${tag}${build}${src}>${indentString(children)}\n`; + } + else { + return `\n<${tag}${build}${src}/>`; + } + } + return children; +}; +const rowColumnProps = (node) => { + // ROW or COLUMN + // ignore current node when it has only one child and it has the same size + if (node.children.length === 1 && + node.children[0].width === node.width && + node.children[0].height === node.height) { + return ""; + } + // [optimization] + // flex, by default, has flex-row. Therefore, it can be omitted. + const rowOrColumn = node.layoutMode === "HORIZONTAL" ? "" : "flex-col "; + // https://tailwindcss.com/docs/space/ + // space between items + const spacing = node.itemSpacing > 0 ? pxToLayoutSize(node.itemSpacing) : 0; + const spaceDirection = node.layoutMode === "HORIZONTAL" ? "x" : "y"; + // space is visually ignored when there is only one child or spacing is zero + const space = node.children.length > 1 && spacing > 0 + ? `space-${spaceDirection}-${spacing} ` + : ""; + // special case when there is only one children; need to position correctly in Flex. + // let justify = "justify-center"; + // if (node.children.length === 1) { + // const nodeCenteredPosX = node.children[0].x + node.children[0].width / 2; + // const parentCenteredPosX = node.width / 2; + // const marginX = nodeCenteredPosX - parentCenteredPosX; + // // allow a small threshold + // if (marginX < -4) { + // justify = "justify-start"; + // } else if (marginX > 4) { + // justify = "justify-end"; + // } + // } + let primaryAlign; + switch (node.primaryAxisAlignItems) { + case "MIN": + primaryAlign = "justify-start "; + break; + case "CENTER": + primaryAlign = "justify-center "; + break; + case "MAX": + primaryAlign = "justify-end "; + break; + case "SPACE_BETWEEN": + primaryAlign = "justify-between "; + break; + } + // [optimization] + // when all children are STRETCH and layout is Vertical, align won't matter. Otherwise, center it. + let counterAlign; + switch (node.counterAxisAlignItems) { + case "MIN": + counterAlign = "items-start "; + break; + case "CENTER": + counterAlign = "items-center "; + break; + case "MAX": + counterAlign = "items-end "; + break; + } + // const layoutAlign = + // node.layoutMode === "VERTICAL" && + // node.children.every((d) => d.layoutAlign === "STRETCH") + // ? "" + // : `items-center ${justify} `; + // if parent is a Frame with AutoLayout set to Vertical, the current node should expand + const flex = node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === node.layoutMode + ? "flex " + : "inline-flex "; + return `${flex}${rowOrColumn}${space}${counterAlign}${primaryAlign}`; +}; + +const flutterPosition = (node, child, parentId = "") => { + // avoid adding Positioned() when parent is not a Stack(), which can happen at the beggining + if (!node.parent || parentId === node.parent.id || child === "") { + return child; + } + // check if view is in a stack. Group and Frames must have more than 1 element + if (node.parent.isRelative === true) { + const pos = retrieveAbsolutePos(node, child); + if (pos !== "Absolute") { + return pos; + } + else { + // this is necessary because Group have absolute position, while Frame is relative. + // output is always going to be relative to the parent. + const [parentX, parentY] = parentCoordinates(node.parent); + const diffX = numToAutoFixed(node.x - parentX); + const diffY = numToAutoFixed(node.y - parentY); + const properties = `\nleft: ${diffX},\ntop: ${diffY},\nchild: ${child}`; + return `Positioned(${indentString(properties)}\n),`; + } + } + return child; +}; +const retrieveAbsolutePos = (node, child) => { + const positionedAlign = (align) => { + const alignProp = `\nalignment: Alignment.${align},\nchild: ${child}`; + const positionedProp = `\nchild: Align(${indentString(alignProp)}\n),`; + return `Positioned.fill(${indentString(positionedProp)}\n),`; + }; + switch (commonPosition(node)) { + case "": + return child; + case "Absolute": + return "Absolute"; + case "TopStart": + return positionedAlign("topLeft"); + case "TopCenter": + return positionedAlign("topCenter"); + case "TopEnd": + return positionedAlign("topRight"); + case "CenterStart": + return positionedAlign("centerLeft"); + case "Center": + return positionedAlign("center"); + case "CenterEnd": + return positionedAlign("centerRight"); + case "BottomStart": + return positionedAlign("bottomLeft"); + case "BottomCenter": + return positionedAlign("bottomCenter"); + case "BottomEnd": + return positionedAlign("bottomRight"); + } +}; + +/** + * https://api.flutter.dev/flutter/widgets/Opacity-class.html + */ +const flutterOpacity = (node, child) => { + if (node.opacity !== undefined && node.opacity !== 1 && child !== "") { + const prop = `\nopacity: ${numToAutoFixed(node.opacity)},\nchild: ${child}`; + return `Opacity(${indentString(prop)}\n),`; + } + return child; +}; +/** + * https://api.flutter.dev/flutter/widgets/Visibility-class.html + */ +const flutterVisibility = (node, child) => { + // [when testing] node.visible can be undefined + if (node.visible !== undefined && node.visible === false && child !== "") { + const prop = `\nvisible: ${node.visible},\nchild: ${child}`; + return `Visibility(${indentString(prop)}\n),`; + } + return child; +}; +/** + * https://api.flutter.dev/flutter/widgets/Transform-class.html + * that's how you convert angles to clockwise radians: angle * -pi/180 + * using 3.14159 as Pi for enough precision and to avoid importing math lib. + */ +const flutterRotation = (node, child) => { + if (node.rotation !== undefined && + child !== "" && + Math.round(node.rotation) !== 0) { + const prop = `\nangle: ${numToAutoFixed(node.rotation * (-3.14159 / 180))},\nchild: ${child}`; + return `Transform.rotate(${indentString(prop)}\n),`; + } + return child; +}; + +// generate the border, when it exists +const flutterBorder = (node) => { + if (node.type === "GROUP" || !node.strokes || node.strokes.length === 0) { + return ""; + } + // retrieve the stroke color, when existent (returns "" otherwise) + const propStrokeColor = flutterColorFromFills(node.strokes); + // only add strokeWidth when there is a strokeColor (returns "" otherwise) + const propStrokeWidth = `width: ${numToAutoFixed(node.strokeWeight)}, `; + // generate the border, when it should exist + return propStrokeColor && node.strokeWeight + ? `\nborder: Border.all(${propStrokeColor} ${propStrokeWidth}),` + : ""; +}; +const flutterShape = (node) => { + const strokeColor = flutterColorFromFills(node.strokes); + const side = strokeColor && node.strokeWeight > 0 + ? `\nside: BorderSide(width: ${node.strokeWeight}, ${strokeColor} ),` + : ""; + if (node.type === "ELLIPSE") { + return `\nshape: CircleBorder(${indentString(side)}${side ? "\n" : ""}),`; + } + const properties = side + flutterBorderRadius(node); + return `\nshape: RoundedRectangleBorder(${indentString(properties)}\n),`; +}; +// retrieve the borderRadius, when existent (returns "" for EllipseNode) +const flutterBorderRadius = (node) => { + if (node.type === "ELLIPSE") + return ""; + if (node.cornerRadius === 0 || + (node.cornerRadius === undefined && node.topLeftRadius === undefined)) { + return ""; + } + return node.cornerRadius !== figma.mixed + ? `\nborderRadius: BorderRadius.circular(${numToAutoFixed(node.cornerRadius)}),` + : `\nborderRadius: BorderRadius.only(topLeft: Radius.circular(${numToAutoFixed(node.topLeftRadius)}), topRight: Radius.circular(${numToAutoFixed(node.topRightRadius)}), bottomLeft: Radius.circular(${numToAutoFixed(node.bottomLeftRadius)}), bottomRight: Radius.circular(${numToAutoFixed(node.bottomRightRadius)}), ),`; +}; + +const flutterSize = (node) => { + const size = nodeWidthHeight(node, false); + let isExpanded = false; + // this cast will always be true, since nodeWidthHeight was called with false to relative. + let propWidth = ""; + if (typeof size.width === "number") { + propWidth = `\nwidth: ${numToAutoFixed(size.width)},`; + } + else if (size.width === "full") { + // When parent is a Row, child must be Expanded. + if (node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "HORIZONTAL") { + isExpanded = true; + } + else { + propWidth = `\nwidth: double.infinity,`; + } + } + let propHeight = ""; + if (typeof size.height === "number") { + propHeight = `\nheight: ${numToAutoFixed(size.height)},`; + } + else if (size.height === "full") { + // When parent is a Column, child must be Expanded. + if (node.parent && + "layoutMode" in node.parent && + node.parent.layoutMode === "VERTICAL") { + isExpanded = true; + } + else { + propHeight = `\nheight: double.infinity,`; + } + } + return { width: propWidth, height: propHeight, isExpanded: isExpanded }; +}; + +// Add padding if necessary! +// This must happen before Stack or after the Positioned, but not before. +const flutterPadding = (node) => { + if (!("layoutMode" in node)) { + return ""; + } + const padding = commonPadding(node); + if (!padding) { + return ""; + } + if ("all" in padding) { + return `\npadding: const EdgeInsets.all(${numToAutoFixed(padding.all)}),`; + } + // horizontal and vertical, as the default AutoLayout + if (padding.horizontal + padding.vertical !== 0 && + padding.top + padding.bottom + padding.left + padding.right === 0) { + const propHorizontalPadding = padding.horizontal > 0 + ? `horizontal: ${numToAutoFixed(padding.horizontal)}, ` + : ""; + const propVerticalPadding = padding.vertical > 0 + ? `vertical: ${numToAutoFixed(padding.vertical)}, ` + : ""; + return `\npadding: const EdgeInsets.symmetric(${propHorizontalPadding}${propVerticalPadding}),`; + } + let comp = ""; + // if left and right exists, verify if they are the same after [pxToLayoutSize] conversion. + if (padding.left) { + comp += `left: ${numToAutoFixed(padding.left)}, `; + } + if (padding.right) { + comp += `right: ${numToAutoFixed(padding.right)}, `; + } + if (padding.top) { + comp += `top: ${numToAutoFixed(padding.top)}, `; + } + if (padding.bottom) { + comp += `bottom: ${numToAutoFixed(padding.bottom)}, `; + } + if (comp !== "") { + return `\npadding: const EdgeInsets.only(${comp}),`; + } + return ""; +}; + +const flutterBoxShadow = (node) => { + var _a; + let propBoxShadow = ""; + if (((_a = node.effects) === null || _a === void 0 ? void 0 : _a.length) > 0) { + const dropShadow = node.effects.filter((d) => d.type === "DROP_SHADOW" && d.visible !== false); + if (dropShadow.length > 0) { + let boxShadow = ""; + dropShadow.forEach((d) => { + const color = `\ncolor: Color(0x${rgbTo8hex(d.color, d.color.a)}),`; + const radius = `\nblurRadius: ${numToAutoFixed(d.radius)},`; + const offset = `\noffset: Offset(${numToAutoFixed(d.offset.x)}, ${numToAutoFixed(d.offset.y)}),`; + const property = color + radius + offset; + boxShadow += `\nBoxShadow(${indentString(property)}\n),`; + }); + propBoxShadow = `\nboxShadow: [${indentString(boxShadow)}\n],`; + } + // TODO inner shadow, layer blur + } + return propBoxShadow; +}; +const flutterElevationAndShadowColor = (node) => { + var _a; + let elevation = ""; + let shadowColor = ""; + if (((_a = node.effects) === null || _a === void 0 ? void 0 : _a.length) > 0) { + const dropShadow = node.effects.filter((d) => d.type === "DROP_SHADOW" && d.visible !== false); + if (dropShadow.length > 0 && dropShadow[0].type === "DROP_SHADOW") { + shadowColor = `\ncolor: Color(0x${rgbTo8hex(dropShadow[0].color, dropShadow[0].color.a)}), `; + elevation = `\nelevation: ${numToAutoFixed(dropShadow[0].radius)}, `; + } + } + return [elevation, shadowColor]; +}; + +// properties named propSomething always take care of "," +// sometimes a property might not exist, so it doesn't add "," +const flutterContainer$1 = (node, child) => { + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + if (node.width <= 0 || node.height <= 0) { + return child; + } + // ignore for Groups + const propBoxDecoration = node.type === "GROUP" ? "" : getBoxDecoration(node); + const fSize = flutterSize(node); + const size = fSize.width + fSize.height; + const isExpanded = fSize.isExpanded; + // todo Image & multiple fills + /// if child is empty, propChild is empty + const propChild = child ? `\nchild: ${child}` : ""; + // [propPadding] will be "padding: const EdgeInsets.symmetric(...)" or "" + let propPadding = ""; + if (node.type === "FRAME") { + propPadding = flutterPadding(node); + } + let result; + if (size || propBoxDecoration) { + // Container is a container if [propWidthHeight] and [propBoxDecoration] are set. + const properties = `${size}${propBoxDecoration}${propPadding}${propChild}`; + result = `Container(${indentString(properties)}\n),`; + } + else if (propPadding) { + // if there is just a padding, add Padding + const properties = `${propPadding}${propChild}`; + result = `Padding(${indentString(properties)}\n),`; + } + else { + result = child; + } + // Add Expanded() when parent is a Row/Column and width is full. + if (isExpanded) { + const properties = `\nchild: ${result}`; + result = `Expanded(${indentString(properties)}\n),`; + } + return result; +}; +const getBoxDecoration = (node) => { + const propBackgroundColor = flutterBoxDecorationColor(node.fills); + const propBorder = flutterBorder(node); + const propBoxShadow = flutterBoxShadow(node); + const propBorderRadius = flutterBorderRadius(node); + // modify the circle's shape when type is ellipse + const propShape = node.type === "ELLIPSE" ? "\nshape: BoxShape.circle," : ""; + // generate the decoration, or just the backgroundColor when color is SOLID. + if (propBorder || + propShape || + propBorder || + propBorderRadius || + propBackgroundColor[0] === "g") { + const properties = propBorderRadius + + propShape + + propBorder + + propBoxShadow + + propBackgroundColor; + return `\ndecoration: BoxDecoration(${indentString(properties)}\n),`; + } + else { + return propBackgroundColor; + } +}; + +// https://api.flutter.dev/flutter/material/Material-class.html +const flutterMaterial = (node, child) => { + // ignore the view when size is zero or less + // while technically it shouldn't get less than 0, due to rounding errors, + // it can get to values like: -0.000004196293048153166 + if (node.width <= 0 || node.height <= 0) { + return child; + } + const color = materialColor(node); + const shape = materialShape(node); + const clip = getClipping(node); + const [elevation, shadowColor] = flutterElevationAndShadowColor(node); + const padChild = child ? `\nchild: ${getPadding(node, child)}` : ""; + const materialAttr = color + elevation + shadowColor + shape + clip + padChild; + let materialResult = `Material(${indentString(materialAttr)}\n),`; + const fSize = flutterSize(node); + const size = fSize.width + fSize.height; + const isExpanded = fSize.isExpanded; + if (size) { + const properties = `${size}\nchild: ${materialResult}`; + materialResult = `SizedBox(${indentString(properties)}\n),`; + } + if (isExpanded) { + const properties = `\nchild: ${materialResult}`; + materialResult = `Expanded(${indentString(properties)}\n),`; + } + return materialResult; +}; +const materialColor = (node) => { + const color = flutterColorFromFills(node.fills); + if (!color) { + return "\ncolor: Colors.transparent,"; + } + return "\n" + color; +}; +const materialShape = (node) => { + var _a; + if (node.type === "ELLIPSE" || ((_a = node.strokes) === null || _a === void 0 ? void 0 : _a.length) > 0) { + return flutterShape(node); + } + else { + return flutterBorderRadius(node); + } +}; +const getClipping = (node) => { + let clip = false; + if (node.type === "FRAME" && node.cornerRadius && node.cornerRadius !== 0) { + clip = node.clipsContent; + } + return clip ? "\nclipBehavior: Clip.antiAlias," : ""; +}; +const getPadding = (node, child) => { + const padding = flutterPadding(node); + if (padding) { + const properties = `${padding}\nchild: ${child}`; + return `Padding(${indentString(properties)}\n),`; + } + return child; +}; + +class FlutterDefaultBuilder { + constructor(optChild) { + this.child = optChild; + } + createContainer(node, material) { + const fill = node.type === "GROUP" ? null : retrieveTopFill(node.fills); + // fill.visible can be true or undefined (on tests) + if (node.type !== "GROUP" && + material && + fill && + fill.visible !== false && + fill.type === "SOLID") { + this.child = flutterMaterial(node, this.child); + } + else { + this.child = flutterContainer$1(node, this.child); + } + return this; + } + blendAttr(node) { + this.child = flutterVisibility(node, this.child); + this.child = flutterRotation(node, this.child); + this.child = flutterOpacity(node, this.child); + return this; + } + position(node, parentId) { + this.child = flutterPosition(node, this.child, parentId); + return this; + } +} + +class FlutterTextBuilder extends FlutterDefaultBuilder { + constructor(optChild = "") { + super(optChild); + } + reset() { + this.child = ""; + } + createText(node) { + this.child = makeTextComponent(node); + return this; + } + textAutoSize(node) { + this.child = wrapTextAutoResize(node, this.child); + return this; + } +} +const makeTextComponent = (node) => { + var _a, _b, _c; + // only undefined in testing + let alignHorizontal = (_c = (_b = (_a = node.textAlignHorizontal) === null || _a === void 0 ? void 0 : _a.toString()) === null || _b === void 0 ? void 0 : _b.toLowerCase()) !== null && _c !== void 0 ? _c : "left"; + alignHorizontal = + alignHorizontal === "justified" ? "justify" : alignHorizontal; + // todo if layoutAlign !== MIN, Text will be wrapped by Align + // if alignHorizontal is LEFT, don't do anything because that is native + const textAlign = alignHorizontal !== "left" + ? `\ntextAlign: TextAlign.${alignHorizontal},` + : ""; + let text = node.characters; + if (node.textCase === "LOWER") { + text = text.toLowerCase(); + } + else if (node.textCase === "UPPER") { + text = text.toUpperCase(); + } + // else if (node.textCase === "TITLE") { + // TODO this + // } + const textStyle = getTextStyle(node); + const style = textStyle + ? `\nstyle: TextStyle(${indentString(textStyle)}\n),` + : ""; + const splittedChars = text.split("\n"); + const charsWithLineBreak = splittedChars.length > 1 ? splittedChars.join("\\n") : text; + const properties = `\n"${charsWithLineBreak}",${textAlign}${style}`; + return `Text(${indentString(properties)}\n),`; +}; +const getTextStyle = (node) => { + // example: text-md + let styleBuilder = ""; + const color = flutterColorFromFills(node.fills); + if (color) { + styleBuilder += `\n${color}`; + } + if (node.fontSize !== figma.mixed) { + styleBuilder += `\nfontSize: ${numToAutoFixed(node.fontSize)},`; + } + if (node.textDecoration === "UNDERLINE") { + styleBuilder += "\ndecoration: TextDecoration.underline,"; + } + if (node.fontName !== figma.mixed) { + const lowercaseStyle = node.fontName.style.toLowerCase(); + if (lowercaseStyle.match("italic")) { + styleBuilder += "\nfontStyle: FontStyle.italic,"; + } + // ignore the font-style when regular (default) + if (!lowercaseStyle.match("regular")) { + const value = node.fontName.style + .replace("italic", "") + .replace(" ", "") + .toLowerCase(); + const weight = convertFontWeight(value); + if (weight) { + styleBuilder += `\nfontFamily: "${node.fontName.family}",`; + styleBuilder += `\nfontWeight: FontWeight.w${weight},`; + } + } + } + // todo lineSpacing + const letterSpacing = commonLetterSpacing(node); + if (letterSpacing > 0) { + styleBuilder += `\nletterSpacing: ${numToAutoFixed(letterSpacing)},`; + } + return styleBuilder; +}; +const wrapTextAutoResize = (node, child) => { + const fSize = flutterSize(node); + const width = fSize.width; + const height = fSize.height; + const isExpanded = fSize.isExpanded; + let result = ""; + if (node.textAutoResize === "NONE") { + // = instead of += because we want to replace it + const properties = `${width}${height}\nchild: ${child}`; + result = `SizedBox(${indentString(properties)}\n),`; + } + else if (node.textAutoResize === "HEIGHT") { + // if HEIGHT is set, it means HEIGHT will be calculated automatically, but width won't + // = instead of += because we want to replace it + const properties = `${width}\nchild: ${child}`; + result = `SizedBox(${indentString(properties)}\n),`; + } + if (isExpanded) { + const properties = `\nchild: ${result}`; + return `Expanded(${indentString(properties)}\n),`; + } + else if (result.length > 0) { + return result; + } + return child; +}; + +let parentId$1 = ""; +let material$1 = true; +const flutterMain = (sceneNode, parentIdSrc = "", isMaterial = false) => { + parentId$1 = parentIdSrc; + material$1 = isMaterial; + let result = flutterWidgetGenerator(sceneNode); + // remove the last ',' + result = result.slice(0, -1); + return result; +}; +// todo lint idea: replace BorderRadius.only(topleft: 8, topRight: 8) with BorderRadius.horizontal(8) +const flutterWidgetGenerator = (sceneNode) => { + let comp = ""; + // filter non visible nodes. This is necessary at this step because conversion already happened. + const visibleSceneNode = sceneNode.filter((d) => d.visible !== false); + const sceneLen = visibleSceneNode.length; + visibleSceneNode.forEach((node, index) => { + if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { + comp += flutterContainer(node, ""); + } + // else if (node.type === "VECTOR") { + // comp = flutterVector(node); + // } + else if (node.type === "GROUP") { + comp += flutterGroup(node); + } + else if (node.type === "FRAME") { + comp += flutterFrame(node); + } + else if (node.type === "TEXT") { + comp += flutterText(node); + } + if (index < sceneLen - 1) { + // if the parent is an AutoLayout, and itemSpacing is set, add a SizedBox between items. + // on else, comp += "" + const spacing = addSpacingIfNeeded(node); + if (spacing) { + // comp += "\n"; + comp += spacing; + } + // don't add a newline at last element. + comp += "\n"; + } + }); + return comp; +}; +const flutterGroup = (node) => { + const properties = `\nchildren:[${flutterWidgetGenerator(node.children)}],`; + return flutterContainer(node, `Stack(${indentString(properties)}\n),`); +}; +const flutterContainer = (node, child) => { + var _a; + let propChild = ""; + let image = ""; + if ("fills" in node && ((_a = retrieveTopFill(node.fills)) === null || _a === void 0 ? void 0 : _a.type) === "IMAGE") { + // const url = `https://via.placeholder.com/${node.width}x${node.height}`; + // image = `Image.network("${url}"),`; + // Flutter Web currently can't render network images :( + image = `FlutterLogo(size: ${Math.min(node.width, node.height)}),`; + } + if (child.length > 0 && image.length > 0) { + const prop1 = `\nPositioned.fill(\n${indentString(`child: ${child}`)}\n),`; + const prop2 = `\nPositioned.fill(\n${indentString(`child: ${image}`)}\n),`; + const propStack = `\nchildren: [${indentString(prop1 + prop2)}\n],`; + propChild = `Stack(${indentString(propStack)}\n),`; + } + else if (child.length > 0) { + propChild = child; + } + else if (image.length > 0) { + propChild = image; + } + const builder = new FlutterDefaultBuilder(propChild); + builder + .createContainer(node, material$1) + .blendAttr(node) + .position(node, parentId$1); + return builder.child; +}; +const flutterText = (node) => { + const builder = new FlutterTextBuilder(); + builder + .createText(node) + .blendAttr(node) + .textAutoSize(node) + .position(node, parentId$1); + return builder.child; +}; +const flutterFrame = (node) => { + const children = flutterWidgetGenerator(node.children); + // Ignoring when Frame has a single child was removed because Expanded only works in Row/Column and not in Container, so additional logic would be required elsewhere. + if (node.layoutMode !== "NONE") { + const rowColumn = makeRowColumn(node, children); + return flutterContainer(node, rowColumn); + } + else { + // node.layoutMode === "NONE" && node.children.length > 1 + // children needs to be absolute + const properties = `\nchildren:[\n${indentString(children, 1)}\n],`; + return flutterContainer(node, `Stack(${indentString(properties)}\n),`); + } +}; +const makeRowColumn = (node, children) => { + // ROW or COLUMN + const rowOrColumn = node.layoutMode === "HORIZONTAL" ? "Row" : "Column"; + let crossAlignType; + switch (node.counterAxisAlignItems) { + case "MIN": + crossAlignType = "start"; + break; + case "CENTER": + crossAlignType = "center"; + break; + case "MAX": + crossAlignType = "end"; + break; + } + const crossAxisAlignment = `\ncrossAxisAlignment: CrossAxisAlignment.${crossAlignType},`; + let mainAlignType; + switch (node.primaryAxisAlignItems) { + case "MIN": + mainAlignType = "start"; + break; + case "CENTER": + mainAlignType = "center"; + break; + case "MAX": + mainAlignType = "end"; + break; + case "SPACE_BETWEEN": + mainAlignType = "spaceBetween"; + break; + } + const mainAxisAlignment = `\nmainAxisAlignment: MainAxisAlignment.${mainAlignType},`; + let mainAxisSize; + if (node.layoutGrow === 1) { + mainAxisSize = "\nmainAxisSize: MainAxisSize.max,"; + } + else { + mainAxisSize = "\nmainAxisSize: MainAxisSize.min,"; + } + const properties = mainAxisSize + + mainAxisAlignment + + crossAxisAlignment + + `\nchildren:[\n${indentString(children, 1)}\n],`; + return `${rowOrColumn}(${indentString(properties, 1)}\n),`; +}; +// TODO Vector support in Flutter is complicated. Currently, AltConversion converts it in a Rectangle. +const addSpacingIfNeeded = (node) => { + var _a; + if (((_a = node.parent) === null || _a === void 0 ? void 0 : _a.type) === "FRAME" && node.parent.layoutMode !== "NONE") { + // check if itemSpacing is set and if it isn't the last value. + // Don't add the SizedBox at last value. In Figma, itemSpacing CAN be negative; here it can't. + if (node.parent.itemSpacing > 0) { + if (node.parent.layoutMode === "HORIZONTAL") { + return `\nSizedBox(width: ${numToAutoFixed(node.parent.itemSpacing)}),`; + } + else { + // node.parent.layoutMode === "VERTICAL" + return `\nSizedBox(height: ${numToAutoFixed(node.parent.itemSpacing)}),`; + } + } + } + return ""; +}; + +let parentId; +let isJsx = false; +let layerName = false; +let material = true; +let recognize = false; +let mode; +figma.showUI(__html__, { width: 450, height: 550 }); +const run = () => { + var _a, _b; + // ignore when nothing was selected + if (figma.currentPage.selection.length === 0) { + figma.ui.postMessage({ + type: "empty", + }); + return; + } + // check [ignoreStackParent] description + if (figma.currentPage.selection.length > 0) { + parentId = (_b = (_a = figma.currentPage.selection[0].parent) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : ""; + } + let result = ""; + const convertedSelection = convertIntoAltNodes(figma.currentPage.selection, null); + // @ts-ignore + if (mode === "flutter") { + result = flutterMain(convertedSelection, parentId, material); + } + else if (mode === "tailwind") { + result = tailwindMain(convertedSelection, parentId, isJsx, layerName, recognize); + } + else if (mode === "swiftui") { + result = swiftuiMain(convertedSelection, parentId); + } + else if (mode === "html") { + result = htmlMain(convertedSelection, parentId, isJsx, layerName); + } + console.log(result); + figma.ui.postMessage({ + type: "result", + data: result, + }); + if (mode === "tailwind" || + mode === "flutter" || + mode === "html" || + mode === "swiftui") { + figma.ui.postMessage({ + type: "colors", + data: retrieveGenericSolidUIColors(convertedSelection, mode), + }); + figma.ui.postMessage({ + type: "gradients", + data: retrieveGenericLinearGradients(convertedSelection, mode), + }); + } + if (mode === "tailwind") { + figma.ui.postMessage({ + type: "text", + data: retrieveTailwindText(convertedSelection), + }); + } +}; +figma.on("selectionchange", () => { + run(); +}); +// efficient? No. Works? Yes. +// todo pass data instead of relying in types +figma.ui.onmessage = (msg) => { + if (msg.type === "tailwind" || + msg.type === "flutter" || + msg.type === "swiftui" || + msg.type === "html") { + mode = msg.type; + run(); + } + else if (msg.type === "jsx" && msg.data !== isJsx) { + isJsx = msg.data; + run(); + } + else if (msg.type === "layerName" && msg.data !== layerName) { + layerName = msg.data; + run(); + } + else if (msg.type === "material" && msg.data !== material) { + material = msg.data; + run(); + } + else if (msg.type === "recognize" && msg.data !== recognize) { + recognize = msg.data; + run(); + } +}; +//# sourceMappingURL=code.js.map diff --git a/public/code.js.map b/public/code.js.map new file mode 100644 index 00000000..6b3a5093 --- /dev/null +++ b/public/code.js.map @@ -0,0 +1 @@ +{"version":3,"file":"code.js","sources":["../src/tailwind/conversionTables.ts","../src/nearest-color/nearestColor.ts","../src/common/retrieveFill.ts","../src/common/color.ts","../src/tailwind/builderImpl/tailwindColor.ts","../src/common/commonTextHeightSpacing.ts","../src/tailwind/builderImpl/tailwindShadow.ts","../src/tailwind/builderImpl/tailwindBlend.ts","../src/tailwind/builderImpl/tailwindBorder.ts","../src/common/parentCoordinates.ts","../src/common/commonPosition.ts","../src/tailwind/builderImpl/tailwindPosition.ts","../src/common/nodeWidthHeight.ts","../src/common/numToAutoFixed.ts","../src/common/parseJSX.ts","../src/tailwind/builderImpl/tailwindSize.ts","../src/common/commonPadding.ts","../src/tailwind/builderImpl/tailwindPadding.ts","../src/tailwind/tailwindDefaultBuilder.ts","../src/tailwind/tailwindTextBuilder.ts","../src/common/convertFontWeight.ts","../src/tailwind/retrieveUI/retrieveTexts.ts","../src/swiftui/builderImpl/swiftuiColor.ts","../src/flutter/builderImpl/flutterColor.ts","../src/html/builderImpl/htmlColor.ts","../src/altNodes/altMixins.ts","../src/swiftui/builderImpl/swiftuiTextWeight.ts","../src/swiftui/builderImpl/swiftuiEffects.ts","../src/swiftui/builderImpl/swiftuiBorder.ts","../src/swiftui/builderImpl/swiftuiPadding.ts","../src/swiftui/builderImpl/swiftuiSize.ts","../src/swiftui/builderImpl/swiftuiPosition.ts","../src/swiftui/builderImpl/swiftuiBlend.ts","../src/swiftui/swiftuiDefaultBuilder.ts","../src/swiftui/swiftuiTextBuilder.ts","../src/common/indentString.ts","../src/swiftui/swiftuiMain.ts","../src/altNodes/convertGroupToFrame.ts","../src/altNodes/convertToAutoLayout.ts","../src/altNodes/convertNodesOnRectangle.ts","../src/altNodes/altConversion.ts","../src/common/retrieveUI/commonUI.ts","../src/common/retrieveUI/retrieveColors.ts","../src/html/builderImpl/htmlSize.ts","../src/html/builderImpl/htmlTextSize.ts","../src/html/builderImpl/htmlShadow.ts","../src/html/builderImpl/htmlBlend.ts","../src/html/builderImpl/htmlPosition.ts","../src/html/builderImpl/htmlPadding.ts","../src/html/builderImpl/htmlBorderRadius.ts","../src/html/htmlDefaultBuilder.ts","../src/html/htmlTextBuilder.ts","../src/html/htmlMain.ts","../src/common/recognizeUI.ts","../src/common/traversalUtils.ts","../src/tailwind/tailwindMain.ts","../src/flutter/builderImpl/flutterPosition.ts","../src/flutter/builderImpl/flutterBlend.ts","../src/flutter/builderImpl/flutterBorder.ts","../src/flutter/builderImpl/flutterSize.ts","../src/flutter/builderImpl/flutterPadding.ts","../src/flutter/builderImpl/flutterShadow.ts","../src/flutter/flutterContainer.ts","../src/flutter/flutterMaterial.ts","../src/flutter/flutterDefaultBuilder.ts","../src/flutter/flutterTextBuilder.ts","../src/flutter/flutterMain.ts","../src/code.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["gradientDirection","retrieveAbsolutePos","deepFlatten","calculateContrastRatio","luminance","parentId","htmlTextSizeBox","showLayerName","addSpacingIfNeeded","rowColumnProps","flutterContainer","material"],"mappings":"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"} \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 00000000..714b02ec --- /dev/null +++ b/public/index.html @@ -0,0 +1,7628 @@ + + + + + + + + + \ No newline at end of file diff --git a/src/code.ts b/src/code.ts index 8da1948b..ecd3a729 100644 --- a/src/code.ts +++ b/src/code.ts @@ -13,7 +13,7 @@ let parentId: string; let isJsx = false; let layerName = false; let material = true; - +let recognize = false; let mode: "flutter" | "swiftui" | "html" | "tailwind"; figma.showUI(__html__, { width: 450, height: 550 }); @@ -43,7 +43,7 @@ const run = () => { if (mode === "flutter") { result = flutterMain(convertedSelection, parentId, material); } else if (mode === "tailwind") { - result = tailwindMain(convertedSelection, parentId, isJsx, layerName); + result = tailwindMain(convertedSelection, parentId, isJsx, layerName, recognize); } else if (mode === "swiftui") { result = swiftuiMain(convertedSelection, parentId); } else if (mode === "html") { @@ -105,5 +105,8 @@ figma.ui.onmessage = (msg) => { } else if (msg.type === "material" && msg.data !== material) { material = msg.data; run(); + } else if (msg.type === "recognize" && msg.data !== recognize) { + recognize = msg.data; + run(); } }; diff --git a/src/common/recognizeUI.ts b/src/common/recognizeUI.ts new file mode 100644 index 00000000..42c23a5b --- /dev/null +++ b/src/common/recognizeUI.ts @@ -0,0 +1,50 @@ +export enum componentName { + input, + button, + checkbox, + avatar, + radio, + select, + Alert, + list, + background +} +export const isUI = (name:string) => { + console.log('isUI'+name) + return Object.values(componentName).includes(name); +} + +export const recognizeAntdUI = (name: string, text: string) => { + console.log(name) + switch(name){ + case 'input': return `` + case 'button': return `` + case 'checkbox': return `${text}` + case 'list': return ` + Header} + footer={
    Footer
    } + bordered + dataSource={['item1','item2','item3']} + renderItem={item => ( + + [ITEM] {item} + + )} + /> + ` + case 'avatar': return `${text}` + case 'Alert': return '' + case 'radio': return `${text}` + case 'select': return ` + + ` + default: return text + } +} \ No newline at end of file diff --git a/src/common/traversalUtils.ts b/src/common/traversalUtils.ts new file mode 100644 index 00000000..92906249 --- /dev/null +++ b/src/common/traversalUtils.ts @@ -0,0 +1,62 @@ +import { AltSceneNode } from "../altNodes/altMixins"; + +export const nodesTraverserGenerator = (nodes: AltSceneNode[]) => { + // return a traverser for modify particular type nodes + return { + nodes, + traverseFirstLayer(type:string,method:Function,...args){ + // traverse first layer only + function traverse(node:AltSceneNode){ + if (node.type === type) { + method(node, ...args); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseAllNodes(method:Function,...args){ + function traverse(node:AltSceneNode){ + method(node,...args); + if(node.type === 'FRAME'|| node.type === 'GROUP'){ + node.children.forEach(child=>traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseNodesAndSkip(type:string,method:Function,...args) { + function traverse(node:AltSceneNode){ + const typeReg = new RegExp(type) + if (!typeReg.exec(node.type)) { + method(node,...args); + } + if(node.type === 'FRAME'|| node.type === 'GROUP'){ + node.children.forEach(child=>traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + }, + traverseNodes(type:string,method:Function,...args) { + function traverse(node:AltSceneNode){ + const typeReg = new RegExp(type) + if (typeReg.exec(node.type)) { + method(node,...args); + } + if(node.type === 'FRAME'|| node.type === 'GROUP' || node.type === 'INSTANCE'){ + node.children.forEach(child=>traverse(child)); + } + } + for (const node of this.nodes) { + traverse(node); + } + return this; + } + } +} diff --git a/src/tailwind/tailwindMain.ts b/src/tailwind/tailwindMain.ts index 18fea79b..1e8fc42b 100644 --- a/src/tailwind/tailwindMain.ts +++ b/src/tailwind/tailwindMain.ts @@ -12,6 +12,8 @@ import { tailwindVector } from "./vector"; import { TailwindTextBuilder } from "./tailwindTextBuilder"; import { TailwindDefaultBuilder } from "./tailwindDefaultBuilder"; import { retrieveTopFill } from "../common/retrieveFill"; +import { isUI, recognizeAntdUI } from "../common/recognizeUI"; +import { nodesTraverserGenerator } from "../common/traversalUtils"; let parentId = ""; let showLayerName = false; @@ -20,12 +22,13 @@ export const tailwindMain = ( sceneNode: Array, parentIdSrc: string = "", isJsx: boolean = false, - layerName: boolean = false + layerName: boolean = false, + recognize: boolean = false ): string => { parentId = parentIdSrc; showLayerName = layerName; - - let result = tailwindWidgetGenerator(sceneNode, isJsx); + console.log(recognize); + let result = tailwindWidgetGenerator(sceneNode, isJsx, recognize); // remove the initial \n that is made in Container. if (result.length > 0 && result.slice(0, 1) === "\n") { @@ -38,14 +41,15 @@ export const tailwindMain = ( // todo lint idea: replace BorderRadius.only(topleft: 8, topRight: 8) with BorderRadius.horizontal(8) const tailwindWidgetGenerator = ( sceneNode: ReadonlyArray, - isJsx: boolean + isJsx: boolean, + recognize: boolean ): string => { let comp = ""; - // filter non visible nodes. This is necessary at this step because conversion already happened. const visibleSceneNode = sceneNode.filter((d) => d.visible !== false); visibleSceneNode.forEach((node) => { + console.log(node.name,node.type) if (node.type === "RECTANGLE" || node.type === "ELLIPSE") { comp += tailwindContainer( node, @@ -55,9 +59,9 @@ const tailwindWidgetGenerator = ( isJsx ); } else if (node.type === "GROUP") { - comp += tailwindGroup(node, isJsx); + comp += tailwindGroup(node, isJsx, recognize); } else if (node.type === "FRAME") { - comp += tailwindFrame(node, isJsx); + comp += tailwindFrame(node, isJsx, recognize); } else if (node.type === "TEXT") { comp += tailwindText(node, false, isJsx); } @@ -68,7 +72,7 @@ const tailwindWidgetGenerator = ( return comp; }; -const tailwindGroup = (node: AltGroupNode, isJsx: boolean = false): string => { +const tailwindGroup = (node: AltGroupNode, isJsx: boolean = false, recognize: boolean): string => { // ignore the view when size is zero or less // while technically it shouldn't get less than 0, due to rounding errors, // it can get to values like: -0.000004196293048153166 @@ -76,7 +80,6 @@ const tailwindGroup = (node: AltGroupNode, isJsx: boolean = false): string => { if (node.width <= 0 || node.height <= 0 || node.children.length === 0) { return ""; } - const vectorIfExists = tailwindVector(node, showLayerName, parentId, isJsx); if (vectorIfExists) return vectorIfExists; @@ -85,16 +88,24 @@ const tailwindGroup = (node: AltGroupNode, isJsx: boolean = false): string => { .blend(node) .widthHeight(node) .position(node, parentId); - if (builder.attributes || builder.style) { const attr = builder.build("relative "); - - const generator = tailwindWidgetGenerator(node.children, isJsx); + if (recognize && isUI(node.name)) { + const nodesTraverse = nodesTraverserGenerator(Array.isArray(node)?node:[node]) + let text = ''; + const getText = (node:AltTextNode) => { + text = node.characters; + } + nodesTraverse.traverseNodes("TEXT",getText) + return recognizeAntdUI(node.name,text); + + } + const generator = tailwindWidgetGenerator(node.children, isJsx, recognize); return `\n${indentString(generator)}\n`; } - return tailwindWidgetGenerator(node.children, isJsx); + return tailwindWidgetGenerator(node.children, isJsx, recognize); }; const tailwindText = ( @@ -133,10 +144,19 @@ const tailwindText = ( } }; -const tailwindFrame = (node: AltFrameNode, isJsx: boolean): string => { +const tailwindFrame = (node: AltFrameNode, isJsx: boolean, recognize: boolean): string => { // const vectorIfExists = tailwindVector(node, isJsx); // if (vectorIfExists) return vectorIfExists; - + + if (recognize && isUI(node.name)) { + const nodesTraverse = nodesTraverserGenerator(Array.isArray(node)?node:[node]) + let text = ''; + const getText = (node:AltTextNode) => { + text = node.characters; + } + nodesTraverse.traverseNodes("TEXT",getText) + return recognizeAntdUI(node.name,text); + } if ( node.children.length === 1 && node.children[0].type === "TEXT" && @@ -152,7 +172,7 @@ const tailwindFrame = (node: AltFrameNode, isJsx: boolean): string => { ); } - const childrenStr = tailwindWidgetGenerator(node.children, isJsx); + const childrenStr = tailwindWidgetGenerator(node.children, isJsx, recognize); if (node.layoutMode !== "NONE") { const rowColumn = rowColumnProps(node); diff --git a/src/ui/ScreenTailwind.svelte b/src/ui/ScreenTailwind.svelte index ef9aab5e..40896a2c 100644 --- a/src/ui/ScreenTailwind.svelte +++ b/src/ui/ScreenTailwind.svelte @@ -74,7 +74,15 @@ "*" ); } - + let recognize = false; + $: if (recognize || !recognize) { + parent.postMessage( + { + pluginMessage: { type: "recognize", data: recognize} + }, + "*" + ); + } import { createEventDispatcher } from "svelte"; const dispatch = createEventDispatcher(); const clipboard = data => dispatch("clipboard", { text: data }); @@ -249,6 +257,7 @@ +