kitchen-visualizer-deluxe / kitchen-visualizer.js
taeny's picture
주방인테이어를 하고 싶어 그런데 여러가지 색상과 디자인을 대입해 보고 싶어 여러 위치에 주방에 주방기구를 어떻게 배치할 지도 여러가지로 보고싶어 주방인테리어를 할 수 있도록 주방을 세팅해서 거기에 맞는 가구를 내 마음데로 넣고 싶어
9d106a9 verified
Raw
History Blame Contribute Delete
7.33 kB
document.addEventListener('DOMContentLoaded', function() {
const kitchenContainer = document.getElementById('kitchen-container');
const layoutBtns = document.querySelectorAll('.layout-btn');
const colorBtns = document.querySelectorAll('.color-btn');
const materialBtns = document.querySelectorAll('.material-btn');
const applianceBtns = document.querySelectorAll('.appliance-btn');
const resetBtn = document.getElementById('reset-kitchen');
const saveBtn = document.getElementById('save-design');
let currentLayout = 'l-shape';
let currentAppliances = [];
// Initialize kitchen with default layout
renderKitchen(currentLayout);
// Layout selection
layoutBtns.forEach(btn => {
btn.addEventListener('click', function() {
currentLayout = this.dataset.layout;
renderKitchen(currentLayout);
});
});
// Color selection
colorBtns.forEach(btn => {
btn.addEventListener('click', function() {
const target = this.dataset.target;
const color = this.dataset.color;
updateElementStyle(target, 'background-color', color);
});
});
// Material selection
materialBtns.forEach(btn => {
btn.addEventListener('click', function() {
const target = this.dataset.target;
const material = this.dataset.material;
// In a real app, this would update textures/patterns
updateElementStyle(target, 'background-color', getMaterialColor(material));
});
});
// Appliance selection
applianceBtns.forEach(btn => {
btn.addEventListener('click', function() {
const appliance = this.dataset.appliance;
addAppliance(appliance);
});
});
// Reset kitchen
resetBtn.addEventListener('click', function() {
currentLayout = 'l-shape';
currentAppliances = [];
renderKitchen(currentLayout);
});
// Save design
saveBtn.addEventListener('click', function() {
alert('Design saved! (This would connect to a backend in a real app)');
});
function renderKitchen(layout) {
kitchenContainer.innerHTML = '';
// Base kitchen structure
const kitchenBase = document.createElement('div');
kitchenBase.className = 'absolute inset-0 flex items-center justify-center';
// Walls
const walls = document.createElement('div');
walls.className = 'absolute inset-0 bg-amber-50';
kitchenBase.appendChild(walls);
// Floor
const floor = document.createElement('div');
floor.className = 'absolute bottom-0 left-0 right-0 h-1/3 bg-gray-300';
kitchenBase.appendChild(floor);
// Layout-specific elements
if (layout === 'l-shape') {
// L-Shape cabinets
const leftCabinets = document.createElement('div');
leftCabinets.className = 'absolute left-0 bottom-0 w-1/3 h-2/3 bg-amber-100 border-r-2 border-amber-200';
leftCabinets.dataset.element = 'cabinets';
kitchenBase.appendChild(leftCabinets);
const bottomCabinets = document.createElement('div');
bottomCabinets.className = 'absolute bottom-0 right-0 h-1/3 w-2/3 bg-amber-100 border-t-2 border-amber-200';
bottomCabinets.dataset.element = 'cabinets';
kitchenBase.appendChild(bottomCabinets);
// Countertop
const countertop = document.createElement('div');
countertop.className = 'absolute left-0 bottom-1/3 w-1/3 h-8 bg-gray-200';
countertop.dataset.element = 'countertop';
kitchenBase.appendChild(countertop);
const countertop2 = document.createElement('div');
countertop2.className = 'absolute bottom-1/3 right-0 h-8 w-2/3 bg-gray-200';
countertop2.dataset.element = 'countertop';
kitchenBase.appendChild(countertop2);
// Backsplash
const backsplash = document.createElement('div');
backsplash.className = 'absolute left-0 bottom-1/3 w-1/3 h-1/3 bg-gray-100';
backsplash.dataset.element = 'backsplash';
kitchenBase.appendChild(backsplash);
} else if (layout === 'u-shape') {
// U-Shape implementation would go here
}
// Other layouts would be implemented similarly
kitchenContainer.appendChild(kitchenBase);
// Re-add any appliances
currentAppliances.forEach(appliance => {
addAppliance(appliance);
});
}
function updateElementStyle(target, property, value) {
const elements = document.querySelectorAll(`[data-element="${target}"]`);
elements.forEach(el => {
el.style[property] = value;
});
}
function addAppliance(appliance) {
if (!currentAppliances.includes(appliance)) {
currentAppliances.push(appliance);
}
const applianceEl = document.createElement('div');
applianceEl.className = 'absolute flex items-center justify-center bg-white rounded-lg shadow-md';
applianceEl.dataset.appliance = appliance;
// Position appliances based on layout
if (currentLayout === 'l-shape') {
// Simple positioning logic - in a real app this would be more sophisticated
const positions = {
'refrigerator': { left: '10%', top: '20%', width: '15%', height: '30%' },
'oven': { left: '30%', bottom: '35%', width: '15%', height: '20%' },
'sink': { right: '30%', bottom: '35%', width: '15%', height: '15%' }
};
const pos = positions[appliance] || { left: '50%', top: '50%', width: '15%', height: '15%' };
Object.entries(pos).forEach(([prop, value]) => {
applianceEl.style[prop] = value;
});
}
// Add icon
const icon = document.createElement('i');
icon.className = getApplianceIcon(appliance);
applianceEl.appendChild(icon);
kitchenContainer.appendChild(applianceEl);
}
function getApplianceIcon(appliance) {
const icons = {
'refrigerator': 'fas fa-refrigerator text-3xl',
'oven': 'fas fa-oven text-3xl',
'microwave': 'fas fa-microwave text-3xl',
'sink': 'fas fa-sink text-3xl',
'dishwasher': 'fas fa-dishwasher text-3xl',
'coffee-maker': 'fas fa-coffee-pot text-3xl'
};
return icons[appliance] || 'fas fa-question text-3xl';
}
function getMaterialColor(material) {
const colors = {
'quartz': '#f3f4f6',
'granite': '#d1d5db',
'marble': '#9ca3af',
'butcher-block': '#f59e0b',
'concrete': '#10b981',
'subway-tile': '#f8fafc',
'glass-tile': '#e2e8f0',
'mosaic': '#cbd5e1',
'stone': '#94a3b8',
'metal': '#64748b'
};
return colors[material] || '#ffffff';
}
});