Code Block
Des blocs de code conçus pour les réponses d’IA. Coloration syntaxique qui suit le streaming, copie, téléchargement et retour à la ligne, numéros de ligne et lignes surlignées, diffs avec accepter et rejeter, et un terminal pour les commandes.
Le code d’une réponse d’IA arrive quelques caractères à la fois, souvent sous forme de diff qu’une personne doit approuver. Code Block colore pendant le streaming, suit les nouvelles lignes sauf si le lecteur a remonté, et garde la copie, le téléchargement et le retour à la ligne discrets jusqu’à ce que le code soit complet.
La coloration utilise Shiki avec les thèmes clair et sombre de GitHub, chargés à la demande par langage. Seules les nouvelles lignes sont tokenisées à mesure que le texte arrive, donc les longs fichiers restent rapides, et les deux thèmes sont rendus en même temps, si bien que changer de jeu de couleurs ne provoque jamais de flash. Les blocs de plus de 16 lignes se replient derrière « Show all ».
Passez un diff unifié et vous obtenez les numéros de ligne anciens et nouveaux, un compteur de changements et des lignes teintées ; la copie donne la nouvelle version, pas le diff. Ajoutez une revue et le lecteur peut accepter ou rejeter le changement, avec ⌘↵ et ⌘⌫ tant que le block a le focus. CodeFence branche le même block dans Streamdown, et CodeTerminal affiche des commandes avec leur sortie et leur code de sortie.
Ajouter le registre Pro à components.json
components.json Ajouter votre token
Créez un token sur votre page de compte et placez-le dans
.env.localsous le nomHEXTAUI_PRO_TOKEN.Ajouter le block
pnpm dlx shadcn@latest add @hextaui-pro/code-block
Dans du Markdown avec Streamdown
Enregistrez CodeFence comme moteur de rendu. Il lit le langage et les réglages de la fence comme title="app/page.tsx", {2,4-6} et showLineNumbers, et conserve la coloration tant que la fence est encore en streaming.
Relire un changement
Montrez une modification proposée sous forme de diff et laissez le lecteur l’accepter ou la rejeter, avec ⌘↵ et ⌘⌫ tant que le block a le focus.
Seul
Passez directement le code et le langage, par exemple quand un appel d’outil renvoie le contenu d’un fichier.
Anatomie
Les parties à composer, de l’extérieur vers l’intérieur.
| Partie | Description |
|---|---|
CodeBlock | Le block lui-même : en-tête, actions, code et barre de revue facultative. |
CodeFence | Un moteur de rendu Streamdown qui transforme le code délimité en CodeBlock. |
CodeTerminal | Une commande avec sa sortie en streaming et son code de sortie. |
CopyButton, DownloadButton, WrapToggle | Les actions de l’en-tête, exportées pour vos propres en-têtes. |
LanguageIcon | La marque du langage utilisée dans l’en-tête. |
| Prop | Type | Par défaut |
|---|---|---|
codeLa source, ou un diff unifié lorsque diff est défini. | string | – |
languageIdentifiant ou alias de langage Shiki, comme tsx, py ou bash. Les identifiants inconnus s’affichent en texte brut. | string | – |
filenameAffiché dans l’en-tête et utilisé pour les téléchargements. | string | – |
streamingGarde la coloration incrémentale, suit les nouvelles lignes et désactive les actions. | boolean | false |
diffTraite le code comme un diff unifié. | boolean | false |
lineNumbersAffiche les numéros de ligne. Les diffs les affichent sauf si la valeur est false. | boolean | – |
startLineNuméro de la première ligne. | number | 1 |
highlightNuméros de ligne à marquer. | number[] | [] |
defaultWrapDémarre avec les longues lignes à la ligne. | boolean | false |
collapseAfterReplie au-delà de ce nombre de lignes. 0 ne replie jamais. | number | 16 |
actionsContrôles supplémentaires dans l’en-tête, avant les contrôles intégrés. | ReactNode | – |
onApplyAffiche un bouton Apply qui confirme avec « Applied ». | () => unknown | – |
reviewAffiche la barre de revue tant que c’est en attente, et un badge une fois accepté ou rejeté. | CodeBlockReview | – |
| Prop | Type | Par défaut |
|---|---|---|
statusLa décision actuelle. | "pending" | "accepted" | "rejected" | – |
onAcceptAppelé depuis Accept ou ⌘↵. | () => void | – |
onRejectAppelé depuis Reject ou ⌘⌫. | () => void | – |
CodeFence
À enregistrer avec Streamdown : plugins={{ renderers: [{ language: codeFenceLanguages, component: CodeFence }] }}.
| Prop | Type | Par défaut |
|---|---|---|
codeContenu de la fence, fourni par Streamdown. | string | – |
languageLangage de la fence, fourni par Streamdown. | string | – |
metaTout ce qui suit le langage : title="…", {1,3-5}, showLineNumbers, startLine=10. | string | – |
isIncompletetrue tant que la fence est encore ouverte. | boolean | – |
| Prop | Type | Par défaut |
|---|---|---|
commandLa commande exécutée. | string | – |
outputSortie jusqu’ici. Ajoutez-y au fil du streaming. | string | "" |
runningAffiche un spinner et suit la nouvelle sortie. | boolean | false |
exitCodeAffiché à la fin. Toute valeur autre que 0 est marquée comme échec. | number | – |
titleLibellé de l’en-tête. | string | "Terminal" |
| Touche | Action |
|---|---|
| Tab | Parcourt les actions de l’en-tête, la zone de code et Show all. |
| ⌘↵ | Accepte une revue en attente tant que le focus est dans le block. |
| ⌘⌫ | Rejette une revue en attente tant que le focus est dans le block. |
| ←→ | Fait défiler les longues lignes quand la zone de code a le focus. |
- La zone de code est une région focalisable nommée d’après le fichier, par exemple « app/page.tsx code », pour que les utilisateurs du clavier puissent la faire défiler.
- Les lignes modifiées ne reposent pas sur la couleur. Les marqueurs + et − sont purement visuels, et les lecteurs d’écran entendent « added » ou « removed » avant chaque ligne modifiée à la place.
- Copy annonce « Copied » et chaque bouton d’icône a un libellé et une infobulle.
- Les raccourcis de revue sont ignorés pendant la saisie dans un champ, donc ils ne volent jamais de frappes.
Construit avec
Les composants HextaUI gratuits dont Code Block est constitué. Chacun s’installe séparément.
Code
9 fichiers, ajoutés à components/blocks/code-block.