Components UI V5

Présentation d’origine conservée — contenu enrichi P84A 2026-05-15

Composants UI utilisés par MO_UI_FACTORY et consommés par les modules/POP via SYS.UI. Les composants sont UI-only : aucune logique métier, aucun accès BDD métier, aucun chargement de module.

Règle : les modules et POP appellent les composants publics avec des ranges Excel. Ils ne font pas de dofile de composant et ne résolvent pas via _G.

P84A — Overrides CSS contractuels

Contrat : chaque composant résout son style dans une fonction dédiée interne. Le CSS standard reste la source par défaut ; une table optionnelle css = { ... } peut surcharger localement des clés CSS connues, avec la même nomenclature que MASTER_THEME.ini. Toute clé inconnue est une erreur explicite, sans fallback.
UI.Console(SYS, "A1:T5", lines, "", nil, "", {
    css = { txt_lcd_data = "green_maestro" }
})

UI.BUTTON(SYS, "BUTTON", "A1:D1", "OK", action, 0, false, {
    css = { txt_button = "amber_maestro" }
})

Les modules/POP restent petits : ils assemblent les composants publics et transmettent des overrides contextuels si nécessaire. Ils ne redessinent pas de bouton, Tiny ou console localement.

Inventaire composants

ComposantVersionRôleAPI publiqueCSS
CPNT_Button
COMPONENTS/CPNT_Button.lua
1.2.0
2026.05.15
Composant unique pour tous les boutons (STD, SPECIAL), avec label/range dynamiques et support rect contrôlé par composant hôte.UI.BUTTON[BUTTON]
CPNT_Chassis
COMPONENTS/CPNT_Chassis.lua
12.1.0
2026.05.11
Rendu de la structure porteuse (Boîtier, Montants, Bezel externe).UI.Apply_Componant_Chassis
UI.Draw_Bezel_Immediate
UI.Draw_Bezel
[HARDWARE_FRAME]
CPNT_ComboBox
COMPONENTS/CPNT_ComboBox.lua
1.1.0
2026.05.12
Liste déroulante avec état Factory et rendu compatible SidePanel buffer.UI.ComboBox[COMBOBOX]
CPNT_Console
COMPONENTS/CPNT_Console.lua
12.13.0
2026.05.14
Moniteur LCD avec caches dirty contenu/viewport et sondes SYS.MONITORUI.Console[LCD_CONSOLE]
CPNT_ExcelGrid
COMPONENTS/CPNT_ExcelGrid.lua
12.1.0
2026.05.11
Calque dUI.DrawExcellGrid-
CPNT_File_Explorer
COMPONENTS/CPNT_File_Explorer.lua
1.6.0
2026.05.15
Explorateur dossier/fichier UI-only au look Maestro, assemblé avec composants publics Button/TinyNotepad, API retour, scrollbar de liste CSS, sync_key et création de sous-dossier UI-only.UI.FILE_EXPLORER[FILE_EXPLORER]
CPNT_GroupFrame
COMPONENTS/CPNT_GroupFrame.lua
1.1.0
2026.05.11
Composant de structuration visuelle (Baie de brassage).UI.GroupFrame-
CPNT_Halo
COMPONENTS/CPNT_Halo.lua
12.1.0
2026.05.14
Photon Halo / Additive Light RendererUI.OnPhotonWidget
UI.Draw_Photon_Halo
UI.Draw_Solar_Halo
[HALO]
CPNT_Header
COMPONENTS/CPNT_Header.lua
12.1.0
2026.05.11
Plugin de structure pour le rendu du bandeau supérieur.UI.Header[HEADER]
CPNT_ListBox
COMPONENTS/CPNT_ListBox.lua
1.3.0
2026.05.11
ListBox et overlay compatibles render target Factory.UI.ListBox_Overlay
UI.ListBox
[LISTBOX]
CPNT_Notifier
COMPONENTS/CPNT_Notifier.lua
12.6.0
2026.05.15
Bandeau LCD avec rétroéclairage dynamique, mode guidage, CTA cliquable et layout bloquant lisible sur range Excel étenduUI.Notifier[LCD_NOTIFIER]
CPNT_Popup
COMPONENTS/CPNT_Popup.lua
1.3.0
2026.05.14
Fenêtre modale générique à ranges Excel explicites.UI.Modal_Dialog[POPUP_MODAL]
CPNT_RichPopup
COMPONENTS/CPNT_RichPopup.lua
1.3.0
2026.05.14
Hote visuel de module POP_* dans un range, selon le modele SidePanel sans animation droite-gauche.UI.RICH_POPUP[RICH_POPUP]
CPNT_RichTxt
COMPONENTS/CPNT_RichTxt.lua
1.1.0
2026.05.14
Dessine une ligne RichText dans un range Excel via la Factory avec padding CSS interne.UI.RICHTXT[RICHTXT]
CPNT_SideBar
COMPONENTS/CPNT_SideBar.lua
4.10.0
2026.05.11
Gestionnaire d'onglets verticaux avec mode disabled visuel pour les gates Project Guard.UI.New_SideBar
SideBar:Draw
[SIDEBAR_TABS]
[TABS]
CPNT_SidePanel
COMPONENTS/CPNT_SidePanel.lua
3.4.0
2026.05.14
SidePanel anime par rendu direct component-only, sans buffer offscreen ni dirty clip moduleUI.SidePanel[SIDE_PANEL]
CPNT_Slider
COMPONENTS/CPNT_Slider.lua
12.1.0
2026.05.11
Composant curseur linéaire (Horizontal/Vertical) avec gestion du focus.UI.Slider[SLIDER]
CPNT_TinyNotepad
COMPONENTS/CPNT_TinyNotepad.lua
2.6.0
2026.05.15
Tiny multiline text editor avec layout cache, viewport visible, scroll manuel stable et synchronisation externe contractuelleUI.TinyNotepad.New
UI.TinyNotepad.Draw
UI.TinyNotepad.SaveState
UI.TinyNotepad.SetClipboard
UI.TinyNotepad.SetValue
[TINY_NOTEPAD]
CPNT_TouchScreen
COMPONENTS/CPNT_TouchScreen.lua
12.1.0
2026.05.11
Moteur de rendu matriciel (LED/LCD) pour la texture de fond du cockpit.UI.Draw_LED_Matrix[LED_MATRIX]

Modes d’emploi rapides

CPNT_Button

Composant unique pour tous les boutons (STD, SPECIAL), avec label/range dynamiques et support rect contrôlé par composant hôte.

API : UI.BUTTON

UI.BUTTON(SYS, "BUTTON", "K12:N12", "Valider", function() ... end, 0, false)
UI.BUTTON(SYS, "BUTTON", {x=x,y=y,w=w,h=h}, label, action, 0, disabled, {id="stable_id"})

Contrat : Action locale ou signal FSM. Changement de label/taille par les arguments publics label + range/rect, jamais par dessin local. CSS : [BUTTON]. Overrides locaux optionnels via css.

CPNT_Chassis

Rendu de la structure porteuse (Boîtier, Montants, Bezel externe).

API : UI.Apply_Componant_Chassis / UI.Draw_Bezel_Immediate / UI.Draw_Bezel

UI.Apply_Componant_Chassis(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [HARDWARE_FRAME].

CPNT_ComboBox

Liste déroulante avec état Factory et rendu compatible SidePanel buffer.

API : UI.ComboBox

UI.ComboBox(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [COMBOBOX].

CPNT_Console

Moniteur LCD avec caches dirty contenu/viewport et sondes SYS.MONITOR

API : UI.Console

UI.Console(SYS, range, data, label, nil, "", { css = { txt_lcd_data = "green_maestro" } })

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [LCD_CONSOLE], overrides locaux optionnels via css.

CPNT_ExcelGrid

Calque d

API : UI.DrawExcellGrid

UI.DrawExcellGrid(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : aucune section dédiée détectée.

CPNT_File_Explorer

Explorateur dossier/fichier UI-only au look Maestro, avec API retour, range hôte variable, composants publics UI.BUTTON et UI.TinyNotepad, scrollbar de liste CSS, resynchronisation UI par sync_key et mode création de sous-dossier UI-only.

API : UI.FILE_EXPLORER

local result = UI.FILE_EXPLORER(SYS, "A2:N13", {
    id = "workdir_browser",
    mode = "folder_select",
    current_path = state.current_path,
    entries = state.entries,
    allow_new_folder = true,
    allow_new_file = false
})

Contrat : UI-only : ne lit pas le disque, ne crée rien, ne sauvegarde rien. Retourne une action structurée au POP. La liste fichiers/dossiers gère sa scrollbar verticale via CSS. CSS : [FILE_EXPLORER].

CPNT_GroupFrame

Composant de structuration visuelle (Baie de brassage).

API : UI.GroupFrame

UI.GroupFrame(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : aucune section dédiée détectée.

CPNT_Halo

Photon Halo / Additive Light Renderer

API : UI.OnPhotonWidget / UI.Draw_Photon_Halo / UI.Draw_Solar_Halo

UI.OnPhotonWidget(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [HALO].

CPNT_Header

Plugin de structure pour le rendu du bandeau supérieur.

API : UI.Header

UI.Header(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [HEADER].

CPNT_ListBox

ListBox et overlay compatibles render target Factory.

API : UI.ListBox_Overlay / UI.ListBox

UI.ListBox(SYS, "A3:N10", { items = items, selected = index })

Contrat : Liste UI. Les données viennent du module/POP. CSS : [LISTBOX].

CPNT_Notifier

Bandeau LCD avec rétroéclairage dynamique, mode guidage et CTA cliquable pour action utilisateur. En mode BLOCKING, le composant exploite le range hôte pour séparer titre, message et bouton.

API : UI.Notifier

local clicked = UI.Notifier(SYS, "A1:T3", {
    level = "BLOCKING",
    title = SYS.T("hub.notifier.workdir_missing.title"),
    body = SYS.T("hub.notifier.workdir_missing.body"),
    action_label = SYS.T("hub.notifier.workdir_missing.action"),
    clickable = true,
    dismissible = false
}, "ALERT", true)

Contrat : composant UI-only ; il affiche et retourne le clic. Le module décide ensuite du signal FSM. Les dimensions viennent du range Excel fourni par le module et du CSS [LCD_NOTIFIER].

CPNT_Popup

Fenêtre modale générique à ranges Excel explicites.

API : UI.Modal_Dialog

UI.Modal_Dialog(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [POPUP_MODAL].

CPNT_RichPopup

Hote visuel de module POP_* dans un range, selon le modele SidePanel sans animation droite-gauche.

API : UI.RICH_POPUP

UI.RICH_POPUP(SYS, popup_range, { module = "POP_WORKING_PROJECT_PROBE" })

Contrat : Container pur : héberge un POP_* déjà chargé, ne porte pas de métier. CSS : [RICH_POPUP].

CPNT_RichTxt

Dessine une ligne RichText dans un range Excel via la Factory avec padding CSS interne.

API : UI.RICHTXT

UI.RICHTXT(SYS, "A1:N1", "Titre")

Contrat : Affiche texte riche dans le range, padding CSS via [RICHTXT]. CSS : [RICHTXT].

CPNT_SideBar

Gestionnaire d'onglets verticaux avec mode disabled visuel pour les gates Project Guard.

API : UI.New_SideBar / SideBar:Draw

local sidebar = UI.New_SideBar(SYS, "AH1:AJ20")
sidebar:Draw(SYS, active_id, true) -- disabled visuel

Contrat : composant UI-only. En mode disabled, les onglets restent visibles, grisés et ne dispatchent aucune action. CSS : [SIDEBAR_TABS] + [TABS].

CPNT_SidePanel

SidePanel anime par rendu direct component-only, sans buffer offscreen ni dirty clip module

API : UI.SidePanel

UI.SidePanel(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [SIDE_PANEL].

CPNT_Slider

Composant curseur linéaire (Horizontal/Vertical) avec gestion du focus.

API : UI.Slider

UI.Slider(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [SLIDER].

CPNT_TinyNotepad

Tiny multiline text editor avec layout cache, viewport visible, scroll manuel stable et synchronisation externe contractuelle

API : UI.TinyNotepad.New / UI.TinyNotepad.Draw / UI.TinyNotepad.SaveState / UI.TinyNotepad.SetClipboard / UI.TinyNotepad.SetValue

UI.TinyNotepad.SetValue(editor, value, { force = true, clear_focus = true })

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. Le host synchronise un buffer via API publique, pas par patch local. CSS : [TINY_NOTEPAD]. Overrides locaux optionnels via css.

CPNT_TouchScreen

Moteur de rendu matriciel (LED/LCD) pour la texture de fond du cockpit.

API : UI.Draw_LED_Matrix

UI.Draw_LED_Matrix(SYS, range, props)

Contrat : Consommer via SYS.UI depuis modules/POP, sans charger le composant. CSS : [LED_MATRIX].

Focus CPNT_File_Explorer

P83G1I — Nettoyage contractuel

CPNT_File_Explorer orchestre maintenant les composants publics UI.BUTTON et UI.TinyNotepad. Les boutons ne sont plus redessinés localement ; la synchronisation du texte passe par UI.TinyNotepad.SetValue.

P83G1E : sync_key est une prop UI-only. Elle resynchronise les champs locaux du composant quand le POP détecte un changement de contexte officiel, sans déplacer de logique Project Guard dans le composant.

CPNT_File_Explorer est un composant UI-only d’explorateur. Il reçoit des entrées déjà construites par le POP, affiche la liste, héberge l’input via le composant public TinyNotepad, le menu contextuel, un mode temporaire de nom de nouveau dossier, et retourne une action structurée.

P83G1H : le composant ne crée toujours rien lui-même. Il émet prepare_new_folder, new_folder_name_change et virtual_folder ; le POP décide ensuite via moteur officiel. Si un sous-dossier est en cours de saisie, le bouton principal affiche une action dossier et produit le même effet que Enter.

local result = UI.FILE_EXPLORER(SYS, explorer_range, {
    id = "working_project_probe_file_explorer",
    mode = "folder_select",
    current_path = browser_state.current_path,
    entries = browser_state.entries,
    allow_new_folder = true,
    allow_new_file = false
})

if result and result.action == "open_path" then
    BrowserLoadPath(result.path)
elseif result and result.action == "validate" then
    -- le POP décide, puis SYS.MIDI / SYS.UTILS exécutent le métier
end

Interdits File Explorer : pas de lecture disque directe, pas de création physique, pas d’écriture USER_PREFS.ini, pas de Project Guard, pas de PowerShell, pas de processus externe.

P85A — Variants Button et charte sémantique

CPNT_Button accepte désormais options.variant pour utiliser les variants CSS de [BUTTON_VARIANT] : primary, secondary, cta, folder, danger, tech.

Les consoles utilisent les overrides P84A avec les alias de rôle role_project_health, role_next_actions, role_session_map, role_admin_results, etc.