pSEO Template Designer
Run ID: 69c955daa17964d77e86e1432026-03-29SEO
PantheraHive BOS
BOS Dashboard

Design programmatic SEO page templates with dynamic variables, schema markup, and content patterns.

pSEO Template Designer - Step 1/2: Template Generation

This deliverable outlines the comprehensive programmatic SEO (pSEO) page templates, designed to generate high-ranking, dynamic, and user-friendly content at scale. These templates incorporate dynamic variables, structured schema markup, and repeatable content patterns to ensure both search engine visibility and an excellent user experience.


1. Introduction to Programmatic SEO Templates

Programmatic SEO leverages data to automatically generate thousands or millions of unique, optimized landing pages. This step focuses on designing the foundational templates that will drive this generation. Our goal is to create a robust, flexible, and scalable template structure that can be applied across various data sets and target keywords.

The following templates are designed for a common pSEO use case: Location-Based Service Pages. This example allows us to demonstrate a wide range of dynamic variables, content patterns, and relevant schema markup.

Example Scenario: A company offering "Home Cleaning Services" across various cities and states.

Target Page Type: "Home Cleaning Services in [City], [State]"


2. Core Principles of pSEO Template Design

  • Scalability: Design patterns that work for thousands of pages without manual intervention.
  • Uniqueness: Ensure each generated page feels unique and valuable, avoiding duplicate content issues.
  • Relevance: Dynamically inject data that is highly relevant to the specific search query and location.
  • User Experience (UX): Prioritize readability, clear calls to action, and helpful information for the user.
  • Search Engine Optimization (SEO): Implement best practices for meta-data, headings, content structure, and schema markup.
  • Flexibility: Allow for easy updates and A/B testing of different sections or variables.

3. Dynamic Variable Definitions

The following is a list of dynamic variables proposed for the "Location-Based Service Page" template. These variables will be populated from your data source (e.g., a spreadsheet, database, or API).

| Variable Name | Example Value (for "Home Cleaning Services in Austin, TX") | Description |

| :----------------------------- | :--------------------------------------------------------- | :----------------------------------------------------------------------- |

| {{SERVICE_NAME}} | "Home Cleaning" | The primary service offered. |

| {{CITY}} | "Austin" | The target city for the service. |

| {{STATE_ABBR}} | "TX" | The abbreviation for the target state. |

| {{STATE_FULL}} | "Texas" | The full name of the target state. |

| {{ZIP_CODE}} | "78701" | A representative ZIP code for the city (for LocalBusiness schema). |

| {{REGION}} | "Central Texas" | A broader geographical region (optional, for contextual content). |

| {{COMPANY_NAME}} | "SparkleClean" | Your company's name. |

| {{COMPANY_PHONE}} | "+1-800-CLEANER" | Your company's primary contact phone number. |

| {{COMPANY_EMAIL}} | "info@sparkleclean.com" | Your company's primary contact email. |

| {{COMPANY_ADDRESS}} | "123 Main St, Austin, TX 78701" | Your company's local address (if applicable, for LocalBusiness schema). |

| {{COMPANY_RATING}} | "4.9" | Average customer rating. |

| {{NUMBER_OF_REVIEWS}} | "500+" | Total number of customer reviews. |

| {{USP_1}} | "eco-friendly products" | Unique Selling Proposition 1. |

| {{USP_2}} | "experienced professionals" | Unique Selling Proposition 2. |

| {{PROBLEM_1}} | "busy schedules" | Common customer problem the service solves. |

| {{SOLUTION_1}} | "flexible scheduling" | Solution offered by the service. |

| {{BENEFIT_1}} | "more free time" | Key benefit for the customer. |

| {{SERVICE_BULLET_1}} | "Deep cleaning" | Specific service offering 1. |

| {{SERVICE_BULLET_2}} | "Regular maintenance" | Specific service offering 2. |

| {{SERVICE_BULLET_3}} | "Move-in/Move-out cleaning" | Specific service offering 3. |

| {{PRIMARY_CTA_TEXT}} | "Get a Free Quote" | Text for the primary Call to Action button. |

| {{PRIMARY_CTA_LINK}} | /quote?city={{CITY}} | URL for the primary Call to Action. |

| {{SECONDARY_CTA_TEXT}} | "Call Us Now" | Text for the secondary Call to Action. |

| {{SECONDARY_CTA_LINK}} | tel:{{COMPANY_PHONE}} | URL for the secondary Call to Action. |

| {{FAQ_Q1}} / {{FAQ_A1}} | "How much does home cleaning cost in Austin?" / "Our pricing..." | Question/Answer pair for FAQ section. (Repeat for Q2/A2, etc.) |

| {{RELATED_SERVICE_1}} | "Office Cleaning" | Name of a related service. |

| {{RELATED_SERVICE_LINK_1}} | /office-cleaning/{{CITY}} | URL for a related service page. |

| {{IMAGE_HERO_URL}} | /images/hero-home-cleaning-austin.jpg | URL for the hero image (can be dynamic or static per service/city). |

| {{IMAGE_ALT_TEXT_HERO}} | "Professional home cleaning in Austin, TX" | Alt text for the hero image. |


4. SEO Meta-Data Template

These templates define how the critical SEO elements will be generated for each page.

  • Title Tag (<title>):

{{SERVICE_NAME}} in {{CITY}}, {{STATE_ABBR}} | {{COMPANY_NAME}} - Get a Free Quote Today!

* Example: Home Cleaning in Austin, TX | SparkleClean - Get a Free Quote Today!

* Purpose: Primary ranking factor, appears in SERPs. Optimized for target keyword and user intent.

  • Meta Description (<meta name="description">):

Looking for reliable {{SERVICE_NAME}} in {{CITY}}, {{STATE_FULL}}? {{COMPANY_NAME}} offers {{USP_1}} and {{USP_2}}. Get your free quote and reclaim your time!

* Example: Looking for reliable Home Cleaning in Austin, Texas? SparkleClean offers eco-friendly products and experienced professionals. Get your free quote and reclaim your time!

* Purpose: Influences click-through rate (CTR) from SERPs. Summarizes page content with keywords and a call to action.

  • Canonical URL (<link rel="canonical">):

https://www.yourdomain.com/{{SERVICE_SLUG}}/{{CITY_SLUG}}

* Example: https://www.yourdomain.com/home-cleaning/austin

* Purpose: Prevents duplicate content issues by specifying the preferred version of a page. Requires a URL slug generation logic.

  • H1 Heading (<h1>):

{{SERVICE_NAME}} Services in {{CITY}}, {{STATE_FULL}} - Your Local Experts

* Example: Home Cleaning Services in Austin, Texas - Your Local Experts

* Purpose: The main heading of the page, reinforcing the primary keyword and topic.


5. Page Content Section Templates

This section details the structure and content patterns for the main body of the page. Each section utilizes dynamic variables to ensure relevance and uniqueness.

5.1. Hero Section

  • Visual: {{IMAGE_HERO_URL}} with alt="{{IMAGE_ALT_TEXT_HERO}}"
  • Headline: <h1>{{SERVICE_NAME}} Services in {{CITY}}, {{STATE_FULL}} - Your Local Experts</h1>
  • Sub-headline/Intro Paragraph:

Searching for top-rated {{SERVICE_NAME}} in {{CITY}}, {{STATE_FULL}}? Look no further than {{COMPANY_NAME}}! We provide exceptional cleaning solutions designed to give you back your precious time. Discover why residents in {{CITY}} trust us for their home cleaning needs.

  • Primary CTA:

<a href="{{PRIMARY_CTA_LINK}}" class="button primary">{{PRIMARY_CTA_TEXT}}</a>

* Example: <a href="/quote?city=Austin" class="button primary">Get a Free Quote</a>

5.2. Problem & Solution Section

  • Headline: <h2>Tired of the Mess? We Have the {{SERVICE_NAME}} Solution for {{CITY}}!</h2>
  • Content:

We understand that residents in {{CITY}} lead busy lives. Between work, family, and enjoying all that {{CITY}} has to offer, finding time for thorough home cleaning can be a challenge. That's where {{COMPANY_NAME}} comes in. We tackle the common problem of {{PROBLEM_1}} with our {{SOLUTION_1}}, ensuring your home is spotless without you lifting a finger.

  • Key Benefits List:

With {{COMPANY_NAME}}, you'll enjoy:

* More time to focus on what matters most.

* A sparkling clean home, every time.

* Peace of mind knowing your home is in expert hands.

* Flexible scheduling options to fit your lifestyle.

5.3. Our {{SERVICE_NAME}} Offerings in {{CITY}}

  • Headline: <h2>Comprehensive {{SERVICE_NAME}} Offerings Tailored for {{CITY}} Homes</h2>
  • Content:

At {{COMPANY_NAME}}, we pride ourselves on delivering a wide range of high-quality {{SERVICE_NAME}} services throughout {{CITY}} and the surrounding {{REGION}}. Our skilled team is equipped to handle various needs, ensuring your home receives the attention it deserves.

  • Service List (Bullet Points or Grid):

* {{SERVICE_BULLET_1}}: Perfect for a complete refresh of your home.

* {{SERVICE_BULLET_2}}: Keep your home consistently tidy with scheduled visits.

* {{SERVICE_BULLET_3}}: Ideal for tenants or landlords moving in or out of properties.

Add more dynamic service bullet points as needed*

5.4. Why Choose {{COMPANY_NAME}} for {{SERVICE_NAME}} in {{CITY}}?

  • Headline: <h2>Why {{CITY}} Residents Trust {{COMPANY_NAME}} for Their Cleaning Needs</h2>
  • Content:

When it comes to selecting a {{SERVICE_NAME}} provider in {{CITY}}, you want a company that's reliable, thorough, and trustworthy. Here's what sets {{COMPANY_NAME}} apart:

  • Value Proposition List:

* {{USP_1}}: We care about your health and the environment.

* {{USP_2}}: Our team members are rigorously vetted and highly trained.

* Customer Satisfaction: We're committed to exceeding your expectations with every clean.

`*Local Expertise

gemini Output

pSEO Template Design: Service-Location Page Template

This document outlines a comprehensive programmatic SEO (pSEO) page template designed for service-based businesses targeting specific locations. It incorporates dynamic variables, structured content patterns, and essential schema markup to ensure high visibility, relevance, and scalability across thousands of unique pages.

Template Name: Service-Location pSEO Template

Target Use Case: Generating dedicated pages for specific services offered in various geographical locations (e.g., "Emergency Plumbing in Austin," "HVAC Repair in Dallas," "Roofing Services in Houston").


1. Dynamic Variables Dictionary

The core of pSEO lies in dynamic variables. These placeholders will be populated from a data source (e.g., a spreadsheet, database) to create unique content for each page.

| Variable Name | Example Value (for "Emergency Plumbing in Austin") | Description |

| :---------------------------- | :------------------------------------------------- | :--------------------------------------------------------------- |

| {{service_name}} | Emergency Plumbing | The primary service offered on the page. |

| {{service_category}} | Plumbing | Broader category of the service. |

| {{location_name}} | Austin | The city or specific location targeted. |

| {{location_state}} | Texas | The state where the location is situated. |

| {{company_name}} | Panthera Plumbers | Your company's official name. |

| {{company_phone}} | (512) 123-4567 | Main contact phone number. |

| {{company_email}} | info@pantheraplumbers.com | Main contact email. |

| {{company_address}} | 123 Main St, Austin, TX 78701 | Physical address of the business (if applicable). |

| {{company_slogan}} | Your Trusted Local Plumbers | A short, impactful company slogan. |

| {{usp_1}} | 24/7 Emergency Service | Unique Selling Point 1. |

| {{usp_2}} | Certified & Experienced Technicians | Unique Selling Point 2. |

| {{usp_3}} | Upfront Pricing | Unique Selling Point 3. |

| {{cta_phrase}} | Get a Free Quote | Primary Call to Action phrase. |

| {{cta_link}} | /contact-us | URL for the primary Call to Action. |

| {{service_benefit_1}} | Rapid Response Times | Key benefit of the service. |

| {{service_benefit_2}} | Long-Lasting Solutions | Another key benefit. |

| {{service_problem_statement}}| burst pipes, clogged drains, or water heater failures | Common problems the service addresses. |

| {{related_service_1}} | Drain Cleaning | A related service offered by the company. |

| {{related_service_link_1}} | /drain-cleaning-austin | URL for {{related_service_1}}. |

| {{faq_q1}} | What areas do you serve for emergency plumbing? | Frequently Asked Question 1. |

| {{faq_a1}} | We provide emergency plumbing services throughout {{location_name}} and the surrounding {{location_state}} areas. | Answer to FAQ 1. |

| {{faq_q2}} | How quickly can you respond to an emergency? | Frequently Asked Question 2. |

| {{faq_a2}} | Our team aims for the fastest possible response, typically arriving within 60 minutes for emergency calls in {{location_name}}. | Answer to FAQ 2. |


2. Page Template Structure & Content Patterns

This section details the layout and content patterns for a single pSEO page. Variables are enclosed in {{ }}.

2.1. Meta Information

  • Title Tag (<title>):

{{service_name}} in {{location_name}}, {{location_state}} - {{company_name}}

Example: Emergency Plumbing in Austin, Texas - Panthera Plumbers

  • Meta Description (<meta name="description">):

Need {{service_name}} in {{location_name}}? {{company_name}} offers {{usp_1}} and {{usp_2}} for homes & businesses. Call us now for reliable service!

Example: Need Emergency Plumbing in Austin? Panthera Plumbers offers 24/7 Emergency Service and Certified & Experienced Technicians for homes & businesses. Call us now for reliable service!

  • Canonical Tag (<link rel="canonical">):

https://www.yourdomain.com/{{service_category | slug}}/{{service_name | slug}}-{{location_name | slug}}/

(Note: | slug indicates a transformation to a URL-friendly format)

Example: https://www.yourdomain.com/plumbing/emergency-plumbing-austin/

2.2. Hero Section

  • H1 (Main Heading):

Expert {{service_name}} in {{location_name}}, {{location_state}} - Fast & Reliable Service

Example: Expert Emergency Plumbing in Austin, Texas - Fast & Reliable Service

  • Introductory Paragraph:

When you're facing a {{service_problem_statement}} in {{location_name}}, you need immediate and reliable help. {{company_name}} is your trusted local provider for professional {{service_name}} services, ensuring your home or business is back to normal as quickly as possible. We pride ourselves on {{usp_1}} and delivering {{service_benefit_1}} to our community.

Example: When you're facing a burst pipes, clogged drains, or water heater failures in Austin, you need immediate and reliable help. Panthera Plumbers is your trusted local provider for professional Emergency Plumbing services, ensuring your home or business is back to normal as quickly as possible. We pride ourselves on 24/7 Emergency Service and delivering Rapid Response Times to our community.

  • Key Value Proposition / CTA Block:

* Sub-heading (H2/H3): Why Choose {{company_name}} for {{service_name}} in {{location_name}}?

* Bullet Points:

* {{usp_1}} around the clock.

* {{usp_2}} guaranteeing quality.

* Transparent, {{usp_3}} for peace of mind.

* Primary Call to Action Button:

[ {{cta_phrase}} Today! ] (Link to {{cta_link}})

Or Call: {{company_phone}}

2.3. Service Details & Benefits Section

  • H2: Comprehensive {{service_name}} Solutions for {{location_name}} Residents

Example: Comprehensive Emergency Plumbing Solutions for Austin Residents

  • Paragraph 1:

At {{company_name}}, we understand the urgency of plumbing emergencies. Our team is equipped to handle a wide range of issues, from minor leaks to major pipe bursts, ensuring minimal disruption to your daily life. We're committed to providing {{service_benefit_2}} that you can count on.

  • H3: Our {{service_name}} Process

* Numbered List:

1. Rapid Dispatch: Upon your call to {{company_phone}}, we dispatch a certified technician to your {{location_name}} property immediately.

2. Thorough Assessment: Our expert assesses the situation to pinpoint the exact cause of the problem.

3. Transparent Solutions: We provide a clear explanation of the issue and an upfront quote for the necessary repairs.

4. Efficient Repair: Utilizing advanced tools and techniques, we resolve the problem efficiently and effectively.

5. Follow-Up: We ensure everything is working perfectly and offer tips for prevention.

2.4. Local Relevance Section

  • H2: Serving the Entire {{location_name}} Community

Example: Serving the Entire Austin Community

  • Paragraph:

{{company_name}} is proud to be a local business deeply rooted in {{location_name}}, {{location_state}}. We understand the unique plumbing challenges faced by properties in our area, from historic homes to modern developments. Our commitment extends to all neighborhoods, ensuring every resident has access to top-tier {{service_name}} when they need it most.

2.5. Frequently Asked Questions (FAQ) Section

  • H2: Frequently Asked Questions About {{service_name}} in {{location_name}}

Example: Frequently Asked Questions About Emergency Plumbing in Austin

  • Q&A List:

* Q: {{faq_q1}}

* A: {{faq_a1}}

* Q: {{faq_q2}}

* A: {{faq_a2}}

(Add 1-3 more Q&A pairs, using variables like {{faq_q3}}, {{faq_a3}})*

2.6. Related Services / Internal Linking

  • H2: Explore Our Other {{service_category}} Services in {{location_name}}

Example: Explore Our Other Plumbing Services in Austin

  • Bullet Points / Links:

* [ {{related_service_1}} ] (Link to {{related_service_link_1}})

* [ Water Heater Repair ] (Link to /water-heater-repair-austin/)

* [ Leak Detection ] (Link to /leak-detection-austin/)

(Dynamically generate more related service links based on available data)*

2.7. Final Call to Action

  • H2: Don't Wait - Contact {{company_name}} for {{service_name}} Now!

Example: Don't Wait - Contact Panthera Plumbers for Emergency Plumbing Now!

  • Paragraph:

Facing a plumbing emergency in {{location_name}}? Don't let it escalate. Our team is ready 24/7 to provide prompt, professional, and effective {{service_name}}. Reach out to us for immediate assistance.

  • Call to Action Button:

[ Call {{company_name}} at {{company_phone}} ] (Link to tel:{{company_phone}})

[ Request Service Online ] (Link to {{cta_link}})


3. Schema Markup Implementation (JSON-LD)

Schema markup helps search engines understand the content and context of your page, improving its chances for rich results. This template includes Service, LocalBusiness, FAQPage, and BreadcrumbList schema.


<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Service",
      "name": "{{service_name}} in {{location_name}}",
      "description": "Expert {{service_name}} services provided by {{company_name}} in {{location_name}}, {{location_state}}. We offer {{usp_1}}, {{usp_2}}, and {{usp_3}}.",
      "serviceType": "{{service_name}}",
      "provider": {
        "@type": "LocalBusiness",
        "name": "{{company_name}}",
        "address": {
          "@type": "PostalAddress",
          "streetAddress": "{{company_address | street}}",
          "addressLocality": "{{location_name}}",
          "addressRegion": "{{location_state}}",
          "postalCode": "{{company_address | postal_code}}",
          "addressCountry": "US"
        },
        "telephone": "{{company_phone}}",
        "email": "{{company_email}}",
        "url": "https://www.yourdomain.com",
        "priceRange": "$$",
        "image": "https://www.yourdomain.com/path/to/company-logo.png",
        "hasMap": "https://www.google.com/maps/search/{{company_name}}+{{location_name}}",
        "areaServed": {
          "@type": "Place",
          "name": "{{location_name}}"
        },
        "openingHoursSpecification": [
          {
            "@type": "OpeningHoursSpecification",
            "dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
            "opens": "08:00",
            "closes": "17:00"
          },
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);}});}