File size: 4,720 Bytes
92abb9b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b42eeac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// Global state management
const state = {
    currentProject: null,
    selectedElement: null,
    elements: [],
    history: [],
    historyIndex: -1,
    canvasSize: { width: 800, height: 600 },
    colorPalette: ['#6366F1', '#F59E0B', '#10B981', '#EF4444', '#3B82F6', '#8B5CF6', '#EC4899'],
    fonts: ['Inter', 'Arial', 'Helvetica', 'Times New Roman', 'Courier New', 'Georgia', 'Verdana'],
    darkMode: window.matchMedia('(prefers-color-scheme: dark)').matches
};

// Initialize dark mode
function initDarkMode() {
    if (state.darkMode) {
        document.documentElement.classList.add('dark');
    } else {
        document.documentElement.classList.remove('dark');
    }
}

// Save project to localStorage
function saveProject() {
    if (state.currentProject) {
        const projectData = {
            id: state.currentProject.id,
            name: state.currentProject.name,
            elements: state.elements,
            canvasSize: state.canvasSize,
            createdAt: new Date().toISOString(),
            updatedAt: new Date().toISOString()
        };
        localStorage.setItem(`project_${state.currentProject.id}`, JSON.stringify(projectData));
    }
}

// Load project from localStorage
function loadProject(projectId) {
    const projectData = localStorage.getItem(`project_${projectId}`);
    if (projectData) {
        const parsedData = JSON.parse(projectData);
        state.currentProject = {
            id: parsedData.id,
            name: parsedData.name,
            createdAt: parsedData.createdAt,
            updatedAt: parsedData.updatedAt
        };
        state.elements = parsedData.elements || [];
        state.canvasSize = parsedData.canvasSize || { width: 800, height: 600 };
        
        // Render elements on canvas
        renderElements();
    }
}

// Render elements on canvas
function renderElements() {
    const stage = window.designStage;
    const layer = window.designLayer;
    
    // Clear existing elements
    layer.destroyChildren();
    
    // Set canvas size
    stage.width(state.canvasSize.width);
    stage.height(state.canvasSize.height);
    
    // Render each element
    state.elements.forEach(element => {
        let konvaElement;
        
        switch (element.type) {
            case 'text':
                konvaElement = new Konva.Text({
                    x: element.x,
                    y: element.y,
                    text: element.text,
                    fontSize: element.fontSize,
                    fontFamily: element.fontFamily,
                    fill: element.color,
                    align: element.align,
                    width: element.width,
                    draggable: true
                });
                break;
            case 'image':
                // Image rendering logic
                break;
            case 'shape':
                // Shape rendering logic
                break;
        }
        
        if (konvaElement) {
            layer.add(konvaElement);
        }
    });
    
    stage.add(layer);
}
// Initialize app
document.addEventListener('DOMContentLoaded', () => {
    initDarkMode();
    
    // Listen for dark mode changes
    window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
        state.darkMode = e.matches;
        initDarkMode();
    });
    
    // Create new project if none exists
    if (!state.currentProject) {
        state.currentProject = {
            id: Date.now().toString(),
            name: 'Novo Projeto',
            createdAt: new Date().toISOString(),
            updatedAt: new Date().toISOString()
        };
    }

    // Initialize stage events
    setupStageEvents();
});

function setupStageEvents() {
    const stage = window.designStage;
    const layer = window.designLayer;

    stage.on('click tap', (e) => {
        // Deselect previous element
        if (state.selectedElement) {
            state.selectedElement.stroke(null);
            state.selectedElement = null;
        }

        // If clicked on empty space, return
        if (e.target === stage) return;

        // Select clicked element
        state.selectedElement = e.target;
        e.target.stroke('#6366f1');

        // Update properties panel
        updatePropertiesPanel(e.target);
        stage.batchDraw();
    });
}

function updatePropertiesPanel(element) {
    const panel = document.querySelector('custom-properties-panel').shadowRoot;
    
    if (element instanceof Konva.Text) {
        panel.getElementById('text-content').value = element.text();
        panel.getElementById('text-font').value = element.fontFamily();
        panel.getElementById('text-size').value = element.fontSize();
    }
}