MODAL
Marco de un OVERLAY (titulo + contenido). Con open/bind se comporta como dialogo propio accesible.
En esta página
Props
Tabla generada desde el esquema real (ui-schema.ts); si el esquema cambia, cambia esta tabla.
| Prop | Tipo | Requerido | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|---|
| title | texto | No | — | — | Titulo. |
| description | texto | No | — | — | Subtitulo. |
| icon | icono (Lucide) | No | — | — | Icono: nombre Lucide (p. ej. "Mail"), "lucide:<Nombre>", "brand:<slug>" (logotipo de una app integrada, p. ej. "brand:zoom") o "initials:<XY>". Un nombre desconocido se muestra como icono generico. |
| width | enum | No | "sm""md""lg""xl""full" | "md" | Ancho. |
| open | booleano | No | truefalse | — | Abre un dialogo propio (en lugar de un marco). |
| bind | nombre | No | — | — | Clave de state booleana que lo abre/cierra. |
| footer | componentes | No | — | — | Pie (botones). |
| onLoad | accion(es)acción | No | — | — | Accion al montar. |
| onLoadWhen | cualquiera | No | — | — | Condicion de onLoad. |
| onClose | accion(es)acción | No | — | — | Al cerrar. |
Props comunes a todos los componentes
| Prop | Tipo | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|
| hidden | booleano | truefalse | — | true oculta el componente (admite expresiones). |
| onLoad | accion(es)acción | — | — | Accion que se ejecuta una vez al montar. |
| onLoadWhen | cualquiera | — | — | Condicion: onLoad se ejecuta cuando pasa a verdadera. |
| ariaLabel | texto | — | — | Nombre accesible explicito. |
Eventos y acciones que acepta
Props que ejecutan una acción (o cadena de acciones). Las variables disponibles en ${...} dentro de la acción son las que recibe cada evento.
| Evento | Recibe | Descripción |
|---|---|---|
| onLoad | — | Accion al montar. |
| onClose | — | Al cerrar. |
Estado y contexto que usa
Cómo interactúa con state y context (expresiones ${...}).
bindEnlace bidireccional: lee y escribe
state.<clave>(admite rutas "a.b"). Vervalue/defaultValue.hidden / onLoadWhenCondiciones comunes:
hidden: "${!state.x}"oculta el componente;onLoadWhenejecutaonLoadal pasar a verdadera.
Simulador interactivo
Renderiza el JSON validado con el mismo renderer y el mismo kit que la app, con el tema actual de esta página. Nada sale a la red: CALL_BACKEND usa una respuesta simulada.
Acciones relacionadas
Acciones que este componente puede disparar desde sus props de acción (cualquiera de UI_ACTIONS) y las que lo controlan. Detalle de cada acción en la sección de acciones.
Usadas en sus ejemplos y manifests
- SET_STATE
Guarda
valueenstate[key](la clave admite ruta con puntos).Obligatorios:
key· Campos:keyvalue - TOAST
Muestra un aviso breve.
Obligatorios:
message· Campos:messagevarianttone - OPEN_OVERLAY
Abre un OVERLAY del manifest.
Obligatorios:
targetId· Campos:targetIdextensionIdoverlayspassArgspassResult - CALL_BACKEND
Llama a una funcion del server.js. Pone
state.$loading[key]/state.$error[key]solos, admite reintento y guarda el resultado conresultKey.Obligatorios:
function· Campos:functionargsparamskeyresultKeyretrytoastOnErroronSuccess
Acciones que lo controlan
- SET_STATE
Guarda
valueenstate[key](la clave admite ruta con puntos).Obligatorios:
key· Campos:keyvalue - OPEN_OVERLAY
Abre un OVERLAY del manifest.
Obligatorios:
targetId· Campos:targetIdextensionIdoverlayspassArgspassResult - CLOSE_OVERLAY
Cierra el overlay actual.
Obligatorios: — · Campos: —
Ejemplo en un manifest real
Tomado de bloomx-extensions/summarizer/manifest.json (core-summarizer), en mounts[2].component (punto OVERLAY).
También se usa en: airtable-records/manifest.json, appointments/manifest.json, asana-tasks/manifest.json, calendar/manifest.json, calendly/manifest.json, composer-helper/manifest.json.
{
"type": "MODAL",
"props": {
"title": "Email Summary",
"width": "lg",
"onLoadWhen": "${context.emailContent}",
"onLoad": {
"action": "CALL_BACKEND",
"function": "summarize",
"args": {
"content": "${context.emailContent}"
},
"onSuccess": {
"action": "SET_STATE",
"key": "summary",
"value": "${result.summary}"
},
"onError": {
"action": "SET_STATE",
"key": "error",
"value": "${error}"
}
},
"children": [
{
"type": "CONDITIONAL",
"props": {
"condition": "${state.error != null}",
"true": [
{
"type": "TEXT",
"props": {
"content": "${state.error}",
"variant": "error"
}
}
],
"false": [
{
"type": "TEXT",
"props": {
"content": "${state.summary || 'Generating summary...'}",
"variant": "body"
}
}
]
}
}
]
}
}{
"manifestVersion": "1.0",
"id": "my-extension",
"version": "1.0.0",
"name": "My extension",
"permissions": [],
"mounts": [
{
"point": "OVERLAY",
"component": {
"type": "MODAL",
"props": {
"title": "Email Summary",
"width": "lg",
"onLoadWhen": "${context.emailContent}",
"onLoad": {
"action": "CALL_BACKEND",
"function": "summarize",
"args": {
"content": "${context.emailContent}"
},
"onSuccess": {
"action": "SET_STATE",
"key": "summary",
"value": "${result.summary}"
},
"onError": {
"action": "SET_STATE",
"key": "error",
"value": "${error}"
}
},
"children": [
{
"type": "CONDITIONAL",
"props": {
"condition": "${state.error != null}",
"true": [
{
"type": "TEXT",
"props": {
"content": "${state.error}",
"variant": "error"
}
}
],
"false": [
{
"type": "TEXT",
"props": {
"content": "${state.summary || 'Generating summary...'}",
"variant": "body"
}
}
]
}
}
]
}
}
}
]
}