Développement Frontend — Megahub IDE

VérifiéSûr

Contexte de développement frontend pour le projet Megahub : IDE web, Vite, Blockly, Web Bluetooth, CSS et composants UI.

Spar Skills Guide Bot
DeveloppementIntermédiaire
04/08/2026
Claude Code
#frontend#vite#blockly#web-bluetooth#css-theming

Recommandé pour

Synthèse automatique

Fournit le contexte frontend spécifique au projet Megahub IDE : modes de build Vite, Blockly, Web Bluetooth, jetons CSS et structure des composants.

Points forts

  • Documente les trois modes de build (dev, bt, web) et l'accès à VITE_MODE à l'exécution
  • Impose des jetons de thème VS Code Dark pour éviter les couleurs et tailles codées en dur
  • Cartographie la structure des fichiers et des composants Web (Blockly, BLE, aperçu Lua, journaux)
  • Renvoie vers la compétence blockly pour l'authoring des blocs et les générateurs Lua

Limites

  • Contenu très spécifique à Megahub, peu réutilisable sur un autre frontend
  • Web Bluetooth est limité à Chrome, Edge et Opera
  • Ne couvre ni les tests ni le déploiement au-delà des modes de build
Quand l'utiliser

À utiliser pour toute modification du frontend Megahub : composants, styles, client BLE, Blockly ou configuration Vite.

Quand l'éviter

À éviter pour le firmware, le backend ou des conseils frontend génériques hors de ce projet.

Analyse de sécurité

Sûr
Score qualité88/100

This skill is purely informational documentation for frontend development context. It declares no tools and contains no commands, scripts, or instructions that could execute destructive, exfiltrating, or unsafe actions. All content is descriptive guidance about project structure, CSS tokens, and UI patterns.

Aucun point d'attention détecté

Comment cette analyse est faite

Exemples

New sidebar Web Component
Add a new sidebar panel as a Web Component under /frontend/src/components/, using Shadow DOM and the existing --vscode-* theme tokens instead of hardcoded colors.
Debug build mode and BLE availability
Why isn't Web Bluetooth available in dev mode? Explain the dev, bt, and web build modes and how import.meta.env.VITE_MODE is used at runtime.
Theme tokens in project dialog
Update the project manager dialog in /frontend/src/components/files/ to show an autostart badge, reusing theme.css spacing and color tokens rather than adding new CSS values.

name: frontend description: Frontend development context for the Megahub project. Use when working on the web-based IDE, Vite build system, Blockly visual programming, Web Bluetooth API integration, JavaScript frontend code, CSS/styles, UI components, or anything in the /frontend/ directory.

Frontend Development — Megahub IDE

Tech Stack

  • Vite — build tool and dev server
  • Blockly 12.3.1 — visual programming editor; custom blocks in /frontend/src/components/blockly/ — see blockly skill for block authoring, Lua generators, and BLOCKS.md generation
  • Vanilla JS — no framework (intentionally lightweight for ESP32 flash size)
  • Web Bluetooth API — browser BLE, Chrome/Edge/Opera only
  • Prism.js — Lua syntax highlighting in the preview panel
  • Web Components — all sidebar panels are custom elements with Shadow DOM

Build Modes

| Mode | Description | |------|-------------| | dev | Hot reload, localStorage for persistence, no BLE | | bt | Production BLE mode, deployed to GitHub Pages | | web | WiFi/HTTP mode, served from firmware WebServer |

Mode is available at runtime as import.meta.env.VITE_MODE.


File Structure

frontend/
  index.html                  Main entry point (HTML skeleton)
  src/
    index.js                  App controller, event wiring, all Application.* methods
    bleclient.js              BLE protocol client (fragmentation, streaming, events)
    theme.css                 CSS design tokens (all --vscode-* variables)
    styles.css                Global styles, layout grid, all UI component CSS
    components/
      blockly/                Blockly editor + custom block definitions
      files/                  Project manager dialog (list/create/delete/autostart)
      logger/                 Terminal-style log output (max 50 entries)
      luapreview/             Syntax-highlighted Lua code preview
      portstatus/             Real-time LEGO port status cards
      ui/                     show_value block output display
      btdevicelist/           Bluetooth Classic device list + discovery
      sidebar-toggle/         Mobile sidebar toggle button

VS Code Dark Theme System

All design tokens are CSS custom properties defined in theme.css. Always use these — never hardcode colors or sizes.

Key Color Tokens

--vscode-bg-primary: #1e1e1e      /* Main background */
--vscode-bg-secondary: #252526    /* Panels, cards, sidebar */
--vscode-bg-elevated: #2d2d30     /* Hover states */
--vscode-bg-input: #3c3c3c        /* Form inputs */

--vscode-text-primary: #cccccc    /* Main text */
--vscode-text-secondary: #858585  /* Muted text, breadcrumb items */
--vscode-text-tertiary: #6a6a6a   /* Very muted (separators) */
--vscode-text-bright: #ffffff     /* Headings, active labels */

--vscode-accent-blue: #007acc     /* Focus borders */
--vscode-accent-blue-dark: #0078d4 /* Primary buttons, status bar */
--vscode-accent-blue-hover: #1177bb
--vscode-accent-teal: #4ec9b0     /* Success, connected state */
--vscode-accent-yellow: #dcdcaa   /* Warning, connecting state */

--color-success: #4ec9b0
--color-error: #f48771
--color-error-bg: #5a1d1d
--color-warning: #dcdcaa

--vscode-border-light: #3c3c3c
--vscode-border-medium: #3e3e42

Key Spacing / Sizing Tokens

--spacing-xs: 0.25rem   --spacing-sm: 0.5rem
--spacing-md: 0.75rem   --spacing-lg: 1rem
--spacing-xl: 1.25rem   --spacing-2xl: 1.5rem

--transition-fast: 0.15s ease
--transition-medium: 0.3s ease

--header-height: 3rem
--z-modal: 1100   --z-tooltip: 2000

Application Mode System

Three modes, switched via Application.setMode(mode):

| Mode | View shown | |------|-----------| | btconnect | Welcome screen + connect button | | management | Project list (files component) | | editor | Blockly editor + sidebar controls |

Visibility Mechanism

dynamicvisibility class (all modes):

// setMode() sets display:block/none on elements with class dynamicvisibility
// Elements also have class visible-{mode} to declare when they appear
// e.g. class="dynamicvisibility visible-editor visible-management"

⚠ setMode() always sets display: block — do NOT use dynamicvisibility for elements that need display: flex or display: grid.

body.dataset.mode (CSS-based, for flex/grid elements):

// setMode() also sets document.body.dataset.mode = mode
// Use CSS selectors: body[data-mode="editor"] .my-element { display: flex }
// Used by: header breadcrumb, back button

Layout Grid

┌──────────────────────────────────────┐  ← header (3rem)
│ [←] Megahub IDE / project  [toggle] │
├──────────────────┬───────────────────┤  ← 1fr
│                  │ sidebar buttons   │
│  Blockly /       │ ─────────────────│
│  Files /         │ accordion panels  │
│  Welcome         │  lua / ports /   │
│                  │  ui / btdevices  │
├──────────────────┴───────────────────┤  ← footer (8–12rem)
│  Logger (terminal output)            │
├──────────────────────────────────────┤  ← statusbar (20px)
│ ● Connected to Megahub IDE           │
└──────────────────────────────────────┘

Desktop (≥1512px): 75/25 content/sidebar split. Mobile: sidebar is a slide-in overlay.


Existing UI Patterns (use these, don't reinvent)

Notifications (Toast)

showNotification('success' | 'error' | 'warning' | 'info', title, message, durationMs)
// duration 0 = no auto-dismiss
// Returns the notification element (for manual dismissal)

Confirmation Dialog

const confirmed = await showConfirmDialog(title, message, {
  confirmText: 'Delete',   // default: 'Confirm'
  cancelText: 'Cancel',
  destructive: true        // red confirm button (default: true)
});

Top Progress Bar

Progress.show()   // indeterminate shimmer sweep
Progress.hide()
// Used for: project list load, file open, file save

BLE Connection Modal

ConnectionModal.show()              // resets all steps to pending
ConnectionModal.setStep(stepId)     // marks previous steps done, current active
ConnectionModal.setAllDone()        // all checkmarks
ConnectionModal.setError(stepId, message)  // marks step red, shows error text
ConnectionModal.hide()
// stepIds: 'requesting' | 'connecting' | 'services' | 'notifications' | 'mtu' | 'ready'

VS Code Status Bar

StatusBar.setConnecting()
StatusBar.setConnected(deviceName)
StatusBar.setDisconnected()
StatusBar.setMessage(text)   // right-side info text
StatusBar.clearMessage()

Sidebar Icon Buttons

.sidebar-icon-btn                   /* base */
.sidebar-icon-btn-primary           /* blue background (Execute) */
.sidebar-icon-btn-danger            /* red background (Stop) */
.sidebar-icon-btn-save              /* neutral, turns blue on hover */
.sidebar-icon-btn-toggle            /* teal when aria-pressed="true" */
.sidebar-icon-btn.btn-loading       /* spins the SVG icon */

BLE Client Architecture (bleclient.js)

Connection Flow

connect(onProgress?)
  → navigator.bluetooth.requestDevice()  [requires user gesture]
  → _setupGattConnection(onProgress?)
      → gatt.connect()
      → getPrimaryService()
      → getCharacteristic() × 4
      → startNotifications() × 3
      → sleep(200)  ← CRITICAL: BLE stack propagation delay
      → waitForMTU(2000)
      → testControlChannel()
  → emits onProgress callbacks at each step

Message Protocol

  • 5-byte fragment header: type, messageId, fragmentNum(2), flags
  • MTU: default 23 bytes, negotiated up to 517 bytes
  • Fragmentation: automatic for all requests/responses
  • Streaming protocol: for large file uploads (chunks + ACK window)

Event System

bleClient.addEventListener(APP_EVENT_TYPE_*, callback)
bleClient.removeAllEventListeners()
// Event types: LOG, PORTSTATUS, COMMAND, BTCLASSICDEVICES

File Upload

await bleClient.uploadFileStreaming(projectId, filename, content, onProgress?)
// Sliding window: 8 chunks in flight, waits for ACK before advancing

Animation Principles

All animations must be purposeful — each one communicates meaning:

| Use case | Animation | Timing | |----------|-----------|--------| | State transitions | CSS transition | var(--transition-fast) = 0.15s ease | | Indeterminate loading | Shimmer sweep (progress bar) | 1.4s linear infinite | | Spinner (waiting) | Rotate 360° | 0.8s linear infinite | | Step completion | Scale 0→1 + opacity | 0.15s ease-out (one-shot) | | Status dot state change | Color transition | 0.3s ease | | Connecting pulse | Opacity 1→0.3→1 | 1s ease-in-out infinite |

Always wrap looping animations in:

@media (prefers-reduced-motion: reduce) {
  /* replace animation with instant state */
}

Component Pattern (Web Components)

All sidebar panels are custom elements with Shadow DOM:

class MyComponent extends HTMLElement {
  connectedCallback() {
    const shadow = this.attachShadow({ mode: 'open' });
    const sheet = new CSSStyleSheet();
    sheet.replaceSync(styleSheet);   // import from style.css
    shadow.adoptedStyleSheets = [sheet];
    shadow.innerHTML = template;     // import from component.html
  }
}
customElements.define('custom-my-component', MyComponent);

Accordion behavior: dispatch accordion-expand / accordion-collapse custom events. Parent (initSidebarAccordion() in index.js) collapses all others on expand.


Important Constraints

  • Bundle size: Keep JS small — it's embedded in 4MB ESP32 flash
  • No framework: No React/Vue/Angular — intentional
  • Shadow DOM: Component styles are isolated; theme.css variables are inherited through the shadow boundary
  • Web Bluetooth: User gesture required for requestDevice() — never call without a click handler
  • Supported browsers: Chrome, Edge, Opera only — Firefox/Safari don't support Web Bluetooth

Du fichier au premier essai

Le téléchargement contient exactement le contenu affiché sur cette fiche. Cette copie peut différer de la dernière version du dépôt source.

Consulter la source et ses fichiers annexes

Ce téléchargement contient uniquement SKILL.md. Les scripts, références, modèles et dépendances éventuels ne sont pas inclus. Récupérez les fichiers nécessaires depuis la source en conservant leur arborescence avant de poursuivre.

1. Télécharger le fichier

Télécharger SKILL.md

Depuis la racine d’un projet de test, enregistrez le fichier sous .skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md, ou utilisez la commande suivante. Ce dossier sert à examiner la skill avant son installation.

Commande pour macOS/Linux ou WSL : un shell POSIX et curl sont nécessaires. Sous Windows sans WSL, utilisez le bouton de téléchargement et créez le dossier manuellement.

mkdir -p '.skill-downloads/frontend-development-megahub-ide-mse7in5n' && curl --fail --show-error --location 'https://skills-guides.com/api/skills/frontend-development-megahub-ide-mse7in5n/download' --output '.skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md.part' && mv '.skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md.part' '.skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md'

2. Vérifier les prérequis

Lisez SKILL.md avant de l’utiliser. Si le fichier cite des scripts ou services externes, examinez-les et préparez les accès nécessaires dans votre environnement de test.

Aucune section de prérequis reconnue dans ce fichier. Cela ne signifie pas qu’il est autonome : les bibliothèques, outils et accès peuvent être cités ailleurs dans le contenu ou dans le dépôt source.

Les plateformes de la fiche sont des indications du catalogue. Les chemins ci-dessous suivent la documentation des outils ; ils ne prouvent pas que cette skill y a été exécutée. Aucune version minimale de ces outils n’est attestée pour cette fiche.

3. Charger la skill

Après vérification, copiez le dossier complet dans le projet avec l’une des commandes ci-dessous, puis ouvrez une nouvelle session de l’outil. La commande s’arrête si un dossier du même nom existe déjà : comparez les fichiers avant de le remplacer.

Claude Code
test -f '.skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md' && test -s '.skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md' && mkdir -p '.claude/skills' && test ! -e '.claude/skills/frontend' && cp -R '.skill-downloads/frontend-development-megahub-ide-mse7in5n' '.claude/skills/frontend'

OpenSkills

OpenSkills doit déjà être installé. La procédure locale install/read est contrôlée avec OpenSkills 1.5.0, qui exige Node.js ≥ 20.6.0. Aucun slug du catalogue n’est résolu automatiquement.

Installation officielle d’OpenSkills
openskills install './.skill-downloads/frontend-development-megahub-ide-mse7in5n'

openskills read 'frontend-development-megahub-ide-mse7in5n'

La lecture doit afficher le contenu du fichier installé et son dossier de base. Elle ne lance ni la skill ni ses dépendances.

Pour un agent qui lit AGENTS.md, synchronisez ensuite l’index. Cette commande modifie AGENTS.md : relisez le diff avant de l’utiliser.

openskills sync

Mode manuel ou autre outil : joignez SKILL.md à une conversation, ou ouvrez-le dans un agent capable de lire les fichiers. Ajoutez les ressources annexes nécessaires. Il n’existe pas de dossier universel reconnu par tous les outils.

4. Faire un premier essai

Utilisez une entrée courte et fictive : un endpoint d’API, un petit document ou un brief d’interface. Dans une nouvelle conversation, joignez le fichier ou donnez son chemin à l’agent, puis adaptez cette demande :

Lis .skill-downloads/frontend-development-megahub-ide-mse7in5n/SKILL.md et applique ses instructions à cet exemple : [décrire une entrée de test]. Indique les fichiers, dépendances ou accès qui manquent. Produis le résultat demandé par la skill sans inventer de données ni exécuter de script non examiné.

Résultat attendu : une sortie correspondant aux instructions de la skill, ou une liste précise des prérequis manquants. Une simple confirmation de lecture ne valide pas le premier usage. Si une ressource externe est indisponible, ce parcours reste à tester.

Skills similaires