@chai-ui/react 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/DESIGN.md +6 -1
  2. package/README.md +69 -6
  3. package/dist/Composer.d.ts +19 -2
  4. package/dist/Composer.d.ts.map +1 -1
  5. package/dist/Composer.js +36 -10
  6. package/dist/Composer.js.map +1 -1
  7. package/dist/EditCard.d.ts +52 -0
  8. package/dist/EditCard.d.ts.map +1 -0
  9. package/dist/EditCard.js +360 -0
  10. package/dist/EditCard.js.map +1 -0
  11. package/dist/ResultCard.d.ts +2 -1
  12. package/dist/ResultCard.d.ts.map +1 -1
  13. package/dist/ResultCard.js +19 -63
  14. package/dist/ResultCard.js.map +1 -1
  15. package/dist/icons.d.ts +27 -0
  16. package/dist/icons.d.ts.map +1 -0
  17. package/dist/icons.js +50 -0
  18. package/dist/icons.js.map +1 -0
  19. package/dist/index.d.ts +3 -2
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +2 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/media-actions.d.ts +15 -0
  24. package/dist/media-actions.d.ts.map +1 -0
  25. package/dist/media-actions.js +47 -0
  26. package/dist/media-actions.js.map +1 -0
  27. package/dist/page-slide.d.ts +32 -0
  28. package/dist/page-slide.d.ts.map +1 -0
  29. package/dist/page-slide.js +43 -0
  30. package/dist/page-slide.js.map +1 -0
  31. package/dist/primitives/Pagination.d.ts +3 -1
  32. package/dist/primitives/Pagination.d.ts.map +1 -1
  33. package/dist/primitives/Pagination.js +2 -2
  34. package/dist/primitives/Pagination.js.map +1 -1
  35. package/dist/regions.d.ts +3 -0
  36. package/dist/regions.d.ts.map +1 -0
  37. package/dist/regions.js +7 -0
  38. package/dist/regions.js.map +1 -0
  39. package/dist/style.css +507 -82
  40. package/dist/useComposer.d.ts +22 -1
  41. package/dist/useComposer.d.ts.map +1 -1
  42. package/dist/useComposer.js +126 -24
  43. package/dist/useComposer.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/Composer.tsx +101 -13
  46. package/src/EditCard.tsx +688 -0
  47. package/src/ResultCard.tsx +60 -125
  48. package/src/icons.tsx +115 -0
  49. package/src/index.ts +8 -0
  50. package/src/media-actions.ts +45 -0
  51. package/src/page-slide.tsx +82 -0
  52. package/src/primitives/Pagination.tsx +4 -2
  53. package/src/regions.ts +7 -0
  54. package/src/style.css +507 -82
  55. package/src/useComposer.ts +147 -18
@@ -1,5 +1,5 @@
1
1
  import { useCallback, useMemo, useRef, useState } from "react";
2
- import { createMockEngine, createRun, deriveGenerationUseCase, cancelResult, failResult, isAbortError, mockEngine, normalizeGenerationError, resolveResult, routeModel, startResult, streamResult, } from "@chai-ui/core";
2
+ import { buildRegionEditPrompt, createMockEngine, createRun, deriveGenerationUseCase, cancelResult, failResult, isAbortError, mockEngine, normalizeGenerationError, PRECISE_EDIT_MODELS, resolveResult, routeModel, ROUTING_MODEL_ID, startResult, streamResult, } from "@chai-ui/core";
3
3
  import { reasoningModelFor, useReasoning } from "./ChaiProvider.js";
4
4
  import { useLatest } from "./use-latest.js";
5
5
  /** A result's `modelId` when nothing was picked: the engine runs its own default model. */
@@ -26,6 +26,34 @@ export function useComposer(options = {}) {
26
26
  const [runs, setRuns] = useState([]);
27
27
  const [enhancing, setEnhancing] = useState(false);
28
28
  const [routing, setRouting] = useState(false);
29
+ // Edit mode. Each edit's runs are kept (not replaced by the next submit),
30
+ // since every result is a version of the image the person can page back to.
31
+ const editImage = options.editImage?.kind === "image" ? options.editImage : null;
32
+ const [editRuns, setEditRuns] = useState([]);
33
+ const [regions, setRegions] = useState([]);
34
+ const [activeVersion, setActiveVersion] = useState(0);
35
+ // Another image starts over. Reset while rendering, not in an effect (the rules of React).
36
+ const [editSource, setEditSource] = useState(editImage?.src ?? null);
37
+ if ((editImage?.src ?? null) !== editSource) {
38
+ setEditSource(editImage?.src ?? null);
39
+ setEditRuns([]);
40
+ setRegions([]);
41
+ setActiveVersion(0);
42
+ }
43
+ const versions = useMemo(() => editImage
44
+ ? [
45
+ { id: "original", src: editImage.src, status: "done", regions: [] },
46
+ ...editRuns.flatMap((run) => run.results.map((r) => ({
47
+ id: r.id,
48
+ src: r.output?.src,
49
+ from: run.request.attachments[0]?.src,
50
+ status: r.status,
51
+ regions: run.request.params.regions ?? [],
52
+ error: r.error?.message,
53
+ }))),
54
+ ]
55
+ : [], [editImage, editRuns]);
56
+ const editRef = useLatest({ versions, activeVersion, editRuns });
29
57
  // Each submit gets an id, so routing that settles after a newer submit is dropped.
30
58
  const submitId = useRef(0);
31
59
  // Aborts the current submit's engine calls: on `cancel()`, and when a newer
@@ -45,40 +73,83 @@ export function useComposer(options = {}) {
45
73
  : undefined
46
74
  : provided, [reasoningEngine, reasoningModel, provided]);
47
75
  const reasoningRef = useLatest(reasoning);
48
- const start = useCallback((payload, signal) => {
76
+ // One request per selection. An edit runs on the image version showing
77
+ // in the EditCard (the original until an edit lands) and carries its regions.
78
+ const buildRequest = useCallback((payload, selection) => {
49
79
  const opts = optionsRef.current;
50
80
  const reasoning = reasoningRef.current;
81
+ const isText = selection.useCase.kind === "text";
82
+ const isEdit = Boolean(selection.useCase.edit && opts.editImage?.kind === "image");
83
+ const { versions, activeVersion } = editRef.current;
84
+ const shown = versions[activeVersion];
85
+ const editFrom = shown?.status === "done" && shown.src ? shown.src : opts.editImage?.src;
86
+ const attachments = isEdit && editFrom ? [{ src: editFrom, kind: "image" }] : payload.attachments;
87
+ // Nothing picked: text uses the builder's text model when there is
88
+ // one; otherwise the engine runs its own default. Never a silent no-op.
89
+ const fallback = isText ? (opts.textModel ?? (reasoning && reasoningModelFor(reasoning, attachments))) : undefined;
90
+ const params = payload.aspectRatio && !isEdit ? { aspectRatio: payload.aspectRatio } : {};
91
+ if (isEdit)
92
+ params.regions = payload.regions ?? [];
93
+ const request = {
94
+ mode: deriveGenerationUseCase(selection.useCase, attachments),
95
+ prompt: payload.value,
96
+ attachments,
97
+ modelIds: selection.modelIds.length > 0 ? selection.modelIds : [fallback ?? DEFAULT_MODEL_ID],
98
+ params,
99
+ };
100
+ const engine = isText
101
+ ? (opts.textEngine ?? reasoning?.engine ?? mockTextEngine)
102
+ : (opts.engineByKind?.[selection.useCase.kind] ?? opts.engine ?? mockEngine);
103
+ return { request, engine, isEdit };
104
+ }, [optionsRef, reasoningRef, editRef]);
105
+ // Edit placeholders from routing waits, dropped from the history when the
106
+ // next real runs start (including ones a newer submit abandoned).
107
+ const placeholderIds = useRef(new Set());
108
+ const start = useCallback((payload, signal) => {
109
+ const opts = optionsRef.current;
51
110
  const newRuns = payload.selections.map((selection) => {
52
- const isText = selection.useCase.kind === "text";
53
- // Nothing picked: text uses the builder's text model when there is
54
- // one; otherwise the engine runs its own default. Never a silent no-op.
55
- const fallback = isText ? (opts.textModel ?? (reasoning && reasoningModelFor(reasoning, payload.attachments))) : undefined;
56
- const request = {
57
- mode: deriveGenerationUseCase(selection.useCase, payload.attachments),
58
- prompt: payload.value,
59
- attachments: payload.attachments,
60
- modelIds: selection.modelIds.length > 0 ? selection.modelIds : [fallback ?? DEFAULT_MODEL_ID],
61
- params: payload.aspectRatio ? { aspectRatio: payload.aspectRatio } : {},
62
- };
63
- const engine = isText
64
- ? (opts.textEngine ?? reasoning?.engine ?? mockTextEngine)
65
- : (opts.engineByKind?.[selection.useCase.kind] ?? opts.engine ?? mockEngine);
66
- return { run: createRun(request), engine };
111
+ const { request, engine, isEdit } = buildRequest(payload, selection);
112
+ return { run: createRun(request), engine, isEdit, models: selection.models ?? [] };
67
113
  });
68
114
  setRuns(newRuns.map((r) => r.run));
115
+ const newEditRuns = newRuns.filter((r) => r.isEdit).map((r) => r.run);
116
+ const placeholders = placeholderIds.current;
117
+ const kept = editRef.current.editRuns.filter((r) => !placeholders.has(r.id));
118
+ if (newEditRuns.length > 0) {
119
+ // Show the first new version, and start the next edit with no regions:
120
+ // these ones now belong to the versions they made.
121
+ setEditRuns([...kept, ...newEditRuns]);
122
+ setActiveVersion(1 + kept.reduce((n, r) => n + r.results.length, 0));
123
+ setRegions([]);
124
+ }
125
+ else if (placeholders.size > 0) {
126
+ setEditRuns(kept);
127
+ }
128
+ placeholderIds.current = new Set();
69
129
  // Results settle independently and out of order — each update only
70
130
  // ever touches its own run, and only if that run is still current. A
71
131
  // run from an earlier submit is no longer in state (and its calls were
72
132
  // aborted), so a late result can't clobber the newer ones.
73
- const update = (runId, fn) => setRuns((prev) => (prev.some((r) => r.id === runId) ? prev.map((r) => (r.id === runId ? fn(r) : r)) : prev));
74
- for (const { run: newRun, engine } of newRuns) {
133
+ const update = (runId, fn) => {
134
+ const apply = (prev) => (prev.some((r) => r.id === runId) ? prev.map((r) => (r.id === runId ? fn(r) : r)) : prev);
135
+ setRuns(apply);
136
+ setEditRuns(apply);
137
+ };
138
+ for (const { run: newRun, engine, isEdit, models } of newRuns) {
75
139
  opts.onRun?.(newRun);
76
140
  for (const result of newRun.results) {
77
141
  update(newRun.id, (r) => startResult(r, result.id));
142
+ // An edit's prompt depends on the model: one with box support gets
143
+ // boxes, any other gets the regions described in words.
144
+ const regions = newRun.request.params.regions ?? [];
145
+ const model = models.find((m) => m.id === result.modelId) ?? PRECISE_EDIT_MODELS.find((m) => m.id === result.modelId);
146
+ const prompt = isEdit
147
+ ? (opts.editPrompt ?? defaultEditPrompt)({ prompt: newRun.request.prompt, regions, model })
148
+ : newRun.request.prompt;
78
149
  void engine
79
150
  .generate({
80
151
  modelId: result.modelId === DEFAULT_MODEL_ID ? undefined : result.modelId,
81
- prompt: newRun.request.prompt,
152
+ prompt,
82
153
  attachments: newRun.request.attachments,
83
154
  // Text engines that stream fill `output` in while still "running".
84
155
  onText: (text) => update(newRun.id, (r) => streamResult(r, result.id, text)),
@@ -95,7 +166,7 @@ export function useComposer(options = {}) {
95
166
  });
96
167
  }
97
168
  }
98
- }, [optionsRef, reasoningRef]);
169
+ }, [optionsRef, buildRequest, editRef]);
99
170
  const submit = useCallback((payload) => {
100
171
  const id = ++submitId.current;
101
172
  controller.current?.abort();
@@ -111,6 +182,22 @@ export function useComposer(options = {}) {
111
182
  if (!reasoning)
112
183
  warnNoReasoningOnce();
113
184
  setRouting(true);
185
+ // Runs exist from the moment of submit, so a result card shows progress
186
+ // while the reasoning model chooses. Their results read "Choosing model".
187
+ const placeholders = payload.selections.map((sel) => {
188
+ const { request, isEdit } = buildRequest(payload, sel);
189
+ const modelIds = sel.models.length > 0 ? [ROUTING_MODEL_ID] : request.modelIds;
190
+ return { run: createRun({ ...request, modelIds }), isEdit };
191
+ });
192
+ setRuns(placeholders.map((p) => p.run));
193
+ const editPlaceholders = placeholders.filter((p) => p.isEdit).map((p) => p.run);
194
+ if (editPlaceholders.length > 0) {
195
+ const editRuns = editRef.current.editRuns.filter((r) => !placeholderIds.current.has(r.id));
196
+ for (const r of editPlaceholders)
197
+ placeholderIds.current.add(r.id);
198
+ setEditRuns([...editRuns, ...editPlaceholders]);
199
+ setActiveVersion(1 + editRuns.reduce((n, r) => n + r.results.length, 0));
200
+ }
114
201
  void Promise.all(payload.selections.map((sel) => sel.models.length === 0
115
202
  ? Promise.resolve(null)
116
203
  : routeModel({
@@ -145,7 +232,7 @@ export function useComposer(options = {}) {
145
232
  })),
146
233
  }, signal);
147
234
  });
148
- }, [start, optionsRef, reasoningRef]);
235
+ }, [start, buildRequest, optionsRef, reasoningRef, editRef]);
149
236
  /**
150
237
  * Stops the current submit: wire it to Composer's `onAbort`. Its
151
238
  * unfinished results turn `"cancelled"` right away, and each engine
@@ -157,7 +244,9 @@ export function useComposer(options = {}) {
157
244
  controller.current?.abort();
158
245
  controller.current = null;
159
246
  setRouting(false);
160
- setRuns((prev) => prev.map((run) => run.results.reduce((acc, r) => cancelResult(acc, r.id), run)));
247
+ const cancelAll = (prev) => prev.map((run) => run.results.reduce((acc, r) => cancelResult(acc, r.id), run));
248
+ setRuns(cancelAll);
249
+ setEditRuns(cancelAll);
161
250
  }, []);
162
251
  const run = runs[0] ?? null;
163
252
  // `undefined` (not a no-op function) when unconfigured, so a consumer
@@ -179,7 +268,20 @@ export function useComposer(options = {}) {
179
268
  }
180
269
  };
181
270
  }, [reasoning, options.enhancePrompt, run?.request.mode]);
182
- return { run, runs, submit, cancel, enhance, enhancing, routing };
271
+ /** Props for an `EditCard` (spread them in), and `regions` for `Composer`. `null` when there's no `editImage`. */
272
+ const edit = editImage
273
+ ? {
274
+ versions,
275
+ activeVersion: Math.min(activeVersion, versions.length - 1),
276
+ onActiveVersionChange: setActiveVersion,
277
+ regions,
278
+ onRegionsChange: setRegions,
279
+ }
280
+ : null;
281
+ return { run, runs, submit, cancel, enhance, enhancing, routing, edit };
282
+ }
283
+ function defaultEditPrompt({ prompt, regions, model }) {
284
+ return buildRegionEditPrompt({ prompt, regions, format: model?.regionFormat });
183
285
  }
184
286
  let warnedNoReasoning = false;
185
287
  function warnNoReasoningOnce() {
@@ -1 +1 @@
1
- {"version":3,"file":"useComposer.js","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useComposer.js","sourceRoot":"","sources":["../src/useComposer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chai-ui/react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "CHAI UI React components — smart, drop-in UI for AI apps: Composer, Media Analyzer, Result Card, and the useComposer hook.",
5
5
  "license": "MIT",
6
6
  "author": "kazarazat",
@@ -48,8 +48,8 @@
48
48
  "@fontsource/roboto": "^5.3.0",
49
49
  "@lit/react": "^1.0.8",
50
50
  "@material/web": "^2.5.0",
51
- "@chai-ui/tokens": "0.1.0",
52
- "@chai-ui/core": "0.1.0"
51
+ "@chai-ui/core": "0.2.0",
52
+ "@chai-ui/tokens": "0.2.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@material-symbols/svg-400": "^0.47.5",
package/src/Composer.tsx CHANGED
@@ -2,8 +2,9 @@ import { useEffect, useRef, useState, type ChangeEvent } from "react";
2
2
  import { createComponent } from "@lit/react";
3
3
  import * as React from "react";
4
4
  import { MdFab } from "@material/web/fab/fab.js";
5
- import type { DroppedMedia, ModelOption, ParameterOption, MediaKind } from "@chai-ui/core";
5
+ import type { DroppedMedia, EditRegion, ModelOption, ParameterOption, MediaKind } from "@chai-ui/core";
6
6
  import { SearchMenu } from "./primitives/SearchMenu.js";
7
+ import { regionColor } from "./regions.js";
7
8
 
8
9
  /** See primitives/Toggle.tsx for why `createComponent` is used instead of raw JSX on custom-element tags. */
9
10
  const MdFabElement = createComponent({
@@ -60,11 +61,20 @@ export type ComposerAttachMenuAction = "add-media" | "create-image" | "create-vi
60
61
  export interface ComposerUseCase {
61
62
  kind: MediaKind;
62
63
  label: string;
64
+ /**
65
+ * An edit of the attached image rather than a new one: no aspect ratio,
66
+ * region chips when `regions` is set, and a submit needs only an image and
67
+ * either a prompt or a region. Images only for now.
68
+ */
69
+ edit?: boolean;
63
70
  }
64
71
 
65
72
  /** A plain text request — what a submit means when no use case is picked, unless the builder sets `defaultUseCase`. */
66
73
  export const TEXT_USE_CASE: ComposerUseCase = { kind: "text", label: "Text" };
67
74
 
75
+ /** Editing the attached image, the attach menu's "Edit image". Pair it with `useComposer`'s `editImage` and an `EditCard`. */
76
+ export const EDIT_IMAGE_USE_CASE: ComposerUseCase = { kind: "image", label: "Edit image", edit: true };
77
+
68
78
  /** One use case to run and the models picked for it. Empty `modelIds` means the engine's default model. */
69
79
  export interface ComposerSelection {
70
80
  useCase: ComposerUseCase;
@@ -95,12 +105,15 @@ export interface ComposerSubmitPayload {
95
105
  selections: ComposerSelection[];
96
106
  /** When true, the model is chosen at submit (`useComposer` routes among each selection's `models`), not by the picks. */
97
107
  autoSelectModel: boolean;
108
+ /** An edit's marked regions, each with its own instruction. Empty unless the use case is an edit. */
109
+ regions?: EditRegion[];
98
110
  }
99
111
 
100
112
  export interface ComposerProps {
101
113
  /** The prompt text. Controlled — Composer owns no text state of its own. */
102
114
  value: string;
103
115
  onChange: (value: string) => void;
116
+ /** Defaults to "Describe media to create", or edit wording when the use case is an edit. */
104
117
  placeholder?: string;
105
118
  /** The prompt field's accessible name, read by screen readers. Defaults to `placeholder`, which disappears once the person types. */
106
119
  promptLabel?: string;
@@ -202,6 +215,12 @@ export interface ComposerProps {
202
215
  /** Fires when the stop icon is clicked while `submitting` is true. See `submitting`'s own doc comment for why this — not `submitting` alone — is what actually shows the stop icon. */
203
216
  onAbort?: () => void;
204
217
  onAttachMenuSelect?: (action: ComposerAttachMenuAction) => void;
218
+ /**
219
+ * An edit's regions (from `useComposer`'s `edit`), shown as colored chips
220
+ * while the use case is an edit. Removing a chip removes its region.
221
+ */
222
+ regions?: EditRegion[];
223
+ onRegionsChange?: (next: EditRegion[]) => void;
205
224
  disabled?: boolean;
206
225
  }
207
226
 
@@ -218,7 +237,7 @@ export interface ComposerProps {
218
237
  export function Composer({
219
238
  value,
220
239
  onChange,
221
- placeholder = "Describe media to create",
240
+ placeholder,
222
241
  promptLabel,
223
242
  attachments = [],
224
243
  onAttachmentsChange,
@@ -250,21 +269,35 @@ export function Composer({
250
269
  submitting = false,
251
270
  onAbort,
252
271
  onAttachMenuSelect,
272
+ regions = [],
273
+ onRegionsChange,
253
274
  disabled = false,
254
275
  }: ComposerProps) {
255
- const hasContent = value.trim().length > 0 || attachments.length > 0;
276
+ // What the person picked, and what actually runs: with nothing picked,
277
+ // the builder's default use case (a text request unless they chose
278
+ // otherwise), so a typed prompt always goes somewhere.
279
+ const pickedUseCases = multiSelectUseCases ? useCases : useCase ? [useCase] : [];
280
+ const activeUseCases = pickedUseCases.length > 0 ? pickedUseCases : [defaultUseCase];
281
+ // An edit needs an image, then a change: a prompt for the whole image, a
282
+ // region with its own instruction, or both.
283
+ const editing = activeUseCases.some((u) => u.edit);
284
+ const hasImage = attachments.some((a) => a.kind === "image");
285
+ const hasContent = editing
286
+ ? hasImage && (value.trim().length > 0 || regions.length > 0)
287
+ : value.trim().length > 0 || attachments.length > 0;
256
288
  const isSubmitDisabled = submitError ? disabled : (submitDisabled ?? (disabled || !hasContent));
289
+ const effectivePlaceholder =
290
+ placeholder ??
291
+ (editing
292
+ ? hasImage
293
+ ? "Describe a change across the whole image, or leave this empty"
294
+ : "Attach an image to edit"
295
+ : "Describe media to create");
257
296
  // The stop icon only appears with somewhere for its click to go — without
258
297
  // `onAbort`, `submitting` just disables the FAB instead (below), same as
259
298
  // it would with no opt-in wired at all.
260
299
  const showStop = submitting && Boolean(onAbort);
261
300
  const selectedAspect = aspectRatios?.find((o) => o.value === aspectRatio) ?? null;
262
-
263
- // What the person picked, and what actually runs: with nothing picked,
264
- // the builder's default use case (a text request unless they chose
265
- // otherwise), so a typed prompt always goes somewhere.
266
- const pickedUseCases = multiSelectUseCases ? useCases : useCase ? [useCase] : [];
267
- const activeUseCases = pickedUseCases.length > 0 ? pickedUseCases : [defaultUseCase];
268
301
  const multiModel = multiSelectModels || multiSelectUseCases;
269
302
  const pickedModelIds = multiModel ? modelIds : modelId ? [modelId] : [];
270
303
  // One menu section per use case with multi-use-case select; otherwise one flat roster.
@@ -279,7 +312,8 @@ export function Composer({
279
312
  pickedModels.length > 1
280
313
  ? `${pickedModels.length} models`
281
314
  : pickedModels[0]?.label ?? (autoSelectModel ? "Auto-select" : "Select models");
282
- const showAspectRatio = activeUseCases.some((u) => u.kind === "image" || u.kind === "video");
315
+ // An edit keeps the source image's shape.
316
+ const showAspectRatio = activeUseCases.some((u) => !u.edit && (u.kind === "image" || u.kind === "video"));
283
317
 
284
318
  function toggleModel(id: string) {
285
319
  if (!multiModel) return onModelChange?.(id);
@@ -424,14 +458,28 @@ export function Composer({
424
458
  </div>
425
459
  )}
426
460
 
461
+ {editing && regions.length > 0 && (
462
+ <ul className="chai-composer__regions" aria-label="Edit regions">
463
+ {regions.map((r) => (
464
+ <li key={r.id}>
465
+ <RegionChip
466
+ region={r}
467
+ onRemove={onRegionsChange ? () => onRegionsChange(regions.filter((x) => x.id !== r.id)) : undefined}
468
+ disabled={disabled}
469
+ />
470
+ </li>
471
+ ))}
472
+ </ul>
473
+ )}
474
+
427
475
  <div className="chai-composer__field">
428
476
  <textarea
429
477
  ref={textareaRef}
430
478
  className={`chai-composer__input chai-composer__type${animating ? " chai-composer__input--revealing" : ""}`}
431
479
  value={value}
432
480
  onChange={(e) => onChange(e.target.value)}
433
- placeholder={placeholder}
434
- aria-label={promptLabel ?? placeholder}
481
+ placeholder={effectivePlaceholder}
482
+ aria-label={promptLabel ?? effectivePlaceholder}
435
483
  rows={1}
436
484
  disabled={disabled || animating}
437
485
  />
@@ -607,6 +655,7 @@ export function Composer({
607
655
  aspectRatio,
608
656
  selections,
609
657
  autoSelectModel,
658
+ regions: editing ? regions : [],
610
659
  });
611
660
  }
612
661
  }}
@@ -630,7 +679,7 @@ const ATTACH_MENU_ITEMS: {
630
679
  { action: "add-media", label: "Add media", icon: <AttachFileIcon />, divider: true },
631
680
  { action: "create-image", label: "Create image", icon: <ImageIcon /> },
632
681
  { action: "create-video", label: "Create video", icon: <VideocamIcon /> },
633
- { action: "edit-media", label: "Edit media", icon: <ContentCutIcon /> },
682
+ { action: "edit-media", label: "Edit image", icon: <ContentCutIcon /> },
634
683
  ];
635
684
 
636
685
  /**
@@ -778,6 +827,45 @@ function UseCaseChip({
778
827
  );
779
828
  }
780
829
 
830
+ /**
831
+ * One edit region, in its region color: a numbered badge matching the box on
832
+ * the image, its name, and the same hover-revealed remove as the use-case
833
+ * chip. The instruction itself lives on the image, not here.
834
+ */
835
+ function RegionChip({
836
+ region,
837
+ onRemove,
838
+ disabled,
839
+ }: {
840
+ region: EditRegion;
841
+ onRemove?: () => void;
842
+ disabled?: boolean;
843
+ }) {
844
+ const name = `Region ${region.number}`;
845
+ return (
846
+ <span
847
+ className="chai-composer__chip chai-composer__chip--region"
848
+ style={{ "--chai-region-color": regionColor(region.number) } as React.CSSProperties}
849
+ >
850
+ <span className="chai-composer__region-badge" aria-hidden="true">
851
+ {region.number}
852
+ </span>
853
+ {name}
854
+ {onRemove && (
855
+ <button
856
+ type="button"
857
+ className="chai-composer__chip-remove"
858
+ onClick={onRemove}
859
+ disabled={disabled}
860
+ aria-label={`Remove ${name}`}
861
+ >
862
+ <CloseIcon />
863
+ </button>
864
+ )}
865
+ </span>
866
+ );
867
+ }
868
+
781
869
  function kindIcon(kind: MediaKind) {
782
870
  switch (kind) {
783
871
  case "video":