1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# Galerie d'interface pour les mods
6
7> Découvrez les éléments d'interface qu'un mod Claude Code peut dessiner, comme du texte, des boutons, des champs, du Markdown, du code et des diffs, avec des exemples de code et des captures d'écran du terminal.
8
9Un mod dessine son interface à partir d'éléments : du texte, des boîtes, des boutons, des champs, et quelques éléments qui mettent en forme le contenu pour vous. Les exemples présentés ici montrent le code qui dessine un élément, et la plupart sont accompagnés d'une capture d'écran du résultat dans un panneau du terminal, afin que vous puissiez choisir un élément selon son apparence.
10
11Pour comprendre le fonctionnement du dessin, commencez par [Dessiner dans l'interface](/docs/fr/plugins/mods/interface). Pour les principales props et les applications qui dessinent chaque élément, consultez la [référence des éléments](/docs/fr/plugins/mods/reference#elements). Les [déclarations de types](/docs/fr/plugins/mods/create#get-the-types-for-your-build) répertorient toutes les props.
12
13<h2 id="try-a-sample">
14 Essayer un exemple
15</h2>
16
17Les exemples de cette page sont des extraits, et non des mods complets. Chacun correspond au code d'un élément et de tout ce qui y est imbriqué.
18
19Pour voir un exemple dans votre propre terminal, créez le petit mod décrit dans ces étapes et collez-y l'exemple. Le mod ajoute une commande `/gallery` qui ouvre un panneau et y dessine l'exemple. Un [panneau](/docs/fr/plugins/mods/interface#pick-where-to-draw) est une barre latérale à côté de la transcription dans un terminal large en plein écran, ou sinon une zone encadrée au-dessus du prompt.
20
21<Steps>
22 <Step title="Créer le mod">
23 Créez un répertoire nommé `gallery` contenant les répertoires `.claude-plugin` et `hooks`. [Créer un mod](/docs/fr/plugins/mods/create#write-a-mod-yourself) explique les fichiers.
24
25 Enregistrez le manifeste sous `gallery/.claude-plugin/plugin.json` :
26
27 ```json gallery/.claude-plugin/plugin.json theme={null}
28 {
29 "name": "gallery",
30 "version": "0.1.0",
31 "description": "Opens a pane that draws one sample",
32 "author": { "name": "Your Name" }
33 }
34 ```
35
36 Indiquez votre point d'entrée dans `gallery/hooks/hooks.json` :
37
38 ```json gallery/hooks/hooks.json theme={null}
39 {
40 "modules": ["./register.js"]
41 }
42 ```
43
44 Enregistrez le code sous `gallery/hooks/register.js`. Il ajoute une commande `/gallery` qui ouvre un panneau, et dessine `Plain text` dans ce panneau :
45
46 ```javascript gallery/hooks/register.js theme={null}
47 // Stands in for your own callback in the samples that take one
48 const noop = () => {}
49 // The Select sample keeps its choice here
50 let picked = 'md'
51
52 // The Raster sample packs its cells with this function
53 const DEFAULT_COLOR = 0x01000000
54 function cellsOf(rows) {
55 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])
56 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()
57 }
58
59 export function register(on) {
60 on('session.start', async ($, e, next) => {
61 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })
62 return next(e)
63 })
64
65 on('command.run', { command: 'gallery' }, async ($) => {
66 await $.ui.open({ id: 'gallery', focus: true, closeOnEscape: true })
67 return {}
68 })
69
70 on('ui.render', { component: 'Pane' }, async ($, e, next) => {
71 if (e.requestId !== 'gallery') return next(e)
72 const { Box, Text, Button, Input, Select, Link, Markdown, Code, Raster, Svg } = $.ui.resolve(e)
73 // Replace the element after return with a sample
74 return Text({ children: ['Plain text'] })
75 })
76 }
77 ```
78 </Step>
79
80 <Step title="Exécuter le mod">
81 Dans votre shell, démarrez Claude Code depuis le répertoire qui contient `gallery` :
82
83 ```bash theme={null}
84 claude --plugin-dir ./gallery
85 ```
86
87 Dans le prompt de Claude Code, exécutez `/gallery`. Un panneau s'ouvre et affiche `Plain text`.
88 </Step>
89
90 <Step title="Remplacer par un exemple">
91 Copiez un exemple de cette page. Dans `register.js`, collez-le à la place de `Text({ children: ['Plain text'] })`, de sorte qu'il suive `return`, puis enregistrez le fichier. Claude Code recharge le module à chaque enregistrement : exécutez donc à nouveau `/gallery` pour voir le nouvel exemple.
92 </Step>
93</Steps>
94
95<h2 id="pick-an-element">
96 Choisir un élément
97</h2>
98
99Les exemples sont regroupés selon ce que vous souhaitez afficher à l'écran :
100
101* **[Afficher du texte](#show-text)** : `Text`, `Markdown` et `Link`
102* **[Afficher du code et des modifications](#show-code-and-changes)** : `Code`
103* **[Disposer des éléments](#arrange-elements)** : `Box`
104* **[Recueillir une saisie](#take-input)** : `Button`, `Input` et `Select`
105* **[Dessiner des images](#draw-pictures)** : `Raster`, `Svg`, `Image` et `Client`
106
107<h2 id="show-text">
108 Afficher du texte
109</h2>
110
111Trois éléments affichent des mots à l'écran : `Text` pour votre propre mise en forme, `Markdown` pour un contenu déjà formaté, et `Link` pour une URL.
112
113<h3 id="text">
114 `Text`
115</h3>
116
117`Text` dessine une chaîne avec les styles que vous lui donnez. Cet exemple affiche une ligne pour chaque style :
118
119```javascript theme={null}
120Box({
121 flexDirection: 'column',
122 children: [
123 Text({ children: ['Plain text'] }),
124 Text({ bold: true, children: ['bold'] }),
125 Text({ italic: true, children: ['italic'] }),
126 Text({ underline: true, children: ['underline'] }),
127 Text({ strikethrough: true, children: ['strikethrough'] }),
128 Text({ dimColor: true, children: ['dimColor'] }),
129 Text({ inverse: true, children: ['inverse'] }),
130 Text({ color: 'red', children: ["color: 'red'"] }),
131 Text({ backgroundColor: 'blue', children: ["backgroundColor: 'blue'"] }),
132 ],
133})
134```
135
136<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-text-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=90724ce3953d9347b61b6a9266fda451" className="dark:hidden" alt="Un panneau avec neuf lignes de texte, chacune nommée d'après son style : plain, bold, italic, underline, strikethrough, dimColor en gris, inverse, color red et backgroundColor blue." width="1872" height="490" data-path="images/mods-el-text-light.png" />
137
138<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-text-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=790dd3465e06db0842639d0d8fcbbc96" className="hidden dark:block" alt="Un panneau avec neuf lignes de texte, chacune nommée d'après son style : plain, bold, italic, underline, strikethrough, dimColor en gris, inverse, color red et backgroundColor blue." width="1872" height="490" data-path="images/mods-el-text-dark.png" />
139
140`dimColor` dessine le texte en gris. `backgroundColor` ne remplit que la largeur du texte.
141
142<h3 id="markdown">
143 `Markdown`
144</h3>
145
146`Markdown` met en forme le texte de la même manière que les réponses de Claude. Transmettez le contenu dans `text`, et non dans `children` :
147
148```javascript theme={null}
149Markdown({
150 text: '## Release notes\n\nThis build has **two** fixes and one `flag`:\n\n- Faster start\n- Fewer prompts\n\n> Quoted text',
151})
152```
153
154<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-markdown-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=e40eacc4e3fbe06eb003f4463f552ec1" className="dark:hidden" alt="Un panneau avec un titre en gras, Release notes, puis une phrase contenant un mot en gras et un mot de code en couleur, une liste de deux éléments et une citation en italique avec une barre à sa gauche." width="1872" height="452" data-path="images/mods-el-markdown-light.png" />
155
156<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-markdown-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=2cc342ed0c58e752c425fff3c95a33a6" className="hidden dark:block" alt="Un panneau avec un titre en gras, Release notes, puis une phrase contenant un mot en gras et un mot de code en couleur, une liste de deux éléments et une citation en italique avec une barre à sa gauche." width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />
157
158Un titre s'affiche en gras sans ses marques `#`. Le code en ligne s'affiche en couleur sans ses backticks. Une citation s'affiche en italique avec une barre à sa gauche.
159
160<h3 id="link">
161 `Link`
162</h3>
163
164`Link` dessine un libellé suivi de son URL :
165
166```javascript theme={null}
167Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })
168```
169
170<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-link-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=8217bd2dfb561a8ba57023c6d89ea977" className="dark:hidden" alt="Un panneau avec une seule ligne : le libellé Claude Code docs, puis l'URL en gris." width="1872" height="186" data-path="images/mods-el-link-light.png" />
171
172<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-link-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=cd32f222a7d3530b070f58f5f189a1f8" className="hidden dark:block" alt="Un panneau avec une seule ligne : le libellé Claude Code docs, puis l'URL en gris." width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173
174Le terminal dessine l'URL sous forme de texte après le libellé. La possibilité de l'ouvrir d'un clic dépend du terminal de l'utilisateur.
175
176<h2 id="show-code-and-changes">
177 Afficher du code et des modifications
178</h2>
179
180`Code` dessine du texte source avec les couleurs syntaxiques propres à Claude Code, ou un diff.
181
182<h3 id="code">
183 `Code`
184</h3>
185
186Indiquez le `language`, ou transmettez un `path` à partir duquel Claude Code le déduira. Avec `startLine`, les lignes sont numérotées à partir de ce nombre :
187
188```javascript theme={null}
189Code({
190 language: 'javascript',
191 startLine: 1,
192 source: "const name = 'mods'\nconsole.log('hello ' + name)",
193})
194```
195
196<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-code-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4e13f5d506d3fdcc59d6d9524f48d2a9" className="dark:hidden" alt="Un panneau avec deux lignes numérotées de JavaScript en couleurs syntaxiques." width="1872" height="224" data-path="images/mods-el-code-light.png" />
197
198<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-code-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=59f797371dd91b16b874a382b784b668" className="hidden dark:block" alt="Un panneau avec deux lignes numérotées de JavaScript en couleurs syntaxiques." width="1872" height="224" data-path="images/mods-el-code-dark.png" />
199
200Les couleurs proviennent du thème de l'utilisateur.
201
202<h3 id="code-as-a-diff">
203 `Code` sous forme de diff
204</h3>
205
206Avec `format: 'diff'`, `source` contient un ou plusieurs blocs de diff unifié :
207
208```javascript theme={null}
209Code({
210 format: 'diff',
211 source: '@@ -1,3 +1,3 @@\n # Mods\n-A mod is a plugin.\n+A mod is a plugin that runs code.\n Read on.',
212})
213```
214
215<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-diff-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4f12c9f7229ceccd9b4f47479a7235dd" className="dark:hidden" alt="Un panneau avec un diff de quatre lignes. La ligne supprimée est ombrée en rouge et la ligne ajoutée en vert, chacune avec son numéro de ligne. Dans la ligne ajoutée, les mots that runs code ont une teinte plus prononcée." width="1872" height="300" data-path="images/mods-el-diff-light.png" />
216
217<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-diff-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9db96f34381bac8bebc32d41859b8808" className="hidden dark:block" alt="Un panneau avec un diff de quatre lignes. La ligne supprimée est ombrée en rouge et la ligne ajoutée en vert, chacune avec son numéro de ligne. Dans la ligne ajoutée, les mots that runs code ont une teinte plus prononcée." width="1872" height="300" data-path="images/mods-el-diff-dark.png" />
218
219Claude Code dessine des numéros de ligne à la place de la ligne `@@`. Lorsqu'une ligne supprimée et une ligne ajoutée se ressemblent, les mots modifiés reçoivent une teinte plus prononcée.
220
221<h2 id="arrange-elements">
222 Disposer des éléments
223</h2>
224
225<h3 id="box">
226 `Box`
227</h3>
228
229`Box` dispose son contenu en ligne ou en colonne, et peut dessiner une bordure. Cet exemple place une ligne de mots au-dessus d'une boîte avec bordure :
230
231```javascript theme={null}
232Box({
233 flexDirection: 'column',
234 gap: 1,
235 children: [
236 Box({
237 flexDirection: 'row',
238 columnGap: 4,
239 children: [Text({ children: ['a row'] }), Text({ children: ['of three'] }), Text({ children: ['items'] })],
240 }),
241 Box({
242 borderStyle: 'round',
243 paddingX: 1,
244 children: [Text({ children: ["borderStyle: 'round'"] })],
245 }),
246 ],
247})
248```
249
250<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-box-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=cb9263bb02f5c8afb6e5b8450e0cdadc" className="dark:hidden" alt="Un panneau avec trois mots sur une ligne, espacés de quatre colonnes, puis une ligne vide, puis une bordure arrondie autour d'une ligne de texte. La bordure s'étend sur toute la largeur du panneau." width="1872" height="338" data-path="images/mods-el-box-light.png" />
251
252<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-box-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=dae83407af4d667a58717f68f13848e2" className="hidden dark:block" alt="Un panneau avec trois mots sur une ligne, espacés de quatre colonnes, puis une ligne vide, puis une bordure arrondie autour d'une ligne de texte. La bordure s'étend sur toute la largeur du panneau." width="1872" height="338" data-path="images/mods-el-box-dark.png" />
253
254La bordure s'étend sur toute la largeur du panneau.
255
256<h2 id="take-input">
257 Recueillir une saisie
258</h2>
259
260`Button`, `Input` et `Select` sont des contrôles : l'utilisateur passe de l'un à l'autre avec Tab et utilise celui qui a le focus. [Focus clavier et raccourcis](/docs/fr/plugins/mods/interface#know-which-keys-your-mod-can-receive) décrit les touches qui leur parviennent.
261
262Ouvrir un panneau avec `focus: true` donne le focus clavier au panneau. Les lettres saisies parviennent à un `Input` une fois qu'il a le focus : ajoutez donc `autoFocus: true` à un champ qui doit recevoir la saisie dès l'ouverture du panneau.
263
264<h3 id="button">
265 `Button`
266</h3>
267
268Un bouton exécute `onPress`. Cet exemple montre la forme par défaut, un bouton `plain` avec un raccourci, et un bouton atténué :
269
270```javascript theme={null}
271Box({
272 flexDirection: 'column',
273 children: [
274 Button({ key: 'save', label: 'Save', onPress: noop }),
275 Button({ key: 'next', label: 'Next', hotkey: 'n', plain: true, onPress: noop }),
276 Button({ key: 'skip', label: 'Skip', dimColor: true, onPress: noop }),
277 ],
278})
279```
280
281<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=8c638c15e12d9736f327dfcaa797b512" className="dark:hidden" alt="Un panneau avec trois boutons, un par ligne : Save entre crochets, n: Next sans crochets avec le n en couleur, et Skip entre crochets en gris." width="1872" height="262" data-path="images/mods-el-button-light.png" />
282
283<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=6a88a1fe18ba63b050366dcfab14be45" className="hidden dark:block" alt="Un panneau avec trois boutons, un par ligne : Save entre crochets, n: Next sans crochets avec le n en couleur, et Skip entre crochets en gris." width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284
285Un bouton qui a le focus s'affiche en vidéo inverse. Ici, l'utilisateur a appuyé deux fois sur Tab :
286
287<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-plain-focused-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=a6224e58d10752a894615047d9824ad9" className="dark:hidden" alt="Les trois mêmes boutons, le deuxième, n: Next, étant affiché en vidéo inverse." width="1872" height="262" data-path="images/mods-el-button-plain-focused-light.png" />
288
289<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-button-plain-focused-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9aeb7145615e77c84e7436180ed69e86" className="hidden dark:block" alt="Les trois mêmes boutons, le deuxième, n: Next, étant affiché en vidéo inverse." width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />
290
291<h3 id="input">
292 `Input`
293</h3>
294
295Un `Input` est un champ de texte sur une ligne qui exécute `onSubmit` lorsque l'utilisateur appuie sur Entrée :
296
297```javascript theme={null}
298Input({
299 key: 'title',
300 label: 'Title',
301 placeholder: 'Type a title and press Enter',
302 value: '',
303 submitLabel: 'save',
304 onSubmit: noop,
305})
306```
307
308Sans le focus, le champ affiche son libellé et son texte indicatif :
309
310<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=7d580be1aaf5507032e1962b9167d725" className="dark:hidden" alt="Un panneau avec une seule ligne : le libellé Title, puis le texte indicatif Type a title and press Enter en gris." width="1872" height="186" data-path="images/mods-el-input-light.png" />
311
312<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=9d254a8adc5959ba173717fb45eabd52" className="hidden dark:block" alt="Un panneau avec une seule ligne : le libellé Title, puis le texte indicatif Type a title and press Enter en gris." width="1872" height="186" data-path="images/mods-el-input-dark.png" />
313
314Avec le focus, le libellé passe en gras, un curseur apparaît et le `submitLabel` s'affiche après `⏎` :
315
316<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-focused-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=dcfcce0174480cc624d06c8521734fe7" className="dark:hidden" alt="Le même champ avec son libellé en gras, un curseur bloc sur la première lettre du texte indicatif, et un symbole de retour suivi du mot save." width="1872" height="186" data-path="images/mods-el-input-focused-light.png" />
317
318<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-focused-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=2f5cf7d0e5f813983070e883009f528e" className="hidden dark:block" alt="Le même champ avec son libellé en gras, un curseur bloc sur la première lettre du texte indicatif, et un symbole de retour suivi du mot save." width="1872" height="186" data-path="images/mods-el-input-focused-dark.png" />
319
320La saisie remplace le texte indicatif :
321
322<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-typed-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4eb6d4443763a21415dad4e426bc747a" className="dark:hidden" alt="Le même champ contenant les lettres saisies Rel, suivies du symbole de retour et du mot save." width="1872" height="186" data-path="images/mods-el-input-typed-light.png" />
323
324<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-input-typed-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=90fbac3c7a47ab26a4fb71401975eac6" className="hidden dark:block" alt="Le même champ contenant les lettres saisies Rel, suivies du symbole de retour et du mot save." width="1872" height="186" data-path="images/mods-el-input-typed-dark.png" />
325
326<h3 id="select">
327 `Select`
328</h3>
329
330Un `Select` permet à l'utilisateur de choisir une option parmi plusieurs, et exécute `onSelect` avec la `value` de l'option :
331
332```javascript theme={null}
333Select({
334 key: 'format',
335 label: 'Format',
336 value: picked,
337 options: [
338 { value: 'md', label: 'Markdown' },
339 { value: 'html', label: 'HTML' },
340 { value: 'txt', label: 'Plain text' },
341 ],
342 onSelect: (value) => {
343 picked = value
344 },
345})
346```
347
348Fermé, il affiche son libellé et l'option actuelle :
349
350<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=4e3b18268ffd87d2cad06442e6d661a9" className="dark:hidden" alt="Un panneau avec une seule ligne : le libellé Format, l'option actuelle Markdown et une petite flèche vers le bas." width="1872" height="186" data-path="images/mods-el-select-light.png" />
351
352<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=1e329e6aee748c2dd70e92dbe4960de0" className="hidden dark:block" alt="Un panneau avec une seule ligne : le libellé Format, l'option actuelle Markdown et une petite flèche vers le bas." width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353
354Ouvert, il liste ses options et en met une en évidence :
355
356<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-moved-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=deb6ce0a49d213235feedaa79ac658c0" className="dark:hidden" alt="Le sélecteur ouvert, avec ses trois options listées sous le libellé. La deuxième option, HTML, est affichée en vidéo inverse." width="1872" height="300" data-path="images/mods-el-select-moved-light.png" />
357
358<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-moved-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=d69edeecd4f97dad4bdb39b908e3d98e" className="hidden dark:block" alt="Le sélecteur ouvert, avec ses trois options listées sous le libellé. La deuxième option, HTML, est affichée en vidéo inverse." width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />
359
360Une fois que l'utilisateur a choisi une option, la liste se ferme :
361
362<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-picked-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=f065ab5bc479868f03088dc736f17097" className="dark:hidden" alt="Le sélecteur de nouveau fermé, affichant désormais HTML comme option actuelle." width="1872" height="186" data-path="images/mods-el-select-picked-light.png" />
363
364<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-select-picked-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=f084630e325825f3831219215a6a595e" className="hidden dark:block" alt="Le sélecteur de nouveau fermé, affichant désormais HTML comme option actuelle." width="1872" height="186" data-path="images/mods-el-select-picked-dark.png" />
365
366<h2 id="draw-pictures">
367 Dessiner des images
368</h2>
369
370<h3 id="raster">
371 `Raster`
372</h3>
373
374Un `Raster` est une grille de cellules de caractères colorées, pour une carte de chaleur, une sparkline ou un plateau de jeu. Le terminal la dessine. Cet exemple utilise la fonction `cellsOf` du module de départ, qui regroupe les cellules dans la chaîne attendue par un `Raster`. [Dessiner une grille de cellules colorées](/docs/fr/plugins/mods/interface#draw-a-grid-of-colored-cells) l'explique :
375
376```javascript theme={null}
377Raster({
378 key: 'grid',
379 columns: 3,
380 rows: 2,
381 cells: cellsOf([
382 [['█', 0x2e7d32], ['█', 0xf9a825], ['█', 0xc62828]],
383 [['█', 0x2e7d32], ['█', 0x2e7d32], ['█', 0xf9a825]],
384 ]),
385})
386```
387
388<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-raster-light.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=5ed719481d3dd45b568bab696e57bf16" className="dark:hidden" alt="Un panneau avec une petite grille de blocs colorés, deux lignes de trois : vert, ambre et rouge, puis vert, vert et ambre." width="1872" height="224" data-path="images/mods-el-raster-light.png" />
389
390<img src="https://mintcdn.com/claude-code/EXkwf0kKMewZsyod/images/mods-el-raster-dark.png?fit=max&auto=format&n=EXkwf0kKMewZsyod&q=85&s=b381f05d4cc99e2abfacb505c77b17f5" className="hidden dark:block" alt="Un panneau avec une petite grille de blocs colorés, deux lignes de trois : vert, ambre et rouge, puis vert, vert et ambre." width="1872" height="224" data-path="images/mods-el-raster-dark.png" />
391
392Un `Raster` arrondit chaque couleur à une palette plus restreinte : `0x2e7d32` s'affiche donc en `#337733`.
393
394<h3 id="svg">
395 `Svg`
396</h3>
397
398Un `Svg` dessine un document SVG dans l'application Desktop :
399
400```javascript theme={null}
401Svg({
402 alt: 'Three bars of rising height',
403 width: 120,
404 height: 60,
405 source:
406 '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 60"><rect x="10" y="40" width="20" height="20" fill="#2e7d32"/><rect x="50" y="25" width="20" height="35" fill="#f9a825"/><rect x="90" y="5" width="20" height="55" fill="#c62828"/></svg>',
407})
408```
409
410Dans le terminal, un panneau qui ne renvoie qu'un `Svg` s'ouvre vide. Pour y dessiner autre chose, vérifiez [`e.surface`](/docs/fr/plugins/mods/interface#pick-where-to-draw) et renvoyez une arborescence différente.
411
412<h3 id="image-and-client">
413 `Image` et `Client`
414</h3>
415
416Deux autres éléments n'ont pas d'exemple ici. `Image` dessine un PNG ou des pixels bruts dans le terminal. `Client` est une zone dessinée par un second fichier de votre part, pour l'animation et la saisie au pointeur. La [référence des éléments](/docs/fr/plugins/mods/reference#elements) répertorie leurs props.
417
418<h2 id="see-where-a-mod-can-draw">
419 Voir où un mod peut dessiner
420</h2>
421
422Tous les exemples dessinent dans un panneau. Un mod peut aussi dessiner à d'autres endroits, et appeler Claude Code pour afficher quelque chose à sa place :
423
424* **Panneau et bandeau** : [Choisir où dessiner](/docs/fr/plugins/mods/interface#pick-where-to-draw)
425* **Les lignes propres à Claude Code, comme le spinner** : [Modifier ce que Claude Code dessine déjà](/docs/fr/plugins/mods/interface#change-what-claude-code-already-draws)
426* **Toast, barre de statut et ligne de log** : [Afficher quelque chose sans démarrer un tour](/docs/fr/plugins/mods/api#show-something-without-starting-a-turn)
427* **Boîte de dialogue de question** : [Suspendre un appel d'outil jusqu'à la décision de l'utilisateur](/docs/fr/plugins/mods/events#hold-a-tool-call-until-the-user-decides)
428
429<h2 id="next-steps">
430 Étapes suivantes
431</h2>
432
433* [Dessiner dans l'interface](/docs/fr/plugins/mods/interface) : créer un panneau avec des onglets, étape par étape
434* [Tester un dessin](/docs/fr/plugins/mods/test#test-a-drawing) : appuyer sur vos boutons depuis un test
435* [Référence des éléments](/docs/fr/plugins/mods/reference#elements) : les principales props de chaque élément et les applications qui le dessinent