import React from 'react'; import type { Class_ApplicationData } from '../../../types/ApplicationData'; import type { Class_ProtoElement } from '../../../Elements/Element'; import type { Type_PanelMode } from '../../../types/PanelManager'; /** * Cible d'un bloc. Volontairement distincte de `Type_InspectorTarget` : on ne * compose une présentation que pour ce qu'un LECTEUR peut survoler ou cliquer * (les éléments du dessin, et les boutons de menu au Lot 5). Pas de 'view', pas * de 'mixed' — ce sont des notions d'édition. */ export type Type_PresentationTarget = 'node' | 'link' | 'container' | 'button'; /** Contexte fourni au rendu d'un bloc. */ export type Type_BlockRenderContext = { app_data: Class_ApplicationData; /** Élément ciblé ; `null` pour une cible 'button' (Lot 5). */ element: Class_ProtoElement | null; /** Contenant courant : permet d'adapter la densité (info-bulle = compact). */ mode: Type_PanelMode; /** Réglages du bloc tels que composés par l'auteur (opaques au registre). */ options?: { [key: string]: unknown; }; }; export type Type_PresentationBlock = { /** Id stable, écrit dans le JSON. Namespacé par couche ('os.block.*'). */ id: string; /** Cible(s) pour lesquelles le bloc est proposé au catalogue. */ target: Type_PresentationTarget | Type_PresentationTarget[]; /** Ordre d'apparition DANS LE CATALOGUE (le bouton « Ajouter »). L'ordre * d'AFFICHAGE, lui, est celui de la composition de l'auteur. */ order: number; /** Libellé au catalogue (déjà traduit). */ label: (app_data: Class_ApplicationData) => string; /** * Rendu LECTEUR (lecture seule). Rend `null` quand le bloc n'a rien à montrer * pour cette cible (ex. pas de texte libre saisi) : l'appelant saute alors le * bloc plutôt que d'afficher une section vide. */ render: (ctx: Type_BlockRenderContext) => React.ReactNode; /** * Résumé d'UNE LIGNE affiché à côté du titre quand le bloc est REPLIÉ (« 13 * valeurs · Mm³ », « Niveau Essences »). Il dit ce que le bloc contient sans * qu'on ait à l'ouvrir. `null` quand il n'y a rien de tel à annoncer. */ summary?: (ctx: Type_BlockRenderContext) => string | null; /** * Réglages propres au bloc, ÉDITÉS PAR L'AUTEUR dans le composeur (Lot 2). * Absent = le bloc n'a rien à régler. `setOptions` reçoit l'objet complet : * c'est l'appelant qui le persiste dans la composition (avec undo). */ renderOptions?: (args: { app_data: Class_ApplicationData; options: { [key: string]: unknown; }; setOptions: (next: { [key: string]: unknown; }) => void; }) => React.ReactNode; /** Gating déclaratif (licence, disponibilité d'un hook…). */ gate?: (app_data: Class_ApplicationData) => boolean; }; /** Registre plat des blocs d'affichage. Instance unique partagée. */ export declare class Class_PresentationBlockRegistry { private _blocks; /** Enregistre (ou remplace, par id) un bloc — idempotent, sûr au hot reload, * et permet à une couche supérieure de surcharger un bloc de base. */ register(block: Type_PresentationBlock): void; unregister(id: string): void; clear(): void; get(id: string): Type_PresentationBlock | undefined; has(id: string): boolean; /** Blocs proposables pour une cible, filtrés par gating, triés par ordre. * C'est la liste du bouton « Ajouter » (Lot 2). */ getBlocksFor(target: Type_PresentationTarget, app_data: Class_ApplicationData): Type_PresentationBlock[]; get size(): number; } /** Instance unique partagée par toutes les couches. */ export declare const presentation_block_registry: Class_PresentationBlockRegistry; /** * Rend un bloc par son id. Rend `null` si l'id est INCONNU — c'est ici * qu'atterrit la tolérance posée au Lot 0 : le modèle CONSERVE un bloc produit * par une version plus récente (pour ne pas détruire le travail de l'auteur au * réenregistrement), et c'est le rendu qui le saute silencieusement. */ export declare const renderPresentationBlock: (id: string, ctx: Type_BlockRenderContext) => React.ReactNode; /** Titre d'un bloc (celui du catalogue), ou '' si l'id est inconnu. */ export declare const presentationBlockLabel: (id: string, app_data: Class_ApplicationData) => string; /** Résumé d'un bloc replié. `null` si l'id est inconnu ou si le bloc n'en a pas. */ export declare const presentationBlockSummary: (id: string, ctx: Type_BlockRenderContext) => string | null;