Saltar al contenido
EspañolEnglish
Todos los componentes (204)

Entrada de prompt

IA · PromptInput

Qué es y cuándo usarlo

La caja donde se escribe a un asistente: crece con el texto, envía con Intro, admite ficheros pegados, arrastrados o elegidos, y mientras hay una respuesta en marcha el botón de enviar pasa a ser el de parar.

Cuándo usarlo

  • Como entrada de un chat con un asistente, de una línea a un mensaje largo.
  • Con adjuntos y una barra de herramientas propia (el modelo, los atajos, la voz).
  • Con un asistente que puede seguir trabajando mientras escribes: busyModes deja elegir qué hacer con el mensaje (añadirlo al turno, parar y corregir, encolarlo).

Cuándo no

  • Para un campo de formulario de varias líneas: es un TextArea.
  • Para una búsqueda: es un SearchField.

Teclado: Intro envía y Mayús+Intro baja de línea (con submitOn="mod-enter" es al revés y con Ctrl o Cmd). Mientras se compone con un IME, Intro no envía. Con el campo vacío, la flecha arriba recupera lo último enviado (recall). Pegar un fichero lo entrega a onFiles en vez de pegarlo.

Mientras responde: sin busyModes, busy bloquea el envío y el botón pasa a ser «Parar» (si hay onStop). Con busyModes sí se envía: sale una fila de opciones sobre el campo -radios de verdad, con las flechas y el tabulador único del navegador- y onSubmit recibe la elegida en su segundo argumento ({ mode }). «Parar» pasa a estar al lado de «Enviar». busyMode/defaultBusyMode la gobiernan, busyLabel cambia el rótulo.

Para integrarlo en un chat real: inputRef entrega el campo para enfocarlo desde fuera; actions añade botones a la derecha (voz, variables, más acciones); onPasteText permite decidir qué pasa con un texto pegado enorme (devolviendo true no se pega: se adjunta como fichero, por ejemplo); onInputKeyDown corre antes que las teclas de la caja y, si hace preventDefault(), la caja no hace lo suyo; inputProps deja pasar spellCheck, lang, autoFocus, maxLength...; attachDisabled apaga el clip cuando se acaba el cupo de ficheros.

Accesibilidad: el campo lleva el nombre que se pase en label (obligatorio) y el formulario se marca como ocupado mientras hay una respuesta en marcha. El botón de enviar queda apagado sin texto, y el de parar tiene su propio nombre. Soltar ficheros se avisa también con texto.

Aspecto fino: variables CSS --amset-prompt-input-max-rows (cuántas líneas crece antes de desplazarse) y --amset-prompt-input-pad.

Cómo se ve

<PromptInput
  label="Mensaje"
  placeholder="Escribe a tu asistente…"
  onSubmit={(texto) => enviar(texto)}
/>

Props

Se importa con import { PromptInput } from '@amset/ui'. Las obligatorias van marcadas.

PropTipoPara qué sirve
labelobligatoriastringQue es el campo, para quien no lo ve: «Mensaje». Obligatorio: un campo sin nombre no se puede usar con lector de pantalla ni con control por voz.
onSubmitobligatoria(value: string, context: PromptSubmitContext) => voidSe llama al enviar, con el texto tal cual y, de segundo argumento, como se envia (`mode`). Sin `value`, el campo se vacia solo; con `value`, vaciarlo es cosa de quien lo controla.
acceptstringQue tipos admite el selector de ficheros: `image/*,.pdf`.
actionsReactNodeLo que va a la derecha, justo antes del boton de enviar: la voz, las variables, un menu de mas acciones.
allowEmptybooleanPermite enviar sin texto (con solo un adjunto). Por defecto, no.
attachDisabledbooleanSe acabo el cupo de ficheros: el clip se apaga. Los pegados y soltados los limita quien recibe `onFiles`.
attachmentsReactNodeLos adjuntos ya puestos, encima del campo.
busybooleanHay una respuesta en marcha: no se envia, y si hay `onStop` el boton pasa a ser «Parar». Con `busyModes` si se envia -de la forma que se elija- y «Parar» sale al lado del boton de enviar.
busyLabelstringEl rotulo de la fila de opciones: «AMSET esta trabajando. Tu mensaje:». Por defecto, uno generico.
busyModestringLa forma elegida, gobernada desde fuera.
busyModesreadonly PromptBusyMode[]Formas de enviar mientras hay una respuesta en marcha. Con esto, `busy` no bloquea el envio: aparece una fila de opciones encima del campo y `onSubmit` recibe la elegida. Sin esto, mientras responde no se envia.
busyModeScopestringCuando cambia, la forma de enviar elegida vuelve a la de por defecto: un turno nuevo, por ejemplo. Hace falta porque «Parar y corregir» destruye trabajo y no debe quedarse puesto de un turno al siguiente.
classNamestringSe une a las clases de la biblioteca, no las sustituye.
defaultBusyModestringLa forma elegida al empezar. Por defecto, la primera.
defaultValuestring—
disabledboolean—
historyreadonly string[]Lo enviado antes, del mas viejo al mas nuevo: con el campo vacio la flecha arriba recorre hacia atras y la flecha abajo vuelve hacia delante hasta lo que se estaba escribiendo. Si esta, manda sobre `recall`.
inputPropsPromptInputFieldPropsAtributos del campo que la caja no gobierna: `spellCheck`, `lang`, `autoFocus`, `maxLength`...
inputRefRef<HTMLTextAreaElement>El `<textarea>`, para enfocarlo desde fuera (tras elegir una plantilla, al cerrar una busqueda).
onBusyModeChange(mode: string) => void—
onChange(value: string) => void—
onFiles(files: readonly File[]) => voidPegar o arrastrar ficheros, o elegirlos con el clip. Con esto aparece el boton de adjuntar.
onInputKeyDown(event: KeyboardEvent<HTMLTextAreaElement>) => voidUna tecla antes que las de la caja. Si la llamada hace `preventDefault()`, la caja no hace lo suyo (enviar, recuperar lo ultimo): sirve para atajos propios, como Escape para parar o Ctrl+K.
onPasteText(text: string) => booleanSe llama al pegar TEXTO. Si devuelve `true`, lo ha gestionado quien llama y no se pega: es lo que hace un chat con un texto larguisimo, que prefiere adjuntarlo como fichero antes que dejarlo dentro del campo.
onStop() => void—
pastedFileName(file: File, index: number) => stringEl nombre de un fichero PEGADO. Los navegadores llaman `image.png` a toda captura pegada, y dos seguidas chocan en la lista y en el servidor: con esto se les da uno propio (`pegado-1.png`). Solo afecta a lo pegado, no a lo soltado ni a lo elegido con el clip.
placeholderstring—
recallstringLo ultimo que se envio: con el campo vacio, la flecha arriba lo recupera.
submitDisabledbooleanImpide enviar aunque haya texto: una subida en curso, por ejemplo.
submitOnPromptSubmitOn`enter` envia con Intro y baja de linea con Mayus+Intro; `mod-enter`, al reves y con Ctrl/Cmd; `auto`, segun el puntero.
toolbarReactNodeLo que va a la izquierda de la barra de abajo: el motor, el modelo, los atajos.
valuestring—

Acepta además los atributos del elemento que pinta: className, style, data-*, aria-* y sus eventos.

En el banco de pruebas

Cada estado y cada variante, para tocarlos de uno en uno, en su ficha de ui.amset.tech: