====== µcBlockly — noyau (KERNEL) ====== Ce document décrit la **surface publique** du noyau embeddable et ce qui reste **interne / démo**. Complète [[fr:arduino:ucblockly:architecture|ARCHITECTURE.md]] (vue contributeur) et [[fr:arduino:ucblockly:integration|INTEGRATION_DEPOT.md]] (intégration dans un autre dépôt). --- ===== 1. Pile à trois niveaux ===== flowchart TB subgraph L1["Niveau 1 — Blockly"] B[Blockly 13 + plugins @blockly] end subgraph L2["Niveau 2 — µcBlockly noyau"] K[src/core/ · blocs · générateur Arduino] end subgraph L3["Niveau 3 — produits dérivés"] D[demo · BlocklyDuino · intégrations custom] end B --> K K --> D ^ Niveau ^ Rôle ^ Exemple ^ | **Blockly** | Moteur visuel générique | workspace, toolbox, sérialisation | | **µcBlockly (noyau)** | Blocs Arduino typés, générateur C++, API embed | ''createUcBlockly()'' | | **Produit dérivé** | UI métier, cartes, déploiement | démo µcBlockly, BlocklyDuino | Le noyau **ne doit pas** embarquer Monaco, la topbar démo, ni les ''getElementById'' du shell. --- ===== 2. Surface publique (''µcBlockly'' / ''µcBlockly/core'') ===== Point d’entrée TypeScript : ''src/core/index.ts'' → ''build/src/core/index.js''. === API principale === ^ Export ^ Description ^ | ''createUcBlockly(container, options)'' | Injecte Blockly + générateur dans un conteneur DOM | | ''registerUcBlocklyKernel(options?)'' | Enregistrement idempotent des blocs / types (appelé par ''createUcBlockly'') | | ''applyUcBlocklyLocale(language)'' | Locale Blockly + messages µcBlockly | | ''sanitizeSerializedWorkspaceState(state)'' | Nettoie les coordonnées NaN avant load/save | === Types === ^ Type ^ Usage ^ | ''UcBlocklyOptions'' | ''toolbox'', ''language'', ''theme'', ''media'', ''enforcers'', ''plugins'', ''onCodeChange'', … | | ''UcBlocklyInstance'' | ''workspace'', ''getCode()'', ''saveWorkspace()'', ''loadWorkspace()'', ''resize()'', ''dispose()'' | | ''UcBlocklyEnforcerOptions'' | ''strictTypes'', ''programStructure'', ''strictConnectionChecker'' | | ''UcBlocklyPluginOptions'' | ''backpack'', ''minimap'', ''workspaceSearch'', … | | ''UcBlocklyWorkspaceManagerOptions'' | Config avancée (lifecycle sans shell) | === Classes avancées (embed / produits) === ^ Export ^ Description ^ | ''UcBlocklyWorkspaceManager'' | Cycle de vie workspace (reboot, plugins, persistence) sans DOM démo | | ''UcBlocklyPluginHost'' | Init / dispose des plugins Blockly configurables | | ''DEFAULT_UCBLOCKLY_*'' / ''resolve*Options()'' | Valeurs par défaut enforceurs & plugins | === Réexports utiles === ^ Export ^ Source ^ | ''arduinoGenerator'' | Génération C++ | | ''basic_toolbox'', ''getToolboxForCurrentBoard'', ''getToolboxWithoutBoardCategory'' | Toolbox JSON | | ''ToolboxConfiguration'' | Type toolbox | Pour les aides **produit / coque** (thème UI, langues DOM, a11y, cartes) : importer ''µcBlockly/host'' plutôt que le noyau. === Exemple minimal === import { createUcBlockly, basic_toolbox } from "µcBlockly/core"; const editor = createUcBlockly(document.getElementById("editor")!, { toolbox: basic_toolbox, language: "fr", enforcers: { strictTypes: true, programStructure: true }, plugins: { minimap: false, workspaceSearch: true }, onCodeChange: (code) => console.log(code), }); --- ===== 3. Surface interne (ne pas importer depuis un produit dérivé) ===== ^ Zone ^ Fichiers ^ Pourquoi interne ^ | **Shell démo** | ''src/demo/blockly_application_shell.ts'', ''src/index.ts'' | Menus HTML, Monaco, URL, sessionStorage | | **Compat re-export** | ''src/blockly_application_type.ts'' | Alias vers le shell démo | | **Éditeur Monaco** | ''src/code_editor.ts'' | ~3 Mo, panel C++ de la démo | | **Layout flex** | ''src/workspace_flex.ts'', ''src/workspace_layout_utils.ts'', ''src/workspace_resize.ts'' | Panneaux redimensionnables démo | | **A11y coque** | ''src/shell_a11y.ts'', ''src/a11y_labels.ts'' | HTML ''public/index.html'' | | **Thème UI coque** | ''src/ui_palette_theme.ts'' | Sync CSS topbar ↔ thème Blockly | | **Debug démo** | ''src/block_debug_context_menu.ts'' | Menu contextuel développeur | Ces modules peuvent être importés **dans le dépôt µcBlockly** pour la démo ; un produit tiers doit s’appuyer sur ''./core'' uniquement. --- ===== 4. Noyau vs démo — dépendances ===== src/core/ create_ucblockly.ts ← API embed register.ts ← blocs / registry locale.ts ← i18n noyau ucblockly_workspace_manager.ts ucblockly_plugins.ts default_options.ts src/categories/blockly/ ← définitions de blocs (public implicite via kernel) src/generators/arduino/ ← générateur (public via arduinoGenerator) src/toolbox.ts ← toolbox JSON src/languages/ ← messages src/boards.ts ← profils cartes src/demo/ ← INTERNe (exemple embed + shell) src/index.ts ← INTERNe (webpack main) --- ===== 5. Builds ===== ^ Script ^ Produit ^ Contenu ^ | ''npm run build:core'' | ''build/src/core/'' (+ deps compilées) | **Lib TypeScript noyau** — sans ''index.ts'', sans Monaco | | ''npm run build:core:bundle'' | ''dist/core/'' | **Page embed statique** — JS + ''index.html'' + ''media/'', **sans Monaco** | | ''npm run build:demo'' | ''dist/bundle/'' | Démo complète — Monaco + ''public/index.html'' | | ''npm run build'' | les deux | ''build:demo'' puis ''build:core:bundle'' | | ''npm run build:lib'' | ''build/'' | Compile **tout** ''src/'' (dev local, inclut démo) | | ''npm run dev'' | ''build/'' (dev server) | Démo hot-reload | | ''npm run dev:embed'' | ''dist/core/'' (port 8081) | Exemple embed noyau seul | === Exports npm (''package.json'') === ^ Chemin ^ Cible ^ | ''"."'' / ''"./core"'' | ''build/src/core/index.js'' — **noyau** | | ''"./host"'' | ''build/src/host/index.js'' — aides produit (thèmes, a11y, Monaco) | | ''"./demo"'' | ''build/src/index.js'' — point d’entrée démo (Monaco, shell) | Artefact navigateur embed : servir le dossier ''dist/core/'' (pas ''dist/bundle/''). --- ===== 6. Options configurables (rappel) ===== Voir ''src/core/types.ts'' et ''src/core/default_options.ts''. **Enforceurs** (défauts : strictTypes ✓, programStructure ✓, strictConnectionChecker ✗) : enforcers: { strictTypes: true, programStructure: true, strictConnectionChecker: false, } **Plugins workspace** (via ''UcBlocklyPluginHost'' / ''plugins'' dans ''createUcBlockly'') : plugins: { backpack: true, minimap: true, workspaceSearch: true, contentHighlight: false, // … } **Toolbox** : obligatoire dans ''UcBlocklyOptions.toolbox'' ; utiliser ''basic_toolbox'' ou une variante filtrée (''getToolboxWithoutBoardCategory'', etc.). --- ===== 7. Évolutions prévues (roadmap) ===== ^ Priorité ^ Sujet ^ État ^ | P0 | ''createUcBlockly(container)'' | ✅ | | P0 | Séparer demo / export npm | ✅ | | P1 | Workspace vs shell | ✅ | | P1 | Options plugins / enforceurs | ✅ | | P2 | Build core sans Monaco | ✅ (''build:core'', ''dist/core/'') | | P2 | Ce document KERNEL.md | ✅ | | P3 | Publication npm (''private: false'', exports) | À faire | --- ===== 8. Liens ===== * [[fr:arduino:ucblockly:architecture|ARCHITECTURE.md]] — layout ''src/'', conventions contributeur * [[fr:arduino:ucblockly:integration|INTEGRATION_DEPOT.md]] — iframe, submodule, API embed * [[fr:arduino:ucblockly:accessibility|ACCESSIBILITY.md]] — accessibilité (démo + blocs)