User Onboarding Flow
Run ID: 69bcaa4477c0421c0bf4a5d82026-03-29UX Design
PantheraHive BOS
BOS Dashboard

Workflow Execution Summary

Workflow Name: User Onboarding Flow

Category: UX Design

Input Parameters:

  • App Type: Test App Type
  • Number of Steps: 4

This output provides a detailed, 4-step user onboarding flow specifically tailored for a generic "Test App Type," focusing on clarity, engagement, and value delivery.


Generated User Onboarding Flow: "Test App Type"

Overview and Guiding Principles

This 4-step user onboarding flow for a "Test App Type" is designed to quickly introduce new users to the application's core value, guide them through initial setup, encourage engagement, and set them up for continued success. The principles guiding this flow include:

  1. Immediate Value Proposition: Clearly communicate "what's in it for them."
  2. Progressive Disclosure: Introduce features gradually to avoid overwhelming the user.
  3. Action-Oriented: Encourage users to do rather than just read.
  4. Personalization (where possible): Make the experience feel relevant to the individual.
  5. Clear Path to Success: Guide users towards their first "aha!" moment.

Step-by-Step Breakdown

Step 1: Welcome & Core Value Introduction

  • Objective: Greet the user, articulate the app's primary benefit, and set the stage for what they can achieve.
  • Content/UI Elements:

* Welcome Message: Friendly and concise.

* Headline: State the app's core value proposition.

* Short Explainer: 1-2 sentences expanding on the headline.

* Visual Aid: A hero image, short animation, or GIF demonstrating the app's key function or benefit.

* Call to Action (CTA): "Get Started" or "Next."

* Progress Indicator: "1 of 4"

  • Actionable Recommendations:

* Keep it brief: Users have short attention spans.

* Focus on benefits, not features: Tell them how it makes their life better.

* Emotional connection: Use language that resonates with their needs/pain points.

* A/B Test visuals: Different images or animations can impact engagement.

  • Example Copy:

* Headline: "Unlock Your Productivity Potential with [Test App Name]"

* Body: "Organize your tasks, collaborate seamlessly, and achieve your goals faster than ever before."

* CTA: [Get Started]

Step 2: Quick Setup / First Interaction

  • Objective: Guide the user through a minimal, essential setup or their very first interaction with a core feature, demonstrating immediate utility.
  • Content/UI Elements:

* Contextual Headline: Explain the purpose of this step.

* Input Fields/Choices:

* Option A (Profile Setup): Name, role, team name (if applicable).

* Option B (First Task/Project): "Create your first [item]" (e.g., project, note, goal).

* Option C (Preference Selection): Choose a theme, notification preference, or primary use case.

* Brief Explanations: Why this information is needed or how this action helps.

* Skip Option: Provide an option to skip if the setup isn't critical for initial use.

* CTA: "Continue" or "Create [Item]"

* Progress Indicator: "2 of 4"

  • Actionable Recommendations:

* Minimize friction: Ask only for absolutely necessary information.

* Show progress: Use micro-interactions or visual cues to confirm successful input.

* Gamify if possible: Make the setup feel like a small achievement.

* Pre-fill defaults: If certain preferences can be guessed, pre-fill them.

  • Example Copy (Option B: First Task/Project):

* Headline: "Let's Create Your First Project"

* Body: "Kickstart your journey by creating a project. This helps you organize your work right away."

* Input: [Project Name input field] (e.g., "My First Project")

* CTA: [Create Project]

* [Skip for now]

Step 3: Feature Highlight / Guided Tour

  • Objective: Introduce one or two key features that enhance the user's experience or demonstrate significant value beyond the initial interaction.
  • Content/UI Elements:

* Contextual Headline: Announce the feature being highlighted.

* Short Demonstration:

* Option A (Interactive Tour): A tooltip-based tour highlighting specific UI elements.

* Option B (Short Video/GIF): A quick visual explanation of the feature in action.

* Option C (Walkthrough Card): A card with an image and text explaining the feature.

Benefit Statement: Explain why* this feature is useful.

* CTA: "Explore [Feature Name]" or "Next"

* Progress Indicator: "3 of 4"

  • Actionable Recommendations:

* Choose impactful features: Focus on features that drive retention or provide significant "aha!" moments.

* Keep tours brief: Don't overwhelm with too many steps or too much text.

* Allow dismissal: Users should be able to exit the tour if they prefer to explore independently.

* Contextual help: If using tooltips, ensure they point to actual, visible elements.

  • Example Copy (Option A: Interactive Tour - Highlighting Collaboration):

* Headline: "Collaborate with Ease"

* Body: "Invite teammates to your projects and share updates in real-time."

* Interactive Element: A tooltip pointing to an "Invite Teammates" button/icon with brief text like: "Click here to invite your team and start collaborating!"

* CTA: [Got It] or [Next]

Step 4: Completion & Next Steps

  • Objective: Congratulate the user on completing onboarding, provide a clear path forward into the main application, and offer resources for continued support.
  • Content/UI Elements:

* Completion Message: "You're All Set!" or "Welcome Aboard!"

* Recap/Reinforcement: Briefly reiterate the app's main benefit.

* Primary CTA: "Go to Dashboard" or "Start Using [App Name]".

* Secondary CTAs (Optional but recommended):

* "Explore Tutorials"

* "Invite Teammates" (if not done in Step 3)

* "Contact Support"

* Link to a knowledge base or FAQ.

* Progress Indicator: "4 of 4" (or "Complete")

  • Actionable Recommendations:

* Celebrate the user's progress: Acknowledge their effort.

* Clear primary call to action: Make it obvious what they should do next.

* Provide safety nets: Offer support resources to prevent frustration.

* Personalized follow-up: Consider a welcome email shortly after completion.

  • Example Copy:

* Headline: "You're All Set to Boost Your Productivity!"

* Body: "You've successfully set up your [Test App Type] account. Get ready to streamline your work and achieve more."

* Primary CTA: [Go to My Dashboard]

* Secondary CTAs:

* [Watch a Quick Start Video]

* [Visit Help Center]


Key Recommendations for Implementation

  1. Iterative Testing: Conduct A/B tests on different onboarding flows, copy, and visuals to optimize conversion and retention rates.
  2. Analytics Integration: Implement analytics to track completion rates for each step, drop-off points, and post-onboarding engagement.
  3. Contextual Help: Integrate tooltips and inline help text that can be accessed at any point, not just during onboarding.
  4. Mobile Responsiveness: Ensure the onboarding flow is fully optimized for various screen sizes and devices.
  5. User Feedback: Gather feedback from new users through surveys or interviews to identify pain points and areas for improvement.
  6. Personalization Engine: As the app evolves, consider dynamic onboarding steps based on user roles, industry, or stated goals.
  7. Exit Strategy: If a user consistently skips onboarding steps, consider offering a simplified "express" onboarding or direct access to the app with contextual prompts later.

Metrics for Success

To measure the effectiveness of this onboarding flow, track the following metrics:

  • Onboarding Completion Rate: Percentage of users who complete all 4 steps.
  • Time to First Value (TTFV): Time taken for users to reach their "aha!" moment or complete a key action (e.g., create first project, invite first team member).
  • Day 1/Day 7 Retention Rate: Percentage of users who return to the app within 1 and 7 days after onboarding.
  • Feature Adoption Rate: Percentage of users who use the features highlighted during onboarding.
  • Support Ticket Volume: Monitor if specific onboarding steps lead to a higher volume of support requests.
  • Conversion Rate: If applicable, the rate at which users convert from a free trial to a paid subscription after onboarding.
Step 2: sharper4k

User Onboarding Flow: Wireframe Output (Step 2 of 2)

Workflow Category: UX Design

Workflow Name: User Onboarding Flow

App Name: sharper4k

App Type: Test App Type

Number of Onboarding Steps: 4

This output details the wireframe for a 4-step user onboarding flow for "sharper4k," an app assumed to focus on photo/video enhancement, sharpening, and 4K capabilities. The wireframes prioritize clarity, user engagement, and guiding the user towards understanding the app's core value.


1. Wireframe Overview

The onboarding flow consists of four distinct screens, each designed to introduce a key aspect of the sharper4k app. A consistent navigation pattern and progress indicator will be used across all screens to maintain user orientation.

General Wireframe Elements:

  • Status Bar: (Standard mobile OS status bar: Time, Battery, Signal)
  • Progress Indicator: Dots or a bar showing "X of 4" steps.
  • Skip Button: (Optional, top right, available from Step 1)
  • Visual Placeholder: Area for relevant image or animation.
  • Headline: Main message of the screen.
  • Body Text: Elaborates on the headline.
  • Primary Call to Action (CTA): "Next" or "Get Started."

2. Wireframe Details for Sharper4K

Screen 1/4: Welcome & Core Value Proposition

Purpose: Greet the user, introduce the app's name, and state its primary benefit immediately.

  • Screen Title: Onboarding 1/4
  • Visual Placeholder:

Description:* A captivating, high-resolution image or animation depicting a transformation from a blurry/standard image to a sharp, vibrant 4K image. Could feature the app logo subtly integrated.

Size:* Occupies approx. 60% of the screen height.

  • Headline:

Text:* "Welcome to Sharper4K!"

Font:* Large, bold, centered.

  • Body Text:

Text:* "Transform your photos and videos into stunning 4K masterpieces with ease."

Font:* Medium, regular, centered, slightly below headline.

  • Primary CTA:

Button Text:* "Next"

Placement:* Bottom center, full width or prominent button.

  • Progress Indicator: ● ○ ○ ○

Recommendations:

  • Visual Impact: Use a truly impressive visual that immediately conveys the "sharper4k" promise. A subtle animation showing the sharpening effect would be ideal.
  • Conciseness: Keep text minimal and impactful.
  • Brand Consistency: Ensure font, color, and visual style align with the app's overall brand identity.

Screen 2/4: Feature Highlight 1 - AI Enhancement

Purpose: Showcase one of the app's most powerful and differentiating features (AI enhancement).

  • Screen Title: Onboarding 2/4
  • Visual Placeholder:

Description:* A clear "Before & After" slider or split-screen comparison, demonstrating the AI sharpening and upscaling capabilities. The "Before" side should look noticeably worse than the "After."

Size:* Occupies approx. 55% of the screen height.

  • Headline:

Text:* "AI-Powered Clarity & Detail"

Font:* Large, bold, centered.

  • Body Text:

Text:* "Our intelligent AI instantly sharpens blurry images, reduces noise, and upscales to breathtaking 4K resolution."

Font:* Medium, regular, centered.

  • Primary CTA:

Button Text:* "Next"

Placement:* Bottom center.

  • Progress Indicator: ○ ● ○ ○

Recommendations:

  • Interactive Demo: If technically feasible, a small interactive "before/after" slider within the wireframe (or a clear instruction for it) would greatly enhance engagement.
  • Benefit-Oriented Language: Focus on what the feature does for the user (e.g., "breathtaking 4K resolution") rather than just technical jargon.

Screen 3/4: Feature Highlight 2 - Pro Tools & Permissions

Purpose: Introduce additional advanced features and prepare the user for necessary permissions without overwhelming them.

  • Screen Title: Onboarding 3/4
  • Visual Placeholder:

Description:* A montage of elegant icons representing various editing tools (e.g., color correction, filters, crop, exposure) arranged aesthetically. Could also show a blurred background with a subtle overlay of editing controls.

Size:* Occupies approx. 50% of the screen height.

  • Headline:

Text:* "Unlock Advanced Editing & Effects"

Font:* Large, bold, centered.

  • Body Text:

Text:* "Go beyond sharpening with professional-grade tools for color grading, creative filters, and precise adjustments. (We'll need access to your photos to get started!)"

Font:* Medium, regular, centered. The permission hint should be slightly smaller or italicized.

  • Primary CTA:

Button Text:* "Next"

Placement:* Bottom center.

  • Progress Indicator: ○ ○ ● ○

Recommendations:

  • Permission Context: By mentioning photo access here, the subsequent permission request (which typically occurs right after onboarding or upon first use of a feature requiring it) will feel less intrusive.
  • Visual Cues: The icons should be clear and immediately recognizable as editing tools.
  • Manage Expectations: Clearly set the expectation that more advanced features are available.

Screen 4/4: Call to Action & Get Started

Purpose: Provide a final encouraging message and a clear call to action to begin using the app.

  • Screen Title: Onboarding 4/4
  • Visual Placeholder:

Description:* An inspiring image of a person creating or admiring a beautifully enhanced photo/video, or a simple, elegant graphic featuring the app's logo and a "play" or "camera" icon.

Size:* Occupies approx. 55% of the screen height.

  • Headline:

Text:* "Your Vision, Sharpened."

Font:* Large, bold, centered, perhaps slightly more artistic.

  • Body Text:

Text:* "You're all set! Start enhancing your memories and creative projects today. Let's make something amazing."

Font:* Medium, regular, centered.

  • Primary CTA:

Button Text:* "Start Enhancing Now"

Placement:* Bottom center, prominent, perhaps a different accent color to signify completion.

  • Secondary CTA (Optional):

Button Text:* "Sign Up / Log In" (If account creation is optional and not mandatory for first use. If mandatory, it should be the primary CTA).

Placement:* Below the primary CTA, as a text link or ghost button.

  • Progress Indicator: ○ ○ ○ ●

Recommendations:

  • Strong CTA: The final CTA should be compelling and clearly indicate the next step into the app's core functionality.
  • Sense of Accomplishment: Use language that makes the user feel ready and excited to begin.
  • Account Creation Strategy: Carefully consider if sign-up/login is essential before the user experiences the app. For a "Test App Type," allowing immediate access often leads to higher engagement. If it's optional, offer it discreetly.

3. Actionable Next Steps

  1. Visual Design Integration: Hand off these wireframes to a UI designer to apply the app's brand guidelines, colors, typography, and create the actual visual assets (illustrations, icons).
  2. Prototyping: Create an interactive prototype of this flow using tools like Figma, Sketch, or Adobe XD to simulate the user experience.
  3. User Testing (Internal): Conduct internal walkthroughs with team members to identify any immediate usability issues or areas of confusion.
  4. Content Refinement: Review all headlines and body text for clarity, conciseness, and brand voice. Ensure they align with sharper4k's messaging.
  5. Analytics Planning: Determine what metrics to track for onboarding completion rates, drop-off points, and time spent on each screen.
  6. Permission Strategy Review: Confirm the exact timing and wording for any necessary permission requests (e.g., camera, photo library access) to ensure compliance and a smooth user experience.
user_onboarding_flow.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);}});}