Spaces:
Running
Running
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();
}
}
|