Mobile App Wireframe Kit
Run ID: 69cbaef661b1021a29a8b5cf2026-03-31Design
PantheraHive BOS
BOS Dashboard

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

This document outlines a detailed study plan designed to equip you with the skills and knowledge necessary to create comprehensive "Mobile App Wireframe Kit" specifications. This kit will include screen flows, a robust component library, clear interaction patterns, and effective developer handoff notes.


Study Plan: Mastering Mobile App Wireframe Kit Specification

1. Introduction

This study plan is structured to guide you through the process of understanding, designing, and documenting mobile application wireframes at a professional level. By following this plan, you will develop the practical abilities required to plan the foundational structure and user experience of mobile apps, ensuring clarity and efficiency in the design-to-development pipeline.

2. Learning Objectives

By the end of this study plan, you will be able to:

  • Understand Core Concepts: Grasp the purpose, types, and importance of wireframes in the product development lifecycle, applying fundamental UX/UI design principles.
  • Design User Flows: Create clear and logical user journeys and screen flow diagrams for mobile applications.
  • Build Component Libraries: Develop a consistent, reusable, and well-documented component library tailored for mobile wireframing.
  • Define Interactions: Specify detailed interaction patterns and basic animations within wireframes to communicate user experience effectively.
  • Prepare for Handoff: Compile comprehensive wireframe documentation, including annotations and specifications, optimized for efficient developer handoff.
  • Utilize Professional Tools: Proficiently use industry-standard wireframing and prototyping tools.

3. Weekly Schedule

This 6-week schedule provides a structured path to mastery. Each week builds upon the previous, culminating in a complete wireframe kit specification.


Week 1: Fundamentals of Wireframing & UX Principles

  • Topics:

* Introduction to Wireframing: Definition, purpose, different fidelities (low, mid, high).

* Role in Design Process: How wireframes fit into discovery, ideation, and testing phases.

* Core UX Principles: Usability, accessibility, learnability, feedback, consistency.

* Information Architecture (IA): Organizing content, navigation structures (e.g., hierarchical, flat, hub-and-spoke).

* User Research Basics: Introduction to personas and user stories for context.

  • Activities:

* Research various wireframing examples and different tools.

* Practice sketching low-fidelity wireframes for common app screens (e.g., login, profile, dashboard).

* Read foundational articles on UX principles and IA.

  • Deliverable: Collection of low-fidelity sketches for 3-5 key mobile app screens.

Week 2: Screen Flows & User Journeys

  • Topics:

* User Journey Mapping: Identifying key user tasks, decision points, and emotional states.

* Creating Screen Flows: Diagramming the sequences of screens a user interacts with.

* Flowcharting Best Practices: Standard symbols, connectors, conditional logic for flows.

* Interaction Design Principles: Affordance, signifiers, feedback loops.

* Mobile Navigation Patterns: In-depth look at tabs, drawers (hamburgers), bottom sheets, hierarchical navigation, etc.

  • Activities:

* Choose a simple mobile app idea (e.g., a simple task manager, a recipe browser).

* Define 2-3 core user journeys for your chosen app.

* Create detailed screen flow diagrams, linking your low-fidelity wireframes from Week 1.

  • Deliverable: Annotated screen flow diagrams for 2-3 core user journeys of your chosen app.

Week 3: Component Library Design

  • Topics:

* Atomic Design Principles: Understanding atoms, molecules, organisms for structured design.

* Identifying UI Components: Common mobile elements (buttons, input fields, cards, lists, navigation bars, modals, alerts).

*Designing

gemini Output

This document provides a comprehensive wireframe specification for a mobile application, structured as a machine-readable JSON output. It includes detailed screen flows, a reusable component library, defined interaction patterns, and crucial developer handoff notes. This output serves as a blueprint for both design and development teams, ensuring clarity and consistency throughout the implementation phase.


Mobile App Wireframe Specification: Product Explorer


{
  "app_name": "Product Explorer",
  "app_description": "A mobile application for browsing products, viewing details, and managing a personal wishlist. This specification outlines the core user interface and interaction patterns.",
  "target_platform": "iOS & Android (Cross-platform compatibility is a key consideration)",
  "version": "1.0.0-wireframe",
  "last_updated": "2023-10-27",
  "global_design_tokens": {
    // Defines foundational design properties for consistency across the app.
    "colors": {
      "primary": "#6200EE",
      "primary_variant": "#3700B3",
      "secondary": "#03DAC6",
      "secondary_variant": "#018786",
      "background": "#FFFFFF",
      "surface": "#FFFFFF",
      "error": "#B00020",
      "on_primary": "#FFFFFF",
      "on_secondary": "#000000",
      "on_background": "#000000",
      "on_surface": "#000000",
      "on_error": "#FFFFFF",
      "text_light": "#666666",
      "text_dark": "#333333",
      "border_light": "#EEEEEE",
      "shadow_default": "rgba(0, 0, 0, 0.1)"
    },
    "typography": {
      "font_family_primary": "'Roboto', sans-serif",
      "font_family_secondary": "'Open Sans', sans-serif",
      "h1": { "font_size": "28px", "font_weight": "bold", "line_height": "36px" },
      "h2": { "font_size": "24px", "font_weight": "bold", "line_height": "32px" },
      "h3": { "font_size": "20px", "font_weight": "semibold", "line_height": "28px" },
      "body1": { "font_size": "16px", "font_weight": "regular", "line_height": "24px" },
      "body2": { "font_size": "14px", "font_weight": "regular", "line_height": "20px" },
      "caption": { "font_size": "12px", "font_weight": "regular", "line_height": "16px" },
      "button": { "font_size": "16px", "font_weight": "medium", "line_height": "20px" }
    },
    "spacing": {
      "xxs": "4px",
      "xs": "8px",
      "sm": "12px",
      "md": "16px",
      "lg": "24px",
      "xl": "32px",
      "xxl": "48px"
    },
    "border_radius": {
      "none": "0px",
      "sm": "4px",
      "md": "8px",
      "lg": "12px",
      "full": "9999px"
    },
    "shadows": {
      "elevation_1": "0px 2px 4px 0px var(--shadow_default)",
      "elevation_2": "0px 4px 8px 0px var(--shadow_default)"
    }
  },

  "component_library": {
    // Defines reusable UI components with their properties and states.
    // Each component type should have a unique ID and common properties.
    "buttons": {
      "primary_button": {
        "type": "button",
        "label": "Primary Action",
        "style": "filled",
        "color": "primary",
        "text_color": "on_primary",
        "border_radius": "sm",
        "states": ["enabled", "disabled", "loading", "pressed"],
        "icon_position": ["none", "left", "right"],
        "min_height": "48px"
      },
      "secondary_button": {
        "type": "button",
        "label": "Secondary Action",
        "style": "outlined",
        "color": "primary",
        "text_color": "primary",
        "border_color": "primary",
        "border_width": "1px",
        "border_radius": "sm",
        "states": ["enabled", "disabled", "loading", "pressed"]
      },
      "text_button": {
        "type": "button",
        "label": "Text Action",
        "style": "text",
        "color": "transparent",
        "text_color": "primary",
        "states": ["enabled", "disabled", "pressed"]
      },
      "icon_button": {
        "type": "button",
        "icon": "heart",
        "style": "icon_only",
        "color": "transparent",
        "icon_color": "on_surface",
        "states": ["enabled", "disabled", "pressed", "selected"]
      }
    },
    "inputs": {
      "text_input": {
        "type": "input",
        "label": "Text Input",
        "placeholder": "Enter text...",
        "input_type": "text",
        "states": ["default", "focused", "error", "disabled"],
        "has_label": true,
        "has_helper_text": true,
        "border_radius": "sm",
        "padding": "xs md"
      },
      "search_input": {
        "type": "input",
        "label": "Search",
        "placeholder": "Search products...",
        "input_type": "search",
        "states": ["default", "focused", "empty", "filled"],
        "leading_icon": "search",
        "trailing_icon_clear": "close",
        "border_radius": "full"
      }
    },
    "cards": {
      "product_card": {
        "type": "card",
        "elevation": "elevation_1",
        "border_radius": "md",
        "content_structure": [
          {"element": "image", "role": "product_thumbnail", "aspect_ratio": "1:1"},
          {"element": "text", "role": "product_name", "typography": "body1", "max_lines": 2},
          {"element": "text", "role": "product_price", "typography": "h3", "color": "primary"},
          {"element": "icon_button", "role": "wishlist_toggle", "icon": "heart", "position": "top_right"}
        ]
      },
      "list_item_card": {
        "type": "card",
        "elevation": "none",
        "border_bottom": "1px solid var(--border_light)",
        "padding": "md",
        "content_structure": [
          {"element": "image", "role": "item_thumbnail", "size": "48x48"},
          {"element": "text", "role": "item_title", "typography": "body1"},
          {"element": "text", "role": "item_subtitle", "typography": "caption", "color": "text_light"},
          {"element": "icon", "role": "chevron_right", "position": "right"}
        ]
      }
    },
    "navigation": {
      "top_app_bar": {
        "type": "navigation_bar",
        "height": "56px",
        "background_color": "primary",
        "text_color": "on_primary",
        "elevation": "elevation_1",
        "elements": [
          {"role": "back_button", "icon": "arrow_back", "position": "left", "optional": true},
          {"role": "title", "text": "Screen Title", "typography": "h3", "alignment": "center"},
          {"role": "action_button_1", "icon": "search", "position": "right", "optional": true},
          {"role": "action_button_2", "icon": "more_vert", "position": "right", "optional": true}
        ]
      },
      "bottom_navigation": {
        "type": "navigation_bar",
        "height": "56px",
        "background_color": "surface",
        "elevation": "elevation_2",
        "items": [
          {"id": "home", "label": "Home", "icon": "home"},
          {"id": "search", "label": "Search", "icon": "search"},
          {"id": "wishlist", "label": "Wishlist", "icon": "heart"},
          {"id": "profile", "label": "Profile", "icon": "person"}
        ]
      }
    },
    "loaders": {
      "spinner": {
        "type": "loader",
        "style": "circular",
        "size": ["small", "medium", "large"],
        "color": "primary"
      },
      "skeleton_loader": {
        "type": "loader",
        "style": "skeleton",
        "shapes": ["rectangle", "circle"],
        "animation": "pulse"
      }
    },
    "dialogs": {
      "alert_dialog": {
        "type": "dialog",
        "title": "Alert Title",
        "message": "This is an alert message.",
        "actions": ["Confirm", "Cancel"],
        "dismissible": true
      }
    },
    "toasts": {
      "snackbar": {
        "type": "toast",
        "message": "Action completed successfully.",
        "duration": "short",
        "position": "bottom",
        "action_button": "Dismiss"
      }
    }
  },

  "screens": {
    // Defines each unique screen in the application with its layout and components.
    "splash_screen": {
      "id": "splash_screen",
      "name": "Splash Screen",
      "layout": {
        "type": "center",
        "background_color": "primary",
        "components": [
          {"id": "app_logo", "type": "image", "src": "logo.png", "alt": "App Logo", "size": "128x128"},
          {"id": "app_name_text", "type": "text", "text": "Product Explorer", "typography": "h1", "color": "on_primary", "margin_top": "md"}
        ]
      }
    },
    "product_list_screen": {
      "id": "product_list_screen",
      "name": "Product List (Home)",
      "top_bar": {
        "ref": "component_library.navigation.top_app_bar",
        "props": {
          "title": "Products",
          "has_back
gemini Output

This document outlines the complete wireframe specification for [Your Mobile App Name], providing a foundational blueprint for its structure, user experience, and core functionality. It serves as a critical deliverable for the design and development teams, ensuring a shared understanding of the app's architecture before visual design and development commence.


Mobile App Wireframe Specification v1.0

Date: October 26, 2023

1. Introduction & Overview

This specification details the essential elements of the mobile application's user interface and user experience, focusing on functionality, layout, and user interaction. It includes comprehensive screen flows, a library of reusable UI components, defined interaction patterns, and crucial notes for developers to ensure a smooth transition from concept to implementation.

The primary goal of this document is to:

  • Clearly define the app's navigation and user journeys.
  • Establish a consistent set of UI components for efficiency and uniformity.
  • Outline how users will interact with the app's various elements.
  • Provide actionable guidance for the development team.

2. Screen Flows

This section details the primary user journeys within the application, illustrating the sequence of screens a user will encounter to complete specific tasks. Each flow outlines the screens involved and the typical transitions.

Note: The following flows are illustrative examples for a generic content-driven application. Specific screen names and transitions will be refined based on the final app concept.

2.1. User Onboarding & Authentication Flow

  1. Splash Screen

* Initial app launch, displays app logo/branding briefly.

* Transition: Automatic timeout (e.g., 2-3 seconds) or after initial data load.

* Next Screen: Onboarding Introduction (if first-time user) OR Login/Signup Screen (if not first-time user but not logged in) OR Home Screen (if already logged in).

  1. Onboarding Introduction (Optional)

* Series of 2-3 screens highlighting key features or benefits.

* Screen Elements: Large illustration/animation, title, short description, pagination dots, "Skip" button, "Next" button.

* Transition: Tap "Next" button (advances to next onboarding screen) or Swipe Horizontal (advances to next onboarding screen).

* Next Screen: Login/Signup Screen (after last onboarding screen or "Skip" tap).

  1. Login/Signup Screen

* Allows existing users to log in or new users to register.

* Screen Elements: Email/Username Input Field, Password Input Field, "Login" Button, "Forgot Password?" Link, "Create Account" Link, Social Login Buttons (optional).

* Transition (Login Success): Tap "Login" Button.

* Next Screen (Login Success): Home Screen.

* Transition (Forgot Password): Tap "Forgot Password?" Link.

* Next Screen (Forgot Password): Forgot Password Screen.

* Transition (Create Account): Tap "Create Account" Link.

* Next Screen (Create Account): Registration Form Screen.

  1. Forgot Password Screen

* Allows users to request a password reset.

* Screen Elements: Email Input Field, "Send Reset Link" Button, "Back to Login" Link.

* Transition (Request Sent): Tap "Send Reset Link" Button.

* Next Screen (Request Sent): Password Reset Confirmation Screen (or a simple Toast message).

2.2. Main Content Consumption Flow

  1. Home Screen (Feed)

* Displays a personalized feed of content (e.g., articles, posts, products).

* Screen Elements: Top App Bar (Title, Search Icon, Profile Icon), Content Cards (scrollable list), Bottom Navigation Bar.

* Interaction: Pull-to-refresh (triggers data refresh).

* Transition (View Item): Tap on a Content Card.

* Next Screen (View Item): Item Detail Screen.

* Transition (Search): Tap Search Icon.

* Next Screen (Search): Search Screen.

* Transition (Profile): Tap Profile Icon or Profile tab in Bottom Navigation.

* Next Screen (Profile): Profile Screen.

  1. Item Detail Screen

* Displays full details of a selected content item.

* Screen Elements: Top App Bar (Back Button, Share Icon, More Options Icon), Large Image/Video, Title, Description, Author Info, Action Buttons (e.g., Like, Comment, Save).

* Transition (Back): Tap Back Button.

* Next Screen (Back): Home Screen (Feed).

* Transition (Share): Tap Share Icon.

* Action: Triggers Native Share Sheet.

2.3. Profile Management Flow

  1. Profile Screen

* Displays user's personal information and activity.

* Screen Elements: Top App Bar (Settings Icon), User Avatar, Username, Bio, Tabs (e.g., "My Posts", "Saved Items"), Content List (based on selected tab).

* Transition (Edit Profile): Tap "Edit Profile" Button (if present).

* Next Screen (Edit Profile): Edit Profile Screen.

* Transition (Settings): Tap Settings Icon.

* Next Screen (Settings): Settings Screen.

  1. Settings Screen

* Allows users to configure app preferences and account settings.

* Screen Elements: Top App Bar (Back Button, Title), List of Settings Options (e.g., "Notifications", "Privacy", "Help", "Logout").

* Transition (Logout): Tap "Logout" List Item.

* Action: Displays Confirmation Modal.

* Next Screen (Logout Confirmed): Login/Signup Screen.


3. Component Library

This section details the reusable UI components that form the building blocks of the application. Each component is described with its purpose, common states, and typical usage. This promotes consistency and accelerates development.

3.1. Input Controls

  • Text Input Field:

* Purpose: Allows users to enter text, numbers, or specific data types.

* Variations: Single-line, Multi-line (Text Area), Password (masked input), Email, Number.

* States: Default, Focused, Filled (with content), Error (red border, error message), Disabled.

* Usage: Login forms, search bars, comments, profile editing.

  • Button:

* Purpose: Triggers an action or navigates to another screen.

* Variations:

* Primary: High emphasis, solid background (e.g., "Login", "Create Account").

* Secondary: Medium emphasis, outlined or ghost button (e.g., "Cancel", "Learn More").

* Tertiary (Text-only): Low emphasis, text only (e.g., "Forgot Password?", "Skip").

* States: Default, Pressed/Active, Disabled, Loading (with spinner).

* Usage: Form submissions, primary actions, navigation.

  • Checkbox:

* Purpose: Allows users to select one or more options from a list, or toggle a binary setting.

* States: Unchecked, Checked, Disabled (checked/unchecked).

*

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