Training Course Builder
Run ID: 69cb133842bc43f7e3be72cd2026-03-31Education
PantheraHive BOS
BOS Dashboard

Build a complete training course with modules, lesson plans, quizzes, hands-on exercises, and certification criteria for any subject.

Training Course Builder: Research & Design Requirements

This document outlines the detailed design specifications, wireframe descriptions, color palette, and user experience (UX) recommendations for the "Training Course Builder" platform. The goal is to create an intuitive, powerful, and flexible tool that empowers educators, trainers, and subject matter experts to build comprehensive and engaging training courses.


1. Overall Design Specifications

The platform will be designed with a focus on usability, efficiency, and professional aesthetics.

  • Core Objective: To provide a seamless and comprehensive environment for course creation, management, and deployment, encompassing all necessary elements from content to assessment and certification.
  • Target Audience: Instructional designers, corporate trainers, HR professionals, educators, subject matter experts, and independent course creators.
  • Key Principles:

* User-Centric Design: Intuitive workflows, clear navigation, and minimal cognitive load.

* Modularity: Easy creation and arrangement of modules, lessons, quizzes, and exercises.

* Flexibility: Support for various content types, question formats, and assessment methods.

* Scalability: Architecture to support growth in courses, content, and users.

* Accessibility: Adherence to WCAG guidelines to ensure inclusivity.

* Professional Aesthetic: Clean, modern, and trustworthy visual design.

* Efficiency: Features like autosave, drag-and-drop, and real-time preview to streamline the building process.


2. Wireframe Descriptions (Key Screens & Components)

Below are detailed descriptions for the primary screens and interactive components of the Training Course Builder. These descriptions serve as a blueprint for the visual layout and functionality.

2.1. Dashboard / Course Overview

  • Layout: Central content area for course listings, with a persistent left-hand navigation (optional, or top-bar navigation).
  • Components:

* Header: Logo, user profile/account settings, "Help" or "Support" link.

* "Create New Course" Button: Prominently displayed (e.g., top right or left).

* Course Listing:

* Cards or list view for each course.

* Each card includes: Course Title, Status (Draft, Published, Archived), Progress Indicator (e.g., "70% Complete" in building), Date Created/Last Edited.

* Action Buttons/Dropdown for each course: "Edit Course", "Preview", "Publish/Unpublish", "Manage Learners" (if applicable), "Duplicate", "Archive/Delete".

* Search and Filter: Input field for course titles, filters for status, category, etc.

* Overview Statistics (Optional): Total courses, published courses, pending tasks.

2.2. Course Settings / Basic Information

  • Layout: A multi-step form or tabbed interface for comprehensive course configuration.
  • Components:

* Course Title: Input field (required).

* Course Description: Rich text editor for detailed overview.

* Category/Tags: Dropdown/multi-select for categorization.

* Target Audience: Text area or multi-select describing ideal learners.

* Learning Objectives: List builder (add/remove individual objectives).

* Course Thumbnail/Banner: Image upload with preview and cropping tools.

* Estimated Course Duration: Input field (e.g., "10 hours", "4 weeks").

* Prerequisites (Optional): Text area or link to other courses.

* Course Status: Radio buttons/dropdown (Draft, Published, Private, Archived).

* Save/Cancel Buttons: At the bottom of the form.

2.3. Course Structure Editor (Modules & Lessons)

  • Layout: Two-panel interface. Left panel for structure navigation, right panel for content editing.
  • Components:

* Left Panel (Structure Navigator):

* List of Modules, each with an "Add Lesson" button.

* Lessons nested under their respective modules.

* Drag-and-Drop: Functionality to reorder modules and lessons within modules.

* "Add New Module" button at the bottom of the module list.

* Context menu (three dots icon) for each module/lesson: "Edit Title", "Duplicate", "Delete".

* Right Panel (Content Editor):

* Displays the content editor for the currently selected module or lesson.

* Module Editor: Module Title, Description, Learning Objectives for the module.

* Lesson Editor: Lesson Title, Content Area (see 2.4), Associated Quizzes/Exercises.

* "Preview Course" Button: Top right, allowing a real-time view of the course as a learner.

2.4. Lesson Content Editor

  • Layout: Full-width content editing area within the right panel of the Course Structure Editor.
  • Components:

* Lesson Title: Input field.

* Rich Text Editor (WYSIWYG):

* Standard formatting (bold, italic, underline, lists, headings).

* Image upload/embed.

* Video embed (YouTube, Vimeo, custom upload with player).

* Audio embed.

* Link insertion.

* Code block/preformatted text.

* Table insertion.

* File Attachments: Upload button for PDFs, documents, etc.

* Estimated Lesson Time: Input field.

* Lesson Prerequisites (Optional): Checkbox/dropdown to mark other lessons as prerequisites.

* "Add Quiz" / "Add Exercise" Buttons: To link or create new assessments/activities for the lesson.

* Save/Cancel Buttons.

2.5. Quiz Builder

  • Layout: Dedicated interface for creating and managing quiz questions.
  • Components:

* Quiz Title: Input field.

* Instructions/Description: Rich text editor.

* Question List: Display of all questions in the quiz, with "Edit", "Duplicate", "Delete" actions. Drag-and-drop for reordering.

* "Add New Question" Button: Opens a modal or expands a form to add a question.

* Question Types: Radio buttons/dropdown to select:

* Multiple Choice: Question text, image (optional), list of answer options (add/remove), radio button to mark correct answer(s), explanation for correct/incorrect (optional).

* True/False: Question text, radio buttons for True/False, correct answer selection, explanation.

* Short Answer: Question text, input for expected answer(s) (with options for case sensitivity), explanation.

* Matching: List builder for pairs (e.g., Term A - Definition A).

* Points/Weight: Input field for each question's score.

* Quiz Settings:

* Passing Score (percentage).

* Time Limit (optional, in minutes).

* Number of Attempts.

* Question Randomization (checkbox).

* Show Answers After Submission (checkbox).

* Save/Cancel Buttons.

2.6. Hands-on Exercise Builder

  • Layout: Dedicated interface for defining practical exercises.
  • Components:

* Exercise Title: Input field.

* Instructions: Rich text editor for detailed steps, context, and resources.

* Submission Type: Radio buttons for "Text Input" (learner types directly), "File Upload" (learner uploads a document/code), "External Link" (learner submits URL to external work).

* Required Files/Templates (Optional): File upload for starter files or templates for learners.

* Evaluation Criteria / Rubric: List builder for defining specific criteria, points, and expected outcomes.

* Estimated Completion Time: Input field.

* Sample Solution (Optional): Upload file or rich text for instructors/learners after submission.

* Save/Cancel Buttons.

2.7. Certification Criteria & Settings

  • Layout: Form-based interface for defining certification requirements and customizing certificates.
  • Components:

* Enable Certification: Toggle switch.

* Requirements Checklist:

* "Complete all modules/lessons" (checkbox).

* "Achieve X% overall score on quizzes" (input field for X).

* "Submit all required hands-on exercises" (checkbox).

* "Manual approval by instructor" (checkbox).

* Certificate Template Customization:

* Upload Course Logo.

* Instructor Signature Upload.

* Dynamic Fields: Preview of how learner name, course title, completion date will appear.

* Custom Text Area for additional messaging.

* Preview of the certificate design.

* Automated Issuance: Checkbox to automatically issue certificates upon meeting criteria.

* Save/Cancel Buttons.

2.8. Preview Mode

  • Layout: Switches the builder interface to a learner-facing view.
  • Components:

* Responsive View Toggle: Buttons/icons to switch between Desktop, Tablet, and Mobile views.

* Learner Navigation: Mimics the actual course player navigation (e.g., "Next Lesson", "Previous Lesson", Course Outline).

* Content Display: Renders all content (lessons, quizzes, exercises) as a learner would see it.

* "Exit Preview" Button: To return to the builder interface.


3. Color Palette: "Professional Learning Suite"

A clean, modern, and professional color palette designed for clarity and focus.

  • Primary Accent Color (Blue): Used for primary calls-to-action, active states, important headers, and branding elements.

#0056B3 (Deep Blue) - Main Brand Color*

#007BFF (Lighter Blue) - Hover/Active States*

  • Secondary Accent Color (Teal): Used for secondary actions, highlights, and complementary elements to add visual interest without distraction.

#17A2B8 (Info Teal) - Secondary CTA, Progress Indicators*

#20C997 (Success Green) - Confirmation, Positive Feedback*

  • Neutral Colors: For text, backgrounds, borders, and subtle UI elements, ensuring readability and a clean interface.

#F8F9FA (Light Gray) - Page Backgrounds, Card Backgrounds*

#E9ECEF (Border Gray) - Borders, Dividers*

#DEE2E6 (Input Border Gray) - Input Fields, Inactive States*

#343A40 (Dark Text) - Primary Text, Headings*

#6C757D (Medium Text) - Secondary Text, Descriptions*

#ADB5BD (Light Text) - Placeholder Text, Disabled States*

  • System Feedback Colors:

#DC3545 (Error Red) - Error Messages, Destructive Actions*

#FFC107 (Warning Yellow) - Warning Messages, Cautionary Notes*

#28A745 (Success Green) - Success Messages, Positive Feedback*


4. UX Recommendations

These recommendations focus on enhancing the user experience, making the course builder efficient, enjoyable, and

gemini Output

Training Course Builder: Detailed Design Specifications & UX Strategy

This document outlines the comprehensive design specifications, wireframe descriptions, color palettes, and user experience (UX) recommendations for the "Training Course Builder" application. The goal is to create an intuitive, powerful, and professional tool that enables users to easily build, manage, and publish high-quality training courses with rich content, interactive elements, and clear certification pathways.


1. Detailed Design Specifications

1.1. Core Functional Requirements

The Training Course Builder will provide the following core functionalities:

  • Course Management:

* Create, edit, delete, and duplicate courses.

* Set course title, description, category, target audience, and thumbnail image.

* Define course pricing (if applicable) and access settings (public/private).

* Publish and unpublish courses.

* Save courses as drafts.

  • Module & Lesson Structure:

* Organize courses into hierarchical modules and lessons.

* Drag-and-drop functionality for reordering modules and lessons.

* Set module titles and descriptions.

  • Rich Content Editor for Lessons:

* WYSIWYG editor for text content (formatting, headings, lists, links).

* Support for embedding various media types: images, videos (YouTube, Vimeo, custom uploads), audio.

* Ability to attach downloadable files (PDFs, documents, spreadsheets).

* Code block support for technical courses.

  • Quiz Builder:

* Create multiple-choice, true/false, and short-answer questions.

* Add explanations/feedback for correct and incorrect answers.

* Set passing scores and retake limits.

* Randomize question order within a quiz.

  • Hands-on Exercise Builder:

* Provide detailed instructions and scenarios for practical exercises.

* Define submission types (text input, file upload, URL submission).

* Option to include grading rubrics for instructors.

* Set deadlines (optional).

  • Certification Criteria Definition:

* Define requirements for course completion (e.g., complete all lessons, pass all quizzes, submit all exercises).

* Design customizable digital certificates with dynamic fields (learner name, course title, completion date).

  • Content Library/Asset Management:

* Upload and manage images, videos, and documents centrally.

* Categorize and search assets.

  • Course Preview:

* View the course exactly as a learner would experience it before publishing.

  • Progress Tracking Integration (Implicit):

* The structure built here will integrate with a learner-facing system to track progress, quiz scores, and exercise submissions.

1.2. User Flows (Course Creator Persona)

Flow 1: Creating a New Course

  1. Dashboard: User logs in and clicks "Create New Course."
  2. Course Settings: User enters course title, description, category, and uploads a thumbnail. Clicks "Save & Continue."
  3. Course Editor (Overview): User is directed to the main course editor, showing an empty module structure.
  4. Add Module: User clicks "Add Module," enters module title and description.
  5. Add Lesson: Within the module, user clicks "Add Lesson," selects lesson type (Content, Quiz, Exercise).

* Content Lesson: User uses WYSIWYG editor, embeds media, attaches files. Clicks "Save Lesson."

* Quiz Lesson: User enters quiz title, adds questions (MCQ, T/F, Short Answer), sets answers, feedback, and scoring. Clicks "Save Quiz."

* Exercise Lesson: User enters exercise title, instructions, defines submission type, and optionally adds a rubric. Clicks "Save Exercise."

  1. Repeat: User repeats steps 4-5 to build out the course structure.
  2. Certification: User navigates to "Certification" tab, defines completion criteria, and designs the certificate.
  3. Preview: User clicks "Preview Course" to review the learner experience.
  4. Publish: User clicks "Publish Course" (or "Save Draft").

Flow 2: Editing an Existing Course

  1. Dashboard: User selects an existing course from the list and clicks "Edit."
  2. Course Editor (Overview): User sees the existing course structure.
  3. Modify Content: User clicks on a module or lesson to open its respective editor.
  4. Reorder: User drags and drops modules or lessons to change their order.
  5. Update Settings: User navigates to "Course Settings" tab to modify overall course details.
  6. Save/Publish: User saves changes or publishes the updated course.

1.3. High-Level Content Structure

  • Course:

* ID (Unique Identifier)

* Title

* Description (Rich Text)

* Thumbnail Image URL

* Category

* Target Audience

* Status (Draft, Published, Archived)

* Creation Date, Last Modified Date

* Creator ID

* List of Modules (ordered)

  • Module:

* ID

* Course ID (Foreign Key)

* Title

* Description (Rich Text, optional)

* Order Index

* List of Lessons (ordered)

  • Lesson:

* ID

* Module ID (Foreign Key)

* Title

* Type (Content, Quiz, Exercise)

* Order Index

* Content-Specific Fields (if Type = Content):

* HTML Content (Rich Text)

* List of Media Assets (images, videos, audio)

* List of Downloadable Files

* Quiz-Specific Fields (if Type = Quiz):

* Quiz ID (Foreign Key to Quiz object)

* Exercise-Specific Fields (if Type = Exercise):

* Exercise ID (Foreign Key to Exercise object)

  • Quiz:

* ID

* Lesson ID (Foreign Key)

* Instructions (Rich Text)

* Passing Score (%)

* Retake Limit (e.g., unlimited, 1, 2)

* Randomize Questions (Boolean)

* List of Questions

  • Question:

* ID

* Quiz ID (Foreign Key)

* Type (Multiple Choice, True/False, Short Answer)

* Question Text (Rich Text)

* Options (List of strings, for MCQ/T/F)

* Correct Answer(s) (Index or Text)

* Feedback for Correct Answer (Rich Text, optional)

* Feedback for Incorrect Answer (Rich Text, optional)

  • Exercise:

* ID

* Lesson ID (Foreign Key)

* Instructions (Rich Text)

* Submission Type (Text Input, File Upload, URL)

* Max File Size (if File Upload)

* Allowed File Types (if File Upload)

* Rubric (Rich Text, optional)

* Deadline (Date/Time, optional)

  • Certification:

* ID

* Course ID (Foreign Key)

* Requirements (e.g., "all lessons complete", "all quizzes passed", "all exercises submitted")

* Certificate Template (HTML/CSS or a template ID)

* Dynamic Fields (e.g., {{learner_name}}, {{course_title}}, {{completion_date}})

  • Media Asset:

* ID

* URL

* Type (Image, Video, Audio, Document)

* Uploader ID

* Upload Date


2. Wireframe Descriptions

The following descriptions outline the key screens and their components.

2.1. Dashboard / Course List

  • Layout: Two-column layout. Left sidebar for main navigation (Dashboard, Create Course, Settings, Help). Main content area for course list.
  • Header: Application logo, user profile/avatar, notification icon.
  • Main Content Area:

* "My Courses" Heading: Prominent title.

* "Create New Course" Button: Primary call to action, clearly visible.

* Search/Filter Bar: For courses (by title, category, status).

* Course Cards/List: Each card/row represents a course.

* Elements per card: Course thumbnail, title, brief description, status (Draft/Published), last modified date, progress bar (if showing creator progress), "Edit" button, "Preview" button, "..." menu for more actions (Duplicate, Delete, Archive).

  • Interactions: Clicking "Create New Course" navigates to Course Settings. Clicking "Edit" on a course card opens the Course Editor.

2.2. Course Editor (Overview)

  • Layout: Three-column layout. Left sidebar for course-level navigation (Course Settings, Modules & Lessons, Certification, Preview). Central content area for module/lesson structure. Right sidebar for contextual properties/actions (optional, for quick edits).
  • Header: Course title, "Save Draft" button, "Publish Course" button, "Exit Editor" button.
  • Left Sidebar (Course Navigation):

* "Course Settings" (Edit title, description, image, etc.)

* "Modules & Lessons" (Default view)

* "Certification" (Define criteria, design certificate)

* "Preview Course"

  • Central Content Area (Modules & Lessons):

* "Add Module" Button: Prominent, at the top.

* Module Cards/Sections:

* Module Title Bar: Module title, "..." menu (Edit Module, Delete Module), "Add Lesson" button.

* Lesson List (within module):

* Each lesson is a draggable item.

* Elements per lesson: Lesson icon (e.g., text document, quiz icon, hands-on icon), lesson title, lesson type, "Edit" button, "..." menu (Duplicate, Delete).

* Drag Handle: Visible icon next to modules and lessons for reordering.

  • Interactions: Clicking "Add Module" opens a modal. Clicking "Add Lesson" within a module opens a modal to select lesson type. Clicking "Edit" on a lesson opens the specific lesson editor.

2.3. Lesson Editor (Content Type)

  • Layout: Header, left sidebar (course navigation), and a large central content area for the rich text editor.
  • Header: Lesson title, "Save Lesson" button, "Cancel" button.
  • Central Content Area:

* Lesson Title Input: Editable field.

* WYSIWYG Rich Text Editor:

* Standard formatting toolbar (bold, italic, underline, headings, lists, alignment, links).

* Media Insertion Buttons: "Insert Image," "Insert Video," "Insert Audio," "Attach File."

* Embed Code Button: For custom embeds.

* Code Block Button: For syntax-highlighted code.

* Media/Attachment List: Below the editor, showing embedded/attached items with options to remove or reorder.

  • Interactions: Typing and formatting text, using buttons to insert media (opens a media library or upload modal).

2.4. Quiz Builder

  • Layout: Similar to Lesson Editor. Header, left sidebar, central content area for quiz settings and question list.
  • Header: Quiz title, "Save Quiz" button, "Cancel" button.
  • Central Content Area:

* Quiz Settings Section:

* Quiz Title Input.

* Instructions (Rich Text Editor).

* Passing Score Input (%).

* Retake Limit Selector (Dropdown: Unlimited, 1, 2, 3...).

* Checkbox: "Randomize Question Order."

* "Add Question" Button: Prominent, below settings.

* Question List:

* Each question is a collapsible panel/card.

* Elements per question (collapsed): Question number, question type, first few words of question text, "Edit" button, "Delete" button.

* Elements per question (expanded):

* Question Type Selector (Dropdown: Multiple Choice, True/False, Short Answer).

* Question Text (Rich Text Editor).

* Options Section (for MCQ/T/F):

* List of answer options with radio buttons/checkboxes to mark correct.

* "Add Option" button.

* Correct Answer Input (for Short Answer): Text input.

* Feedback for Correct Answer (Rich Text Editor, optional).

* Feedback for Incorrect Answer (Rich Text Editor, optional).

* "Save Question" / "Cancel" buttons within the panel.

  • Interactions: Adding new questions, expanding/collapsing questions, setting answers, providing feedback.

2.5. Exercise Builder

  • Layout: Similar to Lesson Editor. Header, left sidebar, central content area for exercise settings.
  • Header: Exercise title, "Save Exercise" button, "Cancel" button.
  • **Central Content Area
gemini Output

This output finalizes the design assets for your training course, providing a comprehensive blueprint for its visual presentation and user experience. The goal is to ensure the course content, generated in previous steps, is delivered in a professional, engaging, and highly usable manner, maximizing learner retention and satisfaction.


Training Course Design Finalization: Visual & UX Blueprint

This document outlines detailed design specifications, wireframe descriptions, color palettes, and user experience (UX) recommendations for your training course platform. These guidelines are crafted to ensure a cohesive, accessible, and engaging learning environment for all users.

1. Course Overview & Design Philosophy

The design aims to create an intuitive, clean, and professional learning platform that prioritizes content readability, learner engagement, and ease of navigation. Our core design principles are:

  • Clarity & Readability: Content is paramount. The design will ensure text, images, and videos are presented clearly and are easy to consume.
  • Intuitive Navigation: Learners should always know where they are, where they've been, and where they can go next.
  • Engagement & Interactivity: Encourage active participation through well-integrated quizzes, exercises, and multimedia.
  • Accessibility: Ensure the platform is usable by individuals with diverse abilities, adhering to WCAG 2.1 AA standards.
  • Professionalism & Trust: A polished aesthetic reinforces the quality and credibility of the course content.
  • Responsiveness: A seamless experience across desktops, tablets, and mobile devices.

2. Design Specifications - Visual & Interactive Elements

2.1. Typography

  • Primary Font (Headings & UI Elements):

* Family: Montserrat (Google Fonts) - Modern, clean, and highly readable.

* Weights: Light (300), Regular (400), Semi-Bold (600), Bold (700).

* Usage: Used for all main headings (H1-H4), navigation labels, button text, and key UI components.

  • Secondary Font (Body Text & Long-form Content):

* Family: Open Sans (Google Fonts) - Highly legible for long passages of text.

* Weights: Regular (400), Semi-Bold (600).

* Usage: Used for all body paragraphs, lesson content, quiz descriptions, exercise instructions, and supplementary text.

  • Monospace Font (Code Snippets):

* Family: Fira Code (Google Fonts) or Source Code Pro (Google Fonts) - Excellent for displaying code with clear character differentiation.

* Usage: Specifically for any code examples or technical snippets within lessons or exercises.

  • Font Sizing (Responsive):

* H1 (Course Title): 3em (desktop), 2.2em (tablet), 1.8em (mobile)

* H2 (Module Title): 2.2em (desktop), 1.8em (tablet), 1.5em (mobile)

* H3 (Lesson Title): 1.8em (desktop), 1.5em (tablet), 1.3em (mobile)

* H4 (Section Heading): 1.4em (desktop), 1.2em (tablet), 1em (mobile)

* Body Text: 1em (desktop), 0.95em (tablet), 0.9em (mobile) - Base font-size should be 16px for accessibility.

* Small Text/Captions: 0.8em

  • Line Height: 1.5 for body text for optimal readability.

2.2. Iconography

  • Style: Line-based, minimalist, and consistent. SVG format preferred for scalability.
  • Library Recommendation: Feather Icons, Font Awesome (Pro Light/Regular), or a custom set.
  • Usage Examples:

* Navigation: Home, Dashboard, Modules, Quizzes, Exercises, Certificate.

* Actions: Play, Pause, Download, Next, Previous, Submit, Save.

* Status: Checkmark (completed), X (incorrect), Info, Warning.

* Content Types: Video, Document (PDF), Link, Code.

2.3. Imagery & Multimedia

  • Hero Images/Module Banners: High-quality, relevant, and professional stock photography or custom illustrations. Use overlays for text legibility.
  • In-Content Images: Directly support the text, clearly labeled if necessary. Optimize for web performance.
  • Video Player: Embed a clean, modern video player (e.g., YouTube, Vimeo, or a custom player with standard controls). Ensure captions/subtitles are available for accessibility.
  • Interactive Elements: Use animations sparingly and purposefully (e.g., progress bar filling, button hover states). Avoid distracting flashy animations.

2.4. Interactive Components

  • Buttons:

* Primary: Solid fill with brand accent color, white text. Rounded corners (4-8px).

* Secondary: Outline with brand accent color, brand accent text. Transparent fill.

* Ghost/Tertiary: Minimal styling, used for less critical actions (e.g., "Learn More").

* States: Hover, Active, Focus, Disabled with clear visual differentiation.

  • Forms (Inputs, Textareas, Checkboxes, Radio Buttons):

* Clean, consistent styling. Clear labels positioned above input fields.

* Focus state with a subtle border highlight.

* Validation feedback (error messages, success indicators) clearly displayed next to relevant fields.

  • Progress Indicators:

* Linear Progress Bar: For overall course completion and module progress.

* Circular Progress: For individual lesson completion within a module.

* Clearly display percentage or number of completed items.

  • Navigation Elements:

* Breadcrumbs: Clearly show the user's path (Course > Module > Lesson).

* Side Nav/Table of Contents: Collapsible, highlights current active lesson.

* Pagination: For quizzes or multi-page exercises.

2.5. Responsiveness

  • Mobile-First Approach: Design and develop for smaller screens first, then progressively enhance for larger viewports.
  • Fluid Layouts: Use relative units (percentages, em, rem, vw, vh) for flexible sizing.
  • Breakpoints: Define specific breakpoints for optimal layout adjustments (e.g., 576px, 768px, 992px, 1200px).
  • Touch Targets: Ensure buttons and interactive elements are large enough for touch interaction on mobile devices (minimum 48x48px).

2.6. Accessibility (WCAG 2.1 AA Compliance)

  • Color Contrast: Ensure sufficient contrast ratios for text and interactive elements (min 4.5:1 for normal text, 3:1 for large text/UI components).
  • Keyboard Navigation: All interactive elements must be reachable and operable via keyboard. Clear focus indicators.
  • Semantic HTML: Use appropriate HTML5 elements (e.g., <nav>, <main>, <aside>, <article>) for screen reader compatibility.
  • ARIA Attributes: Implement ARIA roles and attributes where standard HTML is insufficient (e.g., for custom components).
  • Alt Text: All meaningful images must have descriptive alt text.
  • Transcripts/Captions: Provide transcripts for audio content and captions for video content.
  • Language Attribute: Specify the primary language of the document.

3. Wireframe Descriptions - Key Course Pages

These descriptions outline the layout and core components for essential pages.

3.1. Course Dashboard / Homepage

  • Header: Global navigation (Logo, Search, User Profile/Logout).
  • Main Content Area:

* Hero Section: Course Title, Short Description, "Continue Learning" button, Course Progress Bar (Overall).

* Course Overview: Key learning outcomes, target audience, course duration.

* Modules List (Accordion/Expandable):

* Each module displays its title, brief description, completion status, and number of lessons.

* Expanding a module reveals a list of lessons within it, each with its title, type (video, text, quiz), and completion status.

* Upcoming Deadlines/Announcements (Optional Sidebar): A dedicated section for important dates or instructor messages.

* Certificate Preview/Claim (if completed).

3.2. Module / Lesson Page

  • Header: Global navigation. Breadcrumbs (Course > Module > Lesson Title).
  • Left Sidebar (Collapsible):

* Course Progress: Visual indicator for overall course completion.

* Module Navigation: List of all modules, with the current module expanded.

* Lesson Navigation: List of all lessons within the current module, highlighting the active lesson. Displays lesson type icons.

  • Main Content Area:

* Lesson Title (H3).

* Lesson Content:

* Rich text editor content (paragraphs, lists, blockquotes).

* Embedded videos (with play/pause, volume, fullscreen, captions).

* Images with captions.

* Code snippets (monospaced font, syntax highlighting).

* Downloadable resources (PDFs, supplementary files).

* "Mark as Complete" Button: At the bottom, once content is reviewed.

* Navigation Buttons: "Previous Lesson" and "Next Lesson" at the bottom.

  • Right Sidebar (Optional):

* Related Resources: Links to external articles, additional readings.

* Discussion Forum/Comments: Integrated comment section for the lesson.

3.3. Quiz Page

  • Header: Global navigation, Breadcrumbs.
  • Left Sidebar: Lesson navigation (as above).
  • Main Content Area:

* Quiz Title (H3) & Instructions.

* Question Counter: "Question X of Y."

* Question Display:

* Question text (H4).

* Supporting image/video (optional).

* Answer options (radio buttons for single choice, checkboxes for multiple choice, text input for short answer).

* "Submit Answer" Button: For immediate feedback quizzes.

* "Next Question" / "Previous Question" Buttons.

* Feedback Area: Displays immediate feedback (correct/incorrect, explanation) after submission (if applicable).

* "Review Quiz" / "Finish Quiz" Button: At the end of the quiz.

  • Results Page (after quiz completion): Score, correct/incorrect answers, ability to review answers.

3.4. Hands-on Exercise Page

  • Header: Global navigation, Breadcrumbs.
  • Left Sidebar: Lesson navigation.
  • Main Content Area:

* Exercise Title (H3) & Overview.

* Instructions: Clear, step-by-step instructions (numbered list, bold key terms).

* Requirements/Resources: Any files to download, tools to use.

* Workspace (if applicable):

* Integrated code editor (e.g., Monaco Editor) for coding exercises.

* File upload area for project submissions.

* Text area for written responses.

* Submission Button: "Submit Exercise."

* Evaluation Criteria/Rubric: Clearly state how the exercise will be graded.

* "Save Draft" Button (optional).

* "Request Review" / "Mark as Complete" (for self-paced, non-graded exercises).

3.5. Certification / Completion Page

  • Header: Global navigation.
  • Main Content Area:

* "Congratulations!" Message (H1).

* Course Title & Learner's Name.

* Digital Certificate Display:

* Visually appealing certificate template with course name, learner's name, completion date, and (optional) instructor/organization signature/logo.

* Unique certificate ID for verification.

* Download Certificate Button (PDF).

* Share on Social Media Buttons (LinkedIn, Twitter, Facebook).

* Next Steps/Recommendations: Suggest other relevant courses.

* Feedback Form Link.

4. Color Palettes

We recommend a professional and inviting color palette, with clear semantic colors for feedback.

4.1. Primary Palette (Professional & Modern)

This palette balances professionalism with a touch of approachability, suitable for a wide range of subjects.

  • Primary Brand Color (Deep Blue/Teal): Used for main accents, primary buttons, active navigation states.

* #007BFF (Azure Blue) - OR - #00796B (Teal)

  • Secondary Accent Color (Complementary Orange/Gold): Used for highlights, call-to-action elements, small interactive elements.

* #FFC107 (Amber) - OR - #FF9800 (Deep Orange)

  • Neutral Dark (Text & Backgrounds):

* #343A40 (Dark Gray) - For primary text, headings.

* #495057 (Medium Gray) - For secondary text, icons.

  • Neutral Light (Backgrounds & Borders):

* #F8F9FA (Light Gray) - For light backgrounds, card backgrounds.

* #E9ECEF (Lighter Gray) - For borders, separators.

  • White: #FFFFFF - For main content backgrounds, card backgrounds.

4.2. Semantic Colors (Feedback & Status)

  • Success: #28A745 (Green) - For correct answers, successful actions.
  • Warning: #FFC107 (Yellow/Amber) - For warnings, pending actions.
  • Error: #DC3545 (Red) -
training_course_builder.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);}});}