senangwebs-tour 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +653 -0
- package/dist/swt-editor.css +869 -0
- package/dist/swt-editor.css.map +1 -0
- package/dist/swt-editor.js +2853 -0
- package/dist/swt-editor.js.map +1 -0
- package/dist/swt-editor.min.css +1 -0
- package/dist/swt-editor.min.js +1 -0
- package/dist/swt.js +873 -0
- package/dist/swt.js.map +1 -0
- package/dist/swt.min.js +1 -0
- package/package.json +39 -0
- package/src/AssetManager.js +153 -0
- package/src/HotspotManager.js +193 -0
- package/src/SceneManager.js +162 -0
- package/src/components/hotspot-listener.js +114 -0
- package/src/editor/css/main.css +1002 -0
- package/src/editor/editor-entry.css +4 -0
- package/src/editor/editor-entry.js +30 -0
- package/src/editor/js/editor.js +629 -0
- package/src/editor/js/export-manager.js +286 -0
- package/src/editor/js/hotspot-editor.js +237 -0
- package/src/editor/js/preview-controller.js +556 -0
- package/src/editor/js/scene-manager.js +202 -0
- package/src/editor/js/storage-manager.js +193 -0
- package/src/editor/js/ui-controller.js +387 -0
- package/src/editor/js/ui-init.js +164 -0
- package/src/editor/js/utils.js +217 -0
- package/src/index.js +245 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swt-editor.js","sources":["../src/editor/js/utils.js","../src/editor/js/storage-manager.js","../src/editor/js/scene-manager.js","../src/editor/js/hotspot-editor.js","../src/editor/js/preview-controller.js","../src/editor/js/ui-controller.js","../src/editor/js/export-manager.js","../src/editor/js/editor.js","../src/editor/js/ui-init.js","../src/editor/editor-entry.js"],"sourcesContent":["// Utility Functions\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nfunction generateId(prefix = 'id') {\r\n return `${prefix}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Sanitize string for use as ID\r\n */\r\nfunction sanitizeId(str) {\r\n return str.toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '_')\r\n .replace(/^_+|_+$/g, '');\r\n}\r\n\r\n/**\r\n * Generate thumbnail from image file\r\n */\r\nasync function generateThumbnail(file, maxWidth = 200, maxHeight = 150) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n \r\n reader.onload = (e) => {\r\n const img = new Image();\r\n \r\n img.onload = () => {\r\n const canvas = document.createElement('canvas');\r\n const ctx = canvas.getContext('2d');\r\n \r\n let width = img.width;\r\n let height = img.height;\r\n \r\n if (width > height) {\r\n if (width > maxWidth) {\r\n height *= maxWidth / width;\r\n width = maxWidth;\r\n }\r\n } else {\r\n if (height > maxHeight) {\r\n width *= maxHeight / height;\r\n height = maxHeight;\r\n }\r\n }\r\n \r\n canvas.width = width;\r\n canvas.height = height;\r\n ctx.drawImage(img, 0, 0, width, height);\r\n \r\n resolve(canvas.toDataURL('image/jpeg', 0.7));\r\n };\r\n \r\n img.onerror = reject;\r\n img.src = e.target.result;\r\n };\r\n \r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\n/**\r\n * Load image file as data URL\r\n */\r\nasync function loadImageAsDataUrl(file) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = (e) => resolve(e.target.result);\r\n reader.onerror = reject;\r\n reader.readAsDataURL(file);\r\n });\r\n}\r\n\r\n/**\r\n * Show toast notification\r\n */\r\nfunction showToast(message, type = 'info', duration = 3000) {\r\n const toast = document.getElementById('toast');\r\n toast.textContent = message;\r\n toast.className = `toast ${type}`;\r\n toast.classList.add('show');\r\n \r\n setTimeout(() => {\r\n toast.classList.remove('show');\r\n }, duration);\r\n}\r\n\r\n/**\r\n * Show modal\r\n */\r\nfunction showModal(modalId) {\r\n const modal = document.getElementById(modalId);\r\n if (modal) {\r\n modal.classList.add('show');\r\n }\r\n}\r\n\r\n/**\r\n * Hide modal\r\n */\r\nfunction hideModal(modalId) {\r\n const modal = document.getElementById(modalId);\r\n if (modal) {\r\n modal.classList.remove('show');\r\n }\r\n}\r\n\r\n/**\r\n * Format file size\r\n */\r\nfunction formatFileSize(bytes) {\r\n if (bytes === 0) return '0 Bytes';\r\n const k = 1024;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * Download text as file\r\n */\r\nfunction downloadTextAsFile(text, filename) {\r\n const blob = new Blob([text], { type: 'text/plain' });\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n}\r\n\r\n/**\r\n * Copy text to clipboard\r\n */\r\nasync function copyToClipboard(text) {\r\n try {\r\n await navigator.clipboard.writeText(text);\r\n return true;\r\n } catch (err) {\r\n // Fallback for older browsers\r\n const textarea = document.createElement('textarea');\r\n textarea.value = text;\r\n textarea.style.position = 'fixed';\r\n textarea.style.opacity = '0';\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n const success = document.execCommand('copy');\r\n document.body.removeChild(textarea);\r\n return success;\r\n }\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nfunction debounce(func, wait) {\r\n let timeout;\r\n return function executedFunction(...args) {\r\n const later = () => {\r\n clearTimeout(timeout);\r\n func(...args);\r\n };\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n };\r\n}\r\n\r\n/**\r\n * Convert position object to string\r\n */\r\nfunction positionToString(pos) {\r\n return `${pos.x.toFixed(1)} ${pos.y.toFixed(1)} ${pos.z.toFixed(1)}`;\r\n}\r\n\r\n/**\r\n * Parse position string to object\r\n */\r\nfunction parsePosition(str) {\r\n const parts = str.split(' ').map(Number);\r\n return { x: parts[0] || 0, y: parts[1] || 0, z: parts[2] || 0 };\r\n}\r\n\r\n/**\r\n * Validate email\r\n */\r\nfunction isValidEmail(email) {\r\n const re = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\r\n return re.test(email);\r\n}\r\n\r\n/**\r\n * Deep clone object\r\n */\r\nfunction deepClone(obj) {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\nexport {\r\n generateId,\r\n sanitizeId,\r\n generateThumbnail,\r\n loadImageAsDataUrl,\r\n showToast,\r\n showModal,\r\n hideModal,\r\n formatFileSize,\r\n downloadTextAsFile,\r\n debounce,\r\n positionToString,\r\n parsePosition,\r\n isValidEmail,\r\n deepClone\r\n};\r\n","// Storage Manager - Handles LocalStorage operations\r\nimport { downloadTextAsFile, showToast } from \"./utils.js\";\r\n\r\nclass ProjectStorageManager {\r\n constructor() {\r\n this.storageKey = \"swt_project\";\r\n this.autoSaveInterval = null;\r\n this.autoSaveDelay = 30000; // 30 seconds\r\n }\r\n\r\n /**\r\n * Save project to localStorage\r\n */\r\n saveProject(projectData) {\r\n try {\r\n const json = JSON.stringify(projectData);\r\n localStorage.setItem(this.storageKey, json);\r\n localStorage.setItem(\r\n this.storageKey + \"_lastSaved\",\r\n new Date().toISOString()\r\n );\r\n return true;\r\n } catch (error) {\r\n console.error(\"Failed to save project:\", error);\r\n if (error.name === \"QuotaExceededError\") {\r\n showToast(\"Storage quota exceeded. Project too large!\", \"error\");\r\n }\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Load project from localStorage\r\n */\r\n loadProject() {\r\n try {\r\n const json = localStorage.getItem(this.storageKey);\r\n if (json) {\r\n const projectData = JSON.parse(json);\r\n\r\n // Validate and migrate data if needed\r\n if (!this.validateProjectData(projectData)) {\r\n console.error(\"Invalid project data structure\");\r\n return null;\r\n }\r\n\r\n return projectData;\r\n }\r\n return null;\r\n } catch (error) {\r\n console.error(\"Failed to load project:\", error);\r\n showToast(\"Failed to load project\", \"error\");\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Validate project data structure\r\n */\r\n validateProjectData(projectData) {\r\n if (!projectData || typeof projectData !== \"object\") {\r\n return false;\r\n }\r\n\r\n // Check if scenes array exists and is valid\r\n if (!projectData.scenes || !Array.isArray(projectData.scenes)) {\r\n return false;\r\n }\r\n\r\n // Validate each scene has required properties\r\n for (const scene of projectData.scenes) {\r\n if (!scene || typeof scene !== \"object\") {\r\n return false;\r\n }\r\n\r\n // Required scene properties\r\n if (!scene.id || typeof scene.id !== \"string\") {\r\n return false;\r\n }\r\n\r\n // imageUrl is required for scenes to be valid\r\n if (!scene.imageUrl || typeof scene.imageUrl !== \"string\") {\r\n return false;\r\n }\r\n\r\n // Hotspots array should exist (can be empty)\r\n if (!Array.isArray(scene.hotspots)) {\r\n scene.hotspots = []; // Auto-fix missing hotspots array\r\n }\r\n }\r\n\r\n // Ensure config exists\r\n if (!projectData.config || typeof projectData.config !== \"object\") {\r\n projectData.config = { title: \"My Virtual Tour\" };\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Clear project from localStorage\r\n */\r\n clearProject() {\r\n try {\r\n localStorage.removeItem(this.storageKey);\r\n localStorage.removeItem(this.storageKey + \"_lastSaved\");\r\n return true;\r\n } catch (error) {\r\n console.error(\"Failed to clear project:\", error);\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Check if project exists in localStorage\r\n */\r\n hasProject() {\r\n return localStorage.getItem(this.storageKey) !== null;\r\n }\r\n\r\n /**\r\n * Get last saved date\r\n */\r\n getLastSavedDate() {\r\n const dateStr = localStorage.getItem(this.storageKey + \"_lastSaved\");\r\n return dateStr ? new Date(dateStr) : null;\r\n }\r\n\r\n /**\r\n * Start auto-save\r\n */\r\n startAutoSave(callback) {\r\n this.stopAutoSave();\r\n this.autoSaveInterval = setInterval(() => {\r\n callback();\r\n }, this.autoSaveDelay);\r\n }\r\n\r\n /**\r\n * Stop auto-save\r\n */\r\n stopAutoSave() {\r\n if (this.autoSaveInterval) {\r\n clearInterval(this.autoSaveInterval);\r\n this.autoSaveInterval = null;\r\n }\r\n }\r\n\r\n /**\r\n * Export project to file\r\n */\r\n exportToFile(projectData, filename = \"tour.json\") {\r\n try {\r\n const json = JSON.stringify(projectData, null, 2);\r\n downloadTextAsFile(json, filename);\r\n return true;\r\n } catch (error) {\r\n console.error(\"Failed to export project:\", error);\r\n showToast(\"Failed to export project\", \"error\");\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Import project from file\r\n */\r\n async importFromFile(file) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e) => {\r\n try {\r\n const projectData = JSON.parse(e.target.result);\r\n resolve(projectData);\r\n } catch (error) {\r\n console.error(\"Failed to parse project file:\", error);\r\n showToast(\"Invalid project file\", \"error\");\r\n reject(error);\r\n }\r\n };\r\n\r\n reader.onerror = () => {\r\n console.error(\"Failed to read file:\", reader.error);\r\n showToast(\"Failed to read file\", \"error\");\r\n reject(reader.error);\r\n };\r\n\r\n reader.readAsText(file);\r\n });\r\n }\r\n}\r\n\r\nexport default ProjectStorageManager;\r\n","// Scene Manager - Handles scene operations\r\nimport {\r\n generateThumbnail,\r\n loadImageAsDataUrl,\r\n sanitizeId,\r\n showToast,\r\n} from \"./utils.js\";\r\n\r\nclass SceneManagerEditor {\r\n constructor(editor) {\r\n this.editor = editor;\r\n this.scenes = [];\r\n this.currentSceneIndex = -1;\r\n }\r\n\r\n /**\r\n * Add new scene\r\n */\r\n async addScene(file) {\r\n try {\r\n // Generate thumbnail\r\n const thumbnail = await generateThumbnail(file);\r\n\r\n // Load full image\r\n const imageDataUrl = await loadImageAsDataUrl(file);\r\n\r\n const scene = {\r\n id: sanitizeId(file.name.replace(/\\.[^/.]+$/, \"\")),\r\n name: file.name.replace(/\\.[^/.]+$/, \"\"),\r\n imageUrl: imageDataUrl,\r\n thumbnail: thumbnail,\r\n hotspots: [],\r\n };\r\n\r\n this.scenes.push(scene);\r\n this.currentSceneIndex = this.scenes.length - 1;\r\n showToast(`Scene \"${scene.name}\" added successfully`, \"success\");\r\n return scene;\r\n } catch (error) {\r\n console.error(\"Failed to add scene:\", error);\r\n showToast(\"Failed to add scene\", \"error\");\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Remove scene by index\r\n */\r\n removeScene(index) {\r\n if (index >= 0 && index < this.scenes.length) {\r\n const scene = this.scenes[index];\r\n\r\n // Confirm deletion\r\n if (!confirm(`Are you sure you want to delete scene \"${scene.name}\"?`)) {\r\n return false;\r\n }\r\n\r\n this.scenes.splice(index, 1);\r\n\r\n // Update current scene index\r\n if (this.currentSceneIndex === index) {\r\n this.currentSceneIndex = Math.min(\r\n this.currentSceneIndex,\r\n this.scenes.length - 1\r\n );\r\n } else if (this.currentSceneIndex > index) {\r\n this.currentSceneIndex--;\r\n }\r\n\r\n showToast(`Scene \"${scene.name}\" removed`, \"success\");\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get scene by index\r\n */\r\n getScene(index) {\r\n return this.scenes[index] || null;\r\n }\r\n\r\n /**\r\n * Get scene by ID\r\n */\r\n getSceneById(id) {\r\n return this.scenes.find((s) => s.id === id) || null;\r\n }\r\n\r\n /**\r\n * Update scene property\r\n */\r\n updateScene(index, property, value) {\r\n if (index >= 0 && index < this.scenes.length) {\r\n this.scenes[index][property] = value;\r\n\r\n // If updating ID, update all hotspot target references\r\n if (property === \"id\") {\r\n this.scenes.forEach((scene) => {\r\n scene.hotspots.forEach((hotspot) => {\r\n if (hotspot.targetSceneId === this.scenes[index].id) {\r\n hotspot.targetSceneId = value;\r\n }\r\n });\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Reorder scenes\r\n */\r\n reorderScenes(fromIndex, toIndex) {\r\n if (\r\n fromIndex >= 0 &&\r\n fromIndex < this.scenes.length &&\r\n toIndex >= 0 &&\r\n toIndex < this.scenes.length\r\n ) {\r\n const scene = this.scenes.splice(fromIndex, 1)[0];\r\n this.scenes.splice(toIndex, 0, scene);\r\n\r\n // Update current scene index\r\n if (this.currentSceneIndex === fromIndex) {\r\n this.currentSceneIndex = toIndex;\r\n } else if (\r\n fromIndex < this.currentSceneIndex &&\r\n toIndex >= this.currentSceneIndex\r\n ) {\r\n this.currentSceneIndex--;\r\n } else if (\r\n fromIndex > this.currentSceneIndex &&\r\n toIndex <= this.currentSceneIndex\r\n ) {\r\n this.currentSceneIndex++;\r\n }\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get current scene\r\n */\r\n getCurrentScene() {\r\n return this.getScene(this.currentSceneIndex);\r\n }\r\n\r\n /**\r\n * Set current scene by index\r\n */\r\n setCurrentScene(index) {\r\n if (index >= 0 && index < this.scenes.length) {\r\n this.currentSceneIndex = index;\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Get all scenes\r\n */\r\n getAllScenes() {\r\n return this.scenes;\r\n }\r\n\r\n /**\r\n * Get all scenes (alias for getAllScenes)\r\n */\r\n getScenes() {\r\n return this.scenes;\r\n }\r\n\r\n /**\r\n * Clear all scenes\r\n */\r\n clearScenes() {\r\n if (this.scenes.length > 0) {\r\n if (!confirm(\"Are you sure you want to clear all scenes?\")) {\r\n return false;\r\n }\r\n }\r\n\r\n this.scenes = [];\r\n this.currentSceneIndex = -1;\r\n return true;\r\n }\r\n\r\n /**\r\n * Load scenes from data\r\n */\r\n loadScenes(scenesData) {\r\n this.scenes = scenesData || [];\r\n this.currentSceneIndex = this.scenes.length > 0 ? 0 : -1;\r\n }\r\n}\r\n\r\nexport default SceneManagerEditor;\r\n","// Hotspot Editor - Handles hotspot placement and editing\r\nimport { generateId, showToast } from './utils.js';\r\n\r\nclass HotspotEditor {\r\n constructor(editor) {\r\n this.editor = editor;\r\n this.currentHotspotIndex = -1;\r\n this.placementMode = false;\r\n }\r\n\r\n /**\r\n * Enable hotspot placement mode\r\n */\r\n enablePlacementMode() {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene) {\r\n showToast('Please select a scene first', 'error');\r\n return false;\r\n }\r\n\r\n this.placementMode = true;\r\n \r\n // Visual feedback\r\n document.body.style.cursor = 'crosshair';\r\n const preview = document.getElementById('preview');\r\n if (preview) {\r\n preview.style.border = '3px solid #4CC3D9';\r\n preview.style.boxShadow = '0 0 20px rgba(76, 195, 217, 0.5)';\r\n }\r\n \r\n // Update button state\r\n const btn = document.getElementById('addHotspotBtn');\r\n if (btn) {\r\n btn.textContent = 'Click on Preview...';\r\n btn.classList.add('btn-active');\r\n }\r\n \r\n showToast('Click on the 360° preview to place hotspot', 'info', 5000);\r\n return true;\r\n }\r\n\r\n /**\r\n * Disable hotspot placement mode\r\n */\r\n disablePlacementMode() {\r\n this.placementMode = false;\r\n document.body.style.cursor = 'default';\r\n \r\n // Remove visual feedback\r\n const preview = document.getElementById('preview');\r\n if (preview) {\r\n preview.style.border = '';\r\n preview.style.boxShadow = '';\r\n }\r\n \r\n // Reset button state\r\n const btn = document.getElementById('addHotspotBtn');\r\n if (btn) {\r\n btn.textContent = '+ Add Hotspot';\r\n btn.classList.remove('btn-active');\r\n }\r\n}\r\n\r\n /**\r\n * Add hotspot at position\r\n */\r\n addHotspot(position, targetSceneId = '') {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene) {\r\n showToast('No scene selected', 'error');\r\n return null;\r\n }\r\n\r\n const hotspot = {\r\n id: generateId('hotspot'),\r\n type: 'navigation',\r\n position: position,\r\n targetSceneId: targetSceneId,\r\n title: 'New Hotspot',\r\n description: '',\r\n color: '#00ff00',\r\n icon: ''\r\n };\r\n\r\n scene.hotspots.push(hotspot);\r\n this.currentHotspotIndex = scene.hotspots.length - 1;\r\n \r\n this.disablePlacementMode();\r\n showToast('Hotspot added', 'success');\r\n \r\n return hotspot;\r\n }\r\n\r\n /**\r\n * Remove hotspot\r\n */\r\n removeHotspot(index) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || index < 0 || index >= scene.hotspots.length) {\r\n return false;\r\n }\r\n\r\n if (!confirm('Are you sure you want to delete this hotspot?')) {\r\n return false;\r\n }\r\n\r\n scene.hotspots.splice(index, 1);\r\n \r\n // Update current index\r\n if (this.currentHotspotIndex === index) {\r\n this.currentHotspotIndex = -1;\r\n } else if (this.currentHotspotIndex > index) {\r\n this.currentHotspotIndex--;\r\n }\r\n\r\n showToast('Hotspot removed', 'success');\r\n return true;\r\n }\r\n\r\n /**\r\n * Update hotspot property\r\n */\r\n updateHotspot(index, property, value) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || index < 0 || index >= scene.hotspots.length) {\r\n return false;\r\n }\r\n\r\n scene.hotspots[index][property] = value;\r\n return true;\r\n }\r\n\r\n /**\r\n * Get hotspot by index\r\n */\r\n getHotspot(index) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || index < 0 || index >= scene.hotspots.length) {\r\n return null;\r\n }\r\n return scene.hotspots[index];\r\n }\r\n\r\n /**\r\n * Update hotspot position\r\n */\r\n updateHotspotPosition(index, position) {\r\n return this.updateHotspot(index, 'position', position);\r\n }\r\n\r\n /**\r\n * Get current hotspot\r\n */\r\n getCurrentHotspot() {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || this.currentHotspotIndex < 0) {\r\n return null;\r\n }\r\n return scene.hotspots[this.currentHotspotIndex] || null;\r\n }\r\n\r\n /**\r\n * Set current hotspot\r\n */\r\n setCurrentHotspot(index) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || index < 0 || index >= scene.hotspots.length) {\r\n this.currentHotspotIndex = -1;\r\n return false;\r\n }\r\n \r\n this.currentHotspotIndex = index;\r\n return true;\r\n }\r\n\r\n /**\r\n * Get all hotspots for current scene\r\n */\r\n getAllHotspots() {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n return scene ? scene.hotspots : [];\r\n }\r\n\r\n /**\r\n * Duplicate hotspot\r\n */\r\n duplicateHotspot(index) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || index < 0 || index >= scene.hotspots.length) {\r\n return null;\r\n }\r\n\r\n const original = scene.hotspots[index];\r\n const duplicate = deepClone(original);\r\n duplicate.id = generateId('hotspot');\r\n duplicate.title = original.title + ' (Copy)';\r\n \r\n // Offset position slightly\r\n duplicate.position = {\r\n x: original.position.x + 0.5,\r\n y: original.position.y,\r\n z: original.position.z\r\n };\r\n\r\n scene.hotspots.push(duplicate);\r\n this.currentHotspotIndex = scene.hotspots.length - 1;\r\n \r\n showToast('Hotspot duplicated', 'success');\r\n return duplicate;\r\n }\r\n\r\n /**\r\n * Clear all hotspots\r\n */\r\n clearAllHotspots() {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene) {\r\n return false;\r\n }\r\n\r\n if (scene.hotspots.length === 0) {\r\n return true;\r\n }\r\n\r\n if (!confirm('Are you sure you want to remove all hotspots from this scene?')) {\r\n return false;\r\n }\r\n\r\n scene.hotspots = [];\r\n this.currentHotspotIndex = -1;\r\n \r\n showToast('All hotspots removed', 'success');\r\n return true;\r\n }\r\n}\r\n\r\nexport default HotspotEditor;\r\n","// Preview Controller - Manages A-Frame preview integration using SWT library\r\nimport { showToast } from \"./utils.js\";\r\n\r\nclass PreviewController {\r\n constructor(editor) {\r\n this.editor = editor;\r\n this.tour = null;\r\n this.isInitialized = false;\r\n this.previewContainer = null;\r\n this.hasLoadedScene = false; // Track if we've ever loaded a scene\r\n }\r\n\r\n /**\r\n * Initialize A-Frame preview\r\n */\r\n async init() {\r\n this.previewContainer = document.getElementById(\"preview\");\r\n if (!this.previewContainer) {\r\n console.error(\"Preview element not found\");\r\n return false;\r\n }\r\n\r\n // Wait for A-Frame to be loaded\r\n if (typeof AFRAME === \"undefined\") {\r\n await this.waitForLibrary(\"AFRAME\", 5000);\r\n }\r\n\r\n // Wait for SWT library to be loaded\r\n if (typeof SWT === \"undefined\") {\r\n await this.waitForLibrary(\"SWT\", 5000);\r\n }\r\n this.isInitialized = true;\r\n return true;\r\n }\r\n\r\n /**\r\n * Wait for a global library to be available\r\n */\r\n async waitForLibrary(libraryName, timeout = 5000) {\r\n const startTime = Date.now();\r\n\r\n while (typeof window[libraryName] === \"undefined\") {\r\n if (Date.now() - startTime > timeout) {\r\n throw new Error(`Timeout waiting for ${libraryName} to load`);\r\n }\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n }\r\n }\r\n\r\n /**\r\n * Load scene into preview using SWT library\r\n */\r\n async loadScene(scene, preserveCameraRotation = true) {\r\n if (!this.isInitialized || !scene) {\r\n return;\r\n }\r\n\r\n // Validate scene has required data\r\n if (!scene.imageUrl || !scene.id) {\r\n console.error(\"Invalid scene data:\", scene);\r\n return;\r\n }\r\n\r\n // Show loading animation\r\n this.showLoading();\r\n\r\n // Save camera rotation before destroying scene\r\n let savedRotation = null;\r\n if (preserveCameraRotation && this.tour) {\r\n savedRotation = this.getCameraRotation();\r\n }\r\n\r\n // Destroy existing tour if any\r\n if (this.tour) {\r\n try {\r\n this.tour.destroy();\r\n } catch (error) {\r\n console.error(\"Error destroying tour:\", error);\r\n }\r\n this.tour = null;\r\n }\r\n\r\n // Clear preview container carefully\r\n // Only do complex cleanup if we've actually loaded a scene before\r\n if (this.hasLoadedScene) {\r\n const existingScene = this.previewContainer.querySelector(\"a-scene\");\r\n if (existingScene) {\r\n try {\r\n // Remove the scene element - A-Frame will handle cleanup if it's ready\r\n this.previewContainer.removeChild(existingScene);\r\n } catch (error) {\r\n console.error(\"Error removing scene:\", error);\r\n }\r\n }\r\n \r\n // Clear any remaining children (loading overlays, empty state, etc)\r\n while (this.previewContainer.firstChild) {\r\n this.previewContainer.removeChild(this.previewContainer.firstChild);\r\n }\r\n } else {\r\n // First load - only remove non-A-Frame elements (like empty state divs)\r\n const children = Array.from(this.previewContainer.children);\r\n children.forEach(child => {\r\n // Only remove if it's NOT an a-scene (shouldn't be any, but be safe)\r\n if (child.tagName.toLowerCase() !== 'a-scene') {\r\n this.previewContainer.removeChild(child);\r\n }\r\n });\r\n }\r\n\r\n // Create loading overlay (will be removed after scene loads)\r\n const loadingOverlay = this.createLoadingOverlay();\r\n this.previewContainer.appendChild(loadingOverlay);\r\n\r\n // Create A-Frame scene\r\n const aframeScene = document.createElement(\"a-scene\");\r\n aframeScene.id = \"preview-scene\";\r\n aframeScene.setAttribute(\"embedded\", \"\");\r\n aframeScene.setAttribute(\"vr-mode-ui\", \"enabled: false;\");\r\n this.previewContainer.appendChild(aframeScene);\r\n\r\n // Give A-Frame a moment to start initializing before we proceed\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n\r\n // Build tour config for this single scene\r\n // Transform editor scene format to library format\r\n const transformedHotspots = (scene.hotspots || []).map((h) => ({\r\n id: h.id,\r\n position: h.position,\r\n action: {\r\n type: h.type === \"navigation\" ? \"navigateTo\" : h.type,\r\n target: h.targetSceneId,\r\n },\r\n appearance: {\r\n color: h.color || \"#00ff00\",\r\n icon: h.icon || null,\r\n scale: h.scale || \"1 1 1\",\r\n },\r\n tooltip: {\r\n text: h.title || \"Hotspot\",\r\n },\r\n }));\r\n\r\n const libraryScene = {\r\n id: scene.id,\r\n name: scene.name,\r\n panorama: scene.imageUrl, // Editor uses 'imageUrl', library expects 'panorama'\r\n hotspots: transformedHotspots,\r\n };\r\n\r\n // Build scenes object with ALL scenes (for navigation to work)\r\n const allScenes = {};\r\n const editorScenes = this.editor.sceneManager.scenes || [];\r\n editorScenes.forEach((s) => {\r\n const sceneHotspots = (s.hotspots || []).map((h) => ({\r\n id: h.id,\r\n position: h.position,\r\n action: {\r\n type: h.type === \"navigation\" ? \"navigateTo\" : h.type,\r\n target: h.targetSceneId,\r\n },\r\n appearance: {\r\n color: h.color || \"#00ff00\",\r\n icon: h.icon || null,\r\n scale: h.scale || \"1 1 1\",\r\n },\r\n tooltip: {\r\n text: h.title || \"Hotspot\",\r\n },\r\n }));\r\n\r\n allScenes[s.id] = {\r\n id: s.id,\r\n name: s.name,\r\n panorama: s.imageUrl,\r\n hotspots: sceneHotspots,\r\n };\r\n });\r\n\r\n const tourConfig = {\r\n title: scene.name,\r\n initialScene: scene.id,\r\n scenes: allScenes,\r\n settings: {\r\n autoRotate: false,\r\n showCompass: false,\r\n },\r\n };\r\n\r\n try {\r\n // Create new tour instance\r\n this.tour = new SWT.Tour(aframeScene, tourConfig);\r\n\r\n // Set up event listeners\r\n this.tour.addEventListener(\"tour-started\", (e) => {});\r\n\r\n this.tour.addEventListener(\"scene-loaded\", (e) => {});\r\n\r\n this.tour.addEventListener(\"hotspot-activated\", (e) => {\r\n // Find the hotspot index by ID and select it\r\n const hotspotId = e.detail?.hotspotId;\r\n if (hotspotId) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (scene) {\r\n const hotspotIndex = scene.hotspots.findIndex(\r\n (h) => h.id === hotspotId\r\n );\r\n if (hotspotIndex >= 0) {\r\n this.editor.selectHotspot(hotspotIndex);\r\n }\r\n }\r\n }\r\n });\r\n\r\n // Start the tour\r\n await this.tour.start();\r\n\r\n // Mark that we've successfully loaded a scene\r\n this.hasLoadedScene = true;\r\n\r\n // Hide loading animation after scene loads\r\n this.hideLoading();\r\n\r\n // Restore camera rotation if preserved\r\n if (savedRotation && preserveCameraRotation) {\r\n this.setCameraRotation(savedRotation);\r\n }\r\n\r\n // Setup click handler after a short delay to ensure A-Frame is ready\r\n setTimeout(() => {\r\n this.setupClickHandler();\r\n }, 500);\r\n } catch (error) {\r\n console.error(\"Failed to load preview:\", error);\r\n showToast(\"Failed to load preview: \" + error.message, \"error\");\r\n // Hide loading on error\r\n this.hideLoading();\r\n }\r\n }\r\n\r\n /**\r\n * Setup click handler for hotspot placement\r\n */\r\n setupClickHandler() {\r\n if (!this.tour) {\r\n return;\r\n }\r\n\r\n const aframeScene = this.previewContainer.querySelector(\"a-scene\");\r\n if (!aframeScene) {\r\n setTimeout(() => this.setupClickHandler(), 200); // Retry\r\n return;\r\n }\r\n\r\n // Remove any existing click handler to avoid duplicates\r\n if (this.clickHandler) {\r\n aframeScene.removeEventListener(\"click\", this.clickHandler);\r\n }\r\n\r\n // Create and store the click handler\r\n this.clickHandler = (evt) => {\r\n if (!this.editor.hotspotEditor.placementMode) {\r\n return;\r\n }\r\n\r\n // Try to get intersection from event detail first\r\n let intersection = evt.detail?.intersection;\r\n\r\n // If no intersection, perform manual raycasting\r\n if (!intersection) {\r\n const camera = aframeScene.querySelector(\"[camera]\");\r\n const sky = aframeScene.querySelector(\"a-sky\");\r\n\r\n if (!camera || !sky) {\r\n showToast(\"Scene not ready, please try again\", \"warning\");\r\n return;\r\n }\r\n\r\n // Get mouse position relative to canvas\r\n const canvas = aframeScene.canvas;\r\n const rect = canvas.getBoundingClientRect();\r\n const mouse = {\r\n x: ((evt.clientX - rect.left) / rect.width) * 2 - 1,\r\n y: -((evt.clientY - rect.top) / rect.height) * 2 + 1,\r\n };\r\n\r\n // Perform raycasting\r\n const raycaster = new THREE.Raycaster();\r\n const cameraEl = camera.object3D;\r\n raycaster.setFromCamera(mouse, cameraEl.children[0]); // Get the actual camera\r\n\r\n // Raycast against the sky sphere\r\n const intersects = raycaster.intersectObject(sky.object3D, true);\r\n\r\n if (intersects.length > 0) {\r\n intersection = intersects[0];\r\n } else {\r\n showToast(\"Click on the panorama image\", \"warning\");\r\n return;\r\n }\r\n }\r\n\r\n const point = intersection.point;\r\n const position = {\r\n x: parseFloat(point.x.toFixed(2)),\r\n y: parseFloat(point.y.toFixed(2)),\r\n z: parseFloat(point.z.toFixed(2)),\r\n };\r\n this.editor.addHotspotAtPosition(position);\r\n };\r\n aframeScene.addEventListener(\"click\", this.clickHandler);\r\n }\r\n\r\n /**\r\n * Get current camera rotation\r\n */\r\n getCameraRotation() {\r\n const aframeScene = this.previewContainer?.querySelector(\"a-scene\");\r\n if (!aframeScene) {\r\n return null;\r\n }\r\n\r\n const camera = aframeScene.querySelector(\"[camera]\");\r\n if (!camera) {\r\n return null;\r\n }\r\n\r\n // Get rotation from object3D which is more reliable\r\n const rotation = camera.object3D.rotation;\r\n const savedRotation = {\r\n x: rotation.x,\r\n y: rotation.y,\r\n z: rotation.z,\r\n };\r\n return savedRotation;\r\n }\r\n\r\n /**\r\n * Set camera rotation\r\n */\r\n setCameraRotation(rotation) {\r\n if (!rotation) {\r\n return;\r\n }\r\n\r\n const aframeScene = this.previewContainer?.querySelector(\"a-scene\");\r\n if (!aframeScene) {\r\n return;\r\n }\r\n\r\n const camera = aframeScene.querySelector(\"[camera]\");\r\n if (!camera) {\r\n return;\r\n }\r\n\r\n // Set rotation on object3D directly\r\n const setRotation = () => {\r\n if (camera.object3D) {\r\n camera.object3D.rotation.set(rotation.x, rotation.y, rotation.z);\r\n }\r\n };\r\n\r\n // Try immediately and also after a delay to ensure it sticks\r\n setRotation();\r\n setTimeout(setRotation, 100);\r\n setTimeout(setRotation, 300);\r\n }\r\n\r\n /**\r\n * Refresh preview (reload current scene while preserving camera rotation)\r\n */\r\n async refresh() {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (scene) {\r\n // Save current camera rotation\r\n const savedRotation = this.getCameraRotation();\r\n // Reload scene\r\n await this.loadScene(scene);\r\n\r\n // Restore camera rotation\r\n if (savedRotation) {\r\n this.setCameraRotation(savedRotation);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Reset camera\r\n */\r\n resetCamera() {\r\n const camera = this.previewContainer?.querySelector(\"[camera]\");\r\n if (camera) {\r\n camera.setAttribute(\"rotation\", \"0 0 0\");\r\n }\r\n }\r\n\r\n /**\r\n * Point camera to hotspot position\r\n */\r\n pointCameraToHotspot(hotspotPosition) {\r\n if (!hotspotPosition) {\r\n return;\r\n }\r\n\r\n const aframeScene = this.previewContainer?.querySelector(\"a-scene\");\r\n if (!aframeScene) {\r\n return;\r\n }\r\n\r\n const camera = aframeScene.querySelector(\"[camera]\");\r\n if (!camera || !camera.object3D) {\r\n return;\r\n }\r\n\r\n // Get camera position (usually at origin 0,0,0)\r\n const cameraPos = camera.object3D.position;\r\n\r\n // Calculate direction vector from camera to hotspot\r\n const direction = new THREE.Vector3(\r\n hotspotPosition.x - cameraPos.x,\r\n hotspotPosition.y - cameraPos.y,\r\n hotspotPosition.z - cameraPos.z\r\n );\r\n\r\n // Calculate spherical coordinates (yaw and pitch)\r\n const distance = direction.length();\r\n\r\n // Pitch (up/down rotation around X-axis) - in degrees\r\n const pitch = Math.asin(direction.y / distance) * (180 / Math.PI);\r\n\r\n // Yaw (left/right rotation around Y-axis) - in degrees\r\n // Using atan2 to get correct quadrant\r\n const yaw = Math.atan2(direction.x, direction.z) * (180 / Math.PI);\r\n\r\n // Apply smooth rotation with animation\r\n this.animateCameraRotation(camera, { x: pitch, y: yaw, z: 0 });\r\n }\r\n\r\n /**\r\n * Animate camera rotation smoothly\r\n */\r\n animateCameraRotation(camera, targetRotation, duration = 800) {\r\n if (!camera || !camera.object3D) return;\r\n\r\n const startRotation = {\r\n x: camera.object3D.rotation.x * (180 / Math.PI),\r\n y: camera.object3D.rotation.y * (180 / Math.PI),\r\n z: camera.object3D.rotation.z * (180 / Math.PI),\r\n };\r\n\r\n // Handle angle wrapping for smooth rotation\r\n let deltaY = targetRotation.y - startRotation.y;\r\n\r\n // Normalize to -180 to 180 range\r\n while (deltaY > 180) deltaY -= 360;\r\n while (deltaY < -180) deltaY += 360;\r\n\r\n const endRotationY = startRotation.y + deltaY;\r\n\r\n const startTime = Date.now();\r\n\r\n const animate = () => {\r\n const elapsed = Date.now() - startTime;\r\n const progress = Math.min(elapsed / duration, 1);\r\n\r\n // Ease-in-out function for smooth animation\r\n const eased =\r\n progress < 0.5\r\n ? 2 * progress * progress\r\n : 1 - Math.pow(-2 * progress + 2, 2) / 2;\r\n\r\n // Interpolate rotation\r\n const currentRotation = {\r\n x: startRotation.x + (targetRotation.x - startRotation.x) * eased,\r\n y: startRotation.y + (endRotationY - startRotation.y) * eased,\r\n z: startRotation.z + (targetRotation.z - startRotation.z) * eased,\r\n };\r\n\r\n // Apply rotation (convert degrees to radians)\r\n camera.object3D.rotation.set(\r\n currentRotation.x * (Math.PI / 180),\r\n currentRotation.y * (Math.PI / 180),\r\n currentRotation.z * (Math.PI / 180)\r\n );\r\n\r\n if (progress < 1) {\r\n requestAnimationFrame(animate);\r\n }\r\n };\r\n\r\n animate();\r\n }\r\n\r\n /**\r\n * Highlight hotspot (not needed with library, but keep for compatibility)\r\n */\r\n highlightHotspot(index) {\r\n // The library handles hotspot visualization\r\n // This is kept for API compatibility\r\n }\r\n\r\n /**\r\n * Update hotspot marker (refresh scene while preserving camera rotation)\r\n */\r\n async updateHotspotMarker(index) {\r\n const scene = this.editor.sceneManager.getCurrentScene();\r\n if (!scene || !this.tour) return;\r\n\r\n const hotspot = scene.hotspots[index];\r\n if (!hotspot) return;\r\n\r\n // Refresh the preview to reflect changes, camera rotation will be preserved\r\n await this.refresh();\r\n }\r\n\r\n /**\r\n * Create loading overlay element\r\n */\r\n createLoadingOverlay() {\r\n const overlay = document.createElement(\"div\");\r\n overlay.className = \"preview-loading\";\r\n overlay.innerHTML = `\r\n <div class=\"loading-spinner\"></div>\r\n <div class=\"loading-text\">Loading scene...</div>\r\n `;\r\n return overlay;\r\n }\r\n\r\n /**\r\n * Show loading animation\r\n */\r\n showLoading() {\r\n const existing = this.previewContainer?.querySelector(\".preview-loading\");\r\n if (existing) {\r\n existing.classList.remove(\"hidden\");\r\n }\r\n }\r\n\r\n /**\r\n * Hide loading animation\r\n */\r\n hideLoading() {\r\n const loading = this.previewContainer?.querySelector(\".preview-loading\");\r\n if (loading) {\r\n loading.classList.add(\"hidden\");\r\n // Remove after transition\r\n setTimeout(() => {\r\n if (loading.parentNode) {\r\n loading.parentNode.removeChild(loading);\r\n }\r\n }, 300);\r\n }\r\n }\r\n}\r\n\r\nexport default PreviewController;\r\n","// UI Controller - Handles DOM manipulation and rendering\r\n\r\nclass UIController {\r\n constructor(editor) {\r\n this.editor = editor;\r\n this.sceneList = document.getElementById('sceneList');\r\n this.hotspotList = document.getElementById('hotspotList');\r\n this.draggedElement = null;\r\n }\r\n\r\n /**\r\n * Render scene list\r\n */\r\n renderSceneList() {\r\n if (!this.sceneList) return;\r\n\r\n this.sceneList.innerHTML = '';\r\n const scenes = this.editor.sceneManager.getAllScenes();\r\n const currentIndex = this.editor.sceneManager.currentSceneIndex;\r\n\r\n if (scenes.length === 0) {\r\n const empty = document.createElement('div');\r\n empty.className = 'empty-state';\r\n empty.innerHTML = `\r\n <p>No scenes yet</p>\r\n <p class=\"hint\">Click \"Add Scene\" to upload a 360° panorama</p>\r\n `;\r\n this.sceneList.appendChild(empty);\r\n return;\r\n }\r\n\r\n scenes.forEach((scene, index) => {\r\n const card = this.createSceneCard(scene, index, index === currentIndex);\r\n this.sceneList.appendChild(card);\r\n });\r\n }\r\n\r\n /**\r\n * Create scene card element\r\n */\r\n createSceneCard(scene, index, isActive) {\r\n const card = document.createElement('div');\r\n card.className = 'scene-card' + (isActive ? ' active' : '');\r\n card.draggable = true;\r\n card.dataset.index = index;\r\n\r\n // Drag handle\r\n const dragHandle = document.createElement('div');\r\n dragHandle.className = 'drag-handle';\r\n dragHandle.innerHTML = '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 448 512\"><!--!Font Awesome Free v6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--><path d=\"M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z\"/></svg>';\r\n\r\n // Thumbnail\r\n const thumbnail = document.createElement('img');\r\n thumbnail.src = scene.thumbnail || scene.imageUrl;\r\n thumbnail.alt = scene.name;\r\n\r\n // Info\r\n const info = document.createElement('div');\r\n info.className = 'scene-info';\r\n\r\n const name = document.createElement('div');\r\n name.className = 'scene-name';\r\n name.textContent = scene.name;\r\n\r\n const meta = document.createElement('div');\r\n meta.className = 'scene-meta';\r\n meta.textContent = `${scene.hotspots.length} hotspot${scene.hotspots.length !== 1 ? 's' : ''}`;\r\n\r\n info.appendChild(name);\r\n info.appendChild(meta);\r\n\r\n // Actions\r\n const actions = document.createElement('div');\r\n actions.className = 'scene-actions';\r\n\r\n const deleteBtn = document.createElement('button');\r\n deleteBtn.className = 'btn-icon';\r\n deleteBtn.innerHTML = '🗑️';\r\n deleteBtn.title = 'Delete scene';\r\n deleteBtn.onclick = (e) => {\r\n e.stopPropagation();\r\n this.editor.removeScene(index);\r\n };\r\n\r\n actions.appendChild(deleteBtn);\r\n\r\n card.appendChild(dragHandle);\r\n card.appendChild(thumbnail);\r\n card.appendChild(info);\r\n card.appendChild(actions);\r\n\r\n // Click handler\r\n card.onclick = () => {\r\n this.editor.selectScene(index);\r\n };\r\n\r\n // Drag and drop handlers\r\n this.setupDragAndDrop(card);\r\n\r\n return card;\r\n }\r\n\r\n /**\r\n * Setup drag and drop for scene reordering\r\n */\r\n setupDragAndDrop(card) {\r\n card.addEventListener('dragstart', (e) => {\r\n this.draggedElement = card;\r\n card.classList.add('dragging');\r\n e.dataTransfer.effectAllowed = 'move';\r\n });\r\n\r\n card.addEventListener('dragend', () => {\r\n card.classList.remove('dragging');\r\n this.draggedElement = null;\r\n });\r\n\r\n card.addEventListener('dragover', (e) => {\r\n e.preventDefault();\r\n e.dataTransfer.dropEffect = 'move';\r\n\r\n if (this.draggedElement && this.draggedElement !== card) {\r\n const bounding = card.getBoundingClientRect();\r\n const offset = bounding.y + bounding.height / 2;\r\n\r\n if (e.clientY - offset > 0) {\r\n card.style.borderBottom = '2px solid var(--accent-color)';\r\n card.style.borderTop = '';\r\n } else {\r\n card.style.borderTop = '2px solid var(--accent-color)';\r\n card.style.borderBottom = '';\r\n }\r\n }\r\n });\r\n\r\n card.addEventListener('dragleave', () => {\r\n card.style.borderTop = '';\r\n card.style.borderBottom = '';\r\n });\r\n\r\n card.addEventListener('drop', (e) => {\r\n e.preventDefault();\r\n card.style.borderTop = '';\r\n card.style.borderBottom = '';\r\n\r\n if (this.draggedElement && this.draggedElement !== card) {\r\n const fromIndex = parseInt(this.draggedElement.dataset.index);\r\n const toIndex = parseInt(card.dataset.index);\r\n this.editor.reorderScenes(fromIndex, toIndex);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Render hotspot list\r\n */\r\n renderHotspotList() {\r\n if (!this.hotspotList) return;\r\n\r\n this.hotspotList.innerHTML = '';\r\n const hotspots = this.editor.hotspotEditor.getAllHotspots();\r\n const currentIndex = this.editor.hotspotEditor.currentHotspotIndex;\r\n\r\n if (hotspots.length === 0) {\r\n const empty = document.createElement('div');\r\n empty.className = 'empty-state';\r\n empty.textContent = 'No hotspots. Click \"Add Hotspot\" to create one.';\r\n this.hotspotList.appendChild(empty);\r\n return;\r\n }\r\n\r\n hotspots.forEach((hotspot, index) => {\r\n const item = this.createHotspotItem(hotspot, index, index === currentIndex);\r\n this.hotspotList.appendChild(item);\r\n });\r\n }\r\n\r\n /**\r\n * Create hotspot list item\r\n */\r\n createHotspotItem(hotspot, index, isActive) {\r\n const item = document.createElement('div');\r\n item.className = 'hotspot-item' + (isActive ? ' active' : '');\r\n\r\n const color = document.createElement('div');\r\n color.className = 'hotspot-color';\r\n color.style.backgroundColor = hotspot.color;\r\n\r\n const info = document.createElement('div');\r\n info.className = 'hotspot-info';\r\n \r\n const title = document.createElement('div');\r\n title.className = 'hotspot-title';\r\n title.textContent = hotspot.title || 'Untitled Hotspot';\r\n \r\n const target = document.createElement('div');\r\n target.className = 'hotspot-target';\r\n if (hotspot.targetSceneId) {\r\n const targetScene = this.editor.sceneManager.getSceneById(hotspot.targetSceneId);\r\n target.textContent = targetScene ? `→ ${targetScene.name}` : `→ ${hotspot.targetSceneId}`;\r\n } else {\r\n target.textContent = 'No target';\r\n }\r\n \r\n info.appendChild(title);\r\n info.appendChild(target);\r\n\r\n const actions = document.createElement('div');\r\n actions.className = 'hotspot-actions';\r\n\r\n const deleteBtn = document.createElement('button');\r\n deleteBtn.className = 'btn-delete';\r\n deleteBtn.innerHTML = '🗑️';\r\n deleteBtn.title = 'Delete';\r\n deleteBtn.onclick = (e) => {\r\n e.stopPropagation();\r\n this.editor.removeHotspot(index);\r\n };\r\n\r\n actions.appendChild(deleteBtn);\r\n\r\n item.appendChild(color);\r\n item.appendChild(info);\r\n item.appendChild(actions);\r\n\r\n item.onclick = () => {\r\n this.editor.selectHotspot(index);\r\n };\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * Update properties panel for hotspot\r\n */\r\n updateHotspotProperties(hotspot) {\r\n const hotspotAll = document.getElementById('hotspotAll');\r\n const hotspotProperties = document.getElementById('hotspotProperties');\r\n \r\n if (!hotspot) {\r\n // No hotspot selected - show list, hide properties\r\n if (hotspotAll) hotspotAll.style.display = 'block';\r\n if (hotspotProperties) hotspotProperties.style.display = 'none';\r\n \r\n // Clear form\r\n document.getElementById('hotspotTitle').value = '';\r\n document.getElementById('hotspotDescription').value = '';\r\n document.getElementById('hotspotTarget').value = '';\r\n document.getElementById('hotspotColor').value = '#00ff00';\r\n const colorText = document.getElementById('hotspotColorText');\r\n if (colorText) colorText.value = '#00ff00';\r\n document.getElementById('hotspotPosX').value = '';\r\n document.getElementById('hotspotPosY').value = '';\r\n document.getElementById('hotspotPosZ').value = '';\r\n return;\r\n }\r\n\r\n // Hotspot selected - show both list and properties\r\n if (hotspotAll) hotspotAll.style.display = 'block';\r\n if (hotspotProperties) hotspotProperties.style.display = 'block';\r\n\r\n document.getElementById('hotspotTitle').value = hotspot.title || '';\r\n document.getElementById('hotspotDescription').value = hotspot.description || '';\r\n document.getElementById('hotspotTarget').value = hotspot.targetSceneId || '';\r\n document.getElementById('hotspotColor').value = hotspot.color || '#00ff00';\r\n \r\n // Update color text input if it exists\r\n const colorText = document.getElementById('hotspotColorText');\r\n if (colorText) {\r\n colorText.value = hotspot.color || '#00ff00';\r\n }\r\n \r\n // Update position inputs\r\n const pos = hotspot.position || { x: 0, y: 0, z: 0 };\r\n document.getElementById('hotspotPosX').value = pos.x;\r\n document.getElementById('hotspotPosY').value = pos.y;\r\n document.getElementById('hotspotPosZ').value = pos.z;\r\n\r\n // Update target dropdown\r\n this.updateTargetSceneOptions();\r\n }\r\n\r\n /**\r\n * Update properties panel for scene\r\n */\r\n updateSceneProperties(scene) {\r\n if (!scene) {\r\n document.getElementById('sceneId').value = '';\r\n document.getElementById('sceneName').value = '';\r\n document.getElementById('sceneImageUrl').value = '';\r\n return;\r\n }\r\n\r\n document.getElementById('sceneId').value = scene.id || '';\r\n document.getElementById('sceneName').value = scene.name || '';\r\n document.getElementById('sceneImageUrl').value = scene.imageUrl || '';\r\n }\r\n\r\n /**\r\n * Update properties panel for tour\r\n */\r\n updateTourProperties(config) {\r\n document.getElementById('tourTitle').value = config.title || '';\r\n document.getElementById('tourDescription').value = config.description || '';\r\n document.getElementById('tourInitialScene').value = config.initialSceneId || '';\r\n document.getElementById('tourAutoRotate').checked = config.autoRotate || false;\r\n document.getElementById('tourShowCompass').checked = config.showCompass || false;\r\n \r\n // Also update project name in header if it exists\r\n const projectName = document.getElementById('project-name');\r\n if (projectName) {\r\n projectName.value = config.title || '';\r\n }\r\n }\r\n\r\n /**\r\n * Update target scene options in hotspot properties\r\n */\r\n updateTargetSceneOptions() {\r\n const select = document.getElementById('hotspotTarget');\r\n if (!select) return;\r\n\r\n const scenes = this.editor.sceneManager.getAllScenes();\r\n const currentValue = select.value;\r\n\r\n select.innerHTML = '<option value=\"\">Select target scene...</option>';\r\n\r\n scenes.forEach(scene => {\r\n const option = document.createElement('option');\r\n option.value = scene.id;\r\n option.textContent = scene.name;\r\n select.appendChild(option);\r\n });\r\n\r\n select.value = currentValue;\r\n }\r\n\r\n /**\r\n * Update initial scene options in tour properties\r\n */\r\n updateInitialSceneOptions() {\r\n const select = document.getElementById('tourInitialScene');\r\n if (!select) return;\r\n\r\n const scenes = this.editor.sceneManager.getAllScenes();\r\n const currentValue = select.value;\r\n\r\n select.innerHTML = '<option value=\"\">Select initial scene...</option>';\r\n\r\n scenes.forEach(scene => {\r\n const option = document.createElement('option');\r\n option.value = scene.id;\r\n option.textContent = scene.name;\r\n select.appendChild(option);\r\n });\r\n\r\n select.value = currentValue;\r\n }\r\n\r\n /**\r\n * Show/hide loading indicator\r\n */\r\n setLoading(isLoading) {\r\n const indicator = document.querySelector('.loading-indicator');\r\n if (indicator) {\r\n indicator.style.display = isLoading ? 'block' : 'none';\r\n }\r\n }\r\n\r\n /**\r\n * Switch properties tab\r\n */\r\n switchTab(tabName) {\r\n // Update tab buttons\r\n document.querySelectorAll('.tab-btn').forEach(btn => {\r\n btn.classList.toggle('active', btn.dataset.tab === tabName);\r\n });\r\n\r\n // Update tab content\r\n document.querySelectorAll('.tab-content').forEach(content => {\r\n content.classList.toggle('active', content.id === tabName + 'Tab');\r\n });\r\n }\r\n}\r\n\r\n\r\nexport default UIController;\r\n","// Export Manager - Handles JSON generation for SWT library\r\nimport { downloadTextAsFile, showModal } from './utils.js';\r\n\r\nclass ExportManager {\r\n constructor(editor) {\r\n this.editor = editor;\r\n }\r\n\r\n /**\r\n * Generate JSON compatible with SWT library\r\n */\r\n generateJSON() {\r\n const scenes = this.editor.sceneManager.getAllScenes();\r\n const config = this.editor.config;\r\n // Build scenes array\r\n const scenesData = scenes.map(scene => ({\r\n id: scene.id,\r\n name: scene.name,\r\n imageUrl: scene.imageUrl,\r\n hotspots: scene.hotspots.map(hotspot => ({\r\n id: hotspot.id,\r\n type: hotspot.type || 'navigation',\r\n position: hotspot.position,\r\n targetSceneId: hotspot.targetSceneId || '',\r\n title: hotspot.title || '',\r\n description: hotspot.description || '',\r\n color: hotspot.color || '#00ff00',\r\n icon: hotspot.icon || ''\r\n }))\r\n }));\r\n// Determine initial scene\r\n let initialSceneId = config.initialSceneId;\r\n if (!initialSceneId && scenes.length > 0) {\r\n initialSceneId = scenes[0].id;\r\n }\r\n\r\n // Build final JSON\r\n const jsonData = {\r\n title: config.title || 'Virtual Tour',\r\n description: config.description || '',\r\n initialSceneId: initialSceneId,\r\n scenes: scenesData,\r\n settings: {\r\n autoRotate: config.autoRotate || false,\r\n showCompass: config.showCompass || false\r\n }\r\n };\r\n\r\n return jsonData;\r\n }\r\n\r\n /**\r\n * Export as JSON file\r\n */\r\n exportJSON() {\r\n try {\r\n const jsonData = this.generateJSON();\r\n const json = JSON.stringify(jsonData, null, 2);\r\n \r\n const filename = sanitizeId(jsonData.title || 'tour') + '.json';\r\n downloadTextAsFile(json, filename);\r\n \r\n showToast('Tour exported successfully', 'success');\r\n return true;\r\n } catch (error) {\r\n console.error('Export failed:', error);\r\n showToast('Export failed', 'error');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Copy JSON to clipboard\r\n */\r\n async copyJSON() {\r\n try {\r\n const jsonData = this.generateJSON();\r\n const json = JSON.stringify(jsonData, null, 2);\r\n \r\n const success = await copyToClipboard(json);\r\n if (success) {\r\n showToast('JSON copied to clipboard', 'success');\r\n } else {\r\n showToast('Failed to copy to clipboard', 'error');\r\n }\r\n return success;\r\n } catch (error) {\r\n console.error('Copy failed:', error);\r\n showToast('Copy failed', 'error');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Generate HTML viewer code\r\n */\r\n generateViewerHTML() {\r\n const jsonData = this.generateJSON();\r\n \r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>${jsonData.title}</title>\r\n <script src=\"https://aframe.io/releases/1.7.0/aframe.min.js\"></script>\r\n <script src=\"dist/swt.min.js\"></script>\r\n <style>\r\n body {\r\n margin: 0;\r\n overflow: hidden;\r\n font-family: Arial, sans-serif;\r\n }\r\n \r\n #loading {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n background: #000;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n color: #fff;\r\n z-index: 1000;\r\n }\r\n \r\n #loading.hidden {\r\n display: none;\r\n }\r\n \r\n .spinner {\r\n border: 4px solid rgba(255,255,255,0.3);\r\n border-top: 4px solid #fff;\r\n border-radius: 50%;\r\n width: 40px;\r\n height: 40px;\r\n animation: spin 1s linear infinite;\r\n margin-right: 15px;\r\n }\r\n \r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n \r\n #ui {\r\n position: fixed;\r\n bottom: 20px;\r\n left: 50%;\r\n transform: translateX(-50%);\r\n z-index: 100;\r\n display: flex;\r\n gap: 10px;\r\n }\r\n \r\n .btn {\r\n background: rgba(0,0,0,0.7);\r\n color: #fff;\r\n border: none;\r\n padding: 10px 20px;\r\n border-radius: 5px;\r\n cursor: pointer;\r\n font-size: 14px;\r\n }\r\n \r\n .btn:hover {\r\n background: rgba(0,0,0,0.9);\r\n }\r\n </style>\r\n</head>\r\n<body>\r\n <div id=\"loading\">\r\n <div class=\"spinner\"></div>\r\n <span>Loading Tour...</span>\r\n </div>\r\n \r\n <div id=\"tour-container\"></div>\r\n \r\n <div id=\"ui\" style=\"display: none;\">\r\n <button class=\"btn\" id=\"resetBtn\">Reset View</button>\r\n <span class=\"btn\" id=\"sceneInfo\"></span>\r\n </div>\r\n\r\n <script>\r\n // Tour configuration\r\n const tourConfig = ${JSON.stringify(jsonData, null, 8)};\r\n \r\n // Initialize tour\r\n let tour;\r\n \r\n document.addEventListener('DOMContentLoaded', async () => {\r\n try {\r\n // Create tour instance\r\n tour = new SenangWebsTour('tour-container', tourConfig);\r\n \r\n // Listen to events\r\n tour.on('sceneChanged', (sceneId) => {\r\nupdateSceneInfo();\r\n });\r\n \r\n tour.on('ready', () => {\r\ndocument.getElementById('loading').classList.add('hidden');\r\n document.getElementById('ui').style.display = 'flex';\r\n updateSceneInfo();\r\n });\r\n \r\n tour.on('error', (error) => {\r\n console.error('Tour error:', error);\r\n alert('Failed to load tour: ' + error.message);\r\n });\r\n \r\n // Start tour\r\n await tour.start();\r\n \r\n // Setup UI\r\n document.getElementById('resetBtn').addEventListener('click', () => {\r\n const camera = document.querySelector('[camera]');\r\n if (camera) {\r\n camera.setAttribute('rotation', '0 0 0');\r\n }\r\n });\r\n \r\n } catch (error) {\r\n console.error('Failed to initialize tour:', error);\r\n alert('Failed to initialize tour: ' + error.message);\r\n }\r\n });\r\n \r\n function updateSceneInfo() {\r\n const sceneId = tour.getCurrentSceneId();\r\n const scene = tourConfig.scenes.find(s => s.id === sceneId);\r\n if (scene) {\r\n document.getElementById('sceneInfo').textContent = scene.name;\r\n }\r\n }\r\n </script>\r\n</body>\r\n</html>`;\r\n }\r\n\r\n /**\r\n * Export as standalone HTML viewer\r\n */\r\n exportViewerHTML() {\r\n try {\r\n const html = this.generateViewerHTML();\r\n const jsonData = this.generateJSON();\r\n const filename = sanitizeId(jsonData.title || 'tour') + '-viewer.html';\r\n \r\n downloadTextAsFile(html, filename);\r\n \r\n showToast('Viewer HTML exported successfully', 'success');\r\n return true;\r\n } catch (error) {\r\n console.error('Export viewer failed:', error);\r\n showToast('Export viewer failed', 'error');\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Show export preview in modal\r\n */\r\n showExportPreview() {\r\n try {\r\n const jsonData = this.generateJSON();\r\n const json = JSON.stringify(jsonData, null, 2);\r\n \r\n const preview = document.getElementById('exportPreview');\r\n if (preview) {\r\n preview.textContent = json;\r\n }\r\n \r\n showModal('exportModal');\r\n return true;\r\n } catch (error) {\r\n console.error('Failed to show export preview:', error);\r\n showToast('Failed to generate preview', 'error');\r\n return false;\r\n }\r\n }\r\n}\r\n\r\nexport default ExportManager;\r\n","// Main Editor Controller\r\nimport { debounce, showModal } from './utils.js';\r\n\r\nclass TourEditor {\r\n constructor(options = {}) {\r\n this.config = {\r\n title: options.projectName || 'My Virtual Tour',\r\n description: '',\r\n initialSceneId: '',\r\n autoRotate: false,\r\n showCompass: false\r\n };\r\n \r\n // Store initialization options\r\n this.options = {\r\n sceneListElement: options.sceneListElement || null,\r\n previewElement: options.previewElement || null,\r\n propertiesElement: options.propertiesElement || null,\r\n autoSave: options.autoSave !== undefined ? options.autoSave : false,\r\n autoSaveInterval: options.autoSaveInterval || 30000,\r\n ...options\r\n };\r\n \r\n this.storageManager = new ProjectStorageManager();\r\n this.sceneManager = new SceneManagerEditor(this);\r\n this.hotspotEditor = new HotspotEditor(this);\r\n this.previewController = new PreviewController(this);\r\n this.uiController = new UIController(this);\r\n this.exportManager = new ExportManager(this);\r\n \r\n this.hasUnsavedChanges = false;\r\n this.lastRenderedSceneIndex = -1;\r\n this.listenersSetup = false;\r\n }\r\n\r\n /**\r\n * Initialize editor\r\n * @param {Object} config - Optional configuration object for programmatic init\r\n */\r\n async init(config = {}) {\r\n // Merge config with existing options\r\n if (config && Object.keys(config).length > 0) {\r\n Object.assign(this.options, config);\r\n if (config.projectName) {\r\n this.config.title = config.projectName;\r\n }\r\n }\r\n \r\n // Initialize preview\r\n const previewInit = await this.previewController.init();\r\n if (!previewInit) {\r\n console.error('Failed to initialize preview controller');\r\n showToast('Failed to initialize preview', 'error');\r\n return false;\r\n }\r\n \r\n // Setup event listeners\r\n this.setupEventListeners();\r\n \r\n // Load saved project if exists (but only if it has valid data)\r\n if (this.storageManager.hasProject()) {\r\n try {\r\n const projectData = this.storageManager.loadProject();\r\n if (projectData && projectData.scenes && projectData.scenes.length > 0) {\r\n this.loadProject();\r\n } else {\r\n // Invalid or empty project, clear it\r\n console.error('Invalid or empty project data, clearing storage');\r\n this.storageManager.clearProject();\r\n }\r\n } catch (error) {\r\n console.error('Error loading saved project:', error);\r\n this.storageManager.clearProject();\r\n }\r\n }\r\n \r\n // Start auto-save if enabled\r\n if (this.options.autoSave) {\r\n this.storageManager.startAutoSave(() => {\r\n this.saveProject();\r\n }, this.options.autoSaveInterval);\r\n }\r\n \r\n // Initial render (only if no project was loaded)\r\n if (this.sceneManager.getScenes().length === 0) {\r\n this.render();\r\n }\r\n \r\n showToast('Editor ready', 'success');\r\n \r\n return true;\r\n }\r\n\r\n /**\r\n * Setup event listeners\r\n */\r\n setupEventListeners() {\r\n if (this.listenersSetup) {\r\n return;\r\n }\r\n\r\n const addSceneBtns = document.querySelectorAll('#addSceneBtn');\r\n const sceneUploads = document.querySelectorAll('#sceneUpload');\r\n const importBtns = document.querySelectorAll('#importBtn');\r\n const importUploads = document.querySelectorAll('#importUpload');\r\n if (addSceneBtns.length > 1 || sceneUploads.length > 1 || importBtns.length > 1 || importUploads.length > 1) {\r\n console.error('Duplicate IDs found in DOM. This will cause double-trigger issues.');\r\n }\r\n \r\n // Toolbar buttons\r\n document.getElementById('newBtn')?.addEventListener('click', () => this.newProject());\r\n document.getElementById('saveBtn')?.addEventListener('click', () => this.saveProject());\r\n document.getElementById('exportBtn')?.addEventListener('click', () => this.exportManager.showExportPreview());\r\n document.getElementById('importBtn')?.addEventListener('click', () => this.importProject());\r\n document.getElementById('helpBtn')?.addEventListener('click', () => showModal('helpModal'));\r\n\r\n document.getElementById('addSceneBtn')?.addEventListener('click', () => {\r\n const sceneUpload = document.getElementById('sceneUpload');\r\n if (sceneUpload) {\r\n sceneUpload.click();\r\n }\r\n });\r\n \r\n document.getElementById('sceneUpload')?.addEventListener('change', (e) => {\r\n if (e.target.files && e.target.files.length > 0) {\r\n this.handleSceneUpload(e.target.files);\r\n setTimeout(() => {\r\n e.target.value = '';\r\n }, 100);\r\n }\r\n });\r\n\r\n document.getElementById('addHotspotBtn')?.addEventListener('click', () => {\r\n this.hotspotEditor.enablePlacementMode();\r\n });\r\n \r\n document.getElementById('clearHotspotsBtn')?.addEventListener('click', () => {\r\n if (this.hotspotEditor.clearAllHotspots()) {\r\n this.render();\r\n }\r\n });\r\n\r\n // Properties tabs\r\n document.querySelectorAll('.tab-btn').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n this.uiController.switchTab(btn.dataset.tab);\r\n });\r\n });\r\n\r\n document.getElementById('hotspotTitle')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentHotspot('title', e.target.value);\r\n }, 300));\r\n \r\n document.getElementById('hotspotDescription')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentHotspot('description', e.target.value);\r\n }, 300));\r\n \r\n document.getElementById('hotspotTarget')?.addEventListener('change', (e) => {\r\n this.updateCurrentHotspot('targetSceneId', e.target.value);\r\n });\r\n \r\n document.getElementById('hotspotColor')?.addEventListener('input', (e) => {\r\n this.updateCurrentHotspot('color', e.target.value);\r\n });\r\n\r\n document.getElementById('hotspotPosX')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentHotspotPosition('x', parseFloat(e.target.value) || 0);\r\n }, 300));\r\n \r\n document.getElementById('hotspotPosY')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentHotspotPosition('y', parseFloat(e.target.value) || 0);\r\n }, 300));\r\n \r\n document.getElementById('hotspotPosZ')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentHotspotPosition('z', parseFloat(e.target.value) || 0);\r\n }, 300));\r\n\r\n document.getElementById('sceneId')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentScene('id', sanitizeId(e.target.value));\r\n }, 300));\r\n \r\n document.getElementById('sceneName')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentScene('name', e.target.value);\r\n }, 300));\r\n \r\n document.getElementById('sceneImageUrl')?.addEventListener('input', debounce((e) => {\r\n this.updateCurrentSceneImage(e.target.value);\r\n }, 300));\r\n\r\n document.getElementById('tourTitle')?.addEventListener('input', debounce((e) => {\r\n this.config.title = e.target.value;\r\n this.markUnsavedChanges();\r\n const projectName = document.getElementById('project-name');\r\n if (projectName && projectName.value !== e.target.value) {\r\n projectName.value = e.target.value;\r\n }\r\n }, 300));\r\n \r\n document.getElementById('project-name')?.addEventListener('input', debounce((e) => {\r\n this.config.title = e.target.value;\r\n this.markUnsavedChanges();\r\n const tourTitle = document.getElementById('tourTitle');\r\n if (tourTitle && tourTitle.value !== e.target.value) {\r\n tourTitle.value = e.target.value;\r\n }\r\n }, 300));\r\n \r\n document.getElementById('tourDescription')?.addEventListener('input', debounce((e) => {\r\n this.config.description = e.target.value;\r\n this.markUnsavedChanges();\r\n }, 300));\r\n \r\n document.getElementById('tourInitialScene')?.addEventListener('change', (e) => {\r\n this.config.initialSceneId = e.target.value;\r\n this.markUnsavedChanges();\r\n });\r\n \r\n document.getElementById('tourAutoRotate')?.addEventListener('change', (e) => {\r\n this.config.autoRotate = e.target.checked;\r\n this.markUnsavedChanges();\r\n });\r\n \r\n document.getElementById('tourShowCompass')?.addEventListener('change', (e) => {\r\n this.config.showCompass = e.target.checked;\r\n this.markUnsavedChanges();\r\n });\r\n\r\n document.getElementById('exportJsonBtn')?.addEventListener('click', () => {\r\n this.exportManager.exportJSON();\r\n });\r\n \r\n document.getElementById('copyJsonBtn')?.addEventListener('click', () => {\r\n this.exportManager.copyJSON();\r\n });\r\n \r\n document.getElementById('exportViewerBtn')?.addEventListener('click', () => {\r\n this.exportManager.exportViewerHTML();\r\n });\r\n\r\n document.querySelectorAll('.modal-close').forEach(btn => {\r\n btn.addEventListener('click', () => {\r\n const modal = btn.closest('.modal');\r\n if (modal) {\r\n hideModal(modal.id);\r\n }\r\n });\r\n });\r\n\r\n document.getElementById('importUpload')?.addEventListener('change', (e) => {\r\n if (e.target.files && e.target.files.length > 0) {\r\n this.handleImportFile(e.target.files[0]);\r\n setTimeout(() => {\r\n e.target.value = '';\r\n }, 100);\r\n }\r\n });\r\n\r\n window.addEventListener('beforeunload', (e) => {\r\n if (this.hasUnsavedChanges) {\r\n e.preventDefault();\r\n e.returnValue = '';\r\n }\r\n });\r\n \r\n this.listenersSetup = true;\r\n }\r\n\r\n /**\r\n * Handle scene upload\r\n */\r\n async handleSceneUpload(files) {\r\n if (!files || files.length === 0) {\r\n return;\r\n }\r\n\r\n this.uiController.setLoading(true);\r\n\r\n for (const file of files) {\r\n if (!file.type.startsWith('image/')) {\r\n showToast(`${file.name} is not an image`, 'error');\r\n continue;\r\n }\r\n\r\n const scene = await this.sceneManager.addScene(file);\r\n }\r\n this.uiController.setLoading(false);\r\n this.render();\r\n this.markUnsavedChanges();\r\n }\r\n\r\n /**\r\n * Add hotspot at position\r\n */\r\n addHotspotAtPosition(position) {\r\n const distance = Math.sqrt(position.x * position.x + position.y * position.y + position.z * position.z);\r\n if (distance > 5) {\r\n const scale = 5 / distance;\r\n position.x *= scale;\r\n position.y *= scale;\r\n position.z *= scale;\r\n position.x = parseFloat(position.x.toFixed(2));\r\n position.y = parseFloat(position.y.toFixed(2));\r\n position.z = parseFloat(position.z.toFixed(2));\r\n }\r\n const hotspot = this.hotspotEditor.addHotspot(position);\r\n if (hotspot) {\r\n this.lastRenderedSceneIndex = -1;\r\n this.render();\r\n this.markUnsavedChanges();\r\n } else {\r\n console.error('Failed to add hotspot');\r\n }\r\n }\r\n\r\n /**\r\n * Select scene by index\r\n */\r\n selectScene(index) {\r\n if (this.sceneManager.setCurrentScene(index)) {\r\n this.lastRenderedSceneIndex = -1;\r\n this.hotspotEditor.currentHotspotIndex = -1;\r\n \r\n const scene = this.sceneManager.getCurrentScene();\r\n if (scene) {\r\n this.previewController.loadScene(scene, false);\r\n this.lastRenderedSceneIndex = index;\r\n }\r\n \r\n this.uiController.renderSceneList();\r\n this.uiController.updateSceneProperties(scene);\r\n this.uiController.renderHotspotList();\r\n this.uiController.updateHotspotProperties(null);\r\n this.uiController.updateInitialSceneOptions();\r\n this.uiController.updateTargetSceneOptions();\r\n }\r\n }\r\n\r\n /**\r\n * Select hotspot by index\r\n */\r\n selectHotspot(index) {\r\n if (this.hotspotEditor.setCurrentHotspot(index)) {\r\n const hotspot = this.hotspotEditor.getHotspot(index);\r\n \r\n this.uiController.renderHotspotList();\r\n this.uiController.updateHotspotProperties(hotspot);\r\n this.uiController.updateTargetSceneOptions();\r\n this.uiController.switchTab('hotspot');\r\n \r\n if (hotspot && hotspot.position) {\r\n this.previewController.pointCameraToHotspot(hotspot.position);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove scene\r\n */\r\n removeScene(index) {\r\n if (this.sceneManager.removeScene(index)) {\r\n this.render();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Remove hotspot\r\n */\r\n removeHotspot(index) {\r\n if (this.hotspotEditor.removeHotspot(index)) {\r\n this.lastRenderedSceneIndex = -1;\r\n this.render();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Duplicate hotspot\r\n */\r\n duplicateHotspot(index) {\r\n const hotspot = this.hotspotEditor.duplicateHotspot(index);\r\n if (hotspot) {\r\n this.lastRenderedSceneIndex = -1;\r\n this.render();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Reorder scenes\r\n */\r\n reorderScenes(fromIndex, toIndex) {\r\n if (this.sceneManager.reorderScenes(fromIndex, toIndex)) {\r\n this.render();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Update current hotspot property\r\n */\r\n async updateCurrentHotspot(property, value) {\r\n const index = this.hotspotEditor.currentHotspotIndex;\r\n if (this.hotspotEditor.updateHotspot(index, property, value)) {\r\n await this.previewController.updateHotspotMarker(index);\r\n this.uiController.renderHotspotList();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Update current hotspot position (X, Y, or Z)\r\n */\r\n async updateCurrentHotspotPosition(axis, value) {\r\n const index = this.hotspotEditor.currentHotspotIndex;\r\n const hotspot = this.hotspotEditor.getHotspot(index);\r\n \r\n if (hotspot) {\r\n if (!hotspot.position) {\r\n hotspot.position = { x: 0, y: 0, z: 0 };\r\n }\r\n \r\n hotspot.position[axis] = value;\r\n \r\n const pos = hotspot.position;\r\n const distance = Math.sqrt(pos.x * pos.x + pos.y * pos.y + pos.z * pos.z);\r\n if (distance > 10) {\r\n const scale = 10 / distance;\r\n pos.x *= scale;\r\n pos.y *= scale;\r\n pos.z *= scale;\r\n \r\n document.getElementById(`hotspotPos${axis.toUpperCase()}`).value = pos[axis].toFixed(2);\r\n showToast('Position clamped to 10-unit radius', 'info');\r\n }\r\n \r\n await this.previewController.updateHotspotMarker(index);\r\n this.uiController.renderHotspotList();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Update current scene property\r\n */\r\n updateCurrentScene(property, value) {\r\n const index = this.sceneManager.currentSceneIndex;\r\n if (this.sceneManager.updateScene(index, property, value)) {\r\n this.uiController.renderSceneList();\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Update current scene image URL\r\n */\r\n async updateCurrentSceneImage(imageUrl) {\r\n const index = this.sceneManager.currentSceneIndex;\r\n if (index < 0) return;\r\n \r\n if (this.sceneManager.updateScene(index, 'imageUrl', imageUrl)) {\r\n const scene = this.sceneManager.getCurrentScene();\r\n if (scene) {\r\n scene.thumbnail = imageUrl;\r\n }\r\n \r\n this.uiController.renderSceneList();\r\n this.lastRenderedSceneIndex = -1;\r\n \r\n if (scene) {\r\n await this.previewController.loadScene(scene);\r\n this.lastRenderedSceneIndex = index;\r\n showToast('Scene image updated', 'success');\r\n }\r\n this.markUnsavedChanges();\r\n }\r\n }\r\n\r\n /**\r\n * Render all UI\r\n */\r\n render() {\r\n this.uiController.renderSceneList();\r\n this.uiController.renderHotspotList();\r\n \r\n const currentScene = this.sceneManager.getCurrentScene();\r\n const currentHotspot = this.hotspotEditor.getCurrentHotspot();\r\n \r\n this.uiController.updateSceneProperties(currentScene);\r\n this.uiController.updateHotspotProperties(currentHotspot);\r\n this.uiController.updateTourProperties(this.config);\r\n this.uiController.updateInitialSceneOptions();\r\n this.uiController.updateTargetSceneOptions();\r\n \r\n if (currentScene) {\r\n const emptyState = document.querySelector('.preview-empty');\r\n if (emptyState) {\r\n emptyState.style.display = 'none';\r\n }\r\n \r\n const currentSceneIndex = this.sceneManager.currentSceneIndex;\r\n if (currentSceneIndex !== this.lastRenderedSceneIndex) {\r\n this.previewController.loadScene(currentScene);\r\n this.lastRenderedSceneIndex = currentSceneIndex;\r\n }\r\n \r\n if (currentHotspot) {\r\n this.previewController.highlightHotspot(this.hotspotEditor.currentHotspotIndex);\r\n }\r\n } else {\r\n const emptyState = document.querySelector('.preview-empty');\r\n if (emptyState) {\r\n emptyState.style.display = 'flex';\r\n }\r\n this.lastRenderedSceneIndex = -1;\r\n }\r\n }\r\n\r\n /**\r\n * Save project\r\n */\r\n saveProject() {\r\n const projectData = {\r\n config: this.config,\r\n scenes: this.sceneManager.getAllScenes()\r\n };\r\n\r\n if (this.storageManager.saveProject(projectData)) {\r\n this.hasUnsavedChanges = false;\r\n showToast('Project saved', 'success');\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Load project\r\n */\r\n loadProject() {\r\n const projectData = this.storageManager.loadProject();\r\n if (projectData) {\r\n this.config = projectData.config || this.config;\r\n this.sceneManager.loadScenes(projectData.scenes || []);\r\n this.hasUnsavedChanges = false;\r\n this.render();\r\n showToast('Project loaded', 'success');\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * New project\r\n */\r\n newProject() {\r\n if (this.hasUnsavedChanges) {\r\n if (!confirm('You have unsaved changes. Create new project?')) {\r\n return false;\r\n }\r\n }\r\n\r\n this.config = {\r\n title: 'My Virtual Tour',\r\n description: '',\r\n initialSceneId: '',\r\n autoRotate: false,\r\n showCompass: false\r\n };\r\n \r\n this.sceneManager.clearScenes();\r\n this.hasUnsavedChanges = false;\r\n this.render();\r\n \r\n showToast('New project created', 'success');\r\n return true;\r\n }\r\n\r\n /**\r\n * Import project\r\n */\r\n importProject() {\r\nconst importUpload = document.getElementById('importUpload');\r\n if (importUpload) {\r\n importUpload.click();\r\n }\r\n }\r\n\r\n /**\r\n * Handle import file\r\n */\r\n async handleImportFile(file) {\r\n try {\r\n this.uiController.setLoading(true);\r\n \r\n const projectData = await this.storageManager.importFromFile(file);\r\n \r\n this.config = projectData.config || projectData;\r\n this.sceneManager.loadScenes(projectData.scenes || []);\r\n this.hasUnsavedChanges = true;\r\n \r\n this.render();\r\n this.uiController.setLoading(false);\r\n \r\n showToast('Project imported successfully', 'success');\r\n } catch (error) {\r\n this.uiController.setLoading(false);\r\n console.error('Import failed:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Mark unsaved changes\r\n */\r\n markUnsavedChanges() {\r\n this.hasUnsavedChanges = true;\r\n }\r\n}\r\n\r\n// Initialize editor when DOM is ready\r\ndocument.addEventListener('DOMContentLoaded', async () => {\r\n if (document.querySelector('[data-swt-editor]')) {\r\n // Declarative initialization will handle it\r\n return;\r\n }\r\n window.editor = new TourEditor();\r\n await window.editor.init();\r\n});\r\n\r\nexport default TourEditor;\r\n","// UI Initialization - Handles color picker sync, keyboard shortcuts, tab switching, and declarative init\r\n\r\n/**\r\n * Initialize editor from declarative HTML attributes\r\n */\r\nfunction initDeclarativeEditor() {\r\n const editorElement = document.querySelector(\"[data-swt-editor]\");\r\n\r\n if (!editorElement) {\r\n return null; // No declarative editor found\r\n }\r\n\r\n // Check if auto-init is enabled\r\n const autoInit = editorElement.getAttribute(\"data-swt-auto-init\");\r\n if (autoInit !== \"true\") {\r\n return null; // Auto-init disabled\r\n }\r\n\r\n // Find required elements by data attributes\r\n const sceneListElement = editorElement.querySelector(\"[data-swt-scene-list]\");\r\n const previewElement = editorElement.querySelector(\"[data-swt-preview-area]\");\r\n const propertiesElement = editorElement.querySelector(\r\n \"[data-swt-properties-panel]\"\r\n );\r\n\r\n // Get optional configuration from attributes\r\n const projectName =\r\n editorElement.getAttribute(\"data-swt-project-name\") || \"My Virtual Tour\";\r\n const autoSave = editorElement.getAttribute(\"data-swt-auto-save\") === \"true\";\r\n const autoSaveInterval =\r\n parseInt(editorElement.getAttribute(\"data-swt-auto-save-interval\")) ||\r\n 30000;\r\n\r\n // Create and initialize editor\r\n const editor = new TourEditor({\r\n projectName,\r\n autoSave,\r\n autoSaveInterval,\r\n });\r\n\r\n // Store element references for controllers\r\n if (sceneListElement) editor.options.sceneListElement = sceneListElement;\r\n if (previewElement) editor.options.previewElement = previewElement;\r\n if (propertiesElement) editor.options.propertiesElement = propertiesElement;\r\n\r\n editor.init().catch((err) => {\r\n console.error(\"Failed to initialize declarative editor:\", err);\r\n });\r\n\r\n return editor;\r\n}\r\n\r\nwindow.addEventListener(\"DOMContentLoaded\", () => {\r\n // Try declarative initialization first\r\n const declarativeEditor = initDeclarativeEditor();\r\n\r\n if (declarativeEditor) {\r\n // Store editor instance globally for declarative mode\r\n window.editor = declarativeEditor;\r\n }\r\n\r\n // Setup color picker sync\r\n const colorPicker = document.getElementById(\"hotspotColor\");\r\n const colorText = document.getElementById(\"hotspotColorText\");\r\n\r\n if (colorPicker && colorText) {\r\n colorPicker.addEventListener(\"input\", (e) => {\r\n colorText.value = e.target.value;\r\n });\r\n\r\n colorText.addEventListener(\"input\", (e) => {\r\n if (/^#[0-9A-F]{6}$/i.test(e.target.value)) {\r\n colorPicker.value = e.target.value;\r\n }\r\n });\r\n }\r\n\r\n // Keyboard shortcuts\r\n document.addEventListener(\"keydown\", (e) => {\r\n // Ctrl/Cmd + S to save\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"s\") {\r\n e.preventDefault();\r\n if (window.editor) window.editor.saveProject();\r\n }\r\n\r\n // Ctrl/Cmd + E to export\r\n if ((e.ctrlKey || e.metaKey) && e.key === \"e\") {\r\n e.preventDefault();\r\n if (window.editor) window.editor.exportManager.showExportPreview();\r\n }\r\n\r\n // ESC to close modals\r\n if (e.key === \"Escape\") {\r\n document.querySelectorAll(\".modal.show\").forEach((modal) => {\r\n modal.classList.remove(\"show\");\r\n });\r\n }\r\n });\r\n\r\n // Preview button - just focuses on the preview area\r\n const previewBtn = document.getElementById(\"previewBtn\");\r\n if (previewBtn) {\r\n previewBtn.addEventListener(\"click\", () => {\r\n const preview = document.getElementById(\"preview\");\r\n const canvas = document.getElementById(\"canvasArea\");\r\n if (preview && canvas) {\r\n canvas.classList.toggle(\"preview-active\");\r\n // refresh preview\r\n if (window.editor && window.editor.previewController) {\r\n window.editor.previewController.refresh();\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Modal background click to close\r\n document.querySelectorAll(\".modal\").forEach((modal) => {\r\n modal.addEventListener(\"click\", (e) => {\r\n if (e.target === modal) {\r\n modal.classList.remove(\"show\");\r\n }\r\n });\r\n });\r\n\r\n // Tab switching functionality\r\n const tabs = document.querySelectorAll(\".tab\");\r\n const tabContents = document.querySelectorAll(\".tab-content\");\r\n\r\n tabs.forEach((tab) => {\r\n tab.addEventListener(\"click\", () => {\r\n const targetTab = tab.dataset.tab;\r\n\r\n // Update tab buttons\r\n tabs.forEach((t) => t.classList.remove(\"active\"));\r\n tab.classList.add(\"active\");\r\n\r\n // Update tab content\r\n tabContents.forEach((content) => {\r\n content.style.display = \"none\";\r\n });\r\n\r\n const targetContent = document.getElementById(targetTab + \"Tab\");\r\n if (targetContent) {\r\n targetContent.style.display = \"block\";\r\n }\r\n\r\n // Update panel title (if exists)\r\n const panelTitle = document.getElementById(\"panelTitle\");\r\n if (panelTitle) {\r\n switch (targetTab) {\r\n case \"scene\":\r\n panelTitle.textContent = \"Scene Properties\";\r\n break;\r\n case \"hotspot\":\r\n panelTitle.textContent = \"Hotspot Properties\";\r\n break;\r\n case \"tour\":\r\n panelTitle.textContent = \"Tour Settings\";\r\n break;\r\n }\r\n }\r\n });\r\n });\r\n});\r\n","// SenangWebs Tour Editor - Entry Point\r\n// This file bundles all editor modules for distribution\r\n\r\n// Import utility functions and make them global\r\nimport * as utils from './js/utils.js';\r\nObject.assign(window, utils);\r\n\r\n// Import classes\r\nimport ProjectStorageManager from './js/storage-manager.js';\r\nimport SceneManagerEditor from './js/scene-manager.js';\r\nimport HotspotEditor from './js/hotspot-editor.js';\r\nimport PreviewController from './js/preview-controller.js';\r\nimport UIController from './js/ui-controller.js';\r\nimport ExportManager from './js/export-manager.js';\r\nimport TourEditor from './js/editor.js';\r\n\r\n// Attach classes to window for global access\r\nwindow.ProjectStorageManager = ProjectStorageManager;\r\nwindow.SceneManagerEditor = SceneManagerEditor;\r\nwindow.HotspotEditor = HotspotEditor;\r\nwindow.PreviewController = PreviewController;\r\nwindow.UIController = UIController;\r\nwindow.ExportManager = ExportManager;\r\nwindow.TourEditor = TourEditor;\r\n\r\n// Import and execute UI initialization\r\nimport './js/ui-init.js';\r\n\r\n// Export main editor class for potential programmatic use\r\nexport default TourEditor;\r\n"],"names":["sanitizeId","showToast","hideModal","deepClone","TourEditor","ProjectStorageManager","SceneManagerEditor","HotspotEditor","PreviewController","UIController","ExportManager"],"mappings":"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EAAE,CAAC,CAAC,CAAC;IAC3D;IACA,YAAY,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IACxD,YAAY,IAAI,OAAO,EAAE;IACzB,gBAAgB,SAAS,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;IACjE,YAAY,CAAC,MAAM;IACnB,gBAAgB,SAAS,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IAClE,YAAY,CAAC;IACb,YAAY,OAAO,OAAO,CAAC;IAC3B,QAAQ,CAAC,CAAC,OAAO,KAAK,EAAE;IACxB,YAAY,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACjD,YAAY,SAAS,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC9C,YAAY,OAAO,KAAK,CAAC;IACzB,QAAQ,CAAC;IACT,IAAI,CAAC;AACL;IACA;IACA;IACA;IACA,IAAI,kBAAkB,GAAG;IACzB,QAAQ,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7C;IACA,QAAQ,OAAO,CAAC;AAChB;AACA;AACA;AACA;AACA,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*{box-sizing:border-box;margin:0;padding:0}:root{--bg-primary:#09090b;--bg-secondary:#18181b;--bg-tertiary:#1f1f22;--bg-hover:#232426;--border-color:#2a2a2d;--text-primary:#fff;--text-secondary:#a7cfc6;--text-muted:#7a8086;--accent-primary:#0f9;--accent-hover:#00d882;--accent-cyan:#00d1e6;--success:#006045;--danger:#ef4444;--warning:#f59e0b}body{background:var(--bg-primary);color:var(--text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;height:100vh;overflow:hidden}.editor-header{background:var(--bg-secondary);border-bottom:1px solid var(--border-color);height:60px;justify-content:space-between;padding:12px 20px}.editor-header,.header-left{align-items:center;display:flex}.header-left{gap:16px}.logo{align-items:center;display:flex;font-size:18px;font-weight:600;gap:8px}.logo-icon{background:linear-gradient(135deg,var(--accent-primary),var(--accent-cyan));border-radius:4px;height:24px;width:24px}.project-info{align-items:center;border-left:1px solid var(--border-color);display:flex;gap:8px;padding-left:16px}.project-label{color:var(--text-muted);font-size:12px;letter-spacing:.5px;text-transform:uppercase}.project-name{color:var(--text-primary);font-size:14px;font-weight:500}.header-actions{gap:8px}.btn,.header-actions{align-items:center;display:flex}.btn{border:none;border-radius:6px;cursor:pointer;font-size:14px;font-weight:500;gap:6px;padding:8px 16px;transition:all .2s}.btn-secondary{background:var(--bg-tertiary);border:1px solid var(--border-color);color:var(--text-primary)}.btn-secondary:hover{background:var(--bg-hover)}.btn-primary{background:var(--accent-primary);color:var(--bg-primary)}.btn-primary:hover{background:var(--accent-hover)}.btn-success{background:var(--success);color:#fff}.btn-success:hover{opacity:.9}.btn-icon{height:16px;width:16px}.editor-main{display:flex;height:calc(100vh - 60px);position:relative}.sidebar{background:var(--bg-secondary);border-right:1px solid var(--border-color);display:flex;flex-direction:column;width:280px}.sidebar-header{align-items:center;border-bottom:1px solid var(--border-color);display:flex;justify-content:space-between;padding:12px 16px}.sidebar-title{color:var(--text-secondary);font-size:14px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.btn-add{align-items:center;background:var(--accent-primary);border:none;border-radius:6px;color:var(--bg-primary);cursor:pointer;display:flex;font-size:14px;font-weight:500;gap:6px;padding:8px 16px;transition:all .2s}.btn-add:hover{background:var(--accent-hover)}.scenes-list{flex:1;overflow-y:auto;padding:12px}.scene-card{background:var(--bg-tertiary);border:2px solid transparent;border-radius:8px;cursor:pointer;margin-bottom:12px;overflow:hidden;position:relative;transition:all .2s}.scene-card img{aspect-ratio:2/1;object-fit:cover;width:100%}.scene-card:hover{border-color:var(--border-color)}.scene-card.active{background:rgba(59,130,246,.1);border-color:var(--accent-primary)}.scene-thumbnail{background:var(--bg-primary);border-radius:4px;height:120px;margin-bottom:8px;overflow:hidden;position:relative;width:100%}.scene-thumbnail img{height:100%;object-fit:cover;width:100%}.scene-info{display:flex;flex-direction:column;gap:4px;margin:6px 8px}.scene-name{color:var(--text-primary);font-size:14px;font-weight:500}.scene-meta{color:var(--text-muted);font-size:12px}.scene-actions{display:flex;gap:4px;margin:6px 8px}.btn-icon-small{background:var(--bg-hover);border:1px solid var(--border-color);border-radius:4px;color:var(--text-secondary);cursor:pointer;font-size:11px;padding:4px 8px;transition:all .2s}.btn-icon-small:hover{background:var(--bg-tertiary);color:var(--text-primary)}.btn-icon{background:transparent;border:1px solid var(--border-color);border-radius:4px;color:var(--text-secondary);cursor:pointer;font-size:12px;height:32px;transition:all .2s;width:32px}.btn-icon:hover{background:var(--danger);border-color:var(--danger);color:#fff}.drag-handle{fill:var(--text-secondary);align-items:center;background:rgba(0,0,0,.75);border-radius:4px;cursor:move;display:flex;height:32px;justify-content:center;padding:8px;position:absolute;right:8px;top:8px;width:32px;z-index:10}.canvas-area{background:var(--bg-primary);display:flex;flex:1;flex-direction:column}.canvas-area.preview-active{height:100%;left:0;position:absolute;top:0;width:100vw;z-index:100}.toolbar{align-items:center;background:var(--bg-secondary);border-bottom:1px solid var(--border-color);display:flex;justify-content:center;padding:12px 16px}.toolbar-tabs{display:flex;gap:4px;justify-content:space-evenly;width:100%}.tab{background:transparent;border:none;border-radius:6px;color:var(--text-secondary);cursor:pointer;font-size:14px;font-weight:500;padding:8px 16px;transition:all .2s}.tab:hover{background:var(--bg-tertiary);color:var(--text-primary)}.tab.active{background:var(--accent-primary);color:var(--bg-primary)}.toolbar-controls,.zoom-control{align-items:center;display:flex;gap:8px}.zoom-control{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;padding:4px 12px}.zoom-btn{background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:16px;padding:4px;transition:color .2s}.zoom-btn:hover{color:var(--text-primary)}.zoom-value{color:var(--text-secondary);font-size:12px;min-width:40px;text-align:center}.canvas-container{align-items:center;display:flex;flex:1;justify-content:center;overflow:hidden;padding:20px;position:relative}.preview-container{flex:1}.preview-area,.preview-container{height:100%;position:relative;width:100%}#preview{height:100%;width:100%}.preview-empty{align-items:center;color:var(--text-muted);display:flex;flex-direction:column;height:100%;justify-content:center}.preview-empty p{margin:4px 0}.canvas-viewport{aspect-ratio:16/9;background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;max-width:1200px;overflow:hidden;position:relative;width:100%}.canvas-viewport img{height:100%;object-fit:cover;width:100%}.hotspot-marker{border:3px solid #fff;border-radius:50%;box-shadow:0 2px 8px rgba(0,0,0,.3);cursor:pointer;height:40px;position:absolute;transition:all .2s;width:40px}.hotspot-marker:hover{box-shadow:0 4px 12px rgba(0,0,0,.5);transform:scale(1.2)}.hotspot-marker.selected{border-width:4px;box-shadow:0 0 0 4px hsla(0,0%,100%,.3)}.empty-state{color:var(--text-muted);padding:40px 20px;text-align:center}.empty-state p{margin:8px 0}.empty-state .hint{color:var(--text-muted);font-size:12px}.properties-panel{background:var(--bg-secondary);border-left:1px solid var(--border-color);display:flex;flex-direction:column;width:320px}.panel-header{border-bottom:1px solid var(--border-color);padding:16px}.panel-title{color:var(--text-secondary);font-size:14px;font-weight:600;letter-spacing:.5px;text-transform:uppercase}.panel-content{flex:1;overflow-y:auto;padding:16px}.form-group{margin-bottom:20px}.form-label{color:var(--text-secondary);display:block;font-size:12px;font-weight:500;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.form-input{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-size:14px;padding:10px 12px;transition:all .2s;width:100%}.form-input:focus{background:var(--bg-primary);border-color:var(--accent-primary);outline:none}.form-textarea{font-family:inherit;min-height:80px;resize:vertical}.form-select{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);cursor:pointer;font-size:14px;padding:10px 12px;width:100%}.form-checkbox{align-items:center;cursor:pointer;display:flex;gap:8px}.form-checkbox input{cursor:pointer;height:18px;width:18px}.form-checkbox label{color:var(--text-primary);cursor:pointer;font-size:14px}.color-picker-group{align-items:center;display:flex;gap:12px}.color-preview{border:2px solid var(--border-color);border-radius:6px;cursor:pointer;height:40px;width:40px}.color-input{flex:1}.position-grid{display:grid;gap:8px;grid-template-columns:repeat(3,1fr)}.position-input{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;color:var(--text-primary);font-size:12px;padding:8px;text-align:center}.hotspot-controls{display:flex;gap:8px;justify-content:space-between;margin-bottom:20px}.hotspot-list{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}.hotspot-item{align-items:center;background:var(--bg-tertiary);border:2px solid transparent;border-radius:6px;cursor:pointer;display:flex;gap:12px;padding:12px;transition:all .2s}.hotspot-item:hover{border-color:var(--border-color)}.hotspot-item.active{background:rgba(59,130,246,.1);border-color:var(--accent-primary)}.hotspot-color{border:2px solid var(--border-color);border-radius:4px;flex-shrink:0;height:24px;width:24px}.hotspot-info{flex:1;min-width:0}.hotspot-title{color:var(--text-primary);font-size:14px;font-weight:500}.hotspot-target,.hotspot-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hotspot-target{color:var(--text-muted);font-size:12px}.hotspot-actions{display:flex;gap:4px}.btn-delete{background:transparent;border:1px solid var(--border-color);border-radius:4px;color:var(--danger);cursor:pointer;font-size:12px;padding:4px 8px;transition:all .2s}.btn-delete:hover{background:var(--danger);color:#fff}.section{margin-bottom:20px}.section h3{color:var(--text-secondary);font-size:14px;font-weight:600;letter-spacing:.5px;margin-bottom:16px;text-transform:uppercase}.btn-block{width:100%}.toast{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:8px;bottom:20px;box-shadow:0 4px 12px rgba(0,0,0,.3);color:var(--text-primary);opacity:0;padding:12px 20px;pointer-events:none;position:fixed;right:20px;transform:translateY(20px);transition:all .3s;z-index:10000}.toast.show{opacity:1;pointer-events:auto;transform:translateY(0)}.toast.success{background:rgba(16,185,129,.1);border-color:var(--success)}.toast.error{background:rgba(239,68,68,.1);border-color:var(--danger)}.toast.info{background:rgba(6,182,212,.1);border-color:var(--accent-cyan)}.modal{align-items:center;background:rgba(0,0,0,.7);display:none;height:100%;justify-content:center;left:0;position:fixed;top:0;width:100%;z-index:9999}.modal.show{display:flex}.modal-content{background:var(--bg-secondary);border:1px solid var(--border-color);border-radius:12px;display:flex;flex-direction:column;max-height:90vh;max-width:600px;overflow:hidden;width:90%}.modal-header{align-items:center;border-bottom:1px solid var(--border-color);display:flex;justify-content:space-between;padding:20px}.modal-header h3{color:var(--text-primary);font-size:18px;font-weight:600}.modal-close{align-items:center;background:none;border:none;border-radius:4px;color:var(--text-secondary);cursor:pointer;display:flex;font-size:24px;height:32px;justify-content:center;padding:0;transition:all .2s;width:32px}.modal-close:hover{background:var(--bg-hover);color:var(--text-primary)}.modal-body{flex:1;overflow-y:auto;padding:20px}.modal-body h4{color:var(--text-primary);font-size:16px;font-weight:600;margin-bottom:12px;margin-top:20px}.modal-body h4:first-child{margin-top:0}.modal-body p{line-height:1.6}.modal-body ol,.modal-body p,.modal-body ul{color:var(--text-secondary);margin-bottom:12px}.modal-body ol,.modal-body ul{line-height:1.8;padding-left:24px}.modal-body li{margin-bottom:8px}.modal-body kbd{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:4px;font-family:monospace;font-size:12px;padding:2px 6px}.modal-footer{border-top:1px solid var(--border-color);display:flex;gap:8px;justify-content:flex-end;padding:16px 20px}.export-info{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;margin-bottom:16px;padding:16px}.export-info p{font-size:13px;margin-bottom:8px}.export-info p:last-child{margin-bottom:0}.export-preview{background:var(--bg-tertiary);border:1px solid var(--border-color);border-radius:6px;color:var(--text-primary);font-family:monospace;font-size:12px;height:200px;padding:12px;resize:vertical;width:100%}.btn-active{animation:pulse 2s infinite}@keyframes pulse{0%,to{opacity:1}50%{opacity:.7}}.dragging{opacity:.5}::-webkit-scrollbar{height:8px;width:8px}::-webkit-scrollbar-track{background:var(--bg-primary)}::-webkit-scrollbar-thumb{background:var(--bg-tertiary);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--bg-hover)}.preview-loading{align-items:center;backdrop-filter:blur(4px);background:rgba(9,9,11,.85);bottom:0;display:flex;flex-direction:column;justify-content:center;left:0;position:absolute;right:0;top:0;transition:opacity .3s ease;z-index:1000}.preview-loading.hidden{opacity:0;pointer-events:none}.loading-spinner{animation:spin .8s linear infinite;border:3px solid var(--border-color);border-radius:50%;border-top-color:var(--accent-primary);height:48px;width:48px}.loading-text{color:var(--text-secondary);font-size:14px;font-weight:500;margin-top:16px}@keyframes spin{to{transform:rotate(1turn)}}@media (max-width:1024px){.sidebar{width:240px}.properties-panel{width:280px}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(){"use strict";function e(e="id"){return`${e}_${Date.now()}_${Math.random().toString(36).substr(2,9)}`}function t(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")}async function n(e,t=200,n=150){return new Promise((o,r)=>{const s=new FileReader;s.onload=e=>{const s=new Image;s.onload=()=>{const e=document.createElement("canvas"),r=e.getContext("2d");let i=s.width,a=s.height;i>a?i>t&&(a*=t/i,i=t):a>n&&(i*=n/a,a=n),e.width=i,e.height=a,r.drawImage(s,0,0,i,a),o(e.toDataURL("image/jpeg",.7))},s.onerror=r,s.src=e.target.result},s.onerror=r,s.readAsDataURL(e)})}async function o(e){return new Promise((t,n)=>{const o=new FileReader;o.onload=e=>t(e.target.result),o.onerror=n,o.readAsDataURL(e)})}function r(e,t="info",n=3e3){const o=document.getElementById("toast");o.textContent=e,o.className=`toast ${t}`,o.classList.add("show"),setTimeout(()=>{o.classList.remove("show")},n)}function s(e){const t=document.getElementById(e);t&&t.classList.add("show")}function i(e,t){const n=new Blob([e],{type:"text/plain"}),o=URL.createObjectURL(n),r=document.createElement("a");r.href=o,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),URL.revokeObjectURL(o)}function a(e,t){let n;return function(...o){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),e(...o)},t)}}var c=Object.freeze({__proto__:null,debounce:a,deepClone:function(e){return JSON.parse(JSON.stringify(e))},downloadTextAsFile:i,formatFileSize:function(e){if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return Math.round(e/Math.pow(1024,t)*100)/100+" "+["Bytes","KB","MB","GB"][t]},generateId:e,generateThumbnail:n,hideModal:function(e){const t=document.getElementById(e);t&&t.classList.remove("show")},isValidEmail:function(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)},loadImageAsDataUrl:o,parsePosition:function(e){const t=e.split(" ").map(Number);return{x:t[0]||0,y:t[1]||0,z:t[2]||0}},positionToString:function(e){return`${e.x.toFixed(1)} ${e.y.toFixed(1)} ${e.z.toFixed(1)}`},sanitizeId:t,showModal:s,showToast:r});let d=class{constructor(e={}){this.config={title:e.projectName||"My Virtual Tour",description:"",initialSceneId:"",autoRotate:!1,showCompass:!1},this.options={sceneListElement:e.sceneListElement||null,previewElement:e.previewElement||null,propertiesElement:e.propertiesElement||null,autoSave:void 0!==e.autoSave&&e.autoSave,autoSaveInterval:e.autoSaveInterval||3e4,...e},this.storageManager=new ProjectStorageManager,this.sceneManager=new SceneManagerEditor(this),this.hotspotEditor=new HotspotEditor(this),this.previewController=new PreviewController(this),this.uiController=new UIController(this),this.exportManager=new ExportManager(this),this.hasUnsavedChanges=!1,this.lastRenderedSceneIndex=-1,this.listenersSetup=!1}async init(e={}){e&&Object.keys(e).length>0&&(Object.assign(this.options,e),e.projectName&&(this.config.title=e.projectName));if(!await this.previewController.init())return console.error("Failed to initialize preview controller"),showToast("Failed to initialize preview","error"),!1;if(this.setupEventListeners(),this.storageManager.hasProject())try{const e=this.storageManager.loadProject();e&&e.scenes&&e.scenes.length>0?this.loadProject():(console.error("Invalid or empty project data, clearing storage"),this.storageManager.clearProject())}catch(e){console.error("Error loading saved project:",e),this.storageManager.clearProject()}return this.options.autoSave&&this.storageManager.startAutoSave(()=>{this.saveProject()},this.options.autoSaveInterval),0===this.sceneManager.getScenes().length&&this.render(),showToast("Editor ready","success"),!0}setupEventListeners(){if(this.listenersSetup)return;const e=document.querySelectorAll("#addSceneBtn"),t=document.querySelectorAll("#sceneUpload"),n=document.querySelectorAll("#importBtn"),o=document.querySelectorAll("#importUpload");(e.length>1||t.length>1||n.length>1||o.length>1)&&console.error("Duplicate IDs found in DOM. This will cause double-trigger issues."),document.getElementById("newBtn")?.addEventListener("click",()=>this.newProject()),document.getElementById("saveBtn")?.addEventListener("click",()=>this.saveProject()),document.getElementById("exportBtn")?.addEventListener("click",()=>this.exportManager.showExportPreview()),document.getElementById("importBtn")?.addEventListener("click",()=>this.importProject()),document.getElementById("helpBtn")?.addEventListener("click",()=>s("helpModal")),document.getElementById("addSceneBtn")?.addEventListener("click",()=>{const e=document.getElementById("sceneUpload");e&&e.click()}),document.getElementById("sceneUpload")?.addEventListener("change",e=>{e.target.files&&e.target.files.length>0&&(this.handleSceneUpload(e.target.files),setTimeout(()=>{e.target.value=""},100))}),document.getElementById("addHotspotBtn")?.addEventListener("click",()=>{this.hotspotEditor.enablePlacementMode()}),document.getElementById("clearHotspotsBtn")?.addEventListener("click",()=>{this.hotspotEditor.clearAllHotspots()&&this.render()}),document.querySelectorAll(".tab-btn").forEach(e=>{e.addEventListener("click",()=>{this.uiController.switchTab(e.dataset.tab)})}),document.getElementById("hotspotTitle")?.addEventListener("input",a(e=>{this.updateCurrentHotspot("title",e.target.value)},300)),document.getElementById("hotspotDescription")?.addEventListener("input",a(e=>{this.updateCurrentHotspot("description",e.target.value)},300)),document.getElementById("hotspotTarget")?.addEventListener("change",e=>{this.updateCurrentHotspot("targetSceneId",e.target.value)}),document.getElementById("hotspotColor")?.addEventListener("input",e=>{this.updateCurrentHotspot("color",e.target.value)}),document.getElementById("hotspotPosX")?.addEventListener("input",a(e=>{this.updateCurrentHotspotPosition("x",parseFloat(e.target.value)||0)},300)),document.getElementById("hotspotPosY")?.addEventListener("input",a(e=>{this.updateCurrentHotspotPosition("y",parseFloat(e.target.value)||0)},300)),document.getElementById("hotspotPosZ")?.addEventListener("input",a(e=>{this.updateCurrentHotspotPosition("z",parseFloat(e.target.value)||0)},300)),document.getElementById("sceneId")?.addEventListener("input",a(e=>{this.updateCurrentScene("id",sanitizeId(e.target.value))},300)),document.getElementById("sceneName")?.addEventListener("input",a(e=>{this.updateCurrentScene("name",e.target.value)},300)),document.getElementById("sceneImageUrl")?.addEventListener("input",a(e=>{this.updateCurrentSceneImage(e.target.value)},300)),document.getElementById("tourTitle")?.addEventListener("input",a(e=>{this.config.title=e.target.value,this.markUnsavedChanges();const t=document.getElementById("project-name");t&&t.value!==e.target.value&&(t.value=e.target.value)},300)),document.getElementById("project-name")?.addEventListener("input",a(e=>{this.config.title=e.target.value,this.markUnsavedChanges();const t=document.getElementById("tourTitle");t&&t.value!==e.target.value&&(t.value=e.target.value)},300)),document.getElementById("tourDescription")?.addEventListener("input",a(e=>{this.config.description=e.target.value,this.markUnsavedChanges()},300)),document.getElementById("tourInitialScene")?.addEventListener("change",e=>{this.config.initialSceneId=e.target.value,this.markUnsavedChanges()}),document.getElementById("tourAutoRotate")?.addEventListener("change",e=>{this.config.autoRotate=e.target.checked,this.markUnsavedChanges()}),document.getElementById("tourShowCompass")?.addEventListener("change",e=>{this.config.showCompass=e.target.checked,this.markUnsavedChanges()}),document.getElementById("exportJsonBtn")?.addEventListener("click",()=>{this.exportManager.exportJSON()}),document.getElementById("copyJsonBtn")?.addEventListener("click",()=>{this.exportManager.copyJSON()}),document.getElementById("exportViewerBtn")?.addEventListener("click",()=>{this.exportManager.exportViewerHTML()}),document.querySelectorAll(".modal-close").forEach(e=>{e.addEventListener("click",()=>{const t=e.closest(".modal");t&&hideModal(t.id)})}),document.getElementById("importUpload")?.addEventListener("change",e=>{e.target.files&&e.target.files.length>0&&(this.handleImportFile(e.target.files[0]),setTimeout(()=>{e.target.value=""},100))}),window.addEventListener("beforeunload",e=>{this.hasUnsavedChanges&&(e.preventDefault(),e.returnValue="")}),this.listenersSetup=!0}async handleSceneUpload(e){if(e&&0!==e.length){this.uiController.setLoading(!0);for(const t of e)t.type.startsWith("image/")?await this.sceneManager.addScene(t):showToast(`${t.name} is not an image`,"error");this.uiController.setLoading(!1),this.render(),this.markUnsavedChanges()}}addHotspotAtPosition(e){const t=Math.sqrt(e.x*e.x+e.y*e.y+e.z*e.z);if(t>5){const n=5/t;e.x*=n,e.y*=n,e.z*=n,e.x=parseFloat(e.x.toFixed(2)),e.y=parseFloat(e.y.toFixed(2)),e.z=parseFloat(e.z.toFixed(2))}this.hotspotEditor.addHotspot(e)?(this.lastRenderedSceneIndex=-1,this.render(),this.markUnsavedChanges()):console.error("Failed to add hotspot")}selectScene(e){if(this.sceneManager.setCurrentScene(e)){this.lastRenderedSceneIndex=-1,this.hotspotEditor.currentHotspotIndex=-1;const t=this.sceneManager.getCurrentScene();t&&(this.previewController.loadScene(t,!1),this.lastRenderedSceneIndex=e),this.uiController.renderSceneList(),this.uiController.updateSceneProperties(t),this.uiController.renderHotspotList(),this.uiController.updateHotspotProperties(null),this.uiController.updateInitialSceneOptions(),this.uiController.updateTargetSceneOptions()}}selectHotspot(e){if(this.hotspotEditor.setCurrentHotspot(e)){const t=this.hotspotEditor.getHotspot(e);this.uiController.renderHotspotList(),this.uiController.updateHotspotProperties(t),this.uiController.updateTargetSceneOptions(),this.uiController.switchTab("hotspot"),t&&t.position&&this.previewController.pointCameraToHotspot(t.position)}}removeScene(e){this.sceneManager.removeScene(e)&&(this.render(),this.markUnsavedChanges())}removeHotspot(e){this.hotspotEditor.removeHotspot(e)&&(this.lastRenderedSceneIndex=-1,this.render(),this.markUnsavedChanges())}duplicateHotspot(e){this.hotspotEditor.duplicateHotspot(e)&&(this.lastRenderedSceneIndex=-1,this.render(),this.markUnsavedChanges())}reorderScenes(e,t){this.sceneManager.reorderScenes(e,t)&&(this.render(),this.markUnsavedChanges())}async updateCurrentHotspot(e,t){const n=this.hotspotEditor.currentHotspotIndex;this.hotspotEditor.updateHotspot(n,e,t)&&(await this.previewController.updateHotspotMarker(n),this.uiController.renderHotspotList(),this.markUnsavedChanges())}async updateCurrentHotspotPosition(e,t){const n=this.hotspotEditor.currentHotspotIndex,o=this.hotspotEditor.getHotspot(n);if(o){o.position||(o.position={x:0,y:0,z:0}),o.position[e]=t;const r=o.position,s=Math.sqrt(r.x*r.x+r.y*r.y+r.z*r.z);if(s>10){const t=10/s;r.x*=t,r.y*=t,r.z*=t,document.getElementById(`hotspotPos${e.toUpperCase()}`).value=r[e].toFixed(2),showToast("Position clamped to 10-unit radius","info")}await this.previewController.updateHotspotMarker(n),this.uiController.renderHotspotList(),this.markUnsavedChanges()}}updateCurrentScene(e,t){const n=this.sceneManager.currentSceneIndex;this.sceneManager.updateScene(n,e,t)&&(this.uiController.renderSceneList(),this.markUnsavedChanges())}async updateCurrentSceneImage(e){const t=this.sceneManager.currentSceneIndex;if(!(t<0)&&this.sceneManager.updateScene(t,"imageUrl",e)){const n=this.sceneManager.getCurrentScene();n&&(n.thumbnail=e),this.uiController.renderSceneList(),this.lastRenderedSceneIndex=-1,n&&(await this.previewController.loadScene(n),this.lastRenderedSceneIndex=t,showToast("Scene image updated","success")),this.markUnsavedChanges()}}render(){this.uiController.renderSceneList(),this.uiController.renderHotspotList();const e=this.sceneManager.getCurrentScene(),t=this.hotspotEditor.getCurrentHotspot();if(this.uiController.updateSceneProperties(e),this.uiController.updateHotspotProperties(t),this.uiController.updateTourProperties(this.config),this.uiController.updateInitialSceneOptions(),this.uiController.updateTargetSceneOptions(),e){const n=document.querySelector(".preview-empty");n&&(n.style.display="none");const o=this.sceneManager.currentSceneIndex;o!==this.lastRenderedSceneIndex&&(this.previewController.loadScene(e),this.lastRenderedSceneIndex=o),t&&this.previewController.highlightHotspot(this.hotspotEditor.currentHotspotIndex)}else{const e=document.querySelector(".preview-empty");e&&(e.style.display="flex"),this.lastRenderedSceneIndex=-1}}saveProject(){const e={config:this.config,scenes:this.sceneManager.getAllScenes()};return!!this.storageManager.saveProject(e)&&(this.hasUnsavedChanges=!1,showToast("Project saved","success"),!0)}loadProject(){const e=this.storageManager.loadProject();return!!e&&(this.config=e.config||this.config,this.sceneManager.loadScenes(e.scenes||[]),this.hasUnsavedChanges=!1,this.render(),showToast("Project loaded","success"),!0)}newProject(){return!(this.hasUnsavedChanges&&!confirm("You have unsaved changes. Create new project?"))&&(this.config={title:"My Virtual Tour",description:"",initialSceneId:"",autoRotate:!1,showCompass:!1},this.sceneManager.clearScenes(),this.hasUnsavedChanges=!1,this.render(),showToast("New project created","success"),!0)}importProject(){const e=document.getElementById("importUpload");e&&e.click()}async handleImportFile(e){try{this.uiController.setLoading(!0);const t=await this.storageManager.importFromFile(e);this.config=t.config||t,this.sceneManager.loadScenes(t.scenes||[]),this.hasUnsavedChanges=!0,this.render(),this.uiController.setLoading(!1),showToast("Project imported successfully","success")}catch(e){this.uiController.setLoading(!1),console.error("Import failed:",e)}}markUnsavedChanges(){this.hasUnsavedChanges=!0}};document.addEventListener("DOMContentLoaded",async()=>{document.querySelector("[data-swt-editor]")||(window.editor=new d,await window.editor.init())}),window.addEventListener("DOMContentLoaded",()=>{const e=function(){const e=document.querySelector("[data-swt-editor]");if(!e)return null;if("true"!==e.getAttribute("data-swt-auto-init"))return null;const t=e.querySelector("[data-swt-scene-list]"),n=e.querySelector("[data-swt-preview-area]"),o=e.querySelector("[data-swt-properties-panel]"),r=e.getAttribute("data-swt-project-name")||"My Virtual Tour",s="true"===e.getAttribute("data-swt-auto-save"),i=parseInt(e.getAttribute("data-swt-auto-save-interval"))||3e4,a=new TourEditor({projectName:r,autoSave:s,autoSaveInterval:i});return t&&(a.options.sceneListElement=t),n&&(a.options.previewElement=n),o&&(a.options.propertiesElement=o),a.init().catch(e=>{console.error("Failed to initialize declarative editor:",e)}),a}();e&&(window.editor=e);const t=document.getElementById("hotspotColor"),n=document.getElementById("hotspotColorText");t&&n&&(t.addEventListener("input",e=>{n.value=e.target.value}),n.addEventListener("input",e=>{/^#[0-9A-F]{6}$/i.test(e.target.value)&&(t.value=e.target.value)})),document.addEventListener("keydown",e=>{(e.ctrlKey||e.metaKey)&&"s"===e.key&&(e.preventDefault(),window.editor&&window.editor.saveProject()),(e.ctrlKey||e.metaKey)&&"e"===e.key&&(e.preventDefault(),window.editor&&window.editor.exportManager.showExportPreview()),"Escape"===e.key&&document.querySelectorAll(".modal.show").forEach(e=>{e.classList.remove("show")})});const o=document.getElementById("previewBtn");o&&o.addEventListener("click",()=>{const e=document.getElementById("preview"),t=document.getElementById("canvasArea");e&&t&&(t.classList.toggle("preview-active"),window.editor&&window.editor.previewController&&window.editor.previewController.refresh())}),document.querySelectorAll(".modal").forEach(e=>{e.addEventListener("click",t=>{t.target===e&&e.classList.remove("show")})});const r=document.querySelectorAll(".tab"),s=document.querySelectorAll(".tab-content");r.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.tab;r.forEach(e=>e.classList.remove("active")),e.classList.add("active"),s.forEach(e=>{e.style.display="none"});const n=document.getElementById(t+"Tab");n&&(n.style.display="block");const o=document.getElementById("panelTitle");if(o)switch(t){case"scene":o.textContent="Scene Properties";break;case"hotspot":o.textContent="Hotspot Properties";break;case"tour":o.textContent="Tour Settings"}})})}),Object.assign(window,c),window.ProjectStorageManager=class{constructor(){this.storageKey="swt_project",this.autoSaveInterval=null,this.autoSaveDelay=3e4}saveProject(e){try{const t=JSON.stringify(e);return localStorage.setItem(this.storageKey,t),localStorage.setItem(this.storageKey+"_lastSaved",(new Date).toISOString()),!0}catch(e){return console.error("Failed to save project:",e),"QuotaExceededError"===e.name&&r("Storage quota exceeded. Project too large!","error"),!1}}loadProject(){try{const e=localStorage.getItem(this.storageKey);if(e){const t=JSON.parse(e);return this.validateProjectData(t)?t:(console.error("Invalid project data structure"),null)}return null}catch(e){return console.error("Failed to load project:",e),r("Failed to load project","error"),null}}validateProjectData(e){if(!e||"object"!=typeof e)return!1;if(!e.scenes||!Array.isArray(e.scenes))return!1;for(const t of e.scenes){if(!t||"object"!=typeof t)return!1;if(!t.id||"string"!=typeof t.id)return!1;if(!t.imageUrl||"string"!=typeof t.imageUrl)return!1;Array.isArray(t.hotspots)||(t.hotspots=[])}return e.config&&"object"==typeof e.config||(e.config={title:"My Virtual Tour"}),!0}clearProject(){try{return localStorage.removeItem(this.storageKey),localStorage.removeItem(this.storageKey+"_lastSaved"),!0}catch(e){return console.error("Failed to clear project:",e),!1}}hasProject(){return null!==localStorage.getItem(this.storageKey)}getLastSavedDate(){const e=localStorage.getItem(this.storageKey+"_lastSaved");return e?new Date(e):null}startAutoSave(e){this.stopAutoSave(),this.autoSaveInterval=setInterval(()=>{e()},this.autoSaveDelay)}stopAutoSave(){this.autoSaveInterval&&(clearInterval(this.autoSaveInterval),this.autoSaveInterval=null)}exportToFile(e,t="tour.json"){try{return i(JSON.stringify(e,null,2),t),!0}catch(e){return console.error("Failed to export project:",e),r("Failed to export project","error"),!1}}async importFromFile(e){return new Promise((t,n)=>{const o=new FileReader;o.onload=e=>{try{const n=JSON.parse(e.target.result);t(n)}catch(e){console.error("Failed to parse project file:",e),r("Invalid project file","error"),n(e)}},o.onerror=()=>{console.error("Failed to read file:",o.error),r("Failed to read file","error"),n(o.error)},o.readAsText(e)})}},window.SceneManagerEditor=class{constructor(e){this.editor=e,this.scenes=[],this.currentSceneIndex=-1}async addScene(e){try{const s=await n(e),i=await o(e),a={id:t(e.name.replace(/\.[^/.]+$/,"")),name:e.name.replace(/\.[^/.]+$/,""),imageUrl:i,thumbnail:s,hotspots:[]};return this.scenes.push(a),this.currentSceneIndex=this.scenes.length-1,r(`Scene "${a.name}" added successfully`,"success"),a}catch(e){return console.error("Failed to add scene:",e),r("Failed to add scene","error"),null}}removeScene(e){if(e>=0&&e<this.scenes.length){const t=this.scenes[e];return!!confirm(`Are you sure you want to delete scene "${t.name}"?`)&&(this.scenes.splice(e,1),this.currentSceneIndex===e?this.currentSceneIndex=Math.min(this.currentSceneIndex,this.scenes.length-1):this.currentSceneIndex>e&&this.currentSceneIndex--,r(`Scene "${t.name}" removed`,"success"),!0)}return!1}getScene(e){return this.scenes[e]||null}getSceneById(e){return this.scenes.find(t=>t.id===e)||null}updateScene(e,t,n){return e>=0&&e<this.scenes.length&&(this.scenes[e][t]=n,"id"===t&&this.scenes.forEach(t=>{t.hotspots.forEach(t=>{t.targetSceneId===this.scenes[e].id&&(t.targetSceneId=n)})}),!0)}reorderScenes(e,t){if(e>=0&&e<this.scenes.length&&t>=0&&t<this.scenes.length){const n=this.scenes.splice(e,1)[0];return this.scenes.splice(t,0,n),this.currentSceneIndex===e?this.currentSceneIndex=t:e<this.currentSceneIndex&&t>=this.currentSceneIndex?this.currentSceneIndex--:e>this.currentSceneIndex&&t<=this.currentSceneIndex&&this.currentSceneIndex++,!0}return!1}getCurrentScene(){return this.getScene(this.currentSceneIndex)}setCurrentScene(e){return e>=0&&e<this.scenes.length&&(this.currentSceneIndex=e,!0)}getAllScenes(){return this.scenes}getScenes(){return this.scenes}clearScenes(){return!(this.scenes.length>0&&!confirm("Are you sure you want to clear all scenes?"))&&(this.scenes=[],this.currentSceneIndex=-1,!0)}loadScenes(e){this.scenes=e||[],this.currentSceneIndex=this.scenes.length>0?0:-1}},window.HotspotEditor=class{constructor(e){this.editor=e,this.currentHotspotIndex=-1,this.placementMode=!1}enablePlacementMode(){if(!this.editor.sceneManager.getCurrentScene())return r("Please select a scene first","error"),!1;this.placementMode=!0,document.body.style.cursor="crosshair";const e=document.getElementById("preview");e&&(e.style.border="3px solid #4CC3D9",e.style.boxShadow="0 0 20px rgba(76, 195, 217, 0.5)");const t=document.getElementById("addHotspotBtn");return t&&(t.textContent="Click on Preview...",t.classList.add("btn-active")),r("Click on the 360° preview to place hotspot","info",5e3),!0}disablePlacementMode(){this.placementMode=!1,document.body.style.cursor="default";const e=document.getElementById("preview");e&&(e.style.border="",e.style.boxShadow="");const t=document.getElementById("addHotspotBtn");t&&(t.textContent="+ Add Hotspot",t.classList.remove("btn-active"))}addHotspot(t,n=""){const o=this.editor.sceneManager.getCurrentScene();if(!o)return r("No scene selected","error"),null;const s={id:e("hotspot"),type:"navigation",position:t,targetSceneId:n,title:"New Hotspot",description:"",color:"#00ff00",icon:""};return o.hotspots.push(s),this.currentHotspotIndex=o.hotspots.length-1,this.disablePlacementMode(),r("Hotspot added","success"),s}removeHotspot(e){const t=this.editor.sceneManager.getCurrentScene();return!(!t||e<0||e>=t.hotspots.length)&&(!!confirm("Are you sure you want to delete this hotspot?")&&(t.hotspots.splice(e,1),this.currentHotspotIndex===e?this.currentHotspotIndex=-1:this.currentHotspotIndex>e&&this.currentHotspotIndex--,r("Hotspot removed","success"),!0))}updateHotspot(e,t,n){const o=this.editor.sceneManager.getCurrentScene();return!(!o||e<0||e>=o.hotspots.length)&&(o.hotspots[e][t]=n,!0)}getHotspot(e){const t=this.editor.sceneManager.getCurrentScene();return!t||e<0||e>=t.hotspots.length?null:t.hotspots[e]}updateHotspotPosition(e,t){return this.updateHotspot(e,"position",t)}getCurrentHotspot(){const e=this.editor.sceneManager.getCurrentScene();return!e||this.currentHotspotIndex<0?null:e.hotspots[this.currentHotspotIndex]||null}setCurrentHotspot(e){const t=this.editor.sceneManager.getCurrentScene();return!t||e<0||e>=t.hotspots.length?(this.currentHotspotIndex=-1,!1):(this.currentHotspotIndex=e,!0)}getAllHotspots(){const e=this.editor.sceneManager.getCurrentScene();return e?e.hotspots:[]}duplicateHotspot(t){const n=this.editor.sceneManager.getCurrentScene();if(!n||t<0||t>=n.hotspots.length)return null;const o=n.hotspots[t],s=deepClone(o);return s.id=e("hotspot"),s.title=o.title+" (Copy)",s.position={x:o.position.x+.5,y:o.position.y,z:o.position.z},n.hotspots.push(s),this.currentHotspotIndex=n.hotspots.length-1,r("Hotspot duplicated","success"),s}clearAllHotspots(){const e=this.editor.sceneManager.getCurrentScene();return!!e&&(0===e.hotspots.length||!!confirm("Are you sure you want to remove all hotspots from this scene?")&&(e.hotspots=[],this.currentHotspotIndex=-1,r("All hotspots removed","success"),!0))}},window.PreviewController=class{constructor(e){this.editor=e,this.tour=null,this.isInitialized=!1,this.previewContainer=null,this.hasLoadedScene=!1}async init(){return this.previewContainer=document.getElementById("preview"),this.previewContainer?("undefined"==typeof AFRAME&&await this.waitForLibrary("AFRAME",5e3),"undefined"==typeof SWT&&await this.waitForLibrary("SWT",5e3),this.isInitialized=!0,!0):(console.error("Preview element not found"),!1)}async waitForLibrary(e,t=5e3){const n=Date.now();for(;void 0===window[e];){if(Date.now()-n>t)throw new Error(`Timeout waiting for ${e} to load`);await new Promise(e=>setTimeout(e,100))}}async loadScene(e,t=!0){if(!this.isInitialized||!e)return;if(!e.imageUrl||!e.id)return void console.error("Invalid scene data:",e);this.showLoading();let n=null;if(t&&this.tour&&(n=this.getCameraRotation()),this.tour){try{this.tour.destroy()}catch(e){console.error("Error destroying tour:",e)}this.tour=null}if(this.hasLoadedScene){const e=this.previewContainer.querySelector("a-scene");if(e)try{this.previewContainer.removeChild(e)}catch(e){console.error("Error removing scene:",e)}for(;this.previewContainer.firstChild;)this.previewContainer.removeChild(this.previewContainer.firstChild)}else{Array.from(this.previewContainer.children).forEach(e=>{"a-scene"!==e.tagName.toLowerCase()&&this.previewContainer.removeChild(e)})}const o=this.createLoadingOverlay();this.previewContainer.appendChild(o);const s=document.createElement("a-scene");s.id="preview-scene",s.setAttribute("embedded",""),s.setAttribute("vr-mode-ui","enabled: false;"),this.previewContainer.appendChild(s),await new Promise(e=>setTimeout(e,100)),(e.hotspots||[]).map(e=>({id:e.id,position:e.position,action:{type:"navigation"===e.type?"navigateTo":e.type,target:e.targetSceneId},appearance:{color:e.color||"#00ff00",icon:e.icon||null,scale:e.scale||"1 1 1"},tooltip:{text:e.title||"Hotspot"}})),e.id,e.name,e.imageUrl;const i={};(this.editor.sceneManager.scenes||[]).forEach(e=>{const t=(e.hotspots||[]).map(e=>({id:e.id,position:e.position,action:{type:"navigation"===e.type?"navigateTo":e.type,target:e.targetSceneId},appearance:{color:e.color||"#00ff00",icon:e.icon||null,scale:e.scale||"1 1 1"},tooltip:{text:e.title||"Hotspot"}}));i[e.id]={id:e.id,name:e.name,panorama:e.imageUrl,hotspots:t}});const a={title:e.name,initialScene:e.id,scenes:i,settings:{autoRotate:!1,showCompass:!1}};try{this.tour=new SWT.Tour(s,a),this.tour.addEventListener("tour-started",e=>{}),this.tour.addEventListener("scene-loaded",e=>{}),this.tour.addEventListener("hotspot-activated",e=>{const t=e.detail?.hotspotId;if(t){const e=this.editor.sceneManager.getCurrentScene();if(e){const n=e.hotspots.findIndex(e=>e.id===t);n>=0&&this.editor.selectHotspot(n)}}}),await this.tour.start(),this.hasLoadedScene=!0,this.hideLoading(),n&&t&&this.setCameraRotation(n),setTimeout(()=>{this.setupClickHandler()},500)}catch(e){console.error("Failed to load preview:",e),r("Failed to load preview: "+e.message,"error"),this.hideLoading()}}setupClickHandler(){if(!this.tour)return;const e=this.previewContainer.querySelector("a-scene");e?(this.clickHandler&&e.removeEventListener("click",this.clickHandler),this.clickHandler=t=>{if(!this.editor.hotspotEditor.placementMode)return;let n=t.detail?.intersection;if(!n){const o=e.querySelector("[camera]"),s=e.querySelector("a-sky");if(!o||!s)return void r("Scene not ready, please try again","warning");const i=e.canvas.getBoundingClientRect(),a={x:(t.clientX-i.left)/i.width*2-1,y:-(t.clientY-i.top)/i.height*2+1},c=new THREE.Raycaster,d=o.object3D;c.setFromCamera(a,d.children[0]);const l=c.intersectObject(s.object3D,!0);if(!(l.length>0))return void r("Click on the panorama image","warning");n=l[0]}const o=n.point,s={x:parseFloat(o.x.toFixed(2)),y:parseFloat(o.y.toFixed(2)),z:parseFloat(o.z.toFixed(2))};this.editor.addHotspotAtPosition(s)},e.addEventListener("click",this.clickHandler)):setTimeout(()=>this.setupClickHandler(),200)}getCameraRotation(){const e=this.previewContainer?.querySelector("a-scene");if(!e)return null;const t=e.querySelector("[camera]");if(!t)return null;const n=t.object3D.rotation;return{x:n.x,y:n.y,z:n.z}}setCameraRotation(e){if(!e)return;const t=this.previewContainer?.querySelector("a-scene");if(!t)return;const n=t.querySelector("[camera]");if(!n)return;const o=()=>{n.object3D&&n.object3D.rotation.set(e.x,e.y,e.z)};o(),setTimeout(o,100),setTimeout(o,300)}async refresh(){const e=this.editor.sceneManager.getCurrentScene();if(e){const t=this.getCameraRotation();await this.loadScene(e),t&&this.setCameraRotation(t)}}resetCamera(){const e=this.previewContainer?.querySelector("[camera]");e&&e.setAttribute("rotation","0 0 0")}pointCameraToHotspot(e){if(!e)return;const t=this.previewContainer?.querySelector("a-scene");if(!t)return;const n=t.querySelector("[camera]");if(!n||!n.object3D)return;const o=n.object3D.position,r=new THREE.Vector3(e.x-o.x,e.y-o.y,e.z-o.z),s=r.length(),i=Math.asin(r.y/s)*(180/Math.PI),a=Math.atan2(r.x,r.z)*(180/Math.PI);this.animateCameraRotation(n,{x:i,y:a,z:0})}animateCameraRotation(e,t,n=800){if(!e||!e.object3D)return;const o=e.object3D.rotation.x*(180/Math.PI),r=e.object3D.rotation.y*(180/Math.PI),s=e.object3D.rotation.z*(180/Math.PI);let i=t.y-r;for(;i>180;)i-=360;for(;i<-180;)i+=360;const a=r+i,c=Date.now(),d=()=>{const i=Date.now()-c,l=Math.min(i/n,1),u=l<.5?2*l*l:1-Math.pow(-2*l+2,2)/2,h=o+(t.x-o)*u,p=r+(a-r)*u,g=s+(t.z-s)*u;e.object3D.rotation.set(h*(Math.PI/180),p*(Math.PI/180),g*(Math.PI/180)),l<1&&requestAnimationFrame(d)};d()}highlightHotspot(e){}async updateHotspotMarker(e){const t=this.editor.sceneManager.getCurrentScene();if(!t||!this.tour)return;t.hotspots[e]&&await this.refresh()}createLoadingOverlay(){const e=document.createElement("div");return e.className="preview-loading",e.innerHTML='\n <div class="loading-spinner"></div>\n <div class="loading-text">Loading scene...</div>\n ',e}showLoading(){const e=this.previewContainer?.querySelector(".preview-loading");e&&e.classList.remove("hidden")}hideLoading(){const e=this.previewContainer?.querySelector(".preview-loading");e&&(e.classList.add("hidden"),setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},300))}},window.UIController=class{constructor(e){this.editor=e,this.sceneList=document.getElementById("sceneList"),this.hotspotList=document.getElementById("hotspotList"),this.draggedElement=null}renderSceneList(){if(!this.sceneList)return;this.sceneList.innerHTML="";const e=this.editor.sceneManager.getAllScenes(),t=this.editor.sceneManager.currentSceneIndex;if(0===e.length){const e=document.createElement("div");return e.className="empty-state",e.innerHTML='\n <p>No scenes yet</p>\n <p class="hint">Click "Add Scene" to upload a 360° panorama</p>\n ',void this.sceneList.appendChild(e)}e.forEach((e,n)=>{const o=this.createSceneCard(e,n,n===t);this.sceneList.appendChild(o)})}createSceneCard(e,t,n){const o=document.createElement("div");o.className="scene-card"+(n?" active":""),o.draggable=!0,o.dataset.index=t;const r=document.createElement("div");r.className="drag-handle",r.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">\x3c!--!Font Awesome Free v6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2025 Fonticons, Inc.--\x3e<path d="M0 96C0 78.3 14.3 64 32 64l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 128C14.3 128 0 113.7 0 96zM0 256c0-17.7 14.3-32 32-32l384 0c17.7 0 32 14.3 32 32s-14.3 32-32 32L32 288c-17.7 0-32-14.3-32-32zM448 416c0 17.7-14.3 32-32 32L32 448c-17.7 0-32-14.3-32-32s14.3-32 32-32l384 0c17.7 0 32 14.3 32 32z"/></svg>';const s=document.createElement("img");s.src=e.thumbnail||e.imageUrl,s.alt=e.name;const i=document.createElement("div");i.className="scene-info";const a=document.createElement("div");a.className="scene-name",a.textContent=e.name;const c=document.createElement("div");c.className="scene-meta",c.textContent=`${e.hotspots.length} hotspot${1!==e.hotspots.length?"s":""}`,i.appendChild(a),i.appendChild(c);const d=document.createElement("div");d.className="scene-actions";const l=document.createElement("button");return l.className="btn-icon",l.innerHTML="🗑️",l.title="Delete scene",l.onclick=e=>{e.stopPropagation(),this.editor.removeScene(t)},d.appendChild(l),o.appendChild(r),o.appendChild(s),o.appendChild(i),o.appendChild(d),o.onclick=()=>{this.editor.selectScene(t)},this.setupDragAndDrop(o),o}setupDragAndDrop(e){e.addEventListener("dragstart",t=>{this.draggedElement=e,e.classList.add("dragging"),t.dataTransfer.effectAllowed="move"}),e.addEventListener("dragend",()=>{e.classList.remove("dragging"),this.draggedElement=null}),e.addEventListener("dragover",t=>{if(t.preventDefault(),t.dataTransfer.dropEffect="move",this.draggedElement&&this.draggedElement!==e){const n=e.getBoundingClientRect(),o=n.y+n.height/2;t.clientY-o>0?(e.style.borderBottom="2px solid var(--accent-color)",e.style.borderTop=""):(e.style.borderTop="2px solid var(--accent-color)",e.style.borderBottom="")}}),e.addEventListener("dragleave",()=>{e.style.borderTop="",e.style.borderBottom=""}),e.addEventListener("drop",t=>{if(t.preventDefault(),e.style.borderTop="",e.style.borderBottom="",this.draggedElement&&this.draggedElement!==e){const t=parseInt(this.draggedElement.dataset.index),n=parseInt(e.dataset.index);this.editor.reorderScenes(t,n)}})}renderHotspotList(){if(!this.hotspotList)return;this.hotspotList.innerHTML="";const e=this.editor.hotspotEditor.getAllHotspots(),t=this.editor.hotspotEditor.currentHotspotIndex;if(0===e.length){const e=document.createElement("div");return e.className="empty-state",e.textContent='No hotspots. Click "Add Hotspot" to create one.',void this.hotspotList.appendChild(e)}e.forEach((e,n)=>{const o=this.createHotspotItem(e,n,n===t);this.hotspotList.appendChild(o)})}createHotspotItem(e,t,n){const o=document.createElement("div");o.className="hotspot-item"+(n?" active":"");const r=document.createElement("div");r.className="hotspot-color",r.style.backgroundColor=e.color;const s=document.createElement("div");s.className="hotspot-info";const i=document.createElement("div");i.className="hotspot-title",i.textContent=e.title||"Untitled Hotspot";const a=document.createElement("div");if(a.className="hotspot-target",e.targetSceneId){const t=this.editor.sceneManager.getSceneById(e.targetSceneId);a.textContent=t?`→ ${t.name}`:`→ ${e.targetSceneId}`}else a.textContent="No target";s.appendChild(i),s.appendChild(a);const c=document.createElement("div");c.className="hotspot-actions";const d=document.createElement("button");return d.className="btn-delete",d.innerHTML="🗑️",d.title="Delete",d.onclick=e=>{e.stopPropagation(),this.editor.removeHotspot(t)},c.appendChild(d),o.appendChild(r),o.appendChild(s),o.appendChild(c),o.onclick=()=>{this.editor.selectHotspot(t)},o}updateHotspotProperties(e){const t=document.getElementById("hotspotAll"),n=document.getElementById("hotspotProperties");if(!e){t&&(t.style.display="block"),n&&(n.style.display="none"),document.getElementById("hotspotTitle").value="",document.getElementById("hotspotDescription").value="",document.getElementById("hotspotTarget").value="",document.getElementById("hotspotColor").value="#00ff00";const e=document.getElementById("hotspotColorText");return e&&(e.value="#00ff00"),document.getElementById("hotspotPosX").value="",document.getElementById("hotspotPosY").value="",void(document.getElementById("hotspotPosZ").value="")}t&&(t.style.display="block"),n&&(n.style.display="block"),document.getElementById("hotspotTitle").value=e.title||"",document.getElementById("hotspotDescription").value=e.description||"",document.getElementById("hotspotTarget").value=e.targetSceneId||"",document.getElementById("hotspotColor").value=e.color||"#00ff00";const o=document.getElementById("hotspotColorText");o&&(o.value=e.color||"#00ff00");const r=e.position||{x:0,y:0,z:0};document.getElementById("hotspotPosX").value=r.x,document.getElementById("hotspotPosY").value=r.y,document.getElementById("hotspotPosZ").value=r.z,this.updateTargetSceneOptions()}updateSceneProperties(e){if(!e)return document.getElementById("sceneId").value="",document.getElementById("sceneName").value="",void(document.getElementById("sceneImageUrl").value="");document.getElementById("sceneId").value=e.id||"",document.getElementById("sceneName").value=e.name||"",document.getElementById("sceneImageUrl").value=e.imageUrl||""}updateTourProperties(e){document.getElementById("tourTitle").value=e.title||"",document.getElementById("tourDescription").value=e.description||"",document.getElementById("tourInitialScene").value=e.initialSceneId||"",document.getElementById("tourAutoRotate").checked=e.autoRotate||!1,document.getElementById("tourShowCompass").checked=e.showCompass||!1;const t=document.getElementById("project-name");t&&(t.value=e.title||"")}updateTargetSceneOptions(){const e=document.getElementById("hotspotTarget");if(!e)return;const t=this.editor.sceneManager.getAllScenes(),n=e.value;e.innerHTML='<option value="">Select target scene...</option>',t.forEach(t=>{const n=document.createElement("option");n.value=t.id,n.textContent=t.name,e.appendChild(n)}),e.value=n}updateInitialSceneOptions(){const e=document.getElementById("tourInitialScene");if(!e)return;const t=this.editor.sceneManager.getAllScenes(),n=e.value;e.innerHTML='<option value="">Select initial scene...</option>',t.forEach(t=>{const n=document.createElement("option");n.value=t.id,n.textContent=t.name,e.appendChild(n)}),e.value=n}setLoading(e){const t=document.querySelector(".loading-indicator");t&&(t.style.display=e?"block":"none")}switchTab(e){document.querySelectorAll(".tab-btn").forEach(t=>{t.classList.toggle("active",t.dataset.tab===e)}),document.querySelectorAll(".tab-content").forEach(t=>{t.classList.toggle("active",t.id===e+"Tab")})}},window.ExportManager=class{constructor(e){this.editor=e}generateJSON(){const e=this.editor.sceneManager.getAllScenes(),t=this.editor.config,n=e.map(e=>({id:e.id,name:e.name,imageUrl:e.imageUrl,hotspots:e.hotspots.map(e=>({id:e.id,type:e.type||"navigation",position:e.position,targetSceneId:e.targetSceneId||"",title:e.title||"",description:e.description||"",color:e.color||"#00ff00",icon:e.icon||""}))}));let o=t.initialSceneId;!o&&e.length>0&&(o=e[0].id);return{title:t.title||"Virtual Tour",description:t.description||"",initialSceneId:o,scenes:n,settings:{autoRotate:t.autoRotate||!1,showCompass:t.showCompass||!1}}}exportJSON(){try{const e=this.generateJSON(),t=JSON.stringify(e,null,2);return i(t,sanitizeId(e.title||"tour")+".json"),showToast("Tour exported successfully","success"),!0}catch(e){return console.error("Export failed:",e),showToast("Export failed","error"),!1}}async copyJSON(){try{const e=this.generateJSON(),t=JSON.stringify(e,null,2),n=await copyToClipboard(t);return n?showToast("JSON copied to clipboard","success"):showToast("Failed to copy to clipboard","error"),n}catch(e){return console.error("Copy failed:",e),showToast("Copy failed","error"),!1}}generateViewerHTML(){const e=this.generateJSON();return`<!DOCTYPE html>\n<html lang="en">\n<head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <title>${e.title}</title>\n <script src="https://aframe.io/releases/1.7.0/aframe.min.js"><\/script>\n <script src="dist/swt.min.js"><\/script>\n <style>\n body {\n margin: 0;\n overflow: hidden;\n font-family: Arial, sans-serif;\n }\n \n #loading {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: #000;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #fff;\n z-index: 1000;\n }\n \n #loading.hidden {\n display: none;\n }\n \n .spinner {\n border: 4px solid rgba(255,255,255,0.3);\n border-top: 4px solid #fff;\n border-radius: 50%;\n width: 40px;\n height: 40px;\n animation: spin 1s linear infinite;\n margin-right: 15px;\n }\n \n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n \n #ui {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 100;\n display: flex;\n gap: 10px;\n }\n \n .btn {\n background: rgba(0,0,0,0.7);\n color: #fff;\n border: none;\n padding: 10px 20px;\n border-radius: 5px;\n cursor: pointer;\n font-size: 14px;\n }\n \n .btn:hover {\n background: rgba(0,0,0,0.9);\n }\n </style>\n</head>\n<body>\n <div id="loading">\n <div class="spinner"></div>\n <span>Loading Tour...</span>\n </div>\n \n <div id="tour-container"></div>\n \n <div id="ui" style="display: none;">\n <button class="btn" id="resetBtn">Reset View</button>\n <span class="btn" id="sceneInfo"></span>\n </div>\n\n <script>\n // Tour configuration\n const tourConfig = ${JSON.stringify(e,null,8)};\n \n // Initialize tour\n let tour;\n \n document.addEventListener('DOMContentLoaded', async () => {\n try {\n // Create tour instance\n tour = new SenangWebsTour('tour-container', tourConfig);\n \n // Listen to events\n tour.on('sceneChanged', (sceneId) => {\nupdateSceneInfo();\n });\n \n tour.on('ready', () => {\ndocument.getElementById('loading').classList.add('hidden');\n document.getElementById('ui').style.display = 'flex';\n updateSceneInfo();\n });\n \n tour.on('error', (error) => {\n console.error('Tour error:', error);\n alert('Failed to load tour: ' + error.message);\n });\n \n // Start tour\n await tour.start();\n \n // Setup UI\n document.getElementById('resetBtn').addEventListener('click', () => {\n const camera = document.querySelector('[camera]');\n if (camera) {\n camera.setAttribute('rotation', '0 0 0');\n }\n });\n \n } catch (error) {\n console.error('Failed to initialize tour:', error);\n alert('Failed to initialize tour: ' + error.message);\n }\n });\n \n function updateSceneInfo() {\n const sceneId = tour.getCurrentSceneId();\n const scene = tourConfig.scenes.find(s => s.id === sceneId);\n if (scene) {\n document.getElementById('sceneInfo').textContent = scene.name;\n }\n }\n <\/script>\n</body>\n</html>`}exportViewerHTML(){try{const e=this.generateViewerHTML(),t=this.generateJSON();return i(e,sanitizeId(t.title||"tour")+"-viewer.html"),showToast("Viewer HTML exported successfully","success"),!0}catch(e){return console.error("Export viewer failed:",e),showToast("Export viewer failed","error"),!1}}showExportPreview(){try{const e=this.generateJSON(),t=JSON.stringify(e,null,2),n=document.getElementById("exportPreview");return n&&(n.textContent=t),s("exportModal"),!0}catch(e){return console.error("Failed to show export preview:",e),showToast("Failed to generate preview","error"),!1}}},window.TourEditor=d}();
|