Skip to content
Agent UI
Provider composesCopy-paste blockmimo-composeLive stage

MiMo Compose

A copy-paste block that recreates the MiMo prompt stage with Xiaomi's rail, brand mark, prompt surface, model menu, and tool toggles. The block is not a package component: copy the file, or install it with the shadcn CLI, then edit the layout like any other file in your project. It is assembled entirely from Agent UI compose primitives, and every control is keyboard accessible.

Source you own: install the block with the shadcn CLI or copy components/blocks/composes/mimo-compose.tsx. The preview below is the real file, and the code tab is the exact source.

components/blocks/composes/mimo-compose.tsx
Xiaomi MiMo

HELLO, I'M MiMo

MiMo-V2.6 · built in public

Xiaomi MiMo-V2.6-Series

Frontier intelligence, all the modalities, built in public.

Xiaomi MiMo-V2.5-TTS Series

Give your agent a voice. Give it a soul.

The code tab contains the full block, ready to copy.

Installation

Add the block with the shadcn CLI. It writes components/blocks/composes/mimo-compose.tsx and installs its dependencies.

bash
npx shadcn@latest add https://agent-ui-27t.pages.dev/r/mimo-compose.json

Prefer to own the file manually? Install the dependencies, then copy the source from the Files section.

bash
pnpm add @agent-ui/react lucide-react

Tailwind CSS v4 users: add @source "../node_modules/@agent-ui/react/src" to the global stylesheet so the library utilities are generated.

Usage

Import the copied file and render it anywhere. The block accepts onSend, disabled, and className; wire onSend to any backend.

tsx
import { MimoCompose } from "@/components/blocks/composes/mimo-compose";
 
<MimoCompose onSend={(text) => console.log(text)} />

Files

One file. The same source is served by the shadcn registry endpoint, so the CLI and the docs can never drift.

components/blocks/composes/mimo-compose.tsxtsx
tsx
"use client";
 
import * as React from "react";
import { ArrowUp, ChevronDown, Plus } from "lucide-react";
import {
ComposeSendButton,
ComposeTextarea,
ModelChip,
createCompose,
type ComposeProps,
} from "@agent-ui/react";
 
const Root = createCompose({
id: "mimo",
maxWidth: "max-w-none",
placeholder: "Ask MiMo anything…",
models: [
{ id: "mimo-v2-6", name: "MiMo-V2.6", hint: "Flagship" },
{ id: "mimo-v2-5", name: "MiMo-V2.5", hint: "Balanced" },
{ id: "mimo-v2-5-tts", name: "MiMo-V2.5-TTS", hint: "Speech" },
],
});
 
const PATTERN = ["M O M I M O", "M I M O M I", "O M I M O M", "I M O M I M", "M O M I M O"];
 
/** Xiaomi MiMo: bone grid paper, brutalist black display type, squared controls. */
function MimoComposeLayout() {
return (
<div className="relative flex min-h-[400px] w-full flex-col overflow-hidden bg-[#f7f2e8] px-5 pb-4 pt-3 text-[13px] text-[#111]">
<div
aria-hidden="true"
className="pointer-events-none absolute inset-0 flex flex-col justify-between py-6 text-[26px] font-black tracking-[0.35em] text-[#111] opacity-[0.045]"
>
{PATTERN.map((row, i) => (
<span key={`${row}-${i}`} className="whitespace-nowrap">
{row} {row} {row}
</span>
))}
</div>
 
<div className="relative flex items-center gap-2">
<span className="text-[13.5px] font-semibold tracking-tight">Xiaomi MiMo</span>
<nav className="ml-auto flex items-center gap-3 text-[10.5px] text-black/70">
<span className="flex items-center gap-1">
Product <ChevronDown className="h-2.5 w-2.5" aria-hidden="true" />
</span>
<span className="flex items-center gap-1">
Research <ChevronDown className="h-2.5 w-2.5" aria-hidden="true" />
</span>
<span>Join Us</span>
</nav>
</div>
 
<h1 className="relative my-auto text-center text-[38px] font-black uppercase leading-none tracking-[-0.03em]">
HELLO, I&apos;M MiMo
</h1>
 
<div
data-agent-id="compose-card"
className="relative mx-auto w-full max-w-[480px] border border-black bg-white p-2.5 shadow-[3px_3px_0_0_#111] transition-[box-shadow,transform] duration-150 focus-within:-translate-y-0.5 focus-within:shadow-[5px_5px_0_0_#111]"
>
<ComposeTextarea
aria-label="Message MiMo"
placeholder="Ask MiMo anything…"
rows={1}
className="min-h-[30px] px-0.5 py-1 text-[13.5px] leading-5 placeholder:text-black/40"
/>
<div className="mt-1 flex items-center justify-between">
<div className="flex items-center gap-1.5">
<button
type="button"
aria-label="Attach"
className="grid h-6 w-6 place-items-center border border-black/40 hover:bg-black/5"
>
<Plus className="h-3.5 w-3.5" aria-hidden="true" />
</button>
<span className="font-mono text-[8.5px] uppercase tracking-[0.12em] text-black/55">
MiMo-V2.6 · built in public
</span>
</div>
<div className="flex items-center gap-1">
<ModelChip
tone="light"
className="[&>button]:h-6 [&>button]:rounded-none [&>button]:border [&>button]:border-transparent [&>button]:px-1 [&>button]:font-mono [&>button]:text-[9px] [&>button]:uppercase [&>button]:tracking-wider [&>button]:hover:border-black/20"
/>
<ComposeSendButton
aria-label="Send message"
className="h-7 w-7 rounded-none bg-[#111] text-white hover:bg-black disabled:bg-[#d8d2c6] disabled:text-white disabled:opacity-100"
icon={<ArrowUp className="h-3.5 w-3.5" strokeWidth={2.6} />}
/>
</div>
</div>
</div>
 
<div className="relative mt-3 grid grid-cols-2 gap-2">
{[
{
title: "Xiaomi MiMo-V2.6-Series",
sub: "Frontier intelligence, all the modalities, built in public.",
},
{ title: "Xiaomi MiMo-V2.5-TTS Series", sub: "Give your agent a voice. Give it a soul." },
].map(({ title, sub }) => (
<div key={title} className="border border-black bg-[#f7f2e8] p-2">
<p className="text-[10px] font-bold tracking-tight">{title}</p>
<p className="mt-0.5 text-[8.5px] leading-snug text-black/50">{sub}</p>
</div>
))}
</div>
</div>
);
}
 
export function MimoCompose(props: ComposeProps) {
return (
<Root {...props}>
<MimoComposeLayout />
</Root>
);
}
 

Built with

The block imports these Agent UI primitives. Each one is a package export with its own docs page, so you can change the layout without giving up the behaviour.

Accessibility

All controls expose accessible names; the textarea supports Enter to send and Shift+Enter for a new line.

MiMo also has a full product page.

Metadata, model list, and the same block in a dedicated route.

Open MiMo
Use it with the rest of the library

MimoCompose composes with MessageList, ChatShell, useChat, and the provider compose blocks. Browse the full reference or see all components in the gallery.

120 lines · copy-ready