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.
@@ -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 === 'FIXED' ? 'FIXED' : 'AUTO')
127
- frame.counterAxisSizingMode = data.counterAxisSizingMode === 'FILL' ? 'FIXED' : (data.counterAxisSizingMode === 'FIXED' ? 'FIXED' : 'AUTO')
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' : (data.primaryAxisSizingMode === 'FIXED' ? 'FIXED' : 'AUTO')
308
- if (data.counterAxisSizingMode) node.counterAxisSizingMode = data.counterAxisSizingMode === 'FILL' ? 'FIXED' : (data.counterAxisSizingMode === 'FIXED' ? 'FIXED' : 'AUTO')
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.1",
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",
@@ -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
@@ -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)