AI Voice Designer
Run ID: 69cc0f2604066a6c4a168f522026-03-31Design
PantheraHive BOS
BOS Dashboard

Design a completely custom AI voice by describing the characteristics you want

This document outlines the comprehensive design specifications, wireframe descriptions, color palettes, and user experience (UX) recommendations for an AI Voice Designer tool. The goal is to provide a highly detailed, actionable framework for customers to conceptualize and develop their custom AI voices, leveraging advanced synthesis capabilities akin to ElevenLabs.


AI Voice Designer: Detailed Specifications

This section describes the core parameters and functionalities available within the AI Voice Designer interface, allowing users to craft a completely custom AI voice. We will illustrate these specifications with an example of a "Professional Narrator" voice.

1. Core Voice Attributes & Modulators

Users will have granular control over fundamental voice characteristics.

  • Gender Identity:

* Options: Male, Female, Neutral/Androgynous.

* Control: Radio buttons or slider for a spectrum.

Example: Male*

  • Age Profile:

* Options: Young Adult (18-30), Adult (30-50), Mature (50-70), Senior (70+).

* Control: Slider or dropdown. Influences vocal resonance and perceived gravitas.

Example: Adult (40-55)*

  • Accent/Dialect:

* Options: Comprehensive list including General American, British English (RP, Estuary), Australian, Indian English, various European accents (e.g., French, German, Spanish), and regional variations.

* Control: Searchable dropdown with country/region flags.

Example: General American (Standard)*

  • Speaking Style/Pacing:

* Options: Slow, Moderate, Fast. Also includes stylistic elements like Conversational, Formal, Authoritative, Energetic, Calm, Empathetic.

* Control: Sliders for speed, and multi-select checkboxes/tags for style.

Example: Moderate Pacing, Authoritative, Calm, Articulate*

  • Pitch/Frequency:

* Range: Fine-tune the fundamental frequency of the voice.

* Control: Slider (-50% to +50% with 1% increments).

Example: Slightly Lowered (-10%) for added gravitas.*

  • Tone/Timbre:

* Options: Warm, Bright, Deep, Resonant, Clear, Husky, Smooth, Crisp.

* Control: Multiple sliders or a 2D axis (e.g., Warm-Bright, Deep-Shallow) for nuanced control.

Example: Warm, Resonant, Clear*

  • Volume/Loudness:

* Range: Adjust the overall perceived loudness.

* Control: Slider (0% to 100%).

Example: Standard (75%)*

2. Emotional Range & Expression

Define how the voice conveys emotions and nuances.

  • Emotional Intensity:

* Options: Neutral, Low, Moderate, High.

* Control: Slider.

Example: Low (for consistent neutrality in narration)*

  • Specific Emotional Biases (Optional):

* Options: Happy, Sad, Angry, Confident, Concerned, Excited, Calm.

* Control: Sliders for each emotion (0-100% influence). This allows for a baseline emotional tint.

Example: Slightly Confident (20%), Calm (80%)*

3. Speech Nuances & Articulation

Finer controls for naturalness and specific delivery styles.

  • Intonation/Inflection:

* Options: Monotone, Varied, Expressive.

* Control: Slider from Monotone to Expressive.

Example: Varied (70% Expressiveness)*

  • Pauses & Rhythm:

* Options: Natural, Deliberate, Rushed.

* Control: Slider or pre-set options for sentence-level pacing.

Example: Natural Pauses with Deliberate Emphasis (60%)*

  • Articulation Clarity:

* Options: Muffled, Standard, Crisp, Hyper-articulate.

* Control: Slider.

Example: Crisp (85%)*

  • Breathiness:

* Options: None, Subtle, Moderate, Pronounced.

* Control: Slider.

Example: Subtle (15%) for added naturalness.*

4. Technical Parameters (ElevenLabs-like)

These parameters directly influence the synthesis quality and stability.

  • Voice Clarity/Fidelity:

* Range: Focus on audio quality, minimizing artifacts.

* Control: Slider (0-100%). Higher values consume more resources/time but yield clearer audio.

Example: High Clarity (90%)*

  • Voice Stability:

* Range: Consistency of the voice's characteristics over longer passages.

* Control: Slider (0-100%). Prevents the voice from changing perceived pitch or tone unexpectedly.

Example: High Stability (80%)*

  • Similarity Boost:

* Range: If using an existing voice clone as a base, this parameter controls how closely the generated speech resembles the original speaker's voice.

* Control: Slider (0-100%). (Applicable if starting from a voice clone).

Example: N/A (Designing from scratch)*

  • Speaker Boost:

* Range: Enhances the perceived presence and projection of the voice, making it stand out more in a mix.

* Control: Slider (0-100%).

Example: Moderate Speaker Boost (50%)*

5. Use Case Optimization

Tailor the voice for specific applications.

  • Primary Use Case:

* Options: Narration, Chatbot, Customer Service, Gaming Character, Advertising, Podcast Host, E-learning.

* Control: Dropdown. This can subtly pre-adjust other parameters for common requirements.

Example: Educational Narration & Professional Presentations*

  • Target Audience:

* Options: General Public, Children, Professionals, Students, etc.

* Control: Multi-select or dropdown.

Example: Professionals, Students, General Public*


Wireframe Descriptions for the AI Voice Designer Interface

The interface will be intuitive, allowing users to iteratively design and preview their voices.

1. Main Layout: Two-Column Split View

  • Left Panel (Controls - ~65% width): This is the primary design area where all voice parameters are adjusted.

* Section Headers: Clearly delineate categories (e.g., "Core Voice Attributes," "Emotional Range," "Speech Nuances," "Technical Parameters," "Use Case Optimization").

* Parameter Inputs: A mix of sliders, dropdowns, radio buttons, and multi-select checkboxes/tags as described in the "Detailed Specifications." Each control will have a clear label and current value display.

* Tooltips/Info Icons: Small 'i' icons next to complex parameters to provide concise explanations on hover.

* Preset Management:

* "Load Preset" dropdown: For system-provided or user-saved voice templates.

* "Save Current Voice" button: To store the current configuration.

* Reset Button: To revert all parameters to default.

  • Right Panel (Preview & Output - ~35% width): This panel provides real-time feedback and management options.

* Text Input Area: A large text box for users to type or paste text they want the AI voice to speak.

* Character/Word Count: Display below the text box.

* Example Text Prompts: Small buttons to insert common phrases or sentences for quick testing (e.g., "Hello, this is your custom AI voice.", "The quick brown fox jumps over the lazy dog.").

* Voice Playback Controls:

* "Generate & Play" button: To synthesize and play the entered text using the current voice settings.

* "Stop" button.

* Volume slider for preview.

* Waveform/Progress bar during playback.

* Voice Profile Summary: A concise text summary of the currently designed voice (e.g., "Male, Adult, General American, Warm, Authoritative..."). This updates dynamically.

* Voice ID/Name: Field to assign a unique name to the custom voice.

* Action Buttons:

* "Finalize Voice" / "Add to Library": Confirms the design and adds it to the user's voice library.

* "Download Sample": Option to download a short audio clip of the generated text.

2. Header and Footer

  • Header:

* "AI Voice Designer" title.

* Company Logo (e.g., PantheraHive).

* Navigation to other sections (e.g., "My Voices," "Usage," "Settings").

  • Footer:

* Legal links, privacy policy.

* Version information.

3. Modals & Notifications

  • Save Preset Modal: When "Save Current Voice" is clicked, a modal appears asking for a name and optional description for the preset.
  • Confirmation Modals: For actions like "Reset All" or "Delete Voice."
  • Toast Notifications: For successful actions (e.g., "Voice Saved Successfully!") or errors.

Color Palettes

We recommend a professional, modern, and accessible color scheme.

1. Primary Palette: "Tech Nebula"

Inspired by modern tech interfaces, emphasizing clarity and focus.

  • Primary Background: #1A1A2E (Deep Dark Blue/Almost Black) - Provides a sophisticated, low-distraction canvas.
  • Secondary Background/Card Elements: #282A40 (Slightly Lighter Dark Blue) - For panels, sections, and input fields.
  • Text (Primary): #E0E0E0 (Light Grey) - High contrast for readability on dark backgrounds.
  • Text (Secondary/Labels): #A0A0B0 (Medium Grey) - For less prominent text, descriptions, tooltips.
  • Accent Color (Interactive): #6C63FF (Vibrant Violet/Blue) - For buttons, sliders, active states, and highlights.
  • Success/Confirmation: #4CAF50 (Green)
  • Error/Warning: #F44336 (Red)

2. Secondary Palette: "Clean Slate" (Light Mode Option)

A brighter, equally professional alternative for user preference.

  • Primary Background: #FFFFFF (Pure White)
  • Secondary Background/Card Elements: #F5F5F5 (Off-White/Light Grey)
  • Text (Primary): #333333 (Dark Grey)
  • Text (Secondary/Labels): #666666 (Medium Grey)
  • Accent Color (Interactive): #4285F4 (Google Blue) - A vibrant, trustworthy blue.
  • Success/Confirmation: #28A745 (Green)
  • Error/Warning: #DC3545 (Red)

UX Recommendations

Ensuring an optimal user experience is paramount for a complex tool like an AI Voice Designer.

1. Real-time Feedback & Iteration

  • Instant Preview: The "Generate & Play" button should provide the synthesized audio as quickly as possible (ideally within 1-3 seconds for short phrases).
  • Dynamic Updates: As parameters are adjusted, the "Voice Profile Summary" in the preview panel should update immediately to reflect changes.
  • Visual Indicators: During audio generation, show a loading spinner or progress bar to indicate activity.

2. Intuitive Controls & Learnability

  • Clear Labeling: All sliders, dropdowns, and buttons must have concise, unambiguous labels.
  • Consistent UI Elements: Use standard UI patterns for controls (e.g., sliders for continuous values, dropdowns for discrete lists, radio buttons for mutually exclusive options).
  • Progressive Disclosure: Initially, present core parameters. Consider an "Advanced Settings" toggle to reveal more granular or technical controls, preventing overwhelm for new users.
  • Onboarding Tour: For first-time users, a brief interactive tour highlighting key features and their functions.

3. Guidance & Support

  • Contextual Tooltips: Provide helpful explanations for each parameter on hover, especially for technical or nuanced controls (e.g., explaining "Voice Stability" or "Similarity Boost").
  • Example Values/Ranges: For sliders, clearly indicate the min/max values and potentially recommended ranges for common use cases.
  • Documentation Link: A readily accessible link to comprehensive documentation or a FAQ section.

4. Workflow Efficiency

  • Save/Load Presets: Allow users to save their custom voice configurations as presets and load them easily. Offer a library of common, high-quality pre-designed voices as starting
ai_voice_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);}});}