Dónde se pueden usar los componentes de front
Los componentes de front pueden renderizarse en dos ubicaciones dentro de Twenty:- Panel lateral — Los componentes de front no headless se abren en el panel lateral derecho. Este es el comportamiento predeterminado cuando un componente de front se activa desde el menú de comandos.
- Widgets (tableros y páginas de registros) — Los componentes de front pueden incrustarse como widgets dentro de los diseños de página. Al configurar un tablero o el diseño de una página de registro, los usuarios pueden agregar un widget de componente de front.
- Emparejarlo con un elemento del menú de comandos: lo registra en el menú de comandos (Cmd+K) y, de forma opcional, como una acción rápida fijada.
- Incrustarlo como widget en un diseño de página: lo coloca en la página de detalles de un registro o en un tablero.
Ejemplo básico
La forma más rápida de ver un componente de front en acción es emparejarlo con undefineCommandMenuItem, de modo que aparezca como un botón de acción rápida en la esquina superior derecha de la página:
src/front-components/hello-world.tsx
src/command-menu-items/hello-world.command-menu-item.ts
yarn twenty dev (o ejecutar una sola vez yarn twenty dev --once), la acción rápida aparece en la esquina superior derecha de la página:

Campos de configuración
| Campo | Obligatorio | Descripción |
|---|---|---|
universalIdentifier | Sí | ID único estable para este componente |
component | Sí | Una función de componente de React |
name | No | Nombre para mostrar |
description | No | Descripción de lo que hace el componente |
isHeadless | No | Configura en true si el componente no tiene UI visible (ver abajo) |
Colocar un componente de frontend en una página
Más allá de los comandos, puedes incrustar un componente de frontend directamente en una página de registro agregándolo como un widget en un diseño de página. Consulta Diseños de página para más detalles.Headless vs no headless
Los componentes de front vienen en dos modos de renderizado controlados por la opciónisHeadless:
No headless (predeterminado) — El componente renderiza una UI visible. Cuando se activa desde el menú de comandos, se abre en el panel lateral. Este es el comportamiento predeterminado cuando isHeadless es false o se omite.
Headless (isHeadless: true) — El componente se monta de forma invisible en segundo plano. No abre el panel lateral. Los componentes headless están diseñados para acciones que ejecutan lógica y luego se desmontan — por ejemplo, ejecutar una tarea asíncrona, navegar a una página o mostrar un modal de confirmación. Se combinan de forma natural con los componentes Command del SDK descritos a continuación.
src/front-components/sync-tracker.tsx
null, Twenty omite renderizar un contenedor para él — no aparece espacio vacío en el diseño. El componente sigue teniendo acceso a todos los hooks y a la API de comunicación con el host.
Componentes Command del SDK
El paquetetwenty-sdk proporciona cuatro componentes auxiliares Command diseñados para componentes de front headless. Cada componente ejecuta una acción al montarse, gestiona los errores mostrando una notificación tipo snackbar y desmonta automáticamente el componente de front al finalizar.
Impórtalos desde twenty-sdk/command:
Command— Ejecuta un callback asíncrono mediante la propexecute.CommandLink— Navega a una ruta de la aplicación. Props:to,params,queryParams,options.CommandModal— Abre un modal de confirmación. Si el usuario confirma, ejecuta el callbackexecute. Props:title,subtitle,execute,confirmButtonText,confirmButtonAccent.CommandOpenSidePanelPage— Abre una página específica del panel lateral. Props:page,pageTitle,pageIcon.
Command para ejecutar una acción desde el menú de comandos:
src/front-components/run-action.tsx
src/command-menu-items/run-action.command-menu-item.ts
CommandModal para pedir confirmación antes de ejecutar:
src/front-components/delete-draft.tsx
Llamar a una función de lógica
Los componentes de front se ejecutan en el navegador dentro de un Web Worker aislado (sandboxed), mientras que las funciones de lógica se ejecutan en el servidor. No hay una llamada directa en el mismo proceso entre ambos; en su lugar, un componente de front accede a una función de lógica a través de HTTP. Una función de lógica declarada conhttpRouteTriggerSettings se expone bajo el endpoint /s/ en ${TWENTY_API_URL}/s\<path>. Tu componente de front llama a esa ruta con el RestApiClient de twenty-client-sdk/rest, que se autentica con el TWENTY_APP_ACCESS_TOKEN que Twenty inyecta en el worker.
El RestApiClient está diseñado precisamente para esto. Lee TWENTY_API_URL y TWENTY_APP_ACCESS_TOKEN del entorno del worker, añade la cabecera Authorization: Bearer, serializa y analiza JSON, y lanza un RestApiClientError cuando faltan el token o la URL o la respuesta no es 2xx, para que no tengas que volver a implementar ese código repetitivo en cada componente.
Un componente de front sin interfaz (headless) puede ejecutar la llamada al montar mediante el componente Command y luego desmontarse automáticamente:
src/front-components/sync-prs.tsx
httpRouteTriggerSettings.path de la función lógica con el prefijo /s. Mantén isAuthRequired: true; el cliente proporciona el token de acceso de la aplicación que Twenty emite para tu componente:
src/logic-functions/fetch-prs.logic-function.ts
TWENTY_API_URL y TWENTY_APP_ACCESS_TOKEN se inyectan automáticamente; consulta Variables de la aplicación. Dado que las variables de aplicación secretas nunca se exponen a los componentes de front, mantén las claves de API y otra lógica confidencial en la función de lógica, no en el componente de front.Referencia de RestApiClient
Importa RestApiClient desde twenty-client-sdk/rest. Pertenece a la misma familia de clientes que CoreApiClient y MetadataApiClient, pero se dirige a las rutas HTTP de tu aplicación en lugar de a la API de GraphQL.
| Método | Descripción |
|---|---|
get(path, options?) | Envía una solicitud GET |
post(path, body?, options?) | Envía una solicitud POST |
put(path, body?, options?) | Envía una solicitud PUT |
patch(path, body?, options?) | Envía una solicitud PATCH |
delete(path, options?) | Envía una solicitud DELETE |
request(method, path, options?) | Solicitud genérica con cualquier método HTTP |
options acepta headers, query (un registro de parámetros de cadena de consulta; los valores nulos o indefinidos se omiten) y un AbortSignal mediante signal. Un objeto body que no sea de tipo FormData se serializa automáticamente como JSON. Ante un 401, el cliente actualiza el token de acceso una vez a través del host y vuelve a intentar la solicitud.
La URL base y el token se resuelven desde el entorno de forma predeterminada. Pasa opciones de sobrescritura al constructor cuando sea necesario — por ejemplo, en pruebas:
RestApiClientError que expone status, statusText, url y el body analizado:
Acceder al contexto de ejecución
Dentro de tu componente, usa hooks del SDK para acceder al usuario actual, el registro y la instancia del componente:src/front-components/record-info.tsx
| Hook | Devuelve | Descripción |
|---|---|---|
useUserId() | string o null | El ID del usuario actual |
useSelectedRecordIds() | string[] | Todos los ID de los registros seleccionados (array vacío si no hay ninguno seleccionado) |
useRecordId() | string o null | Obsoleto. Usa useSelectedRecordIds() en su lugar |
useFrontComponentId() | string | El ID de esta instancia del componente |
useColorScheme() | 'light' o 'dark' | La combinación de colores activa de la interfaz de usuario del host (System ya está resuelto) |
useFrontComponentExecutionContext(selector) | varía | Accede al contexto de ejecución completo con una función selectora |
Variables de aplicación
Las variables de aplicación definidas endefineApplication() con isSecret: false están disponibles dentro de los componentes de front mediante la utilidad getApplicationVariable:
src/front-components/greeting.tsx
process.env:
| Variable | Descripción |
|---|---|
TWENTY_API_URL | URL base de la API de Twenty |
TWENTY_APP_ACCESS_TOKEN | Token de corta duración limitado al rol de tu aplicación |
API de comunicación con el host
Los componentes de frontend pueden activar navegación, modales y notificaciones usando funciones detwenty-sdk:
| Función | Descripción |
|---|---|
navigate(to, params?, queryParams?, options?) | Navegar a una página en la aplicación |
openSidePanelPage(params) | Abrir un panel lateral |
closeSidePanel() | Cerrar el panel lateral |
openCommandConfirmationModal(params) | Mostrar un cuadro de diálogo de confirmación |
enqueueSnackbar(params) | Mostrar una notificación tipo toast |
unmountFrontComponent() | Desmontar el componente |
updateProgress(progress) | Actualizar un indicador de progreso |
src/front-components/archive-record.tsx
Trabajar con varios registros
UsauseSelectedRecordIds() para manejar varios registros seleccionados. Esto es útil para operaciones por lotes:
src/front-components/bulk-export.tsx
Recursos públicos
Los componentes de frontend pueden acceder a archivos del directoriopublic/ de la aplicación usando getPublicAssetUrl:
Estilo
Los componentes de frontend admiten varios enfoques de estilos. Puedes usar:- Estilos en línea —
style={{ color: 'red' }} - Componentes de Twenty UI — importa desde
twenty-sdk/ui(Button, Tag, Status, Chip, Avatar y más) - Emotion — CSS-in-JS con
@emotion/react - Styled-components — patrones de
styled.div - Tailwind CSS — clases utilitarias
- Cualquier librería CSS-in-JS compatible con React