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

Import contacts and generate lead scoring

Workflow: Contact Data Formatter - Step 1 of 2: CRM Contact Import

Workflow Description: Import contacts and generate lead scoring.

Current Step: crm → import_contacts


1. Step Objective: CRM Contact Import

The primary objective of this step is to securely and efficiently import your raw contact data into our CRM system. This foundational step ensures that your contact information is accurately captured, standardized, and ready for advanced processes like lead scoring, which will be performed in the subsequent step.

Upon successful completion of this step, your contact database will be populated within the CRM, providing a centralized and accessible source for all future engagements and analyses.

2. Required Input from Customer

To ensure a smooth and accurate import, please provide your contact data in the following format and adhere to these guidelines:

  • Preferred File Format:

* .CSV (Comma Separated Values)

* .XLSX (Microsoft Excel Workbook)

Note:* Ensure the first row of your file contains clear column headers.

  • Mandatory Fields:

* Email Address (This will be used as the primary unique identifier for each contact)

* First Name

* Last Name

* Company Name (Crucial for B2B lead scoring)

  • Highly Recommended Fields (for enhanced lead scoring in Step 2):

* Phone Number

* Job Title

* Industry

* Country/Region

* Lead Source (e.g., "Website", "Event", "Referral", "Cold Outreach")

* Creation Date (Date the contact was acquired)

* Last Activity Date (Date of last known interaction)

* Website (Company or Personal)

* LinkedIn Profile URL

* Original CRM ID (If migrating from another CRM system)

  • Data Quality Guidelines:

Deduplication: Please attempt to deduplicate your list before* submission based on Email Address. Our system will perform a secondary deduplication check, but pre-cleaning will expedite the process.

* Consistency: Ensure consistent formatting for fields like Country/Region (e.g., "USA" vs. "United States"), Industry, and Job Title.

* Accuracy: Verify email addresses are valid and active where possible.

* No Special Characters: Avoid unnecessary special characters in names or company names.

3. Import Process Overview

Once your data file is submitted, the following process will be initiated:

  1. Secure Upload: Your file will be uploaded via our encrypted portal to ensure data privacy and security.
  2. Pre-processing & Validation: The system will validate the file format, check for mandatory fields, and perform initial data integrity checks.
  3. Field Mapping: You will be prompted to confirm the mapping of your file's column headers to the corresponding CRM fields. This ensures data is placed in the correct attributes.
  4. Deduplication & Merging: A comprehensive deduplication process will run, primarily using Email Address as the key identifier. Existing contacts will be updated, and new contacts will be created.
  5. CRM Integration: The validated and mapped data will be imported into your designated CRM instance.

4. Expected Outcome of Step 1

Upon successful completion of the CRM Contact Import:

  • Populated CRM: Your contact database within the CRM will be fully populated with the provided data.
  • Data Standardization: Your contact records will be standardized according to CRM field structures, improving data consistency.
  • Import Summary Report: You will receive a detailed report outlining the number of contacts imported, updated, and any records that may have been skipped due to errors or duplicates (if applicable).
  • Readiness for Lead Scoring: All imported contacts will be immediately available and ready for the next stage of the workflow: Lead Scoring Generation.

5. Actionable Items for You

To proceed with Step 1, please complete the following:

  1. Prepare your contact data file (CSV or XLSX) ensuring it meets the mandatory and recommended field requirements.
  2. Review your data for quality as per the guidelines provided above (deduplication, consistency, accuracy).
  3. Upload your prepared file using the designated secure upload link provided by your PantheraHive representative.
  4. Confirm field mappings when prompted during the upload process.

Next Steps

Once the import is successfully confirmed, the system will automatically trigger Step 2: Lead Scoring Generation to analyze your newly imported contacts and assign lead scores based on predefined criteria.

Support

Should you encounter any difficulties or have questions regarding data preparation or the upload process, please do not hesitate to contact your dedicated PantheraHive support team for assistance.

crm Output

Workflow Completion: Contact Data Formatter - Step 2 of 2: AI Lead Scoring

This document details the successful execution and deliverables for the second and final step of your "Contact Data Formatter" workflow: AI Lead Scoring (crm → ai_lead_scoring).

Our advanced AI models have processed your contact data, transforming raw information into actionable lead intelligence. This step focuses on leveraging sophisticated algorithms to assign a precise lead score to each contact, along with valuable insights to guide your sales and marketing strategies.


1. Step Overview: AI Lead Scoring Execution

This stage is critical for converting your organized contact data into a prioritized list of potential customers. Our system has ingested the cleaned and formatted contact records from your CRM (as processed in Step 1) and applied a multi-dimensional AI scoring methodology.

Objective: To quantitatively assess the sales-readiness and potential value of each contact, enabling your team to focus efforts where they will yield the highest return.

2. Input Data Received

The AI Lead Scoring engine received the following processed and standardized data directly from your CRM system:

  • Contact Information: Full Name, Email Address, Phone Number.
  • Company Information: Company Name, Industry, Company Size (e.g., number of employees, revenue range), Website URL.
  • Professional Details: Job Title, Department, Seniority Level.
  • Geographic Data: City, State/Province, Country.
  • Lead Source: Original channel or campaign that generated the lead.
  • Engagement Data (if available): Any historical interactions passed from the CRM, such as website visits, email opens, content downloads, or past communication logs.

This comprehensive dataset forms the foundation for our AI's analytical process.

3. AI Lead Scoring Methodology

Our proprietary AI lead scoring model employs a sophisticated blend of machine learning techniques to evaluate each contact against a multitude of factors. The methodology is designed to identify patterns and signals indicative of a higher likelihood to convert or engage meaningfully.

Key aspects of our methodology include:

  • Demographic Analysis: Evaluating individual contact attributes (e.g., job title, seniority) for their alignment with your ideal customer profile.
  • Firmographic Analysis: Assessing company-level data (e.g., industry, company size, revenue) to determine market fit and potential value.
  • Behavioral & Intent Signals (if data available): Analyzing past interactions and expressed interest to gauge engagement levels and intent.
  • Predictive Modeling: Leveraging historical conversion data (where applicable and privacy-compliant) to forecast future lead behavior.
  • Dynamic Weighting: Factors are dynamically weighted based on their proven correlation with successful outcomes, ensuring the most impactful attributes drive the score.

4. Output Generated: Detailed Lead Scoring Report & CRM Integration

For each contact processed, the following comprehensive lead intelligence has been generated:

  • Comprehensive Lead Score (0-100): A precise numerical value representing the lead's overall potential. Higher scores indicate a greater likelihood of conversion.
  • Lead Score Category/Tier: A qualitative classification for quick prioritization (e.g., "Hot Lead," "Warm Lead," "Nurture Lead," "Cold Lead," or "Tier A," "Tier B," "Tier C").
  • Key Scoring Factors: Identification of the top 2-3 attributes that most significantly influenced the assigned lead score (e.g., "High Score due to: Ideal Industry Match, Senior Decision Maker Role, Large Company Size").
  • Recommended Next Action: A specific, actionable suggestion for your sales or marketing team (e.g., "Direct Sales Outreach - Product X," "Enroll in Nurture Campaign - Whitepaper Y," "Information Gathering - Re-qualify," "Assign to Account Executive").
  • Engagement Propensity: An indicator of how likely the lead is to respond positively to outreach or marketing efforts.
  • Confidence Level: An assessment of the AI model's certainty in the assigned score and recommendations.

5. Deliverables to Customer

You will receive the following outputs from this step:

  1. Integrated CRM Update:

* Direct Field Population: The generated Lead Score, Lead Score Category, and Recommended Next Action will be automatically pushed back into your CRM system, populating pre-defined or newly created custom fields on each contact record. This ensures your sales team has immediate access to prioritized leads within their existing workflow.

* Custom View/Report Trigger: (If configured) The updated data can trigger custom views or reports within your CRM, allowing for immediate segmentation and filtering of high-priority leads.

  1. Detailed Lead Scoring Report (CSV/Excel Format):

* A comprehensive spreadsheet containing all original contact data augmented with the full suite of generated lead intelligence (Lead Score, Category, Key Scoring Factors, Recommended Next Action, Engagement Propensity, Confidence Level). This report provides a complete overview for analysis, archiving, or integration with other systems.

  1. Lead Scoring Summary Dashboard (Optional/If applicable):

* A high-level visual summary showcasing the distribution of leads by score category, key trends influencing scores across your dataset, and performance metrics. This dashboard provides strategic insights into your overall lead quality.

6. Actionable Insights & Next Steps for Your Team

With the AI-generated lead scores and insights, your team can now:

  • Prioritize Sales Outreach: Focus sales efforts on "Hot" or "Tier A" leads, maximizing efficiency and improving conversion rates.
  • Personalize Messaging: Utilize "Key Scoring Factors" to craft highly relevant and targeted communications, increasing engagement.
  • Optimize Marketing Nurturing: Assign leads to appropriate marketing automation tracks based on their score category and recommended actions, ensuring timely and relevant content delivery.
  • Efficient Resource Allocation: Allocate sales and marketing resources more effectively by understanding where the highest potential lies.
  • Refine Ideal Customer Profile (ICP): Analyze patterns in high-scoring leads to further refine and validate your ICP.
  • Continuous Improvement: Use conversion feedback to continuously train and improve the AI model's accuracy over time.

7. Important Notes

  • Dynamic Nature of Leads: Lead scores are not static. We recommend periodic re-scoring or updates as new engagement data becomes available within your CRM.
  • Human Intelligence Augmentation: AI lead scoring is a powerful tool designed to augment your team's expertise, not replace it. Your sales professionals' insights remain invaluable.
  • Data Quality Dependency: The accuracy and effectiveness of the AI lead scoring are directly dependent on the quality, completeness, and consistency of the input data provided from your CRM.
  • Privacy & Compliance: All data processing adheres to relevant privacy regulations and data security best practices.

This completes the "Contact Data Formatter" workflow. You now have a robust system for importing contacts and generating actionable lead scores, empowering your sales and marketing teams with data-driven insights. Should you have any questions or require further analysis, please do not hesitate to contact us.

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