A/B Test Designer
Run ID: 69b6ee7295d85cd597625a5e2026-03-29Marketing
PantheraHive BOS
BOS Dashboard

As a professional AI assistant within PantheraHive, I have executed the "A/B Test Designer" workflow based on your inputs.

Workflow Execution Summary

Workflow Name: A/B Test Designer

Category: Marketing

User Inputs:

  • Feature: Checkout Button Color
  • Hypothesis: Green converts better than blue

The following output provides a comprehensive, professional A/B test design for evaluating the impact of changing your checkout button color.


A/B Test Design: Checkout Button Color Optimization

1. Test Overview

This A/B test is designed to determine if changing the color of the primary checkout button from its current default (assumed to be blue) to green will lead to a statistically significant increase in purchase conversion rates on your e-commerce platform.

2. Test Objectives

  • Primary Objective: To increase the overall purchase conversion rate on the checkout page.
  • Secondary Objectives:

* To improve the Click-Through Rate (CTR) of the checkout button.

* To potentially reduce cart abandonment rates from the checkout page.

* To gather insights into user psychological responses to button color in a high-intent conversion context.

3. Hypothesis

  • Null Hypothesis (H0): There is no statistically significant difference in purchase conversion rate between a blue checkout button and a green checkout button.
  • Alternative Hypothesis (H1): A green checkout button will lead to a statistically significant increase in the purchase conversion rate compared to a blue checkout button.

4. Variables

  • Independent Variable: Checkout button color (Blue vs. Green). This is the element we will manipulate.
  • Dependent Variable: Purchase Conversion Rate (Number of completed purchases / Number of unique visitors to the checkout page). This is the key metric we aim to influence and measure.

5. Test Groups

To ensure a fair comparison, users will be randomly split into two distinct groups:

  • Control Group (A): Users in this group will see the existing checkout button color (Blue). This serves as the baseline for comparison.
  • Variation Group (B): Users in this group will see the new checkout button color (Green).

6. Key Metrics to Track

Primary Metric:

  • Purchase Conversion Rate:

* Definition: The percentage of unique users who land on the checkout page and successfully complete a purchase.

Formula: (Number of Completed Purchases / Number of Unique Visitors to Checkout Page) 100

Secondary Metrics:

  • Checkout Button Click-Through Rate (CTR):

* Definition: The percentage of unique users on the checkout page who click the "Complete Purchase" button.

Formula: (Number of Unique Clicks on Checkout Button / Number of Unique Visitors to Checkout Page) 100

  • Average Order Value (AOV):

* Definition: The average monetary value of purchases made by users in each group.

* Formula: Total Revenue / Number of Completed Purchases

  • Cart Abandonment Rate (from Checkout):

* Definition: The percentage of users who start the checkout process but do not complete the purchase.

Formula: (Number of Unique Visitors to Checkout Page - Number of Completed Purchases) / Number of Unique Visitors to Checkout Page 100

7. Target Audience

  • All users who land on the checkout page of your website or application, regardless of their source, device, or previous interactions. This ensures a broad and representative sample.

8. Traffic Allocation

  • 50/50 Split: Traffic will be evenly distributed, with 50% of eligible users directed to the Control Group (Blue button) and 50% to the Variation Group (Green button). This ensures maximum statistical power for detecting a difference, should one exist.

9. Sample Size & Test Duration Estimation

Accurate sample size and duration require specific baseline data. Below is an example calculation and the factors to consider.

  • Required Inputs for Calculation:

* Current Baseline Conversion Rate: (e.g., 5% for your checkout page)

* Minimum Detectable Effect (MDE): The smallest percentage point increase you want to be able to detect (e.g., a 0.5 percentage point absolute increase, or a 10% relative increase from 5% to 5.5%).

* Statistical Significance Level (Alpha): Typically 0.05 (95% confidence).

* Statistical Power: Typically 0.80 (80% chance of detecting an effect if one truly exists).

* Daily Unique Visitors to Checkout Page: (e.g., 1,000 unique visitors/day)

  • Example Calculation (Illustrative - actual values will vary):

* Given a baseline conversion rate of 5%, an MDE of a 10% relative increase (to 5.5%), 95% confidence, and 80% power, an A/B test calculator might suggest a requirement of approximately 15,000 unique visitors per group.

* Estimated Total Sample Size: 30,000 unique visitors.

* Estimated Test Duration: If you receive 1,000 unique visitors to your checkout page daily, the test would need approximately 30,000 visitors / 1,000 visitors/day = 30 days to collect sufficient data.

  • Recommendation: Use a dedicated A/B test sample size calculator (e.g., Optimizely, VWO, or online statistical calculators) with your actual baseline metrics to determine precise sample size and duration. It's crucial to run the test for at least one full business cycle (e.g., 7-14 days) to account for day-of-week variations.

10. Implementation Steps

  1. Technical Setup:

* Utilize an A/B testing platform (e.g., Optimizely, VWO, Google Optimize, custom-built solution) to serve the different button colors.

Ensure the experiment is configured to target only* the checkout page and the specific button element.

* The platform should randomly assign users to either Group A or Group B upon landing on the checkout page.

  1. Tracking & Analytics Configuration:

* Verify that your analytics platform (e.g., Google Analytics, Adobe Analytics) is set up to accurately track:

* Unique visitors to the checkout page, segmented by A/B test group.

* Clicks on the checkout button, segmented by group.

* Successful purchase completions (conversion events), segmented by group.

* Revenue generated, segmented by group.

* Implement event tracking specifically for the button click and purchase completion for each group.

  1. Quality Assurance (QA):

* Thoroughly test both the Control (Blue) and Variation (Green) versions across various browsers (Chrome, Firefox, Safari, Edge), devices (desktop, tablet, mobile), and operating systems.

* Confirm that the button color changes correctly for the Variation group without affecting other elements or functionality.

* Verify that all tracking events are firing correctly for both groups and that data is being logged accurately in your analytics platform.

  1. Launch:

* Schedule the A/B test launch during a period of stable traffic, avoiding major promotional events or site updates that could interfere with results.

11. Monitoring and Analysis Plan

  1. Initial Monitoring (First 24-48 hours):

* Monitor for any technical issues, errors, or anomalies in data collection.

* Confirm traffic is being split correctly between Control and Variation.

* Check for any unexpected user experience issues or performance degradation.

  1. Ongoing Monitoring:

* Regularly check the primary and secondary metrics, but avoid "peeking" at statistical significance too early, as this can lead to false positives.

* Ensure consistent traffic flow and data collection throughout the test duration.

  1. Statistical Analysis (Post-Test):

* Once the predetermined sample size has been reached, use appropriate statistical tests:

* Chi-squared test for comparing conversion rates (proportions).

* T-test for comparing average order value (means).

* Determine if the observed difference in the primary metric (Purchase Conversion Rate) is statistically significant at the 95% confidence level (p-value < 0.05).

* Analyze secondary metrics to provide a fuller picture of the impact.

  1. Segmentation Analysis:

* If a statistically significant result is found, consider analyzing performance across key user segments (e.g., new vs. returning users, mobile vs. desktop users) to uncover deeper insights or segment-specific effects.

12. Decision Criteria

  • The test will be concluded once the pre-calculated sample size has been reached, and statistical significance (p-value < 0.05) has been achieved for the primary metric.
  • Winner Declared: If the Variation (Green button) shows a statistically significant increase in the Purchase Conversion Rate compared to the Control (Blue button), the Green button will be declared the winner.
  • No Significant Difference: If, after reaching the required sample size, no statistically significant difference is found, it indicates that the color change does not have a measurable impact on conversion at the specified MDE, or the impact is too small to detect with the current test parameters. In this case, the existing blue button would remain, or further hypotheses would be explored.
  • Control Wins: If the Control (Blue button) significantly outperforms the Variation (Green button), the blue button should be retained.

13. Potential Risks & Considerations

  • Novelty Effect: New elements can sometimes temporarily boost engagement simply because they are new. Ensure the test runs long enough to mitigate this.
  • External Factors: Major marketing campaigns, holidays, or website outages during the test period could skew results. Plan accordingly.
  • Technical Issues: Bugs in implementation or tracking can invalidate results. Thorough QA is essential.
  • Interference with Other Tests: Ensure no other A/B tests are running concurrently on the checkout page that could influence or be influenced by this test.
  • Brand Consistency: Consider if a green button aligns with your overall brand guidelines and user experience.

14. Next Steps & Recommendations

  1. Prior to Launch:

* Confirm Baseline: Accurately measure and document your current checkout page conversion rate (Blue button).

* Calculate Exact Sample Size & Duration: Use your actual baseline data with an A/B test calculator.

* Finalize Tracking Plan: Ensure all conversion events and metrics are clearly defined and will be accurately captured.

* Communicate Internally: Inform relevant teams (marketing, product, development) about the upcoming test.

  1. Post-Test (Based on Results):

* If Green Wins: Immediately roll out the green checkout button to 100% of your user base. Monitor post-rollout performance to confirm sustained improvement.

* If No Winner / Blue Wins: Document the findings. This test provided valuable insight that green is not a superior option. Consider iterating with new hypotheses (e.g., button text, size, placement, surrounding microcopy, or other color variations like orange/red if aligned with brand).

* Share Learnings: Disseminate the test results and key takeaways across the organization to build a culture of data-driven decision-making.


Structured A/B Test Design Data

| Aspect | Detail |

| :---------------------- | :---------------------------------------------------------------------------------------------------- |

| Test Name | Checkout Button Color Optimization |

| Feature Tested | Checkout Button Color |

| Current State (Control) | Blue Checkout Button |

| Proposed Change (Variation) | Green Checkout Button |

| Hypothesis | Green converts better than blue (specifically, leads to a higher purchase conversion rate). |

| Primary Metric | Purchase Conversion Rate |

| Secondary Metrics | Checkout Button CTR, Average Order Value (AOV), Cart Abandonment Rate (from Checkout) |

| Target Audience | All unique visitors to the checkout page |

| Traffic Allocation | 50% Control (Blue) / 50% Variation (Green) |

| Statistical Significance | p < 0.05 (95% Confidence Level) |

| Statistical Power | 0.80 (80% Power) |

| Required Sample Size (Example) | ~15,000 unique visitors per group (depends on baseline, MDE) |

| Estimated Duration (Example) | ~30 days (based on 1,000 unique visitors/day and 30,000 total visitors) |

| Tools Recommended | A/B testing platform (Optimizely, VWO), Web Analytics (Google Analytics, Adobe Analytics) |

| Decision Criteria | Variation wins if Purchase Conversion Rate is statistically significantly higher than Control. |

| Post-Test Action (if Variation wins) | Full rollout of green checkout button to 100% of users. |

a_b_test_designer.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
\n\n\n"); 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'\nimport ReactDOM from 'react-dom/client'\nimport App from './App'\nimport './index.css'\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n \n \n \n)\n"); 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'\nimport './App.css'\n\nfunction App(){\n return(\n
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n
\n )\n}\nexport default App\n"); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e}\n.app{min-height:100vh;display:flex;flex-direction:column}\n.app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px}\nh1{font-size:2.5rem;font-weight:700}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\n## Open in IDE\nOpen the project folder in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "type": "module",\n "scripts": {\n "dev": "vite",\n "build": "vue-tsc -b && vite build",\n "preview": "vite preview"\n },\n "dependencies": {\n "vue": "^3.5.13",\n "vue-router": "^4.4.5",\n "pinia": "^2.3.0",\n "axios": "^1.7.9"\n },\n "devDependencies": {\n "@vitejs/plugin-vue": "^5.2.1",\n "typescript": "~5.7.3",\n "vite": "^6.0.5",\n "vue-tsc": "^2.2.0"\n }\n}\n'); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite'\nimport vue from '@vitejs/plugin-vue'\nimport { resolve } from 'path'\n\nexport default defineConfig({\n plugins: [vue()],\n resolve: { alias: { '@': resolve(__dirname,'src') } }\n})\n"); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]}\n'); zip.file(folder+"tsconfig.app.json",'{\n "compilerOptions":{\n "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"],\n "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true,\n "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue",\n "strict":true,"paths":{"@/*":["./src/*"]}\n },\n "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"]\n}\n'); zip.file(folder+"env.d.ts","/// \n"); zip.file(folder+"index.html","\n\n\n \n \n "+slugTitle(pn)+"\n\n\n
\n \n\n\n"); 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'\nimport { createPinia } from 'pinia'\nimport App from './App.vue'\nimport './assets/main.css'\n\nconst app = createApp(App)\napp.use(createPinia())\napp.mount('#app')\n"); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue","\n\n\n\n\n"); 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}\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nnpm run dev\n\`\`\`\n\n## Build\n\`\`\`bash\nnpm run build\n\`\`\`\n\nOpen in VS Code or WebStorm.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n"); } /* --- 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",'{\n "name": "'+pn+'",\n "version": "0.0.0",\n "scripts": {\n "ng": "ng",\n "start": "ng serve",\n "build": "ng build",\n "test": "ng test"\n },\n "dependencies": {\n "@angular/animations": "^19.0.0",\n "@angular/common": "^19.0.0",\n "@angular/compiler": "^19.0.0",\n "@angular/core": "^19.0.0",\n "@angular/forms": "^19.0.0",\n "@angular/platform-browser": "^19.0.0",\n "@angular/platform-browser-dynamic": "^19.0.0",\n "@angular/router": "^19.0.0",\n "rxjs": "~7.8.0",\n "tslib": "^2.3.0",\n "zone.js": "~0.15.0"\n },\n "devDependencies": {\n "@angular-devkit/build-angular": "^19.0.0",\n "@angular/cli": "^19.0.0",\n "@angular/compiler-cli": "^19.0.0",\n "typescript": "~5.6.0"\n }\n}\n'); zip.file(folder+"angular.json",'{\n "$schema": "./node_modules/@angular/cli/lib/config/schema.json",\n "version": 1,\n "newProjectRoot": "projects",\n "projects": {\n "'+pn+'": {\n "projectType": "application",\n "root": "",\n "sourceRoot": "src",\n "prefix": "app",\n "architect": {\n "build": {\n "builder": "@angular-devkit/build-angular:application",\n "options": {\n "outputPath": "dist/'+pn+'",\n "index": "src/index.html",\n "browser": "src/main.ts",\n "tsConfig": "tsconfig.app.json",\n "styles": ["src/styles.css"],\n "scripts": []\n }\n },\n "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"}\n }\n }\n }\n}\n'); zip.file(folder+"tsconfig.json",'{\n "compileOnSave": false,\n "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"]},\n "references":[{"path":"./tsconfig.app.json"}]\n}\n'); zip.file(folder+"tsconfig.app.json",'{\n "extends":"./tsconfig.json",\n "compilerOptions":{"outDir":"./dist/out-tsc","types":[]},\n "files":["src/main.ts"],\n "include":["src/**/*.d.ts"]\n}\n'); zip.file(folder+"src/index.html","\n\n\n \n "+slugTitle(pn)+"\n \n \n \n\n\n \n\n\n"); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser';\nimport { appConfig } from './app/app.config';\nimport { AppComponent } from './app/app.component';\n\nbootstrapApplication(AppComponent, appConfig)\n .catch(err => console.error(err));\n"); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; }\nbody { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; }\n"); 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';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'app-root',\n standalone: true,\n imports: [RouterOutlet],\n templateUrl: './app.component.html',\n styleUrl: './app.component.css'\n})\nexport class AppComponent {\n title = '"+pn+"';\n}\n"); zip.file(folder+"src/app/app.component.html","
\n
\n

"+slugTitle(pn)+"

\n

Built with PantheraHive BOS

\n
\n \n
\n"); 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}\n"); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';\nimport { provideRouter } from '@angular/router';\nimport { routes } from './app.routes';\n\nexport const appConfig: ApplicationConfig = {\n providers: [\n provideZoneChangeDetection({ eventCoalescing: true }),\n provideRouter(routes)\n ]\n};\n"); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router';\n\nexport const routes: Routes = [];\n"); 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)+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\nng serve\n# or: npm start\n\`\`\`\n\n## Build\n\`\`\`bash\nng build\n\`\`\`\n\nOpen in VS Code with Angular Language Service extension.\n"); zip.file(folder+".gitignore","node_modules/\ndist/\n.env\n.DS_Store\n*.local\n.angular/\n"); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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("\n"):"# add dependencies here\n"; zip.file(folder+"main.py",src||"# "+title+"\n# Generated by PantheraHive BOS\n\nprint(title+\" loaded\")\n"); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\npython3 -m venv .venv\nsource .venv/bin/activate\npip install -r requirements.txt\n\`\`\`\n\n## Run\n\`\`\`bash\npython main.py\n\`\`\`\n"); zip.file(folder+".gitignore",".venv/\n__pycache__/\n*.pyc\n.env\n.DS_Store\n"); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^\`\`\`[\w]*\n?/m,"").replace(/\n?\`\`\`$/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)+"\n"; zip.file(folder+"package.json",pkgJson); var fallback="const express=require(\"express\");\nconst app=express();\napp.use(express.json());\n\napp.get(\"/\",(req,res)=>{\n res.json({message:\""+title+" API\"});\n});\n\nconst PORT=process.env.PORT||3000;\napp.listen(PORT,()=>console.log(\"Server on port \"+PORT));\n"; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000\n"); zip.file(folder+".gitignore","node_modules/\n.env\n.DS_Store\n"); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Setup\n\`\`\`bash\nnpm install\n\`\`\`\n\n## Run\n\`\`\`bash\nnpm run dev\n\`\`\`\n"); } /* --- 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:"\n\n\n\n\n"+title+"\n\n\n\n"+code+"\n\n\n\n"; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e}\n"); zip.file(folder+"script.js","/* "+title+" — scripts */\n"); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\n## Open\nDouble-click \`index.html\` in your browser.\n\nOr serve locally:\n\`\`\`bash\nnpx serve .\n# or\npython3 -m http.server 3000\n\`\`\`\n"); zip.file(folder+".gitignore",".DS_Store\nnode_modules/\n.env\n"); } /* ===== 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(/\n{2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+"\n\nGenerated by PantheraHive BOS.\n\nFiles:\n- "+app+".md (Markdown)\n- "+app+".html (styled HTML)\n"); } 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);}});}