Contact Data Formatter
Run ID: 69cd01bc3e7fb09ff16a70b12026-04-01CRM
PantheraHive BOS
BOS Dashboard

Import contacts and generate lead scoring

Workflow Execution: Contact Data Formatter - Step 1 of 2

Workflow Name: Contact Data Formatter

Workflow Description: Import contacts and generate lead scoring

Current Step: 1 of 2: crm → import_contacts


1. Step Objective: Import Contacts into CRM

This foundational step initiates the "Contact Data Formatter" workflow by securely importing your provided contact data into our Customer Relationship Management (CRM) system. The primary goal is to ensure all relevant contact information is accurately ingested and prepared for the subsequent lead scoring process.

2. Input Requirements & Data Preparation Guidelines

To ensure a smooth and successful import, please prepare your contact data file according to the following guidelines:

2.1 Preferred File Format

  • CSV (Comma Separated Values) is the strongly preferred format for its simplicity and universal compatibility.
  • Excel (XLSX/XLS) files are also accepted, but please ensure data is on the first sheet and there are no merged cells or complex formatting.

2.2 Mandatory Fields

The following fields are crucial for accurate contact identification and processing. Please ensure these are present and populated for each contact:

  • Email Address: Unique identifier for each contact. Must be a valid email format.
  • First Name: Contact's given name.
  • Last Name: Contact's family name.
  • Company Name: The organization the contact belongs to.

2.3 Recommended Optional Fields

Providing these additional fields will significantly enhance the quality of your contact data and improve the accuracy of lead scoring in Step 2:

  • Phone Number: Direct contact number.
  • Job Title: Contact's professional role.
  • Industry: The industry of the contact's company.
  • Website: Company website URL.
  • Address (Street, City, State/Province, Zip/Postal Code, Country): Full mailing address.
  • Lead Source: How the contact was acquired (e.g., "Webinar," "Trade Show," "Referral").
  • Last Activity Date: Date of the last interaction with the contact.
  • Custom Fields: Any other relevant data points unique to your business (e.g., "Product Interest," "Tier Level").

2.4 Data Quality Best Practices

  • Deduplication: Please perform an initial deduplication within your file before submission. Our system will also perform deduplication against existing CRM records.
  • Consistency: Ensure consistent formatting for fields like dates, phone numbers, and addresses.
  • Accuracy: Verify that email addresses are valid and contact names are spelled correctly.
  • No Merged Cells: For Excel files, avoid merged cells as they can disrupt data parsing.
  • Clean Data: Remove any irrelevant rows, columns, or special characters that are not part of the actual data.

3. Process Overview: How Your Data Will Be Handled

Once you submit your file, the following automated steps will occur:

  1. File Validation: Initial check for file integrity and format compatibility.
  2. Data Parsing: The system will read and extract data from your file.
  3. Field Mapping:

* The system will attempt to automatically map your column headers to standard CRM fields (e.g., "Email" to email_address).

* For any unmapped fields, a manual review may be required to confirm their intended destination within the CRM or to create new custom fields.

  1. Data Validation: Each record will undergo validation:

* Mandatory field presence check.

* Email address format validation.

* Data type validation (e.g., ensuring numeric fields contain numbers).

  1. Deduplication Strategy:

* The system will use Email Address as the primary unique identifier.

* Existing Contacts: If a contact with the same email address already exists in the CRM, the system will update their record with the most recent information from your file.

* New Contacts: If no matching email address is found, a new contact record will be created.

  1. Import Execution: Validated and processed contacts will be imported or updated within the CRM system.

4. Output of This Step

Upon successful completion of the import process, you will receive a comprehensive Import Summary Report including:

  • Total Records Processed: The total number of rows in your submitted file.
  • Contacts Imported/Created: The number of new contact records added to the CRM.
  • Contacts Updated: The number of existing contact records that were modified.
  • Contacts Skipped: The number of records not imported or updated, along with reasons (e.g., invalid email format, missing mandatory fields).
  • Unmapped Fields Report: A list of any columns from your file that could not be automatically mapped to CRM fields, requiring your review.
  • Confirmation that the data is now ready for the next stage.

5. Next Steps & Dependencies

Once the contact data has been successfully imported and validated, the workflow will automatically proceed to Step 2: Generate Lead Scoring. The quality and completeness of the data imported in this step directly impact the accuracy and effectiveness of the lead scoring model.

6. Actionable Items for You

To proceed with Step 1: crm → import_contacts, please take the following actions:

  1. Prepare Your Contact Data File:

* Ensure your data is in CSV format (preferred) or Excel.

* Verify the presence of all mandatory fields (Email, First Name, Last Name, Company Name).

* Include as many recommended optional fields as possible.

* Perform an initial data quality check (deduplication, consistency, accuracy).

  1. Upload Your File: You will receive a secure upload link or instructions on how to submit your prepared contact data file shortly.
  2. Review Mapping (if requested): Be prepared to review any unmapped fields that require your input to ensure correct data placement.

PantheraHive Support:

Should you have any questions or require assistance with preparing your data, please do not hesitate to contact your dedicated PantheraHive support representative or reply to this communication.

crm Output

Workflow Step 2 of 2: AI Lead Scoring Analysis

This document details the final step of the "Contact Data Formatter" workflow, focusing on the application of advanced Artificial Intelligence to generate predictive lead scores for your contact data. This step transforms raw or formatted contact information into actionable intelligence, empowering your sales and marketing teams to prioritize efforts and maximize conversion rates.


1. Overview and Purpose

The primary objective of this crm → ai_lead_scoring step is to leverage sophisticated AI models to analyze your imported contact data and assign a quantitative "lead score" to each record. This score reflects the likelihood of a contact converting into a customer, based on a multitude of factors learned from vast datasets and potentially your historical conversion patterns.

Key Goals:

  • Identify High-Potential Leads: Pinpoint contacts who are most likely to engage and convert.
  • Optimize Resource Allocation: Direct sales and marketing efforts towards the most promising opportunities.
  • Enhance Sales Efficiency: Reduce time spent on unqualified leads and shorten sales cycles.
  • Drive Data-Driven Decisions: Provide objective, evidence-based insights for lead prioritization.

2. Data Input and AI Model Application

Input Data:

The AI lead scoring engine receives the clean, structured contact data that was either directly imported from your CRM or processed and formatted in the preceding workflow step. This typically includes, but is not limited to:

  • Contact Information: Name, email, phone, job title, seniority.
  • Company Information (Firmographics): Company name, industry, size (employee count, revenue), location.
  • Demographic Data: Geographic location, potentially inferred age/gender (if available and relevant).
  • Historical Interaction Data (if available): Past engagement with your website, emails, content, or previous sales interactions (this significantly enhances scoring accuracy).

AI Model Processing:

Our proprietary AI lead scoring models perform a multi-dimensional analysis, considering a blend of factors to generate an accurate predictive score:

  • Feature Engineering: Relevant attributes from your contact data are extracted and transformed into features suitable for machine learning algorithms.
  • Pattern Recognition: The AI identifies complex patterns and correlations within the data that indicate a higher propensity to convert. This includes:

* Demographic Alignment: Matching contact roles and seniority with your ideal customer profile.

* Firmographic Fit: Assessing company size, industry, and revenue against your target market.

* Behavioral Signals (if available): Analyzing engagement metrics (e.g., website visits, content downloads, email clicks) to gauge interest and intent.

* Historical Performance: Learning from your past successful conversions to identify characteristics common among your best customers.

  • Predictive Scoring: Using advanced machine learning algorithms (e.g., gradient boosting, neural networks), a probabilistic score is generated for each lead, representing their likelihood of conversion.

3. Deliverables and Output

Upon completion of the AI lead scoring analysis, your contact data will be enriched with valuable new insights:

  • Augmented Contact Records: Each contact record will be updated or delivered with a new field: AI_Lead_Score.

* Score Range: This score will typically be a numerical value, often ranging from 0 to 100 (or 0.0 to 1.0), where a higher number indicates a greater likelihood of conversion.

* Score Interpretation:

* 80-100 (Hot Lead): Highly qualified, strong intent, immediate sales attention recommended.

* 60-79 (Warm Lead): Good potential, warrants personalized follow-up and nurturing.

* 40-59 (Nurture Lead): Potential fit, requires further engagement through marketing automation.

* 0-39 (Cold Lead): Lower priority, may require broad-based nurturing or re-evaluation.

  • Categorized Lead Tiers: For ease of use, scores may also be categorized into qualitative tiers (e.g., "A," "B," "C," "D" or "Hot," "Warm," "Cold") directly within your output.
  • Output Format:

* CRM Integration: The most common output is a direct update of your CRM records, adding the AI_Lead_Score field to each contact or lead object.

* CSV/Excel Export: A comprehensive report in CSV or Excel format containing all original contact data augmented with the new AI_Lead_Score column.

* API Endpoint: For advanced integrations, the scored data can be made available via a secure API endpoint.


4. Key Benefits for Your Business

  • Enhanced Sales Productivity: Sales teams can focus their valuable time on leads with the highest conversion potential, leading to more efficient outreach and higher close rates.
  • Optimized Marketing Campaigns: Marketing efforts can be segmented and tailored based on lead scores, ensuring messages resonate with the right audience at the right time, improving ROI.
  • Faster Sales Cycles: By quickly identifying and prioritizing high-quality leads, the time from initial contact to conversion can be significantly reduced.
  • Improved Forecasting: More accurate lead scoring contributes to better sales pipeline visibility and more reliable revenue forecasting.
  • Competitive Advantage: Outperform competitors by leveraging data-driven insights to make smarter, faster decisions regarding lead engagement.

5. Recommended Next Steps and Actions

To maximize the value of your newly scored leads, we recommend the following actions:

  1. Review and Familiarize: Access the output (either in your CRM or via the provided file) and familiarize yourself with the AI_Lead_Score and lead tiers.
  2. Sales Prioritization:

* Create Sales Queues: Within your CRM, establish specific queues or views for "Hot Leads," "Warm Leads," etc., based on the AI scores.

* Differentiated Outreach: Develop distinct sales playbooks and outreach strategies for each lead tier. For example, "Hot Leads" might receive immediate, personalized calls, while "Warm Leads" get a sequence of targeted emails.

  1. Marketing Automation & Nurturing:

* Segment Audiences: Use lead scores to segment your marketing audiences for targeted email campaigns, content delivery, and ad retargeting.

* Automated Workflows: Set up automated workflows in your marketing automation platform to nurture "Warm" and "Nurture" leads with relevant content until they become sales-ready.

  1. Integrate into Reporting: Incorporate lead scores into your sales and marketing dashboards to track performance, measure conversion rates by score tier, and continually optimize your strategies.
  2. Feedback Loop (Optional): As your scored leads progress through the sales funnel, providing feedback on actual conversion outcomes can help further train and refine the AI model for even greater accuracy over time.

This AI Lead Scoring step delivers a powerful tool to transform your contact data into a strategic asset, driving efficiency and growth across your organization.

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