Skip to content

Commit 5f0ebfd

Browse files
authored
Put back code gen support for anatomy definition (#270)
1 parent d934465 commit 5f0ebfd

File tree

6 files changed

+84
-11
lines changed

6 files changed

+84
-11
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "patch",
3+
"comment": "Put back code gen support for anatomy definition",
4+
"packageName": "@adaptive-web/adaptive-ui-designer-figma",
5+
"email": "[email protected]",
6+
"dependentChangeType": "patch"
7+
}

packages/adaptive-ui-designer-figma-plugin/src/figma/node.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type Color as CuloriColor, modeLrgb, type Rgb, useMode, wcagLuminance } from "culori/fn";
22
import { Color, Gradient, Shadow, StyleProperty } from "@adaptive-web/adaptive-ui";
33
import { AppliedStyleValues, Controller, focusIndicatorNodeName, PluginNode, State, StatesState, STYLE_REMOVE } from "@adaptive-web/adaptive-ui-designer-core";
4-
import { canHaveChildren, canHaveIndividualStrokes, colorToRgb, colorToRgba, isContainerNode, isInstanceNode, isLineNode, isRectangleNode, isShapeNode, isTextNode, isVectorNode, SOLID_BLACK, SOLID_TRANSPARENT, variantBooleanHelper } from "./utility.js";
4+
import { canHaveChildren, canHaveIndividualStrokes, colorToRgb, colorToRgba, isContainerNode, isInstanceNode, isLayoutNode, isLineNode, isRectangleNode, isShapeNode, isTextNode, isVectorNode, SOLID_BLACK, SOLID_TRANSPARENT, variantBooleanHelper } from "./utility.js";
55
import { gradientToGradientPaint } from "./gradient.js";
66
import { PluginDataResolver } from "./plugin-data-resolver.js";
77

@@ -79,6 +79,7 @@ export class FigmaPluginNode extends PluginNode {
7979
this._componentAppliedDesignTokens = this._refNode.appliedDesignTokens;
8080
}
8181

82+
this.config = JSON.parse(PluginNode.pluginDataAccessor.getPluginData(this, "config") || "{}");
8283
this._localDesignTokens = await PluginNode.pluginDataAccessor.getLocalDesignTokens(this);
8384
this._appliedStyleModules = await PluginNode.pluginDataAccessor.getAppliedStyleModules(this);
8485
this._appliedDesignTokens = await PluginNode.pluginDataAccessor.getAppliedDesignTokens(this);
@@ -447,6 +448,14 @@ export class FigmaPluginNode extends PluginNode {
447448
}
448449
}
449450

451+
private handleSize(values: AppliedStyleValues) {
452+
if (isLayoutNode(this._node)) {
453+
const width = this.safeNumber(values.get(StyleProperty.width)?.value) || this._node.width;
454+
const height = this.safeNumber(values.get(StyleProperty.height)?.value) || this._node.height;
455+
(this._node).resize(width, height);
456+
}
457+
}
458+
450459
protected safeNumber(value: string, defaultValue: number = 0) {
451460
return value === STYLE_REMOVE ? defaultValue : Number.parseFloat(value);
452461
}
@@ -457,6 +466,8 @@ export class FigmaPluginNode extends PluginNode {
457466

458467
this.handleStroke(values);
459468

469+
this.handleSize(values);
470+
460471
// Paint all applied design tokens on the node
461472
for (const [target, styleValue] of values) {
462473
// console.log("applied design token eval", target, applied);
@@ -571,6 +582,10 @@ export class FigmaPluginNode extends PluginNode {
571582
(this._node as BaseFrameMixin).itemSpacing = this.safeNumber(value); // Removes unit, so assumes px
572583
}
573584
break;
585+
case StyleProperty.height:
586+
case StyleProperty.width:
587+
// Ignore, handled in handleSize.
588+
break;
574589
case StyleProperty.shadow:
575590
{
576591
const shadows: Shadow[] = Array.isArray(value) ? value : [value];
@@ -592,6 +607,7 @@ export class FigmaPluginNode extends PluginNode {
592607
}
593608
break;
594609
default:
610+
console.error(`Applied design token could not be painted for ${target}:`, JSON.stringify(value), this.debugInfo);
595611
throw new Error(`Applied design token could not be painted for ${target}: ${JSON.stringify(value)}`);
596612
}
597613
}

packages/adaptive-ui-designer-figma-plugin/src/figma/utility.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,32 @@ export function isContainerNode(node: BaseNode): node is
5555
].some((test: (node: BaseNode) => boolean) => test(node));
5656
}
5757

58+
export function isLayoutNode(node: BaseNode): node is
59+
FrameNode |
60+
GroupNode |
61+
ComponentSetNode |
62+
ComponentNode |
63+
InstanceNode |
64+
RectangleNode |
65+
EllipseNode |
66+
PolygonNode |
67+
StarNode |
68+
BooleanOperationNode |
69+
VectorNode |
70+
LineNode |
71+
TextNode {
72+
return [
73+
isFrameNode,
74+
isGroupNode,
75+
isComponentSetNode,
76+
isComponentNode,
77+
isInstanceNode,
78+
isShapeNode,
79+
isLineNode,
80+
isTextNode,
81+
].some((test: (node: BaseNode) => boolean) => test(node));
82+
}
83+
5884
export function isShapeNode(node: BaseNode): node is
5985
RectangleNode |
6086
EllipseNode |

packages/adaptive-ui-designer-figma-plugin/src/ui/app.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ const footerTemplate = html<App>`
200200
<adaptive-button
201201
appearance="stealth"
202202
aria-label=${genStylesLabel}
203-
style="display: ${/* HACK: Not using this currently (x) => (x.controller.code.supportsCodeGen ? "block" : */"none"/*)*/};"
203+
style="display: ${(x) => (x.controller.code.supportsCodeGen ? "block" : "none")};"
204204
@click=${(x) => {
205205
const val = x.controller.code.generateForSelectedNodes();
206206
clipboardCopy(val);

packages/adaptive-ui-designer-figma-plugin/src/ui/ui-controller-code.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,19 @@ export class CodeController {
3333
public generateForSelectedNodes(): string {
3434
const selectedNode = this.controller.selectedNodes[0];
3535

36-
const codeGen = new CodeGen();
36+
const name = selectedNode.additionalData.get(AdditionalDataKeys.codeGenName) || "unknown";
37+
38+
// const codeGen = new CodeGen();
39+
3740
const anatomy = Anatomy.fromPluginUINodeData(selectedNode);
38-
const genAnatomy = `${codeGen.generateAnatomyCode(anatomy)}\n`;
39-
const genStyles = `${codeGen.generateStylesCode(anatomy)}\n`;
41+
const anatomyJson = JSON.stringify(anatomy, null, 4);
42+
// const genAnatomy = `${codeGen.generateAnatomyCode(anatomy)}\n`;
43+
// const genStyles = `${codeGen.generateStylesCode(anatomy)}\n`;
4044

41-
const output = `${genAnatomy}${genStyles}`;
45+
// const output = `${genAnatomy}${genStyles}`;
46+
console.log("Anatomy generated", name);
47+
48+
const output = anatomyJson;
4249
return output;
4350
}
4451
}

packages/adaptive-ui-designer-figma/src/lib/anatomy.ts

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
SerializableStringCondition,
1010
SerializableStyleRule,
1111
} from "@adaptive-web/adaptive-ui";
12-
import { AdditionalDataKeys, type PluginUINodeData } from "@adaptive-web/adaptive-ui-designer-core";
12+
import { AdditionalDataKeys, AppliedDesignTokens, AppliedStyleModules, type PluginUINodeData } from "@adaptive-web/adaptive-ui-designer-core";
1313

1414
// A simple string for ignoring layers in the design tool
1515
const ignoreLayerName = "(Figma)";
@@ -252,18 +252,35 @@ function walkNode(node: PluginUINodeData, componentName: string, condition: Reco
252252
anatomy.parts.add(node.name);
253253
}
254254

255-
if (node.appliedStyleModules.length > 0 || node.appliedDesignTokens.size > 0) {
255+
const appliedStyleModules = new AppliedStyleModules();
256+
if (node.componentAppliedStyleModules) {
257+
appliedStyleModules.push(...node.componentAppliedStyleModules);
258+
}
259+
if (node.appliedStyleModules) {
260+
appliedStyleModules.push(...node.appliedStyleModules);
261+
}
262+
263+
const appliedDesignTokens = new AppliedDesignTokens([
264+
...(node.componentAppliedDesignTokens
265+
? node.componentAppliedDesignTokens
266+
: []),
267+
...node.appliedDesignTokens
268+
? node.appliedDesignTokens
269+
: [],
270+
]);
271+
272+
if (appliedStyleModules.length > 0 || appliedDesignTokens.size > 0) {
256273
const styleRule = new StyleRule();
257274

258275
if (condition) {
259276
styleRule.contextCondition = condition;
260277
}
261-
262-
node.appliedStyleModules.forEach(style => {
278+
279+
appliedStyleModules.forEach(style => {
263280
styleRule.styles.add(style);
264281
});
265282

266-
node.appliedDesignTokens.forEach((token, target) => {
283+
appliedDesignTokens.forEach((token, target) => {
267284
const tokenRef = token.tokenID;
268285
styleRule.properties.set(target, tokenRef);
269286
});

0 commit comments

Comments
 (0)