Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Compositor de prompt.

Patrón canónico de compositor de prompt para usaia, scribe, periodismo2 admin y claudia.

Verlo por niveles

Primero el componente, después la variación de marca y finalmente su uso dentro de una página.

Nivel 1Componente canónico
Sin adjuntos
Nivel 2Compañía de Innovación de Santiago · variación
1 archivo · 2,4 MB
Nivel 3Dentro de una página
Sitio · sección
Sin adjuntos
Ver y copiar el código de este render
HTML del nivel canónico
<form class="ui-sample ui-ai" data-prompt-composer="true"><label class="sr-only" for="prompt-0">Mensaje para el asistente</label><textarea class="input" id="prompt-0" rows="3" placeholder="Escribe una instrucción"></textarea><div><button class="btn btn--secondary" type="button">Adjuntar</button><span>Sin adjuntos</span><button class="btn btn--primary" type="submit">Enviar</button></div></form>

Variaciones por marca y sitio

Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.

usaia.cl

usaia

Autoridad: CANON.md + decisión de producto usaia
Sin adjuntos

Cambia en esta marca

  • Namebrand usaia en minúsculas y acento morado
  • Superficies para evidencia, herramientas y aprobación

Permanece canónico

  • Acciones explícitas y estados conectados
  • Misma anatomía, tipografía y navegación
innovacionsantiago.cl

Compañía de Innovación de Santiago

Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md
1 archivo · 2,4 MB

Cambia en esta marca

  • Navegación y contenido propios del servicio
  • Acento reservado para acciones y datos

Permanece canónico

  • Mark CIS y namebrand de tres líneas
  • IBM Plex Sans, foco, espaciado y anatomía

Comparación histórica recuperable

Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.

Estado actual
Compositor de prompt no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Compositor de prompt para Patrón canónico de compositor de prompt para usaia, scribe, periodismo2 admin y claudia.
Qué ocurre si respondes No
Compositor de prompt queda fuera de r19 y sus ejemplos siguen sólo como evidencia pendiente de reformulación.

Preparando comparación histórica…

Antes / r19

La comparación convierte una regla abstracta en una diferencia visible y verificable.

r19 · correctoContrato canónico renderizado
Sin adjuntos
  • Separa propuesta, evidencia, herramientas y aprobación humana.
  • Muestra procedencia, impacto y estado de cada tarea.
Antes · problema observadoAnti-ejemplo no interactivo
ListoLa tarea fue realizada correctamenteSin evidencia, herramientas, impacto ni aprobación
  • No presentes razonamiento sintético como evidencia.
  • No ejecutes mutaciones externas desde un control ambiguo.

Responsive

La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.

320 pxMóvil y zoom
Sin adjuntos
1280 pxEscritorio
1 archivo · 2,4 MB

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS y usaia · core/core-style
Consumidoresusaia, Scribe, Periodismo2 Admin y Claudia
DependenciasAI Elements adaptado, contrato de evidencia
Estadocandidato

Evidencia de adopción

Patrón propuesto. 0 implementaciones observadas en 0 repositorios.

La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.

DatoResultado
ClasificaciónPatrón propuesto
Implementaciones0 implementaciones observadas
RepositoriosNingún repositorio observado
Snapshotkit/componentes/componentes-observados.json

Consumidores observados

El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.

Estados

Estado requerido
idle
en curso
requiere aprobación
completo
error

Accesibilidad

  • Conserva nombre accesible, orden de lectura y foco visible.
  • Funciona a 320 px, con zoom de 200% y texto largo.
  • El color nunca es la única señal de estado o acción.
  • El contenido esencial permanece disponible sin JavaScript.

Código HTML

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<form class="ui-sample ui-ai" data-prompt-composer="true"><label class="sr-only" for="prompt-0">Mensaje para el asistente</label><textarea class="input" id="prompt-0" rows="3" placeholder="Escribe una instrucción"></textarea><div><button class="btn btn--secondary" type="button">Adjuntar</button><span>Sin adjuntos</span><button class="btn btn--primary" type="submit">Enviar</button></div></form>

Código TAILWIND

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<form class="ui-sample ui-ai border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-prompt-composer="true"><label class="sr-only" for="prompt-0">Mensaje para el asistente</label><textarea class="input border border-slate-400 bg-white px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2" id="prompt-0" rows="3" placeholder="Escribe una instrucción"></textarea><div><button class="btn btn--secondary border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="button">Adjuntar</button><span>Sin adjuntos</span><button class="btn btn--primary border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="submit">Enviar</button></div></form>

Código REACT

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
import type { ChangeEventHandler, FormEventHandler, MouseEventHandler } from "react";

export interface PromptComposerProps {
  /** Etiqueta del campo; sólo la leen los lectores de pantalla. */
  label?: string;
  /** Id del campo de texto. Usa uno distinto por compositor en la página. */
  id?: string;
  /** Nombre del parámetro enviado con la instrucción; sin él, el formulario nativo no envía el texto. */
  name?: string;
  /** Alto visible del campo, en líneas. */
  rows?: number;
  placeholder?: string;
  /** Texto inicial de un campo no controlado. */
  defaultValue?: string;
  /** Texto de un campo controlado; va junto con `onChange`. */
  value?: string;
  onChange?: ChangeEventHandler<HTMLTextAreaElement>;
  /** Texto del botón para adjuntar archivos; vacío oculta el botón. */
  attachLabel?: string;
  onAttach?: MouseEventHandler<HTMLButtonElement>;
  /** Estado de los adjuntos junto a los botones («Sin adjuntos», «1 archivo · 2,4 MB»); vacío lo oculta. */
  status?: string;
  /** Texto del botón que envía el formulario. */
  submitLabel?: string;
  /** URL que recibe el formulario nativo (atributo `action`). */
  action?: string;
  method?: "get" | "post";
  onSubmit?: FormEventHandler<HTMLFormElement>;
  className?: string;
}

/**
 * Formulario para escribir una instrucción a un asistente de IA, adjuntar archivos y enviarla; se usa al pie de una conversación.
 *
 * Es un `<form>` nativo con la etiqueta del campo oculta a la vista: para enviarlo sin JavaScript, pasa `action`, `method` y `name`. El campo es controlado sólo si llegan `value` y `onChange`. Enviar es la acción principal (`btn--primary`) y Adjuntar, la secundaria.
 *
 * @example <PromptComposer id="prompt" name="prompt" action="/conversaciones/184" method="post" />
 * @example <PromptComposer id="prompt" value={texto} onChange={cambiarTexto} status="1 archivo · 2,4 MB" onAttach={adjuntar} onSubmit={enviar} />
 */
export function PromptComposer({
  label = "Mensaje para el asistente",
  id = "prompt-0",
  name,
  rows = 3,
  placeholder = "Escribe una instrucción",
  defaultValue = "",
  value,
  onChange,
  attachLabel = "Adjuntar",
  onAttach,
  status = "Sin adjuntos",
  submitLabel = "Enviar",
  action,
  method,
  onSubmit,
  className,
}: PromptComposerProps) {
  const controlado = value !== undefined && onChange !== undefined;
  return (
    <form className={["ui-ai", className].filter(Boolean).join(" ")} data-prompt-composer action={action} method={method} onSubmit={onSubmit}>
      <label className="sr-only" htmlFor={id}>{label}</label>
      <textarea
        className="input"
        id={id}
        name={name}
        rows={rows}
        placeholder={placeholder}
        {...(controlado ? { value, onChange } : { defaultValue: value ?? defaultValue })}
      />
      <div>
        {attachLabel ? <button className="btn btn--secondary" type="button" onClick={onAttach}>{attachLabel}</button> : null}
        {status ? <span>{status}</span> : null}
        <button className="btn btn--primary" type="submit">{submitLabel}</button>
      </div>
    </form>
  );
}