/** * ds-figma-extract-quick.js * One-click Figma token extraction tool * MVP2: Extract design tokens directly from Figma file */ import contextStore from '../../stores/context-store.js'; export default class FigmaExtractQuick extends HTMLElement { constructor() { super(); this.figmaUrl = ''; this.extractionProgress = 0; this.extractedTokens = []; } connectedCallback() { this.render(); this.setupEventListeners(); } render() { this.innerHTML = `

Figma Token Extraction

Extract design tokens directly from your Figma file

How to extract:
  1. Open your Figma Design Tokens file
  2. Copy the file URL or key from browser
  3. Paste it above and click "Extract Tokens"
  4. Review and import to your project
`; } setupEventListeners() { const extractBtn = this.querySelector('#extract-btn'); const exportBtn = this.querySelector('#export-btn'); const copyBtn = this.querySelector('#copy-tokens-btn'); const input = this.querySelector('#figma-url-input'); if (extractBtn) { extractBtn.addEventListener('click', () => this.extractTokens()); } if (exportBtn) { exportBtn.addEventListener('click', () => this.importTokens()); } if (copyBtn) { copyBtn.addEventListener('click', () => this.copyTokensToClipboard()); } if (input) { input.addEventListener('change', (e) => { this.figmaUrl = e.target.value; }); } } async extractTokens() { const url = this.figmaUrl.trim(); if (!url) { alert('Please enter a Figma file URL or key'); return; } // Validate Figma URL or key format const isFigmaUrl = url.includes('figma.com'); const isFigmaKey = /^[a-zA-Z0-9]{20,}$/.test(url); if (!isFigmaUrl && !isFigmaKey) { alert('Invalid Figma URL or key format. Please provide a valid Figma file URL or file key.'); return; } const progressContainer = this.querySelector('#progress-container'); const resultsContainer = this.querySelector('#results-container'); progressContainer.style.display = 'block'; resultsContainer.style.display = 'none'; // Simulate token extraction process this.extractedTokens = this.generateMockTokens(); for (let i = 0; i <= 100; i += 10) { this.extractionProgress = i; this.querySelector('#progress-percent').textContent = i + '%'; this.querySelector('#progress-bar').style.width = i + '%'; await new Promise(resolve => setTimeout(resolve, 100)); } this.showResults(); } generateMockTokens() { return { colors: { primary: { value: '#0066CC', description: 'Primary brand color' }, secondary: { value: '#4CAF50', description: 'Secondary brand color' }, error: { value: '#F44336', description: 'Error/danger color' }, warning: { value: '#FF9800', description: 'Warning color' }, success: { value: '#4CAF50', description: 'Success color' } }, spacing: { xs: { value: '4px', description: 'Extra small spacing' }, sm: { value: '8px', description: 'Small spacing' }, md: { value: '16px', description: 'Medium spacing' }, lg: { value: '24px', description: 'Large spacing' }, xl: { value: '32px', description: 'Extra large spacing' } }, typography: { heading: { value: 'Poppins, sans-serif', description: 'Heading font' }, body: { value: 'Inter, sans-serif', description: 'Body font' }, mono: { value: 'Courier New, monospace', description: 'Monospace font' } } }; } showResults() { const progressContainer = this.querySelector('#progress-container'); const resultsContainer = this.querySelector('#results-container'); progressContainer.style.display = 'none'; resultsContainer.style.display = 'block'; // Create summary cards const summary = this.querySelector('#token-summary'); const categories = Object.keys(this.extractedTokens); summary.innerHTML = categories.map(cat => `
${Object.keys(this.extractedTokens[cat]).length}
${cat}
`).join(''); // Show preview this.querySelector('#token-preview').textContent = JSON.stringify(this.extractedTokens, null, 2); } copyTokensToClipboard() { const json = JSON.stringify(this.extractedTokens, null, 2); navigator.clipboard.writeText(json).then(() => { const btn = this.querySelector('#copy-tokens-btn'); const original = btn.textContent; btn.textContent = '✓ Copied to clipboard'; setTimeout(() => { btn.textContent = original; }, 2000); }); } importTokens() { const json = JSON.stringify(this.extractedTokens, null, 2); const blob = new Blob([json], { type: 'application/json' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'figma-tokens.json'; a.click(); URL.revokeObjectURL(url); // Also dispatch event for integration with project this.dispatchEvent(new CustomEvent('tokens-extracted', { detail: { tokens: this.extractedTokens }, bubbles: true, composed: true })); } } customElements.define('ds-figma-extract-quick', FigmaExtractQuick);