/** * ds-figma-extraction.js * Interface for extracting design tokens from Figma files * UI Team Tool #3 */ import { createFormView, setupFormHandlers } from '../../utils/tool-templates.js'; import { ComponentHelpers } from '../../utils/component-helpers.js'; import contextStore from '../../stores/context-store.js'; import toolBridge from '../../services/tool-bridge.js'; import apiClient from '../../services/api-client.js'; class DSFigmaExtraction extends HTMLElement { constructor() { super(); this.figmaFileKey = ''; this.figmaToken = ''; this.extractionResults = null; this.isExtracting = false; } async connectedCallback() { await this.loadProjectConfig(); this.render(); this.setupEventListeners(); } async loadProjectConfig() { try { const context = contextStore.getMCPContext(); if (!context.project_id) return; const project = await apiClient.getProject(context.project_id); const figmaUrl = project.figma_ui_file || ''; // Extract file key from Figma URL const match = figmaUrl.match(/file\/([^/]+)/); if (match) { this.figmaFileKey = match[1]; } // Check for stored Figma token this.figmaToken = localStorage.getItem('figma_token') || ''; } catch (error) { console.error('[DSFigmaExtraction] Failed to load project config:', error); } } setupEventListeners() { const fileKeyInput = this.querySelector('#figma-file-key'); const tokenInput = this.querySelector('#figma-token'); const extractBtn = this.querySelector('#extract-btn'); const saveTokenCheckbox = this.querySelector('#save-token'); if (fileKeyInput) { fileKeyInput.value = this.figmaFileKey; } if (tokenInput) { tokenInput.value = this.figmaToken; } if (extractBtn) { extractBtn.addEventListener('click', () => this.extractTokens()); } if (saveTokenCheckbox && tokenInput) { tokenInput.addEventListener('change', () => { if (saveTokenCheckbox.checked) { localStorage.setItem('figma_token', tokenInput.value); } }); } } async extractTokens() { const fileKeyInput = this.querySelector('#figma-file-key'); const tokenInput = this.querySelector('#figma-token'); this.figmaFileKey = fileKeyInput?.value.trim() || ''; this.figmaToken = tokenInput?.value.trim() || ''; if (!this.figmaFileKey) { ComponentHelpers.showToast?.('Please enter a Figma file key', 'error'); return; } if (!this.figmaToken) { ComponentHelpers.showToast?.('Please enter a Figma API token', 'error'); return; } this.isExtracting = true; this.updateLoadingState(); try { // Set Figma token as environment variable for MCP tool // In real implementation, this would be securely stored process.env.FIGMA_TOKEN = this.figmaToken; // Call dss_sync_figma MCP tool const result = await toolBridge.executeTool('dss_sync_figma', { file_key: this.figmaFileKey }); this.extractionResults = result; this.renderResults(); ComponentHelpers.showToast?.('Tokens extracted successfully', 'success'); } catch (error) { console.error('[DSFigmaExtraction] Extraction failed:', error); ComponentHelpers.showToast?.(`Extraction failed: ${error.message}`, 'error'); const resultsContainer = this.querySelector('#results-container'); if (resultsContainer) { resultsContainer.innerHTML = ComponentHelpers.renderError('Token extraction failed', error); } } finally { this.isExtracting = false; this.updateLoadingState(); } } updateLoadingState() { const extractBtn = this.querySelector('#extract-btn'); if (!extractBtn) return; if (this.isExtracting) { extractBtn.disabled = true; extractBtn.textContent = '⏳ Extracting...'; } else { extractBtn.disabled = false; extractBtn.textContent = '🎨 Extract Tokens'; } } renderResults() { const resultsContainer = this.querySelector('#results-container'); if (!resultsContainer || !this.extractionResults) return; const tokenCount = Object.keys(this.extractionResults.tokens || {}).length; resultsContainer.innerHTML = `
Enter your Figma file key and API token above to extract design tokens