conductor-figma 3.3.1 → 3.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/figma-plugin/code.js +4 -5
- package/package.json +1 -1
- package/src/tools/handlers.js +3 -2
- package/src/tools/registry.js +22 -14
package/figma-plugin/code.js
CHANGED
|
@@ -123,9 +123,8 @@ async function executeCommand(cmd, data) {
|
|
|
123
123
|
frame.name = data.name || 'Frame'
|
|
124
124
|
if (data.width) frame.resize(data.width, data.height || data.width)
|
|
125
125
|
frame.layoutMode = data.direction || 'VERTICAL'
|
|
126
|
-
frame.primaryAxisSizingMode = data.primaryAxisSizingMode === 'FILL' ? 'FIXED' : (data.primaryAxisSizingMode
|
|
127
|
-
frame.counterAxisSizingMode = data.counterAxisSizingMode
|
|
128
|
-
if (data.primaryAxisSizingMode === 'FILL') frame.layoutGrow = 1
|
|
126
|
+
frame.primaryAxisSizingMode = data.primaryAxisSizingMode === 'FILL' ? 'FIXED' : (data.primaryAxisSizingMode || 'HUG')
|
|
127
|
+
frame.counterAxisSizingMode = data.counterAxisSizingMode || 'HUG'
|
|
129
128
|
if (data.paddingTop !== undefined) frame.paddingTop = data.paddingTop
|
|
130
129
|
if (data.paddingRight !== undefined) frame.paddingRight = data.paddingRight
|
|
131
130
|
if (data.paddingBottom !== undefined) frame.paddingBottom = data.paddingBottom
|
|
@@ -304,8 +303,8 @@ async function executeCommand(cmd, data) {
|
|
|
304
303
|
if (data.gap !== undefined) node.itemSpacing = data.gap
|
|
305
304
|
if (data.primaryAxisAlignItems) node.primaryAxisAlignItems = data.primaryAxisAlignItems
|
|
306
305
|
if (data.counterAxisAlignItems) node.counterAxisAlignItems = data.counterAxisAlignItems
|
|
307
|
-
if (data.primaryAxisSizingMode) node.primaryAxisSizingMode = data.primaryAxisSizingMode === 'FILL' ? 'FIXED' :
|
|
308
|
-
if (data.counterAxisSizingMode) node.counterAxisSizingMode = data.counterAxisSizingMode === 'FILL' ? 'FIXED' :
|
|
306
|
+
if (data.primaryAxisSizingMode) node.primaryAxisSizingMode = data.primaryAxisSizingMode === 'FILL' ? 'FIXED' : data.primaryAxisSizingMode
|
|
307
|
+
if (data.counterAxisSizingMode) node.counterAxisSizingMode = data.counterAxisSizingMode === 'FILL' ? 'FIXED' : data.counterAxisSizingMode
|
|
309
308
|
return { id: node.id, layout: 'set' }
|
|
310
309
|
}
|
|
311
310
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conductor-figma",
|
|
3
|
-
"version": "3.3.
|
|
3
|
+
"version": "3.3.2",
|
|
4
4
|
"description": "Design-intelligent MCP server for Figma. 201 design-intelligent tools for Figma. Every tool knows typography, spacing, color, accessibility. Not a shape proxy — a design engine.",
|
|
5
5
|
"author": "0xDragoon",
|
|
6
6
|
"license": "MIT",
|
package/src/tools/handlers.js
CHANGED
|
@@ -81,7 +81,7 @@ export async function handleTool(name, args, bridge) {
|
|
|
81
81
|
var rootResult = await bridge.send('create_frame', {
|
|
82
82
|
name: interpretation.industry + ' — ' + interpretation.mood,
|
|
83
83
|
direction: 'VERTICAL', width: W, gap: 0,
|
|
84
|
-
fill: pageColors.bg
|
|
84
|
+
fill: pageColors.bg, primaryAxisSizingMode: 'HUG'
|
|
85
85
|
})
|
|
86
86
|
|
|
87
87
|
var totalElements = 1
|
|
@@ -133,7 +133,8 @@ export async function handleTool(name, args, bridge) {
|
|
|
133
133
|
var rootResult = await bridge.send('create_frame', {
|
|
134
134
|
name: (args.type || 'Page').charAt(0).toUpperCase() + (args.type || 'page').slice(1) + ' Page',
|
|
135
135
|
direction: 'VERTICAL', width: pageSpec.width, gap: 0,
|
|
136
|
-
fill: semanticColors(pageSpec.brand, pageSpec.mode || 'dark').bg
|
|
136
|
+
fill: semanticColors(pageSpec.brand, pageSpec.mode || 'dark').bg,
|
|
137
|
+
primaryAxisSizingMode: 'HUG'
|
|
137
138
|
})
|
|
138
139
|
// Build each section inside the page
|
|
139
140
|
var totalElements = 1
|
package/src/tools/registry.js
CHANGED
|
@@ -1116,18 +1116,6 @@ const EFFECTS = {
|
|
|
1116
1116
|
}, 'effects'),
|
|
1117
1117
|
}
|
|
1118
1118
|
|
|
1119
|
-
// ═══ DESIGN FROM PROMPT (2) ═══
|
|
1120
|
-
const INTERPRET = {
|
|
1121
|
-
design_from_prompt: tool('design_from_prompt', 'Takes any natural language description and generates a complete Figma design. Analyzes mood (minimal, bold, playful, luxury, corporate, techy, organic, brutalist, editorial), detects industry (fintech, health, saas, ecommerce, etc.), picks appropriate colors, spacing density, shadow depth, corner radii, and typography. Then composes a multi-section design with 30-300+ elements.', {
|
|
1122
|
-
prompt: req('string', 'Natural language description. Examples: "A dark fintech dashboard with metrics and charts", "A playful education landing page with pricing", "A minimal luxury brand site for a candle company called Ember"'),
|
|
1123
|
-
width: opt('number', 'Frame width', 1440),
|
|
1124
|
-
}, 'interpret'),
|
|
1125
|
-
|
|
1126
|
-
interpret_prompt: tool('interpret_prompt', 'Analyzes a design prompt and returns the interpretation without generating anything. Shows what mood, industry, colors, and sections would be used. Good for previewing before generating.', {
|
|
1127
|
-
prompt: req('string', 'Design description to analyze'),
|
|
1128
|
-
}, 'interpret'),
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
1119
|
// ═══ ASSEMBLE ALL TOOLS ═══
|
|
1132
1120
|
export const ALL_TOOLS = {
|
|
1133
1121
|
...CREATE, ...MODIFY, ...VECTOR, ...READ,
|
|
@@ -1135,7 +1123,6 @@ export const ALL_TOOLS = {
|
|
|
1135
1123
|
...BATCH, ...DESIGN_SYSTEM, ...RESPONSIVE,
|
|
1136
1124
|
...TYPOGRAPHY, ...COLOR, ...PROTOTYPE,
|
|
1137
1125
|
...PAGE, ...LIBRARY, ...ANNOTATION, ...EFFECTS,
|
|
1138
|
-
...INTERPRET,
|
|
1139
1126
|
}
|
|
1140
1127
|
|
|
1141
1128
|
export const TOOL_LIST = Object.values(ALL_TOOLS)
|
|
@@ -1159,8 +1146,29 @@ export const CATEGORIES = {
|
|
|
1159
1146
|
library: Object.keys(LIBRARY),
|
|
1160
1147
|
annotation: Object.keys(ANNOTATION),
|
|
1161
1148
|
effects: Object.keys(EFFECTS),
|
|
1162
|
-
interpret: Object.keys(INTERPRET),
|
|
1163
1149
|
}
|
|
1164
1150
|
|
|
1165
1151
|
export function getTool(name) { return ALL_TOOLS[name] || null }
|
|
1166
1152
|
export function getToolsByCategory(cat) { return CATEGORIES[cat] || [] }
|
|
1153
|
+
|
|
1154
|
+
// ═══ DESIGN FROM PROMPT (1) ═══
|
|
1155
|
+
const INTERPRET = {
|
|
1156
|
+
design_from_prompt: tool('design_from_prompt', 'Takes any natural language description and generates a complete Figma design. Analyzes mood (minimal, bold, playful, luxury, corporate, techy, organic, brutalist, editorial), detects industry (fintech, health, saas, ecommerce, etc.), picks appropriate colors, spacing density, shadow depth, corner radii, and typography. Then composes a multi-section design with 30-300+ elements.', {
|
|
1157
|
+
prompt: req('string', 'Natural language description. Examples: "A dark fintech dashboard with metrics and charts", "A playful education landing page with pricing", "A minimal luxury brand site for a candle company called Ember"'),
|
|
1158
|
+
width: opt('number', 'Frame width', 1440),
|
|
1159
|
+
}, 'interpret'),
|
|
1160
|
+
|
|
1161
|
+
interpret_prompt: tool('interpret_prompt', 'Analyzes a design prompt and returns the interpretation without generating anything. Shows what mood, industry, colors, and sections would be used. Good for previewing before generating.', {
|
|
1162
|
+
prompt: req('string', 'Design description to analyze'),
|
|
1163
|
+
}, 'interpret'),
|
|
1164
|
+
}
|
|
1165
|
+
|
|
1166
|
+
// Update ALL_TOOLS
|
|
1167
|
+
Object.assign(ALL_TOOLS, INTERPRET)
|
|
1168
|
+
|
|
1169
|
+
// Refresh counts
|
|
1170
|
+
const _newList = Object.values(ALL_TOOLS)
|
|
1171
|
+
const _newCount = Object.keys(ALL_TOOLS).length
|
|
1172
|
+
|
|
1173
|
+
// Add category
|
|
1174
|
+
CATEGORIES.interpret = Object.keys(INTERPRET)
|