| | <!DOCTYPE html> |
| | <html lang="en"> |
| | <head> |
| | <meta charset="UTF-8"> |
| | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| | <title>Car Garage - Vue SPA</title> |
| | <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> |
| | <script src="https://cdn.jsdelivr.net/npm/three@0.150.0/build/three.min.js"></script> |
| | <script src="https://cdn.jsdelivr.net/npm/three@0.150.0/examples/js/loaders/GLTFLoader.js"></script> |
| | <script src="https://cdn.jsdelivr.net/npm/three@0.150.0/examples/js/controls/OrbitControls.js"></script> |
| | <style> |
| | * { |
| | margin: 0; |
| | padding: 0; |
| | box-sizing: border-box; |
| | } |
| | |
| | body { |
| | font-family: 'Arial', sans-serif; |
| | overflow: hidden; |
| | background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); |
| | } |
| | |
| | #app { |
| | width: 100vw; |
| | height: 100vh; |
| | display: flex; |
| | flex-direction: column; |
| | } |
| | |
| | .garage-container { |
| | flex: 1; |
| | display: flex; |
| | flex-direction: column; |
| | padding: 20px; |
| | position: relative; |
| | } |
| | |
| | .header { |
| | display: flex; |
| | justify-content: space-between; |
| | align-items: center; |
| | margin-bottom: 20px; |
| | } |
| | |
| | .mode-toggle { |
| | background: rgba(255, 255, 255, 0.2); |
| | border: 2px solid rgba(255, 255, 255, 0.4); |
| | color: white; |
| | padding: 10px 20px; |
| | border-radius: 8px; |
| | cursor: pointer; |
| | font-weight: bold; |
| | transition: all 0.3s ease; |
| | backdrop-filter: blur(10px); |
| | } |
| | |
| | .mode-toggle:hover { |
| | background: rgba(255, 255, 255, 0.3); |
| | transform: translateY(-2px); |
| | } |
| | |
| | .main-display { |
| | flex: 1; |
| | display: flex; |
| | justify-content: center; |
| | align-items: center; |
| | margin-bottom: 20px; |
| | } |
| | |
| | .image-slot { |
| | width: 600px; |
| | height: 400px; |
| | background: rgba(255, 255, 255, 0.1); |
| | border: 3px dashed rgba(255, 255, 255, 0.4); |
| | border-radius: 15px; |
| | display: flex; |
| | flex-direction: column; |
| | justify-content: center; |
| | align-items: center; |
| | cursor: pointer; |
| | transition: all 0.3s ease; |
| | position: relative; |
| | overflow: hidden; |
| | backdrop-filter: blur(10px); |
| | } |
| | |
| | .image-slot:hover { |
| | background: rgba(255, 255, 255, 0.2); |
| | border-color: rgba(255, 255, 255, 0.6); |
| | transform: scale(1.02); |
| | } |
| | |
| | .image-slot img { |
| | max-width: 100%; |
| | max-height: 100%; |
| | object-fit: contain; |
| | } |
| | |
| | .placeholder { |
| | display: flex; |
| | flex-direction: column; |
| | align-items: center; |
| | color: rgba(255, 255, 255, 0.7); |
| | } |
| | |
| | .question-mark { |
| | font-size: 120px; |
| | font-weight: bold; |
| | margin-bottom: 20px; |
| | text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); |
| | } |
| | |
| | .placeholder-text { |
| | font-size: 18px; |
| | text-align: center; |
| | } |
| | |
| | .viewer-3d { |
| | width: 600px; |
| | height: 400px; |
| | border-radius: 15px; |
| | overflow: hidden; |
| | } |
| | |
| | .inventory-bar { |
| | background: rgba(0, 0, 0, 0.3); |
| | padding: 15px; |
| | border-radius: 10px; |
| | backdrop-filter: blur(10px); |
| | } |
| | |
| | .inventory-slots { |
| | display: flex; |
| | gap: 15px; |
| | overflow-x: auto; |
| | padding: 10px 0; |
| | } |
| | |
| | .inventory-slot { |
| | min-width: 100px; |
| | height: 100px; |
| | background: rgba(255, 255, 255, 0.1); |
| | border: 2px solid rgba(255, 255, 255, 0.3); |
| | border-radius: 10px; |
| | display: flex; |
| | justify-content: center; |
| | align-items: center; |
| | cursor: pointer; |
| | transition: all 0.3s ease; |
| | position: relative; |
| | overflow: hidden; |
| | } |
| | |
| | .inventory-slot:hover { |
| | background: rgba(255, 255, 255, 0.2); |
| | border-color: rgba(255, 255, 255, 0.5); |
| | transform: translateY(-5px); |
| | } |
| | |
| | .inventory-slot.active { |
| | border-color: #4CAF50; |
| | box-shadow: 0 0 20px rgba(76, 175, 80, 0.5); |
| | } |
| | |
| | .inventory-slot img { |
| | max-width: 100%; |
| | max-height: 100%; |
| | object-fit: cover; |
| | } |
| | |
| | .inventory-slot .empty { |
| | color: rgba(255, 255, 255, 0.3); |
| | font-size: 40px; |
| | } |
| | |
| | .remove-btn { |
| | position: absolute; |
| | top: 5px; |
| | right: 5px; |
| | background: rgba(255, 0, 0, 0.7); |
| | color: white; |
| | border: none; |
| | border-radius: 50%; |
| | width: 25px; |
| | height: 25px; |
| | cursor: pointer; |
| | display: none; |
| | align-items: center; |
| | justify-content: center; |
| | font-size: 16px; |
| | font-weight: bold; |
| | } |
| | |
| | .inventory-slot:hover .remove-btn, |
| | .image-slot:hover .remove-btn { |
| | display: flex; |
| | } |
| | |
| | .image-slot .remove-btn { |
| | width: 40px; |
| | height: 40px; |
| | font-size: 24px; |
| | } |
| | |
| | input[type="file"] { |
| | display: none; |
| | } |
| | |
| | .inventory-title { |
| | color: white; |
| | margin-bottom: 10px; |
| | font-size: 16px; |
| | font-weight: bold; |
| | text-transform: uppercase; |
| | letter-spacing: 1px; |
| | } |
| | |
| | .loading { |
| | color: white; |
| | |