@muloka/figma-console-mcp 0.3.0 → 0.5.0

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.
Files changed (35) hide show
  1. package/README.md +31 -13
  2. package/dist/apps/design-system-dashboard/mcp-app.html +521 -0
  3. package/dist/apps/token-browser/mcp-app.html +410 -0
  4. package/dist/cloudflare/core/figma-tools.js +64 -13
  5. package/dist/cloudflare/core/tokens-tools.js +1 -1
  6. package/dist/cloudflare/core/websocket-server.js +60 -7
  7. package/dist/cloudflare/index.js +3 -3
  8. package/dist/core/port-discovery.d.ts.map +1 -1
  9. package/dist/core/port-discovery.js +101 -20
  10. package/dist/core/port-discovery.js.map +1 -1
  11. package/dist/core/websocket-server.d.ts +18 -1
  12. package/dist/core/websocket-server.d.ts.map +1 -1
  13. package/dist/core/websocket-server.js +44 -3
  14. package/dist/core/websocket-server.js.map +1 -1
  15. package/dist/core/write-tools.d.ts.map +1 -1
  16. package/dist/core/write-tools.js +98 -9
  17. package/dist/core/write-tools.js.map +1 -1
  18. package/dist/local.d.ts.map +1 -1
  19. package/dist/local.js +7 -3
  20. package/dist/local.js.map +1 -1
  21. package/figma-desktop-bridge/code.js +57 -27
  22. package/figma-desktop-bridge/ui.html +76 -7
  23. package/package.json +1 -1
  24. package/dist/browser/base.d.ts +0 -58
  25. package/dist/browser/base.d.ts.map +0 -1
  26. package/dist/browser/base.js +0 -6
  27. package/dist/browser/base.js.map +0 -1
  28. package/dist/browser/local.d.ts +0 -87
  29. package/dist/browser/local.d.ts.map +0 -1
  30. package/dist/browser/local.js +0 -318
  31. package/dist/browser/local.js.map +0 -1
  32. package/dist/core/figma-desktop-connector.d.ts +0 -312
  33. package/dist/core/figma-desktop-connector.d.ts.map +0 -1
  34. package/dist/core/figma-desktop-connector.js +0 -1298
  35. package/dist/core/figma-desktop-connector.js.map +0 -1
@@ -1,318 +0,0 @@
1
- /**
2
- * Local Browser Manager (Legacy)
3
- * Note: This module is maintained for backwards compatibility but is no longer
4
- * the primary connection method. Use the WebSocket Desktop Bridge plugin instead.
5
- */
6
- import puppeteer from 'puppeteer-core';
7
- import { createChildLogger } from '../core/logger.js';
8
- import { extractFileKey } from '../core/figma-api.js';
9
- const logger = createChildLogger({ component: 'local-browser' });
10
- /**
11
- * Local Browser Manager
12
- * Connects to existing Figma Desktop instance via remote debugging port
13
- */
14
- export class LocalBrowserManager {
15
- constructor(config) {
16
- this.browser = null;
17
- this.page = null;
18
- this.config = config;
19
- }
20
- /**
21
- * Connect to Figma Desktop via remote debugging port
22
- */
23
- async launch() {
24
- if (this.browser) {
25
- logger.info('Browser already connected, reusing instance');
26
- return;
27
- }
28
- const { debugHost, debugPort } = this.config;
29
- const browserURL = `http://${debugHost}:${debugPort}`;
30
- logger.info({ browserURL }, 'Connecting to Figma Desktop');
31
- try {
32
- // Connect to existing browser (Figma Desktop)
33
- this.browser = await puppeteer.connect({
34
- browserURL,
35
- defaultViewport: null, // Use Figma's viewport
36
- });
37
- logger.info('Connected to Figma Desktop successfully');
38
- // Handle disconnection
39
- this.browser.on('disconnected', () => {
40
- logger.warn('Disconnected from Figma Desktop');
41
- this.browser = null;
42
- this.page = null;
43
- });
44
- }
45
- catch (error) {
46
- logger.error({ error, browserURL }, 'Failed to connect to Figma Desktop');
47
- throw new Error(`Failed to connect to Figma Desktop.\n\n` +
48
- `Please open the Desktop Bridge plugin in Figma:\n` +
49
- ` Plugins → Development → Figma Desktop Bridge\n\n` +
50
- `Error: ${error instanceof Error ? error.message : String(error)}`);
51
- }
52
- }
53
- /**
54
- * Find the best page for plugin debugging
55
- * Actively searches for pages with workers across ALL tabs
56
- */
57
- async findBestPage() {
58
- if (!this.browser) {
59
- return null;
60
- }
61
- const pages = await this.browser.pages();
62
- // Find Figma pages with workers
63
- const figmaPages = pages.filter(p => {
64
- const url = p.url();
65
- return url.includes('figma.com') && !url.includes('devtools');
66
- });
67
- if (figmaPages.length === 0) {
68
- return null;
69
- }
70
- // Check each page for workers
71
- const pagesWithWorkers = figmaPages
72
- .map(p => ({
73
- page: p,
74
- workerCount: p.workers().length,
75
- url: p.url()
76
- }))
77
- .filter(p => p.workerCount > 0)
78
- .sort((a, b) => b.workerCount - a.workerCount); // Most workers first
79
- if (pagesWithWorkers.length > 0) {
80
- logger.info({
81
- url: pagesWithWorkers[0].url,
82
- workerCount: pagesWithWorkers[0].workerCount,
83
- totalPagesWithWorkers: pagesWithWorkers.length
84
- }, 'Found page with active plugin workers');
85
- return pagesWithWorkers[0].page;
86
- }
87
- // No workers found - prefer design/file pages
88
- const designPage = figmaPages.find(p => p.url().includes('/design/') || p.url().includes('/file/'));
89
- return designPage || figmaPages[0];
90
- }
91
- /**
92
- * Find an existing browser tab whose URL matches the given Figma file key
93
- */
94
- async findPageByFileKey(targetFileKey) {
95
- if (!this.browser) {
96
- return null;
97
- }
98
- const pages = await this.browser.pages();
99
- for (const page of pages) {
100
- const pageUrl = page.url();
101
- if (!pageUrl.includes('figma.com') || pageUrl.includes('devtools')) {
102
- continue;
103
- }
104
- const pageFileKey = extractFileKey(pageUrl);
105
- if (pageFileKey && pageFileKey === targetFileKey) {
106
- logger.info({ url: pageUrl, fileKey: pageFileKey }, 'Found existing tab for file key');
107
- return page;
108
- }
109
- }
110
- return null;
111
- }
112
- /**
113
- * Get active Figma page or create new one
114
- * Prefers pages with active plugin workers for plugin debugging
115
- */
116
- async getPage() {
117
- // Ensure connection is alive before proceeding
118
- await this.ensureConnection();
119
- if (!this.browser) {
120
- await this.launch();
121
- }
122
- // If we already have a page from explicit navigation, use it (don't override with findBestPage)
123
- if (this.page && !this.page.isClosed()) {
124
- return this.page;
125
- }
126
- // No explicit page set — find the best page (most workers) for initial connection
127
- const bestPage = await this.findBestPage();
128
- if (bestPage) {
129
- const workerCount = bestPage.workers().length;
130
- logger.info({
131
- url: bestPage.url(),
132
- workerCount
133
- }, 'Selected page for monitoring (auto-detected)');
134
- this.page = bestPage;
135
- return this.page;
136
- }
137
- // Fallback: Get any existing page or create new one
138
- const pages = await this.browser.pages();
139
- if (pages.length > 0 && pages[0].url() !== 'about:blank') {
140
- logger.warn({ url: pages[0].url() }, 'No Figma pages found, using first available page');
141
- this.page = pages[0];
142
- return this.page;
143
- }
144
- // Last resort: Create new page
145
- logger.warn('No suitable pages found, creating new page in Figma Desktop');
146
- this.page = await this.browser.newPage();
147
- return this.page;
148
- }
149
- /**
150
- * Navigate to Figma URL
151
- * If the target file is already open in a tab, switches to it instead of navigating.
152
- */
153
- async navigateToFigma(figmaUrl) {
154
- // Ensure connection is alive before navigation
155
- await this.ensureConnection();
156
- // Default to Figma homepage if no URL provided
157
- const url = figmaUrl || 'https://www.figma.com';
158
- // Check if the target file is already open in an existing tab
159
- const targetFileKey = extractFileKey(url);
160
- if (targetFileKey) {
161
- const existingPage = await this.findPageByFileKey(targetFileKey);
162
- if (existingPage) {
163
- logger.info({ url, fileKey: targetFileKey }, 'Switching to existing tab instead of navigating');
164
- await existingPage.bringToFront();
165
- this.page = existingPage;
166
- return { page: existingPage, action: 'switched_to_existing', url: existingPage.url() };
167
- }
168
- }
169
- // No existing tab found — fall through to normal navigation
170
- const page = await this.getPage();
171
- logger.info({ url }, 'Navigating to Figma');
172
- try {
173
- await page.goto(url, {
174
- waitUntil: 'networkidle2',
175
- timeout: 30000,
176
- });
177
- logger.info({ url }, 'Navigation successful');
178
- return { page, action: 'navigated', url };
179
- }
180
- catch (error) {
181
- logger.error({ error, url }, 'Navigation failed');
182
- throw new Error(`Failed to navigate to ${url}: ${error}`);
183
- }
184
- }
185
- /**
186
- * Reload current page
187
- */
188
- async reload(hardReload = false) {
189
- if (!this.page || this.page.isClosed()) {
190
- throw new Error('No active page to reload');
191
- }
192
- logger.info({ hardReload }, 'Reloading page');
193
- try {
194
- await this.page.reload({
195
- waitUntil: 'networkidle2',
196
- timeout: 30000,
197
- });
198
- logger.info('Page reloaded successfully');
199
- }
200
- catch (error) {
201
- logger.error({ error }, 'Page reload failed');
202
- throw new Error(`Page reload failed: ${error}`);
203
- }
204
- }
205
- /**
206
- * Execute JavaScript in page context
207
- */
208
- async evaluate(fn) {
209
- const page = await this.getPage();
210
- return page.evaluate(fn);
211
- }
212
- // Screenshot functionality removed - use Figma REST API's getImages() instead
213
- // See: figma_take_screenshot and figma_get_component_image tools
214
- /**
215
- * Check if browser is connected
216
- */
217
- isRunning() {
218
- return this.browser !== null && this.browser.isConnected();
219
- }
220
- /**
221
- * Disconnect from browser (doesn't close Figma Desktop)
222
- */
223
- async close() {
224
- if (!this.browser) {
225
- return;
226
- }
227
- logger.info('Disconnecting from Figma Desktop');
228
- try {
229
- // Just disconnect, don't close Figma Desktop
230
- this.browser.disconnect();
231
- this.browser = null;
232
- this.page = null;
233
- logger.info('Disconnected from Figma Desktop successfully');
234
- }
235
- catch (error) {
236
- logger.error({ error }, 'Failed to disconnect from browser');
237
- throw error;
238
- }
239
- }
240
- /**
241
- * Get current page URL
242
- */
243
- getCurrentUrl() {
244
- if (!this.page || this.page.isClosed()) {
245
- return null;
246
- }
247
- return this.page.url();
248
- }
249
- /**
250
- * Check if the browser connection is still alive
251
- * Returns false if connection is stale (e.g., after computer sleep)
252
- */
253
- async isConnectionAlive() {
254
- try {
255
- if (!this.browser || !this.page) {
256
- return false;
257
- }
258
- // Try to get the page title - this will fail if connection is dead
259
- await this.page.title();
260
- return true;
261
- }
262
- catch (error) {
263
- logger.warn({ error }, 'Browser connection appears to be dead');
264
- return false;
265
- }
266
- }
267
- /**
268
- * Reconnect to Figma Desktop if connection was lost
269
- * Call this before any operation that requires a live connection
270
- */
271
- async ensureConnection() {
272
- const isAlive = await this.isConnectionAlive();
273
- if (!isAlive) {
274
- logger.info('Connection lost, attempting to reconnect to Figma Desktop');
275
- // Clear stale references
276
- this.browser = null;
277
- this.page = null;
278
- // Reconnect
279
- await this.launch();
280
- logger.info('Successfully reconnected to Figma Desktop');
281
- }
282
- }
283
- /**
284
- * Force a complete reconnection to Figma Desktop
285
- * Use this when frames become detached or stale even though the browser appears connected
286
- */
287
- async forceReconnect() {
288
- logger.info('Force reconnecting to Figma Desktop');
289
- // Disconnect current connection if exists
290
- if (this.browser) {
291
- try {
292
- this.browser.disconnect();
293
- }
294
- catch (e) {
295
- // Ignore disconnect errors
296
- }
297
- }
298
- // Clear all references
299
- this.browser = null;
300
- this.page = null;
301
- // Reconnect
302
- await this.launch();
303
- logger.info('Force reconnect completed');
304
- }
305
- /**
306
- * Wait for navigation
307
- */
308
- async waitForNavigation(timeout = 30000) {
309
- if (!this.page || this.page.isClosed()) {
310
- throw new Error('No active page');
311
- }
312
- await this.page.waitForNavigation({
313
- waitUntil: 'networkidle2',
314
- timeout,
315
- });
316
- }
317
- }
318
- //# sourceMappingURL=local.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/browser/local.ts"],"names":[],"mappings":"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"}
@@ -1,312 +0,0 @@
1
- /**
2
- * Figma Desktop Connector
3
- *
4
- * This service connects directly to Figma Desktop's plugin context
5
- * to execute code with access to the full Figma Plugin API,
6
- * including variables without Enterprise access.
7
- *
8
- * Uses Puppeteer's Worker API to directly access plugin workers.
9
- * Note: This is a legacy connector maintained for backwards compatibility.
10
- * The WebSocket Desktop Bridge plugin is the primary connection method.
11
- */
12
- import { Page } from 'puppeteer-core';
13
- import type { IFigmaConnector } from './figma-connector.js';
14
- export declare class FigmaDesktopConnector implements IFigmaConnector {
15
- private page;
16
- private cachedPluginFrame;
17
- private static readonly DEBUG;
18
- constructor(page: Page);
19
- /**
20
- * Clear the cached plugin UI frame reference.
21
- * Called automatically when a detached frame is detected.
22
- */
23
- clearFrameCache(): void;
24
- /**
25
- * Conditionally log to Figma's browser console (only when DEBUG is enabled).
26
- * Skips the CDP roundtrip entirely in production, eliminating ~5-15ms per call.
27
- */
28
- private logToFigmaConsole;
29
- /**
30
- * Initialize connection to Figma Desktop's plugin context
31
- * No setup needed - Puppeteer handles worker access automatically
32
- */
33
- initialize(): Promise<void>;
34
- getTransportType(): 'cdp' | 'websocket';
35
- /**
36
- * Execute code in Figma's plugin context where the figma API is available
37
- * Uses Puppeteer's direct worker access instead of CDP context enumeration
38
- */
39
- executeInPluginContext<T = any>(code: string): Promise<T>;
40
- /**
41
- * Get Figma variables from plugin UI window object
42
- * This bypasses Figma's plugin sandbox security restrictions
43
- * by accessing data that the plugin posted to its UI iframe
44
- */
45
- getVariablesFromPluginUI(fileKey?: string): Promise<any>;
46
- /**
47
- * Get component data by node ID from plugin UI window object
48
- * This bypasses the REST API bug where descriptions are missing
49
- * by accessing data from the Desktop Bridge plugin via its UI iframe
50
- */
51
- getComponentFromPluginUI(nodeId: string): Promise<any>;
52
- /**
53
- * Get Figma variables using the desktop connection
54
- * This bypasses the Enterprise requirement!
55
- */
56
- getVariables(fileKey?: string): Promise<any>;
57
- /**
58
- * Clean up resources (no-op since we use Puppeteer's built-in worker management)
59
- */
60
- /**
61
- * Get component data by node ID using Plugin API
62
- * This bypasses the REST API bug where descriptions are missing
63
- */
64
- getComponentByNodeId(nodeId: string): Promise<any>;
65
- dispose(): Promise<void>;
66
- /**
67
- * Find the Desktop Bridge plugin UI iframe
68
- * Returns the frame that has the write operation functions
69
- * Handles detached frame errors gracefully
70
- */
71
- private findPluginUIFrame;
72
- /**
73
- * Execute arbitrary code in Figma's plugin context
74
- * This is the power tool that can run any Figma Plugin API code
75
- * Includes retry logic for detached frame errors
76
- */
77
- executeCodeViaUI(code: string, timeout?: number): Promise<any>;
78
- /**
79
- * Update a variable's value in a specific mode
80
- */
81
- updateVariable(variableId: string, modeId: string, value: any): Promise<any>;
82
- /**
83
- * Create a new variable in a collection
84
- */
85
- createVariable(name: string, collectionId: string, resolvedType: 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN', options?: {
86
- valuesByMode?: Record<string, any>;
87
- description?: string;
88
- scopes?: string[];
89
- }): Promise<any>;
90
- /**
91
- * Create a new variable collection
92
- */
93
- createVariableCollection(name: string, options?: {
94
- initialModeName?: string;
95
- additionalModes?: string[];
96
- }): Promise<any>;
97
- /**
98
- * Delete a variable
99
- */
100
- deleteVariable(variableId: string): Promise<any>;
101
- /**
102
- * Delete a variable collection
103
- */
104
- deleteVariableCollection(collectionId: string): Promise<any>;
105
- /**
106
- * Refresh variables data from Figma
107
- */
108
- refreshVariables(): Promise<any>;
109
- /**
110
- * Rename a variable
111
- */
112
- renameVariable(variableId: string, newName: string): Promise<any>;
113
- /**
114
- * Set the description on a variable (not a node — variables use a separate API)
115
- */
116
- setVariableDescription(variableId: string, description: string): Promise<any>;
117
- /**
118
- * Add a mode to a variable collection
119
- */
120
- addMode(collectionId: string, modeName: string): Promise<any>;
121
- /**
122
- * Rename a mode in a variable collection
123
- */
124
- renameMode(collectionId: string, modeId: string, newName: string): Promise<any>;
125
- /**
126
- * Get all local components for design system manifest generation
127
- */
128
- getLocalComponents(): Promise<{
129
- success: boolean;
130
- data?: {
131
- components: any[];
132
- componentSets: any[];
133
- totalComponents: number;
134
- totalComponentSets: number;
135
- fileKey: string;
136
- timestamp: number;
137
- };
138
- error?: string;
139
- }>;
140
- /**
141
- * Instantiate a component with overrides
142
- * Supports both published library components (by key) and local components (by nodeId)
143
- */
144
- instantiateComponent(componentKey: string, options?: {
145
- nodeId?: string;
146
- position?: {
147
- x: number;
148
- y: number;
149
- };
150
- size?: {
151
- width: number;
152
- height: number;
153
- };
154
- overrides?: Record<string, any>;
155
- variant?: Record<string, string>;
156
- parentId?: string;
157
- }): Promise<{
158
- success: boolean;
159
- instance?: {
160
- id: string;
161
- name: string;
162
- x: number;
163
- y: number;
164
- width: number;
165
- height: number;
166
- };
167
- error?: string;
168
- }>;
169
- /**
170
- * Set description on a component or style
171
- */
172
- setNodeDescription(nodeId: string, description: string, descriptionMarkdown?: string): Promise<any>;
173
- /**
174
- * Get annotations from a node (and optionally its children)
175
- */
176
- getAnnotations(nodeId: string, includeChildren?: boolean, depth?: number): Promise<any>;
177
- /**
178
- * Set annotations on a node
179
- */
180
- setAnnotations(nodeId: string, annotations: any[], mode?: 'replace' | 'append'): Promise<any>;
181
- /**
182
- * Get available annotation categories
183
- */
184
- getAnnotationCategories(): Promise<any>;
185
- /**
186
- * Analyze a component set — variant state machine + cross-variant diff
187
- */
188
- analyzeComponentSet(nodeId: string): Promise<any>;
189
- /**
190
- * Deep component extraction via plugin UI
191
- */
192
- deepGetComponent(nodeId: string, depth?: number): Promise<any>;
193
- /**
194
- * Add a component property
195
- */
196
- addComponentProperty(nodeId: string, propertyName: string, type: 'BOOLEAN' | 'TEXT' | 'INSTANCE_SWAP' | 'VARIANT', defaultValue: any, options?: {
197
- preferredValues?: any[];
198
- }): Promise<any>;
199
- /**
200
- * Edit an existing component property
201
- */
202
- editComponentProperty(nodeId: string, propertyName: string, newValue: {
203
- name?: string;
204
- defaultValue?: any;
205
- preferredValues?: any[];
206
- }): Promise<any>;
207
- /**
208
- * Delete a component property
209
- */
210
- deleteComponentProperty(nodeId: string, propertyName: string): Promise<any>;
211
- /**
212
- * Resize a node
213
- */
214
- resizeNode(nodeId: string, width: number, height: number, withConstraints?: boolean): Promise<any>;
215
- /**
216
- * Move/position a node
217
- */
218
- moveNode(nodeId: string, x: number, y: number): Promise<any>;
219
- /**
220
- * Set fills (colors) on a node
221
- */
222
- setNodeFills(nodeId: string, fills: any[]): Promise<any>;
223
- /**
224
- * Set strokes on a node
225
- */
226
- setNodeStrokes(nodeId: string, strokes: any[], strokeWeight?: number): Promise<any>;
227
- /**
228
- * Set opacity on a node
229
- */
230
- setNodeOpacity(nodeId: string, opacity: number): Promise<any>;
231
- /**
232
- * Set corner radius on a node
233
- */
234
- setNodeCornerRadius(nodeId: string, radius: number): Promise<any>;
235
- /**
236
- * Clone/duplicate a node
237
- */
238
- cloneNode(nodeId: string): Promise<any>;
239
- /**
240
- * Delete a node
241
- */
242
- deleteNode(nodeId: string): Promise<any>;
243
- /**
244
- * Rename a node
245
- */
246
- renameNode(nodeId: string, newName: string): Promise<any>;
247
- /**
248
- * Set text content on a text node
249
- */
250
- setTextContent(nodeId: string, text: string, options?: {
251
- fontSize?: number;
252
- }): Promise<any>;
253
- /**
254
- * Create a child node
255
- */
256
- createChildNode(parentId: string, nodeType: 'RECTANGLE' | 'ELLIPSE' | 'FRAME' | 'TEXT' | 'LINE' | 'POLYGON' | 'STAR' | 'VECTOR', properties?: {
257
- name?: string;
258
- x?: number;
259
- y?: number;
260
- width?: number;
261
- height?: number;
262
- fills?: any[];
263
- text?: string;
264
- }): Promise<any>;
265
- /**
266
- * Capture screenshot via plugin's exportAsync
267
- */
268
- captureScreenshot(nodeId: string, options?: {
269
- format?: string;
270
- scale?: number;
271
- }): Promise<any>;
272
- /**
273
- * Set component instance properties
274
- */
275
- setInstanceProperties(nodeId: string, properties: any): Promise<any>;
276
- /**
277
- * Set image fill on one or more nodes (decodes base64 in browser bridge, sends bytes to plugin)
278
- */
279
- setImageFill(nodeIds: string[], imageData: string, scaleMode?: string): Promise<any>;
280
- /**
281
- * Lint design for accessibility and quality issues via plugin UI
282
- */
283
- lintDesign(nodeId?: string, rules?: string[], maxDepth?: number, maxFindings?: number): Promise<any>;
284
- auditComponentAccessibility(): Promise<any>;
285
- createSticky(): Promise<any>;
286
- createStickies(): Promise<any>;
287
- createConnector(): Promise<any>;
288
- createShapeWithText(): Promise<any>;
289
- createSection(): Promise<any>;
290
- createTable(): Promise<any>;
291
- createCodeBlock(): Promise<any>;
292
- getBoardContents(): Promise<any>;
293
- getConnections(): Promise<any>;
294
- listSlides(): Promise<any>;
295
- getSlideContent(): Promise<any>;
296
- createSlide(): Promise<any>;
297
- deleteSlide(): Promise<any>;
298
- duplicateSlide(): Promise<any>;
299
- getSlideGrid(): Promise<any>;
300
- reorderSlides(): Promise<any>;
301
- setSlideTransition(): Promise<any>;
302
- getSlideTransition(): Promise<any>;
303
- setSlidesViewMode(): Promise<any>;
304
- getFocusedSlide(): Promise<any>;
305
- focusSlide(): Promise<any>;
306
- skipSlide(): Promise<any>;
307
- addTextToSlide(): Promise<any>;
308
- addShapeToSlide(): Promise<any>;
309
- setSlideBackground(): Promise<any>;
310
- getTextStyles(): Promise<any>;
311
- }
312
- //# sourceMappingURL=figma-desktop-connector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"figma-desktop-connector.d.ts","sourceRoot":"","sources":["../../src/core/figma-desktop-connector.ts"],"names":[],"mappings":"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"}