10 10
11Чтобы разобраться, как работает отрисовка, начните с раздела [Отрисовка в интерфейсе](/docs/ru/plugins/mods/interface). Основные свойства элементов и приложения, которые отрисовывают каждый из них, описаны в [справочнике по элементам](/docs/ru/plugins/mods/reference#elements). В [объявлениях типов](/docs/ru/plugins/mods/create#get-the-types-for-your-build) перечислены все свойства.11Чтобы разобраться, как работает отрисовка, начните с раздела [Отрисовка в интерфейсе](/docs/ru/plugins/mods/interface). Основные свойства элементов и приложения, которые отрисовывают каждый из них, описаны в [справочнике по элементам](/docs/ru/plugins/mods/reference#elements). В [объявлениях типов](/docs/ru/plugins/mods/create#get-the-types-for-your-build) перечислены все свойства.
12 12
13<h2 id="try-a-sample">13## Попробуйте пример
14 Попробуйте пример
15</h2>
16 14
17Примеры на этой странице — это фрагменты, а не готовые моды. Каждый из них — код одного элемента и всего, что в него вложено.15Примеры на этой странице — это фрагменты, а не готовые моды. Каждый из них — код одного элемента и всего, что в него вложено.
18 16
19Чтобы посмотреть пример в своём терминале, создайте небольшой мод, следуя этим шагам, и вставьте в него пример. Мод добавляет команду `/gallery`, которая открывает панель и отрисовывает в ней пример. [Панель](/docs/ru/plugins/mods/interface#pick-where-to-draw) — это боковая область рядом с транскриптом в широком полноэкранном терминале, а в остальных случаях — область в рамке над промптом.17Чтобы посмотреть пример в своём терминале, создайте небольшой мод, следуя этим шагам, и вставьте в него пример. Мод добавляет команду `/gallery`, которая открывает панель и отрисовывает в ней пример. [Панель](/docs/ru/plugins/mods/interface#pick-where-to-draw) — это боковая область рядом с транскриптом в широком полноэкранном терминале, а в остальных случаях — область в рамке над промптом.
20 18
21<Steps>19**1. Создайте мод**
22 <Step title="Создайте мод">
23 Создайте каталог `gallery`, а внутри него — каталоги `.claude-plugin` и `hooks`. Назначение файлов объясняется в разделе [Создание мода](/docs/ru/plugins/mods/create#write-a-mod-yourself).
24 20
25 Сохраните манифест как `gallery/.claude-plugin/plugin.json`:21Создайте каталог `gallery`, а внутри него — каталоги `.claude-plugin` и `hooks`. Назначение файлов объясняется в разделе [Создание мода](/docs/ru/plugins/mods/create#write-a-mod-yourself).
26 22
27 ```json gallery/.claude-plugin/plugin.json theme={null}23Сохраните манифест как `gallery/.claude-plugin/plugin.json`:
28 {24
25```json gallery/.claude-plugin/plugin.json theme={null}
26{
29 "name": "gallery",27 "name": "gallery",
30 "version": "0.1.0",28 "version": "0.1.0",
31 "description": "Opens a pane that draws one sample",29 "description": "Opens a pane that draws one sample",
32 "author": { "name": "Your Name" }30 "author": { "name": "Your Name" }
33 }31}
34 ```32```
35 33
36 Укажите точку входа в `gallery/hooks/hooks.json`:34Укажите точку входа в `gallery/hooks/hooks.json`:
37 35
38 ```json gallery/hooks/hooks.json theme={null}36```json gallery/hooks/hooks.json theme={null}
39 {37{
40 "modules": ["./register.js"]38 "modules": ["./register.js"]
41 }39}
42 ```40```
43 41
44 Сохраните код как `gallery/hooks/register.js`. Он добавляет команду `/gallery`, которая открывает панель, и отрисовывает в ней `Plain text`:42Сохраните код как `gallery/hooks/register.js`. Он добавляет команду `/gallery`, которая открывает панель, и отрисовывает в ней `Plain text`:
45 43
46 ```javascript gallery/hooks/register.js theme={null}44```javascript gallery/hooks/register.js theme={null}
47 // Stands in for your own callback in the samples that take one45// Stands in for your own callback in the samples that take one
48 const noop = () => {}46const noop = () => {}
49 // The Select sample keeps its choice here47// The Select sample keeps its choice here
50 let picked = 'md'48let picked = 'md'
51 49
52 // The Raster sample packs its cells with this function50// The Raster sample packs its cells with this function
53 const DEFAULT_COLOR = 0x0100000051const DEFAULT_COLOR = 0x01000000
54 function cellsOf(rows) {52function cellsOf(rows) {
55 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])53 const numbers = rows.flat().flatMap(([char, color]) => [char.codePointAt(0), color, DEFAULT_COLOR])
56 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()54 return new Uint8Array(Uint32Array.from(numbers).buffer).toBase64()
57 }55}
58 56
59 export function register(on) {57export function register(on) {
60 on('session.start', async ($, e, next) => {58 on('session.start', async ($, e, next) => {
61 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })59 await $.command.register({ name: 'gallery', description: 'Open the sample pane' })
62 return next(e)60 return next(e)
73 // Replace the element after return with a sample71 // Replace the element after return with a sample
74 return Text({ children: ['Plain text'] })72 return Text({ children: ['Plain text'] })
75 })73 })
76 }74}
77 ```75```
78 </Step>76
77**2. Запустите мод**
79 78
80 <Step title="Запустите мод">79В оболочке запустите Claude Code из каталога, содержащего `gallery`:
81 В оболочке запустите Claude Code из каталога, содержащего `gallery`:
82 80
83 ```bash theme={null}81```bash theme={null}
84 claude --plugin-dir ./gallery82claude --plugin-dir ./gallery
85 ```83```
86 84
87 В промпте Claude Code выполните `/gallery`. Откроется панель с текстом `Plain text`.85В промпте Claude Code выполните `/gallery`. Откроется панель с текстом `Plain text`.
88 </Step>
89 86
90 <Step title="Подставьте пример">87**3. Подставьте пример**
91 Скопируйте пример с этой страницы. В `register.js` вставьте его вместо `Text({ children: ['Plain text'] })`, чтобы он шёл после `return`, и сохраните файл. Claude Code перезагружает модуль при каждом сохранении, поэтому снова выполните `/gallery`, чтобы увидеть новый пример.
92 </Step>
93</Steps>
94 88
95<h2 id="pick-an-element">89Скопируйте пример с этой страницы. В `register.js` вставьте его вместо `Text({ children: ['Plain text'] })`, чтобы он шёл после `return`, и сохраните файл. Claude Code перезагружает модуль при каждом сохранении, поэтому снова выполните `/gallery`, чтобы увидеть новый пример.
96 Выберите элемент90
97</h2>91## Выберите элемент
98 92
99Примеры сгруппированы по тому, что вы хотите вывести на экран:93Примеры сгруппированы по тому, что вы хотите вывести на экран:
100 94
104* **[Ввод данных](#take-input)**: `Button`, `Input` и `Select`98* **[Ввод данных](#take-input)**: `Button`, `Input` и `Select`
105* **[Рисование изображений](#draw-pictures)**: `Raster`, `Svg`, `Image` и `Client`99* **[Рисование изображений](#draw-pictures)**: `Raster`, `Svg`, `Image` и `Client`
106 100
107<h2 id="show-text">101## Вывод текста
108 Вывод текста
109</h2>
110 102
111Текст на экран выводят три элемента: `Text` — с вашим собственным оформлением, `Markdown` — для уже отформатированного содержимого и `Link` — для URL.103Текст на экран выводят три элемента: `Text` — с вашим собственным оформлением, `Markdown` — для уже отформатированного содержимого и `Link` — для URL.
112 104
113<h3 id="text">105### `Text`
114 `Text`
115</h3>
116 106
117`Text` отрисовывает строку с заданными вами стилями. В этом примере показаны обычный текст и восемь стилей, каждый на отдельной строке:107`Text` отрисовывает строку с заданными вами стилями. В этом примере показаны обычный текст и восемь стилей, каждый на отдельной строке:
118 108
133})123})
134```124```
135 125
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="Панель с девятью строками текста, каждая из которых названа по своему стилю: обычный, bold, italic, underline, strikethrough, dimColor серым цветом, inverse, color red и backgroundColor blue." width="1872" height="490" data-path="images/mods-el-text-light.png" />126
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="Панель с девятью строками текста, каждая из которых названа по своему стилю: обычный, bold, italic, underline, strikethrough, dimColor серым цветом, inverse, color red и backgroundColor blue." width="1872" height="490" data-path="images/mods-el-text-dark.png" />
139 127
140`dimColor` отрисовывает текст серым цветом. `backgroundColor` заливает фон только по ширине текста.128`dimColor` отрисовывает текст серым цветом. `backgroundColor` заливает фон только по ширине текста.
141 129
142<h3 id="markdown">130### `Markdown`
143 `Markdown`
144</h3>
145 131
146`Markdown` форматирует текст так же, как форматируются ответы Claude. Передавайте содержимое в `text`, а не в `children`:132`Markdown` форматирует текст так же, как форматируются ответы Claude. Передавайте содержимое в `text`, а не в `children`:
147 133
151})137})
152```138```
153 139
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="Панель с жирным заголовком Release notes, затем предложение с одним жирным словом и одним цветным словом кода, список из двух пунктов и цитата курсивом с чертой слева." width="1872" height="452" data-path="images/mods-el-markdown-light.png" />140
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="Панель с жирным заголовком Release notes, затем предложение с одним жирным словом и одним цветным словом кода, список из двух пунктов и цитата курсивом с чертой слева." width="1872" height="452" data-path="images/mods-el-markdown-dark.png" />
157 141
158Заголовок отрисовывается жирным шрифтом без знаков `#`. Встроенный код отрисовывается цветом без обратных кавычек. Цитата отрисовывается курсивом с чертой слева.142Заголовок отрисовывается жирным шрифтом без знаков `#`. Встроенный код отрисовывается цветом без обратных кавычек. Цитата отрисовывается курсивом с чертой слева.
159 143
160<h3 id="link">144### `Link`
161 `Link`
162</h3>
163 145
164`Link` отрисовывает подпись, а за ней — её URL:146`Link` отрисовывает подпись, а за ней — её URL:
165 147
167Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })149Link({ href: 'https://code.claude.com/docs', label: 'Claude Code docs' })
168```150```
169 151
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="Панель с одной строкой: подпись Claude Code docs, а затем URL серым цветом." width="1872" height="186" data-path="images/mods-el-link-light.png" />152
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="Панель с одной строкой: подпись Claude Code docs, а затем URL серым цветом." width="1872" height="186" data-path="images/mods-el-link-dark.png" />
173 153
174Терминал отрисовывает URL как текст после подписи. Откроется ли он по щелчку, зависит от терминала пользователя.154Терминал отрисовывает URL как текст после подписи. Откроется ли он по щелчку, зависит от терминала пользователя.
175 155
176<h2 id="show-code-and-changes">156## Вывод кода и изменений
177 Вывод кода и изменений
178</h2>
179 157
180`Code` отрисовывает исходный текст с подсветкой синтаксиса в цветах самого Claude Code или diff. В расширении VS Code `Code` показывает свой `source` как обычный текст, без цветов, номеров строк и подсветки diff, которые видны на этих снимках экрана.158`Code` отрисовывает исходный текст с подсветкой синтаксиса в цветах самого Claude Code или diff. В расширении VS Code `Code` показывает свой `source` как обычный текст, без цветов, номеров строк и подсветки diff, которые видны на этих снимках экрана.
181 159
182<h3 id="code">160### `Code`
183 `Code`
184</h3>
185 161
186Укажите язык в `language` или передайте `path`, чтобы Claude Code определил язык по нему. С `startLine` строки нумеруются начиная с этого числа:162Укажите язык в `language` или передайте `path`, чтобы Claude Code определил язык по нему. С `startLine` строки нумеруются начиная с этого числа:
187 163
193})169})
194```170```
195 171
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="Панель с двумя пронумерованными строками JavaScript с подсветкой синтаксиса." width="1872" height="224" data-path="images/mods-el-code-light.png" />172
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="Панель с двумя пронумерованными строками JavaScript с подсветкой синтаксиса." width="1872" height="224" data-path="images/mods-el-code-dark.png" />
199 173
200Цвета берутся из темы пользователя.174Цвета берутся из темы пользователя.
201 175
202<h3 id="code-as-a-diff">176### `Code` в виде diff
203 `Code` в виде diff
204</h3>
205 177
206С `format: 'diff'` в `source` передаются один или несколько фрагментов (hunks) в формате unified diff:178С `format: 'diff'` в `source` передаются один или несколько фрагментов (hunks) в формате unified diff:
207 179
212})184})
213```185```
214 186
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="Панель с diff из четырёх строк. Удалённая строка подсвечена красным, добавленная — зелёным, у каждой указан номер строки. В добавленной строке слова that runs code подсвечены ярче." width="1872" height="300" data-path="images/mods-el-diff-light.png" />187
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="Панель с diff из четырёх строк. Удалённая строка подсвечена красным, добавленная — зелёным, у каждой указан номер строки. В добавленной строке слова that runs code подсвечены ярче." width="1872" height="300" data-path="images/mods-el-diff-dark.png" />
218 188
219Вместо строки `@@` Claude Code отрисовывает номера строк. Если удалённая и добавленная строки похожи, изменившиеся слова подсвечиваются ярче.189Вместо строки `@@` Claude Code отрисовывает номера строк. Если удалённая и добавленная строки похожи, изменившиеся слова подсвечиваются ярче.
220 190
221<h2 id="arrange-elements">191## Компоновка элементов
222 Компоновка элементов
223</h2>
224 192
225<h3 id="box">193### `Box`
226 `Box`
227</h3>
228 194
229`Box` располагает своё содержимое в строку или в столбец и может отрисовывать рамку. В этом примере над блоком в рамке размещается строка слов:195`Box` располагает своё содержимое в строку или в столбец и может отрисовывать рамку. В этом примере над блоком в рамке размещается строка слов:
230 196
247})213})
248```214```
249 215
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="Панель с тремя словами в строку на расстоянии четырёх столбцов друг от друга, затем пустая строка, затем скруглённая рамка вокруг одной строки текста. Рамка занимает всю ширину панели." width="1872" height="338" data-path="images/mods-el-box-light.png" />216
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="Панель с тремя словами в строку на расстоянии четырёх столбцов друг от друга, затем пустая строка, затем скруглённая рамка вокруг одной строки текста. Рамка занимает всю ширину панели." width="1872" height="338" data-path="images/mods-el-box-dark.png" />
253 217
254Рамка растягивается на всю ширину панели.218Рамка растягивается на всю ширину панели.
255 219
256<h2 id="take-input">220## Ввод данных
257 Ввод данных
258</h2>
259 221
260`Button`, `Input` и `Select` — это элементы управления: пользователь переходит между ними клавишей Tab и работает с тем, на котором находится фокус. Какие клавиши до них доходят, описано в разделе [Фокус клавиатуры и горячие клавиши](/docs/ru/plugins/mods/interface#know-which-keys-your-mod-can-receive).222`Button`, `Input` и `Select` — это элементы управления: пользователь переходит между ними клавишей Tab и работает с тем, на котором находится фокус. Какие клавиши до них доходят, описано в разделе [Фокус клавиатуры и горячие клавиши](/docs/ru/plugins/mods/interface#know-which-keys-your-mod-can-receive).
261 223
262Откройте панель с `focus: true`, чтобы она попыталась получить фокус клавиатуры. Вводимые буквы попадают в `Input`, как только на нём оказывается фокус. Как выбрать поле, которое получит фокус при открытии панели, описано в разделе [Горячая клавиша и первый фокус](/docs/ru/plugins/mods/interface#set-a-hotkey-and-the-first-focus).224Откройте панель с `focus: true`, чтобы она попыталась получить фокус клавиатуры. Вводимые буквы попадают в `Input`, как только на нём оказывается фокус. Как выбрать поле, которое получит фокус при открытии панели, описано в разделе [Горячая клавиша и первый фокус](/docs/ru/plugins/mods/interface#set-a-hotkey-and-the-first-focus).
263 225
264<h3 id="button">226### `Button`
265 `Button`
266</h3>
267 227
268Кнопка вызывает `onPress`. В этом примере показаны кнопка по умолчанию, кнопка `plain` с горячей клавишей и приглушённая кнопка:228Кнопка вызывает `onPress`. В этом примере показаны кнопка по умолчанию, кнопка `plain` с горячей клавишей и приглушённая кнопка:
269 229
278})238})
279```239```
280 240
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="Панель с тремя кнопками, по одной в строке: Save в скобках, n: Next без скобок с цветной буквой n и Skip в скобках серым цветом." width="1872" height="262" data-path="images/mods-el-button-light.png" />241
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="Панель с тремя кнопками, по одной в строке: Save в скобках, n: Next без скобок с цветной буквой n и Skip в скобках серым цветом." width="1872" height="262" data-path="images/mods-el-button-dark.png" />
284 242
285Кнопка с фокусом отрисовывается в инверсных цветах. Здесь пользователь дважды нажал Tab:243Кнопка с фокусом отрисовывается в инверсных цветах. Здесь пользователь дважды нажал Tab:
286 244
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="Те же три кнопки, вторая из которых, n: Next, отрисована в инверсных цветах." width="1872" height="262" data-path="images/mods-el-button-plain-focused-light.png" />245
288 246
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="Те же три кнопки, вторая из которых, n: Next, отрисована в инверсных цветах." width="1872" height="262" data-path="images/mods-el-button-plain-focused-dark.png" />247### `Input`
290
291<h3 id="input">
292 `Input`
293</h3>
294 248
295`Input` — это однострочное текстовое поле, которое вызывает `onSubmit`, когда пользователь нажимает Enter:249`Input` — это однострочное текстовое поле, которое вызывает `onSubmit`, когда пользователь нажимает Enter:
296 250
307 261
308Без фокуса поле показывает подпись и текст-заполнитель:262Без фокуса поле показывает подпись и текст-заполнитель:
309 263
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="Панель с одной строкой: подпись Title, затем текст-заполнитель Type a title and press Enter серым цветом." width="1872" height="186" data-path="images/mods-el-input-light.png" />264
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="Панель с одной строкой: подпись Title, затем текст-заполнитель Type a title and press Enter серым цветом." width="1872" height="186" data-path="images/mods-el-input-dark.png" />
313 265
314С фокусом подпись становится жирной, появляется курсор, а после `⏎` отображается `submitLabel`:266С фокусом подпись становится жирной, появляется курсор, а после `⏎` отображается `submitLabel`:
315 267
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="То же поле с жирной подписью, блочным курсором на первой букве текста-заполнителя и знаком возврата, за которым следует слово save." width="1872" height="186" data-path="images/mods-el-input-focused-light.png" />268
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="То же поле с жирной подписью, блочным курсором на первой букве текста-заполнителя и знаком возврата, за которым следует слово save." width="1872" height="186" data-path="images/mods-el-input-focused-dark.png" />
319 269
320Ввод заменяет текст-заполнитель:270Ввод заменяет текст-заполнитель:
321 271
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="То же поле с введёнными буквами Rel, за которыми следуют знак возврата и слово save." width="1872" height="186" data-path="images/mods-el-input-typed-light.png" />272
323 273
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="То же поле с введёнными буквами Rel, за которыми следуют знак возврата и слово save." width="1872" height="186" data-path="images/mods-el-input-typed-dark.png" />274### `Select`
325
326<h3 id="select">
327 `Select`
328</h3>
329 275
330`Select` позволяет пользователю выбрать один из нескольких вариантов и вызывает `onSelect` со значением `value` выбранного варианта:276`Select` позволяет пользователю выбрать один из нескольких вариантов и вызывает `onSelect` со значением `value` выбранного варианта:
331 277
347 293
348В закрытом состоянии он показывает подпись и текущий вариант:294В закрытом состоянии он показывает подпись и текущий вариант:
349 295
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="Панель с одной строкой: подпись Format, текущий вариант Markdown и маленькая стрелка вниз." width="1872" height="186" data-path="images/mods-el-select-light.png" />296
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="Панель с одной строкой: подпись Format, текущий вариант Markdown и маленькая стрелка вниз." width="1872" height="186" data-path="images/mods-el-select-dark.png" />
353 297
354В открытом состоянии он показывает список вариантов и выделяет один из них:298В открытом состоянии он показывает список вариантов и выделяет один из них:
355 299
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="Открытый список выбора с тремя вариантами под подписью. Второй вариант, HTML, отрисован в инверсных цветах." width="1872" height="300" data-path="images/mods-el-select-moved-light.png" />300
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="Открытый список выбора с тремя вариантами под подписью. Второй вариант, HTML, отрисован в инверсных цветах." width="1872" height="300" data-path="images/mods-el-select-moved-dark.png" />
359 301
360После того как пользователь выберет вариант, список закрывается:302После того как пользователь выберет вариант, список закрывается:
361 303
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="Список выбора снова закрыт, и текущим вариантом теперь показан HTML." width="1872" height="186" data-path="images/mods-el-select-picked-light.png" />304
363 305
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="Список выбора снова закрыт, и текущим вариантом теперь показан HTML." width="1872" height="186" data-path="images/mods-el-select-picked-dark.png" />306## Рисование изображений
365 307
366<h2 id="draw-pictures">308### `Raster`
367 Рисование изображений
368</h2>
369
370<h3 id="raster">
371 `Raster`
372</h3>
373 309
374`Raster` — это сетка цветных символьных ячеек для тепловой карты, спарклайна или игрового поля. Его отрисовывает терминал. В этом примере используется функция `cellsOf` из начального модуля, которая упаковывает ячейки в строку, принимаемую `Raster`. Подробнее см. в разделе [Отрисовка сетки цветных ячеек](/docs/ru/plugins/mods/interface#draw-a-grid-of-colored-cells):310`Raster` — это сетка цветных символьных ячеек для тепловой карты, спарклайна или игрового поля. Его отрисовывает терминал. В этом примере используется функция `cellsOf` из начального модуля, которая упаковывает ячейки в строку, принимаемую `Raster`. Подробнее см. в разделе [Отрисовка сетки цветных ячеек](/docs/ru/plugins/mods/interface#draw-a-grid-of-colored-cells):
375 311
385})321})
386```322```
387 323
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="Панель с небольшой сеткой цветных блоков в две строки по три: зелёный, янтарный и красный, затем зелёный, зелёный и янтарный." width="1872" height="224" data-path="images/mods-el-raster-light.png" />324
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="Панель с небольшой сеткой цветных блоков в две строки по три: зелёный, янтарный и красный, затем зелёный, зелёный и янтарный." width="1872" height="224" data-path="images/mods-el-raster-dark.png" />
391 325
392`Raster` округляет каждый цвет до более ограниченной палитры, поэтому `0x2e7d32` отрисовывается как `#337733`.326`Raster` округляет каждый цвет до более ограниченной палитры, поэтому `0x2e7d32` отрисовывается как `#337733`.
393 327
394<h3 id="svg">328### `Svg`
395 `Svg`
396</h3>
397 329
398`Svg` отрисовывает SVG-документ в приложении Desktop и расширении VS Code:330`Svg` отрисовывает SVG-документ в приложении Desktop и расширении VS Code:
399 331
409 341
410В терминале панель, которая возвращает только `Svg`, открывается пустой. Чтобы отрисовать там что-то другое, проверьте [`e.surface`](/docs/ru/plugins/mods/interface#pick-where-to-draw) и верните другое дерево.342В терминале панель, которая возвращает только `Svg`, открывается пустой. Чтобы отрисовать там что-то другое, проверьте [`e.surface`](/docs/ru/plugins/mods/interface#pick-where-to-draw) и верните другое дерево.
411 343
412<h3 id="image-and-client">344### `Image` и `Client`
413 `Image` и `Client`
414</h3>
415 345
416Для ещё двух элементов примеров здесь нет. `Image` отрисовывает PNG или необработанные пиксели в терминале. `Client` — это область, которую отрисовывает ваш второй файл, для анимации и ввода указателем. Их свойства перечислены в [справочнике по элементам](/docs/ru/plugins/mods/reference#elements).346Для ещё двух элементов примеров здесь нет. `Image` отрисовывает PNG или необработанные пиксели в терминале. `Client` — это область, которую отрисовывает ваш второй файл, для анимации и ввода указателем. Их свойства перечислены в [справочнике по элементам](/docs/ru/plugins/mods/reference#elements).
417 347
423 353
424Если пользователи вашего мода видят приглушённый текст в терминале, который всё же отрисовывает такие изображения с плейсхолдерами, они могут установить для [`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ru/env-vars) значение `1`, чтобы пропустить обнаружение. Внутри tmux или screen это не помогает: текст `alt` пропадает, а Claude Code отправляет изображение, не оборачивая его для сквозной передачи через tmux или screen.354Если пользователи вашего мода видят приглушённый текст в терминале, который всё же отрисовывает такие изображения с плейсхолдерами, они могут установить для [`CLAUDE_CODE_FORCE_TERMINAL_IMAGES`](/docs/ru/env-vars) значение `1`, чтобы пропустить обнаружение. Внутри tmux или screen это не помогает: текст `alt` пропадает, а Claude Code отправляет изображение, не оборачивая его для сквозной передачи через tmux или screen.
425 355
426<h2 id="see-where-a-mod-can-draw">356## Где ещё может отрисовывать мод
427 Где ещё может отрисовывать мод
428</h2>
429 357
430Все примеры отрисовываются на панели. Мод также может отрисовывать в других местах и вызывать Claude Code, чтобы тот что-то показал за него:358Все примеры отрисовываются на панели. Мод также может отрисовывать в других местах и вызывать Claude Code, чтобы тот что-то показал за него:
431 359
434* **Всплывающее уведомление, строка состояния и строка лога**: [Показать что-то, не начиная ход](/docs/ru/plugins/mods/api#show-something-without-starting-a-turn)362* **Всплывающее уведомление, строка состояния и строка лога**: [Показать что-то, не начиная ход](/docs/ru/plugins/mods/api#show-something-without-starting-a-turn)
435* **Диалог с вопросом**: [Удержание вызова инструмента до решения пользователя](/docs/ru/plugins/mods/events#hold-a-tool-call-until-the-user-decides)363* **Диалог с вопросом**: [Удержание вызова инструмента до решения пользователя](/docs/ru/plugins/mods/events#hold-a-tool-call-until-the-user-decides)
436 364
437<h2 id="next-steps">365## Дальнейшие шаги
438 Дальнейшие шаги
439</h2>
440 366
441* [Отрисовка в интерфейсе](/docs/ru/plugins/mods/interface): пошаговое создание панели с вкладками367* [Отрисовка в интерфейсе](/docs/ru/plugins/mods/interface): пошаговое создание панели с вкладками
442* [Тестирование отрисовки](/docs/ru/plugins/mods/test#test-a-drawing): нажатие ваших кнопок из теста368* [Тестирование отрисовки](/docs/ru/plugins/mods/test#test-a-drawing): нажатие ваших кнопок из теста