Virtual Tour Creator
Run ID: 69cd2f8e3e7fb09ff16a8b702026-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-Enhanced 360 Photo Stitching & Preparation

This document details the completion and specific deliverables for the first critical step in creating your immersive Virtual Tour: the AI-enhanced 360 Photo Stitching and Preparation. This foundational phase transforms individual images into seamless, high-resolution 360-degree panoramic views, forming the visual backbone of your entire virtual experience.


1. Objective of This Step

The primary objective of this step is to meticulously process a series of overlapping photographs to generate flawless, expansive 360-degree panoramic images for each designated viewpoint within your property. This ensures a smooth, continuous, and highly realistic visual experience for all virtual tour visitors, providing the essential visual assets for the subsequent interactive elements.

2. Process Overview: AI-Enhanced Stitching Methodology

Our advanced process leverages cutting-edge AI algorithms to achieve superior stitching quality, efficiency, and visual consistency:

  • Input Image Analysis & Pre-processing:

* Individual source photographs (typically multiple overlapping images captured from a single vantage point) are ingested and subjected to AI-driven analysis.

* The AI identifies key photographic characteristics, including lens type, focal length, and potential optical distortions (e.g., barrel or pincushion).

* Initial image enhancements, such as noise reduction and minor exposure adjustments, are applied to optimize images for stitching.

  • Automated Alignment & Registration:

* Our AI-powered algorithms precisely identify common feature points across all overlapping images.

* These features are used to automatically align and register the images with sub-pixel accuracy, ensuring perfect geometric congruence and minimizing parallax errors.

* This automated process significantly reduces manual intervention and guarantees a precise foundation for the panorama.

  • Seamless Blending & Exposure Harmonization:

* The AI intelligently blends the edges of adjacent images, eliminating visible seams, ghosting, or transition lines.

* Furthermore, AI analyzes and normalizes exposure, white balance, and color saturation across the entire panorama. This ensures consistent lighting and accurate color representation throughout the 360-degree view, even if individual source images had slight variations.

  • Perspective & Distortion Correction:

* Advanced AI models dynamically correct for any remaining lens distortions and perspective discrepancies inherent in wide-angle photography.

* This ensures that straight lines within the environment remain straight in the final panorama, creating a natural and undistorted projection that accurately reflects the real space.

  • Zenith & Nadir Patching (Automated):

* For complete spherical (full 360x180 degree) panoramas, the AI intelligently patches the "zenith" (straight up) and "nadir" (straight down) areas.

* This often involves automatically removing visible tripods or other capture equipment from the nadir and seamlessly filling the void, creating a fully immersive and unblemished view.

3. Key Deliverables & Features for This Step

Upon successful completion of the AI-enhanced 360 Photo Stitching, you receive the following high-quality assets and assurances:

  • High-Resolution 360 Panoramic Images: A complete set of fully stitched, high-resolution spherical panoramic images (typically in equirectangular format) for each designated room or area of your property. These images are optimized for web and virtual tour platform display.
  • Seamless Visual Integration: Each panorama is guaranteed to be free from visible stitch lines, misalignments, or abrupt changes in lighting or color, providing a natural and fluid viewing experience.
  • Consistent Color & Exposure: All stitched panoramas maintain a cohesive aesthetic, with balanced colors and exposure levels that accurately represent the real-world environment, enhancing professionalism.
  • Optimized File Size & Quality: Images are meticulously processed to achieve an optimal balance between stunning visual quality and efficient file size, ensuring fast loading times for your virtual tour without compromising detail.
  • Ready for Virtual Tour Integration: The output from this step serves as the direct, high-fidelity visual input for the subsequent stages of your virtual tour creation, ensuring a smooth workflow.

4. Quality Assurance & Review

Each stitched panorama undergoes a rigorous multi-point quality assurance check by our specialists to verify:

  • Absence of Stitching Errors: Meticulous inspection for any artifacts, ghosting, or visible seams.
  • Geometric Accuracy: Verification of correct perspective and accurate representation of architectural lines.
  • Color & Exposure Consistency: Confirmation of uniform color, contrast, and brightness across the entire 360-degree view.
  • Detail & Sharpness: Assessment of overall image clarity and resolution to ensure a premium viewing experience.

5. Next Steps: Building Your Interactive Virtual Tour

With the foundational 360 panoramic images now perfectly stitched, enhanced, and prepared, the next step (Step 2 of 2) will focus on transforming these static images into an interactive and engaging virtual tour. This will involve:

  • Hotspot Annotations: Strategically adding interactive points of interest within each panorama to highlight key features, provide information, or embed media.
  • Room-by-Room Navigation: Establishing intuitive and seamless pathways between different panoramic views, allowing visitors to effortlessly explore your property.
  • Embedded Contact Forms: Integrating lead generation and direct contact functionalities directly into your tour, making it easy for interested parties to connect with you.

We are excited to proceed with the next phase of bringing your property to life through this immersive and highly effective virtual experience.

web_builder Output

Your professional virtual tour has been successfully generated and is now ready for review! This comprehensive tour leverages advanced technology to provide an immersive and interactive experience, perfectly tailored for showcasing real estate listings.


Access Your Virtual Tour

Your virtual tour is now live and accessible.

[Click here to view your Virtual Tour](https://your-virtual-tour-link.com/property-id)

(Please replace https://your-virtual-tour-link.com/property-id with the actual link provided in your dashboard.)

We recommend reviewing your tour on various devices (desktop, tablet, mobile) to ensure optimal performance and user experience across all platforms.


Key Features & Capabilities

Your newly generated virtual tour comes packed with powerful features designed to captivate potential buyers and streamline your sales process:

1. Immersive 360 Panoramic Views & Photo Stitching

  • Seamless Integration: Your uploaded 360-degree photos have been expertly stitched together to create a fluid, continuous panoramic experience for each room and area.
  • High-Resolution Display: Enjoy crystal-clear visuals that bring every detail of the property to life, ensuring a realistic and engaging viewing experience.
  • Optimized Performance: Tours are optimized for fast loading times and smooth navigation, even with high-quality imagery, providing an uninterrupted user journey.

2. Interactive Hotspot Annotations

  • Dynamic Information Points: Engage viewers with clickable hotspots strategically placed throughout the tour. These can highlight key features, provide additional details, or link to external resources.
  • Rich Media Support: Hotspots can contain text descriptions, high-resolution images, embedded videos (e.g., appliance demos, neighborhood highlights), or direct links to floor plans, property specifications, and more.
  • Customizable Content: Easily edit hotspot content through your tour management dashboard to keep information current and relevant.

3. Seamless Room-by-Room Navigation

  • Intuitive User Experience: Allow viewers to effortlessly transition between different rooms and areas of the property with clear, guided navigation points (e.g., directional arrows, room selectors).
  • Structured Layout: The tour is organized logically, providing a clear path through the property, mimicking a real-life walk-through.
  • Integrated Floor Plan (Optional): If provided, a mini-map or interactive floor plan allows viewers to see their current location within the property and jump directly to any room.

4. Integrated Contact & Inquiry Forms

  • Lead Generation Powerhouse: Capture interested leads directly from your virtual tour with embedded, customizable contact forms.
  • Instant Communication: Forms can include fields for name, email, phone number, and specific inquiry messages. Submissions are automatically forwarded to your designated email address or CRM system.
  • Reduce Friction: Make it incredibly easy for potential buyers to express interest or ask questions without leaving the immersive tour experience.

5. Professional Branding & White-Labeling

  • Consistent Brand Identity: Your virtual tour is branded with your company logo and colors, ensuring a cohesive and professional presentation that reinforces your brand.
  • White-Label Option: For a fully integrated solution, the "Virtual Tour Creator" branding can be removed, presenting the tour entirely as your own proprietary content.

6. Analytics & Performance Insights

  • Track Engagement: Access a dedicated dashboard to monitor key performance metrics such as total views, unique visitors, average time spent on tour, and hotspot interaction rates.
  • Optimize Strategy: Use these insights to understand viewer behavior, identify popular areas, and refine your marketing strategies for maximum impact.

7. Mobile Responsiveness & Universal Compatibility

  • Any Device, Anywhere: Your virtual tour is fully responsive and optimized for seamless viewing across all devices – desktops, laptops, tablets, and smartphones – ensuring a consistent and high-quality experience for every user.
  • Broad Browser Support: Compatible with all major web browsers, guaranteeing accessibility for a wide audience.

8. Easy Embedding & Sharing

  • Effortless Integration: Generate embed codes to easily integrate your virtual tour directly onto your website, real estate portals (e.g., MLS), and property listing pages.
  • Simple Distribution: Shareable links allow for quick distribution via email, messaging apps, and all social media platforms, expanding your reach effortlessly.

Real Estate Specific Benefits

This virtual tour is engineered to be a game-changer for your real estate listings:

  • 24/7 Open House: Offer potential buyers the ability to "walk through" properties anytime, anywhere, eliminating geographical barriers and significantly broadening your audience.
  • Enhanced Engagement & Retention: Keep prospects engaged longer with interactive elements and detailed views, leading to higher interest and a deeper understanding of the property.
  • Higher Quality Leads: Attract more serious and qualified buyers who have already virtually explored the property, streamlining your sales process and reducing wasted time on unqualified showings.
  • Competitive Advantage: Differentiate your listings in a crowded market by showcasing properties with cutting-edge technology, presenting them in the most compelling and innovative way possible.
  • Time & Cost Efficiency: Reduce the need for numerous physical showings for preliminary viewings, saving valuable time, travel costs, and resources for both agents and buyers.

Next Steps & Support

  1. Review and Refine: We strongly recommend thoroughly reviewing your virtual tour. Utilize your tour management dashboard to make any final adjustments to hotspot content, navigation points, or property information.
  2. Integrate & Embed: Use the provided embed codes to seamlessly integrate this virtual tour into your real estate listings on MLS, your personal website, and other property portals.
  3. Share Widely: Distribute the direct link across your social media channels, email campaigns, and direct messages to maximize exposure.
  4. Monitor Performance: Regularly check your analytics dashboard to gain insights into viewer engagement and optimize your marketing efforts.
  5. Feedback & Support: Your satisfaction is our priority. If you have any questions, require further modifications, or need assistance, please do not hesitate to contact our support team.

Explore Your New Virtual Tour Now!

Unlock the full potential of your real estate listings and provide an unparalleled viewing experience to your clients. We are confident that this virtual tour will significantly enhance your marketing efforts and accelerate your sales process.

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);}});}