/** * ds-figma-plugin.js * Interface for Figma plugin export and token management * UX Team Tool #1 */ 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'; class DSFigmaPlugin extends HTMLElement { constructor() { super(); this.exportHistory = []; } async connectedCallback() { this.render(); this.setupEventListeners(); await this.loadExportHistory(); } async loadExportHistory() { try { const context = contextStore.getMCPContext(); if (!context.project_id) return; const cached = localStorage.getItem(`figma_exports_${context.project_id}`); if (cached) { this.exportHistory = JSON.parse(cached); this.renderHistory(); } } catch (error) { console.error('[DSFigmaPlugin] Failed to load history:', error); } } setupEventListeners() { const exportBtn = this.querySelector('#export-figma-btn'); const fileKeyInput = this.querySelector('#figma-file-key'); const exportTypeSelect = this.querySelector('#export-type-select'); if (exportBtn) { exportBtn.addEventListener('click', () => this.exportFromFigma()); } } async exportFromFigma() { const fileKeyInput = this.querySelector('#figma-file-key'); const exportTypeSelect = this.querySelector('#export-type-select'); const formatSelect = this.querySelector('#export-format-select'); const fileKey = fileKeyInput?.value.trim() || ''; const exportType = exportTypeSelect?.value || 'tokens'; const format = formatSelect?.value || 'json'; if (!fileKey) { ComponentHelpers.showToast?.('Please enter a Figma file key', 'error'); return; } const exportBtn = this.querySelector('#export-figma-btn'); if (exportBtn) { exportBtn.disabled = true; exportBtn.textContent = '⏳ Exporting...'; } try { let result; if (exportType === 'tokens') { // Export design tokens result = await toolBridge.executeTool('dss_sync_figma', { file_key: fileKey }); } else if (exportType === 'assets') { // Export assets (icons, images) const response = await fetch('/api/figma/export-assets', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ projectId: contextStore.get('projectId'), fileKey, format }) }); if (!response.ok) { throw new Error(`Asset export failed: ${response.statusText}`); } result = await response.json(); } else if (exportType === 'components') { // Export component definitions const response = await fetch('/api/figma/export-components', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ projectId: contextStore.get('projectId'), fileKey, format }) }); if (!response.ok) { throw new Error(`Component export failed: ${response.statusText}`); } result = await response.json(); } // Add to history const exportEntry = { timestamp: new Date().toISOString(), fileKey, type: exportType, format, itemCount: result.count || Object.keys(result.tokens || result.assets || result.components || {}).length }; this.exportHistory.unshift(exportEntry); this.exportHistory = this.exportHistory.slice(0, 10); // Keep last 10 // Cache history const context = contextStore.getMCPContext(); if (context.project_id) { localStorage.setItem(`figma_exports_${context.project_id}`, JSON.stringify(this.exportHistory)); } this.renderHistory(); ComponentHelpers.showToast?.(`Exported ${exportEntry.itemCount} ${exportType}`, 'success'); } catch (error) { console.error('[DSFigmaPlugin] Export failed:', error); ComponentHelpers.showToast?.(`Export failed: ${error.message}`, 'error'); } finally { if (exportBtn) { exportBtn.disabled = false; exportBtn.textContent = '📤 Export from Figma'; } } } renderHistory() { const historyContainer = this.querySelector('#export-history'); if (!historyContainer) return; if (this.exportHistory.length === 0) { historyContainer.innerHTML = ComponentHelpers.renderEmpty('No export history', '📋'); return; } historyContainer.innerHTML = `
${this.exportHistory.map((entry, idx) => `
${ComponentHelpers.escapeHtml(entry.type)} Export
${ComponentHelpers.escapeHtml(entry.fileKey)}
${ComponentHelpers.formatRelativeTime(new Date(entry.timestamp))}
${entry.itemCount} items
${entry.format.toUpperCase()}
`).join('')}
`; } render() { this.innerHTML = `

Figma Export

Export tokens, assets, or components from Figma files

Find this in your Figma file URL

Export History

Recent Figma exports for this project

${ComponentHelpers.renderLoading('Loading history...')}
`; } } customElements.define('ds-figma-plugin', DSFigmaPlugin); export default DSFigmaPlugin;