Mobile App Wireframe Kit
Run ID: 69b6fa0e896970b089464a912026-03-29Design
PantheraHive BOS
BOS Dashboard

Generate a complete mobile app wireframe specification with screen flows, component library, interaction patterns, and developer handoff notes.

Mobile App Wireframe Kit: AI Pulse - Your Daily AI Insights

Project Name: AI Pulse

Description: A mobile application designed to provide users with a personalized and aggregated feed of the latest news, research, and trends in Artificial Intelligence. It aims to empower AI professionals, researchers, students, and enthusiasts to stay informed and discover cutting-edge developments in the rapidly evolving AI landscape.

Topic: AI Technology

Execution Time: 5 min


1. Project Overview

App Concept: AI Pulse acts as a central hub for AI-related content, offering a tailored experience based on user interests. It focuses on delivering high-quality, relevant information efficiently.

Target Audience:

  • AI/ML Engineers and Researchers
  • Data Scientists
  • Tech Entrepreneurs and Innovators
  • Students pursuing AI-related fields
  • Anyone with a strong interest in AI advancements

Key Goals:

  1. Personalized Content Delivery: Provide a highly relevant feed based on user-defined interests and learning algorithms.
  2. Efficient Information Consumption: Offer concise summaries and quick access to full articles, optimizing the user's time.
  3. Content Discovery: Enable users to explore new topics, trending research, and diverse sources within the AI domain.
  4. Engagement & Retention: Foster regular usage through a intuitive interface, valuable content, and interactive features.

2. Screen Flows

This section outlines the primary user journeys through the AI Pulse application, illustrating the sequence of screens and user interactions.

Flow 1: User Onboarding & Interest Personalization

  1. Screen 1.1: Welcome & Onboarding Introduction

* Purpose: Greet new users and introduce the app's value proposition.

* Elements: App logo, catchy tagline (e.g., "Your Daily Dose of AI Intelligence"), "Get Started" button, optional "Skip" or "Log In" for existing users.

* Interaction: Tap "Get Started".

  1. Screen 1.2: Interest Selection

* Purpose: Allow users to select their preferred AI sub-topics for content personalization.

* Elements: Heading ("What AI topics interest you?"), list of selectable tags/pills (e.g., "Machine Learning", "Natural Language Processing", "Computer Vision", "Robotics", "AI Ethics", "Generative AI", "Reinforcement Learning", "AI in Healthcare"), "Continue" button.

* Interaction: Tap on multiple tags to select, tap "Continue".

  1. Screen 1.3: Account Creation / Login

* Purpose: Enable users to create an account or log in.

* Elements: Options for "Sign up with Email", "Continue with Google", "Continue with Apple", "Already have an account? Log In" link.

* Interaction: Select a sign-up method or log in.

  1. Screen 1.4: Initial Home Feed Display

* Purpose: Present the first personalized content feed based on selected interests.

* Elements: Top App Bar (App Title, Search Icon, Filter/Sort Icon), Scrollable list of Article Cards.

* Interaction: Scroll to browse articles.

Flow 2: Browsing & Reading Content

  1. Screen 2.1: Home Feed (Personalized)

* Purpose: Display a dynamic feed of AI news, research, and insights.

* Elements: Top App Bar (Title, Search Icon, Filter/Sort Icon), Bottom Navigation Bar (Home, Explore, Saved, Profile), Scrollable list of Article Cards (Image, Title, Source, Summary snippet, Timestamp, Category Tags).

* Interaction: Scroll vertically to browse, tap on an Article Card to view details.

  1. Screen 2.2: Article Detail View

* Purpose: Show the full content of a selected article.

* Elements: Top App Bar (Back Button, Share Icon, Save Icon), Article Title, Source, Author, Publication Date, Full Article Text/Images/Embeds, related articles section (optional).

* Interaction: Tap "Back" to return to feed, tap "Share" to open sharing options, tap "Save" to add to saved articles.

Flow 3: Exploring New Content & Search

  1. Screen 3.1: Explore Feed

* Purpose: Discover trending topics, popular articles, and new categories beyond personalized interests.

* Elements: Top App Bar (Title, Search Icon), Bottom Navigation Bar (Explore selected), sections like "Trending Now", "Popular Research", "Browse Categories" (e.g., "AI Ethics", "Quantum AI"), scrollable list of Article Cards.

* Interaction: Tap on category filters, scroll to browse, tap on an Article Card.

  1. Screen 3.2: Search Screen

* Purpose: Allow users to search for specific articles, topics, or sources.

* Elements: Search Bar with clear button, "Recent Searches", "Trending Search Terms", search results dynamically updating below the search bar.

* Interaction: Type query, tap on a suggestion, or tap "Search" icon.

  1. Screen 3.3: Search Results

* Purpose: Display articles matching the user's search query.

* Elements: Top App Bar (Search Bar with query, Filter/Sort Icon), list of Article Cards matching the search term.

* Interaction: Tap on an Article Card to view details.

Flow 4: Managing Saved Content

  1. Screen 4.1: Saved Articles

* Purpose: Provide access to articles the user has bookmarked.

* Elements: Top App Bar (Title, Edit/Delete Icon), Bottom Navigation Bar (Saved selected), Scrollable list of Saved Article Cards (similar to Home Feed, but potentially with an "Unsave" option).

* Interaction: Tap on an Article Card to view details, tap "Edit" to manage saved items.


3. Component Library

This section details the reusable UI components that will form the building blocks of the AI Pulse application. Each component includes its name, description, and typical states.

A. Navigation Components:

  1. Bottom Navigation Bar

* Description: Primary navigation at the bottom of the screen, providing quick access to core sections.

* Elements: Icons and labels for "Home", "Explore", "Saved", "Profile".

* States: Active (highlighted icon/label), Inactive.

* Usage: Persistent across most main screens.

  1. Top App Bar (Header)

* Description: Displays screen title, actions, and contextual navigation.

* Elements:

* Standard: App Title/Screen Title.

* With Actions: Search Icon, Filter/Sort Icon, Share Icon, Save Icon.

* With Back Button: Back Arrow Icon.

* States: Default, with various action icons.

* Usage: Top of every screen.

  1. Back Button

* Description: Allows users to navigate to the previous screen.

* Elements: Left-pointing arrow icon, usually in the Top App Bar.

* States: Default.

* Usage: Detail screens, settings.

B. Content Display Components:

  1. Article Card

* Description: A condensed display of an article for feeds.

* Elements: Thumbnail Image (optional), Article Title (H2/H3), Source Name, Short Summary/Snippet (1-2 lines), Timestamp (e.g., "2 hours ago"), Category Tags.

* States: Default, Focused (on tap/hover for web, not applicable for mobile wireframe).

* Usage: Home Feed, Explore Feed, Search Results, Saved Articles.

  1. Category Tag / Pill

* Description: Small, tappable label to categorize content or filter.

* Elements: Text label (e.g., "Machine Learning", "NLP").

* States: Default, Selected (different background/text color).

* Usage: Interest Selection, Article Cards, Explore filters.

C. Input Controls:

  1. Text Input Field

* Description: Allows users to enter text.

* Elements: Label/Placeholder text, input area, optional clear button.

* States: Empty, Focused, Filled, Error (with error message), Disabled.

* Usage: Search Bar, Login/Sign-up forms.

  1. Primary Button

* Description: Main action button, high visual emphasis.

* Elements: Text label (e.g., "Get Started", "Continue", "Log In").

* States: Default, Pressed, Disabled, Loading.

* Usage: Onboarding, form submissions.

  1. Secondary Button / Link

* Description: Less prominent actions, often text-based or outlined.

* Elements: Text label (e.g., "Skip", "Forgot Password?", "View Source").

* States: Default, Pressed, Disabled.

* Usage: Auxiliary actions, navigation links.

  1. Checkbox / Toggle Switch

* Description: Allows users to select multiple options or toggle a setting on/off.

* Elements: Checkbox square / Toggle switch, associated label.

* States: Unchecked/Off, Checked/On, Disabled.

* Usage: Interest Selection, Settings.

D. Feedback & Indicator Components:

  1. Loading Spinner / Progress Indicator

* Description: Visual cue indicating that content is loading or an action is in progress.

* Elements: Animated spinner/circle.

* States: Active, Hidden.

* Usage: While fetching feed data, submitting forms.

  1. Toast Notification

* Description: Small, non-intrusive message appearing temporarily at the bottom of the screen to provide feedback.

* Elements: Short text message (e.g., "Article Saved!").

* States: Visible, Hidden (auto-dismisses).

* Usage: Confirmation of actions.

E. Other Components:

  1. User Avatar / Profile Icon

* Description: Represents the user's profile.

* Elements: Circular image or initial icon.

* States: Default (placeholder), with user image.

* Usage: Profile tab in Bottom Nav, Profile screen.


4. Interaction Patterns

This section describes how users will interact with the AI Pulse app and its components, focusing on common mobile interaction paradigms.

  1. Tap / Click:

* Description: The primary interaction for most UI elements.

* Examples: Tapping buttons (e.g., "Get Started", "Continue"), selecting interest tags, opening an Article Card, navigating via Bottom Navigation Bar icons, tapping search/share/save icons.

* Feedback: Visual change on tap (e.g., button press state, highlight).

  1. Scroll (Vertical):

* Description: Navigating through lists of content or long-form articles.

* Examples: Scrolling through the Home Feed, Explore Feed, Search Results, or the full content of an Article Detail View.

* Feedback: Content moves vertically, scrollbars (if visible).

  1. Pull-to-Refresh:

* Description: A common gesture to refresh content in a feed.

* Examples: Pulling down on the Home Feed or Explore Feed to load the latest articles.

* Feedback: Loading spinner appears at the top, new content loads.

  1. Typing & Search Interaction:

* Description: Entering text into input fields, particularly for search.

* Examples: Tapping the Search Bar, keyboard appears, user types.

* Feedback: Dynamic search results appear as the user types, clear button for input field.

  1. Form Submission:

* Description: Completing and submitting forms (e.g., login, sign-up).

* Examples: Entering credentials and tapping "Log In".

* Feedback: Loading spinner, success message (e.g., toast notification), or error messages (inline validation).

  1. Sharing Content:

* Description: Initiating the device's native sharing capabilities.

* Examples: Tapping the "Share" icon on an Article Detail View.

* Feedback: Native share sheet appears.

  1. Saving Content:

* Description: Toggling the saved status of an article.

* Examples: Tapping the "Save" icon on an Article Detail View.

* Feedback: Icon changes state (e.g., outline to filled), toast notification ("Article Saved!").


5. Developer Handoff Notes

These notes provide essential specifications and considerations for the development team to ensure a smooth transition from wireframes to a functional application.

A. General Specifications:

  • Platform Target: Native iOS (Swift/Objective-C) and Android (Kotlin/Java) or a cross-platform framework (e.g., React Native, Flutter) for efficient development.
  • Responsiveness: All layouts must be responsive and adapt gracefully to various screen sizes and orientations (portrait primary).
  • Accessibility:

* Ensure adequate color contrast ratios (WCAG 2.1 AA standard).

* Provide clear focus states for interactive elements.

* Implement proper semantic markup and alt text for images for screen reader compatibility.

* Support dynamic type/font scaling for users with visual impairments.

  • Performance: Prioritize fast loading times, smooth scrolling, and efficient resource utilization. Implement lazy loading for images and content feeds.

B. Design System & Visual Guidelines (Conceptual):

  • Color Palette:

* Primary (Brand): #007AFF (AI Pulse Blue) - Used for primary buttons, active navigation, key highlights.

* Secondary (Accent): #34C759 (AI Pulse Green) - Used for positive feedback, secondary actions.

* Text Primary: #1C1C1E (Dark Grey)

* Text Secondary: #6A6A6A (Medium Grey)

* Background Primary: #FFFFFF (White)

* Background Secondary: #F2F2F7 (Light Grey) - For card backgrounds, subtle section breaks.

* Error: #FF3B30 (Red)

  • Typography:

* Font Family: SF Pro Display (iOS) / Roboto (Android) - or a single cross-platform choice like Inter.

* Headlines (H1): 28px Bold

* Article Titles (H2): 20px Semibold

* Subheadings (H3): 16px Medium

* Body Text: 15px Regular

* Captions/Metadata: 12px Regular

  • Iconography:

* Source: SF Symbols (iOS) / Material Design Icons (Android) - or a consistent custom SVG icon set.

* Style: Line icons, filled icons for active states.

  • Spacing & Grid System:

* Implement an 8pt grid system for consistent padding, margins, and component spacing.

* Standard margins: 16pt (horizontal), 8pt/16pt (vertical).

  • Corner Radii: Consistent use of 8pt-12pt corner radii for cards, buttons, and input fields.

C. Technical Considerations & Backend Integration:

  • API Integration:

* Requires a robust backend API for content aggregation from various AI news sources, research databases (e.g., arXiv, Google Scholar), and blogs.

* Endpoints for fetching personalized feeds, trending content, search, and individual article details.

* Consider implementing a content caching strategy to improve performance and reduce API calls.

  • Data Storage:

* User authentication (OAuth 2.0 or similar).

* User preferences (selected interests, notification settings).

* Saved articles (local storage/cloud sync).

* Reading history (for personalization algorithms).

  • Personalization Engine:

* Backend logic to filter and rank content based on user interests, past reading behavior, and explicit feedback.

* Consider machine learning models for topic extraction, content recommendation, and anomaly detection in trends.

  • Authentication: Implement secure user authentication (e.g., email/password, Google/Apple Sign-in).
  • Analytics: Integrate analytics SDKs (e.g., Firebase Analytics, Google Analytics, Mixpanel) to track user engagement, feature usage, and content popularity.
  • Error Handling: Implement robust error handling for API failures, network issues, and invalid user input, providing clear feedback to the user.

D. Future Enhancements (Post-MVP Considerations):

  • Offline Reading Mode: Allow users to download articles for reading without an internet connection.
  • Push Notifications: Implement personalized alerts for breaking news, trending topics, or daily digests.
  • AI-powered Summaries: Integrate an AI model to generate concise summaries for long articles.
  • User Contributions: Potentially allow users to submit sources or contribute short insights.
  • Integration with AI Tools: Deep links or integrations with popular AI development tools or platforms.
  • Commenting/Discussion: Add a feature for users to discuss articles.
mobile_app_wireframe_kit.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);}});}