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.
dofile de composant et ne résolvent pas via _G.P84A — Overrides CSS contractuels
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
| Composant | Version | Rôle | API publique | CSS |
|---|---|---|---|---|
| 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_ChassisUI.Draw_Bezel_ImmediateUI.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.MONITOR | UI.Console | [LCD_CONSOLE] |
| CPNT_ExcelGrid COMPONENTS/CPNT_ExcelGrid.lua | 12.1.0 2026.05.11 | Calque d | UI.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 Renderer | UI.OnPhotonWidgetUI.Draw_Photon_HaloUI.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_OverlayUI.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 étendu | UI.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_SideBarSideBar: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 module | UI.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 contractuelle | UI.TinyNotepad.NewUI.TinyNotepad.DrawUI.TinyNotepad.SaveStateUI.TinyNotepad.SetClipboardUI.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 visuelContrat : 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.
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.