User Onboarding Flow
Run ID: 69cb10fc42bc43f7e3be71162026-03-31UX Design
PantheraHive BOS
BOS Dashboard

User Onboarding Flow: Research & Design Requirements

This document outlines the comprehensive design requirements for an effective, engaging, and highly converting user onboarding flow. The objective is to create a seamless, intuitive, and value-driven experience for new users, ensuring high activation, understanding of core features, and long-term retention.


1. Overall Onboarding Philosophy & Goals

Our onboarding philosophy is centered around progressive disclosure, immediate value delivery, guided discovery, and personalization. We aim to make the user's initial journey feel effortless, rewarding, and tailored to their needs.

Key Goals for the Onboarding Flow:

  • Increase User Activation Rate: Ensure new users successfully complete their first key action (the "Aha! Moment").
  • Reduce Time-to-Value: Help users quickly understand and experience the core benefit of the product.
  • Improve Feature Adoption: Guide users to discover and utilize essential functionalities.
  • Enhance User Retention: Lay a strong foundation for continued engagement and product loyalty.
  • Minimize Friction: Streamline the sign-up and initial setup process.

2. Core Onboarding Stages & Design Specifications

The onboarding flow is broken down into logical, user-centric stages, each with specific design and UX considerations.

2.1. Stage 1: Welcome & Value Proposition

  • Description: This is the user's very first interaction, designed to make a strong first impression and clearly articulate the product's primary value.
  • Design Specifications:

* Headline: Clear, concise, and benefit-oriented statement of the product's core value (e.g., "Unlock Your Productivity," "Simplify Your Workflow").

* Sub-headline: Briefly elaborates on the headline, providing a compelling reason to continue.

* Visual Element: A high-quality hero image, short animated GIF, or video demonstrating the product in action or illustrating its core benefit.

* Key Benefits: 2-3 concise bullet points or icon-based cards highlighting the most impactful features/benefits.

* Primary Call-to-Action (CTA): Prominent button (e.g., "Get Started," "Sign Up Free") leading directly to account creation.

* Secondary CTA (Optional): Less prominent link or ghost button for "Learn More" or "Explore Features."

* Social Proof (Optional): A subtle display of trust, e.g., "Trusted by 100,000+ users" or partner logos.

  • Wireframe Description:

* Full-width hero section at the top, featuring the main visual.

* Centered headline and sub-headline overlaying or positioned directly below the visual.

* Primary CTA button centered and highly visible.

* Secondary CTA positioned below the primary, or in a less prominent corner.

gemini Output

Detailed Design Specifications: User Onboarding Flow

This document outlines comprehensive design specifications, wireframe descriptions, color palettes, and UX recommendations for the "User Onboarding Flow." The goal is to create an intuitive, engaging, and efficient experience that guides new users smoothly into our product, demonstrating value early and encouraging feature adoption.


1. General Design Principles & Goals

Our onboarding flow will adhere to the following core principles:

  • Clarity & Simplicity: Each step should be easy to understand, with minimal cognitive load and clear calls to action.
  • Engagement & Delight: Use compelling visuals, microinteractions, and positive reinforcement to make the process enjoyable.
  • Efficiency: Allow users to complete essential setup quickly, respecting their time.
  • Value Reinforcement: Continuously communicate the benefits of the product and how it addresses user needs.
  • Brand Consistency: Maintain a cohesive visual and tonal brand identity throughout the journey.
  • Flexibility: Offer options to skip non-essential steps and allow users to complete tasks at their own pace.

2. Core User Onboarding Flow - Screen-by-Screen Design Specifications

The onboarding flow is broken down into six key screens, each with specific design and interaction guidelines.

2.1 Screen 1: Welcome & Value Proposition

  • Purpose: To introduce new users to the product, highlight its primary value proposition, and encourage them to begin the registration process.
  • Wireframe Description:

* Layout: Full-screen, visually dominant.

* Elements:

* Hero Visual: A captivating, high-quality illustration or a short, engaging video showcasing the product's core benefit. Alternatively, a subtle carousel of 2-3 benefit-oriented slides.

* Headline (H1): Prominent and concise,

gemini Output

Finalized Design Assets for User Onboarding Flow

This document details the comprehensive design specifications, wireframe descriptions, color palettes, and user experience (UX) recommendations for the "User Onboarding Flow." The goal is to create an intuitive, engaging, and efficient onboarding experience that quickly guides new users to value and encourages long-term engagement.


1. Overall Design Principles

The design of the User Onboarding Flow will adhere to the following core principles:

  • Clarity & Simplicity: Easy-to-understand language, clear calls-to-action (CTAs), and uncluttered layouts.
  • Engagement & Delight: Incorporate subtle animations, positive reinforcement, and a friendly tone to make the process enjoyable.
  • Purpose-Driven: Every step should have a clear purpose, guiding the user towards understanding the product's core value.
  • Flexibility & Control: Allow users to skip steps (where appropriate), track progress, and return to the onboarding later.
  • Brand Consistency: Maintain a consistent visual identity (colors, typography, imagery) that aligns with the overall brand guidelines.

2. Color Palette

A carefully selected color palette ensures visual harmony, emphasizes key information, and reinforces brand identity.

  • Primary Brand Color: #007BFF (Blue)

Usage:* Main CTAs, primary headings, progress indicators, active states.

Purpose:* Represents trust, professionalism, and actionable elements.

  • Secondary Brand Color: #28A745 (Green)

Usage:* Success messages, positive feedback, secondary CTAs (e.g., "Skip," "Learn More").

Purpose:* Conveys success, growth, and positive affirmation.

  • Accent Color: #FFC107 (Amber/Yellow)

Usage:* Highlight important tips, warnings, optional actions, badges.

Purpose:* Draws attention, indicates optionality or special features.

  • Neutral Colors:

* Light Gray: #F8F9FA

Usage:* Backgrounds, inactive states, subtle dividers.

Purpose:* Provides visual breathing room, clean backdrop.

* Medium Gray: #6C757D

Usage:* Body text, secondary information, placeholder text.

Purpose:* Ensures readability, soft contrast.

* Dark Gray/Black: #343A40

Usage:* Primary text, important labels, strong contrast elements.

Purpose:* High readability for critical information.

  • Error Color: #DC3545 (Red)

Usage:* Form validation errors, critical warnings.

Purpose:* Clearly signals issues requiring user attention.


3. Typography

Consistent typography enhances readability and establishes a professional aesthetic.

  • Primary Font Family: Inter (or a similar modern sans-serif like Roboto, Open Sans)

Rationale:* Highly readable across devices, clean, and professional.

  • Headings (H1, H2, H3): Inter Bold, Semi-Bold

H1 (Main Screen Title):* 32px - 40px (e.g., "Welcome to [Product Name]!")

H2 (Section Titles):* 24px - 30px (e.g., "Tell us about yourself")

H3 (Sub-sections/Prompts):* 18px - 22px (e.g., "What are your goals?")

  • Body Text: Inter Regular

Standard Text:* 16px - 18px

Helper Text/Small Print:* 12px - 14px

  • Call-to-Action (CTA) Text: Inter Semi-Bold, 16px - 18px
  • Line Height: 1.5 - 1.6 for body text to ensure optimal readability.

4. Iconography

  • Style: Line-based, minimalist, consistent stroke weight.
  • Purpose: Enhance visual communication, clarify actions, and save screen real estate.
  • Examples:

* Arrow Right for "Next" or "Continue"

* Checkmark for success or completion

* User for profile settings

* Lightbulb for tips or suggestions

* Gear for settings


5. Screen-by-Screen Design & Wireframe Descriptions

The onboarding flow is broken down into key screens, each with specific design elements, wireframe structure, and UX considerations.

5.1. Screen 1: Welcome & Value Proposition

  • Purpose: Greet the user, state the product's core value proposition, and set expectations for the onboarding journey.
  • Wireframe Description:

* Layout: Vertically centered content with a hero image/illustration on one side (desktop) or top (mobile).

* Elements:

* H1 Title: "Welcome to [Product Name]!" (e.g., "Achieve Your Goals with [Product Name]!")

* Body Text: 1-2 concise sentences explaining the primary benefit or problem solved.

* Bullet Points/Feature List (Optional): 3-4 key benefits or features presented visually.

* Primary CTA: "Get Started" or "Let's Begin" (uses Primary Brand Color).

* Secondary CTA (Optional): "Skip Onboarding" (smaller, less prominent, uses Secondary Brand Color or neutral).

* Progress Indicator: "1 of X Steps" (subtle, at the bottom or top).

* Visuals: Engaging, high-quality illustration or image that visually represents the product's core value.

  • Detailed Design Specifications:

* Background: Light Gray (#F8F9FA) or a subtle gradient.

* H1: Inter Bold, 36px, Dark Gray (#343A40).

* Body Text: Inter Regular, 18px, Medium Gray (#6C757D).

* Primary CTA Button: Inter Semi-Bold, 18px, Primary Brand Color (#007BFF) background, White text. Rounded corners (e.g., 8px).

* Secondary CTA Link: Inter Regular, 16px, Secondary Brand Color (#28A745) text, no background.

  • UX Recommendations:

* Clear Value: Immediately communicate "what's in it for them."

* Single Focus: Keep the primary CTA unambiguous.

* Accessibility: Ensure large enough text and sufficient color contrast.

5.2. Screen 2: Account Creation / Sign-up (If applicable)

  • Purpose: Collect essential user information to create an account.
  • Wireframe Description:

* Layout: Clean, organized form layout, typically single column for mobile, two columns for desktop.

* Elements:

* H2 Title: "Create Your Account" or "Sign Up"

* Form Fields:

* Email Address (Text input, type="email")

* Password (Password input, type="password")

* Confirm Password (Password input)

* Optional: Name (First/Last)

* Social Login Options (Optional but Recommended): Buttons for "Continue with Google," "Continue with Apple," etc.

* Password Requirements: Clear guidelines (e.g., "Min 8 characters, 1 uppercase, 1 number").

* "Forgot Password?" Link: For returning users.

* Primary CTA: "Create Account" or "Sign Up" (Primary Brand Color).

* Link to Login: "Already have an account? Log In"

* Privacy Policy/Terms Link: Small text at the bottom.

* Progress Indicator: "2 of X Steps"

  • Detailed Design Specifications:

* Background: Light Gray (#F8F9FA).

* H2: Inter Bold, 28px, Dark Gray (#343A40).

* Input Fields: White background, 1px Medium Gray (#6C757D) border, 4-6px border-radius. Inter Regular, 16px, Medium Gray placeholder text.

* Error Messages: Inter Regular, 14px, Error Color (#DC3545).

* Social Login Buttons: Consistent styling (e.g., white background, 1px gray border, respective brand icons).

* Primary CTA Button: As per Screen 1.

  • UX Recommendations:

* Minimize Fields: Only ask for essential information.

* Social Login: Reduce friction by offering quick sign-up options.

* Clear Validation: Provide real-time feedback for valid/invalid inputs.

* Password Visibility Toggle: Allow users to see their password for accuracy.

5.3. Screen 3: Personalization / Profile Setup

  • Purpose: Gather basic preferences or information to tailor the user's initial experience.
  • Wireframe Description:

* Layout: Engaging, visually driven questions, possibly with card-based selections or illustrative icons.

* Elements:

* H2 Title: "Tell us about yourself" or "What brings you here?"

* Questions/Prompts:

"What is your primary goal?" (e.g., improve productivity, learn new skill, connect with peers) - Multiple choice via radio buttons or selectable cards.*

* "What industry are you in?" (Dropdown or text input with autocomplete).

* "How often do you plan to use [Product Name]?" (Slider or radio buttons).

* Progress Bar: Visual representation of completion (e.g., 25% complete).

* Optional "Why we ask" Tooltip: Explains the benefit of providing information.

* Primary CTA: "Continue" or "Next" (Primary Brand Color).

* Secondary CTA: "Skip for now" (less prominent).

* Progress Indicator: "3 of X Steps"

  • Detailed Design Specifications:

* Background: Light Gray (#F8F9FA).

* H2: Inter Bold, 28px, Dark Gray (#343A40).

* Question Text: Inter Semi-Bold, 20px, Dark Gray (#343A40).

* Selectable Cards: White background, 1px Medium Gray border. On hover, border changes to Primary Brand Color. On selection, card border and/or background subtly changes to Primary Brand Color with a lighter fill. Icons within cards.

* Progress Bar: Track filling with Primary Brand Color, remaining track with Light Gray.

* Primary CTA Button: As per Screen 1.

  • UX Recommendations:

* Gamification: Use progress bars and visual feedback to make it feel like a journey.

* Explain "Why": Briefly explain how the information will benefit the user.

* Visual Choices: Use cards or icons for options to make selections easier and more engaging.

* Skip Option: Always provide an escape hatch for users who prefer to explore on their own.

5.4. Screen 4: Feature Tour / Product Walkthrough

  • Purpose: Introduce key functionalities and demonstrate how to perform initial actions.
  • Wireframe Description:

* Layout: Overlay-based tour, highlighting specific UI elements on a simplified version of the product dashboard. Alternatively, a multi-step carousel.

* Elements:

* H3 Title (within overlay/carousel slide): "Discover Key Features"

* Short Description: Explains the highlighted feature's benefit.

* Interactive Hotspots/Tooltips: Pointing to actual UI elements (e.g., "This is your project dashboard," "Click here to add a new task").

* Navigation: "Next" button, "Back" button (for carousel), "End Tour" or "Skip Tour" button.

* Progress Dots/Numbers: Indicating position within the tour.

* Optional: Short animated GIF/Video: Demonstrating a complex action.

  • Detailed Design Specifications:

* Overlay Background: Semi-transparent Dark Gray (#343A40 with 0.8 opacity) to dim the underlying UI.

* Tooltip/Card: White background, rounded corners, subtle shadow.

* H3: Inter Semi-Bold, 20px, Dark Gray (#343A40).

* Body Text: Inter Regular, 16px, Medium Gray (#6C757D).

* Highlighting: A subtle pulse animation or a glow effect around the targeted UI element.

* Navigation Buttons: Primary Brand Color for "Next," Secondary Brand Color for "Skip/End."

  • UX Recommendations:

* Keep it Short: Focus on 2-3 critical features that provide immediate value.

* Interactive: Encourage clicks and direct interaction rather than passive viewing.

* Contextual: Show features in the context of the actual product interface.

* "Aha!" Moment: Aim to guide the user to their first success within the product.

5.5. Screen 5: First Action / Goal Setting

  • Purpose: Prompt the user to take their first meaningful action, reinforcing the product's utility.
  • Wireframe Description:

* Layout: Prominent call to action, potentially with examples or templates.

* Elements:

* H2 Title: "Let's create your first [item/project/goal]!"

* Call to Action: A large, central button.

*Examples/Templates (Optional

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