Schema Markup Generator
Run ID: 69c955daa17964d77e86e1492026-03-29SEO
PantheraHive BOS
BOS Dashboard

This deliverable provides comprehensive JSON-LD structured data markup examples for the specified page types. Each example includes a typical structure, placeholder values, an explanation of key fields, and guidance on implementation.


Schema Markup Generator: JSON-LD Structured Data Output

This section provides a detailed set of JSON-LD structured data examples for various page types. You can copy, paste, and customize these templates to enhance your website's visibility in search engine results.


1. Article Schema Markup

Use this markup for blog posts, news articles, informational pages, or any textual content that can be classified as an article.

JSON-LD Example

text • 1,190 chars
#### Key Fields Explained

*   `@context`: Always `https://schema.org/`.
*   `@type`: Specifies the type of content, `Product`.
*   `name`: The name of the product.
*   `image`: An array of URLs for product images.
*   `description`: A detailed description of the product.
*   `sku`: Stock Keeping Unit (unique identifier for the product).
*   `mpn`: Manufacturer Part Number.
*   `brand`: The brand of the product.
*   `review` (Optional): Individual customer reviews.
*   `aggregateRating` (Optional): The overall rating and number of reviews.
*   `offers`: Details about the product's availability and pricing.
    *   `priceCurrency`: Currency of the price (e.g., USD, EUR).
    *   `price`: The current price of the product.
    *   `availability`: Status of the product (e.g., `InStock`, `OutOfStock`).
    *   `itemCondition`: Condition of the item (e.g., `NewCondition`, `UsedCondition`).
    *   `seller`: The entity selling the product.

---

### 3. FAQPage Schema Markup

Apply this markup to pages that feature a list of frequently asked questions and their corresponding answers. This can result in an expandable rich result directly in search results.

#### JSON-LD Example

Sandboxed live preview

Schema Markup Generator: Step 1 of 2 - Generate Initial Markup

Welcome to Step 1 of your "Schema Markup Generator" workflow! This crucial initial phase focuses on gathering the necessary details from you to generate accurate and effective JSON-LD structured data markup for your web page.

Workflow Context

  • Workflow: Schema Markup Generator
  • Step: gemini → generate (Initial Data Collection & Markup Generation)
  • Description: Generate JSON-LD structured data markup for any page type: Article, Product, FAQ, HowTo, LocalBusiness.

Understanding Schema Markup (JSON-LD)

Schema Markup, specifically in JSON-LD (JavaScript Object Notation for Linked Data) format, is a standardized vocabulary that you can add to your website's HTML to help search engines better understand the content on your pages. By providing explicit clues about the meaning of your content, you enable search engines to display your pages more prominently in search results through rich snippets, carousels, and other enhanced features. This can significantly improve your page's visibility, click-through rates, and overall SEO performance.

Purpose of This Step: Data Collection and Initial Generation

To generate comprehensive, detailed, and professional JSON-LD schema markup tailored to your specific page, we require key information about your content. This step will guide you through the data points needed for each supported page type. Once you provide this information, we will generate the appropriate JSON-LD script block for you.

Required Information for Schema Generation

Please select the type of page you wish to generate schema for and provide the requested details. The more complete and accurate your information, the more robust and beneficial the generated schema will be.


1. For an Article Page (Article Schema)

This schema is ideal for blog posts, news articles, and informational content.

  • URL of the Article (@id): The full canonical URL of the article page (e.g., https://www.example.com/blog/my-great-article).
  • Headline: The main title of the article (e.g., "10 Tips for Boosting Your Website's SEO").
  • Description: A concise summary of the article's content (e.g., "Discover ten actionable strategies to improve your website's search engine ranking and drive more organic traffic.").
  • Image URL: The URL of the main image associated with the article. This should be a high-quality, representative image (e.g., https://www.example.com/images/seo-tips.jpg).
  • Date Published: The original publication date of the article (ISO 8601 format, e.g., 2023-10-27T08:00:00+00:00).
  • Date Modified (Optional): The last modification date, if the article has been updated (ISO 8601 format, e.g., 2024-03-15T14:30:00+00:00).
  • Author Name: The name of the author (e.g., "Jane Doe").
  • Author URL (Optional): A URL to the author's profile page (e.g., https://www.example.com/authors/jane-doe).
  • Publisher Name: The name of the organization publishing the article (e.g., "PantheraHive Solutions").
  • Publisher Logo URL: The URL of the publisher's logo (e.g., https://www.example.com/images/pantherahive-logo.png).

2. For a Product Page (Product Schema)

This schema is essential for e-commerce product pages to display rich results like price, availability, and ratings.

  • URL of the Product Page (@id): The full canonical URL of the product page (e.g., https://www.example.com/products/premium-widget).
  • Product Name: The full name of the product (e.g., "Premium Widget Pro 2000").
  • Image URL: The URL of the main product image (e.g., https://www.example.com/images/widget-pro-2000.jpg).
  • Description: A detailed description of the product (e.g., "The Widget Pro 2000 offers unparalleled performance and durability for all your needs...").
  • SKU (Stock Keeping Unit - Optional): The product's SKU (e.g., WIDGET-PRO-2000).
  • MPN (Manufacturer Part Number - Optional): The product's MPN (e.g., MPN-WP2K-XYZ).
  • Brand Name: The brand of the product (e.g., "Acme Innovations").
  • Offer Details:

* Price: The current price of the product (e.g., 99.99).

* Currency: The currency code (ISO 4217 format, e.g., USD, EUR).

* Availability: The product's availability (e.g., https://schema.org/InStock, https://schema.org/OutOfStock, https://schema.org/PreOrder).

* Item Condition (Optional): The condition of the item (e.g., https://schema.org/NewCondition, https://schema.org/UsedCondition).

* Offer URL (Optional): The URL where the product can be purchased, if different from the main product page URL.

  • Aggregate Rating (Optional, if applicable):

* Rating Value: The average rating (e.g., 4.5).

* Review Count: The total number of reviews (e.g., 125).

  • Review Snippets (Optional): If you have specific reviews to highlight, provide:

* Author Name: The name of the reviewer.

* Rating Value: The rating given by this reviewer.

* Review Body: The text of the review.

* Date Published: The date the review was published.


3. For an FAQ Page (FAQPage Schema)

This schema helps display your frequently asked questions directly in search results as expandable snippets.

  • URL of the FAQ Page (@id): The full canonical URL of the FAQ page (e.g., https://www.example.com/faq).
  • List of Questions & Answers: For each FAQ item, provide:

* Question: The full text of the question (e.g., "What payment methods do you accept?").

* Answer: The full text of the answer to that question (e.g., "We accept Visa, MasterCard, American Express, PayPal, and bank transfers.").


4. For a HowTo Page (HowTo Schema)

This schema is perfect for step-by-step guides, recipes, or instructional content.

  • URL of the HowTo Page (@id): The full canonical URL of the how-to page (e.g., https://www.example.com/guides/install-software).
  • How-To Name: The title of the guide (e.g., "How to Install Our Software").
  • Description: A brief overview of what the guide teaches (e.g., "A step-by-step guide to successfully installing our software on Windows and Mac operating systems.").
  • Image URL (Optional): A representative image for the how-to guide (e.g., https://www.example.com/images/software-install.jpg).
  • Total Time (Optional): The estimated total time to complete the task (ISO 8601 duration format, e.g., PT30M for 30 minutes, PT1H15M for 1 hour 15 minutes).
  • Estimated Yield (Optional): What the process yields (e.g., "1 perfectly installed software application", "4 servings").
  • Supplies (Optional): A list of items needed (e.g., "USB Drive", "Internet Connection").
  • Tools (Optional): A list of tools required (e.g., "Screwdriver", "Computer").
  • Steps: For each step in the process, provide:

* Step Name: A short title for the step (e.g., "Download the Installer").

* Step Text: Detailed instructions for the step (e.g., "Navigate to our download page and click the 'Download Now' button for your operating system.").

* Step Image URL (Optional): An image illustrating this specific step.

* Step URL (Optional): A URL directly linking to this step if anchored within the page.


5. For a Local Business Page (LocalBusiness Schema)

This schema helps local businesses stand out in local search results, Google Maps, and the Knowledge Panel.

  • URL of the Business Page (@id): The full canonical URL of your business's primary page (e.g., https://www.example.com/contact-us).
  • Business Name: Your official business name (e.g., "PantheraHive Coffee Shop").
  • Business Type (Optional, but recommended): A more specific type if available (e.g., Restaurant, Dentist, Store, ProfessionalService). If not specified, LocalBusiness will be used.
  • Image URL: The URL of your business logo or a representative photo (e.g., https://www.example.com/images/coffeeshop-exterior.jpg).
  • Address:

* Street Address: (e.g., "123 Main St").

* Locality (City): (e.g., "Anytown").

* Region (State/Province): (e.g., "CA").

* Postal Code: (e.g., "90210").

* Country: (e.g., "USA").

  • Telephone Number: Your primary contact phone number (e.g., +1-555-123-4567).
  • Website URL (url): Your official website URL (e.g., https://www.example.com).
  • Price Range (Optional): A general indication of your price level (e.g., $ for inexpensive, $$$ for moderately expensive).
  • Geolocation (Optional, but highly recommended):

* Latitude: (e.g., 34.052235).

* Longitude: (e.g., -118.243683).

  • Opening Hours (Optional): For each day of the week, specify:

* Day: (e.g., Monday, Tuesday, Saturday).

* Opens: Opening time (e.g., 08:00).

* Closes: Closing time (e.g., 17:00).

  • Same As (Optional): URLs of your social media profiles or other official presences (e.g., https://twitter.com/pantherahive, https://facebook.com/pantherahive).

How to Provide Information

Please respond with the page type you need schema for, followed by a clear, bulleted list of the requested details for that specific type.

Example Input Format:


Page Type: Product

*   URL of the Product Page: https://www.example.com/products/super-blender-x
*   Product Name: Super Blender X-treme
*   Image URL: https://www.example.com/images/blender-x.jpg
*   Description: The ultimate kitchen appliance for smoothies, soups, and more.
*   Brand Name: BlendMaster
*   Offer Details:
    *   Price: 199.99
    *   Currency: USD
    *   Availability: https://schema.org/InStock
*

json

{

"@context": "https://schema.org",

"@type": "Restaurant",

"name": "The Gourmet Bistro",

"image": "https://www.example.com/images/gourmet-bistro-exterior.jpg",

"address": {

"@type": "PostalAddress",

"streetAddress": "123 Main Street",

"addressLocality": "Anytown",

"addressRegion": "CA",

"postalCode": "90210",

"addressCountry": "US"

},

"geo": {

"@type": "GeoCoordinates",

"latitude": "34.072222",

"longitude": "-118.407778"

},

"url": "https://www.example.com/the-gourmet-bistro",

"telephone": "+15551234567",

"priceRange": "$$",

schema_markup_generator.txt
Download source file
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);}});}