Virtual Tour Creator
Run ID: 69cd13623e7fb09ff16a7b5a2026-04-01Real Estate
PantheraHive BOS
BOS Dashboard

360 virtual tour builder with photo stitching, hotspot annotations, room-by-room navigation, and embedded contact forms. Perfect for real estate listings.

Step 1 of 2: AI Image Preparation for Virtual Tour Creation

Welcome to the first critical step in building your immersive 360 virtual tour! This ai_image phase is dedicated to ensuring that the visual foundation of your tour is of the highest quality, leveraging advanced AI to prepare, enhance, or even generate the necessary imagery. Our goal is to set the stage for seamless 360 photo stitching and an exceptional user experience.


Phase Overview: AI Image Generation & Enhancement

In this step, our AI system focuses on two primary aspects:

  1. Guiding Image Acquisition: Providing best practices and recommendations for capturing optimal photos that are suitable for 360 stitching, especially for real estate listings.
  2. AI-Powered Image Enhancement: Automatically analyzing and improving submitted photos for clarity, lighting, color accuracy, and overall visual appeal, ensuring they are pristine for the subsequent stitching process.
  3. Conceptual Visual Generation (Optional): If specific property images are not yet available, our AI can generate high-quality conceptual visuals to illustrate the potential of your virtual tour and guide your content strategy.

Best Practices for Image Capture (If Providing Your Own Photos)

To achieve the most stunning and seamless 360 virtual tours, we recommend adhering to the following guidelines when capturing your property photos:

  • Camera Type: Use a high-resolution DSLR, mirrorless camera, or a dedicated 360 camera. Mobile phone cameras can be used but may require more AI correction.
  • Lighting:

* Natural Light: Maximize natural light by opening blinds and curtains. Shoot during the "golden hour" (shortly after sunrise or before sunset) for warm, inviting light, or on an overcast day for soft, even lighting.

* Even Illumination: Ensure consistent lighting across the entire scene. Avoid harsh shadows or overexposed areas.

* HDR (High Dynamic Range): Capture multiple exposures (under, normal, over) for each shot if your camera supports HDR, allowing for a broader range of light and shadow detail.

  • Camera Stability:

* Tripod Essential: Always use a sturdy tripod to eliminate camera shake and ensure consistent camera height and level for all shots within a room.

* Nodal Point: For traditional cameras, rotate the camera around its nodal point to minimize parallax errors, which can cause stitching issues.

  • Coverage:

* Overlap: Ensure a significant overlap (at least 30-50%) between consecutive photos to provide enough data for accurate stitching.

* Full Rotation: Capture a full 360-degree sweep, including shots pointing upwards (zenith) and downwards (nadir) to cover the ceiling and floor.

  • Composition & Staging:

* Clean & Decluttered: Ensure rooms are tidy, clean, and free of personal items. Stage the property professionally.

* Clear Path: Ensure nothing obstructs the camera's view during the rotation.

* Consistent White Balance: Set a consistent white balance for all photos within a single room to maintain color accuracy.


AI-Powered Image Enhancement Capabilities

Upon submission of your raw images, our AI will automatically perform the following enhancements to optimize them for 360 stitching and visual quality:

  • Color Correction & Grading: Adjusting hues, saturation, and luminance to ensure vibrant, accurate, and appealing colors that reflect the true ambiance of the property.
  • Exposure & Dynamic Range Optimization: Correcting underexposed or overexposed areas, balancing highlights and shadows, and applying HDR techniques to bring out detail across the entire image.
  • Noise Reduction: Minimizing grain and digital noise, especially in low-light conditions, to produce cleaner, sharper images.
  • Sharpness & Detail Enhancement: Intelligently sharpening details without introducing artifacts, making textures and architectural features pop.
  • Lens Distortion Correction: Automatically correcting common lens distortions (e.g., barrel distortion from wide-angle lenses) to ensure straight lines and accurate perspectives, crucial for seamless stitching.
  • Chromatic Aberration Removal: Eliminating color fringing that can occur along high-contrast edges.
  • Resolution Upscaling (Optional): If source images are slightly lower resolution, the AI can intelligently upscale them to meet the demands of high-quality virtual tours.

AI-Generated Conceptual Visuals (Illustrative Examples)

To demonstrate the high-quality output achievable and to provide a clear vision for your virtual tour, here are descriptions of AI-generated conceptual visuals, showcasing ideal images prepared for a real estate listing. These serve as a benchmark for the quality we aim to achieve with your submitted photos.

  1. Living Room (Modern & Bright)

* Description: A panoramic segment of a spacious, contemporary living room. Large windows flood the space with natural light, illuminating a plush, light-grey sofa, a minimalist coffee table, and a vibrant green plant. The AI has perfectly balanced the exposure between the bright outdoor view and the interior, ensuring no details are lost. Colors are rich and true-to-life, and the image is free of noise, showcasing fine details in the rug texture and wall art. The perspective is perfectly straight, ready for stitching.

* AI Enhancement Focus: Exposure balancing, color accuracy, detail sharpness.

  1. Kitchen (Sleek & Functional)

* Description: A wide-angle shot of a high-end kitchen featuring dark cabinetry, stainless steel appliances, and a polished quartz countertop. Overhead recessed lighting provides a warm glow, complementing the natural light from a nearby window. The AI has meticulously removed any lens distortion, making the cabinet lines perfectly straight. Reflections on the appliances are subtle and natural, not distracting. The image is crisp, with excellent dynamic range highlighting both the bright countertop and the darker elements.

* AI Enhancement Focus: Lens distortion correction, dynamic range optimization, reflection control.

  1. Master Bedroom (Cozy & Elegant)

* Description: A serene bedroom scene with a king-sized bed adorned with crisp white linens and decorative pillows. A subtle lamp on a bedside table emits a soft, inviting light. The AI has ensured consistent white balance, giving the room a cohesive, tranquil feel. Noise reduction has been applied effectively, resulting in smooth gradients in the wall color and soft textures in the bedding. The image has a slightly warm, inviting tone, perfect for a virtual tour.

* AI Enhancement Focus: Noise reduction, white balance consistency, subtle color grading.


Actionable Next Steps

To proceed with building your 360 virtual tour, please choose one of the following options:

  • Option 1: Upload Your Photos: If you have already captured photos of your property, please upload them via the designated portal. Our AI will automatically initiate the enhancement process as described above.

* [Link/Button: Upload Your Images Now]

  • Option 2: Review AI-Generated Concepts: If you'd like to further explore AI-generated conceptual visuals or discuss specific design aesthetics before capturing your own images, please indicate your preference.

* [Link/Button: Explore More AI Concepts]

  • Option 3: Request AI-Guided Photo Shoot Instructions: If you plan to capture new photos and need more detailed, personalized instructions based on your property type, we can provide AI-guided recommendations.

* [Link/Button: Request Photo Shoot Guidance]

Once your images are processed and optimized by our AI, they will be seamlessly transitioned to Step 2: 360 Photo Stitching, where they will be assembled into a fully interactive panoramic experience.

web_builder Output

Virtual Tour Generation Complete: Your Interactive 360 Real Estate Experience Awaits!

We are delighted to inform you that your professional virtual tour has been successfully generated. This comprehensive, interactive experience is designed to captivate potential buyers, provide an immersive property viewing, and streamline your real estate marketing efforts.

Below is a detailed breakdown of the features and capabilities included in your newly created virtual tour.


1. Tour Access and Management

Your virtual tour is now live and accessible. You will receive a separate email with the direct link to your tour and instructions on how to embed it on your website or share it across various platforms.

  • Direct Tour Link: A unique, shareable URL for your virtual tour.
  • Embed Code: HTML snippet optimized for easy integration into your website, MLS listings (where permitted), or property portals.
  • Management Dashboard Access: (If applicable) Login credentials for a dedicated dashboard where you can view tour analytics, make minor edits, and access sharing options.

2. Core Features & Capabilities

Your virtual tour is built with advanced functionalities to provide a seamless and engaging user experience.

2.1. High-Resolution 360 Panorama Stitching

  • Seamless Integration: Individual 360 panoramic images have been expertly stitched together, eliminating visible seams and ensuring a smooth, continuous view of each room and area.
  • Optimized Quality: Images are optimized for fast loading times without compromising visual fidelity, providing crisp, clear details of the property.
  • Immersive Experience: Viewers can pan, tilt, and zoom within each 360 scene, offering a true sense of presence within the space.

2.2. Interactive Hotspot Annotations

  • Key Feature Highlighting: Strategically placed interactive hotspots draw attention to specific features, amenities, or unique selling points within each scene.
  • Rich Media Support: Hotspots can reveal:

* Text Descriptions: Detailed explanations of appliances, finishes, or room dimensions.

* Image Overlays: Close-up photos of specific details (e.g., granite countertops, custom cabinetry).

* Video Playback: Short clips demonstrating features (e.g., smart home tech, retractable awnings).

* External Links: Direct links to floor plans, appliance specifications, or community information.

  • Intuitive Design: Hotspots are clearly visible but non-intrusive, appearing on hover or click for a clean interface.

2.3. Room-by-Room Navigation & Floor Plan Integration

  • Effortless Transitions: Viewers can easily navigate between different rooms and areas of the property with intuitive on-screen navigation arrows or a dedicated menu.
  • Interactive Floor Plan: A static or interactive 2D floor plan is integrated into the tour, showing the current location of the viewer within the property. Clicking on a room on the floor plan instantly transports the viewer to that specific 360 scene.
  • Logical Flow: The navigation path has been designed to guide potential buyers through the property in a natural, logical sequence, mimicking an in-person walkthrough.

2.4. Embedded Contact Forms

  • Instant Lead Capture: A prominently placed, non-intrusive contact form is embedded directly within the virtual tour. This allows interested viewers to submit inquiries, schedule a showing, or request more information without leaving the tour experience.
  • Customizable Fields: The form includes essential fields such as Name, Email, Phone Number, and a Message box, ensuring you capture all necessary lead details.
  • Automated Notifications: All submissions from the contact form will be immediately forwarded to your designated email address, enabling prompt follow-up.

2.5. Branding & Customization

  • Professional Presentation: Your virtual tour is branded with your agency's logo and contact information, reinforcing your professional image.
  • Color Scheme Integration: The tour interface elements (e.g., navigation buttons, hotspot indicators) are subtly aligned with your brand's color palette for a cohesive look.
  • Property Information Overlay: Key property details (address, price, bedrooms/bathrooms, square footage) are displayed clearly within the tour interface.

3. Enhanced Features for Real Estate Professionals

  • Mobile Responsiveness: The virtual tour is fully responsive and optimized for seamless viewing across all devices – desktops, laptops, tablets, and smartphones – without requiring any special plugins.
  • Social Sharing Integration: Built-in buttons allow easy sharing of your tour link across popular social media platforms (Facebook, Twitter, LinkedIn, etc.) to maximize reach.
  • Accessibility Features: Designed with accessibility in mind, ensuring a broad audience can engage with your tour.
  • Performance Analytics (Optional Add-on / Dashboard Feature): If selected, your management dashboard will provide insights into tour views, popular scenes, average viewing time, and lead generation, helping you optimize your marketing strategy.

4. Next Steps & Support

  1. Check Your Email: You will shortly receive an email containing your unique virtual tour link, embed code, and login details (if applicable) for your tour management dashboard.
  2. Review Your Tour: Please take some time to explore your newly generated virtual tour.
  3. Embed and Share: Integrate the tour into your website, MLS listings, social media, and email campaigns to start attracting more qualified leads.
  4. Feedback & Revisions: If you require any minor adjustments or have feedback, please reply to the email with your tour link or contact our support team at [Support Email/Phone Number]. We are here to ensure your complete satisfaction.

We are confident that this advanced virtual tour will significantly enhance your property listings, provide an unparalleled viewing experience for potential buyers, and drive more successful outcomes for your real estate business.

virtual_tour_creator.md
Download as Markdown
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547} "); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/**(.+?)**/g,"$1"); hc=hc.replace(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); }function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}